blob: 7baeba78c4e3e0bb16ae408ec99b70678b082387 [file] [log] [blame]
Nick Lewyckyf0f56162013-01-31 03:23:57 +00001//===--- ASTReader.cpp - AST File Reader ----------------------------------===//
Guy Benyei11169dd2012-12-18 14:30:41 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the ASTReader class, which reads AST files.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Serialization/ASTReader.h"
15#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
17#include "clang/AST/ASTConsumer.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/AST/DeclTemplate.h"
20#include "clang/AST/Expr.h"
21#include "clang/AST/ExprCXX.h"
22#include "clang/AST/NestedNameSpecifier.h"
23#include "clang/AST/Type.h"
24#include "clang/AST/TypeLocVisitor.h"
Benjamin Kramerf3ca26982014-05-10 16:31:55 +000025#include "clang/Basic/DiagnosticOptions.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000026#include "clang/Basic/FileManager.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000027#include "clang/Basic/SourceManager.h"
28#include "clang/Basic/SourceManagerInternals.h"
29#include "clang/Basic/TargetInfo.h"
30#include "clang/Basic/TargetOptions.h"
31#include "clang/Basic/Version.h"
32#include "clang/Basic/VersionTuple.h"
Ben Langmuirb92de022014-04-29 16:25:26 +000033#include "clang/Frontend/Utils.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000034#include "clang/Lex/HeaderSearch.h"
35#include "clang/Lex/HeaderSearchOptions.h"
36#include "clang/Lex/MacroInfo.h"
37#include "clang/Lex/PreprocessingRecord.h"
38#include "clang/Lex/Preprocessor.h"
39#include "clang/Lex/PreprocessorOptions.h"
40#include "clang/Sema/Scope.h"
41#include "clang/Sema/Sema.h"
42#include "clang/Serialization/ASTDeserializationListener.h"
Douglas Gregore060e572013-01-25 01:03:03 +000043#include "clang/Serialization/GlobalModuleIndex.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000044#include "clang/Serialization/ModuleManager.h"
45#include "clang/Serialization/SerializationDiagnostic.h"
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +000046#include "llvm/ADT/Hashing.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000047#include "llvm/ADT/StringExtras.h"
48#include "llvm/Bitcode/BitstreamReader.h"
49#include "llvm/Support/ErrorHandling.h"
50#include "llvm/Support/FileSystem.h"
51#include "llvm/Support/MemoryBuffer.h"
52#include "llvm/Support/Path.h"
53#include "llvm/Support/SaveAndRestore.h"
Dmitri Gribenkof430da42014-02-12 10:33:14 +000054#include "llvm/Support/raw_ostream.h"
Guy Benyei11169dd2012-12-18 14:30:41 +000055#include <algorithm>
Chris Lattner91f373e2013-01-20 00:57:52 +000056#include <cstdio>
Guy Benyei11169dd2012-12-18 14:30:41 +000057#include <iterator>
Rafael Espindola8a8e5542014-06-12 17:19:42 +000058#include <system_error>
Guy Benyei11169dd2012-12-18 14:30:41 +000059
60using namespace clang;
61using namespace clang::serialization;
62using namespace clang::serialization::reader;
Chris Lattner7fb3bef2013-01-20 00:56:42 +000063using llvm::BitstreamCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +000064
Ben Langmuircb69b572014-03-07 06:40:32 +000065
66//===----------------------------------------------------------------------===//
67// ChainedASTReaderListener implementation
68//===----------------------------------------------------------------------===//
69
70bool
71ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
72 return First->ReadFullVersionInformation(FullVersion) ||
73 Second->ReadFullVersionInformation(FullVersion);
74}
Ben Langmuir4f5212a2014-04-14 22:12:44 +000075void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
76 First->ReadModuleName(ModuleName);
77 Second->ReadModuleName(ModuleName);
78}
79void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
80 First->ReadModuleMapFile(ModuleMapPath);
81 Second->ReadModuleMapFile(ModuleMapPath);
82}
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}
92bool
93ChainedASTReaderListener::ReadTargetOptions(const TargetOptions &TargetOpts,
94 bool Complain) {
95 return First->ReadTargetOptions(TargetOpts, Complain) ||
96 Second->ReadTargetOptions(TargetOpts, Complain);
97}
98bool ChainedASTReaderListener::ReadDiagnosticOptions(
Ben Langmuirb92de022014-04-29 16:25:26 +000099 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
Ben Langmuircb69b572014-03-07 06:40:32 +0000100 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
101 Second->ReadDiagnosticOptions(DiagOpts, Complain);
102}
103bool
104ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
105 bool Complain) {
106 return First->ReadFileSystemOptions(FSOpts, Complain) ||
107 Second->ReadFileSystemOptions(FSOpts, Complain);
108}
109
110bool ChainedASTReaderListener::ReadHeaderSearchOptions(
111 const HeaderSearchOptions &HSOpts, bool Complain) {
112 return First->ReadHeaderSearchOptions(HSOpts, Complain) ||
113 Second->ReadHeaderSearchOptions(HSOpts, Complain);
114}
115bool ChainedASTReaderListener::ReadPreprocessorOptions(
116 const PreprocessorOptions &PPOpts, bool Complain,
117 std::string &SuggestedPredefines) {
118 return First->ReadPreprocessorOptions(PPOpts, Complain,
119 SuggestedPredefines) ||
120 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
121}
122void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
123 unsigned Value) {
124 First->ReadCounter(M, Value);
125 Second->ReadCounter(M, Value);
126}
127bool ChainedASTReaderListener::needsInputFileVisitation() {
128 return First->needsInputFileVisitation() ||
129 Second->needsInputFileVisitation();
130}
131bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
132 return First->needsSystemInputFileVisitation() ||
133 Second->needsSystemInputFileVisitation();
134}
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000135void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
136 First->visitModuleFile(Filename);
137 Second->visitModuleFile(Filename);
138}
Ben Langmuircb69b572014-03-07 06:40:32 +0000139bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +0000140 bool isSystem,
141 bool isOverridden) {
Justin Bognerc65a66d2014-05-22 06:04:59 +0000142 bool Continue = false;
143 if (First->needsInputFileVisitation() &&
144 (!isSystem || First->needsSystemInputFileVisitation()))
145 Continue |= First->visitInputFile(Filename, isSystem, isOverridden);
146 if (Second->needsInputFileVisitation() &&
147 (!isSystem || Second->needsSystemInputFileVisitation()))
148 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden);
149 return Continue;
Ben Langmuircb69b572014-03-07 06:40:32 +0000150}
151
Guy Benyei11169dd2012-12-18 14:30:41 +0000152//===----------------------------------------------------------------------===//
153// PCH validator implementation
154//===----------------------------------------------------------------------===//
155
156ASTReaderListener::~ASTReaderListener() {}
157
158/// \brief Compare the given set of language options against an existing set of
159/// language options.
160///
161/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000162/// \param AllowCompatibleDifferences If true, differences between compatible
163/// language options will be permitted.
Guy Benyei11169dd2012-12-18 14:30:41 +0000164///
165/// \returns true if the languagae options mis-match, false otherwise.
166static bool checkLanguageOptions(const LangOptions &LangOpts,
167 const LangOptions &ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000168 DiagnosticsEngine *Diags,
169 bool AllowCompatibleDifferences = true) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000170#define LANGOPT(Name, Bits, Default, Description) \
171 if (ExistingLangOpts.Name != LangOpts.Name) { \
172 if (Diags) \
173 Diags->Report(diag::err_pch_langopt_mismatch) \
174 << Description << LangOpts.Name << ExistingLangOpts.Name; \
175 return true; \
176 }
177
178#define VALUE_LANGOPT(Name, Bits, Default, Description) \
179 if (ExistingLangOpts.Name != LangOpts.Name) { \
180 if (Diags) \
181 Diags->Report(diag::err_pch_langopt_value_mismatch) \
182 << Description; \
183 return true; \
184 }
185
186#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
187 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
188 if (Diags) \
189 Diags->Report(diag::err_pch_langopt_value_mismatch) \
190 << Description; \
191 return true; \
192 }
193
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000194#define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
195 if (!AllowCompatibleDifferences) \
196 LANGOPT(Name, Bits, Default, Description)
197
198#define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
199 if (!AllowCompatibleDifferences) \
200 ENUM_LANGOPT(Name, Bits, Default, Description)
201
Guy Benyei11169dd2012-12-18 14:30:41 +0000202#define BENIGN_LANGOPT(Name, Bits, Default, Description)
203#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
204#include "clang/Basic/LangOptions.def"
205
206 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
207 if (Diags)
208 Diags->Report(diag::err_pch_langopt_value_mismatch)
209 << "target Objective-C runtime";
210 return true;
211 }
212
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +0000213 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
214 LangOpts.CommentOpts.BlockCommandNames) {
215 if (Diags)
216 Diags->Report(diag::err_pch_langopt_value_mismatch)
217 << "block command names";
218 return true;
219 }
220
Guy Benyei11169dd2012-12-18 14:30:41 +0000221 return false;
222}
223
224/// \brief Compare the given set of target options against an existing set of
225/// target options.
226///
227/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
228///
229/// \returns true if the target options mis-match, false otherwise.
230static bool checkTargetOptions(const TargetOptions &TargetOpts,
231 const TargetOptions &ExistingTargetOpts,
232 DiagnosticsEngine *Diags) {
233#define CHECK_TARGET_OPT(Field, Name) \
234 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
235 if (Diags) \
236 Diags->Report(diag::err_pch_targetopt_mismatch) \
237 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
238 return true; \
239 }
240
241 CHECK_TARGET_OPT(Triple, "target");
242 CHECK_TARGET_OPT(CPU, "target CPU");
243 CHECK_TARGET_OPT(ABI, "target ABI");
Guy Benyei11169dd2012-12-18 14:30:41 +0000244#undef CHECK_TARGET_OPT
245
246 // Compare feature sets.
247 SmallVector<StringRef, 4> ExistingFeatures(
248 ExistingTargetOpts.FeaturesAsWritten.begin(),
249 ExistingTargetOpts.FeaturesAsWritten.end());
250 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
251 TargetOpts.FeaturesAsWritten.end());
252 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
253 std::sort(ReadFeatures.begin(), ReadFeatures.end());
254
255 unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size();
256 unsigned ReadIdx = 0, ReadN = ReadFeatures.size();
257 while (ExistingIdx < ExistingN && ReadIdx < ReadN) {
258 if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) {
259 ++ExistingIdx;
260 ++ReadIdx;
261 continue;
262 }
263
264 if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) {
265 if (Diags)
266 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
267 << false << ReadFeatures[ReadIdx];
268 return true;
269 }
270
271 if (Diags)
272 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
273 << true << ExistingFeatures[ExistingIdx];
274 return true;
275 }
276
277 if (ExistingIdx < ExistingN) {
278 if (Diags)
279 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
280 << true << ExistingFeatures[ExistingIdx];
281 return true;
282 }
283
284 if (ReadIdx < ReadN) {
285 if (Diags)
286 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
287 << false << ReadFeatures[ReadIdx];
288 return true;
289 }
290
291 return false;
292}
293
294bool
295PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000296 bool Complain,
297 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000298 const LangOptions &ExistingLangOpts = PP.getLangOpts();
299 return checkLanguageOptions(LangOpts, ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000300 Complain ? &Reader.Diags : nullptr,
301 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +0000302}
303
304bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
305 bool Complain) {
306 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
307 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
Craig Toppera13603a2014-05-22 05:54:18 +0000308 Complain? &Reader.Diags : nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +0000309}
310
311namespace {
312 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
313 MacroDefinitionsMap;
Craig Topper3598eb72013-07-05 04:43:31 +0000314 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
315 DeclsMap;
Guy Benyei11169dd2012-12-18 14:30:41 +0000316}
317
Ben Langmuirb92de022014-04-29 16:25:26 +0000318static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
319 DiagnosticsEngine &Diags,
320 bool Complain) {
321 typedef DiagnosticsEngine::Level Level;
322
323 // Check current mappings for new -Werror mappings, and the stored mappings
324 // for cases that were explicitly mapped to *not* be errors that are now
325 // errors because of options like -Werror.
326 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
327
328 for (DiagnosticsEngine *MappingSource : MappingSources) {
329 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
330 diag::kind DiagID = DiagIDMappingPair.first;
331 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
332 if (CurLevel < DiagnosticsEngine::Error)
333 continue; // not significant
334 Level StoredLevel =
335 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
336 if (StoredLevel < DiagnosticsEngine::Error) {
337 if (Complain)
338 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
339 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
340 return true;
341 }
342 }
343 }
344
345 return false;
346}
347
Alp Tokerac4e8e52014-06-22 21:58:33 +0000348static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
349 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
350 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
351 return true;
352 return Ext >= diag::Severity::Error;
Ben Langmuirb92de022014-04-29 16:25:26 +0000353}
354
355static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
356 DiagnosticsEngine &Diags,
357 bool IsSystem, bool Complain) {
358 // Top-level options
359 if (IsSystem) {
360 if (Diags.getSuppressSystemWarnings())
361 return false;
362 // If -Wsystem-headers was not enabled before, be conservative
363 if (StoredDiags.getSuppressSystemWarnings()) {
364 if (Complain)
365 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
366 return true;
367 }
368 }
369
370 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
371 if (Complain)
372 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
373 return true;
374 }
375
376 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
377 !StoredDiags.getEnableAllWarnings()) {
378 if (Complain)
379 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
380 return true;
381 }
382
383 if (isExtHandlingFromDiagsError(Diags) &&
384 !isExtHandlingFromDiagsError(StoredDiags)) {
385 if (Complain)
386 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
387 return true;
388 }
389
390 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
391}
392
393bool PCHValidator::ReadDiagnosticOptions(
394 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
395 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
396 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
397 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
Alp Tokerf994cef2014-07-05 03:08:06 +0000398 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
Ben Langmuirb92de022014-04-29 16:25:26 +0000399 // This should never fail, because we would have processed these options
400 // before writing them to an ASTFile.
401 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
402
403 ModuleManager &ModuleMgr = Reader.getModuleManager();
404 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
405
406 // If the original import came from a file explicitly generated by the user,
407 // don't check the diagnostic mappings.
408 // FIXME: currently this is approximated by checking whether this is not a
Richard Smithe842a472014-10-22 02:05:46 +0000409 // module import of an implicitly-loaded module file.
Ben Langmuirb92de022014-04-29 16:25:26 +0000410 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
411 // the transitive closure of its imports, since unrelated modules cannot be
412 // imported until after this module finishes validation.
413 ModuleFile *TopImport = *ModuleMgr.rbegin();
414 while (!TopImport->ImportedBy.empty())
415 TopImport = TopImport->ImportedBy[0];
Richard Smithe842a472014-10-22 02:05:46 +0000416 if (TopImport->Kind != MK_ImplicitModule)
Ben Langmuirb92de022014-04-29 16:25:26 +0000417 return false;
418
419 StringRef ModuleName = TopImport->ModuleName;
420 assert(!ModuleName.empty() && "diagnostic options read before module name");
421
422 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
423 assert(M && "missing module");
424
425 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
426 // contains the union of their flags.
427 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
428}
429
Guy Benyei11169dd2012-12-18 14:30:41 +0000430/// \brief Collect the macro definitions provided by the given preprocessor
431/// options.
Craig Toppera13603a2014-05-22 05:54:18 +0000432static void
433collectMacroDefinitions(const PreprocessorOptions &PPOpts,
434 MacroDefinitionsMap &Macros,
435 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000436 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
437 StringRef Macro = PPOpts.Macros[I].first;
438 bool IsUndef = PPOpts.Macros[I].second;
439
440 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
441 StringRef MacroName = MacroPair.first;
442 StringRef MacroBody = MacroPair.second;
443
444 // For an #undef'd macro, we only care about the name.
445 if (IsUndef) {
446 if (MacroNames && !Macros.count(MacroName))
447 MacroNames->push_back(MacroName);
448
449 Macros[MacroName] = std::make_pair("", true);
450 continue;
451 }
452
453 // For a #define'd macro, figure out the actual definition.
454 if (MacroName.size() == Macro.size())
455 MacroBody = "1";
456 else {
457 // Note: GCC drops anything following an end-of-line character.
458 StringRef::size_type End = MacroBody.find_first_of("\n\r");
459 MacroBody = MacroBody.substr(0, End);
460 }
461
462 if (MacroNames && !Macros.count(MacroName))
463 MacroNames->push_back(MacroName);
464 Macros[MacroName] = std::make_pair(MacroBody, false);
465 }
466}
467
468/// \brief Check the preprocessor options deserialized from the control block
469/// against the preprocessor options in an existing preprocessor.
470///
471/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
472static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
473 const PreprocessorOptions &ExistingPPOpts,
474 DiagnosticsEngine *Diags,
475 FileManager &FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000476 std::string &SuggestedPredefines,
477 const LangOptions &LangOpts) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000478 // Check macro definitions.
479 MacroDefinitionsMap ASTFileMacros;
480 collectMacroDefinitions(PPOpts, ASTFileMacros);
481 MacroDefinitionsMap ExistingMacros;
482 SmallVector<StringRef, 4> ExistingMacroNames;
483 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
484
485 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
486 // Dig out the macro definition in the existing preprocessor options.
487 StringRef MacroName = ExistingMacroNames[I];
488 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
489
490 // Check whether we know anything about this macro name or not.
491 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
492 = ASTFileMacros.find(MacroName);
493 if (Known == ASTFileMacros.end()) {
494 // FIXME: Check whether this identifier was referenced anywhere in the
495 // AST file. If so, we should reject the AST file. Unfortunately, this
496 // information isn't in the control block. What shall we do about it?
497
498 if (Existing.second) {
499 SuggestedPredefines += "#undef ";
500 SuggestedPredefines += MacroName.str();
501 SuggestedPredefines += '\n';
502 } else {
503 SuggestedPredefines += "#define ";
504 SuggestedPredefines += MacroName.str();
505 SuggestedPredefines += ' ';
506 SuggestedPredefines += Existing.first.str();
507 SuggestedPredefines += '\n';
508 }
509 continue;
510 }
511
512 // If the macro was defined in one but undef'd in the other, we have a
513 // conflict.
514 if (Existing.second != Known->second.second) {
515 if (Diags) {
516 Diags->Report(diag::err_pch_macro_def_undef)
517 << MacroName << Known->second.second;
518 }
519 return true;
520 }
521
522 // If the macro was #undef'd in both, or if the macro bodies are identical,
523 // it's fine.
524 if (Existing.second || Existing.first == Known->second.first)
525 continue;
526
527 // The macro bodies differ; complain.
528 if (Diags) {
529 Diags->Report(diag::err_pch_macro_def_conflict)
530 << MacroName << Known->second.first << Existing.first;
531 }
532 return true;
533 }
534
535 // Check whether we're using predefines.
536 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
537 if (Diags) {
538 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
539 }
540 return true;
541 }
542
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000543 // Detailed record is important since it is used for the module cache hash.
544 if (LangOpts.Modules &&
545 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
546 if (Diags) {
547 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
548 }
549 return true;
550 }
551
Guy Benyei11169dd2012-12-18 14:30:41 +0000552 // Compute the #include and #include_macros lines we need.
553 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
554 StringRef File = ExistingPPOpts.Includes[I];
555 if (File == ExistingPPOpts.ImplicitPCHInclude)
556 continue;
557
558 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
559 != PPOpts.Includes.end())
560 continue;
561
562 SuggestedPredefines += "#include \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000563 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000564 SuggestedPredefines += "\"\n";
565 }
566
567 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
568 StringRef File = ExistingPPOpts.MacroIncludes[I];
569 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
570 File)
571 != PPOpts.MacroIncludes.end())
572 continue;
573
574 SuggestedPredefines += "#__include_macros \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000575 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000576 SuggestedPredefines += "\"\n##\n";
577 }
578
579 return false;
580}
581
582bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
583 bool Complain,
584 std::string &SuggestedPredefines) {
585 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
586
587 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
Craig Toppera13603a2014-05-22 05:54:18 +0000588 Complain? &Reader.Diags : nullptr,
Guy Benyei11169dd2012-12-18 14:30:41 +0000589 PP.getFileManager(),
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000590 SuggestedPredefines,
591 PP.getLangOpts());
Guy Benyei11169dd2012-12-18 14:30:41 +0000592}
593
Guy Benyei11169dd2012-12-18 14:30:41 +0000594void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
595 PP.setCounterValue(Value);
596}
597
598//===----------------------------------------------------------------------===//
599// AST reader implementation
600//===----------------------------------------------------------------------===//
601
Nico Weber824285e2014-05-08 04:26:47 +0000602void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
603 bool TakeOwnership) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000604 DeserializationListener = Listener;
Nico Weber824285e2014-05-08 04:26:47 +0000605 OwnsDeserializationListener = TakeOwnership;
Guy Benyei11169dd2012-12-18 14:30:41 +0000606}
607
608
609
610unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
611 return serialization::ComputeHash(Sel);
612}
613
614
615std::pair<unsigned, unsigned>
616ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000617 using namespace llvm::support;
618 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
619 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000620 return std::make_pair(KeyLen, DataLen);
621}
622
623ASTSelectorLookupTrait::internal_key_type
624ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000625 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000626 SelectorTable &SelTable = Reader.getContext().Selectors;
Justin Bogner57ba0b22014-03-28 22:03:24 +0000627 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
628 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
629 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000630 if (N == 0)
631 return SelTable.getNullarySelector(FirstII);
632 else if (N == 1)
633 return SelTable.getUnarySelector(FirstII);
634
635 SmallVector<IdentifierInfo *, 16> Args;
636 Args.push_back(FirstII);
637 for (unsigned I = 1; I != N; ++I)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000638 Args.push_back(Reader.getLocalIdentifier(
639 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000640
641 return SelTable.getSelector(N, Args.data());
642}
643
644ASTSelectorLookupTrait::data_type
645ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
646 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000647 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000648
649 data_type Result;
650
Justin Bogner57ba0b22014-03-28 22:03:24 +0000651 Result.ID = Reader.getGlobalSelectorID(
652 F, endian::readNext<uint32_t, little, unaligned>(d));
653 unsigned NumInstanceMethodsAndBits =
654 endian::readNext<uint16_t, little, unaligned>(d);
655 unsigned NumFactoryMethodsAndBits =
656 endian::readNext<uint16_t, little, unaligned>(d);
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +0000657 Result.InstanceBits = NumInstanceMethodsAndBits & 0x3;
658 Result.FactoryBits = NumFactoryMethodsAndBits & 0x3;
659 unsigned NumInstanceMethods = NumInstanceMethodsAndBits >> 2;
660 unsigned NumFactoryMethods = NumFactoryMethodsAndBits >> 2;
Guy Benyei11169dd2012-12-18 14:30:41 +0000661
662 // Load instance methods
663 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000664 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
665 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000666 Result.Instance.push_back(Method);
667 }
668
669 // Load factory methods
670 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000671 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
672 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000673 Result.Factory.push_back(Method);
674 }
675
676 return Result;
677}
678
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000679unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
680 return llvm::HashString(a);
Guy Benyei11169dd2012-12-18 14:30:41 +0000681}
682
683std::pair<unsigned, unsigned>
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000684ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000685 using namespace llvm::support;
686 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
687 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000688 return std::make_pair(KeyLen, DataLen);
689}
690
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000691ASTIdentifierLookupTraitBase::internal_key_type
692ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000693 assert(n >= 2 && d[n-1] == '\0');
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000694 return StringRef((const char*) d, n-1);
Guy Benyei11169dd2012-12-18 14:30:41 +0000695}
696
Douglas Gregordcf25082013-02-11 18:16:18 +0000697/// \brief Whether the given identifier is "interesting".
698static bool isInterestingIdentifier(IdentifierInfo &II) {
699 return II.isPoisoned() ||
700 II.isExtensionToken() ||
701 II.getObjCOrBuiltinID() ||
702 II.hasRevertedTokenIDToIdentifier() ||
703 II.hadMacroDefinition() ||
704 II.getFETokenInfo<void>();
705}
706
Guy Benyei11169dd2012-12-18 14:30:41 +0000707IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
708 const unsigned char* d,
709 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000710 using namespace llvm::support;
711 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000712 bool IsInteresting = RawID & 0x01;
713
714 // Wipe out the "is interesting" bit.
715 RawID = RawID >> 1;
716
717 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
718 if (!IsInteresting) {
719 // For uninteresting identifiers, just build the IdentifierInfo
720 // and associate it with the persistent ID.
721 IdentifierInfo *II = KnownII;
722 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000723 II = &Reader.getIdentifierTable().getOwn(k);
Guy Benyei11169dd2012-12-18 14:30:41 +0000724 KnownII = II;
725 }
726 Reader.SetIdentifierInfo(ID, II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000727 if (!II->isFromAST()) {
728 bool WasInteresting = isInterestingIdentifier(*II);
729 II->setIsFromAST();
730 if (WasInteresting)
731 II->setChangedSinceDeserialization();
732 }
733 Reader.markIdentifierUpToDate(II);
Guy Benyei11169dd2012-12-18 14:30:41 +0000734 return II;
735 }
736
Justin Bogner57ba0b22014-03-28 22:03:24 +0000737 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
738 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000739 bool CPlusPlusOperatorKeyword = Bits & 0x01;
740 Bits >>= 1;
741 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
742 Bits >>= 1;
743 bool Poisoned = Bits & 0x01;
744 Bits >>= 1;
745 bool ExtensionToken = Bits & 0x01;
746 Bits >>= 1;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000747 bool hasSubmoduleMacros = Bits & 0x01;
748 Bits >>= 1;
Guy Benyei11169dd2012-12-18 14:30:41 +0000749 bool hadMacroDefinition = Bits & 0x01;
750 Bits >>= 1;
751
752 assert(Bits == 0 && "Extra bits in the identifier?");
753 DataLen -= 8;
754
755 // Build the IdentifierInfo itself and link the identifier ID with
756 // the new IdentifierInfo.
757 IdentifierInfo *II = KnownII;
758 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000759 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
Guy Benyei11169dd2012-12-18 14:30:41 +0000760 KnownII = II;
761 }
762 Reader.markIdentifierUpToDate(II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000763 if (!II->isFromAST()) {
764 bool WasInteresting = isInterestingIdentifier(*II);
765 II->setIsFromAST();
766 if (WasInteresting)
767 II->setChangedSinceDeserialization();
768 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000769
770 // Set or check the various bits in the IdentifierInfo structure.
771 // Token IDs are read-only.
Argyrios Kyrtzidisddee8c92013-02-27 01:13:51 +0000772 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
Guy Benyei11169dd2012-12-18 14:30:41 +0000773 II->RevertTokenIDToIdentifier();
774 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
775 assert(II->isExtensionToken() == ExtensionToken &&
776 "Incorrect extension token flag");
777 (void)ExtensionToken;
778 if (Poisoned)
779 II->setIsPoisoned(true);
780 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
781 "Incorrect C++ operator keyword flag");
782 (void)CPlusPlusOperatorKeyword;
783
784 // If this identifier is a macro, deserialize the macro
785 // definition.
786 if (hadMacroDefinition) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000787 uint32_t MacroDirectivesOffset =
788 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000789 DataLen -= 4;
790 SmallVector<uint32_t, 8> LocalMacroIDs;
791 if (hasSubmoduleMacros) {
Richard Smithdaa69e02014-07-25 04:40:03 +0000792 while (true) {
793 uint32_t LocalMacroID =
794 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000795 DataLen -= 4;
Richard Smithdaa69e02014-07-25 04:40:03 +0000796 if (LocalMacroID == 0xdeadbeef) break;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000797 LocalMacroIDs.push_back(LocalMacroID);
798 }
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +0000799 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000800
Richard Smithe842a472014-10-22 02:05:46 +0000801 if (F.Kind == MK_ImplicitModule || F.Kind == MK_ExplicitModule) {
Richard Smith49f906a2014-03-01 00:08:04 +0000802 // Macro definitions are stored from newest to oldest, so reverse them
803 // before registering them.
804 llvm::SmallVector<unsigned, 8> MacroSizes;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000805 for (SmallVectorImpl<uint32_t>::iterator
Richard Smith49f906a2014-03-01 00:08:04 +0000806 I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; /**/) {
807 unsigned Size = 1;
808
809 static const uint32_t HasOverridesFlag = 0x80000000U;
810 if (I + 1 != E && (I[1] & HasOverridesFlag))
811 Size += 1 + (I[1] & ~HasOverridesFlag);
812
813 MacroSizes.push_back(Size);
814 I += Size;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000815 }
Richard Smith49f906a2014-03-01 00:08:04 +0000816
817 SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end();
818 for (SmallVectorImpl<unsigned>::reverse_iterator SI = MacroSizes.rbegin(),
819 SE = MacroSizes.rend();
820 SI != SE; ++SI) {
821 I -= *SI;
822
823 uint32_t LocalMacroID = *I;
Craig Topper00bbdcf2014-06-28 23:22:23 +0000824 ArrayRef<uint32_t> Overrides;
Richard Smith49f906a2014-03-01 00:08:04 +0000825 if (*SI != 1)
826 Overrides = llvm::makeArrayRef(&I[2], *SI - 2);
827 Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides);
828 }
829 assert(I == LocalMacroIDs.begin());
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000830 } else {
831 Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset);
832 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000833 }
834
835 Reader.SetIdentifierInfo(ID, II);
836
837 // Read all of the declarations visible at global scope with this
838 // name.
839 if (DataLen > 0) {
840 SmallVector<uint32_t, 4> DeclIDs;
841 for (; DataLen > 0; DataLen -= 4)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000842 DeclIDs.push_back(Reader.getGlobalDeclID(
843 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000844 Reader.SetGloballyVisibleDecls(II, DeclIDs);
845 }
846
847 return II;
848}
849
850unsigned
851ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
852 llvm::FoldingSetNodeID ID;
853 ID.AddInteger(Key.Kind);
854
855 switch (Key.Kind) {
856 case DeclarationName::Identifier:
857 case DeclarationName::CXXLiteralOperatorName:
858 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
859 break;
860 case DeclarationName::ObjCZeroArgSelector:
861 case DeclarationName::ObjCOneArgSelector:
862 case DeclarationName::ObjCMultiArgSelector:
863 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
864 break;
865 case DeclarationName::CXXOperatorName:
866 ID.AddInteger((OverloadedOperatorKind)Key.Data);
867 break;
868 case DeclarationName::CXXConstructorName:
869 case DeclarationName::CXXDestructorName:
870 case DeclarationName::CXXConversionFunctionName:
871 case DeclarationName::CXXUsingDirective:
872 break;
873 }
874
875 return ID.ComputeHash();
876}
877
878ASTDeclContextNameLookupTrait::internal_key_type
879ASTDeclContextNameLookupTrait::GetInternalKey(
880 const external_key_type& Name) const {
881 DeclNameKey Key;
882 Key.Kind = Name.getNameKind();
883 switch (Name.getNameKind()) {
884 case DeclarationName::Identifier:
885 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
886 break;
887 case DeclarationName::ObjCZeroArgSelector:
888 case DeclarationName::ObjCOneArgSelector:
889 case DeclarationName::ObjCMultiArgSelector:
890 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
891 break;
892 case DeclarationName::CXXOperatorName:
893 Key.Data = Name.getCXXOverloadedOperator();
894 break;
895 case DeclarationName::CXXLiteralOperatorName:
896 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
897 break;
898 case DeclarationName::CXXConstructorName:
899 case DeclarationName::CXXDestructorName:
900 case DeclarationName::CXXConversionFunctionName:
901 case DeclarationName::CXXUsingDirective:
902 Key.Data = 0;
903 break;
904 }
905
906 return Key;
907}
908
909std::pair<unsigned, unsigned>
910ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000911 using namespace llvm::support;
912 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
913 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000914 return std::make_pair(KeyLen, DataLen);
915}
916
917ASTDeclContextNameLookupTrait::internal_key_type
918ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000919 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000920
921 DeclNameKey Key;
922 Key.Kind = (DeclarationName::NameKind)*d++;
923 switch (Key.Kind) {
924 case DeclarationName::Identifier:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000925 Key.Data = (uint64_t)Reader.getLocalIdentifier(
926 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000927 break;
928 case DeclarationName::ObjCZeroArgSelector:
929 case DeclarationName::ObjCOneArgSelector:
930 case DeclarationName::ObjCMultiArgSelector:
931 Key.Data =
Justin Bogner57ba0b22014-03-28 22:03:24 +0000932 (uint64_t)Reader.getLocalSelector(
933 F, endian::readNext<uint32_t, little, unaligned>(
934 d)).getAsOpaquePtr();
Guy Benyei11169dd2012-12-18 14:30:41 +0000935 break;
936 case DeclarationName::CXXOperatorName:
937 Key.Data = *d++; // OverloadedOperatorKind
938 break;
939 case DeclarationName::CXXLiteralOperatorName:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000940 Key.Data = (uint64_t)Reader.getLocalIdentifier(
941 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000942 break;
943 case DeclarationName::CXXConstructorName:
944 case DeclarationName::CXXDestructorName:
945 case DeclarationName::CXXConversionFunctionName:
946 case DeclarationName::CXXUsingDirective:
947 Key.Data = 0;
948 break;
949 }
950
951 return Key;
952}
953
954ASTDeclContextNameLookupTrait::data_type
955ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
956 const unsigned char* d,
957 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000958 using namespace llvm::support;
959 unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d);
Argyrios Kyrtzidisc57e5032013-01-11 22:29:49 +0000960 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
961 const_cast<unsigned char *>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000962 return std::make_pair(Start, Start + NumDecls);
963}
964
965bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
Chris Lattner7fb3bef2013-01-20 00:56:42 +0000966 BitstreamCursor &Cursor,
Guy Benyei11169dd2012-12-18 14:30:41 +0000967 const std::pair<uint64_t, uint64_t> &Offsets,
968 DeclContextInfo &Info) {
969 SavedStreamPosition SavedPosition(Cursor);
970 // First the lexical decls.
971 if (Offsets.first != 0) {
972 Cursor.JumpToBit(Offsets.first);
973
974 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +0000975 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +0000976 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +0000977 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +0000978 if (RecCode != DECL_CONTEXT_LEXICAL) {
979 Error("Expected lexical block");
980 return true;
981 }
982
Chris Lattner0e6c9402013-01-20 02:38:54 +0000983 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
984 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
Guy Benyei11169dd2012-12-18 14:30:41 +0000985 }
986
987 // Now the lookup table.
988 if (Offsets.second != 0) {
989 Cursor.JumpToBit(Offsets.second);
990
991 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +0000992 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +0000993 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +0000994 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +0000995 if (RecCode != DECL_CONTEXT_VISIBLE) {
996 Error("Expected visible lookup table block");
997 return true;
998 }
Justin Bognerda4e6502014-04-14 16:34:29 +0000999 Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create(
1000 (const unsigned char *)Blob.data() + Record[0],
1001 (const unsigned char *)Blob.data() + sizeof(uint32_t),
1002 (const unsigned char *)Blob.data(),
1003 ASTDeclContextNameLookupTrait(*this, M));
Guy Benyei11169dd2012-12-18 14:30:41 +00001004 }
1005
1006 return false;
1007}
1008
1009void ASTReader::Error(StringRef Msg) {
1010 Error(diag::err_fe_pch_malformed, Msg);
Douglas Gregor940e8052013-05-10 22:15:13 +00001011 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
1012 Diag(diag::note_module_cache_path)
1013 << PP.getHeaderSearchInfo().getModuleCachePath();
1014 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001015}
1016
1017void ASTReader::Error(unsigned DiagID,
1018 StringRef Arg1, StringRef Arg2) {
1019 if (Diags.isDiagnosticInFlight())
1020 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1021 else
1022 Diag(DiagID) << Arg1 << Arg2;
1023}
1024
1025//===----------------------------------------------------------------------===//
1026// Source Manager Deserialization
1027//===----------------------------------------------------------------------===//
1028
1029/// \brief Read the line table in the source manager block.
1030/// \returns true if there was an error.
1031bool ASTReader::ParseLineTable(ModuleFile &F,
Richard Smith1d21a072014-12-05 02:33:27 +00001032 const RecordData &Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001033 unsigned Idx = 0;
1034 LineTableInfo &LineTable = SourceMgr.getLineTable();
1035
1036 // Parse the file names
1037 std::map<int, int> FileIDs;
1038 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
1039 // Extract the file name
Richard Smith1d21a072014-12-05 02:33:27 +00001040 auto Filename = ReadPath(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001041 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1042 }
1043
1044 // Parse the line entries
1045 std::vector<LineEntry> Entries;
1046 while (Idx < Record.size()) {
1047 int FID = Record[Idx++];
1048 assert(FID >= 0 && "Serialized line entries for non-local file.");
1049 // Remap FileID from 1-based old view.
1050 FID += F.SLocEntryBaseID - 1;
1051
1052 // Extract the line entries
1053 unsigned NumEntries = Record[Idx++];
1054 assert(NumEntries && "Numentries is 00000");
1055 Entries.clear();
1056 Entries.reserve(NumEntries);
1057 for (unsigned I = 0; I != NumEntries; ++I) {
1058 unsigned FileOffset = Record[Idx++];
1059 unsigned LineNo = Record[Idx++];
1060 int FilenameID = FileIDs[Record[Idx++]];
1061 SrcMgr::CharacteristicKind FileKind
1062 = (SrcMgr::CharacteristicKind)Record[Idx++];
1063 unsigned IncludeOffset = Record[Idx++];
1064 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1065 FileKind, IncludeOffset));
1066 }
1067 LineTable.AddEntry(FileID::get(FID), Entries);
1068 }
1069
1070 return false;
1071}
1072
1073/// \brief Read a source manager block
1074bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1075 using namespace SrcMgr;
1076
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001077 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001078
1079 // Set the source-location entry cursor to the current position in
1080 // the stream. This cursor will be used to read the contents of the
1081 // source manager block initially, and then lazily read
1082 // source-location entries as needed.
1083 SLocEntryCursor = F.Stream;
1084
1085 // The stream itself is going to skip over the source manager block.
1086 if (F.Stream.SkipBlock()) {
1087 Error("malformed block record in AST file");
1088 return true;
1089 }
1090
1091 // Enter the source manager block.
1092 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1093 Error("malformed source manager block record in AST file");
1094 return true;
1095 }
1096
1097 RecordData Record;
1098 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001099 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1100
1101 switch (E.Kind) {
1102 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1103 case llvm::BitstreamEntry::Error:
1104 Error("malformed block record in AST file");
1105 return true;
1106 case llvm::BitstreamEntry::EndBlock:
Guy Benyei11169dd2012-12-18 14:30:41 +00001107 return false;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001108 case llvm::BitstreamEntry::Record:
1109 // The interesting case.
1110 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001111 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001112
Guy Benyei11169dd2012-12-18 14:30:41 +00001113 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001114 Record.clear();
Chris Lattner15c3e7d2013-01-21 18:28:26 +00001115 StringRef Blob;
1116 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001117 default: // Default behavior: ignore.
1118 break;
1119
1120 case SM_SLOC_FILE_ENTRY:
1121 case SM_SLOC_BUFFER_ENTRY:
1122 case SM_SLOC_EXPANSION_ENTRY:
1123 // Once we hit one of the source location entries, we're done.
1124 return false;
1125 }
1126 }
1127}
1128
1129/// \brief If a header file is not found at the path that we expect it to be
1130/// and the PCH file was moved from its original location, try to resolve the
1131/// file by assuming that header+PCH were moved together and the header is in
1132/// the same place relative to the PCH.
1133static std::string
1134resolveFileRelativeToOriginalDir(const std::string &Filename,
1135 const std::string &OriginalDir,
1136 const std::string &CurrDir) {
1137 assert(OriginalDir != CurrDir &&
1138 "No point trying to resolve the file if the PCH dir didn't change");
1139 using namespace llvm::sys;
1140 SmallString<128> filePath(Filename);
1141 fs::make_absolute(filePath);
1142 assert(path::is_absolute(OriginalDir));
1143 SmallString<128> currPCHPath(CurrDir);
1144
1145 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1146 fileDirE = path::end(path::parent_path(filePath));
1147 path::const_iterator origDirI = path::begin(OriginalDir),
1148 origDirE = path::end(OriginalDir);
1149 // Skip the common path components from filePath and OriginalDir.
1150 while (fileDirI != fileDirE && origDirI != origDirE &&
1151 *fileDirI == *origDirI) {
1152 ++fileDirI;
1153 ++origDirI;
1154 }
1155 for (; origDirI != origDirE; ++origDirI)
1156 path::append(currPCHPath, "..");
1157 path::append(currPCHPath, fileDirI, fileDirE);
1158 path::append(currPCHPath, path::filename(Filename));
1159 return currPCHPath.str();
1160}
1161
1162bool ASTReader::ReadSLocEntry(int ID) {
1163 if (ID == 0)
1164 return false;
1165
1166 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1167 Error("source location entry ID out-of-range for AST file");
1168 return true;
1169 }
1170
1171 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1172 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001173 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001174 unsigned BaseOffset = F->SLocEntryBaseOffset;
1175
1176 ++NumSLocEntriesRead;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001177 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1178 if (Entry.Kind != llvm::BitstreamEntry::Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001179 Error("incorrectly-formatted source location entry in AST file");
1180 return true;
1181 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001182
Guy Benyei11169dd2012-12-18 14:30:41 +00001183 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001184 StringRef Blob;
1185 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001186 default:
1187 Error("incorrectly-formatted source location entry in AST file");
1188 return true;
1189
1190 case SM_SLOC_FILE_ENTRY: {
1191 // We will detect whether a file changed and return 'Failure' for it, but
1192 // we will also try to fail gracefully by setting up the SLocEntry.
1193 unsigned InputID = Record[4];
1194 InputFile IF = getInputFile(*F, InputID);
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001195 const FileEntry *File = IF.getFile();
1196 bool OverriddenBuffer = IF.isOverridden();
Guy Benyei11169dd2012-12-18 14:30:41 +00001197
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001198 // Note that we only check if a File was returned. If it was out-of-date
1199 // we have complained but we will continue creating a FileID to recover
1200 // gracefully.
1201 if (!File)
Guy Benyei11169dd2012-12-18 14:30:41 +00001202 return true;
1203
1204 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1205 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1206 // This is the module's main file.
1207 IncludeLoc = getImportLocation(F);
1208 }
1209 SrcMgr::CharacteristicKind
1210 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1211 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1212 ID, BaseOffset + Record[0]);
1213 SrcMgr::FileInfo &FileInfo =
1214 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1215 FileInfo.NumCreatedFIDs = Record[5];
1216 if (Record[3])
1217 FileInfo.setHasLineDirectives();
1218
1219 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1220 unsigned NumFileDecls = Record[7];
1221 if (NumFileDecls) {
1222 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1223 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1224 NumFileDecls));
1225 }
1226
1227 const SrcMgr::ContentCache *ContentCache
1228 = SourceMgr.getOrCreateContentCache(File,
1229 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1230 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1231 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1232 unsigned Code = SLocEntryCursor.ReadCode();
1233 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001234 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001235
1236 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1237 Error("AST record has invalid code");
1238 return true;
1239 }
1240
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001241 std::unique_ptr<llvm::MemoryBuffer> Buffer
Chris Lattner0e6c9402013-01-20 02:38:54 +00001242 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
David Blaikie49cc3182014-08-27 20:54:45 +00001243 SourceMgr.overrideFileContents(File, std::move(Buffer));
Guy Benyei11169dd2012-12-18 14:30:41 +00001244 }
1245
1246 break;
1247 }
1248
1249 case SM_SLOC_BUFFER_ENTRY: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00001250 const char *Name = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00001251 unsigned Offset = Record[0];
1252 SrcMgr::CharacteristicKind
1253 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1254 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
Richard Smithe842a472014-10-22 02:05:46 +00001255 if (IncludeLoc.isInvalid() &&
1256 (F->Kind == MK_ImplicitModule || F->Kind == MK_ExplicitModule)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001257 IncludeLoc = getImportLocation(F);
1258 }
1259 unsigned Code = SLocEntryCursor.ReadCode();
1260 Record.clear();
1261 unsigned RecCode
Chris Lattner0e6c9402013-01-20 02:38:54 +00001262 = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001263
1264 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1265 Error("AST record has invalid code");
1266 return true;
1267 }
1268
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001269 std::unique_ptr<llvm::MemoryBuffer> Buffer =
1270 llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
David Blaikie50a5f972014-08-29 07:59:55 +00001271 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001272 BaseOffset + Offset, IncludeLoc);
Guy Benyei11169dd2012-12-18 14:30:41 +00001273 break;
1274 }
1275
1276 case SM_SLOC_EXPANSION_ENTRY: {
1277 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1278 SourceMgr.createExpansionLoc(SpellingLoc,
1279 ReadSourceLocation(*F, Record[2]),
1280 ReadSourceLocation(*F, Record[3]),
1281 Record[4],
1282 ID,
1283 BaseOffset + Record[0]);
1284 break;
1285 }
1286 }
1287
1288 return false;
1289}
1290
1291std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1292 if (ID == 0)
1293 return std::make_pair(SourceLocation(), "");
1294
1295 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1296 Error("source location entry ID out-of-range for AST file");
1297 return std::make_pair(SourceLocation(), "");
1298 }
1299
1300 // Find which module file this entry lands in.
1301 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
Richard Smithe842a472014-10-22 02:05:46 +00001302 if (M->Kind != MK_ImplicitModule && M->Kind != MK_ExplicitModule)
Guy Benyei11169dd2012-12-18 14:30:41 +00001303 return std::make_pair(SourceLocation(), "");
1304
1305 // FIXME: Can we map this down to a particular submodule? That would be
1306 // ideal.
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001307 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
Guy Benyei11169dd2012-12-18 14:30:41 +00001308}
1309
1310/// \brief Find the location where the module F is imported.
1311SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1312 if (F->ImportLoc.isValid())
1313 return F->ImportLoc;
1314
1315 // Otherwise we have a PCH. It's considered to be "imported" at the first
1316 // location of its includer.
1317 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001318 // Main file is the importer.
1319 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1320 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
Guy Benyei11169dd2012-12-18 14:30:41 +00001321 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001322 return F->ImportedBy[0]->FirstLoc;
1323}
1324
1325/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1326/// specified cursor. Read the abbreviations that are at the top of the block
1327/// and then leave the cursor pointing into the block.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001328bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001329 if (Cursor.EnterSubBlock(BlockID)) {
1330 Error("malformed block record in AST file");
1331 return Failure;
1332 }
1333
1334 while (true) {
1335 uint64_t Offset = Cursor.GetCurrentBitNo();
1336 unsigned Code = Cursor.ReadCode();
1337
1338 // We expect all abbrevs to be at the start of the block.
1339 if (Code != llvm::bitc::DEFINE_ABBREV) {
1340 Cursor.JumpToBit(Offset);
1341 return false;
1342 }
1343 Cursor.ReadAbbrevRecord();
1344 }
1345}
1346
Richard Smithe40f2ba2013-08-07 21:41:30 +00001347Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
John McCallf413f5e2013-05-03 00:10:13 +00001348 unsigned &Idx) {
1349 Token Tok;
1350 Tok.startToken();
1351 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1352 Tok.setLength(Record[Idx++]);
1353 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1354 Tok.setIdentifierInfo(II);
1355 Tok.setKind((tok::TokenKind)Record[Idx++]);
1356 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1357 return Tok;
1358}
1359
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001360MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001361 BitstreamCursor &Stream = F.MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001362
1363 // Keep track of where we are in the stream, then jump back there
1364 // after reading this macro.
1365 SavedStreamPosition SavedPosition(Stream);
1366
1367 Stream.JumpToBit(Offset);
1368 RecordData Record;
1369 SmallVector<IdentifierInfo*, 16> MacroArgs;
Craig Toppera13603a2014-05-22 05:54:18 +00001370 MacroInfo *Macro = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00001371
Guy Benyei11169dd2012-12-18 14:30:41 +00001372 while (true) {
Chris Lattnerefa77172013-01-20 00:00:22 +00001373 // Advance to the next record, but if we get to the end of the block, don't
1374 // pop it (removing all the abbreviations from the cursor) since we want to
1375 // be able to reseek within the block and read entries.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001376 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
Chris Lattnerefa77172013-01-20 00:00:22 +00001377 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1378
1379 switch (Entry.Kind) {
1380 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1381 case llvm::BitstreamEntry::Error:
1382 Error("malformed block record in AST file");
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001383 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001384 case llvm::BitstreamEntry::EndBlock:
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001385 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001386 case llvm::BitstreamEntry::Record:
1387 // The interesting case.
1388 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001389 }
1390
1391 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001392 Record.clear();
1393 PreprocessorRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00001394 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00001395 switch (RecType) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001396 case PP_MACRO_DIRECTIVE_HISTORY:
1397 return Macro;
1398
Guy Benyei11169dd2012-12-18 14:30:41 +00001399 case PP_MACRO_OBJECT_LIKE:
1400 case PP_MACRO_FUNCTION_LIKE: {
1401 // If we already have a macro, that means that we've hit the end
1402 // of the definition of the macro we were looking for. We're
1403 // done.
1404 if (Macro)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001405 return Macro;
Guy Benyei11169dd2012-12-18 14:30:41 +00001406
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001407 unsigned NextIndex = 1; // Skip identifier ID.
1408 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001409 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001410 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
Argyrios Kyrtzidis7572be22013-01-07 19:16:23 +00001411 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
Guy Benyei11169dd2012-12-18 14:30:41 +00001412 MI->setIsUsed(Record[NextIndex++]);
Argyrios Kyrtzidis9ef53ce2014-04-09 18:21:23 +00001413 MI->setUsedForHeaderGuard(Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001414
Guy Benyei11169dd2012-12-18 14:30:41 +00001415 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1416 // Decode function-like macro info.
1417 bool isC99VarArgs = Record[NextIndex++];
1418 bool isGNUVarArgs = Record[NextIndex++];
1419 bool hasCommaPasting = Record[NextIndex++];
1420 MacroArgs.clear();
1421 unsigned NumArgs = Record[NextIndex++];
1422 for (unsigned i = 0; i != NumArgs; ++i)
1423 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1424
1425 // Install function-like macro info.
1426 MI->setIsFunctionLike();
1427 if (isC99VarArgs) MI->setIsC99Varargs();
1428 if (isGNUVarArgs) MI->setIsGNUVarargs();
1429 if (hasCommaPasting) MI->setHasCommaPasting();
1430 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1431 PP.getPreprocessorAllocator());
1432 }
1433
Guy Benyei11169dd2012-12-18 14:30:41 +00001434 // Remember that we saw this macro last so that we add the tokens that
1435 // form its body to it.
1436 Macro = MI;
1437
1438 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1439 Record[NextIndex]) {
1440 // We have a macro definition. Register the association
1441 PreprocessedEntityID
1442 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1443 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Argyrios Kyrtzidis832de9f2013-02-22 18:35:59 +00001444 PreprocessingRecord::PPEntityID
1445 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1446 MacroDefinition *PPDef =
1447 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1448 if (PPDef)
1449 PPRec.RegisterMacroDefinition(Macro, PPDef);
Guy Benyei11169dd2012-12-18 14:30:41 +00001450 }
1451
1452 ++NumMacrosRead;
1453 break;
1454 }
1455
1456 case PP_TOKEN: {
1457 // If we see a TOKEN before a PP_MACRO_*, then the file is
1458 // erroneous, just pretend we didn't see this.
Craig Toppera13603a2014-05-22 05:54:18 +00001459 if (!Macro) break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001460
John McCallf413f5e2013-05-03 00:10:13 +00001461 unsigned Idx = 0;
1462 Token Tok = ReadToken(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001463 Macro->AddTokenToBody(Tok);
1464 break;
1465 }
1466 }
1467 }
1468}
1469
1470PreprocessedEntityID
1471ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1472 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1473 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1474 assert(I != M.PreprocessedEntityRemap.end()
1475 && "Invalid index into preprocessed entity index remap");
1476
1477 return LocalID + I->second;
1478}
1479
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001480unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1481 return llvm::hash_combine(ikey.Size, ikey.ModTime);
Guy Benyei11169dd2012-12-18 14:30:41 +00001482}
Richard Smith1d21a072014-12-05 02:33:27 +00001483
Guy Benyei11169dd2012-12-18 14:30:41 +00001484HeaderFileInfoTrait::internal_key_type
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001485HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1486 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
Richard Smith1d21a072014-12-05 02:33:27 +00001487 FE->getName(), /*Imported*/false };
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001488 return ikey;
1489}
Guy Benyei11169dd2012-12-18 14:30:41 +00001490
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001491bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1492 if (a.Size != b.Size || a.ModTime != b.ModTime)
Guy Benyei11169dd2012-12-18 14:30:41 +00001493 return false;
1494
Richard Smith1d21a072014-12-05 02:33:27 +00001495 if (llvm::sys::path::is_absolute(a.Filename) &&
1496 strcmp(a.Filename, b.Filename) == 0)
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001497 return true;
1498
Guy Benyei11169dd2012-12-18 14:30:41 +00001499 // Determine whether the actual files are equivalent.
Argyrios Kyrtzidis2a513e82013-03-04 20:33:40 +00001500 FileManager &FileMgr = Reader.getFileManager();
Richard Smith1d21a072014-12-05 02:33:27 +00001501 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1502 if (!Key.Imported)
1503 return FileMgr.getFile(Key.Filename);
1504
1505 std::string Resolved = Key.Filename;
1506 Reader.ResolveImportedPath(M, Resolved);
1507 return FileMgr.getFile(Resolved);
1508 };
1509
1510 const FileEntry *FEA = GetFile(a);
1511 const FileEntry *FEB = GetFile(b);
1512 return FEA && FEA == FEB;
Guy Benyei11169dd2012-12-18 14:30:41 +00001513}
1514
1515std::pair<unsigned, unsigned>
1516HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001517 using namespace llvm::support;
1518 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +00001519 unsigned DataLen = (unsigned) *d++;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001520 return std::make_pair(KeyLen, DataLen);
Guy Benyei11169dd2012-12-18 14:30:41 +00001521}
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001522
1523HeaderFileInfoTrait::internal_key_type
1524HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001525 using namespace llvm::support;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001526 internal_key_type ikey;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001527 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1528 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001529 ikey.Filename = (const char *)d;
Richard Smith1d21a072014-12-05 02:33:27 +00001530 ikey.Imported = true;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001531 return ikey;
1532}
1533
Guy Benyei11169dd2012-12-18 14:30:41 +00001534HeaderFileInfoTrait::data_type
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001535HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
Guy Benyei11169dd2012-12-18 14:30:41 +00001536 unsigned DataLen) {
1537 const unsigned char *End = d + DataLen;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001538 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +00001539 HeaderFileInfo HFI;
1540 unsigned Flags = *d++;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001541 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1542 ((Flags >> 6) & 0x03);
Guy Benyei11169dd2012-12-18 14:30:41 +00001543 HFI.isImport = (Flags >> 5) & 0x01;
1544 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1545 HFI.DirInfo = (Flags >> 2) & 0x03;
1546 HFI.Resolved = (Flags >> 1) & 0x01;
1547 HFI.IndexHeaderMapHeader = Flags & 0x01;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001548 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1549 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1550 M, endian::readNext<uint32_t, little, unaligned>(d));
1551 if (unsigned FrameworkOffset =
1552 endian::readNext<uint32_t, little, unaligned>(d)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001553 // The framework offset is 1 greater than the actual offset,
1554 // since 0 is used as an indicator for "no framework name".
1555 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1556 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1557 }
1558
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001559 if (d != End) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001560 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001561 if (LocalSMID) {
1562 // This header is part of a module. Associate it with the module to enable
1563 // implicit module import.
1564 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1565 Module *Mod = Reader.getSubmodule(GlobalSMID);
1566 HFI.isModuleHeader = true;
1567 FileManager &FileMgr = Reader.getFileManager();
1568 ModuleMap &ModMap =
1569 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
Richard Smith1d21a072014-12-05 02:33:27 +00001570 // FIXME: This information should be propagated through the
1571 // SUBMODULE_HEADER etc records rather than from here.
Richard Smith3c1a41a2014-12-02 00:08:08 +00001572 // FIXME: We don't ever mark excluded headers.
Richard Smith1d21a072014-12-05 02:33:27 +00001573 std::string Filename = key.Filename;
1574 if (key.Imported)
1575 Reader.ResolveImportedPath(M, Filename);
1576 Module::Header H = { key.Filename, FileMgr.getFile(Filename) };
Hans Wennborg0101b542014-12-02 02:13:09 +00001577 ModMap.addHeader(Mod, H, HFI.getHeaderRole());
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001578 }
1579 }
1580
Guy Benyei11169dd2012-12-18 14:30:41 +00001581 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1582 (void)End;
1583
1584 // This HeaderFileInfo was externally loaded.
1585 HFI.External = true;
1586 return HFI;
1587}
1588
Richard Smith49f906a2014-03-01 00:08:04 +00001589void
1590ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M,
1591 GlobalMacroID GMacID,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001592 ArrayRef<SubmoduleID> Overrides) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001593 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
Craig Toppera13603a2014-05-22 05:54:18 +00001594 SubmoduleID *OverrideData = nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001595 if (!Overrides.empty()) {
1596 OverrideData = new (Context) SubmoduleID[Overrides.size() + 1];
1597 OverrideData[0] = Overrides.size();
1598 for (unsigned I = 0; I != Overrides.size(); ++I)
1599 OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]);
1600 }
1601 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData));
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001602}
1603
1604void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II,
1605 ModuleFile *M,
1606 uint64_t MacroDirectivesOffset) {
1607 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1608 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
Guy Benyei11169dd2012-12-18 14:30:41 +00001609}
1610
1611void ASTReader::ReadDefinedMacros() {
1612 // Note that we are loading defined macros.
1613 Deserializing Macros(this);
1614
1615 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1616 E = ModuleMgr.rend(); I != E; ++I) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001617 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001618
1619 // If there was no preprocessor block, skip this file.
1620 if (!MacroCursor.getBitStreamReader())
1621 continue;
1622
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001623 BitstreamCursor Cursor = MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001624 Cursor.JumpToBit((*I)->MacroStartOffset);
1625
1626 RecordData Record;
1627 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001628 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1629
1630 switch (E.Kind) {
1631 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1632 case llvm::BitstreamEntry::Error:
1633 Error("malformed block record in AST file");
1634 return;
1635 case llvm::BitstreamEntry::EndBlock:
1636 goto NextCursor;
1637
1638 case llvm::BitstreamEntry::Record:
Chris Lattnere7b154b2013-01-19 21:39:22 +00001639 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001640 switch (Cursor.readRecord(E.ID, Record)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001641 default: // Default behavior: ignore.
1642 break;
1643
1644 case PP_MACRO_OBJECT_LIKE:
1645 case PP_MACRO_FUNCTION_LIKE:
1646 getLocalIdentifier(**I, Record[0]);
1647 break;
1648
1649 case PP_TOKEN:
1650 // Ignore tokens.
1651 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001652 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001653 break;
1654 }
1655 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001656 NextCursor: ;
Guy Benyei11169dd2012-12-18 14:30:41 +00001657 }
1658}
1659
1660namespace {
1661 /// \brief Visitor class used to look up identifirs in an AST file.
1662 class IdentifierLookupVisitor {
1663 StringRef Name;
1664 unsigned PriorGeneration;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001665 unsigned &NumIdentifierLookups;
1666 unsigned &NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001667 IdentifierInfo *Found;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001668
Guy Benyei11169dd2012-12-18 14:30:41 +00001669 public:
Douglas Gregor00a50f72013-01-25 00:38:33 +00001670 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1671 unsigned &NumIdentifierLookups,
1672 unsigned &NumIdentifierLookupHits)
Douglas Gregor7211ac12013-01-25 23:32:03 +00001673 : Name(Name), PriorGeneration(PriorGeneration),
Douglas Gregor00a50f72013-01-25 00:38:33 +00001674 NumIdentifierLookups(NumIdentifierLookups),
1675 NumIdentifierLookupHits(NumIdentifierLookupHits),
1676 Found()
1677 {
1678 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001679
1680 static bool visit(ModuleFile &M, void *UserData) {
1681 IdentifierLookupVisitor *This
1682 = static_cast<IdentifierLookupVisitor *>(UserData);
1683
1684 // If we've already searched this module file, skip it now.
1685 if (M.Generation <= This->PriorGeneration)
1686 return true;
Douglas Gregore060e572013-01-25 01:03:03 +00001687
Guy Benyei11169dd2012-12-18 14:30:41 +00001688 ASTIdentifierLookupTable *IdTable
1689 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1690 if (!IdTable)
1691 return false;
1692
1693 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1694 M, This->Found);
Douglas Gregor00a50f72013-01-25 00:38:33 +00001695 ++This->NumIdentifierLookups;
1696 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
Guy Benyei11169dd2012-12-18 14:30:41 +00001697 if (Pos == IdTable->end())
1698 return false;
1699
1700 // Dereferencing the iterator has the effect of building the
1701 // IdentifierInfo node and populating it with the various
1702 // declarations it needs.
Douglas Gregor00a50f72013-01-25 00:38:33 +00001703 ++This->NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001704 This->Found = *Pos;
1705 return true;
1706 }
1707
1708 // \brief Retrieve the identifier info found within the module
1709 // files.
1710 IdentifierInfo *getIdentifierInfo() const { return Found; }
1711 };
1712}
1713
1714void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1715 // Note that we are loading an identifier.
1716 Deserializing AnIdentifier(this);
1717
1718 unsigned PriorGeneration = 0;
1719 if (getContext().getLangOpts().Modules)
1720 PriorGeneration = IdentifierGeneration[&II];
Douglas Gregore060e572013-01-25 01:03:03 +00001721
1722 // If there is a global index, look there first to determine which modules
1723 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00001724 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00001725 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00001726 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00001727 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1728 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00001729 }
1730 }
1731
Douglas Gregor7211ac12013-01-25 23:32:03 +00001732 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
Douglas Gregor00a50f72013-01-25 00:38:33 +00001733 NumIdentifierLookups,
1734 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00001735 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00001736 markIdentifierUpToDate(&II);
1737}
1738
1739void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1740 if (!II)
1741 return;
1742
1743 II->setOutOfDate(false);
1744
1745 // Update the generation for this identifier.
1746 if (getContext().getLangOpts().Modules)
Richard Smith053f6c62014-05-16 23:01:30 +00001747 IdentifierGeneration[II] = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00001748}
1749
Richard Smith49f906a2014-03-01 00:08:04 +00001750struct ASTReader::ModuleMacroInfo {
1751 SubmoduleID SubModID;
1752 MacroInfo *MI;
1753 SubmoduleID *Overrides;
1754 // FIXME: Remove this.
1755 ModuleFile *F;
1756
1757 bool isDefine() const { return MI; }
1758
1759 SubmoduleID getSubmoduleID() const { return SubModID; }
1760
Craig Topper00bbdcf2014-06-28 23:22:23 +00001761 ArrayRef<SubmoduleID> getOverriddenSubmodules() const {
Richard Smith49f906a2014-03-01 00:08:04 +00001762 if (!Overrides)
Craig Topper00bbdcf2014-06-28 23:22:23 +00001763 return None;
Richard Smith49f906a2014-03-01 00:08:04 +00001764 return llvm::makeArrayRef(Overrides + 1, *Overrides);
1765 }
1766
Richard Smithdaa69e02014-07-25 04:40:03 +00001767 MacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
Richard Smith49f906a2014-03-01 00:08:04 +00001768 if (!MI)
Richard Smithdaa69e02014-07-25 04:40:03 +00001769 return PP.AllocateUndefMacroDirective(ImportLoc, SubModID,
1770 getOverriddenSubmodules());
1771 return PP.AllocateDefMacroDirective(MI, ImportLoc, SubModID,
1772 getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00001773 }
1774};
1775
1776ASTReader::ModuleMacroInfo *
1777ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
1778 ModuleMacroInfo Info;
1779
1780 uint32_t ID = PMInfo.ModuleMacroData.MacID;
1781 if (ID & 1) {
1782 // Macro undefinition.
1783 Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
Craig Toppera13603a2014-05-22 05:54:18 +00001784 Info.MI = nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001785 } else {
1786 // Macro definition.
1787 GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
1788 assert(GMacID);
1789
1790 // If this macro has already been loaded, don't do so again.
1791 // FIXME: This is highly dubious. Multiple macro definitions can have the
1792 // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc.
1793 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS])
Craig Toppera13603a2014-05-22 05:54:18 +00001794 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001795
1796 Info.MI = getMacro(GMacID);
1797 Info.SubModID = Info.MI->getOwningModuleID();
1798 }
1799 Info.Overrides = PMInfo.ModuleMacroData.Overrides;
1800 Info.F = PMInfo.M;
1801
1802 return new (Context) ModuleMacroInfo(Info);
1803}
1804
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001805void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1806 const PendingMacroInfo &PMInfo) {
1807 assert(II);
1808
Richard Smithe842a472014-10-22 02:05:46 +00001809 if (PMInfo.M->Kind != MK_ImplicitModule &&
1810 PMInfo.M->Kind != MK_ExplicitModule) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001811 installPCHMacroDirectives(II, *PMInfo.M,
1812 PMInfo.PCHMacroData.MacroDirectivesOffset);
1813 return;
1814 }
Richard Smith49f906a2014-03-01 00:08:04 +00001815
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001816 // Module Macro.
1817
Richard Smith49f906a2014-03-01 00:08:04 +00001818 ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
1819 if (!MMI)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001820 return;
1821
Richard Smith49f906a2014-03-01 00:08:04 +00001822 Module *Owner = getSubmodule(MMI->getSubmoduleID());
1823 if (Owner && Owner->NameVisibility == Module::Hidden) {
1824 // Macros in the owning module are hidden. Just remember this macro to
1825 // install if we make this module visible.
1826 HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI));
1827 } else {
Richard Smithdaa69e02014-07-25 04:40:03 +00001828 installImportedMacro(II, MMI, Owner);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001829 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001830}
1831
1832void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
1833 ModuleFile &M, uint64_t Offset) {
Richard Smithe842a472014-10-22 02:05:46 +00001834 assert(M.Kind != MK_ImplicitModule && M.Kind != MK_ExplicitModule);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001835
1836 BitstreamCursor &Cursor = M.MacroCursor;
1837 SavedStreamPosition SavedPosition(Cursor);
1838 Cursor.JumpToBit(Offset);
1839
1840 llvm::BitstreamEntry Entry =
1841 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1842 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1843 Error("malformed block record in AST file");
1844 return;
1845 }
1846
1847 RecordData Record;
1848 PreprocessorRecordTypes RecType =
1849 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record);
1850 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) {
1851 Error("malformed block record in AST file");
1852 return;
1853 }
1854
1855 // Deserialize the macro directives history in reverse source-order.
Craig Toppera13603a2014-05-22 05:54:18 +00001856 MacroDirective *Latest = nullptr, *Earliest = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001857 unsigned Idx = 0, N = Record.size();
1858 while (Idx < N) {
Craig Toppera13603a2014-05-22 05:54:18 +00001859 MacroDirective *MD = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001860 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001861 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1862 switch (K) {
1863 case MacroDirective::MD_Define: {
1864 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
1865 MacroInfo *MI = getMacro(GMacID);
Richard Smithdaa69e02014-07-25 04:40:03 +00001866 SubmoduleID ImportedFrom = Record[Idx++];
1867 bool IsAmbiguous = Record[Idx++];
1868 llvm::SmallVector<unsigned, 4> Overrides;
1869 if (ImportedFrom) {
1870 Overrides.insert(Overrides.end(),
1871 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1872 Idx += Overrides.size() + 1;
1873 }
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001874 DefMacroDirective *DefMD =
Richard Smithdaa69e02014-07-25 04:40:03 +00001875 PP.AllocateDefMacroDirective(MI, Loc, ImportedFrom, Overrides);
1876 DefMD->setAmbiguous(IsAmbiguous);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001877 MD = DefMD;
1878 break;
1879 }
Richard Smithdaa69e02014-07-25 04:40:03 +00001880 case MacroDirective::MD_Undefine: {
1881 SubmoduleID ImportedFrom = Record[Idx++];
1882 llvm::SmallVector<unsigned, 4> Overrides;
1883 if (ImportedFrom) {
1884 Overrides.insert(Overrides.end(),
1885 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1886 Idx += Overrides.size() + 1;
1887 }
1888 MD = PP.AllocateUndefMacroDirective(Loc, ImportedFrom, Overrides);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001889 break;
Richard Smithdaa69e02014-07-25 04:40:03 +00001890 }
1891 case MacroDirective::MD_Visibility:
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001892 bool isPublic = Record[Idx++];
1893 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1894 break;
1895 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001896
1897 if (!Latest)
1898 Latest = MD;
1899 if (Earliest)
1900 Earliest->setPrevious(MD);
1901 Earliest = MD;
1902 }
1903
1904 PP.setLoadedMacroDirective(II, Latest);
1905}
1906
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001907/// \brief For the given macro definitions, check if they are both in system
Douglas Gregor0b202052013-04-12 21:00:54 +00001908/// modules.
1909static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
Douglas Gregor5e461192013-06-07 22:56:11 +00001910 Module *NewOwner, ASTReader &Reader) {
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001911 assert(PrevMI && NewMI);
Craig Toppera13603a2014-05-22 05:54:18 +00001912 Module *PrevOwner = nullptr;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001913 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID())
1914 PrevOwner = Reader.getSubmodule(PrevModID);
Douglas Gregor5e461192013-06-07 22:56:11 +00001915 SourceManager &SrcMgr = Reader.getSourceManager();
1916 bool PrevInSystem
1917 = PrevOwner? PrevOwner->IsSystem
1918 : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc());
1919 bool NewInSystem
1920 = NewOwner? NewOwner->IsSystem
1921 : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc());
1922 if (PrevOwner && PrevOwner == NewOwner)
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001923 return false;
Douglas Gregor5e461192013-06-07 22:56:11 +00001924 return PrevInSystem && NewInSystem;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001925}
1926
Richard Smith49f906a2014-03-01 00:08:04 +00001927void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001928 SourceLocation ImportLoc,
Richard Smith49f906a2014-03-01 00:08:04 +00001929 AmbiguousMacros &Ambig,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001930 ArrayRef<SubmoduleID> Overrides) {
Richard Smith49f906a2014-03-01 00:08:04 +00001931 for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
1932 SubmoduleID OwnerID = Overrides[OI];
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001933
Richard Smith49f906a2014-03-01 00:08:04 +00001934 // If this macro is not yet visible, remove it from the hidden names list.
Richard Smithbb853c72014-08-13 01:23:33 +00001935 // It won't be there if we're in the middle of making the owner visible.
Richard Smith49f906a2014-03-01 00:08:04 +00001936 Module *Owner = getSubmodule(OwnerID);
Richard Smithbb853c72014-08-13 01:23:33 +00001937 auto HiddenIt = HiddenNamesMap.find(Owner);
1938 if (HiddenIt != HiddenNamesMap.end()) {
1939 HiddenNames &Hidden = HiddenIt->second;
1940 HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
1941 if (HI != Hidden.HiddenMacros.end()) {
1942 // Register the macro now so we don't lose it when we re-export.
1943 PP.appendMacroDirective(II, HI->second->import(PP, ImportLoc));
Richard Smithdaa69e02014-07-25 04:40:03 +00001944
Richard Smithbb853c72014-08-13 01:23:33 +00001945 auto SubOverrides = HI->second->getOverriddenSubmodules();
1946 Hidden.HiddenMacros.erase(HI);
1947 removeOverriddenMacros(II, ImportLoc, Ambig, SubOverrides);
1948 }
Richard Smith49f906a2014-03-01 00:08:04 +00001949 }
1950
1951 // If this macro is already in our list of conflicts, remove it from there.
Richard Smithbb29e512014-03-06 00:33:23 +00001952 Ambig.erase(
1953 std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
1954 return MD->getInfo()->getOwningModuleID() == OwnerID;
1955 }),
1956 Ambig.end());
Richard Smith49f906a2014-03-01 00:08:04 +00001957 }
1958}
1959
1960ASTReader::AmbiguousMacros *
1961ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001962 SourceLocation ImportLoc,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001963 ArrayRef<SubmoduleID> Overrides) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001964 MacroDirective *Prev = PP.getMacroDirective(II);
Richard Smith49f906a2014-03-01 00:08:04 +00001965 if (!Prev && Overrides.empty())
Craig Toppera13603a2014-05-22 05:54:18 +00001966 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001967
Craig Toppera13603a2014-05-22 05:54:18 +00001968 DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective()
1969 : nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001970 if (PrevDef && PrevDef->isAmbiguous()) {
1971 // We had a prior ambiguity. Check whether we resolve it (or make it worse).
1972 AmbiguousMacros &Ambig = AmbiguousMacroDefs[II];
1973 Ambig.push_back(PrevDef);
1974
Richard Smithdaa69e02014-07-25 04:40:03 +00001975 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00001976
1977 if (!Ambig.empty())
1978 return &Ambig;
1979
1980 AmbiguousMacroDefs.erase(II);
1981 } else {
1982 // There's no ambiguity yet. Maybe we're introducing one.
Benjamin Kramer834652a2014-05-03 18:44:26 +00001983 AmbiguousMacros Ambig;
Richard Smith49f906a2014-03-01 00:08:04 +00001984 if (PrevDef)
1985 Ambig.push_back(PrevDef);
1986
Richard Smithdaa69e02014-07-25 04:40:03 +00001987 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00001988
1989 if (!Ambig.empty()) {
1990 AmbiguousMacros &Result = AmbiguousMacroDefs[II];
Benjamin Kramer834652a2014-05-03 18:44:26 +00001991 std::swap(Result, Ambig);
Richard Smith49f906a2014-03-01 00:08:04 +00001992 return &Result;
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001993 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001994 }
Richard Smith49f906a2014-03-01 00:08:04 +00001995
1996 // We ended up with no ambiguity.
Craig Toppera13603a2014-05-22 05:54:18 +00001997 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001998}
1999
2000void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI,
Richard Smithdaa69e02014-07-25 04:40:03 +00002001 Module *Owner) {
Richard Smith49f906a2014-03-01 00:08:04 +00002002 assert(II && Owner);
2003
2004 SourceLocation ImportLoc = Owner->MacroVisibilityLoc;
Richard Smithdaa69e02014-07-25 04:40:03 +00002005 if (ImportLoc.isInvalid()) {
Richard Smith49f906a2014-03-01 00:08:04 +00002006 // FIXME: If we made macros from this module visible but didn't provide a
2007 // source location for the import, we don't have a location for the macro.
2008 // Use the location at which the containing module file was first imported
2009 // for now.
2010 ImportLoc = MMI->F->DirectImportLoc;
Richard Smith56be7542014-03-21 00:33:59 +00002011 assert(ImportLoc.isValid() && "no import location for a visible macro?");
Richard Smith49f906a2014-03-01 00:08:04 +00002012 }
2013
Benjamin Kramer834652a2014-05-03 18:44:26 +00002014 AmbiguousMacros *Prev =
Richard Smithdaa69e02014-07-25 04:40:03 +00002015 removeOverriddenMacros(II, ImportLoc, MMI->getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00002016
Richard Smith49f906a2014-03-01 00:08:04 +00002017 // Create a synthetic macro definition corresponding to the import (or null
2018 // if this was an undefinition of the macro).
Richard Smithdaa69e02014-07-25 04:40:03 +00002019 MacroDirective *Imported = MMI->import(PP, ImportLoc);
2020 DefMacroDirective *MD = dyn_cast<DefMacroDirective>(Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002021
2022 // If there's no ambiguity, just install the macro.
2023 if (!Prev) {
Richard Smithdaa69e02014-07-25 04:40:03 +00002024 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002025 return;
2026 }
2027 assert(!Prev->empty());
2028
2029 if (!MD) {
2030 // We imported a #undef that didn't remove all prior definitions. The most
2031 // recent prior definition remains, and we install it in the place of the
Richard Smithdaa69e02014-07-25 04:40:03 +00002032 // imported directive, as if by a local #pragma pop_macro.
Richard Smith49f906a2014-03-01 00:08:04 +00002033 MacroInfo *NewMI = Prev->back()->getInfo();
2034 Prev->pop_back();
Richard Smithdaa69e02014-07-25 04:40:03 +00002035 MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc);
2036
2037 // Install our #undef first so that we don't lose track of it. We'll replace
2038 // this with whichever macro definition ends up winning.
2039 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002040 }
2041
2042 // We're introducing a macro definition that creates or adds to an ambiguity.
2043 // We can resolve that ambiguity if this macro is token-for-token identical to
2044 // all of the existing definitions.
2045 MacroInfo *NewMI = MD->getInfo();
2046 assert(NewMI && "macro definition with no MacroInfo?");
2047 while (!Prev->empty()) {
2048 MacroInfo *PrevMI = Prev->back()->getInfo();
2049 assert(PrevMI && "macro definition with no MacroInfo?");
2050
2051 // Before marking the macros as ambiguous, check if this is a case where
2052 // both macros are in system headers. If so, we trust that the system
2053 // did not get it wrong. This also handles cases where Clang's own
2054 // headers have a different spelling of certain system macros:
2055 // #define LONG_MAX __LONG_MAX__ (clang's limits.h)
2056 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
2057 //
2058 // FIXME: Remove the defined-in-system-headers check. clang's limits.h
2059 // overrides the system limits.h's macros, so there's no conflict here.
2060 if (NewMI != PrevMI &&
2061 !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) &&
2062 !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this))
2063 break;
2064
2065 // The previous definition is the same as this one (or both are defined in
2066 // system modules so we can assume they're equivalent); we don't need to
2067 // track it any more.
2068 Prev->pop_back();
2069 }
2070
2071 if (!Prev->empty())
2072 MD->setAmbiguous(true);
2073
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002074 PP.appendMacroDirective(II, MD);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002075}
2076
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002077ASTReader::InputFileInfo
2078ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002079 // Go find this input file.
2080 BitstreamCursor &Cursor = F.InputFilesCursor;
2081 SavedStreamPosition SavedPosition(Cursor);
2082 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2083
2084 unsigned Code = Cursor.ReadCode();
2085 RecordData Record;
2086 StringRef Blob;
2087
2088 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2089 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
2090 "invalid record type for input file");
2091 (void)Result;
2092
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002093 std::string Filename;
2094 off_t StoredSize;
2095 time_t StoredTime;
2096 bool Overridden;
Richard Smith1d21a072014-12-05 02:33:27 +00002097
Ben Langmuir198c1682014-03-07 07:27:49 +00002098 assert(Record[0] == ID && "Bogus stored ID or offset");
2099 StoredSize = static_cast<off_t>(Record[1]);
2100 StoredTime = static_cast<time_t>(Record[2]);
2101 Overridden = static_cast<bool>(Record[3]);
2102 Filename = Blob;
Richard Smith1d21a072014-12-05 02:33:27 +00002103 ResolveImportedPath(F, Filename);
2104
Hans Wennborg73945142014-03-14 17:45:06 +00002105 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
2106 return R;
Ben Langmuir198c1682014-03-07 07:27:49 +00002107}
2108
2109std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002110 return readInputFileInfo(F, ID).Filename;
Ben Langmuir198c1682014-03-07 07:27:49 +00002111}
2112
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002113InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002114 // If this ID is bogus, just return an empty input file.
2115 if (ID == 0 || ID > F.InputFilesLoaded.size())
2116 return InputFile();
2117
2118 // If we've already loaded this input file, return it.
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002119 if (F.InputFilesLoaded[ID-1].getFile())
Guy Benyei11169dd2012-12-18 14:30:41 +00002120 return F.InputFilesLoaded[ID-1];
2121
Argyrios Kyrtzidis9308f0a2014-01-08 19:13:34 +00002122 if (F.InputFilesLoaded[ID-1].isNotFound())
2123 return InputFile();
2124
Guy Benyei11169dd2012-12-18 14:30:41 +00002125 // Go find this input file.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002126 BitstreamCursor &Cursor = F.InputFilesCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00002127 SavedStreamPosition SavedPosition(Cursor);
2128 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2129
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002130 InputFileInfo FI = readInputFileInfo(F, ID);
2131 off_t StoredSize = FI.StoredSize;
2132 time_t StoredTime = FI.StoredTime;
2133 bool Overridden = FI.Overridden;
2134 StringRef Filename = FI.Filename;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002135
Ben Langmuir198c1682014-03-07 07:27:49 +00002136 const FileEntry *File
2137 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
2138 : FileMgr.getFile(Filename, /*OpenFile=*/false);
2139
2140 // If we didn't find the file, resolve it relative to the
2141 // original directory from which this AST file was created.
Craig Toppera13603a2014-05-22 05:54:18 +00002142 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
Ben Langmuir198c1682014-03-07 07:27:49 +00002143 F.OriginalDir != CurrentDir) {
2144 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2145 F.OriginalDir,
2146 CurrentDir);
2147 if (!Resolved.empty())
2148 File = FileMgr.getFile(Resolved);
2149 }
2150
2151 // For an overridden file, create a virtual file with the stored
2152 // size/timestamp.
Craig Toppera13603a2014-05-22 05:54:18 +00002153 if (Overridden && File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002154 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2155 }
2156
Craig Toppera13603a2014-05-22 05:54:18 +00002157 if (File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002158 if (Complain) {
2159 std::string ErrorStr = "could not find file '";
2160 ErrorStr += Filename;
2161 ErrorStr += "' referenced by AST file";
2162 Error(ErrorStr.c_str());
Guy Benyei11169dd2012-12-18 14:30:41 +00002163 }
Ben Langmuir198c1682014-03-07 07:27:49 +00002164 // Record that we didn't find the file.
2165 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2166 return InputFile();
2167 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002168
Ben Langmuir198c1682014-03-07 07:27:49 +00002169 // Check if there was a request to override the contents of the file
2170 // that was part of the precompiled header. Overridding such a file
2171 // can lead to problems when lexing using the source locations from the
2172 // PCH.
2173 SourceManager &SM = getSourceManager();
2174 if (!Overridden && SM.isFileOverridden(File)) {
2175 if (Complain)
2176 Error(diag::err_fe_pch_file_overridden, Filename);
2177 // After emitting the diagnostic, recover by disabling the override so
2178 // that the original file will be used.
2179 SM.disableFileContentsOverride(File);
2180 // The FileEntry is a virtual file entry with the size of the contents
2181 // that would override the original contents. Set it to the original's
2182 // size/time.
2183 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2184 StoredSize, StoredTime);
2185 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002186
Ben Langmuir198c1682014-03-07 07:27:49 +00002187 bool IsOutOfDate = false;
2188
2189 // For an overridden file, there is nothing to validate.
Richard Smith96fdab62014-10-28 16:24:08 +00002190 if (!Overridden && //
2191 (StoredSize != File->getSize() ||
2192#if defined(LLVM_ON_WIN32)
2193 false
2194#else
Ben Langmuir198c1682014-03-07 07:27:49 +00002195 // In our regression testing, the Windows file system seems to
2196 // have inconsistent modification times that sometimes
2197 // erroneously trigger this error-handling path.
Richard Smith96fdab62014-10-28 16:24:08 +00002198 //
2199 // This also happens in networked file systems, so disable this
2200 // check if validation is disabled or if we have an explicitly
2201 // built PCM file.
2202 //
2203 // FIXME: Should we also do this for PCH files? They could also
2204 // reasonably get shared across a network during a distributed build.
2205 (StoredTime != File->getModificationTime() && !DisableValidation &&
2206 F.Kind != MK_ExplicitModule)
Guy Benyei11169dd2012-12-18 14:30:41 +00002207#endif
Ben Langmuir198c1682014-03-07 07:27:49 +00002208 )) {
2209 if (Complain) {
2210 // Build a list of the PCH imports that got us here (in reverse).
2211 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2212 while (ImportStack.back()->ImportedBy.size() > 0)
2213 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
Ben Langmuire82630d2014-01-17 00:19:09 +00002214
Ben Langmuir198c1682014-03-07 07:27:49 +00002215 // The top-level PCH is stale.
2216 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2217 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
Ben Langmuire82630d2014-01-17 00:19:09 +00002218
Ben Langmuir198c1682014-03-07 07:27:49 +00002219 // Print the import stack.
2220 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2221 Diag(diag::note_pch_required_by)
2222 << Filename << ImportStack[0]->FileName;
2223 for (unsigned I = 1; I < ImportStack.size(); ++I)
Ben Langmuire82630d2014-01-17 00:19:09 +00002224 Diag(diag::note_pch_required_by)
Ben Langmuir198c1682014-03-07 07:27:49 +00002225 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
Douglas Gregor7029ce12013-03-19 00:28:20 +00002226 }
2227
Ben Langmuir198c1682014-03-07 07:27:49 +00002228 if (!Diags.isDiagnosticInFlight())
2229 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
Guy Benyei11169dd2012-12-18 14:30:41 +00002230 }
2231
Ben Langmuir198c1682014-03-07 07:27:49 +00002232 IsOutOfDate = true;
Guy Benyei11169dd2012-12-18 14:30:41 +00002233 }
2234
Ben Langmuir198c1682014-03-07 07:27:49 +00002235 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
2236
2237 // Note that we've loaded this input file.
2238 F.InputFilesLoaded[ID-1] = IF;
2239 return IF;
Guy Benyei11169dd2012-12-18 14:30:41 +00002240}
2241
Richard Smith1d21a072014-12-05 02:33:27 +00002242/// \brief If we are loading a relocatable PCH or module file, and the filename
2243/// is not an absolute path, add the system or module root to the beginning of
2244/// the file name.
2245void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2246 // Resolve relative to the base directory, if we have one.
2247 if (!M.BaseDirectory.empty())
2248 return ResolveImportedPath(Filename, M.BaseDirectory);
Guy Benyei11169dd2012-12-18 14:30:41 +00002249}
2250
Richard Smith1d21a072014-12-05 02:33:27 +00002251void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002252 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2253 return;
2254
Richard Smith1d21a072014-12-05 02:33:27 +00002255 unsigned Length = Prefix.size();
2256 if (Prefix[Length - 1] != '/')
Guy Benyei11169dd2012-12-18 14:30:41 +00002257 Filename.insert(Filename.begin(), '/');
2258
Richard Smith1d21a072014-12-05 02:33:27 +00002259 Filename.insert(Filename.begin(), Prefix.begin(), Prefix.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00002260}
2261
2262ASTReader::ASTReadResult
2263ASTReader::ReadControlBlock(ModuleFile &F,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00002264 SmallVectorImpl<ImportedModule> &Loaded,
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002265 const ModuleFile *ImportedBy,
Guy Benyei11169dd2012-12-18 14:30:41 +00002266 unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002267 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002268
2269 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2270 Error("malformed block record in AST file");
2271 return Failure;
2272 }
2273
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002274 // Should we allow the configuration of the module file to differ from the
2275 // configuration of the current translation unit in a compatible way?
2276 //
2277 // FIXME: Allow this for files explicitly specified with -include-pch too.
2278 bool AllowCompatibleConfigurationMismatch = F.Kind == MK_ExplicitModule;
2279
Guy Benyei11169dd2012-12-18 14:30:41 +00002280 // Read all of the records and blocks in the control block.
2281 RecordData Record;
Richard Smitha1825302014-10-23 22:18:29 +00002282 unsigned NumInputs = 0;
2283 unsigned NumUserInputs = 0;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002284 while (1) {
2285 llvm::BitstreamEntry Entry = Stream.advance();
2286
2287 switch (Entry.Kind) {
2288 case llvm::BitstreamEntry::Error:
2289 Error("malformed block record in AST file");
2290 return Failure;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002291 case llvm::BitstreamEntry::EndBlock: {
2292 // Validate input files.
2293 const HeaderSearchOptions &HSOpts =
2294 PP.getHeaderSearchInfo().getHeaderSearchOpts();
Ben Langmuircb69b572014-03-07 06:40:32 +00002295
Richard Smitha1825302014-10-23 22:18:29 +00002296 // All user input files reside at the index range [0, NumUserInputs), and
2297 // system input files reside at [NumUserInputs, NumInputs).
Ben Langmuiracb803e2014-11-10 22:13:10 +00002298 if (!DisableValidation) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002299 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
Ben Langmuircb69b572014-03-07 06:40:32 +00002300
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002301 // If we are reading a module, we will create a verification timestamp,
2302 // so we verify all input files. Otherwise, verify only user input
2303 // files.
Ben Langmuircb69b572014-03-07 06:40:32 +00002304
2305 unsigned N = NumUserInputs;
2306 if (ValidateSystemInputs ||
Richard Smithe842a472014-10-22 02:05:46 +00002307 (HSOpts.ModulesValidateOncePerBuildSession &&
Ben Langmuiracb803e2014-11-10 22:13:10 +00002308 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
Richard Smithe842a472014-10-22 02:05:46 +00002309 F.Kind == MK_ImplicitModule))
Ben Langmuircb69b572014-03-07 06:40:32 +00002310 N = NumInputs;
2311
Ben Langmuir3d4417c2014-02-07 17:31:11 +00002312 for (unsigned I = 0; I < N; ++I) {
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002313 InputFile IF = getInputFile(F, I+1, Complain);
2314 if (!IF.getFile() || IF.isOutOfDate())
Guy Benyei11169dd2012-12-18 14:30:41 +00002315 return OutOfDate;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002316 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002317 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002318
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +00002319 if (Listener)
2320 Listener->visitModuleFile(F.FileName);
2321
Ben Langmuircb69b572014-03-07 06:40:32 +00002322 if (Listener && Listener->needsInputFileVisitation()) {
2323 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2324 : NumUserInputs;
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00002325 for (unsigned I = 0; I < N; ++I) {
2326 bool IsSystem = I >= NumUserInputs;
2327 InputFileInfo FI = readInputFileInfo(F, I+1);
2328 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2329 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002330 }
2331
Guy Benyei11169dd2012-12-18 14:30:41 +00002332 return Success;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002333 }
2334
Chris Lattnere7b154b2013-01-19 21:39:22 +00002335 case llvm::BitstreamEntry::SubBlock:
2336 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002337 case INPUT_FILES_BLOCK_ID:
2338 F.InputFilesCursor = Stream;
2339 if (Stream.SkipBlock() || // Skip with the main cursor
2340 // Read the abbreviations
2341 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2342 Error("malformed block record in AST file");
2343 return Failure;
2344 }
2345 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002346
Guy Benyei11169dd2012-12-18 14:30:41 +00002347 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002348 if (Stream.SkipBlock()) {
2349 Error("malformed block record in AST file");
2350 return Failure;
2351 }
2352 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00002353 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002354
2355 case llvm::BitstreamEntry::Record:
2356 // The interesting case.
2357 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002358 }
2359
2360 // Read and process a record.
2361 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002362 StringRef Blob;
2363 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002364 case METADATA: {
2365 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2366 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002367 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2368 : diag::err_pch_version_too_new);
Guy Benyei11169dd2012-12-18 14:30:41 +00002369 return VersionMismatch;
2370 }
2371
2372 bool hasErrors = Record[5];
2373 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2374 Diag(diag::err_pch_with_compiler_errors);
2375 return HadErrors;
2376 }
2377
2378 F.RelocatablePCH = Record[4];
Richard Smith1d21a072014-12-05 02:33:27 +00002379 // Relative paths in a relocatable PCH are relative to our sysroot.
2380 if (F.RelocatablePCH)
2381 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
Guy Benyei11169dd2012-12-18 14:30:41 +00002382
2383 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002384 StringRef ASTBranch = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002385 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2386 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002387 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
Guy Benyei11169dd2012-12-18 14:30:41 +00002388 return VersionMismatch;
2389 }
2390 break;
2391 }
2392
Ben Langmuir487ea142014-10-23 18:05:36 +00002393 case SIGNATURE:
2394 assert((!F.Signature || F.Signature == Record[0]) && "signature changed");
2395 F.Signature = Record[0];
2396 break;
2397
Guy Benyei11169dd2012-12-18 14:30:41 +00002398 case IMPORTS: {
2399 // Load each of the imported PCH files.
2400 unsigned Idx = 0, N = Record.size();
2401 while (Idx < N) {
2402 // Read information about the AST file.
2403 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2404 // The import location will be the local one for now; we will adjust
2405 // all import locations of module imports after the global source
2406 // location info are setup.
2407 SourceLocation ImportLoc =
2408 SourceLocation::getFromRawEncoding(Record[Idx++]);
Douglas Gregor7029ce12013-03-19 00:28:20 +00002409 off_t StoredSize = (off_t)Record[Idx++];
2410 time_t StoredModTime = (time_t)Record[Idx++];
Ben Langmuir487ea142014-10-23 18:05:36 +00002411 ASTFileSignature StoredSignature = Record[Idx++];
Richard Smith1d21a072014-12-05 02:33:27 +00002412 auto ImportedFile = ReadPath(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00002413
2414 // Load the AST file.
2415 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00002416 StoredSize, StoredModTime, StoredSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00002417 ClientLoadCapabilities)) {
2418 case Failure: return Failure;
2419 // If we have to ignore the dependency, we'll have to ignore this too.
Douglas Gregor2f1806e2013-03-19 00:38:50 +00002420 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00002421 case OutOfDate: return OutOfDate;
2422 case VersionMismatch: return VersionMismatch;
2423 case ConfigurationMismatch: return ConfigurationMismatch;
2424 case HadErrors: return HadErrors;
2425 case Success: break;
2426 }
2427 }
2428 break;
2429 }
2430
2431 case LANGUAGE_OPTIONS: {
2432 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002433 // FIXME: The &F == *ModuleMgr.begin() check is wrong for modules.
Guy Benyei11169dd2012-12-18 14:30:41 +00002434 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002435 ParseLanguageOptions(Record, Complain, *Listener,
2436 AllowCompatibleConfigurationMismatch) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002437 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002438 return ConfigurationMismatch;
2439 break;
2440 }
2441
2442 case TARGET_OPTIONS: {
2443 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2444 if (Listener && &F == *ModuleMgr.begin() &&
2445 ParseTargetOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002446 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002447 return ConfigurationMismatch;
2448 break;
2449 }
2450
2451 case DIAGNOSTIC_OPTIONS: {
Ben Langmuirb92de022014-04-29 16:25:26 +00002452 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
Guy Benyei11169dd2012-12-18 14:30:41 +00002453 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002454 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002455 ParseDiagnosticOptions(Record, Complain, *Listener) &&
Ben Langmuirb92de022014-04-29 16:25:26 +00002456 !DisableValidation)
2457 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00002458 break;
2459 }
2460
2461 case FILE_SYSTEM_OPTIONS: {
2462 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2463 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002464 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002465 ParseFileSystemOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002466 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002467 return ConfigurationMismatch;
2468 break;
2469 }
2470
2471 case HEADER_SEARCH_OPTIONS: {
2472 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2473 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002474 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002475 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002476 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002477 return ConfigurationMismatch;
2478 break;
2479 }
2480
2481 case PREPROCESSOR_OPTIONS: {
2482 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2483 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002484 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002485 ParsePreprocessorOptions(Record, Complain, *Listener,
2486 SuggestedPredefines) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002487 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002488 return ConfigurationMismatch;
2489 break;
2490 }
2491
2492 case ORIGINAL_FILE:
2493 F.OriginalSourceFileID = FileID::get(Record[0]);
Chris Lattner0e6c9402013-01-20 02:38:54 +00002494 F.ActualOriginalSourceFileName = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002495 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
Richard Smith1d21a072014-12-05 02:33:27 +00002496 ResolveImportedPath(F, F.OriginalSourceFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00002497 break;
2498
2499 case ORIGINAL_FILE_ID:
2500 F.OriginalSourceFileID = FileID::get(Record[0]);
2501 break;
2502
2503 case ORIGINAL_PCH_DIR:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002504 F.OriginalDir = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002505 break;
2506
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002507 case MODULE_NAME:
2508 F.ModuleName = Blob;
Ben Langmuir4f5212a2014-04-14 22:12:44 +00002509 if (Listener)
2510 Listener->ReadModuleName(F.ModuleName);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002511 break;
2512
Richard Smith1d21a072014-12-05 02:33:27 +00002513 case MODULE_DIRECTORY:
2514 F.BaseDirectory = Blob;
2515 break;
2516
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002517 case MODULE_MAP_FILE:
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00002518 if (ASTReadResult Result =
2519 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2520 return Result;
Ben Langmuir264ea152014-11-08 00:06:39 +00002521 break;
2522
Guy Benyei11169dd2012-12-18 14:30:41 +00002523 case INPUT_FILE_OFFSETS:
Richard Smitha1825302014-10-23 22:18:29 +00002524 NumInputs = Record[0];
2525 NumUserInputs = Record[1];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002526 F.InputFileOffsets = (const uint32_t *)Blob.data();
Richard Smitha1825302014-10-23 22:18:29 +00002527 F.InputFilesLoaded.resize(NumInputs);
Guy Benyei11169dd2012-12-18 14:30:41 +00002528 break;
2529 }
2530 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002531}
2532
Ben Langmuir2c9af442014-04-10 17:57:43 +00002533ASTReader::ASTReadResult
2534ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002535 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002536
2537 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2538 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002539 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002540 }
2541
2542 // Read all of the records and blocks for the AST file.
2543 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002544 while (1) {
2545 llvm::BitstreamEntry Entry = Stream.advance();
2546
2547 switch (Entry.Kind) {
2548 case llvm::BitstreamEntry::Error:
2549 Error("error at end of module block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002550 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002551 case llvm::BitstreamEntry::EndBlock: {
Richard Smithc0fbba72013-04-03 22:49:41 +00002552 // Outside of C++, we do not store a lookup map for the translation unit.
2553 // Instead, mark it as needing a lookup map to be built if this module
2554 // contains any declarations lexically within it (which it always does!).
2555 // This usually has no cost, since we very rarely need the lookup map for
2556 // the translation unit outside C++.
Guy Benyei11169dd2012-12-18 14:30:41 +00002557 DeclContext *DC = Context.getTranslationUnitDecl();
Richard Smithc0fbba72013-04-03 22:49:41 +00002558 if (DC->hasExternalLexicalStorage() &&
2559 !getContext().getLangOpts().CPlusPlus)
Guy Benyei11169dd2012-12-18 14:30:41 +00002560 DC->setMustBuildLookupTable();
Chris Lattnere7b154b2013-01-19 21:39:22 +00002561
Ben Langmuir2c9af442014-04-10 17:57:43 +00002562 return Success;
Guy Benyei11169dd2012-12-18 14:30:41 +00002563 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002564 case llvm::BitstreamEntry::SubBlock:
2565 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002566 case DECLTYPES_BLOCK_ID:
2567 // We lazily load the decls block, but we want to set up the
2568 // DeclsCursor cursor to point into it. Clone our current bitcode
2569 // cursor to it, enter the block and read the abbrevs in that block.
2570 // With the main cursor, we just skip over it.
2571 F.DeclsCursor = Stream;
2572 if (Stream.SkipBlock() || // Skip with the main cursor.
2573 // Read the abbrevs.
2574 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2575 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002576 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002577 }
2578 break;
Richard Smithb9eab6d2014-03-20 19:44:17 +00002579
Guy Benyei11169dd2012-12-18 14:30:41 +00002580 case PREPROCESSOR_BLOCK_ID:
2581 F.MacroCursor = Stream;
2582 if (!PP.getExternalSource())
2583 PP.setExternalSource(this);
Chris Lattnere7b154b2013-01-19 21:39:22 +00002584
Guy Benyei11169dd2012-12-18 14:30:41 +00002585 if (Stream.SkipBlock() ||
2586 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2587 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002588 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002589 }
2590 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2591 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002592
Guy Benyei11169dd2012-12-18 14:30:41 +00002593 case PREPROCESSOR_DETAIL_BLOCK_ID:
2594 F.PreprocessorDetailCursor = Stream;
2595 if (Stream.SkipBlock() ||
Chris Lattnere7b154b2013-01-19 21:39:22 +00002596 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00002597 PREPROCESSOR_DETAIL_BLOCK_ID)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00002598 Error("malformed preprocessor detail record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002599 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002600 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002601 F.PreprocessorDetailStartOffset
Chris Lattnere7b154b2013-01-19 21:39:22 +00002602 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2603
Guy Benyei11169dd2012-12-18 14:30:41 +00002604 if (!PP.getPreprocessingRecord())
2605 PP.createPreprocessingRecord();
2606 if (!PP.getPreprocessingRecord()->getExternalSource())
2607 PP.getPreprocessingRecord()->SetExternalSource(*this);
2608 break;
2609
2610 case SOURCE_MANAGER_BLOCK_ID:
2611 if (ReadSourceManagerBlock(F))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002612 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002613 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002614
Guy Benyei11169dd2012-12-18 14:30:41 +00002615 case SUBMODULE_BLOCK_ID:
Ben Langmuir2c9af442014-04-10 17:57:43 +00002616 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2617 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00002618 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002619
Guy Benyei11169dd2012-12-18 14:30:41 +00002620 case COMMENTS_BLOCK_ID: {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002621 BitstreamCursor C = Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002622 if (Stream.SkipBlock() ||
2623 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2624 Error("malformed comments block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002625 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002626 }
2627 CommentsCursors.push_back(std::make_pair(C, &F));
2628 break;
2629 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002630
Guy Benyei11169dd2012-12-18 14:30:41 +00002631 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002632 if (Stream.SkipBlock()) {
2633 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002634 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002635 }
2636 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002637 }
2638 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002639
2640 case llvm::BitstreamEntry::Record:
2641 // The interesting case.
2642 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002643 }
2644
2645 // Read and process a record.
2646 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002647 StringRef Blob;
2648 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002649 default: // Default behavior: ignore.
2650 break;
2651
2652 case TYPE_OFFSET: {
2653 if (F.LocalNumTypes != 0) {
2654 Error("duplicate TYPE_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002655 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002656 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002657 F.TypeOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002658 F.LocalNumTypes = Record[0];
2659 unsigned LocalBaseTypeIndex = Record[1];
2660 F.BaseTypeIndex = getTotalNumTypes();
2661
2662 if (F.LocalNumTypes > 0) {
2663 // Introduce the global -> local mapping for types within this module.
2664 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2665
2666 // Introduce the local -> global mapping for types within this module.
2667 F.TypeRemap.insertOrReplace(
2668 std::make_pair(LocalBaseTypeIndex,
2669 F.BaseTypeIndex - LocalBaseTypeIndex));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002670
2671 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
Guy Benyei11169dd2012-12-18 14:30:41 +00002672 }
2673 break;
2674 }
2675
2676 case DECL_OFFSET: {
2677 if (F.LocalNumDecls != 0) {
2678 Error("duplicate DECL_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002679 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002680 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002681 F.DeclOffsets = (const DeclOffset *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002682 F.LocalNumDecls = Record[0];
2683 unsigned LocalBaseDeclID = Record[1];
2684 F.BaseDeclID = getTotalNumDecls();
2685
2686 if (F.LocalNumDecls > 0) {
2687 // Introduce the global -> local mapping for declarations within this
2688 // module.
2689 GlobalDeclMap.insert(
2690 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2691
2692 // Introduce the local -> global mapping for declarations within this
2693 // module.
2694 F.DeclRemap.insertOrReplace(
2695 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2696
2697 // Introduce the global -> local mapping for declarations within this
2698 // module.
2699 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
Ben Langmuirfe971d92014-08-16 04:54:18 +00002700
Ben Langmuir52ca6782014-10-20 16:27:32 +00002701 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2702 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002703 break;
2704 }
2705
2706 case TU_UPDATE_LEXICAL: {
2707 DeclContext *TU = Context.getTranslationUnitDecl();
2708 DeclContextInfo &Info = F.DeclContextInfos[TU];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002709 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
Guy Benyei11169dd2012-12-18 14:30:41 +00002710 Info.NumLexicalDecls
Chris Lattner0e6c9402013-01-20 02:38:54 +00002711 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
Guy Benyei11169dd2012-12-18 14:30:41 +00002712 TU->setHasExternalLexicalStorage(true);
2713 break;
2714 }
2715
2716 case UPDATE_VISIBLE: {
2717 unsigned Idx = 0;
2718 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2719 ASTDeclContextNameLookupTable *Table =
Justin Bognerda4e6502014-04-14 16:34:29 +00002720 ASTDeclContextNameLookupTable::Create(
2721 (const unsigned char *)Blob.data() + Record[Idx++],
2722 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2723 (const unsigned char *)Blob.data(),
2724 ASTDeclContextNameLookupTrait(*this, F));
Richard Smithcd45dbc2014-04-19 03:48:30 +00002725 if (Decl *D = GetExistingDecl(ID)) {
Richard Smithd9174792014-03-11 03:10:46 +00002726 auto *DC = cast<DeclContext>(D);
2727 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
Richard Smith52e3fba2014-03-11 07:17:35 +00002728 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2729 delete LookupTable;
2730 LookupTable = Table;
Guy Benyei11169dd2012-12-18 14:30:41 +00002731 } else
2732 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2733 break;
2734 }
2735
2736 case IDENTIFIER_TABLE:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002737 F.IdentifierTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002738 if (Record[0]) {
Justin Bognerda4e6502014-04-14 16:34:29 +00002739 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2740 (const unsigned char *)F.IdentifierTableData + Record[0],
2741 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2742 (const unsigned char *)F.IdentifierTableData,
2743 ASTIdentifierLookupTrait(*this, F));
Guy Benyei11169dd2012-12-18 14:30:41 +00002744
2745 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2746 }
2747 break;
2748
2749 case IDENTIFIER_OFFSET: {
2750 if (F.LocalNumIdentifiers != 0) {
2751 Error("duplicate IDENTIFIER_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002752 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002753 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002754 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002755 F.LocalNumIdentifiers = Record[0];
2756 unsigned LocalBaseIdentifierID = Record[1];
2757 F.BaseIdentifierID = getTotalNumIdentifiers();
2758
2759 if (F.LocalNumIdentifiers > 0) {
2760 // Introduce the global -> local mapping for identifiers within this
2761 // module.
2762 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2763 &F));
2764
2765 // Introduce the local -> global mapping for identifiers within this
2766 // module.
2767 F.IdentifierRemap.insertOrReplace(
2768 std::make_pair(LocalBaseIdentifierID,
2769 F.BaseIdentifierID - LocalBaseIdentifierID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00002770
Ben Langmuir52ca6782014-10-20 16:27:32 +00002771 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2772 + F.LocalNumIdentifiers);
2773 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002774 break;
2775 }
2776
Ben Langmuir332aafe2014-01-31 01:06:56 +00002777 case EAGERLY_DESERIALIZED_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002778 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Ben Langmuir332aafe2014-01-31 01:06:56 +00002779 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002780 break;
2781
2782 case SPECIAL_TYPES:
Douglas Gregor44180f82013-02-01 23:45:03 +00002783 if (SpecialTypes.empty()) {
2784 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2785 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2786 break;
2787 }
2788
2789 if (SpecialTypes.size() != Record.size()) {
2790 Error("invalid special-types record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002791 return Failure;
Douglas Gregor44180f82013-02-01 23:45:03 +00002792 }
2793
2794 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2795 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2796 if (!SpecialTypes[I])
2797 SpecialTypes[I] = ID;
2798 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2799 // merge step?
2800 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002801 break;
2802
2803 case STATISTICS:
2804 TotalNumStatements += Record[0];
2805 TotalNumMacros += Record[1];
2806 TotalLexicalDeclContexts += Record[2];
2807 TotalVisibleDeclContexts += Record[3];
2808 break;
2809
2810 case UNUSED_FILESCOPED_DECLS:
2811 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2812 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2813 break;
2814
2815 case DELEGATING_CTORS:
2816 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2817 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2818 break;
2819
2820 case WEAK_UNDECLARED_IDENTIFIERS:
2821 if (Record.size() % 4 != 0) {
2822 Error("invalid weak identifiers record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002823 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002824 }
2825
2826 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2827 // files. This isn't the way to do it :)
2828 WeakUndeclaredIdentifiers.clear();
2829
2830 // Translate the weak, undeclared identifiers into global IDs.
2831 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2832 WeakUndeclaredIdentifiers.push_back(
2833 getGlobalIdentifierID(F, Record[I++]));
2834 WeakUndeclaredIdentifiers.push_back(
2835 getGlobalIdentifierID(F, Record[I++]));
2836 WeakUndeclaredIdentifiers.push_back(
2837 ReadSourceLocation(F, Record, I).getRawEncoding());
2838 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2839 }
2840 break;
2841
Richard Smith78165b52013-01-10 23:43:47 +00002842 case LOCALLY_SCOPED_EXTERN_C_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002843 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Richard Smith78165b52013-01-10 23:43:47 +00002844 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002845 break;
2846
2847 case SELECTOR_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002848 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002849 F.LocalNumSelectors = Record[0];
2850 unsigned LocalBaseSelectorID = Record[1];
2851 F.BaseSelectorID = getTotalNumSelectors();
2852
2853 if (F.LocalNumSelectors > 0) {
2854 // Introduce the global -> local mapping for selectors within this
2855 // module.
2856 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2857
2858 // Introduce the local -> global mapping for selectors within this
2859 // module.
2860 F.SelectorRemap.insertOrReplace(
2861 std::make_pair(LocalBaseSelectorID,
2862 F.BaseSelectorID - LocalBaseSelectorID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002863
2864 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
Guy Benyei11169dd2012-12-18 14:30:41 +00002865 }
2866 break;
2867 }
2868
2869 case METHOD_POOL:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002870 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002871 if (Record[0])
2872 F.SelectorLookupTable
2873 = ASTSelectorLookupTable::Create(
2874 F.SelectorLookupTableData + Record[0],
2875 F.SelectorLookupTableData,
2876 ASTSelectorLookupTrait(*this, F));
2877 TotalNumMethodPoolEntries += Record[1];
2878 break;
2879
2880 case REFERENCED_SELECTOR_POOL:
2881 if (!Record.empty()) {
2882 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2883 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2884 Record[Idx++]));
2885 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2886 getRawEncoding());
2887 }
2888 }
2889 break;
2890
2891 case PP_COUNTER_VALUE:
2892 if (!Record.empty() && Listener)
2893 Listener->ReadCounter(F, Record[0]);
2894 break;
2895
2896 case FILE_SORTED_DECLS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002897 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002898 F.NumFileSortedDecls = Record[0];
2899 break;
2900
2901 case SOURCE_LOCATION_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002902 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002903 F.LocalNumSLocEntries = Record[0];
2904 unsigned SLocSpaceSize = Record[1];
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00002905 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Ben Langmuir52ca6782014-10-20 16:27:32 +00002906 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
Guy Benyei11169dd2012-12-18 14:30:41 +00002907 SLocSpaceSize);
2908 // Make our entry in the range map. BaseID is negative and growing, so
2909 // we invert it. Because we invert it, though, we need the other end of
2910 // the range.
2911 unsigned RangeStart =
2912 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2913 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2914 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2915
2916 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2917 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2918 GlobalSLocOffsetMap.insert(
2919 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2920 - SLocSpaceSize,&F));
2921
2922 // Initialize the remapping table.
2923 // Invalid stays invalid.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002924 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei11169dd2012-12-18 14:30:41 +00002925 // This module. Base was 2 when being compiled.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002926 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei11169dd2012-12-18 14:30:41 +00002927 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2928
2929 TotalNumSLocEntries += F.LocalNumSLocEntries;
2930 break;
2931 }
2932
2933 case MODULE_OFFSET_MAP: {
2934 // Additional remapping information.
Chris Lattner0e6c9402013-01-20 02:38:54 +00002935 const unsigned char *Data = (const unsigned char*)Blob.data();
2936 const unsigned char *DataEnd = Data + Blob.size();
Richard Smithb9eab6d2014-03-20 19:44:17 +00002937
2938 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2939 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2940 F.SLocRemap.insert(std::make_pair(0U, 0));
2941 F.SLocRemap.insert(std::make_pair(2U, 1));
2942 }
2943
Guy Benyei11169dd2012-12-18 14:30:41 +00002944 // Continuous range maps we may be updating in our module.
Ben Langmuir785180e2014-10-20 16:27:30 +00002945 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
2946 RemapBuilder;
2947 RemapBuilder SLocRemap(F.SLocRemap);
2948 RemapBuilder IdentifierRemap(F.IdentifierRemap);
2949 RemapBuilder MacroRemap(F.MacroRemap);
2950 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2951 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
2952 RemapBuilder SelectorRemap(F.SelectorRemap);
2953 RemapBuilder DeclRemap(F.DeclRemap);
2954 RemapBuilder TypeRemap(F.TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00002955
2956 while(Data < DataEnd) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00002957 using namespace llvm::support;
2958 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00002959 StringRef Name = StringRef((const char*)Data, Len);
2960 Data += Len;
2961 ModuleFile *OM = ModuleMgr.lookup(Name);
2962 if (!OM) {
2963 Error("SourceLocation remap refers to unknown module");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002964 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002965 }
2966
Justin Bogner57ba0b22014-03-28 22:03:24 +00002967 uint32_t SLocOffset =
2968 endian::readNext<uint32_t, little, unaligned>(Data);
2969 uint32_t IdentifierIDOffset =
2970 endian::readNext<uint32_t, little, unaligned>(Data);
2971 uint32_t MacroIDOffset =
2972 endian::readNext<uint32_t, little, unaligned>(Data);
2973 uint32_t PreprocessedEntityIDOffset =
2974 endian::readNext<uint32_t, little, unaligned>(Data);
2975 uint32_t SubmoduleIDOffset =
2976 endian::readNext<uint32_t, little, unaligned>(Data);
2977 uint32_t SelectorIDOffset =
2978 endian::readNext<uint32_t, little, unaligned>(Data);
2979 uint32_t DeclIDOffset =
2980 endian::readNext<uint32_t, little, unaligned>(Data);
2981 uint32_t TypeIndexOffset =
2982 endian::readNext<uint32_t, little, unaligned>(Data);
2983
Ben Langmuir785180e2014-10-20 16:27:30 +00002984 uint32_t None = std::numeric_limits<uint32_t>::max();
2985
2986 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
2987 RemapBuilder &Remap) {
2988 if (Offset != None)
2989 Remap.insert(std::make_pair(Offset,
2990 static_cast<int>(BaseOffset - Offset)));
2991 };
2992 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
2993 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
2994 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
2995 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
2996 PreprocessedEntityRemap);
2997 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
2998 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
2999 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3000 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00003001
3002 // Global -> local mappings.
3003 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3004 }
3005 break;
3006 }
3007
3008 case SOURCE_MANAGER_LINE_TABLE:
3009 if (ParseLineTable(F, Record))
Ben Langmuir2c9af442014-04-10 17:57:43 +00003010 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003011 break;
3012
3013 case SOURCE_LOCATION_PRELOADS: {
3014 // Need to transform from the local view (1-based IDs) to the global view,
3015 // which is based off F.SLocEntryBaseID.
3016 if (!F.PreloadSLocEntries.empty()) {
3017 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003018 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003019 }
3020
3021 F.PreloadSLocEntries.swap(Record);
3022 break;
3023 }
3024
3025 case EXT_VECTOR_DECLS:
3026 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3027 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3028 break;
3029
3030 case VTABLE_USES:
3031 if (Record.size() % 3 != 0) {
3032 Error("Invalid VTABLE_USES record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003033 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003034 }
3035
3036 // Later tables overwrite earlier ones.
3037 // FIXME: Modules will have some trouble with this. This is clearly not
3038 // the right way to do this.
3039 VTableUses.clear();
3040
3041 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3042 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3043 VTableUses.push_back(
3044 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3045 VTableUses.push_back(Record[Idx++]);
3046 }
3047 break;
3048
3049 case DYNAMIC_CLASSES:
3050 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3051 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
3052 break;
3053
3054 case PENDING_IMPLICIT_INSTANTIATIONS:
3055 if (PendingInstantiations.size() % 2 != 0) {
3056 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003057 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003058 }
3059
3060 if (Record.size() % 2 != 0) {
3061 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003062 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003063 }
3064
3065 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3066 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3067 PendingInstantiations.push_back(
3068 ReadSourceLocation(F, Record, I).getRawEncoding());
3069 }
3070 break;
3071
3072 case SEMA_DECL_REFS:
Richard Smith3d8e97e2013-10-18 06:54:39 +00003073 if (Record.size() != 2) {
3074 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003075 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00003076 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003077 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3078 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3079 break;
3080
3081 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003082 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3083 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3084 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00003085
3086 unsigned LocalBasePreprocessedEntityID = Record[0];
3087
3088 unsigned StartingID;
3089 if (!PP.getPreprocessingRecord())
3090 PP.createPreprocessingRecord();
3091 if (!PP.getPreprocessingRecord()->getExternalSource())
3092 PP.getPreprocessingRecord()->SetExternalSource(*this);
3093 StartingID
3094 = PP.getPreprocessingRecord()
Ben Langmuir52ca6782014-10-20 16:27:32 +00003095 ->allocateLoadedEntities(F.NumPreprocessedEntities);
Guy Benyei11169dd2012-12-18 14:30:41 +00003096 F.BasePreprocessedEntityID = StartingID;
3097
3098 if (F.NumPreprocessedEntities > 0) {
3099 // Introduce the global -> local mapping for preprocessed entities in
3100 // this module.
3101 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3102
3103 // Introduce the local -> global mapping for preprocessed entities in
3104 // this module.
3105 F.PreprocessedEntityRemap.insertOrReplace(
3106 std::make_pair(LocalBasePreprocessedEntityID,
3107 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3108 }
3109
3110 break;
3111 }
3112
3113 case DECL_UPDATE_OFFSETS: {
3114 if (Record.size() % 2 != 0) {
3115 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003116 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003117 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00003118 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3119 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3120 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3121
3122 // If we've already loaded the decl, perform the updates when we finish
3123 // loading this block.
3124 if (Decl *D = GetExistingDecl(ID))
3125 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3126 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003127 break;
3128 }
3129
3130 case DECL_REPLACEMENTS: {
3131 if (Record.size() % 3 != 0) {
3132 Error("invalid DECL_REPLACEMENTS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003133 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003134 }
3135 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3136 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3137 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3138 break;
3139 }
3140
3141 case OBJC_CATEGORIES_MAP: {
3142 if (F.LocalNumObjCCategoriesInMap != 0) {
3143 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003144 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003145 }
3146
3147 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003148 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003149 break;
3150 }
3151
3152 case OBJC_CATEGORIES:
3153 F.ObjCCategories.swap(Record);
3154 break;
3155
3156 case CXX_BASE_SPECIFIER_OFFSETS: {
3157 if (F.LocalNumCXXBaseSpecifiers != 0) {
3158 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003159 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003160 }
3161
3162 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003163 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003164 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3165 break;
3166 }
3167
3168 case DIAG_PRAGMA_MAPPINGS:
3169 if (F.PragmaDiagMappings.empty())
3170 F.PragmaDiagMappings.swap(Record);
3171 else
3172 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3173 Record.begin(), Record.end());
3174 break;
3175
3176 case CUDA_SPECIAL_DECL_REFS:
3177 // Later tables overwrite earlier ones.
3178 // FIXME: Modules will have trouble with this.
3179 CUDASpecialDeclRefs.clear();
3180 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3181 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3182 break;
3183
3184 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003185 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003186 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003187 if (Record[0]) {
3188 F.HeaderFileInfoTable
3189 = HeaderFileInfoLookupTable::Create(
3190 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3191 (const unsigned char *)F.HeaderFileInfoTableData,
3192 HeaderFileInfoTrait(*this, F,
3193 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003194 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003195
3196 PP.getHeaderSearchInfo().SetExternalSource(this);
3197 if (!PP.getHeaderSearchInfo().getExternalLookup())
3198 PP.getHeaderSearchInfo().SetExternalLookup(this);
3199 }
3200 break;
3201 }
3202
3203 case FP_PRAGMA_OPTIONS:
3204 // Later tables overwrite earlier ones.
3205 FPPragmaOptions.swap(Record);
3206 break;
3207
3208 case OPENCL_EXTENSIONS:
3209 // Later tables overwrite earlier ones.
3210 OpenCLExtensions.swap(Record);
3211 break;
3212
3213 case TENTATIVE_DEFINITIONS:
3214 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3215 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3216 break;
3217
3218 case KNOWN_NAMESPACES:
3219 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3220 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3221 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003222
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003223 case UNDEFINED_BUT_USED:
3224 if (UndefinedButUsed.size() % 2 != 0) {
3225 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003226 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003227 }
3228
3229 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003230 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003231 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003232 }
3233 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003234 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3235 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003236 ReadSourceLocation(F, Record, I).getRawEncoding());
3237 }
3238 break;
3239
Guy Benyei11169dd2012-12-18 14:30:41 +00003240 case IMPORTED_MODULES: {
Richard Smithe842a472014-10-22 02:05:46 +00003241 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003242 // If we aren't loading a module (which has its own exports), make
3243 // all of the imported modules visible.
3244 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003245 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3246 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3247 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3248 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003249 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003250 }
3251 }
3252 break;
3253 }
3254
3255 case LOCAL_REDECLARATIONS: {
3256 F.RedeclarationChains.swap(Record);
3257 break;
3258 }
3259
3260 case LOCAL_REDECLARATIONS_MAP: {
3261 if (F.LocalNumRedeclarationsInMap != 0) {
3262 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003263 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003264 }
3265
3266 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003267 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003268 break;
3269 }
3270
3271 case MERGED_DECLARATIONS: {
3272 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
3273 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
3274 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
3275 for (unsigned N = Record[Idx++]; N > 0; --N)
3276 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
3277 }
3278 break;
3279 }
3280
3281 case MACRO_OFFSET: {
3282 if (F.LocalNumMacros != 0) {
3283 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003284 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003285 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003286 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003287 F.LocalNumMacros = Record[0];
3288 unsigned LocalBaseMacroID = Record[1];
3289 F.BaseMacroID = getTotalNumMacros();
3290
3291 if (F.LocalNumMacros > 0) {
3292 // Introduce the global -> local mapping for macros within this module.
3293 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3294
3295 // Introduce the local -> global mapping for macros within this module.
3296 F.MacroRemap.insertOrReplace(
3297 std::make_pair(LocalBaseMacroID,
3298 F.BaseMacroID - LocalBaseMacroID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003299
3300 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
Guy Benyei11169dd2012-12-18 14:30:41 +00003301 }
3302 break;
3303 }
3304
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00003305 case MACRO_TABLE: {
3306 // FIXME: Not used yet.
Guy Benyei11169dd2012-12-18 14:30:41 +00003307 break;
3308 }
Richard Smithe40f2ba2013-08-07 21:41:30 +00003309
3310 case LATE_PARSED_TEMPLATE: {
3311 LateParsedTemplates.append(Record.begin(), Record.end());
3312 break;
3313 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003314
3315 case OPTIMIZE_PRAGMA_OPTIONS:
3316 if (Record.size() != 1) {
3317 Error("invalid pragma optimize record");
3318 return Failure;
3319 }
3320 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3321 break;
Nico Weber72889432014-09-06 01:25:55 +00003322
3323 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3324 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3325 UnusedLocalTypedefNameCandidates.push_back(
3326 getGlobalDeclID(F, Record[I]));
3327 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003328 }
3329 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003330}
3331
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003332ASTReader::ASTReadResult
3333ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3334 const ModuleFile *ImportedBy,
3335 unsigned ClientLoadCapabilities) {
3336 unsigned Idx = 0;
Richard Smith1d21a072014-12-05 02:33:27 +00003337 F.ModuleMapPath = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003338
Richard Smithe842a472014-10-22 02:05:46 +00003339 if (F.Kind == MK_ExplicitModule) {
3340 // For an explicitly-loaded module, we don't care whether the original
3341 // module map file exists or matches.
3342 return Success;
3343 }
3344
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003345 // Try to resolve ModuleName in the current header search context and
3346 // verify that it is found in the same module map file as we saved. If the
3347 // top-level AST file is a main file, skip this check because there is no
3348 // usable header search context.
3349 assert(!F.ModuleName.empty() &&
Richard Smithe842a472014-10-22 02:05:46 +00003350 "MODULE_NAME should come before MODULE_MAP_FILE");
3351 if (F.Kind == MK_ImplicitModule &&
3352 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3353 // An implicitly-loaded module file should have its module listed in some
3354 // module map file that we've already loaded.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003355 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
Richard Smithe842a472014-10-22 02:05:46 +00003356 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3357 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3358 if (!ModMap) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003359 assert(ImportedBy && "top-level import should be verified");
3360 if ((ClientLoadCapabilities & ARR_Missing) == 0)
Richard Smithe842a472014-10-22 02:05:46 +00003361 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName
3362 << ImportedBy->FileName
3363 << F.ModuleMapPath;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003364 return Missing;
3365 }
3366
Richard Smithe842a472014-10-22 02:05:46 +00003367 assert(M->Name == F.ModuleName && "found module with different name");
3368
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003369 // Check the primary module map file.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003370 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003371 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3372 assert(ModMap && "found module is missing module map file");
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003373 assert(ImportedBy && "top-level import should be verified");
3374 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3375 Diag(diag::err_imported_module_modmap_changed)
3376 << F.ModuleName << ImportedBy->FileName
3377 << ModMap->getName() << F.ModuleMapPath;
3378 return OutOfDate;
3379 }
3380
3381 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3382 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3383 // FIXME: we should use input files rather than storing names.
Richard Smith1d21a072014-12-05 02:33:27 +00003384 std::string Filename = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003385 const FileEntry *F =
3386 FileMgr.getFile(Filename, false, false);
3387 if (F == nullptr) {
3388 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3389 Error("could not find file '" + Filename +"' referenced by AST file");
3390 return OutOfDate;
3391 }
3392 AdditionalStoredMaps.insert(F);
3393 }
3394
3395 // Check any additional module map files (e.g. module.private.modulemap)
3396 // that are not in the pcm.
3397 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3398 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3399 // Remove files that match
3400 // Note: SmallPtrSet::erase is really remove
3401 if (!AdditionalStoredMaps.erase(ModMap)) {
3402 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3403 Diag(diag::err_module_different_modmap)
3404 << F.ModuleName << /*new*/0 << ModMap->getName();
3405 return OutOfDate;
3406 }
3407 }
3408 }
3409
3410 // Check any additional module map files that are in the pcm, but not
3411 // found in header search. Cases that match are already removed.
3412 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3413 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3414 Diag(diag::err_module_different_modmap)
3415 << F.ModuleName << /*not new*/1 << ModMap->getName();
3416 return OutOfDate;
3417 }
3418 }
3419
3420 if (Listener)
3421 Listener->ReadModuleMapFile(F.ModuleMapPath);
3422 return Success;
3423}
3424
3425
Douglas Gregorc1489562013-02-12 23:36:21 +00003426/// \brief Move the given method to the back of the global list of methods.
3427static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3428 // Find the entry for this selector in the method pool.
3429 Sema::GlobalMethodPool::iterator Known
3430 = S.MethodPool.find(Method->getSelector());
3431 if (Known == S.MethodPool.end())
3432 return;
3433
3434 // Retrieve the appropriate method list.
3435 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3436 : Known->second.second;
3437 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003438 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003439 if (!Found) {
3440 if (List->Method == Method) {
3441 Found = true;
3442 } else {
3443 // Keep searching.
3444 continue;
3445 }
3446 }
3447
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003448 if (List->getNext())
3449 List->Method = List->getNext()->Method;
Douglas Gregorc1489562013-02-12 23:36:21 +00003450 else
3451 List->Method = Method;
3452 }
3453}
3454
Richard Smithe657bbd2014-07-18 22:13:40 +00003455void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3456 bool FromFinalization) {
3457 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
Richard Smith57721ac2014-07-21 04:10:40 +00003458 for (Decl *D : Names.HiddenDecls) {
Richard Smith49f906a2014-03-01 00:08:04 +00003459 bool wasHidden = D->Hidden;
3460 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003461
Richard Smith49f906a2014-03-01 00:08:04 +00003462 if (wasHidden && SemaObj) {
3463 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3464 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003465 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003466 }
3467 }
Richard Smith49f906a2014-03-01 00:08:04 +00003468
Richard Smithe657bbd2014-07-18 22:13:40 +00003469 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3470 "nothing to make visible?");
Richard Smithdaa69e02014-07-25 04:40:03 +00003471 for (const auto &Macro : Names.HiddenMacros) {
3472 if (FromFinalization)
3473 PP.appendMacroDirective(Macro.first,
3474 Macro.second->import(PP, SourceLocation()));
3475 else
3476 installImportedMacro(Macro.first, Macro.second, Owner);
3477 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003478}
3479
Richard Smith49f906a2014-03-01 00:08:04 +00003480void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003481 Module::NameVisibilityKind NameVisibility,
Douglas Gregorfb912652013-03-20 21:10:35 +00003482 SourceLocation ImportLoc,
3483 bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003484 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003485 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003486 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003487 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003488 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003489
3490 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003491 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003492 // there is nothing more to do.
3493 continue;
3494 }
Richard Smith49f906a2014-03-01 00:08:04 +00003495
Guy Benyei11169dd2012-12-18 14:30:41 +00003496 if (!Mod->isAvailable()) {
3497 // Modules that aren't available cannot be made visible.
3498 continue;
3499 }
3500
3501 // Update the module's name visibility.
Richard Smith49f906a2014-03-01 00:08:04 +00003502 if (NameVisibility >= Module::MacrosVisible &&
3503 Mod->NameVisibility < Module::MacrosVisible)
3504 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003505 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003506
Guy Benyei11169dd2012-12-18 14:30:41 +00003507 // If we've already deserialized any names from this module,
3508 // mark them as visible.
3509 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3510 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003511 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003512 HiddenNamesMap.erase(Hidden);
Richard Smith57721ac2014-07-21 04:10:40 +00003513 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3514 /*FromFinalization*/false);
3515 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3516 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003517 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003518
Guy Benyei11169dd2012-12-18 14:30:41 +00003519 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003520 SmallVector<Module *, 16> Exports;
3521 Mod->getExportedModules(Exports);
3522 for (SmallVectorImpl<Module *>::iterator
3523 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3524 Module *Exported = *I;
David Blaikie82e95a32014-11-19 07:49:47 +00003525 if (Visited.insert(Exported).second)
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003526 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003527 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003528
3529 // Detect any conflicts.
3530 if (Complain) {
3531 assert(ImportLoc.isValid() && "Missing import location");
3532 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3533 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3534 Diag(ImportLoc, diag::warn_module_conflict)
3535 << Mod->getFullModuleName()
3536 << Mod->Conflicts[I].Other->getFullModuleName()
3537 << Mod->Conflicts[I].Message;
3538 // FIXME: Need note where the other module was imported.
3539 }
3540 }
3541 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003542 }
3543}
3544
Douglas Gregore060e572013-01-25 01:03:03 +00003545bool ASTReader::loadGlobalIndex() {
3546 if (GlobalIndex)
3547 return false;
3548
3549 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3550 !Context.getLangOpts().Modules)
3551 return true;
3552
3553 // Try to load the global index.
3554 TriedLoadingGlobalIndex = true;
3555 StringRef ModuleCachePath
3556 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3557 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003558 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003559 if (!Result.first)
3560 return true;
3561
3562 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003563 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003564 return false;
3565}
3566
3567bool ASTReader::isGlobalIndexUnavailable() const {
3568 return Context.getLangOpts().Modules && UseGlobalIndex &&
3569 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3570}
3571
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003572static void updateModuleTimestamp(ModuleFile &MF) {
3573 // Overwrite the timestamp file contents so that file's mtime changes.
3574 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00003575 std::error_code EC;
3576 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3577 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003578 return;
3579 OS << "Timestamp file\n";
3580}
3581
Guy Benyei11169dd2012-12-18 14:30:41 +00003582ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3583 ModuleKind Type,
3584 SourceLocation ImportLoc,
3585 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003586 llvm::SaveAndRestore<SourceLocation>
3587 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3588
Richard Smithd1c46742014-04-30 02:24:17 +00003589 // Defer any pending actions until we get to the end of reading the AST file.
3590 Deserializing AnASTFile(this);
3591
Guy Benyei11169dd2012-12-18 14:30:41 +00003592 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003593 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003594
3595 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003596 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003597 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003598 /*ImportedBy=*/nullptr, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00003599 0, 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003600 ClientLoadCapabilities)) {
3601 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003602 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003603 case OutOfDate:
3604 case VersionMismatch:
3605 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003606 case HadErrors: {
3607 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3608 for (const ImportedModule &IM : Loaded)
3609 LoadedSet.insert(IM.Mod);
3610
Douglas Gregor7029ce12013-03-19 00:28:20 +00003611 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003612 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003613 Context.getLangOpts().Modules
3614 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003615 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003616
3617 // If we find that any modules are unusable, the global index is going
3618 // to be out-of-date. Just remove it.
3619 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003620 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003621 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003622 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003623 case Success:
3624 break;
3625 }
3626
3627 // Here comes stuff that we only do once the entire chain is loaded.
3628
3629 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003630 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3631 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003632 M != MEnd; ++M) {
3633 ModuleFile &F = *M->Mod;
3634
3635 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003636 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3637 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003638
3639 // Once read, set the ModuleFile bit base offset and update the size in
3640 // bits of all files we've seen.
3641 F.GlobalBitOffset = TotalModulesSizeInBits;
3642 TotalModulesSizeInBits += F.SizeInBits;
3643 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3644
3645 // Preload SLocEntries.
3646 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3647 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3648 // Load it through the SourceManager and don't call ReadSLocEntry()
3649 // directly because the entry may have already been loaded in which case
3650 // calling ReadSLocEntry() directly would trigger an assertion in
3651 // SourceManager.
3652 SourceMgr.getLoadedSLocEntryByID(Index);
3653 }
3654 }
3655
Douglas Gregor603cd862013-03-22 18:50:14 +00003656 // Setup the import locations and notify the module manager that we've
3657 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003658 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3659 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003660 M != MEnd; ++M) {
3661 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003662
3663 ModuleMgr.moduleFileAccepted(&F);
3664
3665 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003666 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003667 if (!M->ImportedBy)
3668 F.ImportLoc = M->ImportLoc;
3669 else
3670 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3671 M->ImportLoc.getRawEncoding());
3672 }
3673
3674 // Mark all of the identifiers in the identifier table as being out of date,
3675 // so that various accessors know to check the loaded modules when the
3676 // identifier is used.
3677 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3678 IdEnd = PP.getIdentifierTable().end();
3679 Id != IdEnd; ++Id)
3680 Id->second->setOutOfDate(true);
3681
3682 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003683 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3684 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003685 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3686 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003687
3688 switch (Unresolved.Kind) {
3689 case UnresolvedModuleRef::Conflict:
3690 if (ResolvedMod) {
3691 Module::Conflict Conflict;
3692 Conflict.Other = ResolvedMod;
3693 Conflict.Message = Unresolved.String.str();
3694 Unresolved.Mod->Conflicts.push_back(Conflict);
3695 }
3696 continue;
3697
3698 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003699 if (ResolvedMod)
3700 Unresolved.Mod->Imports.push_back(ResolvedMod);
3701 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003702
Douglas Gregorfb912652013-03-20 21:10:35 +00003703 case UnresolvedModuleRef::Export:
3704 if (ResolvedMod || Unresolved.IsWildcard)
3705 Unresolved.Mod->Exports.push_back(
3706 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3707 continue;
3708 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003709 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003710 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003711
3712 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3713 // Might be unnecessary as use declarations are only used to build the
3714 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003715
3716 InitializeContext();
3717
Richard Smith3d8e97e2013-10-18 06:54:39 +00003718 if (SemaObj)
3719 UpdateSema();
3720
Guy Benyei11169dd2012-12-18 14:30:41 +00003721 if (DeserializationListener)
3722 DeserializationListener->ReaderInitialized(this);
3723
3724 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3725 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3726 PrimaryModule.OriginalSourceFileID
3727 = FileID::get(PrimaryModule.SLocEntryBaseID
3728 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3729
3730 // If this AST file is a precompiled preamble, then set the
3731 // preamble file ID of the source manager to the file source file
3732 // from which the preamble was built.
3733 if (Type == MK_Preamble) {
3734 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3735 } else if (Type == MK_MainFile) {
3736 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3737 }
3738 }
3739
3740 // For any Objective-C class definitions we have already loaded, make sure
3741 // that we load any additional categories.
3742 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3743 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3744 ObjCClassesLoaded[I],
3745 PreviousGeneration);
3746 }
Douglas Gregore060e572013-01-25 01:03:03 +00003747
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003748 if (PP.getHeaderSearchInfo()
3749 .getHeaderSearchOpts()
3750 .ModulesValidateOncePerBuildSession) {
3751 // Now we are certain that the module and all modules it depends on are
3752 // up to date. Create or update timestamp files for modules that are
3753 // located in the module cache (not for PCH files that could be anywhere
3754 // in the filesystem).
3755 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3756 ImportedModule &M = Loaded[I];
Richard Smithe842a472014-10-22 02:05:46 +00003757 if (M.Mod->Kind == MK_ImplicitModule) {
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003758 updateModuleTimestamp(*M.Mod);
3759 }
3760 }
3761 }
3762
Guy Benyei11169dd2012-12-18 14:30:41 +00003763 return Success;
3764}
3765
Ben Langmuir487ea142014-10-23 18:05:36 +00003766static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile);
3767
Guy Benyei11169dd2012-12-18 14:30:41 +00003768ASTReader::ASTReadResult
3769ASTReader::ReadASTCore(StringRef FileName,
3770 ModuleKind Type,
3771 SourceLocation ImportLoc,
3772 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003773 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003774 off_t ExpectedSize, time_t ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003775 ASTFileSignature ExpectedSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00003776 unsigned ClientLoadCapabilities) {
3777 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003778 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003779 ModuleManager::AddModuleResult AddResult
3780 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003781 getGeneration(), ExpectedSize, ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003782 ExpectedSignature, readASTFileSignature,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003783 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003784
Douglas Gregor7029ce12013-03-19 00:28:20 +00003785 switch (AddResult) {
3786 case ModuleManager::AlreadyLoaded:
3787 return Success;
3788
3789 case ModuleManager::NewlyLoaded:
3790 // Load module file below.
3791 break;
3792
3793 case ModuleManager::Missing:
Richard Smithe842a472014-10-22 02:05:46 +00003794 // The module file was missing; if the client can handle that, return
Douglas Gregor7029ce12013-03-19 00:28:20 +00003795 // it.
3796 if (ClientLoadCapabilities & ARR_Missing)
3797 return Missing;
3798
3799 // Otherwise, return an error.
3800 {
3801 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3802 + ErrorStr;
3803 Error(Msg);
3804 }
3805 return Failure;
3806
3807 case ModuleManager::OutOfDate:
3808 // We couldn't load the module file because it is out-of-date. If the
3809 // client can handle out-of-date, return it.
3810 if (ClientLoadCapabilities & ARR_OutOfDate)
3811 return OutOfDate;
3812
3813 // Otherwise, return an error.
3814 {
3815 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3816 + ErrorStr;
3817 Error(Msg);
3818 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003819 return Failure;
3820 }
3821
Douglas Gregor7029ce12013-03-19 00:28:20 +00003822 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003823
3824 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3825 // module?
3826 if (FileName != "-") {
3827 CurrentDir = llvm::sys::path::parent_path(FileName);
3828 if (CurrentDir.empty()) CurrentDir = ".";
3829 }
3830
3831 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003832 BitstreamCursor &Stream = F.Stream;
Rafael Espindolafd832392014-11-12 14:48:44 +00003833 Stream.init(&F.StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00003834 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3835
3836 // Sniff for the signature.
3837 if (Stream.Read(8) != 'C' ||
3838 Stream.Read(8) != 'P' ||
3839 Stream.Read(8) != 'C' ||
3840 Stream.Read(8) != 'H') {
3841 Diag(diag::err_not_a_pch_file) << FileName;
3842 return Failure;
3843 }
3844
3845 // This is used for compatibility with older PCH formats.
3846 bool HaveReadControlBlock = false;
3847
Chris Lattnerefa77172013-01-20 00:00:22 +00003848 while (1) {
3849 llvm::BitstreamEntry Entry = Stream.advance();
3850
3851 switch (Entry.Kind) {
3852 case llvm::BitstreamEntry::Error:
3853 case llvm::BitstreamEntry::EndBlock:
3854 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003855 Error("invalid record at top-level of AST file");
3856 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003857
3858 case llvm::BitstreamEntry::SubBlock:
3859 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003860 }
3861
Guy Benyei11169dd2012-12-18 14:30:41 +00003862 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003863 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003864 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3865 if (Stream.ReadBlockInfoBlock()) {
3866 Error("malformed BlockInfoBlock in AST file");
3867 return Failure;
3868 }
3869 break;
3870 case CONTROL_BLOCK_ID:
3871 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003872 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003873 case Success:
3874 break;
3875
3876 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003877 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003878 case OutOfDate: return OutOfDate;
3879 case VersionMismatch: return VersionMismatch;
3880 case ConfigurationMismatch: return ConfigurationMismatch;
3881 case HadErrors: return HadErrors;
3882 }
3883 break;
3884 case AST_BLOCK_ID:
3885 if (!HaveReadControlBlock) {
3886 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003887 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003888 return VersionMismatch;
3889 }
3890
3891 // Record that we've loaded this module.
3892 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3893 return Success;
3894
3895 default:
3896 if (Stream.SkipBlock()) {
3897 Error("malformed block record in AST file");
3898 return Failure;
3899 }
3900 break;
3901 }
3902 }
3903
3904 return Success;
3905}
3906
3907void ASTReader::InitializeContext() {
3908 // If there's a listener, notify them that we "read" the translation unit.
3909 if (DeserializationListener)
3910 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3911 Context.getTranslationUnitDecl());
3912
Guy Benyei11169dd2012-12-18 14:30:41 +00003913 // FIXME: Find a better way to deal with collisions between these
3914 // built-in types. Right now, we just ignore the problem.
3915
3916 // Load the special types.
3917 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3918 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3919 if (!Context.CFConstantStringTypeDecl)
3920 Context.setCFConstantStringType(GetType(String));
3921 }
3922
3923 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3924 QualType FileType = GetType(File);
3925 if (FileType.isNull()) {
3926 Error("FILE type is NULL");
3927 return;
3928 }
3929
3930 if (!Context.FILEDecl) {
3931 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3932 Context.setFILEDecl(Typedef->getDecl());
3933 else {
3934 const TagType *Tag = FileType->getAs<TagType>();
3935 if (!Tag) {
3936 Error("Invalid FILE type in AST file");
3937 return;
3938 }
3939 Context.setFILEDecl(Tag->getDecl());
3940 }
3941 }
3942 }
3943
3944 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3945 QualType Jmp_bufType = GetType(Jmp_buf);
3946 if (Jmp_bufType.isNull()) {
3947 Error("jmp_buf type is NULL");
3948 return;
3949 }
3950
3951 if (!Context.jmp_bufDecl) {
3952 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3953 Context.setjmp_bufDecl(Typedef->getDecl());
3954 else {
3955 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3956 if (!Tag) {
3957 Error("Invalid jmp_buf type in AST file");
3958 return;
3959 }
3960 Context.setjmp_bufDecl(Tag->getDecl());
3961 }
3962 }
3963 }
3964
3965 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3966 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3967 if (Sigjmp_bufType.isNull()) {
3968 Error("sigjmp_buf type is NULL");
3969 return;
3970 }
3971
3972 if (!Context.sigjmp_bufDecl) {
3973 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3974 Context.setsigjmp_bufDecl(Typedef->getDecl());
3975 else {
3976 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3977 assert(Tag && "Invalid sigjmp_buf type in AST file");
3978 Context.setsigjmp_bufDecl(Tag->getDecl());
3979 }
3980 }
3981 }
3982
3983 if (unsigned ObjCIdRedef
3984 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3985 if (Context.ObjCIdRedefinitionType.isNull())
3986 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3987 }
3988
3989 if (unsigned ObjCClassRedef
3990 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3991 if (Context.ObjCClassRedefinitionType.isNull())
3992 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3993 }
3994
3995 if (unsigned ObjCSelRedef
3996 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3997 if (Context.ObjCSelRedefinitionType.isNull())
3998 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3999 }
4000
4001 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4002 QualType Ucontext_tType = GetType(Ucontext_t);
4003 if (Ucontext_tType.isNull()) {
4004 Error("ucontext_t type is NULL");
4005 return;
4006 }
4007
4008 if (!Context.ucontext_tDecl) {
4009 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4010 Context.setucontext_tDecl(Typedef->getDecl());
4011 else {
4012 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4013 assert(Tag && "Invalid ucontext_t type in AST file");
4014 Context.setucontext_tDecl(Tag->getDecl());
4015 }
4016 }
4017 }
4018 }
4019
4020 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4021
4022 // If there were any CUDA special declarations, deserialize them.
4023 if (!CUDASpecialDeclRefs.empty()) {
4024 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4025 Context.setcudaConfigureCallDecl(
4026 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4027 }
Richard Smith56be7542014-03-21 00:33:59 +00004028
Guy Benyei11169dd2012-12-18 14:30:41 +00004029 // Re-export any modules that were imported by a non-module AST file.
Richard Smith56be7542014-03-21 00:33:59 +00004030 // FIXME: This does not make macro-only imports visible again. It also doesn't
4031 // make #includes mapped to module imports visible.
4032 for (auto &Import : ImportedModules) {
4033 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00004034 makeModuleVisible(Imported, Module::AllVisible,
Richard Smith56be7542014-03-21 00:33:59 +00004035 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregorfb912652013-03-20 21:10:35 +00004036 /*Complain=*/false);
Guy Benyei11169dd2012-12-18 14:30:41 +00004037 }
4038 ImportedModules.clear();
4039}
4040
4041void ASTReader::finalizeForWriting() {
Richard Smith57721ac2014-07-21 04:10:40 +00004042 while (!HiddenNamesMap.empty()) {
4043 auto HiddenNames = std::move(*HiddenNamesMap.begin());
4044 HiddenNamesMap.erase(HiddenNamesMap.begin());
4045 makeNamesVisible(HiddenNames.second, HiddenNames.first,
4046 /*FromFinalization*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00004047 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004048}
4049
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004050/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
4051/// cursor into the start of the given block ID, returning false on success and
4052/// true on failure.
4053static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004054 while (1) {
4055 llvm::BitstreamEntry Entry = Cursor.advance();
4056 switch (Entry.Kind) {
4057 case llvm::BitstreamEntry::Error:
4058 case llvm::BitstreamEntry::EndBlock:
4059 return true;
4060
4061 case llvm::BitstreamEntry::Record:
4062 // Ignore top-level records.
4063 Cursor.skipRecord(Entry.ID);
4064 break;
4065
4066 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004067 if (Entry.ID == BlockID) {
4068 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004069 return true;
4070 // Found it!
4071 return false;
4072 }
4073
4074 if (Cursor.SkipBlock())
4075 return true;
4076 }
4077 }
4078}
4079
Ben Langmuir487ea142014-10-23 18:05:36 +00004080static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){
4081 BitstreamCursor Stream(StreamFile);
4082 if (Stream.Read(8) != 'C' ||
4083 Stream.Read(8) != 'P' ||
4084 Stream.Read(8) != 'C' ||
4085 Stream.Read(8) != 'H') {
4086 return 0;
4087 }
4088
4089 // Scan for the CONTROL_BLOCK_ID block.
4090 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4091 return 0;
4092
4093 // Scan for SIGNATURE inside the control block.
4094 ASTReader::RecordData Record;
4095 while (1) {
4096 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4097 if (Entry.Kind == llvm::BitstreamEntry::EndBlock ||
4098 Entry.Kind != llvm::BitstreamEntry::Record)
4099 return 0;
4100
4101 Record.clear();
4102 StringRef Blob;
4103 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4104 return Record[0];
4105 }
4106}
4107
Guy Benyei11169dd2012-12-18 14:30:41 +00004108/// \brief Retrieve the name of the original source file name
4109/// directly from the AST file, without actually loading the AST
4110/// file.
4111std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4112 FileManager &FileMgr,
4113 DiagnosticsEngine &Diags) {
4114 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004115 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00004116 if (!Buffer) {
Benjamin Kramera8857962014-10-26 22:44:13 +00004117 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4118 << ASTFileName << Buffer.getError().message();
Guy Benyei11169dd2012-12-18 14:30:41 +00004119 return std::string();
4120 }
4121
4122 // Initialize the stream
4123 llvm::BitstreamReader StreamFile;
Benjamin Kramera8857962014-10-26 22:44:13 +00004124 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4125 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004126 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004127
4128 // Sniff for the signature.
4129 if (Stream.Read(8) != 'C' ||
4130 Stream.Read(8) != 'P' ||
4131 Stream.Read(8) != 'C' ||
4132 Stream.Read(8) != 'H') {
4133 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4134 return std::string();
4135 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004136
Chris Lattnere7b154b2013-01-19 21:39:22 +00004137 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004138 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004139 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4140 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004141 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004142
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004143 // Scan for ORIGINAL_FILE inside the control block.
4144 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00004145 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004146 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004147 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4148 return std::string();
4149
4150 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4151 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4152 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00004153 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00004154
Guy Benyei11169dd2012-12-18 14:30:41 +00004155 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004156 StringRef Blob;
4157 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4158 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00004159 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004160}
4161
4162namespace {
4163 class SimplePCHValidator : public ASTReaderListener {
4164 const LangOptions &ExistingLangOpts;
4165 const TargetOptions &ExistingTargetOpts;
4166 const PreprocessorOptions &ExistingPPOpts;
4167 FileManager &FileMgr;
4168
4169 public:
4170 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4171 const TargetOptions &ExistingTargetOpts,
4172 const PreprocessorOptions &ExistingPPOpts,
4173 FileManager &FileMgr)
4174 : ExistingLangOpts(ExistingLangOpts),
4175 ExistingTargetOpts(ExistingTargetOpts),
4176 ExistingPPOpts(ExistingPPOpts),
4177 FileMgr(FileMgr)
4178 {
4179 }
4180
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004181 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4182 bool AllowCompatibleDifferences) override {
4183 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4184 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004185 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004186 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4187 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004188 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004189 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004190 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4191 bool Complain,
4192 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004193 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004194 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00004195 }
4196 };
4197}
4198
4199bool ASTReader::readASTFileControlBlock(StringRef Filename,
4200 FileManager &FileMgr,
4201 ASTReaderListener &Listener) {
4202 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004203 auto Buffer = FileMgr.getBufferForFile(Filename);
Guy Benyei11169dd2012-12-18 14:30:41 +00004204 if (!Buffer) {
4205 return true;
4206 }
4207
4208 // Initialize the stream
4209 llvm::BitstreamReader StreamFile;
Benjamin Kramera8857962014-10-26 22:44:13 +00004210 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4211 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004212 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004213
4214 // Sniff for the signature.
4215 if (Stream.Read(8) != 'C' ||
4216 Stream.Read(8) != 'P' ||
4217 Stream.Read(8) != 'C' ||
4218 Stream.Read(8) != 'H') {
4219 return true;
4220 }
4221
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004222 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004223 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004224 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004225
4226 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00004227 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Richard Smithd4b230b2014-10-27 23:01:16 +00004228 bool NeedsImports = Listener.needsImportVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004229 BitstreamCursor InputFilesCursor;
4230 if (NeedsInputFiles) {
4231 InputFilesCursor = Stream;
4232 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4233 return true;
4234
4235 // Read the abbreviations
4236 while (true) {
4237 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4238 unsigned Code = InputFilesCursor.ReadCode();
4239
4240 // We expect all abbrevs to be at the start of the block.
4241 if (Code != llvm::bitc::DEFINE_ABBREV) {
4242 InputFilesCursor.JumpToBit(Offset);
4243 break;
4244 }
4245 InputFilesCursor.ReadAbbrevRecord();
4246 }
4247 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004248
4249 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00004250 RecordData Record;
Richard Smith1d21a072014-12-05 02:33:27 +00004251 std::string ModuleDir;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004252 while (1) {
4253 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4254 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4255 return false;
4256
4257 if (Entry.Kind != llvm::BitstreamEntry::Record)
4258 return true;
4259
Guy Benyei11169dd2012-12-18 14:30:41 +00004260 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004261 StringRef Blob;
4262 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004263 switch ((ControlRecordTypes)RecCode) {
4264 case METADATA: {
4265 if (Record[0] != VERSION_MAJOR)
4266 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004267
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004268 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004269 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004270
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004271 break;
4272 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004273 case MODULE_NAME:
4274 Listener.ReadModuleName(Blob);
4275 break;
Richard Smith1d21a072014-12-05 02:33:27 +00004276 case MODULE_DIRECTORY:
4277 ModuleDir = Blob;
4278 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004279 case MODULE_MAP_FILE: {
4280 unsigned Idx = 0;
Richard Smith1d21a072014-12-05 02:33:27 +00004281 auto Path = ReadString(Record, Idx);
4282 ResolveImportedPath(Path, ModuleDir);
4283 Listener.ReadModuleMapFile(Path);
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004284 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004285 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004286 case LANGUAGE_OPTIONS:
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004287 if (ParseLanguageOptions(Record, false, Listener,
4288 /*AllowCompatibleConfigurationMismatch*/false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004289 return true;
4290 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004291
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004292 case TARGET_OPTIONS:
4293 if (ParseTargetOptions(Record, false, Listener))
4294 return true;
4295 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004296
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004297 case DIAGNOSTIC_OPTIONS:
4298 if (ParseDiagnosticOptions(Record, false, Listener))
4299 return true;
4300 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004301
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004302 case FILE_SYSTEM_OPTIONS:
4303 if (ParseFileSystemOptions(Record, false, Listener))
4304 return true;
4305 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004306
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004307 case HEADER_SEARCH_OPTIONS:
4308 if (ParseHeaderSearchOptions(Record, false, Listener))
4309 return true;
4310 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004311
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004312 case PREPROCESSOR_OPTIONS: {
4313 std::string IgnoredSuggestedPredefines;
4314 if (ParsePreprocessorOptions(Record, false, Listener,
4315 IgnoredSuggestedPredefines))
4316 return true;
4317 break;
4318 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004319
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004320 case INPUT_FILE_OFFSETS: {
4321 if (!NeedsInputFiles)
4322 break;
4323
4324 unsigned NumInputFiles = Record[0];
4325 unsigned NumUserFiles = Record[1];
4326 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data();
4327 for (unsigned I = 0; I != NumInputFiles; ++I) {
4328 // Go find this input file.
4329 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004330
4331 if (isSystemFile && !NeedsSystemInputFiles)
4332 break; // the rest are system input files
4333
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004334 BitstreamCursor &Cursor = InputFilesCursor;
4335 SavedStreamPosition SavedPosition(Cursor);
4336 Cursor.JumpToBit(InputFileOffs[I]);
4337
4338 unsigned Code = Cursor.ReadCode();
4339 RecordData Record;
4340 StringRef Blob;
4341 bool shouldContinue = false;
4342 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4343 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004344 bool Overridden = static_cast<bool>(Record[3]);
Richard Smith1d21a072014-12-05 02:33:27 +00004345 std::string Filename = Blob;
4346 ResolveImportedPath(Filename, ModuleDir);
4347 shouldContinue =
4348 Listener.visitInputFile(Filename, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004349 break;
4350 }
4351 if (!shouldContinue)
4352 break;
4353 }
4354 break;
4355 }
4356
Richard Smithd4b230b2014-10-27 23:01:16 +00004357 case IMPORTS: {
4358 if (!NeedsImports)
4359 break;
4360
4361 unsigned Idx = 0, N = Record.size();
4362 while (Idx < N) {
4363 // Read information about the AST file.
Richard Smith79c98cc2014-10-27 23:25:15 +00004364 Idx += 5; // ImportLoc, Size, ModTime, Signature
Richard Smith1d21a072014-12-05 02:33:27 +00004365 std::string Filename = ReadString(Record, Idx);
4366 ResolveImportedPath(Filename, ModuleDir);
4367 Listener.visitImport(Filename);
Richard Smithd4b230b2014-10-27 23:01:16 +00004368 }
4369 break;
4370 }
4371
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004372 default:
4373 // No other validation to perform.
4374 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004375 }
4376 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004377}
4378
4379
4380bool ASTReader::isAcceptableASTFile(StringRef Filename,
4381 FileManager &FileMgr,
4382 const LangOptions &LangOpts,
4383 const TargetOptions &TargetOpts,
4384 const PreprocessorOptions &PPOpts) {
4385 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
4386 return !readASTFileControlBlock(Filename, FileMgr, validator);
4387}
4388
Ben Langmuir2c9af442014-04-10 17:57:43 +00004389ASTReader::ASTReadResult
4390ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004391 // Enter the submodule block.
4392 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4393 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004394 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004395 }
4396
4397 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4398 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004399 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004400 RecordData Record;
4401 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004402 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4403
4404 switch (Entry.Kind) {
4405 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4406 case llvm::BitstreamEntry::Error:
4407 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004408 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004409 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004410 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004411 case llvm::BitstreamEntry::Record:
4412 // The interesting case.
4413 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004414 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004415
Guy Benyei11169dd2012-12-18 14:30:41 +00004416 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004417 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004418 Record.clear();
Richard Smith03478d92014-10-23 22:12:14 +00004419 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4420
4421 if ((Kind == SUBMODULE_METADATA) != First) {
4422 Error("submodule metadata record should be at beginning of block");
4423 return Failure;
4424 }
4425 First = false;
4426
4427 // Submodule information is only valid if we have a current module.
4428 // FIXME: Should we error on these cases?
4429 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4430 Kind != SUBMODULE_DEFINITION)
4431 continue;
4432
4433 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004434 default: // Default behavior: ignore.
4435 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004436
Richard Smith03478d92014-10-23 22:12:14 +00004437 case SUBMODULE_DEFINITION: {
Douglas Gregor8d932422013-03-20 03:59:18 +00004438 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004439 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004440 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004441 }
Richard Smith03478d92014-10-23 22:12:14 +00004442
Chris Lattner0e6c9402013-01-20 02:38:54 +00004443 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004444 unsigned Idx = 0;
4445 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4446 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4447 bool IsFramework = Record[Idx++];
4448 bool IsExplicit = Record[Idx++];
4449 bool IsSystem = Record[Idx++];
4450 bool IsExternC = Record[Idx++];
4451 bool InferSubmodules = Record[Idx++];
4452 bool InferExplicitSubmodules = Record[Idx++];
4453 bool InferExportWildcard = Record[Idx++];
4454 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004455
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004456 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004457 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004458 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004459
Guy Benyei11169dd2012-12-18 14:30:41 +00004460 // Retrieve this (sub)module from the module map, creating it if
4461 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004462 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004463 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004464
4465 // FIXME: set the definition loc for CurrentModule, or call
4466 // ModMap.setInferredModuleAllowedBy()
4467
Guy Benyei11169dd2012-12-18 14:30:41 +00004468 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4469 if (GlobalIndex >= SubmodulesLoaded.size() ||
4470 SubmodulesLoaded[GlobalIndex]) {
4471 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004472 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004473 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004474
Douglas Gregor7029ce12013-03-19 00:28:20 +00004475 if (!ParentModule) {
4476 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4477 if (CurFile != F.File) {
4478 if (!Diags.isDiagnosticInFlight()) {
4479 Diag(diag::err_module_file_conflict)
4480 << CurrentModule->getTopLevelModuleName()
4481 << CurFile->getName()
4482 << F.File->getName();
4483 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004484 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004485 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004486 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004487
4488 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004489 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004490
Guy Benyei11169dd2012-12-18 14:30:41 +00004491 CurrentModule->IsFromModuleFile = true;
4492 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004493 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004494 CurrentModule->InferSubmodules = InferSubmodules;
4495 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4496 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004497 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004498 if (DeserializationListener)
4499 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4500
4501 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004502
Douglas Gregorfb912652013-03-20 21:10:35 +00004503 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004504 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004505 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004506 CurrentModule->UnresolvedConflicts.clear();
4507 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004508 break;
4509 }
4510
4511 case SUBMODULE_UMBRELLA_HEADER: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004512 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004513 if (!CurrentModule->getUmbrellaHeader())
4514 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4515 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004516 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4517 Error("mismatched umbrella headers in submodule");
4518 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004519 }
4520 }
4521 break;
4522 }
4523
Richard Smith202210b2014-10-24 20:23:01 +00004524 case SUBMODULE_HEADER:
4525 case SUBMODULE_EXCLUDED_HEADER:
4526 case SUBMODULE_PRIVATE_HEADER:
4527 // We lazily associate headers with their modules via the HeaderInfo table.
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004528 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4529 // of complete filenames or remove it entirely.
Richard Smith202210b2014-10-24 20:23:01 +00004530 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004531
Richard Smith202210b2014-10-24 20:23:01 +00004532 case SUBMODULE_TEXTUAL_HEADER:
4533 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4534 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4535 // them here.
4536 break;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004537
Guy Benyei11169dd2012-12-18 14:30:41 +00004538 case SUBMODULE_TOPHEADER: {
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004539 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004540 break;
4541 }
4542
4543 case SUBMODULE_UMBRELLA_DIR: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004544 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004545 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004546 if (!CurrentModule->getUmbrellaDir())
4547 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4548 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004549 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4550 Error("mismatched umbrella directories in submodule");
4551 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004552 }
4553 }
4554 break;
4555 }
4556
4557 case SUBMODULE_METADATA: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004558 F.BaseSubmoduleID = getTotalNumSubmodules();
4559 F.LocalNumSubmodules = Record[0];
4560 unsigned LocalBaseSubmoduleID = Record[1];
4561 if (F.LocalNumSubmodules > 0) {
4562 // Introduce the global -> local mapping for submodules within this
4563 // module.
4564 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4565
4566 // Introduce the local -> global mapping for submodules within this
4567 // module.
4568 F.SubmoduleRemap.insertOrReplace(
4569 std::make_pair(LocalBaseSubmoduleID,
4570 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00004571
Ben Langmuir52ca6782014-10-20 16:27:32 +00004572 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4573 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004574 break;
4575 }
4576
4577 case SUBMODULE_IMPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004578 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004579 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004580 Unresolved.File = &F;
4581 Unresolved.Mod = CurrentModule;
4582 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004583 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004584 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004585 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004586 }
4587 break;
4588 }
4589
4590 case SUBMODULE_EXPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004591 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004592 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004593 Unresolved.File = &F;
4594 Unresolved.Mod = CurrentModule;
4595 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004596 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004597 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004598 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004599 }
4600
4601 // Once we've loaded the set of exports, there's no reason to keep
4602 // the parsed, unresolved exports around.
4603 CurrentModule->UnresolvedExports.clear();
4604 break;
4605 }
4606 case SUBMODULE_REQUIRES: {
Richard Smitha3feee22013-10-28 22:18:19 +00004607 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004608 Context.getTargetInfo());
4609 break;
4610 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004611
4612 case SUBMODULE_LINK_LIBRARY:
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004613 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004614 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004615 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004616
4617 case SUBMODULE_CONFIG_MACRO:
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004618 CurrentModule->ConfigMacros.push_back(Blob.str());
4619 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004620
4621 case SUBMODULE_CONFLICT: {
Douglas Gregorfb912652013-03-20 21:10:35 +00004622 UnresolvedModuleRef Unresolved;
4623 Unresolved.File = &F;
4624 Unresolved.Mod = CurrentModule;
4625 Unresolved.ID = Record[0];
4626 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4627 Unresolved.IsWildcard = false;
4628 Unresolved.String = Blob;
4629 UnresolvedModuleRefs.push_back(Unresolved);
4630 break;
4631 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004632 }
4633 }
4634}
4635
4636/// \brief Parse the record that corresponds to a LangOptions data
4637/// structure.
4638///
4639/// This routine parses the language options from the AST file and then gives
4640/// them to the AST listener if one is set.
4641///
4642/// \returns true if the listener deems the file unacceptable, false otherwise.
4643bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4644 bool Complain,
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004645 ASTReaderListener &Listener,
4646 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004647 LangOptions LangOpts;
4648 unsigned Idx = 0;
4649#define LANGOPT(Name, Bits, Default, Description) \
4650 LangOpts.Name = Record[Idx++];
4651#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4652 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4653#include "clang/Basic/LangOptions.def"
Alexey Samsonovedf99a92014-11-07 22:29:38 +00004654#define SANITIZER(NAME, ID) \
4655 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
Will Dietzf54319c2013-01-18 11:30:38 +00004656#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004657
4658 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4659 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4660 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4661
4662 unsigned Length = Record[Idx++];
4663 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4664 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004665
4666 Idx += Length;
4667
4668 // Comment options.
4669 for (unsigned N = Record[Idx++]; N; --N) {
4670 LangOpts.CommentOpts.BlockCommandNames.push_back(
4671 ReadString(Record, Idx));
4672 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004673 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004674
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004675 return Listener.ReadLanguageOptions(LangOpts, Complain,
4676 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004677}
4678
4679bool ASTReader::ParseTargetOptions(const RecordData &Record,
4680 bool Complain,
4681 ASTReaderListener &Listener) {
4682 unsigned Idx = 0;
4683 TargetOptions TargetOpts;
4684 TargetOpts.Triple = ReadString(Record, Idx);
4685 TargetOpts.CPU = ReadString(Record, Idx);
4686 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004687 for (unsigned N = Record[Idx++]; N; --N) {
4688 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4689 }
4690 for (unsigned N = Record[Idx++]; N; --N) {
4691 TargetOpts.Features.push_back(ReadString(Record, Idx));
4692 }
4693
4694 return Listener.ReadTargetOptions(TargetOpts, Complain);
4695}
4696
4697bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4698 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004699 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004700 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004701#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004702#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004703 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004704#include "clang/Basic/DiagnosticOptions.def"
4705
Richard Smith3be1cb22014-08-07 00:24:21 +00004706 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004707 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004708 for (unsigned N = Record[Idx++]; N; --N)
4709 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004710
4711 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4712}
4713
4714bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4715 ASTReaderListener &Listener) {
4716 FileSystemOptions FSOpts;
4717 unsigned Idx = 0;
4718 FSOpts.WorkingDir = ReadString(Record, Idx);
4719 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4720}
4721
4722bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4723 bool Complain,
4724 ASTReaderListener &Listener) {
4725 HeaderSearchOptions HSOpts;
4726 unsigned Idx = 0;
4727 HSOpts.Sysroot = ReadString(Record, Idx);
4728
4729 // Include entries.
4730 for (unsigned N = Record[Idx++]; N; --N) {
4731 std::string Path = ReadString(Record, Idx);
4732 frontend::IncludeDirGroup Group
4733 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004734 bool IsFramework = Record[Idx++];
4735 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004736 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004737 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004738 }
4739
4740 // System header prefixes.
4741 for (unsigned N = Record[Idx++]; N; --N) {
4742 std::string Prefix = ReadString(Record, Idx);
4743 bool IsSystemHeader = Record[Idx++];
4744 HSOpts.SystemHeaderPrefixes.push_back(
4745 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4746 }
4747
4748 HSOpts.ResourceDir = ReadString(Record, Idx);
4749 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004750 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004751 HSOpts.DisableModuleHash = Record[Idx++];
4752 HSOpts.UseBuiltinIncludes = Record[Idx++];
4753 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4754 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4755 HSOpts.UseLibcxx = Record[Idx++];
4756
4757 return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
4758}
4759
4760bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4761 bool Complain,
4762 ASTReaderListener &Listener,
4763 std::string &SuggestedPredefines) {
4764 PreprocessorOptions PPOpts;
4765 unsigned Idx = 0;
4766
4767 // Macro definitions/undefs
4768 for (unsigned N = Record[Idx++]; N; --N) {
4769 std::string Macro = ReadString(Record, Idx);
4770 bool IsUndef = Record[Idx++];
4771 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4772 }
4773
4774 // Includes
4775 for (unsigned N = Record[Idx++]; N; --N) {
4776 PPOpts.Includes.push_back(ReadString(Record, Idx));
4777 }
4778
4779 // Macro Includes
4780 for (unsigned N = Record[Idx++]; N; --N) {
4781 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4782 }
4783
4784 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004785 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004786 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4787 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4788 PPOpts.ObjCXXARCStandardLibrary =
4789 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4790 SuggestedPredefines.clear();
4791 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4792 SuggestedPredefines);
4793}
4794
4795std::pair<ModuleFile *, unsigned>
4796ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4797 GlobalPreprocessedEntityMapType::iterator
4798 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4799 assert(I != GlobalPreprocessedEntityMap.end() &&
4800 "Corrupted global preprocessed entity map");
4801 ModuleFile *M = I->second;
4802 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4803 return std::make_pair(M, LocalIndex);
4804}
4805
4806std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
4807ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4808 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4809 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4810 Mod.NumPreprocessedEntities);
4811
4812 return std::make_pair(PreprocessingRecord::iterator(),
4813 PreprocessingRecord::iterator());
4814}
4815
4816std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
4817ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4818 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4819 ModuleDeclIterator(this, &Mod,
4820 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4821}
4822
4823PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4824 PreprocessedEntityID PPID = Index+1;
4825 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4826 ModuleFile &M = *PPInfo.first;
4827 unsigned LocalIndex = PPInfo.second;
4828 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4829
Guy Benyei11169dd2012-12-18 14:30:41 +00004830 if (!PP.getPreprocessingRecord()) {
4831 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004832 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004833 }
4834
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004835 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4836 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4837
4838 llvm::BitstreamEntry Entry =
4839 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4840 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004841 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004842
Guy Benyei11169dd2012-12-18 14:30:41 +00004843 // Read the record.
4844 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4845 ReadSourceLocation(M, PPOffs.End));
4846 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004847 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004848 RecordData Record;
4849 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004850 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4851 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004852 switch (RecType) {
4853 case PPD_MACRO_EXPANSION: {
4854 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004855 IdentifierInfo *Name = nullptr;
4856 MacroDefinition *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004857 if (isBuiltin)
4858 Name = getLocalIdentifier(M, Record[1]);
4859 else {
4860 PreprocessedEntityID
4861 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4862 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4863 }
4864
4865 MacroExpansion *ME;
4866 if (isBuiltin)
4867 ME = new (PPRec) MacroExpansion(Name, Range);
4868 else
4869 ME = new (PPRec) MacroExpansion(Def, Range);
4870
4871 return ME;
4872 }
4873
4874 case PPD_MACRO_DEFINITION: {
4875 // Decode the identifier info and then check again; if the macro is
4876 // still defined and associated with the identifier,
4877 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4878 MacroDefinition *MD
4879 = new (PPRec) MacroDefinition(II, Range);
4880
4881 if (DeserializationListener)
4882 DeserializationListener->MacroDefinitionRead(PPID, MD);
4883
4884 return MD;
4885 }
4886
4887 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004888 const char *FullFileNameStart = Blob.data() + Record[0];
4889 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004890 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004891 if (!FullFileName.empty())
4892 File = PP.getFileManager().getFile(FullFileName);
4893
4894 // FIXME: Stable encoding
4895 InclusionDirective::InclusionKind Kind
4896 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4897 InclusionDirective *ID
4898 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004899 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004900 Record[1], Record[3],
4901 File,
4902 Range);
4903 return ID;
4904 }
4905 }
4906
4907 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4908}
4909
4910/// \brief \arg SLocMapI points at a chunk of a module that contains no
4911/// preprocessed entities or the entities it contains are not the ones we are
4912/// looking for. Find the next module that contains entities and return the ID
4913/// of the first entry.
4914PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4915 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4916 ++SLocMapI;
4917 for (GlobalSLocOffsetMapType::const_iterator
4918 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4919 ModuleFile &M = *SLocMapI->second;
4920 if (M.NumPreprocessedEntities)
4921 return M.BasePreprocessedEntityID;
4922 }
4923
4924 return getTotalNumPreprocessedEntities();
4925}
4926
4927namespace {
4928
4929template <unsigned PPEntityOffset::*PPLoc>
4930struct PPEntityComp {
4931 const ASTReader &Reader;
4932 ModuleFile &M;
4933
4934 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4935
4936 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4937 SourceLocation LHS = getLoc(L);
4938 SourceLocation RHS = getLoc(R);
4939 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4940 }
4941
4942 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4943 SourceLocation LHS = getLoc(L);
4944 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4945 }
4946
4947 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4948 SourceLocation RHS = getLoc(R);
4949 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4950 }
4951
4952 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4953 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4954 }
4955};
4956
4957}
4958
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004959PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4960 bool EndsAfter) const {
4961 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00004962 return getTotalNumPreprocessedEntities();
4963
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004964 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4965 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00004966 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4967 "Corrupted global sloc offset map");
4968
4969 if (SLocMapI->second->NumPreprocessedEntities == 0)
4970 return findNextPreprocessedEntity(SLocMapI);
4971
4972 ModuleFile &M = *SLocMapI->second;
4973 typedef const PPEntityOffset *pp_iterator;
4974 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4975 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4976
4977 size_t Count = M.NumPreprocessedEntities;
4978 size_t Half;
4979 pp_iterator First = pp_begin;
4980 pp_iterator PPI;
4981
Alp Toker2e9ce4c2014-05-16 18:59:21 +00004982 if (EndsAfter) {
4983 PPI = std::upper_bound(pp_begin, pp_end, Loc,
4984 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4985 } else {
4986 // Do a binary search manually instead of using std::lower_bound because
4987 // The end locations of entities may be unordered (when a macro expansion
4988 // is inside another macro argument), but for this case it is not important
4989 // whether we get the first macro expansion or its containing macro.
4990 while (Count > 0) {
4991 Half = Count / 2;
4992 PPI = First;
4993 std::advance(PPI, Half);
4994 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4995 Loc)) {
4996 First = PPI;
4997 ++First;
4998 Count = Count - Half - 1;
4999 } else
5000 Count = Half;
5001 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005002 }
5003
5004 if (PPI == pp_end)
5005 return findNextPreprocessedEntity(SLocMapI);
5006
5007 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5008}
5009
Guy Benyei11169dd2012-12-18 14:30:41 +00005010/// \brief Returns a pair of [Begin, End) indices of preallocated
5011/// preprocessed entities that \arg Range encompasses.
5012std::pair<unsigned, unsigned>
5013 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5014 if (Range.isInvalid())
5015 return std::make_pair(0,0);
5016 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5017
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005018 PreprocessedEntityID BeginID =
5019 findPreprocessedEntity(Range.getBegin(), false);
5020 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005021 return std::make_pair(BeginID, EndID);
5022}
5023
5024/// \brief Optionally returns true or false if the preallocated preprocessed
5025/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00005026Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00005027 FileID FID) {
5028 if (FID.isInvalid())
5029 return false;
5030
5031 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5032 ModuleFile &M = *PPInfo.first;
5033 unsigned LocalIndex = PPInfo.second;
5034 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5035
5036 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5037 if (Loc.isInvalid())
5038 return false;
5039
5040 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5041 return true;
5042 else
5043 return false;
5044}
5045
5046namespace {
5047 /// \brief Visitor used to search for information about a header file.
5048 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00005049 const FileEntry *FE;
5050
David Blaikie05785d12013-02-20 22:23:23 +00005051 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005052
5053 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005054 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5055 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00005056
5057 static bool visit(ModuleFile &M, void *UserData) {
5058 HeaderFileInfoVisitor *This
5059 = static_cast<HeaderFileInfoVisitor *>(UserData);
5060
Guy Benyei11169dd2012-12-18 14:30:41 +00005061 HeaderFileInfoLookupTable *Table
5062 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5063 if (!Table)
5064 return false;
5065
5066 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00005067 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005068 if (Pos == Table->end())
5069 return false;
5070
5071 This->HFI = *Pos;
5072 return true;
5073 }
5074
David Blaikie05785d12013-02-20 22:23:23 +00005075 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00005076 };
5077}
5078
5079HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005080 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005081 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00005082 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00005083 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005084
5085 return HeaderFileInfo();
5086}
5087
5088void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5089 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00005090 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00005091 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5092 ModuleFile &F = *(*I);
5093 unsigned Idx = 0;
5094 DiagStates.clear();
5095 assert(!Diag.DiagStates.empty());
5096 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5097 while (Idx < F.PragmaDiagMappings.size()) {
5098 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5099 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5100 if (DiagStateID != 0) {
5101 Diag.DiagStatePoints.push_back(
5102 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5103 FullSourceLoc(Loc, SourceMgr)));
5104 continue;
5105 }
5106
5107 assert(DiagStateID == 0);
5108 // A new DiagState was created here.
5109 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5110 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5111 DiagStates.push_back(NewState);
5112 Diag.DiagStatePoints.push_back(
5113 DiagnosticsEngine::DiagStatePoint(NewState,
5114 FullSourceLoc(Loc, SourceMgr)));
5115 while (1) {
5116 assert(Idx < F.PragmaDiagMappings.size() &&
5117 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5118 if (Idx >= F.PragmaDiagMappings.size()) {
5119 break; // Something is messed up but at least avoid infinite loop in
5120 // release build.
5121 }
5122 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5123 if (DiagID == (unsigned)-1) {
5124 break; // no more diag/map pairs for this location.
5125 }
Alp Tokerc726c362014-06-10 09:31:37 +00005126 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5127 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5128 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00005129 }
5130 }
5131 }
5132}
5133
5134/// \brief Get the correct cursor and offset for loading a type.
5135ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5136 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5137 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5138 ModuleFile *M = I->second;
5139 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5140}
5141
5142/// \brief Read and return the type with the given index..
5143///
5144/// The index is the type ID, shifted and minus the number of predefs. This
5145/// routine actually reads the record corresponding to the type at the given
5146/// location. It is a helper routine for GetType, which deals with reading type
5147/// IDs.
5148QualType ASTReader::readTypeRecord(unsigned Index) {
5149 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005150 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005151
5152 // Keep track of where we are in the stream, then jump back there
5153 // after reading this type.
5154 SavedStreamPosition SavedPosition(DeclsCursor);
5155
5156 ReadingKindTracker ReadingKind(Read_Type, *this);
5157
5158 // Note that we are loading a type record.
5159 Deserializing AType(this);
5160
5161 unsigned Idx = 0;
5162 DeclsCursor.JumpToBit(Loc.Offset);
5163 RecordData Record;
5164 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005165 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005166 case TYPE_EXT_QUAL: {
5167 if (Record.size() != 2) {
5168 Error("Incorrect encoding of extended qualifier type");
5169 return QualType();
5170 }
5171 QualType Base = readType(*Loc.F, Record, Idx);
5172 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5173 return Context.getQualifiedType(Base, Quals);
5174 }
5175
5176 case TYPE_COMPLEX: {
5177 if (Record.size() != 1) {
5178 Error("Incorrect encoding of complex type");
5179 return QualType();
5180 }
5181 QualType ElemType = readType(*Loc.F, Record, Idx);
5182 return Context.getComplexType(ElemType);
5183 }
5184
5185 case TYPE_POINTER: {
5186 if (Record.size() != 1) {
5187 Error("Incorrect encoding of pointer type");
5188 return QualType();
5189 }
5190 QualType PointeeType = readType(*Loc.F, Record, Idx);
5191 return Context.getPointerType(PointeeType);
5192 }
5193
Reid Kleckner8a365022013-06-24 17:51:48 +00005194 case TYPE_DECAYED: {
5195 if (Record.size() != 1) {
5196 Error("Incorrect encoding of decayed type");
5197 return QualType();
5198 }
5199 QualType OriginalType = readType(*Loc.F, Record, Idx);
5200 QualType DT = Context.getAdjustedParameterType(OriginalType);
5201 if (!isa<DecayedType>(DT))
5202 Error("Decayed type does not decay");
5203 return DT;
5204 }
5205
Reid Kleckner0503a872013-12-05 01:23:43 +00005206 case TYPE_ADJUSTED: {
5207 if (Record.size() != 2) {
5208 Error("Incorrect encoding of adjusted type");
5209 return QualType();
5210 }
5211 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5212 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5213 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5214 }
5215
Guy Benyei11169dd2012-12-18 14:30:41 +00005216 case TYPE_BLOCK_POINTER: {
5217 if (Record.size() != 1) {
5218 Error("Incorrect encoding of block pointer type");
5219 return QualType();
5220 }
5221 QualType PointeeType = readType(*Loc.F, Record, Idx);
5222 return Context.getBlockPointerType(PointeeType);
5223 }
5224
5225 case TYPE_LVALUE_REFERENCE: {
5226 if (Record.size() != 2) {
5227 Error("Incorrect encoding of lvalue reference type");
5228 return QualType();
5229 }
5230 QualType PointeeType = readType(*Loc.F, Record, Idx);
5231 return Context.getLValueReferenceType(PointeeType, Record[1]);
5232 }
5233
5234 case TYPE_RVALUE_REFERENCE: {
5235 if (Record.size() != 1) {
5236 Error("Incorrect encoding of rvalue reference type");
5237 return QualType();
5238 }
5239 QualType PointeeType = readType(*Loc.F, Record, Idx);
5240 return Context.getRValueReferenceType(PointeeType);
5241 }
5242
5243 case TYPE_MEMBER_POINTER: {
5244 if (Record.size() != 2) {
5245 Error("Incorrect encoding of member pointer type");
5246 return QualType();
5247 }
5248 QualType PointeeType = readType(*Loc.F, Record, Idx);
5249 QualType ClassType = readType(*Loc.F, Record, Idx);
5250 if (PointeeType.isNull() || ClassType.isNull())
5251 return QualType();
5252
5253 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5254 }
5255
5256 case TYPE_CONSTANT_ARRAY: {
5257 QualType ElementType = readType(*Loc.F, Record, Idx);
5258 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5259 unsigned IndexTypeQuals = Record[2];
5260 unsigned Idx = 3;
5261 llvm::APInt Size = ReadAPInt(Record, Idx);
5262 return Context.getConstantArrayType(ElementType, Size,
5263 ASM, IndexTypeQuals);
5264 }
5265
5266 case TYPE_INCOMPLETE_ARRAY: {
5267 QualType ElementType = readType(*Loc.F, Record, Idx);
5268 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5269 unsigned IndexTypeQuals = Record[2];
5270 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5271 }
5272
5273 case TYPE_VARIABLE_ARRAY: {
5274 QualType ElementType = readType(*Loc.F, Record, Idx);
5275 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5276 unsigned IndexTypeQuals = Record[2];
5277 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5278 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5279 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5280 ASM, IndexTypeQuals,
5281 SourceRange(LBLoc, RBLoc));
5282 }
5283
5284 case TYPE_VECTOR: {
5285 if (Record.size() != 3) {
5286 Error("incorrect encoding of vector type in AST file");
5287 return QualType();
5288 }
5289
5290 QualType ElementType = readType(*Loc.F, Record, Idx);
5291 unsigned NumElements = Record[1];
5292 unsigned VecKind = Record[2];
5293 return Context.getVectorType(ElementType, NumElements,
5294 (VectorType::VectorKind)VecKind);
5295 }
5296
5297 case TYPE_EXT_VECTOR: {
5298 if (Record.size() != 3) {
5299 Error("incorrect encoding of extended vector type in AST file");
5300 return QualType();
5301 }
5302
5303 QualType ElementType = readType(*Loc.F, Record, Idx);
5304 unsigned NumElements = Record[1];
5305 return Context.getExtVectorType(ElementType, NumElements);
5306 }
5307
5308 case TYPE_FUNCTION_NO_PROTO: {
5309 if (Record.size() != 6) {
5310 Error("incorrect encoding of no-proto function type");
5311 return QualType();
5312 }
5313 QualType ResultType = readType(*Loc.F, Record, Idx);
5314 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5315 (CallingConv)Record[4], Record[5]);
5316 return Context.getFunctionNoProtoType(ResultType, Info);
5317 }
5318
5319 case TYPE_FUNCTION_PROTO: {
5320 QualType ResultType = readType(*Loc.F, Record, Idx);
5321
5322 FunctionProtoType::ExtProtoInfo EPI;
5323 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5324 /*hasregparm*/ Record[2],
5325 /*regparm*/ Record[3],
5326 static_cast<CallingConv>(Record[4]),
5327 /*produces*/ Record[5]);
5328
5329 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005330
5331 EPI.Variadic = Record[Idx++];
5332 EPI.HasTrailingReturn = Record[Idx++];
5333 EPI.TypeQuals = Record[Idx++];
5334 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005335 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005336 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005337
5338 unsigned NumParams = Record[Idx++];
5339 SmallVector<QualType, 16> ParamTypes;
5340 for (unsigned I = 0; I != NumParams; ++I)
5341 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5342
Jordan Rose5c382722013-03-08 21:51:21 +00005343 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005344 }
5345
5346 case TYPE_UNRESOLVED_USING: {
5347 unsigned Idx = 0;
5348 return Context.getTypeDeclType(
5349 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5350 }
5351
5352 case TYPE_TYPEDEF: {
5353 if (Record.size() != 2) {
5354 Error("incorrect encoding of typedef type");
5355 return QualType();
5356 }
5357 unsigned Idx = 0;
5358 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5359 QualType Canonical = readType(*Loc.F, Record, Idx);
5360 if (!Canonical.isNull())
5361 Canonical = Context.getCanonicalType(Canonical);
5362 return Context.getTypedefType(Decl, Canonical);
5363 }
5364
5365 case TYPE_TYPEOF_EXPR:
5366 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5367
5368 case TYPE_TYPEOF: {
5369 if (Record.size() != 1) {
5370 Error("incorrect encoding of typeof(type) in AST file");
5371 return QualType();
5372 }
5373 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5374 return Context.getTypeOfType(UnderlyingType);
5375 }
5376
5377 case TYPE_DECLTYPE: {
5378 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5379 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5380 }
5381
5382 case TYPE_UNARY_TRANSFORM: {
5383 QualType BaseType = readType(*Loc.F, Record, Idx);
5384 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5385 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5386 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5387 }
5388
Richard Smith74aeef52013-04-26 16:15:35 +00005389 case TYPE_AUTO: {
5390 QualType Deduced = readType(*Loc.F, Record, Idx);
5391 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005392 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005393 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005394 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005395
5396 case TYPE_RECORD: {
5397 if (Record.size() != 2) {
5398 Error("incorrect encoding of record type");
5399 return QualType();
5400 }
5401 unsigned Idx = 0;
5402 bool IsDependent = Record[Idx++];
5403 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5404 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5405 QualType T = Context.getRecordType(RD);
5406 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5407 return T;
5408 }
5409
5410 case TYPE_ENUM: {
5411 if (Record.size() != 2) {
5412 Error("incorrect encoding of enum type");
5413 return QualType();
5414 }
5415 unsigned Idx = 0;
5416 bool IsDependent = Record[Idx++];
5417 QualType T
5418 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5419 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5420 return T;
5421 }
5422
5423 case TYPE_ATTRIBUTED: {
5424 if (Record.size() != 3) {
5425 Error("incorrect encoding of attributed type");
5426 return QualType();
5427 }
5428 QualType modifiedType = readType(*Loc.F, Record, Idx);
5429 QualType equivalentType = readType(*Loc.F, Record, Idx);
5430 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5431 return Context.getAttributedType(kind, modifiedType, equivalentType);
5432 }
5433
5434 case TYPE_PAREN: {
5435 if (Record.size() != 1) {
5436 Error("incorrect encoding of paren type");
5437 return QualType();
5438 }
5439 QualType InnerType = readType(*Loc.F, Record, Idx);
5440 return Context.getParenType(InnerType);
5441 }
5442
5443 case TYPE_PACK_EXPANSION: {
5444 if (Record.size() != 2) {
5445 Error("incorrect encoding of pack expansion type");
5446 return QualType();
5447 }
5448 QualType Pattern = readType(*Loc.F, Record, Idx);
5449 if (Pattern.isNull())
5450 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005451 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005452 if (Record[1])
5453 NumExpansions = Record[1] - 1;
5454 return Context.getPackExpansionType(Pattern, NumExpansions);
5455 }
5456
5457 case TYPE_ELABORATED: {
5458 unsigned Idx = 0;
5459 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5460 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5461 QualType NamedType = readType(*Loc.F, Record, Idx);
5462 return Context.getElaboratedType(Keyword, NNS, NamedType);
5463 }
5464
5465 case TYPE_OBJC_INTERFACE: {
5466 unsigned Idx = 0;
5467 ObjCInterfaceDecl *ItfD
5468 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5469 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5470 }
5471
5472 case TYPE_OBJC_OBJECT: {
5473 unsigned Idx = 0;
5474 QualType Base = readType(*Loc.F, Record, Idx);
5475 unsigned NumProtos = Record[Idx++];
5476 SmallVector<ObjCProtocolDecl*, 4> Protos;
5477 for (unsigned I = 0; I != NumProtos; ++I)
5478 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5479 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5480 }
5481
5482 case TYPE_OBJC_OBJECT_POINTER: {
5483 unsigned Idx = 0;
5484 QualType Pointee = readType(*Loc.F, Record, Idx);
5485 return Context.getObjCObjectPointerType(Pointee);
5486 }
5487
5488 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5489 unsigned Idx = 0;
5490 QualType Parm = readType(*Loc.F, Record, Idx);
5491 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005492 return Context.getSubstTemplateTypeParmType(
5493 cast<TemplateTypeParmType>(Parm),
5494 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005495 }
5496
5497 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5498 unsigned Idx = 0;
5499 QualType Parm = readType(*Loc.F, Record, Idx);
5500 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5501 return Context.getSubstTemplateTypeParmPackType(
5502 cast<TemplateTypeParmType>(Parm),
5503 ArgPack);
5504 }
5505
5506 case TYPE_INJECTED_CLASS_NAME: {
5507 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5508 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5509 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5510 // for AST reading, too much interdependencies.
Richard Smith6377f8f2014-10-21 21:15:18 +00005511 const Type *T = nullptr;
5512 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5513 if (const Type *Existing = DI->getTypeForDecl()) {
5514 T = Existing;
5515 break;
5516 }
5517 }
5518 if (!T) {
Richard Smithf17fdbd2014-04-24 02:25:27 +00005519 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
Richard Smith6377f8f2014-10-21 21:15:18 +00005520 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5521 DI->setTypeForDecl(T);
5522 }
Richard Smithf17fdbd2014-04-24 02:25:27 +00005523 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005524 }
5525
5526 case TYPE_TEMPLATE_TYPE_PARM: {
5527 unsigned Idx = 0;
5528 unsigned Depth = Record[Idx++];
5529 unsigned Index = Record[Idx++];
5530 bool Pack = Record[Idx++];
5531 TemplateTypeParmDecl *D
5532 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5533 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5534 }
5535
5536 case TYPE_DEPENDENT_NAME: {
5537 unsigned Idx = 0;
5538 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5539 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5540 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5541 QualType Canon = readType(*Loc.F, Record, Idx);
5542 if (!Canon.isNull())
5543 Canon = Context.getCanonicalType(Canon);
5544 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5545 }
5546
5547 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5548 unsigned Idx = 0;
5549 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5550 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5551 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5552 unsigned NumArgs = Record[Idx++];
5553 SmallVector<TemplateArgument, 8> Args;
5554 Args.reserve(NumArgs);
5555 while (NumArgs--)
5556 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5557 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5558 Args.size(), Args.data());
5559 }
5560
5561 case TYPE_DEPENDENT_SIZED_ARRAY: {
5562 unsigned Idx = 0;
5563
5564 // ArrayType
5565 QualType ElementType = readType(*Loc.F, Record, Idx);
5566 ArrayType::ArraySizeModifier ASM
5567 = (ArrayType::ArraySizeModifier)Record[Idx++];
5568 unsigned IndexTypeQuals = Record[Idx++];
5569
5570 // DependentSizedArrayType
5571 Expr *NumElts = ReadExpr(*Loc.F);
5572 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5573
5574 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5575 IndexTypeQuals, Brackets);
5576 }
5577
5578 case TYPE_TEMPLATE_SPECIALIZATION: {
5579 unsigned Idx = 0;
5580 bool IsDependent = Record[Idx++];
5581 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5582 SmallVector<TemplateArgument, 8> Args;
5583 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5584 QualType Underlying = readType(*Loc.F, Record, Idx);
5585 QualType T;
5586 if (Underlying.isNull())
5587 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5588 Args.size());
5589 else
5590 T = Context.getTemplateSpecializationType(Name, Args.data(),
5591 Args.size(), Underlying);
5592 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5593 return T;
5594 }
5595
5596 case TYPE_ATOMIC: {
5597 if (Record.size() != 1) {
5598 Error("Incorrect encoding of atomic type");
5599 return QualType();
5600 }
5601 QualType ValueType = readType(*Loc.F, Record, Idx);
5602 return Context.getAtomicType(ValueType);
5603 }
5604 }
5605 llvm_unreachable("Invalid TypeCode!");
5606}
5607
Richard Smith564417a2014-03-20 21:47:22 +00005608void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5609 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005610 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005611 const RecordData &Record, unsigned &Idx) {
5612 ExceptionSpecificationType EST =
5613 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005614 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005615 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005616 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005617 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005618 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005619 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005620 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005621 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005622 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5623 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005624 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005625 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005626 }
5627}
5628
Guy Benyei11169dd2012-12-18 14:30:41 +00005629class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5630 ASTReader &Reader;
5631 ModuleFile &F;
5632 const ASTReader::RecordData &Record;
5633 unsigned &Idx;
5634
5635 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5636 unsigned &I) {
5637 return Reader.ReadSourceLocation(F, R, I);
5638 }
5639
5640 template<typename T>
5641 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5642 return Reader.ReadDeclAs<T>(F, Record, Idx);
5643 }
5644
5645public:
5646 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5647 const ASTReader::RecordData &Record, unsigned &Idx)
5648 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5649 { }
5650
5651 // We want compile-time assurance that we've enumerated all of
5652 // these, so unfortunately we have to declare them first, then
5653 // define them out-of-line.
5654#define ABSTRACT_TYPELOC(CLASS, PARENT)
5655#define TYPELOC(CLASS, PARENT) \
5656 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5657#include "clang/AST/TypeLocNodes.def"
5658
5659 void VisitFunctionTypeLoc(FunctionTypeLoc);
5660 void VisitArrayTypeLoc(ArrayTypeLoc);
5661};
5662
5663void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5664 // nothing to do
5665}
5666void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5667 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5668 if (TL.needsExtraLocalData()) {
5669 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5670 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5671 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5672 TL.setModeAttr(Record[Idx++]);
5673 }
5674}
5675void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5676 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5677}
5678void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5679 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5680}
Reid Kleckner8a365022013-06-24 17:51:48 +00005681void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5682 // nothing to do
5683}
Reid Kleckner0503a872013-12-05 01:23:43 +00005684void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5685 // nothing to do
5686}
Guy Benyei11169dd2012-12-18 14:30:41 +00005687void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5688 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5689}
5690void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5691 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5692}
5693void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5694 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5695}
5696void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5697 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5698 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5699}
5700void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5701 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5702 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5703 if (Record[Idx++])
5704 TL.setSizeExpr(Reader.ReadExpr(F));
5705 else
Craig Toppera13603a2014-05-22 05:54:18 +00005706 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005707}
5708void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5709 VisitArrayTypeLoc(TL);
5710}
5711void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5712 VisitArrayTypeLoc(TL);
5713}
5714void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5715 VisitArrayTypeLoc(TL);
5716}
5717void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5718 DependentSizedArrayTypeLoc TL) {
5719 VisitArrayTypeLoc(TL);
5720}
5721void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5722 DependentSizedExtVectorTypeLoc TL) {
5723 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5724}
5725void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5726 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5727}
5728void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5729 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5730}
5731void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5732 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5733 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5734 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5735 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005736 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5737 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005738 }
5739}
5740void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5741 VisitFunctionTypeLoc(TL);
5742}
5743void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5744 VisitFunctionTypeLoc(TL);
5745}
5746void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5747 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5748}
5749void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5750 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5751}
5752void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5753 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5754 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5755 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5756}
5757void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5758 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5759 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5760 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5761 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5762}
5763void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5764 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5765}
5766void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5767 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5768 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5769 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5770 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5771}
5772void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5773 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5774}
5775void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5776 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5777}
5778void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5779 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5780}
5781void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5782 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5783 if (TL.hasAttrOperand()) {
5784 SourceRange range;
5785 range.setBegin(ReadSourceLocation(Record, Idx));
5786 range.setEnd(ReadSourceLocation(Record, Idx));
5787 TL.setAttrOperandParensRange(range);
5788 }
5789 if (TL.hasAttrExprOperand()) {
5790 if (Record[Idx++])
5791 TL.setAttrExprOperand(Reader.ReadExpr(F));
5792 else
Craig Toppera13603a2014-05-22 05:54:18 +00005793 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005794 } else if (TL.hasAttrEnumOperand())
5795 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5796}
5797void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5798 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5799}
5800void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5801 SubstTemplateTypeParmTypeLoc TL) {
5802 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5803}
5804void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5805 SubstTemplateTypeParmPackTypeLoc TL) {
5806 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5807}
5808void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5809 TemplateSpecializationTypeLoc TL) {
5810 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5811 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5812 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5813 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5814 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5815 TL.setArgLocInfo(i,
5816 Reader.GetTemplateArgumentLocInfo(F,
5817 TL.getTypePtr()->getArg(i).getKind(),
5818 Record, Idx));
5819}
5820void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5821 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5822 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5823}
5824void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5825 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5826 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5827}
5828void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5829 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5830}
5831void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5832 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5833 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5834 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5835}
5836void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5837 DependentTemplateSpecializationTypeLoc TL) {
5838 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5839 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5840 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5841 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5842 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5843 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5844 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5845 TL.setArgLocInfo(I,
5846 Reader.GetTemplateArgumentLocInfo(F,
5847 TL.getTypePtr()->getArg(I).getKind(),
5848 Record, Idx));
5849}
5850void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5851 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5852}
5853void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5854 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5855}
5856void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5857 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5858 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5859 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5860 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5861 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5862}
5863void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5864 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5865}
5866void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5867 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5868 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5869 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5870}
5871
5872TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5873 const RecordData &Record,
5874 unsigned &Idx) {
5875 QualType InfoTy = readType(F, Record, Idx);
5876 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005877 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005878
5879 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5880 TypeLocReader TLR(*this, F, Record, Idx);
5881 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5882 TLR.Visit(TL);
5883 return TInfo;
5884}
5885
5886QualType ASTReader::GetType(TypeID ID) {
5887 unsigned FastQuals = ID & Qualifiers::FastMask;
5888 unsigned Index = ID >> Qualifiers::FastWidth;
5889
5890 if (Index < NUM_PREDEF_TYPE_IDS) {
5891 QualType T;
5892 switch ((PredefinedTypeIDs)Index) {
5893 case PREDEF_TYPE_NULL_ID: return QualType();
5894 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5895 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5896
5897 case PREDEF_TYPE_CHAR_U_ID:
5898 case PREDEF_TYPE_CHAR_S_ID:
5899 // FIXME: Check that the signedness of CharTy is correct!
5900 T = Context.CharTy;
5901 break;
5902
5903 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5904 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5905 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5906 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5907 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5908 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5909 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5910 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5911 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5912 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5913 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5914 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5915 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5916 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5917 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5918 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5919 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5920 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5921 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5922 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5923 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5924 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5925 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5926 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5927 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5928 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5929 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5930 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00005931 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5932 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5933 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5934 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5935 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5936 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00005937 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005938 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005939 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5940
5941 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5942 T = Context.getAutoRRefDeductType();
5943 break;
5944
5945 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5946 T = Context.ARCUnbridgedCastTy;
5947 break;
5948
5949 case PREDEF_TYPE_VA_LIST_TAG:
5950 T = Context.getVaListTagType();
5951 break;
5952
5953 case PREDEF_TYPE_BUILTIN_FN:
5954 T = Context.BuiltinFnTy;
5955 break;
5956 }
5957
5958 assert(!T.isNull() && "Unknown predefined type");
5959 return T.withFastQualifiers(FastQuals);
5960 }
5961
5962 Index -= NUM_PREDEF_TYPE_IDS;
5963 assert(Index < TypesLoaded.size() && "Type index out-of-range");
5964 if (TypesLoaded[Index].isNull()) {
5965 TypesLoaded[Index] = readTypeRecord(Index);
5966 if (TypesLoaded[Index].isNull())
5967 return QualType();
5968
5969 TypesLoaded[Index]->setFromAST();
5970 if (DeserializationListener)
5971 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5972 TypesLoaded[Index]);
5973 }
5974
5975 return TypesLoaded[Index].withFastQualifiers(FastQuals);
5976}
5977
5978QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5979 return GetType(getGlobalTypeID(F, LocalID));
5980}
5981
5982serialization::TypeID
5983ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5984 unsigned FastQuals = LocalID & Qualifiers::FastMask;
5985 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5986
5987 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5988 return LocalID;
5989
5990 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5991 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5992 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5993
5994 unsigned GlobalIndex = LocalIndex + I->second;
5995 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5996}
5997
5998TemplateArgumentLocInfo
5999ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6000 TemplateArgument::ArgKind Kind,
6001 const RecordData &Record,
6002 unsigned &Index) {
6003 switch (Kind) {
6004 case TemplateArgument::Expression:
6005 return ReadExpr(F);
6006 case TemplateArgument::Type:
6007 return GetTypeSourceInfo(F, Record, Index);
6008 case TemplateArgument::Template: {
6009 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6010 Index);
6011 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6012 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6013 SourceLocation());
6014 }
6015 case TemplateArgument::TemplateExpansion: {
6016 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6017 Index);
6018 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6019 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6020 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6021 EllipsisLoc);
6022 }
6023 case TemplateArgument::Null:
6024 case TemplateArgument::Integral:
6025 case TemplateArgument::Declaration:
6026 case TemplateArgument::NullPtr:
6027 case TemplateArgument::Pack:
6028 // FIXME: Is this right?
6029 return TemplateArgumentLocInfo();
6030 }
6031 llvm_unreachable("unexpected template argument loc");
6032}
6033
6034TemplateArgumentLoc
6035ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6036 const RecordData &Record, unsigned &Index) {
6037 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6038
6039 if (Arg.getKind() == TemplateArgument::Expression) {
6040 if (Record[Index++]) // bool InfoHasSameExpr.
6041 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6042 }
6043 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6044 Record, Index));
6045}
6046
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00006047const ASTTemplateArgumentListInfo*
6048ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6049 const RecordData &Record,
6050 unsigned &Index) {
6051 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6052 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6053 unsigned NumArgsAsWritten = Record[Index++];
6054 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6055 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6056 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6057 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6058}
6059
Guy Benyei11169dd2012-12-18 14:30:41 +00006060Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6061 return GetDecl(ID);
6062}
6063
Richard Smith053f6c62014-05-16 23:01:30 +00006064void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00006065 if (NumCurrentElementsDeserializing) {
6066 // We arrange to not care about the complete redeclaration chain while we're
6067 // deserializing. Just remember that the AST has marked this one as complete
6068 // but that it's not actually complete yet, so we know we still need to
6069 // complete it later.
6070 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6071 return;
6072 }
6073
Richard Smith053f6c62014-05-16 23:01:30 +00006074 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6075
Richard Smith053f6c62014-05-16 23:01:30 +00006076 // If this is a named declaration, complete it by looking it up
6077 // within its context.
6078 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00006079 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00006080 // all mergeable entities within it.
6081 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6082 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6083 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6084 auto *II = Name.getAsIdentifierInfo();
6085 if (isa<TranslationUnitDecl>(DC) && II) {
6086 // Outside of C++, we don't have a lookup table for the TU, so update
6087 // the identifier instead. In C++, either way should work fine.
6088 if (II->isOutOfDate())
6089 updateOutOfDateIdentifier(*II);
6090 } else
6091 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00006092 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6093 // FIXME: It'd be nice to do something a bit more targeted here.
6094 D->getDeclContext()->decls_begin();
Richard Smith053f6c62014-05-16 23:01:30 +00006095 }
6096 }
6097}
6098
Richard Smithcd45dbc2014-04-19 03:48:30 +00006099uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6100 const RecordData &Record,
6101 unsigned &Idx) {
6102 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6103 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00006104 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006105 }
6106
Guy Benyei11169dd2012-12-18 14:30:41 +00006107 unsigned LocalID = Record[Idx++];
6108 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6109}
6110
6111CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6112 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006113 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006114 SavedStreamPosition SavedPosition(Cursor);
6115 Cursor.JumpToBit(Loc.Offset);
6116 ReadingKindTracker ReadingKind(Read_Decl, *this);
6117 RecordData Record;
6118 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00006119 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00006120 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006121 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00006122 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006123 }
6124
6125 unsigned Idx = 0;
6126 unsigned NumBases = Record[Idx++];
6127 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6128 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6129 for (unsigned I = 0; I != NumBases; ++I)
6130 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6131 return Bases;
6132}
6133
6134serialization::DeclID
6135ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6136 if (LocalID < NUM_PREDEF_DECL_IDS)
6137 return LocalID;
6138
6139 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6140 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6141 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6142
6143 return LocalID + I->second;
6144}
6145
6146bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6147 ModuleFile &M) const {
6148 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6149 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6150 return &M == I->second;
6151}
6152
Douglas Gregor9f782892013-01-21 15:25:38 +00006153ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006154 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00006155 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006156 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6157 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6158 return I->second;
6159}
6160
6161SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6162 if (ID < NUM_PREDEF_DECL_IDS)
6163 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006164
Guy Benyei11169dd2012-12-18 14:30:41 +00006165 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6166
6167 if (Index > DeclsLoaded.size()) {
6168 Error("declaration ID out-of-range for AST file");
6169 return SourceLocation();
6170 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006171
Guy Benyei11169dd2012-12-18 14:30:41 +00006172 if (Decl *D = DeclsLoaded[Index])
6173 return D->getLocation();
6174
6175 unsigned RawLocation = 0;
6176 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6177 return ReadSourceLocation(*Rec.F, RawLocation);
6178}
6179
Richard Smithcd45dbc2014-04-19 03:48:30 +00006180Decl *ASTReader::GetExistingDecl(DeclID ID) {
6181 if (ID < NUM_PREDEF_DECL_IDS) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006182 switch ((PredefinedDeclIDs)ID) {
6183 case PREDEF_DECL_NULL_ID:
Craig Toppera13603a2014-05-22 05:54:18 +00006184 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006185
Guy Benyei11169dd2012-12-18 14:30:41 +00006186 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6187 return Context.getTranslationUnitDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006188
Guy Benyei11169dd2012-12-18 14:30:41 +00006189 case PREDEF_DECL_OBJC_ID_ID:
6190 return Context.getObjCIdDecl();
6191
6192 case PREDEF_DECL_OBJC_SEL_ID:
6193 return Context.getObjCSelDecl();
6194
6195 case PREDEF_DECL_OBJC_CLASS_ID:
6196 return Context.getObjCClassDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006197
Guy Benyei11169dd2012-12-18 14:30:41 +00006198 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6199 return Context.getObjCProtocolDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006200
Guy Benyei11169dd2012-12-18 14:30:41 +00006201 case PREDEF_DECL_INT_128_ID:
6202 return Context.getInt128Decl();
6203
6204 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6205 return Context.getUInt128Decl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006206
Guy Benyei11169dd2012-12-18 14:30:41 +00006207 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6208 return Context.getObjCInstanceTypeDecl();
6209
6210 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6211 return Context.getBuiltinVaListDecl();
6212 }
6213 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006214
Guy Benyei11169dd2012-12-18 14:30:41 +00006215 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6216
6217 if (Index >= DeclsLoaded.size()) {
6218 assert(0 && "declaration ID out-of-range for AST file");
6219 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006220 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006221 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006222
6223 return DeclsLoaded[Index];
6224}
6225
6226Decl *ASTReader::GetDecl(DeclID ID) {
6227 if (ID < NUM_PREDEF_DECL_IDS)
6228 return GetExistingDecl(ID);
6229
6230 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6231
6232 if (Index >= DeclsLoaded.size()) {
6233 assert(0 && "declaration ID out-of-range for AST file");
6234 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006235 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006236 }
6237
Guy Benyei11169dd2012-12-18 14:30:41 +00006238 if (!DeclsLoaded[Index]) {
6239 ReadDeclRecord(ID);
6240 if (DeserializationListener)
6241 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6242 }
6243
6244 return DeclsLoaded[Index];
6245}
6246
6247DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6248 DeclID GlobalID) {
6249 if (GlobalID < NUM_PREDEF_DECL_IDS)
6250 return GlobalID;
6251
6252 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6253 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6254 ModuleFile *Owner = I->second;
6255
6256 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6257 = M.GlobalToLocalDeclIDs.find(Owner);
6258 if (Pos == M.GlobalToLocalDeclIDs.end())
6259 return 0;
6260
6261 return GlobalID - Owner->BaseDeclID + Pos->second;
6262}
6263
6264serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6265 const RecordData &Record,
6266 unsigned &Idx) {
6267 if (Idx >= Record.size()) {
6268 Error("Corrupted AST file");
6269 return 0;
6270 }
6271
6272 return getGlobalDeclID(F, Record[Idx++]);
6273}
6274
6275/// \brief Resolve the offset of a statement into a statement.
6276///
6277/// This operation will read a new statement from the external
6278/// source each time it is called, and is meant to be used via a
6279/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6280Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6281 // Switch case IDs are per Decl.
6282 ClearSwitchCaseIDs();
6283
6284 // Offset here is a global offset across the entire chain.
6285 RecordLocation Loc = getLocalBitOffset(Offset);
6286 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6287 return ReadStmtFromStream(*Loc.F);
6288}
6289
6290namespace {
6291 class FindExternalLexicalDeclsVisitor {
6292 ASTReader &Reader;
6293 const DeclContext *DC;
6294 bool (*isKindWeWant)(Decl::Kind);
6295
6296 SmallVectorImpl<Decl*> &Decls;
6297 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6298
6299 public:
6300 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6301 bool (*isKindWeWant)(Decl::Kind),
6302 SmallVectorImpl<Decl*> &Decls)
6303 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6304 {
6305 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6306 PredefsVisited[I] = false;
6307 }
6308
6309 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6310 if (Preorder)
6311 return false;
6312
6313 FindExternalLexicalDeclsVisitor *This
6314 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6315
6316 ModuleFile::DeclContextInfosMap::iterator Info
6317 = M.DeclContextInfos.find(This->DC);
6318 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6319 return false;
6320
6321 // Load all of the declaration IDs
6322 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6323 *IDE = ID + Info->second.NumLexicalDecls;
6324 ID != IDE; ++ID) {
6325 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6326 continue;
6327
6328 // Don't add predefined declarations to the lexical context more
6329 // than once.
6330 if (ID->second < NUM_PREDEF_DECL_IDS) {
6331 if (This->PredefsVisited[ID->second])
6332 continue;
6333
6334 This->PredefsVisited[ID->second] = true;
6335 }
6336
6337 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6338 if (!This->DC->isDeclInLexicalTraversal(D))
6339 This->Decls.push_back(D);
6340 }
6341 }
6342
6343 return false;
6344 }
6345 };
6346}
6347
6348ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6349 bool (*isKindWeWant)(Decl::Kind),
6350 SmallVectorImpl<Decl*> &Decls) {
6351 // There might be lexical decls in multiple modules, for the TU at
6352 // least. Walk all of the modules in the order they were loaded.
6353 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6354 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6355 ++NumLexicalDeclContextsRead;
6356 return ELR_Success;
6357}
6358
6359namespace {
6360
6361class DeclIDComp {
6362 ASTReader &Reader;
6363 ModuleFile &Mod;
6364
6365public:
6366 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6367
6368 bool operator()(LocalDeclID L, LocalDeclID R) const {
6369 SourceLocation LHS = getLocation(L);
6370 SourceLocation RHS = getLocation(R);
6371 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6372 }
6373
6374 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6375 SourceLocation RHS = getLocation(R);
6376 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6377 }
6378
6379 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6380 SourceLocation LHS = getLocation(L);
6381 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6382 }
6383
6384 SourceLocation getLocation(LocalDeclID ID) const {
6385 return Reader.getSourceManager().getFileLoc(
6386 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6387 }
6388};
6389
6390}
6391
6392void ASTReader::FindFileRegionDecls(FileID File,
6393 unsigned Offset, unsigned Length,
6394 SmallVectorImpl<Decl *> &Decls) {
6395 SourceManager &SM = getSourceManager();
6396
6397 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6398 if (I == FileDeclIDs.end())
6399 return;
6400
6401 FileDeclsInfo &DInfo = I->second;
6402 if (DInfo.Decls.empty())
6403 return;
6404
6405 SourceLocation
6406 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6407 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6408
6409 DeclIDComp DIDComp(*this, *DInfo.Mod);
6410 ArrayRef<serialization::LocalDeclID>::iterator
6411 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6412 BeginLoc, DIDComp);
6413 if (BeginIt != DInfo.Decls.begin())
6414 --BeginIt;
6415
6416 // If we are pointing at a top-level decl inside an objc container, we need
6417 // to backtrack until we find it otherwise we will fail to report that the
6418 // region overlaps with an objc container.
6419 while (BeginIt != DInfo.Decls.begin() &&
6420 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6421 ->isTopLevelDeclInObjCContainer())
6422 --BeginIt;
6423
6424 ArrayRef<serialization::LocalDeclID>::iterator
6425 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6426 EndLoc, DIDComp);
6427 if (EndIt != DInfo.Decls.end())
6428 ++EndIt;
6429
6430 for (ArrayRef<serialization::LocalDeclID>::iterator
6431 DIt = BeginIt; DIt != EndIt; ++DIt)
6432 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6433}
6434
6435namespace {
6436 /// \brief ModuleFile visitor used to perform name lookup into a
6437 /// declaration context.
6438 class DeclContextNameLookupVisitor {
6439 ASTReader &Reader;
Richard Smith8c913ec2014-08-14 02:21:01 +00006440 ArrayRef<const DeclContext *> Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006441 DeclarationName Name;
6442 SmallVectorImpl<NamedDecl *> &Decls;
6443
6444 public:
Richard Smith8c913ec2014-08-14 02:21:01 +00006445 DeclContextNameLookupVisitor(ASTReader &Reader,
6446 ArrayRef<const DeclContext *> Contexts,
Guy Benyei11169dd2012-12-18 14:30:41 +00006447 DeclarationName Name,
6448 SmallVectorImpl<NamedDecl *> &Decls)
6449 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
6450
6451 static bool visit(ModuleFile &M, void *UserData) {
6452 DeclContextNameLookupVisitor *This
6453 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6454
6455 // Check whether we have any visible declaration information for
6456 // this context in this module.
6457 ModuleFile::DeclContextInfosMap::iterator Info;
6458 bool FoundInfo = false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006459 for (auto *DC : This->Contexts) {
6460 Info = M.DeclContextInfos.find(DC);
6461 if (Info != M.DeclContextInfos.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00006462 Info->second.NameLookupTableData) {
6463 FoundInfo = true;
6464 break;
6465 }
6466 }
6467
6468 if (!FoundInfo)
6469 return false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006470
Guy Benyei11169dd2012-12-18 14:30:41 +00006471 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006472 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006473 Info->second.NameLookupTableData;
6474 ASTDeclContextNameLookupTable::iterator Pos
6475 = LookupTable->find(This->Name);
6476 if (Pos == LookupTable->end())
6477 return false;
6478
6479 bool FoundAnything = false;
6480 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6481 for (; Data.first != Data.second; ++Data.first) {
6482 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6483 if (!ND)
6484 continue;
6485
6486 if (ND->getDeclName() != This->Name) {
6487 // A name might be null because the decl's redeclarable part is
6488 // currently read before reading its name. The lookup is triggered by
6489 // building that decl (likely indirectly), and so it is later in the
6490 // sense of "already existing" and can be ignored here.
Richard Smith8c913ec2014-08-14 02:21:01 +00006491 // FIXME: This should not happen; deserializing declarations should
6492 // not perform lookups since that can lead to deserialization cycles.
Guy Benyei11169dd2012-12-18 14:30:41 +00006493 continue;
6494 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006495
Guy Benyei11169dd2012-12-18 14:30:41 +00006496 // Record this declaration.
6497 FoundAnything = true;
6498 This->Decls.push_back(ND);
6499 }
6500
6501 return FoundAnything;
6502 }
6503 };
6504}
6505
Douglas Gregor9f782892013-01-21 15:25:38 +00006506/// \brief Retrieve the "definitive" module file for the definition of the
6507/// given declaration context, if there is one.
6508///
6509/// The "definitive" module file is the only place where we need to look to
6510/// find information about the declarations within the given declaration
6511/// context. For example, C++ and Objective-C classes, C structs/unions, and
6512/// Objective-C protocols, categories, and extensions are all defined in a
6513/// single place in the source code, so they have definitive module files
6514/// associated with them. C++ namespaces, on the other hand, can have
6515/// definitions in multiple different module files.
6516///
6517/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6518/// NDEBUG checking.
6519static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6520 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006521 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6522 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006523
Craig Toppera13603a2014-05-22 05:54:18 +00006524 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006525}
6526
Richard Smith9ce12e32013-02-07 03:30:24 +00006527bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006528ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6529 DeclarationName Name) {
6530 assert(DC->hasExternalVisibleStorage() &&
6531 "DeclContext has no visible decls in storage");
6532 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006533 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006534
Richard Smith8c913ec2014-08-14 02:21:01 +00006535 Deserializing LookupResults(this);
6536
Guy Benyei11169dd2012-12-18 14:30:41 +00006537 SmallVector<NamedDecl *, 64> Decls;
Richard Smith8c913ec2014-08-14 02:21:01 +00006538
Guy Benyei11169dd2012-12-18 14:30:41 +00006539 // Compute the declaration contexts we need to look into. Multiple such
6540 // declaration contexts occur when two declaration contexts from disjoint
6541 // modules get merged, e.g., when two namespaces with the same name are
6542 // independently defined in separate modules.
6543 SmallVector<const DeclContext *, 2> Contexts;
6544 Contexts.push_back(DC);
Richard Smith8c913ec2014-08-14 02:21:01 +00006545
Guy Benyei11169dd2012-12-18 14:30:41 +00006546 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006547 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006548 if (Merged != MergedDecls.end()) {
6549 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6550 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6551 }
6552 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006553
6554 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
6555 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
6556
6557 // If we can definitively determine which module file to look into,
6558 // only look there. Otherwise, look in all module files.
6559 ModuleFile *Definitive;
6560 if (Contexts.size() == 1 &&
6561 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6562 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6563 } else {
6564 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6565 }
6566 };
6567
6568 LookUpInContexts(Contexts);
6569
6570 // If this might be an implicit special member function, then also search
6571 // all merged definitions of the surrounding class. We need to search them
6572 // individually, because finding an entity in one of them doesn't imply that
6573 // we can't find a different entity in another one.
Richard Smithcd45dbc2014-04-19 03:48:30 +00006574 if (isa<CXXRecordDecl>(DC)) {
Richard Smith8c913ec2014-08-14 02:21:01 +00006575 auto Kind = Name.getNameKind();
6576 if (Kind == DeclarationName::CXXConstructorName ||
6577 Kind == DeclarationName::CXXDestructorName ||
6578 (Kind == DeclarationName::CXXOperatorName &&
6579 Name.getCXXOverloadedOperator() == OO_Equal)) {
6580 auto Merged = MergedLookups.find(DC);
Richard Smithe0612472014-11-21 05:16:13 +00006581 if (Merged != MergedLookups.end()) {
6582 for (unsigned I = 0; I != Merged->second.size(); ++I) {
6583 LookUpInContexts(Merged->second[I]);
6584 // We might have just added some more merged lookups. If so, our
6585 // iterator is now invalid, so grab a fresh one before continuing.
6586 Merged = MergedLookups.find(DC);
6587 }
6588 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006589 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006590 }
6591
Guy Benyei11169dd2012-12-18 14:30:41 +00006592 ++NumVisibleDeclContextsRead;
6593 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006594 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006595}
6596
6597namespace {
6598 /// \brief ModuleFile visitor used to retrieve all visible names in a
6599 /// declaration context.
6600 class DeclContextAllNamesVisitor {
6601 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006602 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006603 DeclsMap &Decls;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006604 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006605
6606 public:
6607 DeclContextAllNamesVisitor(ASTReader &Reader,
6608 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006609 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006610 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006611
6612 static bool visit(ModuleFile &M, void *UserData) {
6613 DeclContextAllNamesVisitor *This
6614 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6615
6616 // Check whether we have any visible declaration information for
6617 // this context in this module.
6618 ModuleFile::DeclContextInfosMap::iterator Info;
6619 bool FoundInfo = false;
6620 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6621 Info = M.DeclContextInfos.find(This->Contexts[I]);
6622 if (Info != M.DeclContextInfos.end() &&
6623 Info->second.NameLookupTableData) {
6624 FoundInfo = true;
6625 break;
6626 }
6627 }
6628
6629 if (!FoundInfo)
6630 return false;
6631
Richard Smith52e3fba2014-03-11 07:17:35 +00006632 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006633 Info->second.NameLookupTableData;
6634 bool FoundAnything = false;
6635 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006636 I = LookupTable->data_begin(), E = LookupTable->data_end();
6637 I != E;
6638 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006639 ASTDeclContextNameLookupTrait::data_type Data = *I;
6640 for (; Data.first != Data.second; ++Data.first) {
6641 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6642 *Data.first);
6643 if (!ND)
6644 continue;
6645
6646 // Record this declaration.
6647 FoundAnything = true;
6648 This->Decls[ND->getDeclName()].push_back(ND);
6649 }
6650 }
6651
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006652 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006653 }
6654 };
6655}
6656
6657void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6658 if (!DC->hasExternalVisibleStorage())
6659 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006660 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006661
6662 // Compute the declaration contexts we need to look into. Multiple such
6663 // declaration contexts occur when two declaration contexts from disjoint
6664 // modules get merged, e.g., when two namespaces with the same name are
6665 // independently defined in separate modules.
6666 SmallVector<const DeclContext *, 2> Contexts;
6667 Contexts.push_back(DC);
6668
6669 if (DC->isNamespace()) {
6670 MergedDeclsMap::iterator Merged
6671 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6672 if (Merged != MergedDecls.end()) {
6673 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6674 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6675 }
6676 }
6677
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006678 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6679 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006680 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6681 ++NumVisibleDeclContextsRead;
6682
Craig Topper79be4cd2013-07-05 04:33:53 +00006683 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006684 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6685 }
6686 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6687}
6688
6689/// \brief Under non-PCH compilation the consumer receives the objc methods
6690/// before receiving the implementation, and codegen depends on this.
6691/// We simulate this by deserializing and passing to consumer the methods of the
6692/// implementation before passing the deserialized implementation decl.
6693static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6694 ASTConsumer *Consumer) {
6695 assert(ImplD && Consumer);
6696
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006697 for (auto *I : ImplD->methods())
6698 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006699
6700 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6701}
6702
6703void ASTReader::PassInterestingDeclsToConsumer() {
6704 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006705
6706 if (PassingDeclsToConsumer)
6707 return;
6708
6709 // Guard variable to avoid recursively redoing the process of passing
6710 // decls to consumer.
6711 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6712 true);
6713
Guy Benyei11169dd2012-12-18 14:30:41 +00006714 while (!InterestingDecls.empty()) {
6715 Decl *D = InterestingDecls.front();
6716 InterestingDecls.pop_front();
6717
6718 PassInterestingDeclToConsumer(D);
6719 }
6720}
6721
6722void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6723 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6724 PassObjCImplDeclToConsumer(ImplD, Consumer);
6725 else
6726 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6727}
6728
6729void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6730 this->Consumer = Consumer;
6731
6732 if (!Consumer)
6733 return;
6734
Ben Langmuir332aafe2014-01-31 01:06:56 +00006735 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006736 // Force deserialization of this decl, which will cause it to be queued for
6737 // passing to the consumer.
Ben Langmuir332aafe2014-01-31 01:06:56 +00006738 GetDecl(EagerlyDeserializedDecls[I]);
Guy Benyei11169dd2012-12-18 14:30:41 +00006739 }
Ben Langmuir332aafe2014-01-31 01:06:56 +00006740 EagerlyDeserializedDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006741
6742 PassInterestingDeclsToConsumer();
6743}
6744
6745void ASTReader::PrintStats() {
6746 std::fprintf(stderr, "*** AST File Statistics:\n");
6747
6748 unsigned NumTypesLoaded
6749 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6750 QualType());
6751 unsigned NumDeclsLoaded
6752 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006753 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006754 unsigned NumIdentifiersLoaded
6755 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6756 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006757 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006758 unsigned NumMacrosLoaded
6759 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6760 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006761 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006762 unsigned NumSelectorsLoaded
6763 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6764 SelectorsLoaded.end(),
6765 Selector());
6766
6767 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6768 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6769 NumSLocEntriesRead, TotalNumSLocEntries,
6770 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6771 if (!TypesLoaded.empty())
6772 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6773 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6774 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6775 if (!DeclsLoaded.empty())
6776 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6777 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6778 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6779 if (!IdentifiersLoaded.empty())
6780 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6781 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6782 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6783 if (!MacrosLoaded.empty())
6784 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6785 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6786 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6787 if (!SelectorsLoaded.empty())
6788 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6789 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6790 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6791 if (TotalNumStatements)
6792 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6793 NumStatementsRead, TotalNumStatements,
6794 ((float)NumStatementsRead/TotalNumStatements * 100));
6795 if (TotalNumMacros)
6796 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6797 NumMacrosRead, TotalNumMacros,
6798 ((float)NumMacrosRead/TotalNumMacros * 100));
6799 if (TotalLexicalDeclContexts)
6800 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6801 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6802 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6803 * 100));
6804 if (TotalVisibleDeclContexts)
6805 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6806 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6807 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6808 * 100));
6809 if (TotalNumMethodPoolEntries) {
6810 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6811 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6812 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6813 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006814 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006815 if (NumMethodPoolLookups) {
6816 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6817 NumMethodPoolHits, NumMethodPoolLookups,
6818 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6819 }
6820 if (NumMethodPoolTableLookups) {
6821 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6822 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6823 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6824 * 100.0));
6825 }
6826
Douglas Gregor00a50f72013-01-25 00:38:33 +00006827 if (NumIdentifierLookupHits) {
6828 std::fprintf(stderr,
6829 " %u / %u identifier table lookups succeeded (%f%%)\n",
6830 NumIdentifierLookupHits, NumIdentifierLookups,
6831 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6832 }
6833
Douglas Gregore060e572013-01-25 01:03:03 +00006834 if (GlobalIndex) {
6835 std::fprintf(stderr, "\n");
6836 GlobalIndex->printStats();
6837 }
6838
Guy Benyei11169dd2012-12-18 14:30:41 +00006839 std::fprintf(stderr, "\n");
6840 dump();
6841 std::fprintf(stderr, "\n");
6842}
6843
6844template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6845static void
6846dumpModuleIDMap(StringRef Name,
6847 const ContinuousRangeMap<Key, ModuleFile *,
6848 InitialCapacity> &Map) {
6849 if (Map.begin() == Map.end())
6850 return;
6851
6852 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6853 llvm::errs() << Name << ":\n";
6854 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6855 I != IEnd; ++I) {
6856 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6857 << "\n";
6858 }
6859}
6860
6861void ASTReader::dump() {
6862 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6863 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6864 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6865 dumpModuleIDMap("Global type map", GlobalTypeMap);
6866 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6867 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6868 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6869 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6870 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6871 dumpModuleIDMap("Global preprocessed entity map",
6872 GlobalPreprocessedEntityMap);
6873
6874 llvm::errs() << "\n*** PCH/Modules Loaded:";
6875 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6876 MEnd = ModuleMgr.end();
6877 M != MEnd; ++M)
6878 (*M)->dump();
6879}
6880
6881/// Return the amount of memory used by memory buffers, breaking down
6882/// by heap-backed versus mmap'ed memory.
6883void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6884 for (ModuleConstIterator I = ModuleMgr.begin(),
6885 E = ModuleMgr.end(); I != E; ++I) {
6886 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6887 size_t bytes = buf->getBufferSize();
6888 switch (buf->getBufferKind()) {
6889 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6890 sizes.malloc_bytes += bytes;
6891 break;
6892 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6893 sizes.mmap_bytes += bytes;
6894 break;
6895 }
6896 }
6897 }
6898}
6899
6900void ASTReader::InitializeSema(Sema &S) {
6901 SemaObj = &S;
6902 S.addExternalSource(this);
6903
6904 // Makes sure any declarations that were deserialized "too early"
6905 // still get added to the identifier's declaration chains.
Ben Langmuir5418f402014-09-10 21:29:41 +00006906 for (uint64_t ID : PreloadedDeclIDs) {
6907 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
6908 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00006909 }
Ben Langmuir5418f402014-09-10 21:29:41 +00006910 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006911
Richard Smith3d8e97e2013-10-18 06:54:39 +00006912 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006913 if (!FPPragmaOptions.empty()) {
6914 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6915 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6916 }
6917
Richard Smith3d8e97e2013-10-18 06:54:39 +00006918 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00006919 if (!OpenCLExtensions.empty()) {
6920 unsigned I = 0;
6921#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6922#include "clang/Basic/OpenCLExtensions.def"
6923
6924 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6925 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00006926
6927 UpdateSema();
6928}
6929
6930void ASTReader::UpdateSema() {
6931 assert(SemaObj && "no Sema to update");
6932
6933 // Load the offsets of the declarations that Sema references.
6934 // They will be lazily deserialized when needed.
6935 if (!SemaDeclRefs.empty()) {
6936 assert(SemaDeclRefs.size() % 2 == 0);
6937 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6938 if (!SemaObj->StdNamespace)
6939 SemaObj->StdNamespace = SemaDeclRefs[I];
6940 if (!SemaObj->StdBadAlloc)
6941 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6942 }
6943 SemaDeclRefs.clear();
6944 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00006945
6946 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6947 // encountered the pragma in the source.
6948 if(OptimizeOffPragmaLocation.isValid())
6949 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00006950}
6951
6952IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
6953 // Note that we are loading an identifier.
6954 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00006955 StringRef Name(NameStart, NameEnd - NameStart);
6956
6957 // If there is a global index, look there first to determine which modules
6958 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00006959 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00006960 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00006961 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00006962 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6963 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00006964 }
6965 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00006966 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00006967 NumIdentifierLookups,
6968 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00006969 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006970 IdentifierInfo *II = Visitor.getIdentifierInfo();
6971 markIdentifierUpToDate(II);
6972 return II;
6973}
6974
6975namespace clang {
6976 /// \brief An identifier-lookup iterator that enumerates all of the
6977 /// identifiers stored within a set of AST files.
6978 class ASTIdentifierIterator : public IdentifierIterator {
6979 /// \brief The AST reader whose identifiers are being enumerated.
6980 const ASTReader &Reader;
6981
6982 /// \brief The current index into the chain of AST files stored in
6983 /// the AST reader.
6984 unsigned Index;
6985
6986 /// \brief The current position within the identifier lookup table
6987 /// of the current AST file.
6988 ASTIdentifierLookupTable::key_iterator Current;
6989
6990 /// \brief The end position within the identifier lookup table of
6991 /// the current AST file.
6992 ASTIdentifierLookupTable::key_iterator End;
6993
6994 public:
6995 explicit ASTIdentifierIterator(const ASTReader &Reader);
6996
Craig Topper3e89dfe2014-03-13 02:13:41 +00006997 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00006998 };
6999}
7000
7001ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
7002 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
7003 ASTIdentifierLookupTable *IdTable
7004 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
7005 Current = IdTable->key_begin();
7006 End = IdTable->key_end();
7007}
7008
7009StringRef ASTIdentifierIterator::Next() {
7010 while (Current == End) {
7011 // If we have exhausted all of our AST files, we're done.
7012 if (Index == 0)
7013 return StringRef();
7014
7015 --Index;
7016 ASTIdentifierLookupTable *IdTable
7017 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7018 IdentifierLookupTable;
7019 Current = IdTable->key_begin();
7020 End = IdTable->key_end();
7021 }
7022
7023 // We have any identifiers remaining in the current AST file; return
7024 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007025 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00007026 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007027 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00007028}
7029
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007030IdentifierIterator *ASTReader::getIdentifiers() {
7031 if (!loadGlobalIndex())
7032 return GlobalIndex->createIdentifierIterator();
7033
Guy Benyei11169dd2012-12-18 14:30:41 +00007034 return new ASTIdentifierIterator(*this);
7035}
7036
7037namespace clang { namespace serialization {
7038 class ReadMethodPoolVisitor {
7039 ASTReader &Reader;
7040 Selector Sel;
7041 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007042 unsigned InstanceBits;
7043 unsigned FactoryBits;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00007044 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7045 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007046
7047 public:
7048 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
7049 unsigned PriorGeneration)
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007050 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
7051 InstanceBits(0), FactoryBits(0) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00007052
7053 static bool visit(ModuleFile &M, void *UserData) {
7054 ReadMethodPoolVisitor *This
7055 = static_cast<ReadMethodPoolVisitor *>(UserData);
7056
7057 if (!M.SelectorLookupTable)
7058 return false;
7059
7060 // If we've already searched this module file, skip it now.
7061 if (M.Generation <= This->PriorGeneration)
7062 return true;
7063
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007064 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007065 ASTSelectorLookupTable *PoolTable
7066 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7067 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7068 if (Pos == PoolTable->end())
7069 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007070
7071 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007072 ++This->Reader.NumSelectorsRead;
7073 // FIXME: Not quite happy with the statistics here. We probably should
7074 // disable this tracking when called via LoadSelector.
7075 // Also, should entries without methods count as misses?
7076 ++This->Reader.NumMethodPoolEntriesRead;
7077 ASTSelectorLookupTrait::data_type Data = *Pos;
7078 if (This->Reader.DeserializationListener)
7079 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7080 This->Sel);
7081
7082 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7083 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007084 This->InstanceBits = Data.InstanceBits;
7085 This->FactoryBits = Data.FactoryBits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007086 return true;
7087 }
7088
7089 /// \brief Retrieve the instance methods found by this visitor.
7090 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7091 return InstanceMethods;
7092 }
7093
7094 /// \brief Retrieve the instance methods found by this visitor.
7095 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7096 return FactoryMethods;
7097 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007098
7099 unsigned getInstanceBits() const { return InstanceBits; }
7100 unsigned getFactoryBits() const { return FactoryBits; }
Guy Benyei11169dd2012-12-18 14:30:41 +00007101 };
7102} } // end namespace clang::serialization
7103
7104/// \brief Add the given set of methods to the method list.
7105static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7106 ObjCMethodList &List) {
7107 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7108 S.addMethodToGlobalList(&List, Methods[I]);
7109 }
7110}
7111
7112void ASTReader::ReadMethodPool(Selector Sel) {
7113 // Get the selector generation and update it to the current generation.
7114 unsigned &Generation = SelectorGeneration[Sel];
7115 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00007116 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00007117
7118 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007119 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007120 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7121 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7122
7123 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007124 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00007125 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007126
7127 ++NumMethodPoolHits;
7128
Guy Benyei11169dd2012-12-18 14:30:41 +00007129 if (!getSema())
7130 return;
7131
7132 Sema &S = *getSema();
7133 Sema::GlobalMethodPool::iterator Pos
7134 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7135
7136 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7137 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007138 Pos->second.first.setBits(Visitor.getInstanceBits());
7139 Pos->second.second.setBits(Visitor.getFactoryBits());
Guy Benyei11169dd2012-12-18 14:30:41 +00007140}
7141
7142void ASTReader::ReadKnownNamespaces(
7143 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7144 Namespaces.clear();
7145
7146 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7147 if (NamespaceDecl *Namespace
7148 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7149 Namespaces.push_back(Namespace);
7150 }
7151}
7152
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007153void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007154 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007155 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7156 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007157 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007158 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007159 Undefined.insert(std::make_pair(D, Loc));
7160 }
7161}
Nick Lewycky8334af82013-01-26 00:35:08 +00007162
Guy Benyei11169dd2012-12-18 14:30:41 +00007163void ASTReader::ReadTentativeDefinitions(
7164 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7165 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7166 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7167 if (Var)
7168 TentativeDefs.push_back(Var);
7169 }
7170 TentativeDefinitions.clear();
7171}
7172
7173void ASTReader::ReadUnusedFileScopedDecls(
7174 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7175 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7176 DeclaratorDecl *D
7177 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7178 if (D)
7179 Decls.push_back(D);
7180 }
7181 UnusedFileScopedDecls.clear();
7182}
7183
7184void ASTReader::ReadDelegatingConstructors(
7185 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7186 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7187 CXXConstructorDecl *D
7188 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7189 if (D)
7190 Decls.push_back(D);
7191 }
7192 DelegatingCtorDecls.clear();
7193}
7194
7195void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7196 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7197 TypedefNameDecl *D
7198 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7199 if (D)
7200 Decls.push_back(D);
7201 }
7202 ExtVectorDecls.clear();
7203}
7204
7205void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
7206 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
7207 CXXRecordDecl *D
7208 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
7209 if (D)
7210 Decls.push_back(D);
7211 }
7212 DynamicClasses.clear();
7213}
7214
Nico Weber72889432014-09-06 01:25:55 +00007215void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7216 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7217 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7218 ++I) {
7219 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7220 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7221 if (D)
7222 Decls.insert(D);
7223 }
7224 UnusedLocalTypedefNameCandidates.clear();
7225}
7226
Guy Benyei11169dd2012-12-18 14:30:41 +00007227void
Richard Smith78165b52013-01-10 23:43:47 +00007228ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7229 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7230 NamedDecl *D
7231 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00007232 if (D)
7233 Decls.push_back(D);
7234 }
Richard Smith78165b52013-01-10 23:43:47 +00007235 LocallyScopedExternCDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007236}
7237
7238void ASTReader::ReadReferencedSelectors(
7239 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7240 if (ReferencedSelectorsData.empty())
7241 return;
7242
7243 // If there are @selector references added them to its pool. This is for
7244 // implementation of -Wselector.
7245 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7246 unsigned I = 0;
7247 while (I < DataSize) {
7248 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7249 SourceLocation SelLoc
7250 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7251 Sels.push_back(std::make_pair(Sel, SelLoc));
7252 }
7253 ReferencedSelectorsData.clear();
7254}
7255
7256void ASTReader::ReadWeakUndeclaredIdentifiers(
7257 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7258 if (WeakUndeclaredIdentifiers.empty())
7259 return;
7260
7261 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7262 IdentifierInfo *WeakId
7263 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7264 IdentifierInfo *AliasId
7265 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7266 SourceLocation Loc
7267 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7268 bool Used = WeakUndeclaredIdentifiers[I++];
7269 WeakInfo WI(AliasId, Loc);
7270 WI.setUsed(Used);
7271 WeakIDs.push_back(std::make_pair(WeakId, WI));
7272 }
7273 WeakUndeclaredIdentifiers.clear();
7274}
7275
7276void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7277 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7278 ExternalVTableUse VT;
7279 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7280 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7281 VT.DefinitionRequired = VTableUses[Idx++];
7282 VTables.push_back(VT);
7283 }
7284
7285 VTableUses.clear();
7286}
7287
7288void ASTReader::ReadPendingInstantiations(
7289 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7290 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7291 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7292 SourceLocation Loc
7293 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7294
7295 Pending.push_back(std::make_pair(D, Loc));
7296 }
7297 PendingInstantiations.clear();
7298}
7299
Richard Smithe40f2ba2013-08-07 21:41:30 +00007300void ASTReader::ReadLateParsedTemplates(
7301 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7302 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7303 /* In loop */) {
7304 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7305
7306 LateParsedTemplate *LT = new LateParsedTemplate;
7307 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7308
7309 ModuleFile *F = getOwningModuleFile(LT->D);
7310 assert(F && "No module");
7311
7312 unsigned TokN = LateParsedTemplates[Idx++];
7313 LT->Toks.reserve(TokN);
7314 for (unsigned T = 0; T < TokN; ++T)
7315 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7316
7317 LPTMap[FD] = LT;
7318 }
7319
7320 LateParsedTemplates.clear();
7321}
7322
Guy Benyei11169dd2012-12-18 14:30:41 +00007323void ASTReader::LoadSelector(Selector Sel) {
7324 // It would be complicated to avoid reading the methods anyway. So don't.
7325 ReadMethodPool(Sel);
7326}
7327
7328void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7329 assert(ID && "Non-zero identifier ID required");
7330 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7331 IdentifiersLoaded[ID - 1] = II;
7332 if (DeserializationListener)
7333 DeserializationListener->IdentifierRead(ID, II);
7334}
7335
7336/// \brief Set the globally-visible declarations associated with the given
7337/// identifier.
7338///
7339/// If the AST reader is currently in a state where the given declaration IDs
7340/// cannot safely be resolved, they are queued until it is safe to resolve
7341/// them.
7342///
7343/// \param II an IdentifierInfo that refers to one or more globally-visible
7344/// declarations.
7345///
7346/// \param DeclIDs the set of declaration IDs with the name @p II that are
7347/// visible at global scope.
7348///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007349/// \param Decls if non-null, this vector will be populated with the set of
7350/// deserialized declarations. These declarations will not be pushed into
7351/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007352void
7353ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7354 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007355 SmallVectorImpl<Decl *> *Decls) {
7356 if (NumCurrentElementsDeserializing && !Decls) {
7357 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007358 return;
7359 }
7360
7361 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00007362 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007363 // Queue this declaration so that it will be added to the
7364 // translation unit scope and identifier's declaration chain
7365 // once a Sema object is known.
Ben Langmuir5418f402014-09-10 21:29:41 +00007366 PreloadedDeclIDs.push_back(DeclIDs[I]);
7367 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00007368 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007369
7370 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7371
7372 // If we're simply supposed to record the declarations, do so now.
7373 if (Decls) {
7374 Decls->push_back(D);
7375 continue;
7376 }
7377
7378 // Introduce this declaration into the translation-unit scope
7379 // and add it to the declaration chain for this identifier, so
7380 // that (unqualified) name lookup will find it.
7381 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007382 }
7383}
7384
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007385IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007386 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007387 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007388
7389 if (IdentifiersLoaded.empty()) {
7390 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007391 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007392 }
7393
7394 ID -= 1;
7395 if (!IdentifiersLoaded[ID]) {
7396 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7397 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7398 ModuleFile *M = I->second;
7399 unsigned Index = ID - M->BaseIdentifierID;
7400 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7401
7402 // All of the strings in the AST file are preceded by a 16-bit length.
7403 // Extract that 16-bit length to avoid having to execute strlen().
7404 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7405 // unsigned integers. This is important to avoid integer overflow when
7406 // we cast them to 'unsigned'.
7407 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7408 unsigned StrLen = (((unsigned) StrLenPtr[0])
7409 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007410 IdentifiersLoaded[ID]
7411 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007412 if (DeserializationListener)
7413 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7414 }
7415
7416 return IdentifiersLoaded[ID];
7417}
7418
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007419IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7420 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007421}
7422
7423IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7424 if (LocalID < NUM_PREDEF_IDENT_IDS)
7425 return LocalID;
7426
7427 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7428 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7429 assert(I != M.IdentifierRemap.end()
7430 && "Invalid index into identifier index remap");
7431
7432 return LocalID + I->second;
7433}
7434
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007435MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007436 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007437 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007438
7439 if (MacrosLoaded.empty()) {
7440 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007441 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007442 }
7443
7444 ID -= NUM_PREDEF_MACRO_IDS;
7445 if (!MacrosLoaded[ID]) {
7446 GlobalMacroMapType::iterator I
7447 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7448 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7449 ModuleFile *M = I->second;
7450 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007451 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7452
7453 if (DeserializationListener)
7454 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7455 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007456 }
7457
7458 return MacrosLoaded[ID];
7459}
7460
7461MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7462 if (LocalID < NUM_PREDEF_MACRO_IDS)
7463 return LocalID;
7464
7465 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7466 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7467 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7468
7469 return LocalID + I->second;
7470}
7471
7472serialization::SubmoduleID
7473ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7474 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7475 return LocalID;
7476
7477 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7478 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7479 assert(I != M.SubmoduleRemap.end()
7480 && "Invalid index into submodule index remap");
7481
7482 return LocalID + I->second;
7483}
7484
7485Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7486 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7487 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007488 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007489 }
7490
7491 if (GlobalID > SubmodulesLoaded.size()) {
7492 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007493 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007494 }
7495
7496 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7497}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007498
7499Module *ASTReader::getModule(unsigned ID) {
7500 return getSubmodule(ID);
7501}
7502
Guy Benyei11169dd2012-12-18 14:30:41 +00007503Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7504 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7505}
7506
7507Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7508 if (ID == 0)
7509 return Selector();
7510
7511 if (ID > SelectorsLoaded.size()) {
7512 Error("selector ID out of range in AST file");
7513 return Selector();
7514 }
7515
Craig Toppera13603a2014-05-22 05:54:18 +00007516 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007517 // Load this selector from the selector table.
7518 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7519 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7520 ModuleFile &M = *I->second;
7521 ASTSelectorLookupTrait Trait(*this, M);
7522 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7523 SelectorsLoaded[ID - 1] =
7524 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7525 if (DeserializationListener)
7526 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7527 }
7528
7529 return SelectorsLoaded[ID - 1];
7530}
7531
7532Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7533 return DecodeSelector(ID);
7534}
7535
7536uint32_t ASTReader::GetNumExternalSelectors() {
7537 // ID 0 (the null selector) is considered an external selector.
7538 return getTotalNumSelectors() + 1;
7539}
7540
7541serialization::SelectorID
7542ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7543 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7544 return LocalID;
7545
7546 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7547 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7548 assert(I != M.SelectorRemap.end()
7549 && "Invalid index into selector index remap");
7550
7551 return LocalID + I->second;
7552}
7553
7554DeclarationName
7555ASTReader::ReadDeclarationName(ModuleFile &F,
7556 const RecordData &Record, unsigned &Idx) {
7557 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7558 switch (Kind) {
7559 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007560 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007561
7562 case DeclarationName::ObjCZeroArgSelector:
7563 case DeclarationName::ObjCOneArgSelector:
7564 case DeclarationName::ObjCMultiArgSelector:
7565 return DeclarationName(ReadSelector(F, Record, Idx));
7566
7567 case DeclarationName::CXXConstructorName:
7568 return Context.DeclarationNames.getCXXConstructorName(
7569 Context.getCanonicalType(readType(F, Record, Idx)));
7570
7571 case DeclarationName::CXXDestructorName:
7572 return Context.DeclarationNames.getCXXDestructorName(
7573 Context.getCanonicalType(readType(F, Record, Idx)));
7574
7575 case DeclarationName::CXXConversionFunctionName:
7576 return Context.DeclarationNames.getCXXConversionFunctionName(
7577 Context.getCanonicalType(readType(F, Record, Idx)));
7578
7579 case DeclarationName::CXXOperatorName:
7580 return Context.DeclarationNames.getCXXOperatorName(
7581 (OverloadedOperatorKind)Record[Idx++]);
7582
7583 case DeclarationName::CXXLiteralOperatorName:
7584 return Context.DeclarationNames.getCXXLiteralOperatorName(
7585 GetIdentifierInfo(F, Record, Idx));
7586
7587 case DeclarationName::CXXUsingDirective:
7588 return DeclarationName::getUsingDirectiveName();
7589 }
7590
7591 llvm_unreachable("Invalid NameKind!");
7592}
7593
7594void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7595 DeclarationNameLoc &DNLoc,
7596 DeclarationName Name,
7597 const RecordData &Record, unsigned &Idx) {
7598 switch (Name.getNameKind()) {
7599 case DeclarationName::CXXConstructorName:
7600 case DeclarationName::CXXDestructorName:
7601 case DeclarationName::CXXConversionFunctionName:
7602 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7603 break;
7604
7605 case DeclarationName::CXXOperatorName:
7606 DNLoc.CXXOperatorName.BeginOpNameLoc
7607 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7608 DNLoc.CXXOperatorName.EndOpNameLoc
7609 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7610 break;
7611
7612 case DeclarationName::CXXLiteralOperatorName:
7613 DNLoc.CXXLiteralOperatorName.OpNameLoc
7614 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7615 break;
7616
7617 case DeclarationName::Identifier:
7618 case DeclarationName::ObjCZeroArgSelector:
7619 case DeclarationName::ObjCOneArgSelector:
7620 case DeclarationName::ObjCMultiArgSelector:
7621 case DeclarationName::CXXUsingDirective:
7622 break;
7623 }
7624}
7625
7626void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7627 DeclarationNameInfo &NameInfo,
7628 const RecordData &Record, unsigned &Idx) {
7629 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7630 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7631 DeclarationNameLoc DNLoc;
7632 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7633 NameInfo.setInfo(DNLoc);
7634}
7635
7636void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7637 const RecordData &Record, unsigned &Idx) {
7638 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7639 unsigned NumTPLists = Record[Idx++];
7640 Info.NumTemplParamLists = NumTPLists;
7641 if (NumTPLists) {
7642 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7643 for (unsigned i=0; i != NumTPLists; ++i)
7644 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7645 }
7646}
7647
7648TemplateName
7649ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7650 unsigned &Idx) {
7651 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7652 switch (Kind) {
7653 case TemplateName::Template:
7654 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7655
7656 case TemplateName::OverloadedTemplate: {
7657 unsigned size = Record[Idx++];
7658 UnresolvedSet<8> Decls;
7659 while (size--)
7660 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7661
7662 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7663 }
7664
7665 case TemplateName::QualifiedTemplate: {
7666 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7667 bool hasTemplKeyword = Record[Idx++];
7668 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7669 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7670 }
7671
7672 case TemplateName::DependentTemplate: {
7673 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7674 if (Record[Idx++]) // isIdentifier
7675 return Context.getDependentTemplateName(NNS,
7676 GetIdentifierInfo(F, Record,
7677 Idx));
7678 return Context.getDependentTemplateName(NNS,
7679 (OverloadedOperatorKind)Record[Idx++]);
7680 }
7681
7682 case TemplateName::SubstTemplateTemplateParm: {
7683 TemplateTemplateParmDecl *param
7684 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7685 if (!param) return TemplateName();
7686 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7687 return Context.getSubstTemplateTemplateParm(param, replacement);
7688 }
7689
7690 case TemplateName::SubstTemplateTemplateParmPack: {
7691 TemplateTemplateParmDecl *Param
7692 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7693 if (!Param)
7694 return TemplateName();
7695
7696 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7697 if (ArgPack.getKind() != TemplateArgument::Pack)
7698 return TemplateName();
7699
7700 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7701 }
7702 }
7703
7704 llvm_unreachable("Unhandled template name kind!");
7705}
7706
7707TemplateArgument
7708ASTReader::ReadTemplateArgument(ModuleFile &F,
7709 const RecordData &Record, unsigned &Idx) {
7710 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7711 switch (Kind) {
7712 case TemplateArgument::Null:
7713 return TemplateArgument();
7714 case TemplateArgument::Type:
7715 return TemplateArgument(readType(F, Record, Idx));
7716 case TemplateArgument::Declaration: {
7717 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
David Blaikie0f62c8d2014-10-16 04:21:25 +00007718 return TemplateArgument(D, readType(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007719 }
7720 case TemplateArgument::NullPtr:
7721 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7722 case TemplateArgument::Integral: {
7723 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7724 QualType T = readType(F, Record, Idx);
7725 return TemplateArgument(Context, Value, T);
7726 }
7727 case TemplateArgument::Template:
7728 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7729 case TemplateArgument::TemplateExpansion: {
7730 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007731 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007732 if (unsigned NumExpansions = Record[Idx++])
7733 NumTemplateExpansions = NumExpansions - 1;
7734 return TemplateArgument(Name, NumTemplateExpansions);
7735 }
7736 case TemplateArgument::Expression:
7737 return TemplateArgument(ReadExpr(F));
7738 case TemplateArgument::Pack: {
7739 unsigned NumArgs = Record[Idx++];
7740 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7741 for (unsigned I = 0; I != NumArgs; ++I)
7742 Args[I] = ReadTemplateArgument(F, Record, Idx);
7743 return TemplateArgument(Args, NumArgs);
7744 }
7745 }
7746
7747 llvm_unreachable("Unhandled template argument kind!");
7748}
7749
7750TemplateParameterList *
7751ASTReader::ReadTemplateParameterList(ModuleFile &F,
7752 const RecordData &Record, unsigned &Idx) {
7753 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7754 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7755 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7756
7757 unsigned NumParams = Record[Idx++];
7758 SmallVector<NamedDecl *, 16> Params;
7759 Params.reserve(NumParams);
7760 while (NumParams--)
7761 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7762
7763 TemplateParameterList* TemplateParams =
7764 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7765 Params.data(), Params.size(), RAngleLoc);
7766 return TemplateParams;
7767}
7768
7769void
7770ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007771ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007772 ModuleFile &F, const RecordData &Record,
7773 unsigned &Idx) {
7774 unsigned NumTemplateArgs = Record[Idx++];
7775 TemplArgs.reserve(NumTemplateArgs);
7776 while (NumTemplateArgs--)
7777 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7778}
7779
7780/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007781void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007782 const RecordData &Record, unsigned &Idx) {
7783 unsigned NumDecls = Record[Idx++];
7784 Set.reserve(Context, NumDecls);
7785 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007786 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007787 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007788 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007789 }
7790}
7791
7792CXXBaseSpecifier
7793ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7794 const RecordData &Record, unsigned &Idx) {
7795 bool isVirtual = static_cast<bool>(Record[Idx++]);
7796 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7797 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7798 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7799 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7800 SourceRange Range = ReadSourceRange(F, Record, Idx);
7801 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7802 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7803 EllipsisLoc);
7804 Result.setInheritConstructors(inheritConstructors);
7805 return Result;
7806}
7807
7808std::pair<CXXCtorInitializer **, unsigned>
7809ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7810 unsigned &Idx) {
Craig Toppera13603a2014-05-22 05:54:18 +00007811 CXXCtorInitializer **CtorInitializers = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007812 unsigned NumInitializers = Record[Idx++];
7813 if (NumInitializers) {
7814 CtorInitializers
7815 = new (Context) CXXCtorInitializer*[NumInitializers];
7816 for (unsigned i=0; i != NumInitializers; ++i) {
Craig Toppera13603a2014-05-22 05:54:18 +00007817 TypeSourceInfo *TInfo = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007818 bool IsBaseVirtual = false;
Craig Toppera13603a2014-05-22 05:54:18 +00007819 FieldDecl *Member = nullptr;
7820 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007821
7822 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7823 switch (Type) {
7824 case CTOR_INITIALIZER_BASE:
7825 TInfo = GetTypeSourceInfo(F, Record, Idx);
7826 IsBaseVirtual = Record[Idx++];
7827 break;
7828
7829 case CTOR_INITIALIZER_DELEGATING:
7830 TInfo = GetTypeSourceInfo(F, Record, Idx);
7831 break;
7832
7833 case CTOR_INITIALIZER_MEMBER:
7834 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7835 break;
7836
7837 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7838 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7839 break;
7840 }
7841
7842 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7843 Expr *Init = ReadExpr(F);
7844 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7845 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7846 bool IsWritten = Record[Idx++];
7847 unsigned SourceOrderOrNumArrayIndices;
7848 SmallVector<VarDecl *, 8> Indices;
7849 if (IsWritten) {
7850 SourceOrderOrNumArrayIndices = Record[Idx++];
7851 } else {
7852 SourceOrderOrNumArrayIndices = Record[Idx++];
7853 Indices.reserve(SourceOrderOrNumArrayIndices);
7854 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7855 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7856 }
7857
7858 CXXCtorInitializer *BOMInit;
7859 if (Type == CTOR_INITIALIZER_BASE) {
7860 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7861 LParenLoc, Init, RParenLoc,
7862 MemberOrEllipsisLoc);
7863 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7864 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7865 Init, RParenLoc);
7866 } else if (IsWritten) {
7867 if (Member)
7868 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7869 LParenLoc, Init, RParenLoc);
7870 else
7871 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7872 MemberOrEllipsisLoc, LParenLoc,
7873 Init, RParenLoc);
7874 } else {
Argyrios Kyrtzidis794671d2013-05-30 23:59:46 +00007875 if (IndirectMember) {
7876 assert(Indices.empty() && "Indirect field improperly initialized");
7877 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7878 MemberOrEllipsisLoc, LParenLoc,
7879 Init, RParenLoc);
7880 } else {
7881 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7882 LParenLoc, Init, RParenLoc,
7883 Indices.data(), Indices.size());
7884 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007885 }
7886
7887 if (IsWritten)
7888 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7889 CtorInitializers[i] = BOMInit;
7890 }
7891 }
7892
7893 return std::make_pair(CtorInitializers, NumInitializers);
7894}
7895
7896NestedNameSpecifier *
7897ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7898 const RecordData &Record, unsigned &Idx) {
7899 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00007900 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007901 for (unsigned I = 0; I != N; ++I) {
7902 NestedNameSpecifier::SpecifierKind Kind
7903 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7904 switch (Kind) {
7905 case NestedNameSpecifier::Identifier: {
7906 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7907 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7908 break;
7909 }
7910
7911 case NestedNameSpecifier::Namespace: {
7912 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7913 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7914 break;
7915 }
7916
7917 case NestedNameSpecifier::NamespaceAlias: {
7918 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7919 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7920 break;
7921 }
7922
7923 case NestedNameSpecifier::TypeSpec:
7924 case NestedNameSpecifier::TypeSpecWithTemplate: {
7925 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7926 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00007927 return nullptr;
7928
Guy Benyei11169dd2012-12-18 14:30:41 +00007929 bool Template = Record[Idx++];
7930 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
7931 break;
7932 }
7933
7934 case NestedNameSpecifier::Global: {
7935 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
7936 // No associated value, and there can't be a prefix.
7937 break;
7938 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00007939
7940 case NestedNameSpecifier::Super: {
7941 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
7942 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
7943 break;
7944 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007945 }
7946 Prev = NNS;
7947 }
7948 return NNS;
7949}
7950
7951NestedNameSpecifierLoc
7952ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
7953 unsigned &Idx) {
7954 unsigned N = Record[Idx++];
7955 NestedNameSpecifierLocBuilder Builder;
7956 for (unsigned I = 0; I != N; ++I) {
7957 NestedNameSpecifier::SpecifierKind Kind
7958 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7959 switch (Kind) {
7960 case NestedNameSpecifier::Identifier: {
7961 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7962 SourceRange Range = ReadSourceRange(F, Record, Idx);
7963 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
7964 break;
7965 }
7966
7967 case NestedNameSpecifier::Namespace: {
7968 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7969 SourceRange Range = ReadSourceRange(F, Record, Idx);
7970 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
7971 break;
7972 }
7973
7974 case NestedNameSpecifier::NamespaceAlias: {
7975 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7976 SourceRange Range = ReadSourceRange(F, Record, Idx);
7977 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
7978 break;
7979 }
7980
7981 case NestedNameSpecifier::TypeSpec:
7982 case NestedNameSpecifier::TypeSpecWithTemplate: {
7983 bool Template = Record[Idx++];
7984 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
7985 if (!T)
7986 return NestedNameSpecifierLoc();
7987 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7988
7989 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
7990 Builder.Extend(Context,
7991 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
7992 T->getTypeLoc(), ColonColonLoc);
7993 break;
7994 }
7995
7996 case NestedNameSpecifier::Global: {
7997 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7998 Builder.MakeGlobal(Context, ColonColonLoc);
7999 break;
8000 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008001
8002 case NestedNameSpecifier::Super: {
8003 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8004 SourceRange Range = ReadSourceRange(F, Record, Idx);
8005 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8006 break;
8007 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008008 }
8009 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008010
Guy Benyei11169dd2012-12-18 14:30:41 +00008011 return Builder.getWithLocInContext(Context);
8012}
8013
8014SourceRange
8015ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8016 unsigned &Idx) {
8017 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8018 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8019 return SourceRange(beg, end);
8020}
8021
8022/// \brief Read an integral value
8023llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8024 unsigned BitWidth = Record[Idx++];
8025 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8026 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8027 Idx += NumWords;
8028 return Result;
8029}
8030
8031/// \brief Read a signed integral value
8032llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8033 bool isUnsigned = Record[Idx++];
8034 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8035}
8036
8037/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00008038llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8039 const llvm::fltSemantics &Sem,
8040 unsigned &Idx) {
8041 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00008042}
8043
8044// \brief Read a string
8045std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8046 unsigned Len = Record[Idx++];
8047 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8048 Idx += Len;
8049 return Result;
8050}
8051
Richard Smith1d21a072014-12-05 02:33:27 +00008052std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8053 unsigned &Idx) {
8054 std::string Filename = ReadString(Record, Idx);
8055 ResolveImportedPath(F, Filename);
8056 return Filename;
8057}
8058
Guy Benyei11169dd2012-12-18 14:30:41 +00008059VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8060 unsigned &Idx) {
8061 unsigned Major = Record[Idx++];
8062 unsigned Minor = Record[Idx++];
8063 unsigned Subminor = Record[Idx++];
8064 if (Minor == 0)
8065 return VersionTuple(Major);
8066 if (Subminor == 0)
8067 return VersionTuple(Major, Minor - 1);
8068 return VersionTuple(Major, Minor - 1, Subminor - 1);
8069}
8070
8071CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8072 const RecordData &Record,
8073 unsigned &Idx) {
8074 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8075 return CXXTemporary::Create(Context, Decl);
8076}
8077
8078DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008079 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008080}
8081
8082DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8083 return Diags.Report(Loc, DiagID);
8084}
8085
8086/// \brief Retrieve the identifier table associated with the
8087/// preprocessor.
8088IdentifierTable &ASTReader::getIdentifierTable() {
8089 return PP.getIdentifierTable();
8090}
8091
8092/// \brief Record that the given ID maps to the given switch-case
8093/// statement.
8094void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008095 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008096 "Already have a SwitchCase with this ID");
8097 (*CurrSwitchCaseStmts)[ID] = SC;
8098}
8099
8100/// \brief Retrieve the switch-case statement with the given ID.
8101SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008102 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008103 return (*CurrSwitchCaseStmts)[ID];
8104}
8105
8106void ASTReader::ClearSwitchCaseIDs() {
8107 CurrSwitchCaseStmts->clear();
8108}
8109
8110void ASTReader::ReadComments() {
8111 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008112 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00008113 serialization::ModuleFile *> >::iterator
8114 I = CommentsCursors.begin(),
8115 E = CommentsCursors.end();
8116 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008117 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008118 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00008119 serialization::ModuleFile &F = *I->second;
8120 SavedStreamPosition SavedPosition(Cursor);
8121
8122 RecordData Record;
8123 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008124 llvm::BitstreamEntry Entry =
8125 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008126
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008127 switch (Entry.Kind) {
8128 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8129 case llvm::BitstreamEntry::Error:
8130 Error("malformed block record in AST file");
8131 return;
8132 case llvm::BitstreamEntry::EndBlock:
8133 goto NextCursor;
8134 case llvm::BitstreamEntry::Record:
8135 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00008136 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008137 }
8138
8139 // Read a record.
8140 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00008141 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008142 case COMMENTS_RAW_COMMENT: {
8143 unsigned Idx = 0;
8144 SourceRange SR = ReadSourceRange(F, Record, Idx);
8145 RawComment::CommentKind Kind =
8146 (RawComment::CommentKind) Record[Idx++];
8147 bool IsTrailingComment = Record[Idx++];
8148 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00008149 Comments.push_back(new (Context) RawComment(
8150 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8151 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00008152 break;
8153 }
8154 }
8155 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008156 NextCursor:
8157 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00008158 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008159}
8160
Argyrios Kyrtzidis1bde1172014-11-18 05:24:18 +00008161void ASTReader::getInputFiles(ModuleFile &F,
8162 SmallVectorImpl<serialization::InputFile> &Files) {
8163 for (unsigned I = 0, E = F.InputFilesLoaded.size(); I != E; ++I) {
8164 unsigned ID = I+1;
8165 Files.push_back(getInputFile(F, ID));
8166 }
8167}
8168
Richard Smithcd45dbc2014-04-19 03:48:30 +00008169std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8170 // If we know the owning module, use it.
8171 if (Module *M = D->getOwningModule())
8172 return M->getFullModuleName();
8173
8174 // Otherwise, use the name of the top-level module the decl is within.
8175 if (ModuleFile *M = getOwningModuleFile(D))
8176 return M->ModuleName;
8177
8178 // Not from a module.
8179 return "";
8180}
8181
Guy Benyei11169dd2012-12-18 14:30:41 +00008182void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008183 while (!PendingIdentifierInfos.empty() ||
8184 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008185 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008186 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008187 // If any identifiers with corresponding top-level declarations have
8188 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008189 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8190 TopLevelDeclsMap;
8191 TopLevelDeclsMap TopLevelDecls;
8192
Guy Benyei11169dd2012-12-18 14:30:41 +00008193 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008194 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008195 SmallVector<uint32_t, 4> DeclIDs =
8196 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008197 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008198
8199 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008200 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008201
Richard Smith851072e2014-05-19 20:59:20 +00008202 // For each decl chain that we wanted to complete while deserializing, mark
8203 // it as "still needs to be completed".
8204 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8205 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8206 }
8207 PendingIncompleteDeclChains.clear();
8208
Guy Benyei11169dd2012-12-18 14:30:41 +00008209 // Load pending declaration chains.
8210 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
8211 loadPendingDeclChain(PendingDeclChains[I]);
8212 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8213 }
8214 PendingDeclChains.clear();
8215
Douglas Gregor6168bd22013-02-18 15:53:43 +00008216 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008217 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8218 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008219 IdentifierInfo *II = TLD->first;
8220 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008221 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008222 }
8223 }
8224
Guy Benyei11169dd2012-12-18 14:30:41 +00008225 // Load any pending macro definitions.
8226 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008227 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8228 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8229 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8230 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008231 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008232 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008233 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008234 if (Info.M->Kind != MK_ImplicitModule &&
8235 Info.M->Kind != MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008236 resolvePendingMacro(II, Info);
8237 }
8238 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008239 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008240 ++IDIdx) {
8241 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008242 if (Info.M->Kind == MK_ImplicitModule ||
8243 Info.M->Kind == MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008244 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008245 }
8246 }
8247 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008248
8249 // Wire up the DeclContexts for Decls that we delayed setting until
8250 // recursive loading is completed.
8251 while (!PendingDeclContextInfos.empty()) {
8252 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8253 PendingDeclContextInfos.pop_front();
8254 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8255 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8256 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8257 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008258
Richard Smithd1c46742014-04-30 02:24:17 +00008259 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008260 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008261 auto Update = PendingUpdateRecords.pop_back_val();
8262 ReadingKindTracker ReadingKind(Read_Decl, *this);
8263 loadDeclUpdateRecords(Update.first, Update.second);
8264 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008265 }
8266
8267 // If we deserialized any C++ or Objective-C class definitions, any
8268 // Objective-C protocol definitions, or any redeclarable templates, make sure
8269 // that all redeclarations point to the definitions. Note that this can only
8270 // happen now, after the redeclaration chains have been fully wired.
Craig Topperc6914d02014-08-25 04:15:02 +00008271 for (Decl *D : PendingDefinitions) {
8272 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008273 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008274 // Make sure that the TagType points at the definition.
8275 const_cast<TagType*>(TagT)->decl = TD;
8276 }
8277
Craig Topperc6914d02014-08-25 04:15:02 +00008278 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith2c381642014-08-27 23:11:59 +00008279 for (auto R : RD->redecls()) {
8280 assert((R == D) == R->isThisDeclarationADefinition() &&
8281 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00008282 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00008283 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008284 }
8285
8286 continue;
8287 }
8288
Craig Topperc6914d02014-08-25 04:15:02 +00008289 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008290 // Make sure that the ObjCInterfaceType points at the definition.
8291 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8292 ->Decl = ID;
8293
Aaron Ballman86c93902014-03-06 23:45:36 +00008294 for (auto R : ID->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008295 R->Data = ID->Data;
8296
8297 continue;
8298 }
8299
Craig Topperc6914d02014-08-25 04:15:02 +00008300 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Aaron Ballman86c93902014-03-06 23:45:36 +00008301 for (auto R : PD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008302 R->Data = PD->Data;
8303
8304 continue;
8305 }
8306
Craig Topperc6914d02014-08-25 04:15:02 +00008307 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Aaron Ballman86c93902014-03-06 23:45:36 +00008308 for (auto R : RTD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008309 R->Common = RTD->Common;
8310 }
8311 PendingDefinitions.clear();
8312
8313 // Load the bodies of any functions or methods we've encountered. We do
8314 // this now (delayed) so that we can be sure that the declaration chains
8315 // have been fully wired up.
8316 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8317 PBEnd = PendingBodies.end();
8318 PB != PBEnd; ++PB) {
8319 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8320 // FIXME: Check for =delete/=default?
8321 // FIXME: Complain about ODR violations here?
8322 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8323 FD->setLazyBody(PB->second);
8324 continue;
8325 }
8326
8327 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8328 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8329 MD->setLazyBody(PB->second);
8330 }
8331 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008332}
8333
8334void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008335 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8336 return;
8337
Richard Smitha0ce9c42014-07-29 23:23:27 +00008338 // Trigger the import of the full definition of each class that had any
8339 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008340 // These updates may in turn find and diagnose some ODR failures, so take
8341 // ownership of the set first.
8342 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8343 PendingOdrMergeFailures.clear();
8344 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008345 Merge.first->buildLookup();
8346 Merge.first->decls_begin();
8347 Merge.first->bases_begin();
8348 Merge.first->vbases_begin();
8349 for (auto *RD : Merge.second) {
8350 RD->decls_begin();
8351 RD->bases_begin();
8352 RD->vbases_begin();
8353 }
8354 }
8355
8356 // For each declaration from a merged context, check that the canonical
8357 // definition of that context also contains a declaration of the same
8358 // entity.
8359 //
8360 // Caution: this loop does things that might invalidate iterators into
8361 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8362 while (!PendingOdrMergeChecks.empty()) {
8363 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8364
8365 // FIXME: Skip over implicit declarations for now. This matters for things
8366 // like implicitly-declared special member functions. This isn't entirely
8367 // correct; we can end up with multiple unmerged declarations of the same
8368 // implicit entity.
8369 if (D->isImplicit())
8370 continue;
8371
8372 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008373
8374 bool Found = false;
8375 const Decl *DCanon = D->getCanonicalDecl();
8376
Richard Smith01bdb7a2014-08-28 05:44:07 +00008377 for (auto RI : D->redecls()) {
8378 if (RI->getLexicalDeclContext() == CanonDef) {
8379 Found = true;
8380 break;
8381 }
8382 }
8383 if (Found)
8384 continue;
8385
Richard Smitha0ce9c42014-07-29 23:23:27 +00008386 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith01bdb7a2014-08-28 05:44:07 +00008387 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
Richard Smitha0ce9c42014-07-29 23:23:27 +00008388 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8389 !Found && I != E; ++I) {
8390 for (auto RI : (*I)->redecls()) {
8391 if (RI->getLexicalDeclContext() == CanonDef) {
8392 // This declaration is present in the canonical definition. If it's
8393 // in the same redecl chain, it's the one we're looking for.
8394 if (RI->getCanonicalDecl() == DCanon)
8395 Found = true;
8396 else
8397 Candidates.push_back(cast<NamedDecl>(RI));
8398 break;
8399 }
8400 }
8401 }
8402
8403 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00008404 // The AST doesn't like TagDecls becoming invalid after they've been
8405 // completed. We only really need to mark FieldDecls as invalid here.
8406 if (!isa<TagDecl>(D))
8407 D->setInvalidDecl();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008408
8409 std::string CanonDefModule =
8410 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8411 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8412 << D << getOwningModuleNameForDiagnostic(D)
8413 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8414
8415 if (Candidates.empty())
8416 Diag(cast<Decl>(CanonDef)->getLocation(),
8417 diag::note_module_odr_violation_no_possible_decls) << D;
8418 else {
8419 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8420 Diag(Candidates[I]->getLocation(),
8421 diag::note_module_odr_violation_possible_decl)
8422 << Candidates[I];
8423 }
8424
8425 DiagnosedOdrMergeFailures.insert(CanonDef);
8426 }
8427 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008428
8429 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008430 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008431 // If we've already pointed out a specific problem with this class, don't
8432 // bother issuing a general "something's different" diagnostic.
David Blaikie82e95a32014-11-19 07:49:47 +00008433 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
Richard Smithcd45dbc2014-04-19 03:48:30 +00008434 continue;
8435
8436 bool Diagnosed = false;
8437 for (auto *RD : Merge.second) {
8438 // Multiple different declarations got merged together; tell the user
8439 // where they came from.
8440 if (Merge.first != RD) {
8441 // FIXME: Walk the definition, figure out what's different,
8442 // and diagnose that.
8443 if (!Diagnosed) {
8444 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8445 Diag(Merge.first->getLocation(),
8446 diag::err_module_odr_violation_different_definitions)
8447 << Merge.first << Module.empty() << Module;
8448 Diagnosed = true;
8449 }
8450
8451 Diag(RD->getLocation(),
8452 diag::note_module_odr_violation_different_definitions)
8453 << getOwningModuleNameForDiagnostic(RD);
8454 }
8455 }
8456
8457 if (!Diagnosed) {
8458 // All definitions are updates to the same declaration. This happens if a
8459 // module instantiates the declaration of a class template specialization
8460 // and two or more other modules instantiate its definition.
8461 //
8462 // FIXME: Indicate which modules had instantiations of this definition.
8463 // FIXME: How can this even happen?
8464 Diag(Merge.first->getLocation(),
8465 diag::err_module_odr_violation_different_instantiations)
8466 << Merge.first;
8467 }
8468 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008469}
8470
8471void ASTReader::FinishedDeserializing() {
8472 assert(NumCurrentElementsDeserializing &&
8473 "FinishedDeserializing not paired with StartedDeserializing");
8474 if (NumCurrentElementsDeserializing == 1) {
8475 // We decrease NumCurrentElementsDeserializing only after pending actions
8476 // are finished, to avoid recursively re-calling finishPendingActions().
8477 finishPendingActions();
8478 }
8479 --NumCurrentElementsDeserializing;
8480
Richard Smitha0ce9c42014-07-29 23:23:27 +00008481 if (NumCurrentElementsDeserializing == 0) {
8482 diagnoseOdrViolations();
8483
Richard Smith04d05b52014-03-23 00:27:18 +00008484 // We are not in recursive loading, so it's safe to pass the "interesting"
8485 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008486 if (Consumer)
8487 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008488 }
8489}
8490
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008491void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Rafael Espindola7b56f6c2013-10-19 16:55:03 +00008492 D = D->getMostRecentDecl();
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008493
8494 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8495 SemaObj->TUScope->AddDecl(D);
8496 } else if (SemaObj->TUScope) {
8497 // Adding the decl to IdResolver may have failed because it was already in
8498 // (even though it was not added in scope). If it is already in, make sure
8499 // it gets in the scope as well.
8500 if (std::find(SemaObj->IdResolver.begin(Name),
8501 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8502 SemaObj->TUScope->AddDecl(D);
8503 }
8504}
8505
Nico Weber824285e2014-05-08 04:26:47 +00008506ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8507 bool DisableValidation, bool AllowASTWithCompilerErrors,
8508 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008509 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008510 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008511 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008512 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8513 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8514 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8515 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008516 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8517 AllowConfigurationMismatch(AllowConfigurationMismatch),
8518 ValidateSystemInputs(ValidateSystemInputs),
8519 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008520 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008521 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8522 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8523 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8524 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8525 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8526 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8527 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8528 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8529 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8530 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8531 ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008532 SourceMgr.setExternalSLocEntrySource(this);
8533}
8534
8535ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008536 if (OwnsDeserializationListener)
8537 delete DeserializationListener;
8538
Guy Benyei11169dd2012-12-18 14:30:41 +00008539 for (DeclContextVisibleUpdatesPending::iterator
8540 I = PendingVisibleUpdates.begin(),
8541 E = PendingVisibleUpdates.end();
8542 I != E; ++I) {
8543 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8544 F = I->second.end();
8545 J != F; ++J)
8546 delete J->first;
8547 }
8548}