blob: da5a0e68e93aa388f6015339a58dfb0372d772f1 [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(
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000111 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
112 bool Complain) {
113 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
114 Complain) ||
115 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
116 Complain);
Ben Langmuircb69b572014-03-07 06:40:32 +0000117}
118bool ChainedASTReaderListener::ReadPreprocessorOptions(
119 const PreprocessorOptions &PPOpts, bool Complain,
120 std::string &SuggestedPredefines) {
121 return First->ReadPreprocessorOptions(PPOpts, Complain,
122 SuggestedPredefines) ||
123 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
124}
125void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
126 unsigned Value) {
127 First->ReadCounter(M, Value);
128 Second->ReadCounter(M, Value);
129}
130bool ChainedASTReaderListener::needsInputFileVisitation() {
131 return First->needsInputFileVisitation() ||
132 Second->needsInputFileVisitation();
133}
134bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
135 return First->needsSystemInputFileVisitation() ||
136 Second->needsSystemInputFileVisitation();
137}
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000138void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
139 First->visitModuleFile(Filename);
140 Second->visitModuleFile(Filename);
141}
Ben Langmuircb69b572014-03-07 06:40:32 +0000142bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +0000143 bool isSystem,
144 bool isOverridden) {
Justin Bognerc65a66d2014-05-22 06:04:59 +0000145 bool Continue = false;
146 if (First->needsInputFileVisitation() &&
147 (!isSystem || First->needsSystemInputFileVisitation()))
148 Continue |= First->visitInputFile(Filename, isSystem, isOverridden);
149 if (Second->needsInputFileVisitation() &&
150 (!isSystem || Second->needsSystemInputFileVisitation()))
151 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden);
152 return Continue;
Ben Langmuircb69b572014-03-07 06:40:32 +0000153}
154
Guy Benyei11169dd2012-12-18 14:30:41 +0000155//===----------------------------------------------------------------------===//
156// PCH validator implementation
157//===----------------------------------------------------------------------===//
158
159ASTReaderListener::~ASTReaderListener() {}
160
161/// \brief Compare the given set of language options against an existing set of
162/// language options.
163///
164/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000165/// \param AllowCompatibleDifferences If true, differences between compatible
166/// language options will be permitted.
Guy Benyei11169dd2012-12-18 14:30:41 +0000167///
168/// \returns true if the languagae options mis-match, false otherwise.
169static bool checkLanguageOptions(const LangOptions &LangOpts,
170 const LangOptions &ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000171 DiagnosticsEngine *Diags,
172 bool AllowCompatibleDifferences = true) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000173#define LANGOPT(Name, Bits, Default, Description) \
174 if (ExistingLangOpts.Name != LangOpts.Name) { \
175 if (Diags) \
176 Diags->Report(diag::err_pch_langopt_mismatch) \
177 << Description << LangOpts.Name << ExistingLangOpts.Name; \
178 return true; \
179 }
180
181#define VALUE_LANGOPT(Name, Bits, Default, Description) \
182 if (ExistingLangOpts.Name != LangOpts.Name) { \
183 if (Diags) \
184 Diags->Report(diag::err_pch_langopt_value_mismatch) \
185 << Description; \
186 return true; \
187 }
188
189#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
190 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
191 if (Diags) \
192 Diags->Report(diag::err_pch_langopt_value_mismatch) \
193 << Description; \
194 return true; \
195 }
196
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000197#define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
198 if (!AllowCompatibleDifferences) \
199 LANGOPT(Name, Bits, Default, Description)
200
201#define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
202 if (!AllowCompatibleDifferences) \
203 ENUM_LANGOPT(Name, Bits, Default, Description)
204
Guy Benyei11169dd2012-12-18 14:30:41 +0000205#define BENIGN_LANGOPT(Name, Bits, Default, Description)
206#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
207#include "clang/Basic/LangOptions.def"
208
209 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
210 if (Diags)
211 Diags->Report(diag::err_pch_langopt_value_mismatch)
212 << "target Objective-C runtime";
213 return true;
214 }
215
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +0000216 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
217 LangOpts.CommentOpts.BlockCommandNames) {
218 if (Diags)
219 Diags->Report(diag::err_pch_langopt_value_mismatch)
220 << "block command names";
221 return true;
222 }
223
Guy Benyei11169dd2012-12-18 14:30:41 +0000224 return false;
225}
226
227/// \brief Compare the given set of target options against an existing set of
228/// target options.
229///
230/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
231///
232/// \returns true if the target options mis-match, false otherwise.
233static bool checkTargetOptions(const TargetOptions &TargetOpts,
234 const TargetOptions &ExistingTargetOpts,
235 DiagnosticsEngine *Diags) {
236#define CHECK_TARGET_OPT(Field, Name) \
237 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
238 if (Diags) \
239 Diags->Report(diag::err_pch_targetopt_mismatch) \
240 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
241 return true; \
242 }
243
244 CHECK_TARGET_OPT(Triple, "target");
245 CHECK_TARGET_OPT(CPU, "target CPU");
246 CHECK_TARGET_OPT(ABI, "target ABI");
Guy Benyei11169dd2012-12-18 14:30:41 +0000247#undef CHECK_TARGET_OPT
248
249 // Compare feature sets.
250 SmallVector<StringRef, 4> ExistingFeatures(
251 ExistingTargetOpts.FeaturesAsWritten.begin(),
252 ExistingTargetOpts.FeaturesAsWritten.end());
253 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
254 TargetOpts.FeaturesAsWritten.end());
255 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
256 std::sort(ReadFeatures.begin(), ReadFeatures.end());
257
258 unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size();
259 unsigned ReadIdx = 0, ReadN = ReadFeatures.size();
260 while (ExistingIdx < ExistingN && ReadIdx < ReadN) {
261 if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) {
262 ++ExistingIdx;
263 ++ReadIdx;
264 continue;
265 }
266
267 if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) {
268 if (Diags)
269 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
270 << false << ReadFeatures[ReadIdx];
271 return true;
272 }
273
274 if (Diags)
275 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
276 << true << ExistingFeatures[ExistingIdx];
277 return true;
278 }
279
280 if (ExistingIdx < ExistingN) {
281 if (Diags)
282 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
283 << true << ExistingFeatures[ExistingIdx];
284 return true;
285 }
286
287 if (ReadIdx < ReadN) {
288 if (Diags)
289 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
290 << false << ReadFeatures[ReadIdx];
291 return true;
292 }
293
294 return false;
295}
296
297bool
298PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000299 bool Complain,
300 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000301 const LangOptions &ExistingLangOpts = PP.getLangOpts();
302 return checkLanguageOptions(LangOpts, ExistingLangOpts,
Richard Smith1e2cf0d2014-10-31 02:28:58 +0000303 Complain ? &Reader.Diags : nullptr,
304 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +0000305}
306
307bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
308 bool Complain) {
309 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
310 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
Craig Toppera13603a2014-05-22 05:54:18 +0000311 Complain? &Reader.Diags : nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +0000312}
313
314namespace {
315 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
316 MacroDefinitionsMap;
Craig Topper3598eb72013-07-05 04:43:31 +0000317 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
318 DeclsMap;
Guy Benyei11169dd2012-12-18 14:30:41 +0000319}
320
Ben Langmuirb92de022014-04-29 16:25:26 +0000321static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
322 DiagnosticsEngine &Diags,
323 bool Complain) {
324 typedef DiagnosticsEngine::Level Level;
325
326 // Check current mappings for new -Werror mappings, and the stored mappings
327 // for cases that were explicitly mapped to *not* be errors that are now
328 // errors because of options like -Werror.
329 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
330
331 for (DiagnosticsEngine *MappingSource : MappingSources) {
332 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
333 diag::kind DiagID = DiagIDMappingPair.first;
334 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
335 if (CurLevel < DiagnosticsEngine::Error)
336 continue; // not significant
337 Level StoredLevel =
338 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
339 if (StoredLevel < DiagnosticsEngine::Error) {
340 if (Complain)
341 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
342 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
343 return true;
344 }
345 }
346 }
347
348 return false;
349}
350
Alp Tokerac4e8e52014-06-22 21:58:33 +0000351static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
352 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
353 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
354 return true;
355 return Ext >= diag::Severity::Error;
Ben Langmuirb92de022014-04-29 16:25:26 +0000356}
357
358static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
359 DiagnosticsEngine &Diags,
360 bool IsSystem, bool Complain) {
361 // Top-level options
362 if (IsSystem) {
363 if (Diags.getSuppressSystemWarnings())
364 return false;
365 // If -Wsystem-headers was not enabled before, be conservative
366 if (StoredDiags.getSuppressSystemWarnings()) {
367 if (Complain)
368 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
369 return true;
370 }
371 }
372
373 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
374 if (Complain)
375 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
376 return true;
377 }
378
379 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
380 !StoredDiags.getEnableAllWarnings()) {
381 if (Complain)
382 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
383 return true;
384 }
385
386 if (isExtHandlingFromDiagsError(Diags) &&
387 !isExtHandlingFromDiagsError(StoredDiags)) {
388 if (Complain)
389 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
390 return true;
391 }
392
393 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
394}
395
396bool PCHValidator::ReadDiagnosticOptions(
397 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
398 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
399 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
400 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
Alp Tokerf994cef2014-07-05 03:08:06 +0000401 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
Ben Langmuirb92de022014-04-29 16:25:26 +0000402 // This should never fail, because we would have processed these options
403 // before writing them to an ASTFile.
404 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
405
406 ModuleManager &ModuleMgr = Reader.getModuleManager();
407 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
408
409 // If the original import came from a file explicitly generated by the user,
410 // don't check the diagnostic mappings.
411 // FIXME: currently this is approximated by checking whether this is not a
Richard Smithe842a472014-10-22 02:05:46 +0000412 // module import of an implicitly-loaded module file.
Ben Langmuirb92de022014-04-29 16:25:26 +0000413 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
414 // the transitive closure of its imports, since unrelated modules cannot be
415 // imported until after this module finishes validation.
416 ModuleFile *TopImport = *ModuleMgr.rbegin();
417 while (!TopImport->ImportedBy.empty())
418 TopImport = TopImport->ImportedBy[0];
Richard Smithe842a472014-10-22 02:05:46 +0000419 if (TopImport->Kind != MK_ImplicitModule)
Ben Langmuirb92de022014-04-29 16:25:26 +0000420 return false;
421
422 StringRef ModuleName = TopImport->ModuleName;
423 assert(!ModuleName.empty() && "diagnostic options read before module name");
424
425 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
426 assert(M && "missing module");
427
428 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
429 // contains the union of their flags.
430 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
431}
432
Guy Benyei11169dd2012-12-18 14:30:41 +0000433/// \brief Collect the macro definitions provided by the given preprocessor
434/// options.
Craig Toppera13603a2014-05-22 05:54:18 +0000435static void
436collectMacroDefinitions(const PreprocessorOptions &PPOpts,
437 MacroDefinitionsMap &Macros,
438 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000439 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
440 StringRef Macro = PPOpts.Macros[I].first;
441 bool IsUndef = PPOpts.Macros[I].second;
442
443 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
444 StringRef MacroName = MacroPair.first;
445 StringRef MacroBody = MacroPair.second;
446
447 // For an #undef'd macro, we only care about the name.
448 if (IsUndef) {
449 if (MacroNames && !Macros.count(MacroName))
450 MacroNames->push_back(MacroName);
451
452 Macros[MacroName] = std::make_pair("", true);
453 continue;
454 }
455
456 // For a #define'd macro, figure out the actual definition.
457 if (MacroName.size() == Macro.size())
458 MacroBody = "1";
459 else {
460 // Note: GCC drops anything following an end-of-line character.
461 StringRef::size_type End = MacroBody.find_first_of("\n\r");
462 MacroBody = MacroBody.substr(0, End);
463 }
464
465 if (MacroNames && !Macros.count(MacroName))
466 MacroNames->push_back(MacroName);
467 Macros[MacroName] = std::make_pair(MacroBody, false);
468 }
469}
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000470
Guy Benyei11169dd2012-12-18 14:30:41 +0000471/// \brief Check the preprocessor options deserialized from the control block
472/// against the preprocessor options in an existing preprocessor.
473///
474/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
475static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
476 const PreprocessorOptions &ExistingPPOpts,
477 DiagnosticsEngine *Diags,
478 FileManager &FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000479 std::string &SuggestedPredefines,
480 const LangOptions &LangOpts) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000481 // Check macro definitions.
482 MacroDefinitionsMap ASTFileMacros;
483 collectMacroDefinitions(PPOpts, ASTFileMacros);
484 MacroDefinitionsMap ExistingMacros;
485 SmallVector<StringRef, 4> ExistingMacroNames;
486 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
487
488 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
489 // Dig out the macro definition in the existing preprocessor options.
490 StringRef MacroName = ExistingMacroNames[I];
491 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
492
493 // Check whether we know anything about this macro name or not.
494 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
495 = ASTFileMacros.find(MacroName);
496 if (Known == ASTFileMacros.end()) {
497 // FIXME: Check whether this identifier was referenced anywhere in the
498 // AST file. If so, we should reject the AST file. Unfortunately, this
499 // information isn't in the control block. What shall we do about it?
500
501 if (Existing.second) {
502 SuggestedPredefines += "#undef ";
503 SuggestedPredefines += MacroName.str();
504 SuggestedPredefines += '\n';
505 } else {
506 SuggestedPredefines += "#define ";
507 SuggestedPredefines += MacroName.str();
508 SuggestedPredefines += ' ';
509 SuggestedPredefines += Existing.first.str();
510 SuggestedPredefines += '\n';
511 }
512 continue;
513 }
514
515 // If the macro was defined in one but undef'd in the other, we have a
516 // conflict.
517 if (Existing.second != Known->second.second) {
518 if (Diags) {
519 Diags->Report(diag::err_pch_macro_def_undef)
520 << MacroName << Known->second.second;
521 }
522 return true;
523 }
524
525 // If the macro was #undef'd in both, or if the macro bodies are identical,
526 // it's fine.
527 if (Existing.second || Existing.first == Known->second.first)
528 continue;
529
530 // The macro bodies differ; complain.
531 if (Diags) {
532 Diags->Report(diag::err_pch_macro_def_conflict)
533 << MacroName << Known->second.first << Existing.first;
534 }
535 return true;
536 }
537
538 // Check whether we're using predefines.
539 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
540 if (Diags) {
541 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
542 }
543 return true;
544 }
545
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000546 // Detailed record is important since it is used for the module cache hash.
547 if (LangOpts.Modules &&
548 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
549 if (Diags) {
550 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
551 }
552 return true;
553 }
554
Guy Benyei11169dd2012-12-18 14:30:41 +0000555 // Compute the #include and #include_macros lines we need.
556 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
557 StringRef File = ExistingPPOpts.Includes[I];
558 if (File == ExistingPPOpts.ImplicitPCHInclude)
559 continue;
560
561 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
562 != PPOpts.Includes.end())
563 continue;
564
565 SuggestedPredefines += "#include \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000566 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000567 SuggestedPredefines += "\"\n";
568 }
569
570 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
571 StringRef File = ExistingPPOpts.MacroIncludes[I];
572 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
573 File)
574 != PPOpts.MacroIncludes.end())
575 continue;
576
577 SuggestedPredefines += "#__include_macros \"";
Manuel Klimek9af34ae2014-08-12 08:25:57 +0000578 SuggestedPredefines += File;
Guy Benyei11169dd2012-12-18 14:30:41 +0000579 SuggestedPredefines += "\"\n##\n";
580 }
581
582 return false;
583}
584
585bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
586 bool Complain,
587 std::string &SuggestedPredefines) {
588 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
589
590 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
Craig Toppera13603a2014-05-22 05:54:18 +0000591 Complain? &Reader.Diags : nullptr,
Guy Benyei11169dd2012-12-18 14:30:41 +0000592 PP.getFileManager(),
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +0000593 SuggestedPredefines,
594 PP.getLangOpts());
Guy Benyei11169dd2012-12-18 14:30:41 +0000595}
596
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +0000597/// Check the header search options deserialized from the control block
598/// against the header search options in an existing preprocessor.
599///
600/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
601static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
602 StringRef SpecificModuleCachePath,
603 StringRef ExistingModuleCachePath,
604 DiagnosticsEngine *Diags,
605 const LangOptions &LangOpts) {
606 if (LangOpts.Modules) {
607 if (SpecificModuleCachePath != ExistingModuleCachePath) {
608 if (Diags)
609 Diags->Report(diag::err_pch_modulecache_mismatch)
610 << SpecificModuleCachePath << ExistingModuleCachePath;
611 return true;
612 }
613 }
614
615 return false;
616}
617
618bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
619 StringRef SpecificModuleCachePath,
620 bool Complain) {
621 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
622 PP.getHeaderSearchInfo().getModuleCachePath(),
623 Complain ? &Reader.Diags : nullptr,
624 PP.getLangOpts());
625}
626
Guy Benyei11169dd2012-12-18 14:30:41 +0000627void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
628 PP.setCounterValue(Value);
629}
630
631//===----------------------------------------------------------------------===//
632// AST reader implementation
633//===----------------------------------------------------------------------===//
634
Nico Weber824285e2014-05-08 04:26:47 +0000635void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
636 bool TakeOwnership) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000637 DeserializationListener = Listener;
Nico Weber824285e2014-05-08 04:26:47 +0000638 OwnsDeserializationListener = TakeOwnership;
Guy Benyei11169dd2012-12-18 14:30:41 +0000639}
640
641
642
643unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
644 return serialization::ComputeHash(Sel);
645}
646
647
648std::pair<unsigned, unsigned>
649ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000650 using namespace llvm::support;
651 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
652 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000653 return std::make_pair(KeyLen, DataLen);
654}
655
656ASTSelectorLookupTrait::internal_key_type
657ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000658 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000659 SelectorTable &SelTable = Reader.getContext().Selectors;
Justin Bogner57ba0b22014-03-28 22:03:24 +0000660 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
661 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
662 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000663 if (N == 0)
664 return SelTable.getNullarySelector(FirstII);
665 else if (N == 1)
666 return SelTable.getUnarySelector(FirstII);
667
668 SmallVector<IdentifierInfo *, 16> Args;
669 Args.push_back(FirstII);
670 for (unsigned I = 1; I != N; ++I)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000671 Args.push_back(Reader.getLocalIdentifier(
672 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000673
674 return SelTable.getSelector(N, Args.data());
675}
676
677ASTSelectorLookupTrait::data_type
678ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
679 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000680 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000681
682 data_type Result;
683
Justin Bogner57ba0b22014-03-28 22:03:24 +0000684 Result.ID = Reader.getGlobalSelectorID(
685 F, endian::readNext<uint32_t, little, unaligned>(d));
Nico Weberff4b35e2014-12-27 22:14:15 +0000686 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
687 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
688 Result.InstanceBits = FullInstanceBits & 0x3;
689 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
690 Result.FactoryBits = FullFactoryBits & 0x3;
691 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
692 unsigned NumInstanceMethods = FullInstanceBits >> 3;
693 unsigned NumFactoryMethods = FullFactoryBits >> 3;
Guy Benyei11169dd2012-12-18 14:30:41 +0000694
695 // Load instance methods
696 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000697 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
698 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000699 Result.Instance.push_back(Method);
700 }
701
702 // Load factory methods
703 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000704 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
705 F, endian::readNext<uint32_t, little, unaligned>(d)))
Guy Benyei11169dd2012-12-18 14:30:41 +0000706 Result.Factory.push_back(Method);
707 }
708
709 return Result;
710}
711
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000712unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
713 return llvm::HashString(a);
Guy Benyei11169dd2012-12-18 14:30:41 +0000714}
715
716std::pair<unsigned, unsigned>
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000717ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000718 using namespace llvm::support;
719 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
720 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000721 return std::make_pair(KeyLen, DataLen);
722}
723
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000724ASTIdentifierLookupTraitBase::internal_key_type
725ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
Guy Benyei11169dd2012-12-18 14:30:41 +0000726 assert(n >= 2 && d[n-1] == '\0');
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000727 return StringRef((const char*) d, n-1);
Guy Benyei11169dd2012-12-18 14:30:41 +0000728}
729
Douglas Gregordcf25082013-02-11 18:16:18 +0000730/// \brief Whether the given identifier is "interesting".
731static bool isInterestingIdentifier(IdentifierInfo &II) {
732 return II.isPoisoned() ||
733 II.isExtensionToken() ||
734 II.getObjCOrBuiltinID() ||
735 II.hasRevertedTokenIDToIdentifier() ||
736 II.hadMacroDefinition() ||
737 II.getFETokenInfo<void>();
738}
739
Guy Benyei11169dd2012-12-18 14:30:41 +0000740IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
741 const unsigned char* d,
742 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000743 using namespace llvm::support;
744 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000745 bool IsInteresting = RawID & 0x01;
746
747 // Wipe out the "is interesting" bit.
748 RawID = RawID >> 1;
749
750 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
751 if (!IsInteresting) {
752 // For uninteresting identifiers, just build the IdentifierInfo
753 // and associate it with the persistent ID.
754 IdentifierInfo *II = KnownII;
755 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000756 II = &Reader.getIdentifierTable().getOwn(k);
Guy Benyei11169dd2012-12-18 14:30:41 +0000757 KnownII = II;
758 }
759 Reader.SetIdentifierInfo(ID, II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000760 if (!II->isFromAST()) {
761 bool WasInteresting = isInterestingIdentifier(*II);
762 II->setIsFromAST();
763 if (WasInteresting)
764 II->setChangedSinceDeserialization();
765 }
766 Reader.markIdentifierUpToDate(II);
Guy Benyei11169dd2012-12-18 14:30:41 +0000767 return II;
768 }
769
Justin Bogner57ba0b22014-03-28 22:03:24 +0000770 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
771 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000772 bool CPlusPlusOperatorKeyword = Bits & 0x01;
773 Bits >>= 1;
774 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
775 Bits >>= 1;
776 bool Poisoned = Bits & 0x01;
777 Bits >>= 1;
778 bool ExtensionToken = Bits & 0x01;
779 Bits >>= 1;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000780 bool hasSubmoduleMacros = Bits & 0x01;
781 Bits >>= 1;
Guy Benyei11169dd2012-12-18 14:30:41 +0000782 bool hadMacroDefinition = Bits & 0x01;
783 Bits >>= 1;
784
785 assert(Bits == 0 && "Extra bits in the identifier?");
786 DataLen -= 8;
787
788 // Build the IdentifierInfo itself and link the identifier ID with
789 // the new IdentifierInfo.
790 IdentifierInfo *II = KnownII;
791 if (!II) {
Douglas Gregorbfd73d72013-01-23 18:53:14 +0000792 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
Guy Benyei11169dd2012-12-18 14:30:41 +0000793 KnownII = II;
794 }
795 Reader.markIdentifierUpToDate(II);
Douglas Gregordcf25082013-02-11 18:16:18 +0000796 if (!II->isFromAST()) {
797 bool WasInteresting = isInterestingIdentifier(*II);
798 II->setIsFromAST();
799 if (WasInteresting)
800 II->setChangedSinceDeserialization();
801 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000802
803 // Set or check the various bits in the IdentifierInfo structure.
804 // Token IDs are read-only.
Argyrios Kyrtzidisddee8c92013-02-27 01:13:51 +0000805 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
Guy Benyei11169dd2012-12-18 14:30:41 +0000806 II->RevertTokenIDToIdentifier();
807 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
808 assert(II->isExtensionToken() == ExtensionToken &&
809 "Incorrect extension token flag");
810 (void)ExtensionToken;
811 if (Poisoned)
812 II->setIsPoisoned(true);
813 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
814 "Incorrect C++ operator keyword flag");
815 (void)CPlusPlusOperatorKeyword;
816
817 // If this identifier is a macro, deserialize the macro
818 // definition.
819 if (hadMacroDefinition) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000820 uint32_t MacroDirectivesOffset =
821 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000822 DataLen -= 4;
823 SmallVector<uint32_t, 8> LocalMacroIDs;
824 if (hasSubmoduleMacros) {
Richard Smithdaa69e02014-07-25 04:40:03 +0000825 while (true) {
826 uint32_t LocalMacroID =
827 endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000828 DataLen -= 4;
Richard Smithdaa69e02014-07-25 04:40:03 +0000829 if (LocalMacroID == 0xdeadbeef) break;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000830 LocalMacroIDs.push_back(LocalMacroID);
831 }
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +0000832 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000833
Richard Smithe842a472014-10-22 02:05:46 +0000834 if (F.Kind == MK_ImplicitModule || F.Kind == MK_ExplicitModule) {
Richard Smith49f906a2014-03-01 00:08:04 +0000835 // Macro definitions are stored from newest to oldest, so reverse them
836 // before registering them.
837 llvm::SmallVector<unsigned, 8> MacroSizes;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000838 for (SmallVectorImpl<uint32_t>::iterator
Richard Smith49f906a2014-03-01 00:08:04 +0000839 I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; /**/) {
840 unsigned Size = 1;
841
842 static const uint32_t HasOverridesFlag = 0x80000000U;
843 if (I + 1 != E && (I[1] & HasOverridesFlag))
844 Size += 1 + (I[1] & ~HasOverridesFlag);
845
846 MacroSizes.push_back(Size);
847 I += Size;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000848 }
Richard Smith49f906a2014-03-01 00:08:04 +0000849
850 SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end();
851 for (SmallVectorImpl<unsigned>::reverse_iterator SI = MacroSizes.rbegin(),
852 SE = MacroSizes.rend();
853 SI != SE; ++SI) {
854 I -= *SI;
855
856 uint32_t LocalMacroID = *I;
Craig Topper00bbdcf2014-06-28 23:22:23 +0000857 ArrayRef<uint32_t> Overrides;
Richard Smith49f906a2014-03-01 00:08:04 +0000858 if (*SI != 1)
859 Overrides = llvm::makeArrayRef(&I[2], *SI - 2);
860 Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides);
861 }
862 assert(I == LocalMacroIDs.begin());
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +0000863 } else {
864 Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset);
865 }
Guy Benyei11169dd2012-12-18 14:30:41 +0000866 }
867
868 Reader.SetIdentifierInfo(ID, II);
869
870 // Read all of the declarations visible at global scope with this
871 // name.
872 if (DataLen > 0) {
873 SmallVector<uint32_t, 4> DeclIDs;
874 for (; DataLen > 0; DataLen -= 4)
Justin Bogner57ba0b22014-03-28 22:03:24 +0000875 DeclIDs.push_back(Reader.getGlobalDeclID(
876 F, endian::readNext<uint32_t, little, unaligned>(d)));
Guy Benyei11169dd2012-12-18 14:30:41 +0000877 Reader.SetGloballyVisibleDecls(II, DeclIDs);
878 }
879
880 return II;
881}
882
883unsigned
884ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
885 llvm::FoldingSetNodeID ID;
886 ID.AddInteger(Key.Kind);
887
888 switch (Key.Kind) {
889 case DeclarationName::Identifier:
890 case DeclarationName::CXXLiteralOperatorName:
891 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
892 break;
893 case DeclarationName::ObjCZeroArgSelector:
894 case DeclarationName::ObjCOneArgSelector:
895 case DeclarationName::ObjCMultiArgSelector:
896 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
897 break;
898 case DeclarationName::CXXOperatorName:
899 ID.AddInteger((OverloadedOperatorKind)Key.Data);
900 break;
901 case DeclarationName::CXXConstructorName:
902 case DeclarationName::CXXDestructorName:
903 case DeclarationName::CXXConversionFunctionName:
904 case DeclarationName::CXXUsingDirective:
905 break;
906 }
907
908 return ID.ComputeHash();
909}
910
911ASTDeclContextNameLookupTrait::internal_key_type
912ASTDeclContextNameLookupTrait::GetInternalKey(
913 const external_key_type& Name) const {
914 DeclNameKey Key;
915 Key.Kind = Name.getNameKind();
916 switch (Name.getNameKind()) {
917 case DeclarationName::Identifier:
918 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
919 break;
920 case DeclarationName::ObjCZeroArgSelector:
921 case DeclarationName::ObjCOneArgSelector:
922 case DeclarationName::ObjCMultiArgSelector:
923 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
924 break;
925 case DeclarationName::CXXOperatorName:
926 Key.Data = Name.getCXXOverloadedOperator();
927 break;
928 case DeclarationName::CXXLiteralOperatorName:
929 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
930 break;
931 case DeclarationName::CXXConstructorName:
932 case DeclarationName::CXXDestructorName:
933 case DeclarationName::CXXConversionFunctionName:
934 case DeclarationName::CXXUsingDirective:
935 Key.Data = 0;
936 break;
937 }
938
939 return Key;
940}
941
942std::pair<unsigned, unsigned>
943ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000944 using namespace llvm::support;
945 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
946 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +0000947 return std::make_pair(KeyLen, DataLen);
948}
949
950ASTDeclContextNameLookupTrait::internal_key_type
951ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000952 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +0000953
954 DeclNameKey Key;
955 Key.Kind = (DeclarationName::NameKind)*d++;
956 switch (Key.Kind) {
957 case DeclarationName::Identifier:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000958 Key.Data = (uint64_t)Reader.getLocalIdentifier(
959 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000960 break;
961 case DeclarationName::ObjCZeroArgSelector:
962 case DeclarationName::ObjCOneArgSelector:
963 case DeclarationName::ObjCMultiArgSelector:
964 Key.Data =
Justin Bogner57ba0b22014-03-28 22:03:24 +0000965 (uint64_t)Reader.getLocalSelector(
966 F, endian::readNext<uint32_t, little, unaligned>(
967 d)).getAsOpaquePtr();
Guy Benyei11169dd2012-12-18 14:30:41 +0000968 break;
969 case DeclarationName::CXXOperatorName:
970 Key.Data = *d++; // OverloadedOperatorKind
971 break;
972 case DeclarationName::CXXLiteralOperatorName:
Justin Bogner57ba0b22014-03-28 22:03:24 +0000973 Key.Data = (uint64_t)Reader.getLocalIdentifier(
974 F, endian::readNext<uint32_t, little, unaligned>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000975 break;
976 case DeclarationName::CXXConstructorName:
977 case DeclarationName::CXXDestructorName:
978 case DeclarationName::CXXConversionFunctionName:
979 case DeclarationName::CXXUsingDirective:
980 Key.Data = 0;
981 break;
982 }
983
984 return Key;
985}
986
987ASTDeclContextNameLookupTrait::data_type
988ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
989 const unsigned char* d,
990 unsigned DataLen) {
Justin Bogner57ba0b22014-03-28 22:03:24 +0000991 using namespace llvm::support;
992 unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d);
Argyrios Kyrtzidisc57e5032013-01-11 22:29:49 +0000993 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
994 const_cast<unsigned char *>(d));
Guy Benyei11169dd2012-12-18 14:30:41 +0000995 return std::make_pair(Start, Start + NumDecls);
996}
997
998bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
Chris Lattner7fb3bef2013-01-20 00:56:42 +0000999 BitstreamCursor &Cursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00001000 const std::pair<uint64_t, uint64_t> &Offsets,
1001 DeclContextInfo &Info) {
1002 SavedStreamPosition SavedPosition(Cursor);
1003 // First the lexical decls.
1004 if (Offsets.first != 0) {
1005 Cursor.JumpToBit(Offsets.first);
1006
1007 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001008 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00001009 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001010 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001011 if (RecCode != DECL_CONTEXT_LEXICAL) {
1012 Error("Expected lexical block");
1013 return true;
1014 }
1015
Chris Lattner0e6c9402013-01-20 02:38:54 +00001016 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
1017 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
Guy Benyei11169dd2012-12-18 14:30:41 +00001018 }
1019
1020 // Now the lookup table.
1021 if (Offsets.second != 0) {
1022 Cursor.JumpToBit(Offsets.second);
1023
1024 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001025 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00001026 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001027 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001028 if (RecCode != DECL_CONTEXT_VISIBLE) {
1029 Error("Expected visible lookup table block");
1030 return true;
1031 }
Justin Bognerda4e6502014-04-14 16:34:29 +00001032 Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create(
1033 (const unsigned char *)Blob.data() + Record[0],
1034 (const unsigned char *)Blob.data() + sizeof(uint32_t),
1035 (const unsigned char *)Blob.data(),
1036 ASTDeclContextNameLookupTrait(*this, M));
Guy Benyei11169dd2012-12-18 14:30:41 +00001037 }
1038
1039 return false;
1040}
1041
1042void ASTReader::Error(StringRef Msg) {
1043 Error(diag::err_fe_pch_malformed, Msg);
Douglas Gregor940e8052013-05-10 22:15:13 +00001044 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
1045 Diag(diag::note_module_cache_path)
1046 << PP.getHeaderSearchInfo().getModuleCachePath();
1047 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001048}
1049
1050void ASTReader::Error(unsigned DiagID,
1051 StringRef Arg1, StringRef Arg2) {
1052 if (Diags.isDiagnosticInFlight())
1053 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1054 else
1055 Diag(DiagID) << Arg1 << Arg2;
1056}
1057
1058//===----------------------------------------------------------------------===//
1059// Source Manager Deserialization
1060//===----------------------------------------------------------------------===//
1061
1062/// \brief Read the line table in the source manager block.
1063/// \returns true if there was an error.
1064bool ASTReader::ParseLineTable(ModuleFile &F,
Richard Smith7ed1bc92014-12-05 22:42:13 +00001065 const RecordData &Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001066 unsigned Idx = 0;
1067 LineTableInfo &LineTable = SourceMgr.getLineTable();
1068
1069 // Parse the file names
1070 std::map<int, int> FileIDs;
1071 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
1072 // Extract the file name
Richard Smith7ed1bc92014-12-05 22:42:13 +00001073 auto Filename = ReadPath(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001074 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1075 }
1076
1077 // Parse the line entries
1078 std::vector<LineEntry> Entries;
1079 while (Idx < Record.size()) {
1080 int FID = Record[Idx++];
1081 assert(FID >= 0 && "Serialized line entries for non-local file.");
1082 // Remap FileID from 1-based old view.
1083 FID += F.SLocEntryBaseID - 1;
1084
1085 // Extract the line entries
1086 unsigned NumEntries = Record[Idx++];
1087 assert(NumEntries && "Numentries is 00000");
1088 Entries.clear();
1089 Entries.reserve(NumEntries);
1090 for (unsigned I = 0; I != NumEntries; ++I) {
1091 unsigned FileOffset = Record[Idx++];
1092 unsigned LineNo = Record[Idx++];
1093 int FilenameID = FileIDs[Record[Idx++]];
1094 SrcMgr::CharacteristicKind FileKind
1095 = (SrcMgr::CharacteristicKind)Record[Idx++];
1096 unsigned IncludeOffset = Record[Idx++];
1097 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1098 FileKind, IncludeOffset));
1099 }
1100 LineTable.AddEntry(FileID::get(FID), Entries);
1101 }
1102
1103 return false;
1104}
1105
1106/// \brief Read a source manager block
1107bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1108 using namespace SrcMgr;
1109
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001110 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001111
1112 // Set the source-location entry cursor to the current position in
1113 // the stream. This cursor will be used to read the contents of the
1114 // source manager block initially, and then lazily read
1115 // source-location entries as needed.
1116 SLocEntryCursor = F.Stream;
1117
1118 // The stream itself is going to skip over the source manager block.
1119 if (F.Stream.SkipBlock()) {
1120 Error("malformed block record in AST file");
1121 return true;
1122 }
1123
1124 // Enter the source manager block.
1125 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1126 Error("malformed source manager block record in AST file");
1127 return true;
1128 }
1129
1130 RecordData Record;
1131 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001132 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1133
1134 switch (E.Kind) {
1135 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1136 case llvm::BitstreamEntry::Error:
1137 Error("malformed block record in AST file");
1138 return true;
1139 case llvm::BitstreamEntry::EndBlock:
Guy Benyei11169dd2012-12-18 14:30:41 +00001140 return false;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001141 case llvm::BitstreamEntry::Record:
1142 // The interesting case.
1143 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001144 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001145
Guy Benyei11169dd2012-12-18 14:30:41 +00001146 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001147 Record.clear();
Chris Lattner15c3e7d2013-01-21 18:28:26 +00001148 StringRef Blob;
1149 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001150 default: // Default behavior: ignore.
1151 break;
1152
1153 case SM_SLOC_FILE_ENTRY:
1154 case SM_SLOC_BUFFER_ENTRY:
1155 case SM_SLOC_EXPANSION_ENTRY:
1156 // Once we hit one of the source location entries, we're done.
1157 return false;
1158 }
1159 }
1160}
1161
1162/// \brief If a header file is not found at the path that we expect it to be
1163/// and the PCH file was moved from its original location, try to resolve the
1164/// file by assuming that header+PCH were moved together and the header is in
1165/// the same place relative to the PCH.
1166static std::string
1167resolveFileRelativeToOriginalDir(const std::string &Filename,
1168 const std::string &OriginalDir,
1169 const std::string &CurrDir) {
1170 assert(OriginalDir != CurrDir &&
1171 "No point trying to resolve the file if the PCH dir didn't change");
1172 using namespace llvm::sys;
1173 SmallString<128> filePath(Filename);
1174 fs::make_absolute(filePath);
1175 assert(path::is_absolute(OriginalDir));
1176 SmallString<128> currPCHPath(CurrDir);
1177
1178 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1179 fileDirE = path::end(path::parent_path(filePath));
1180 path::const_iterator origDirI = path::begin(OriginalDir),
1181 origDirE = path::end(OriginalDir);
1182 // Skip the common path components from filePath and OriginalDir.
1183 while (fileDirI != fileDirE && origDirI != origDirE &&
1184 *fileDirI == *origDirI) {
1185 ++fileDirI;
1186 ++origDirI;
1187 }
1188 for (; origDirI != origDirE; ++origDirI)
1189 path::append(currPCHPath, "..");
1190 path::append(currPCHPath, fileDirI, fileDirE);
1191 path::append(currPCHPath, path::filename(Filename));
1192 return currPCHPath.str();
1193}
1194
1195bool ASTReader::ReadSLocEntry(int ID) {
1196 if (ID == 0)
1197 return false;
1198
1199 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1200 Error("source location entry ID out-of-range for AST file");
1201 return true;
1202 }
1203
1204 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1205 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001206 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001207 unsigned BaseOffset = F->SLocEntryBaseOffset;
1208
1209 ++NumSLocEntriesRead;
Chris Lattnere7b154b2013-01-19 21:39:22 +00001210 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1211 if (Entry.Kind != llvm::BitstreamEntry::Record) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001212 Error("incorrectly-formatted source location entry in AST file");
1213 return true;
1214 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001215
Guy Benyei11169dd2012-12-18 14:30:41 +00001216 RecordData Record;
Chris Lattner0e6c9402013-01-20 02:38:54 +00001217 StringRef Blob;
1218 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001219 default:
1220 Error("incorrectly-formatted source location entry in AST file");
1221 return true;
1222
1223 case SM_SLOC_FILE_ENTRY: {
1224 // We will detect whether a file changed and return 'Failure' for it, but
1225 // we will also try to fail gracefully by setting up the SLocEntry.
1226 unsigned InputID = Record[4];
1227 InputFile IF = getInputFile(*F, InputID);
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001228 const FileEntry *File = IF.getFile();
1229 bool OverriddenBuffer = IF.isOverridden();
Guy Benyei11169dd2012-12-18 14:30:41 +00001230
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00001231 // Note that we only check if a File was returned. If it was out-of-date
1232 // we have complained but we will continue creating a FileID to recover
1233 // gracefully.
1234 if (!File)
Guy Benyei11169dd2012-12-18 14:30:41 +00001235 return true;
1236
1237 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1238 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1239 // This is the module's main file.
1240 IncludeLoc = getImportLocation(F);
1241 }
1242 SrcMgr::CharacteristicKind
1243 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1244 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1245 ID, BaseOffset + Record[0]);
1246 SrcMgr::FileInfo &FileInfo =
1247 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1248 FileInfo.NumCreatedFIDs = Record[5];
1249 if (Record[3])
1250 FileInfo.setHasLineDirectives();
1251
1252 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1253 unsigned NumFileDecls = Record[7];
1254 if (NumFileDecls) {
1255 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1256 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1257 NumFileDecls));
1258 }
1259
1260 const SrcMgr::ContentCache *ContentCache
1261 = SourceMgr.getOrCreateContentCache(File,
1262 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1263 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1264 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1265 unsigned Code = SLocEntryCursor.ReadCode();
1266 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001267 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001268
1269 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1270 Error("AST record has invalid code");
1271 return true;
1272 }
1273
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001274 std::unique_ptr<llvm::MemoryBuffer> Buffer
Chris Lattner0e6c9402013-01-20 02:38:54 +00001275 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
David Blaikie49cc3182014-08-27 20:54:45 +00001276 SourceMgr.overrideFileContents(File, std::move(Buffer));
Guy Benyei11169dd2012-12-18 14:30:41 +00001277 }
1278
1279 break;
1280 }
1281
1282 case SM_SLOC_BUFFER_ENTRY: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00001283 const char *Name = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00001284 unsigned Offset = Record[0];
1285 SrcMgr::CharacteristicKind
1286 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1287 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
Richard Smithe842a472014-10-22 02:05:46 +00001288 if (IncludeLoc.isInvalid() &&
1289 (F->Kind == MK_ImplicitModule || F->Kind == MK_ExplicitModule)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001290 IncludeLoc = getImportLocation(F);
1291 }
1292 unsigned Code = SLocEntryCursor.ReadCode();
1293 Record.clear();
1294 unsigned RecCode
Chris Lattner0e6c9402013-01-20 02:38:54 +00001295 = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00001296
1297 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1298 Error("AST record has invalid code");
1299 return true;
1300 }
1301
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001302 std::unique_ptr<llvm::MemoryBuffer> Buffer =
1303 llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
David Blaikie50a5f972014-08-29 07:59:55 +00001304 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
Rafael Espindolad87f8d72014-08-27 20:03:29 +00001305 BaseOffset + Offset, IncludeLoc);
Guy Benyei11169dd2012-12-18 14:30:41 +00001306 break;
1307 }
1308
1309 case SM_SLOC_EXPANSION_ENTRY: {
1310 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1311 SourceMgr.createExpansionLoc(SpellingLoc,
1312 ReadSourceLocation(*F, Record[2]),
1313 ReadSourceLocation(*F, Record[3]),
1314 Record[4],
1315 ID,
1316 BaseOffset + Record[0]);
1317 break;
1318 }
1319 }
1320
1321 return false;
1322}
1323
1324std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1325 if (ID == 0)
1326 return std::make_pair(SourceLocation(), "");
1327
1328 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1329 Error("source location entry ID out-of-range for AST file");
1330 return std::make_pair(SourceLocation(), "");
1331 }
1332
1333 // Find which module file this entry lands in.
1334 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
Richard Smithe842a472014-10-22 02:05:46 +00001335 if (M->Kind != MK_ImplicitModule && M->Kind != MK_ExplicitModule)
Guy Benyei11169dd2012-12-18 14:30:41 +00001336 return std::make_pair(SourceLocation(), "");
1337
1338 // FIXME: Can we map this down to a particular submodule? That would be
1339 // ideal.
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001340 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
Guy Benyei11169dd2012-12-18 14:30:41 +00001341}
1342
1343/// \brief Find the location where the module F is imported.
1344SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1345 if (F->ImportLoc.isValid())
1346 return F->ImportLoc;
1347
1348 // Otherwise we have a PCH. It's considered to be "imported" at the first
1349 // location of its includer.
1350 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
Ben Langmuirbeee15e2014-04-14 18:00:01 +00001351 // Main file is the importer.
1352 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1353 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
Guy Benyei11169dd2012-12-18 14:30:41 +00001354 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001355 return F->ImportedBy[0]->FirstLoc;
1356}
1357
1358/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1359/// specified cursor. Read the abbreviations that are at the top of the block
1360/// and then leave the cursor pointing into the block.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001361bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001362 if (Cursor.EnterSubBlock(BlockID)) {
1363 Error("malformed block record in AST file");
1364 return Failure;
1365 }
1366
1367 while (true) {
1368 uint64_t Offset = Cursor.GetCurrentBitNo();
1369 unsigned Code = Cursor.ReadCode();
1370
1371 // We expect all abbrevs to be at the start of the block.
1372 if (Code != llvm::bitc::DEFINE_ABBREV) {
1373 Cursor.JumpToBit(Offset);
1374 return false;
1375 }
1376 Cursor.ReadAbbrevRecord();
1377 }
1378}
1379
Richard Smithe40f2ba2013-08-07 21:41:30 +00001380Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
John McCallf413f5e2013-05-03 00:10:13 +00001381 unsigned &Idx) {
1382 Token Tok;
1383 Tok.startToken();
1384 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1385 Tok.setLength(Record[Idx++]);
1386 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1387 Tok.setIdentifierInfo(II);
1388 Tok.setKind((tok::TokenKind)Record[Idx++]);
1389 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1390 return Tok;
1391}
1392
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001393MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001394 BitstreamCursor &Stream = F.MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001395
1396 // Keep track of where we are in the stream, then jump back there
1397 // after reading this macro.
1398 SavedStreamPosition SavedPosition(Stream);
1399
1400 Stream.JumpToBit(Offset);
1401 RecordData Record;
1402 SmallVector<IdentifierInfo*, 16> MacroArgs;
Craig Toppera13603a2014-05-22 05:54:18 +00001403 MacroInfo *Macro = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00001404
Guy Benyei11169dd2012-12-18 14:30:41 +00001405 while (true) {
Chris Lattnerefa77172013-01-20 00:00:22 +00001406 // Advance to the next record, but if we get to the end of the block, don't
1407 // pop it (removing all the abbreviations from the cursor) since we want to
1408 // be able to reseek within the block and read entries.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001409 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
Chris Lattnerefa77172013-01-20 00:00:22 +00001410 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1411
1412 switch (Entry.Kind) {
1413 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1414 case llvm::BitstreamEntry::Error:
1415 Error("malformed block record in AST file");
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001416 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001417 case llvm::BitstreamEntry::EndBlock:
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001418 return Macro;
Chris Lattnerefa77172013-01-20 00:00:22 +00001419 case llvm::BitstreamEntry::Record:
1420 // The interesting case.
1421 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001422 }
1423
1424 // Read a record.
Guy Benyei11169dd2012-12-18 14:30:41 +00001425 Record.clear();
1426 PreprocessorRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00001427 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00001428 switch (RecType) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001429 case PP_MACRO_DIRECTIVE_HISTORY:
1430 return Macro;
1431
Guy Benyei11169dd2012-12-18 14:30:41 +00001432 case PP_MACRO_OBJECT_LIKE:
1433 case PP_MACRO_FUNCTION_LIKE: {
1434 // If we already have a macro, that means that we've hit the end
1435 // of the definition of the macro we were looking for. We're
1436 // done.
1437 if (Macro)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001438 return Macro;
Guy Benyei11169dd2012-12-18 14:30:41 +00001439
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001440 unsigned NextIndex = 1; // Skip identifier ID.
1441 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001442 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001443 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
Argyrios Kyrtzidis7572be22013-01-07 19:16:23 +00001444 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
Guy Benyei11169dd2012-12-18 14:30:41 +00001445 MI->setIsUsed(Record[NextIndex++]);
Argyrios Kyrtzidis9ef53ce2014-04-09 18:21:23 +00001446 MI->setUsedForHeaderGuard(Record[NextIndex++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00001447
Guy Benyei11169dd2012-12-18 14:30:41 +00001448 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1449 // Decode function-like macro info.
1450 bool isC99VarArgs = Record[NextIndex++];
1451 bool isGNUVarArgs = Record[NextIndex++];
1452 bool hasCommaPasting = Record[NextIndex++];
1453 MacroArgs.clear();
1454 unsigned NumArgs = Record[NextIndex++];
1455 for (unsigned i = 0; i != NumArgs; ++i)
1456 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1457
1458 // Install function-like macro info.
1459 MI->setIsFunctionLike();
1460 if (isC99VarArgs) MI->setIsC99Varargs();
1461 if (isGNUVarArgs) MI->setIsGNUVarargs();
1462 if (hasCommaPasting) MI->setHasCommaPasting();
1463 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1464 PP.getPreprocessorAllocator());
1465 }
1466
Guy Benyei11169dd2012-12-18 14:30:41 +00001467 // Remember that we saw this macro last so that we add the tokens that
1468 // form its body to it.
1469 Macro = MI;
1470
1471 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1472 Record[NextIndex]) {
1473 // We have a macro definition. Register the association
1474 PreprocessedEntityID
1475 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1476 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Argyrios Kyrtzidis832de9f2013-02-22 18:35:59 +00001477 PreprocessingRecord::PPEntityID
1478 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1479 MacroDefinition *PPDef =
1480 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1481 if (PPDef)
1482 PPRec.RegisterMacroDefinition(Macro, PPDef);
Guy Benyei11169dd2012-12-18 14:30:41 +00001483 }
1484
1485 ++NumMacrosRead;
1486 break;
1487 }
1488
1489 case PP_TOKEN: {
1490 // If we see a TOKEN before a PP_MACRO_*, then the file is
1491 // erroneous, just pretend we didn't see this.
Craig Toppera13603a2014-05-22 05:54:18 +00001492 if (!Macro) break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001493
John McCallf413f5e2013-05-03 00:10:13 +00001494 unsigned Idx = 0;
1495 Token Tok = ReadToken(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00001496 Macro->AddTokenToBody(Tok);
1497 break;
1498 }
1499 }
1500 }
1501}
1502
1503PreprocessedEntityID
1504ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1505 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1506 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1507 assert(I != M.PreprocessedEntityRemap.end()
1508 && "Invalid index into preprocessed entity index remap");
1509
1510 return LocalID + I->second;
1511}
1512
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001513unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1514 return llvm::hash_combine(ikey.Size, ikey.ModTime);
Guy Benyei11169dd2012-12-18 14:30:41 +00001515}
Richard Smith7ed1bc92014-12-05 22:42:13 +00001516
Guy Benyei11169dd2012-12-18 14:30:41 +00001517HeaderFileInfoTrait::internal_key_type
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001518HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1519 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
Richard Smith7ed1bc92014-12-05 22:42:13 +00001520 FE->getName(), /*Imported*/false };
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001521 return ikey;
1522}
Guy Benyei11169dd2012-12-18 14:30:41 +00001523
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001524bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1525 if (a.Size != b.Size || a.ModTime != b.ModTime)
Guy Benyei11169dd2012-12-18 14:30:41 +00001526 return false;
1527
Richard Smith7ed1bc92014-12-05 22:42:13 +00001528 if (llvm::sys::path::is_absolute(a.Filename) &&
1529 strcmp(a.Filename, b.Filename) == 0)
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001530 return true;
1531
Guy Benyei11169dd2012-12-18 14:30:41 +00001532 // Determine whether the actual files are equivalent.
Argyrios Kyrtzidis2a513e82013-03-04 20:33:40 +00001533 FileManager &FileMgr = Reader.getFileManager();
Richard Smith7ed1bc92014-12-05 22:42:13 +00001534 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1535 if (!Key.Imported)
1536 return FileMgr.getFile(Key.Filename);
1537
1538 std::string Resolved = Key.Filename;
1539 Reader.ResolveImportedPath(M, Resolved);
1540 return FileMgr.getFile(Resolved);
1541 };
1542
1543 const FileEntry *FEA = GetFile(a);
1544 const FileEntry *FEB = GetFile(b);
1545 return FEA && FEA == FEB;
Guy Benyei11169dd2012-12-18 14:30:41 +00001546}
1547
1548std::pair<unsigned, unsigned>
1549HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001550 using namespace llvm::support;
1551 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
Guy Benyei11169dd2012-12-18 14:30:41 +00001552 unsigned DataLen = (unsigned) *d++;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001553 return std::make_pair(KeyLen, DataLen);
Guy Benyei11169dd2012-12-18 14:30:41 +00001554}
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001555
1556HeaderFileInfoTrait::internal_key_type
1557HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001558 using namespace llvm::support;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001559 internal_key_type ikey;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001560 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1561 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001562 ikey.Filename = (const char *)d;
Richard Smith7ed1bc92014-12-05 22:42:13 +00001563 ikey.Imported = true;
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00001564 return ikey;
1565}
1566
Guy Benyei11169dd2012-12-18 14:30:41 +00001567HeaderFileInfoTrait::data_type
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001568HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
Guy Benyei11169dd2012-12-18 14:30:41 +00001569 unsigned DataLen) {
1570 const unsigned char *End = d + DataLen;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001571 using namespace llvm::support;
Guy Benyei11169dd2012-12-18 14:30:41 +00001572 HeaderFileInfo HFI;
1573 unsigned Flags = *d++;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00001574 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1575 ((Flags >> 6) & 0x03);
Guy Benyei11169dd2012-12-18 14:30:41 +00001576 HFI.isImport = (Flags >> 5) & 0x01;
1577 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1578 HFI.DirInfo = (Flags >> 2) & 0x03;
1579 HFI.Resolved = (Flags >> 1) & 0x01;
1580 HFI.IndexHeaderMapHeader = Flags & 0x01;
Justin Bogner57ba0b22014-03-28 22:03:24 +00001581 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1582 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1583 M, endian::readNext<uint32_t, little, unaligned>(d));
1584 if (unsigned FrameworkOffset =
1585 endian::readNext<uint32_t, little, unaligned>(d)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001586 // The framework offset is 1 greater than the actual offset,
1587 // since 0 is used as an indicator for "no framework name".
1588 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1589 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1590 }
1591
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001592 if (d != End) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00001593 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001594 if (LocalSMID) {
1595 // This header is part of a module. Associate it with the module to enable
1596 // implicit module import.
1597 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1598 Module *Mod = Reader.getSubmodule(GlobalSMID);
1599 HFI.isModuleHeader = true;
1600 FileManager &FileMgr = Reader.getFileManager();
1601 ModuleMap &ModMap =
1602 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
Richard Smith7ed1bc92014-12-05 22:42:13 +00001603 // FIXME: This information should be propagated through the
1604 // SUBMODULE_HEADER etc records rather than from here.
Richard Smith3c1a41a2014-12-02 00:08:08 +00001605 // FIXME: We don't ever mark excluded headers.
Richard Smith7ed1bc92014-12-05 22:42:13 +00001606 std::string Filename = key.Filename;
1607 if (key.Imported)
1608 Reader.ResolveImportedPath(M, Filename);
1609 Module::Header H = { key.Filename, FileMgr.getFile(Filename) };
Hans Wennborg0101b542014-12-02 02:13:09 +00001610 ModMap.addHeader(Mod, H, HFI.getHeaderRole());
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00001611 }
1612 }
1613
Guy Benyei11169dd2012-12-18 14:30:41 +00001614 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1615 (void)End;
1616
1617 // This HeaderFileInfo was externally loaded.
1618 HFI.External = true;
1619 return HFI;
1620}
1621
Richard Smith49f906a2014-03-01 00:08:04 +00001622void
1623ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M,
1624 GlobalMacroID GMacID,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001625 ArrayRef<SubmoduleID> Overrides) {
Guy Benyei11169dd2012-12-18 14:30:41 +00001626 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
Craig Toppera13603a2014-05-22 05:54:18 +00001627 SubmoduleID *OverrideData = nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001628 if (!Overrides.empty()) {
1629 OverrideData = new (Context) SubmoduleID[Overrides.size() + 1];
1630 OverrideData[0] = Overrides.size();
1631 for (unsigned I = 0; I != Overrides.size(); ++I)
1632 OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]);
1633 }
1634 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData));
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001635}
1636
1637void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II,
1638 ModuleFile *M,
1639 uint64_t MacroDirectivesOffset) {
1640 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1641 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
Guy Benyei11169dd2012-12-18 14:30:41 +00001642}
1643
1644void ASTReader::ReadDefinedMacros() {
1645 // Note that we are loading defined macros.
1646 Deserializing Macros(this);
1647
1648 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1649 E = ModuleMgr.rend(); I != E; ++I) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001650 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001651
1652 // If there was no preprocessor block, skip this file.
1653 if (!MacroCursor.getBitStreamReader())
1654 continue;
1655
Chris Lattner7fb3bef2013-01-20 00:56:42 +00001656 BitstreamCursor Cursor = MacroCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00001657 Cursor.JumpToBit((*I)->MacroStartOffset);
1658
1659 RecordData Record;
1660 while (true) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001661 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1662
1663 switch (E.Kind) {
1664 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1665 case llvm::BitstreamEntry::Error:
1666 Error("malformed block record in AST file");
1667 return;
1668 case llvm::BitstreamEntry::EndBlock:
1669 goto NextCursor;
1670
1671 case llvm::BitstreamEntry::Record:
Chris Lattnere7b154b2013-01-19 21:39:22 +00001672 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00001673 switch (Cursor.readRecord(E.ID, Record)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00001674 default: // Default behavior: ignore.
1675 break;
1676
1677 case PP_MACRO_OBJECT_LIKE:
1678 case PP_MACRO_FUNCTION_LIKE:
1679 getLocalIdentifier(**I, Record[0]);
1680 break;
1681
1682 case PP_TOKEN:
1683 // Ignore tokens.
1684 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00001685 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001686 break;
1687 }
1688 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00001689 NextCursor: ;
Guy Benyei11169dd2012-12-18 14:30:41 +00001690 }
1691}
1692
1693namespace {
1694 /// \brief Visitor class used to look up identifirs in an AST file.
1695 class IdentifierLookupVisitor {
1696 StringRef Name;
1697 unsigned PriorGeneration;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001698 unsigned &NumIdentifierLookups;
1699 unsigned &NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001700 IdentifierInfo *Found;
Douglas Gregor00a50f72013-01-25 00:38:33 +00001701
Guy Benyei11169dd2012-12-18 14:30:41 +00001702 public:
Douglas Gregor00a50f72013-01-25 00:38:33 +00001703 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1704 unsigned &NumIdentifierLookups,
1705 unsigned &NumIdentifierLookupHits)
Douglas Gregor7211ac12013-01-25 23:32:03 +00001706 : Name(Name), PriorGeneration(PriorGeneration),
Douglas Gregor00a50f72013-01-25 00:38:33 +00001707 NumIdentifierLookups(NumIdentifierLookups),
1708 NumIdentifierLookupHits(NumIdentifierLookupHits),
1709 Found()
1710 {
1711 }
Guy Benyei11169dd2012-12-18 14:30:41 +00001712
1713 static bool visit(ModuleFile &M, void *UserData) {
1714 IdentifierLookupVisitor *This
1715 = static_cast<IdentifierLookupVisitor *>(UserData);
1716
1717 // If we've already searched this module file, skip it now.
1718 if (M.Generation <= This->PriorGeneration)
1719 return true;
Douglas Gregore060e572013-01-25 01:03:03 +00001720
Guy Benyei11169dd2012-12-18 14:30:41 +00001721 ASTIdentifierLookupTable *IdTable
1722 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1723 if (!IdTable)
1724 return false;
1725
1726 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1727 M, This->Found);
Douglas Gregor00a50f72013-01-25 00:38:33 +00001728 ++This->NumIdentifierLookups;
1729 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
Guy Benyei11169dd2012-12-18 14:30:41 +00001730 if (Pos == IdTable->end())
1731 return false;
1732
1733 // Dereferencing the iterator has the effect of building the
1734 // IdentifierInfo node and populating it with the various
1735 // declarations it needs.
Douglas Gregor00a50f72013-01-25 00:38:33 +00001736 ++This->NumIdentifierLookupHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00001737 This->Found = *Pos;
1738 return true;
1739 }
1740
1741 // \brief Retrieve the identifier info found within the module
1742 // files.
1743 IdentifierInfo *getIdentifierInfo() const { return Found; }
1744 };
1745}
1746
1747void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1748 // Note that we are loading an identifier.
1749 Deserializing AnIdentifier(this);
1750
1751 unsigned PriorGeneration = 0;
1752 if (getContext().getLangOpts().Modules)
1753 PriorGeneration = IdentifierGeneration[&II];
Douglas Gregore060e572013-01-25 01:03:03 +00001754
1755 // If there is a global index, look there first to determine which modules
1756 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00001757 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00001758 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00001759 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00001760 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1761 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00001762 }
1763 }
1764
Douglas Gregor7211ac12013-01-25 23:32:03 +00001765 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
Douglas Gregor00a50f72013-01-25 00:38:33 +00001766 NumIdentifierLookups,
1767 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00001768 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00001769 markIdentifierUpToDate(&II);
1770}
1771
1772void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1773 if (!II)
1774 return;
1775
1776 II->setOutOfDate(false);
1777
1778 // Update the generation for this identifier.
1779 if (getContext().getLangOpts().Modules)
Richard Smith053f6c62014-05-16 23:01:30 +00001780 IdentifierGeneration[II] = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00001781}
1782
Richard Smith49f906a2014-03-01 00:08:04 +00001783struct ASTReader::ModuleMacroInfo {
1784 SubmoduleID SubModID;
1785 MacroInfo *MI;
1786 SubmoduleID *Overrides;
1787 // FIXME: Remove this.
1788 ModuleFile *F;
1789
1790 bool isDefine() const { return MI; }
1791
1792 SubmoduleID getSubmoduleID() const { return SubModID; }
1793
Craig Topper00bbdcf2014-06-28 23:22:23 +00001794 ArrayRef<SubmoduleID> getOverriddenSubmodules() const {
Richard Smith49f906a2014-03-01 00:08:04 +00001795 if (!Overrides)
Craig Topper00bbdcf2014-06-28 23:22:23 +00001796 return None;
Richard Smith49f906a2014-03-01 00:08:04 +00001797 return llvm::makeArrayRef(Overrides + 1, *Overrides);
1798 }
1799
Richard Smithdaa69e02014-07-25 04:40:03 +00001800 MacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
Richard Smith49f906a2014-03-01 00:08:04 +00001801 if (!MI)
Richard Smithdaa69e02014-07-25 04:40:03 +00001802 return PP.AllocateUndefMacroDirective(ImportLoc, SubModID,
1803 getOverriddenSubmodules());
1804 return PP.AllocateDefMacroDirective(MI, ImportLoc, SubModID,
1805 getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00001806 }
1807};
1808
1809ASTReader::ModuleMacroInfo *
1810ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
1811 ModuleMacroInfo Info;
1812
1813 uint32_t ID = PMInfo.ModuleMacroData.MacID;
1814 if (ID & 1) {
1815 // Macro undefinition.
1816 Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
Craig Toppera13603a2014-05-22 05:54:18 +00001817 Info.MI = nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001818 } else {
1819 // Macro definition.
1820 GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
1821 assert(GMacID);
1822
1823 // If this macro has already been loaded, don't do so again.
1824 // FIXME: This is highly dubious. Multiple macro definitions can have the
1825 // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc.
1826 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS])
Craig Toppera13603a2014-05-22 05:54:18 +00001827 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00001828
1829 Info.MI = getMacro(GMacID);
1830 Info.SubModID = Info.MI->getOwningModuleID();
1831 }
1832 Info.Overrides = PMInfo.ModuleMacroData.Overrides;
1833 Info.F = PMInfo.M;
1834
1835 return new (Context) ModuleMacroInfo(Info);
1836}
1837
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001838void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1839 const PendingMacroInfo &PMInfo) {
1840 assert(II);
1841
Richard Smithe842a472014-10-22 02:05:46 +00001842 if (PMInfo.M->Kind != MK_ImplicitModule &&
1843 PMInfo.M->Kind != MK_ExplicitModule) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001844 installPCHMacroDirectives(II, *PMInfo.M,
1845 PMInfo.PCHMacroData.MacroDirectivesOffset);
1846 return;
1847 }
Richard Smith49f906a2014-03-01 00:08:04 +00001848
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001849 // Module Macro.
1850
Richard Smith49f906a2014-03-01 00:08:04 +00001851 ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
1852 if (!MMI)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001853 return;
1854
Richard Smith49f906a2014-03-01 00:08:04 +00001855 Module *Owner = getSubmodule(MMI->getSubmoduleID());
1856 if (Owner && Owner->NameVisibility == Module::Hidden) {
1857 // Macros in the owning module are hidden. Just remember this macro to
1858 // install if we make this module visible.
1859 HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI));
1860 } else {
Richard Smithdaa69e02014-07-25 04:40:03 +00001861 installImportedMacro(II, MMI, Owner);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001862 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001863}
1864
1865void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
1866 ModuleFile &M, uint64_t Offset) {
Richard Smithe842a472014-10-22 02:05:46 +00001867 assert(M.Kind != MK_ImplicitModule && M.Kind != MK_ExplicitModule);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001868
1869 BitstreamCursor &Cursor = M.MacroCursor;
1870 SavedStreamPosition SavedPosition(Cursor);
1871 Cursor.JumpToBit(Offset);
1872
1873 llvm::BitstreamEntry Entry =
1874 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1875 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1876 Error("malformed block record in AST file");
1877 return;
1878 }
1879
1880 RecordData Record;
1881 PreprocessorRecordTypes RecType =
1882 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record);
1883 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) {
1884 Error("malformed block record in AST file");
1885 return;
1886 }
1887
1888 // Deserialize the macro directives history in reverse source-order.
Craig Toppera13603a2014-05-22 05:54:18 +00001889 MacroDirective *Latest = nullptr, *Earliest = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001890 unsigned Idx = 0, N = Record.size();
1891 while (Idx < N) {
Craig Toppera13603a2014-05-22 05:54:18 +00001892 MacroDirective *MD = nullptr;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001893 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001894 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1895 switch (K) {
1896 case MacroDirective::MD_Define: {
1897 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
1898 MacroInfo *MI = getMacro(GMacID);
Richard Smithdaa69e02014-07-25 04:40:03 +00001899 SubmoduleID ImportedFrom = Record[Idx++];
1900 bool IsAmbiguous = Record[Idx++];
1901 llvm::SmallVector<unsigned, 4> Overrides;
1902 if (ImportedFrom) {
1903 Overrides.insert(Overrides.end(),
1904 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1905 Idx += Overrides.size() + 1;
1906 }
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001907 DefMacroDirective *DefMD =
Richard Smithdaa69e02014-07-25 04:40:03 +00001908 PP.AllocateDefMacroDirective(MI, Loc, ImportedFrom, Overrides);
1909 DefMD->setAmbiguous(IsAmbiguous);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001910 MD = DefMD;
1911 break;
1912 }
Richard Smithdaa69e02014-07-25 04:40:03 +00001913 case MacroDirective::MD_Undefine: {
1914 SubmoduleID ImportedFrom = Record[Idx++];
1915 llvm::SmallVector<unsigned, 4> Overrides;
1916 if (ImportedFrom) {
1917 Overrides.insert(Overrides.end(),
1918 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1919 Idx += Overrides.size() + 1;
1920 }
1921 MD = PP.AllocateUndefMacroDirective(Loc, ImportedFrom, Overrides);
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001922 break;
Richard Smithdaa69e02014-07-25 04:40:03 +00001923 }
1924 case MacroDirective::MD_Visibility:
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00001925 bool isPublic = Record[Idx++];
1926 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1927 break;
1928 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001929
1930 if (!Latest)
1931 Latest = MD;
1932 if (Earliest)
1933 Earliest->setPrevious(MD);
1934 Earliest = MD;
1935 }
1936
1937 PP.setLoadedMacroDirective(II, Latest);
1938}
1939
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001940/// \brief For the given macro definitions, check if they are both in system
Douglas Gregor0b202052013-04-12 21:00:54 +00001941/// modules.
1942static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
Douglas Gregor5e461192013-06-07 22:56:11 +00001943 Module *NewOwner, ASTReader &Reader) {
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001944 assert(PrevMI && NewMI);
Craig Toppera13603a2014-05-22 05:54:18 +00001945 Module *PrevOwner = nullptr;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001946 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID())
1947 PrevOwner = Reader.getSubmodule(PrevModID);
Douglas Gregor5e461192013-06-07 22:56:11 +00001948 SourceManager &SrcMgr = Reader.getSourceManager();
1949 bool PrevInSystem
1950 = PrevOwner? PrevOwner->IsSystem
1951 : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc());
1952 bool NewInSystem
1953 = NewOwner? NewOwner->IsSystem
1954 : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc());
1955 if (PrevOwner && PrevOwner == NewOwner)
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001956 return false;
Douglas Gregor5e461192013-06-07 22:56:11 +00001957 return PrevInSystem && NewInSystem;
Argyrios Kyrtzidis3a9c42c2013-03-27 01:25:34 +00001958}
1959
Richard Smith49f906a2014-03-01 00:08:04 +00001960void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001961 SourceLocation ImportLoc,
Richard Smith49f906a2014-03-01 00:08:04 +00001962 AmbiguousMacros &Ambig,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001963 ArrayRef<SubmoduleID> Overrides) {
Richard Smith49f906a2014-03-01 00:08:04 +00001964 for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
1965 SubmoduleID OwnerID = Overrides[OI];
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001966
Richard Smith49f906a2014-03-01 00:08:04 +00001967 // If this macro is not yet visible, remove it from the hidden names list.
Richard Smithbb853c72014-08-13 01:23:33 +00001968 // It won't be there if we're in the middle of making the owner visible.
Richard Smith49f906a2014-03-01 00:08:04 +00001969 Module *Owner = getSubmodule(OwnerID);
Richard Smithbb853c72014-08-13 01:23:33 +00001970 auto HiddenIt = HiddenNamesMap.find(Owner);
1971 if (HiddenIt != HiddenNamesMap.end()) {
1972 HiddenNames &Hidden = HiddenIt->second;
1973 HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
1974 if (HI != Hidden.HiddenMacros.end()) {
1975 // Register the macro now so we don't lose it when we re-export.
1976 PP.appendMacroDirective(II, HI->second->import(PP, ImportLoc));
Richard Smithdaa69e02014-07-25 04:40:03 +00001977
Richard Smithbb853c72014-08-13 01:23:33 +00001978 auto SubOverrides = HI->second->getOverriddenSubmodules();
1979 Hidden.HiddenMacros.erase(HI);
1980 removeOverriddenMacros(II, ImportLoc, Ambig, SubOverrides);
1981 }
Richard Smith49f906a2014-03-01 00:08:04 +00001982 }
1983
1984 // If this macro is already in our list of conflicts, remove it from there.
Richard Smithbb29e512014-03-06 00:33:23 +00001985 Ambig.erase(
1986 std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
1987 return MD->getInfo()->getOwningModuleID() == OwnerID;
1988 }),
1989 Ambig.end());
Richard Smith49f906a2014-03-01 00:08:04 +00001990 }
1991}
1992
1993ASTReader::AmbiguousMacros *
1994ASTReader::removeOverriddenMacros(IdentifierInfo *II,
Richard Smithdaa69e02014-07-25 04:40:03 +00001995 SourceLocation ImportLoc,
Craig Topper00bbdcf2014-06-28 23:22:23 +00001996 ArrayRef<SubmoduleID> Overrides) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00001997 MacroDirective *Prev = PP.getMacroDirective(II);
Richard Smith49f906a2014-03-01 00:08:04 +00001998 if (!Prev && Overrides.empty())
Craig Toppera13603a2014-05-22 05:54:18 +00001999 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00002000
Craig Toppera13603a2014-05-22 05:54:18 +00002001 DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective()
2002 : nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00002003 if (PrevDef && PrevDef->isAmbiguous()) {
2004 // We had a prior ambiguity. Check whether we resolve it (or make it worse).
2005 AmbiguousMacros &Ambig = AmbiguousMacroDefs[II];
2006 Ambig.push_back(PrevDef);
2007
Richard Smithdaa69e02014-07-25 04:40:03 +00002008 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00002009
2010 if (!Ambig.empty())
2011 return &Ambig;
2012
2013 AmbiguousMacroDefs.erase(II);
2014 } else {
2015 // There's no ambiguity yet. Maybe we're introducing one.
Benjamin Kramer834652a2014-05-03 18:44:26 +00002016 AmbiguousMacros Ambig;
Richard Smith49f906a2014-03-01 00:08:04 +00002017 if (PrevDef)
2018 Ambig.push_back(PrevDef);
2019
Richard Smithdaa69e02014-07-25 04:40:03 +00002020 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
Richard Smith49f906a2014-03-01 00:08:04 +00002021
2022 if (!Ambig.empty()) {
2023 AmbiguousMacros &Result = AmbiguousMacroDefs[II];
Benjamin Kramer834652a2014-05-03 18:44:26 +00002024 std::swap(Result, Ambig);
Richard Smith49f906a2014-03-01 00:08:04 +00002025 return &Result;
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002026 }
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002027 }
Richard Smith49f906a2014-03-01 00:08:04 +00002028
2029 // We ended up with no ambiguity.
Craig Toppera13603a2014-05-22 05:54:18 +00002030 return nullptr;
Richard Smith49f906a2014-03-01 00:08:04 +00002031}
2032
2033void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI,
Richard Smithdaa69e02014-07-25 04:40:03 +00002034 Module *Owner) {
Richard Smith49f906a2014-03-01 00:08:04 +00002035 assert(II && Owner);
2036
2037 SourceLocation ImportLoc = Owner->MacroVisibilityLoc;
Richard Smithdaa69e02014-07-25 04:40:03 +00002038 if (ImportLoc.isInvalid()) {
Richard Smith49f906a2014-03-01 00:08:04 +00002039 // FIXME: If we made macros from this module visible but didn't provide a
2040 // source location for the import, we don't have a location for the macro.
2041 // Use the location at which the containing module file was first imported
2042 // for now.
2043 ImportLoc = MMI->F->DirectImportLoc;
Richard Smith56be7542014-03-21 00:33:59 +00002044 assert(ImportLoc.isValid() && "no import location for a visible macro?");
Richard Smith49f906a2014-03-01 00:08:04 +00002045 }
2046
Benjamin Kramer834652a2014-05-03 18:44:26 +00002047 AmbiguousMacros *Prev =
Richard Smithdaa69e02014-07-25 04:40:03 +00002048 removeOverriddenMacros(II, ImportLoc, MMI->getOverriddenSubmodules());
Richard Smith49f906a2014-03-01 00:08:04 +00002049
Richard Smith49f906a2014-03-01 00:08:04 +00002050 // Create a synthetic macro definition corresponding to the import (or null
2051 // if this was an undefinition of the macro).
Richard Smithdaa69e02014-07-25 04:40:03 +00002052 MacroDirective *Imported = MMI->import(PP, ImportLoc);
2053 DefMacroDirective *MD = dyn_cast<DefMacroDirective>(Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002054
2055 // If there's no ambiguity, just install the macro.
2056 if (!Prev) {
Richard Smithdaa69e02014-07-25 04:40:03 +00002057 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002058 return;
2059 }
2060 assert(!Prev->empty());
2061
2062 if (!MD) {
2063 // We imported a #undef that didn't remove all prior definitions. The most
2064 // recent prior definition remains, and we install it in the place of the
Richard Smithdaa69e02014-07-25 04:40:03 +00002065 // imported directive, as if by a local #pragma pop_macro.
Richard Smith49f906a2014-03-01 00:08:04 +00002066 MacroInfo *NewMI = Prev->back()->getInfo();
2067 Prev->pop_back();
Richard Smithdaa69e02014-07-25 04:40:03 +00002068 MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc);
2069
2070 // Install our #undef first so that we don't lose track of it. We'll replace
2071 // this with whichever macro definition ends up winning.
2072 PP.appendMacroDirective(II, Imported);
Richard Smith49f906a2014-03-01 00:08:04 +00002073 }
2074
2075 // We're introducing a macro definition that creates or adds to an ambiguity.
2076 // We can resolve that ambiguity if this macro is token-for-token identical to
2077 // all of the existing definitions.
2078 MacroInfo *NewMI = MD->getInfo();
2079 assert(NewMI && "macro definition with no MacroInfo?");
2080 while (!Prev->empty()) {
2081 MacroInfo *PrevMI = Prev->back()->getInfo();
2082 assert(PrevMI && "macro definition with no MacroInfo?");
2083
2084 // Before marking the macros as ambiguous, check if this is a case where
2085 // both macros are in system headers. If so, we trust that the system
2086 // did not get it wrong. This also handles cases where Clang's own
2087 // headers have a different spelling of certain system macros:
2088 // #define LONG_MAX __LONG_MAX__ (clang's limits.h)
2089 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
2090 //
2091 // FIXME: Remove the defined-in-system-headers check. clang's limits.h
2092 // overrides the system limits.h's macros, so there's no conflict here.
2093 if (NewMI != PrevMI &&
2094 !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) &&
2095 !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this))
2096 break;
2097
2098 // The previous definition is the same as this one (or both are defined in
2099 // system modules so we can assume they're equivalent); we don't need to
2100 // track it any more.
2101 Prev->pop_back();
2102 }
2103
2104 if (!Prev->empty())
2105 MD->setAmbiguous(true);
2106
Argyrios Kyrtzidisb6210df2013-03-26 17:17:01 +00002107 PP.appendMacroDirective(II, MD);
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00002108}
2109
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002110ASTReader::InputFileInfo
2111ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002112 // Go find this input file.
2113 BitstreamCursor &Cursor = F.InputFilesCursor;
2114 SavedStreamPosition SavedPosition(Cursor);
2115 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2116
2117 unsigned Code = Cursor.ReadCode();
2118 RecordData Record;
2119 StringRef Blob;
2120
2121 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2122 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
2123 "invalid record type for input file");
2124 (void)Result;
2125
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002126 std::string Filename;
2127 off_t StoredSize;
2128 time_t StoredTime;
2129 bool Overridden;
Richard Smith7ed1bc92014-12-05 22:42:13 +00002130
Ben Langmuir198c1682014-03-07 07:27:49 +00002131 assert(Record[0] == ID && "Bogus stored ID or offset");
2132 StoredSize = static_cast<off_t>(Record[1]);
2133 StoredTime = static_cast<time_t>(Record[2]);
2134 Overridden = static_cast<bool>(Record[3]);
2135 Filename = Blob;
Richard Smith7ed1bc92014-12-05 22:42:13 +00002136 ResolveImportedPath(F, Filename);
2137
Hans Wennborg73945142014-03-14 17:45:06 +00002138 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
2139 return R;
Ben Langmuir198c1682014-03-07 07:27:49 +00002140}
2141
2142std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002143 return readInputFileInfo(F, ID).Filename;
Ben Langmuir198c1682014-03-07 07:27:49 +00002144}
2145
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002146InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002147 // If this ID is bogus, just return an empty input file.
2148 if (ID == 0 || ID > F.InputFilesLoaded.size())
2149 return InputFile();
2150
2151 // If we've already loaded this input file, return it.
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002152 if (F.InputFilesLoaded[ID-1].getFile())
Guy Benyei11169dd2012-12-18 14:30:41 +00002153 return F.InputFilesLoaded[ID-1];
2154
Argyrios Kyrtzidis9308f0a2014-01-08 19:13:34 +00002155 if (F.InputFilesLoaded[ID-1].isNotFound())
2156 return InputFile();
2157
Guy Benyei11169dd2012-12-18 14:30:41 +00002158 // Go find this input file.
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002159 BitstreamCursor &Cursor = F.InputFilesCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00002160 SavedStreamPosition SavedPosition(Cursor);
2161 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2162
Argyrios Kyrtzidisce9b49e2014-03-14 02:26:27 +00002163 InputFileInfo FI = readInputFileInfo(F, ID);
2164 off_t StoredSize = FI.StoredSize;
2165 time_t StoredTime = FI.StoredTime;
2166 bool Overridden = FI.Overridden;
2167 StringRef Filename = FI.Filename;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002168
Ben Langmuir198c1682014-03-07 07:27:49 +00002169 const FileEntry *File
2170 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
2171 : FileMgr.getFile(Filename, /*OpenFile=*/false);
2172
2173 // If we didn't find the file, resolve it relative to the
2174 // original directory from which this AST file was created.
Craig Toppera13603a2014-05-22 05:54:18 +00002175 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
Ben Langmuir198c1682014-03-07 07:27:49 +00002176 F.OriginalDir != CurrentDir) {
2177 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2178 F.OriginalDir,
2179 CurrentDir);
2180 if (!Resolved.empty())
2181 File = FileMgr.getFile(Resolved);
2182 }
2183
2184 // For an overridden file, create a virtual file with the stored
2185 // size/timestamp.
Craig Toppera13603a2014-05-22 05:54:18 +00002186 if (Overridden && File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002187 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2188 }
2189
Craig Toppera13603a2014-05-22 05:54:18 +00002190 if (File == nullptr) {
Ben Langmuir198c1682014-03-07 07:27:49 +00002191 if (Complain) {
2192 std::string ErrorStr = "could not find file '";
2193 ErrorStr += Filename;
2194 ErrorStr += "' referenced by AST file";
2195 Error(ErrorStr.c_str());
Guy Benyei11169dd2012-12-18 14:30:41 +00002196 }
Ben Langmuir198c1682014-03-07 07:27:49 +00002197 // Record that we didn't find the file.
2198 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2199 return InputFile();
2200 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002201
Ben Langmuir198c1682014-03-07 07:27:49 +00002202 // Check if there was a request to override the contents of the file
2203 // that was part of the precompiled header. Overridding such a file
2204 // can lead to problems when lexing using the source locations from the
2205 // PCH.
2206 SourceManager &SM = getSourceManager();
2207 if (!Overridden && SM.isFileOverridden(File)) {
2208 if (Complain)
2209 Error(diag::err_fe_pch_file_overridden, Filename);
2210 // After emitting the diagnostic, recover by disabling the override so
2211 // that the original file will be used.
2212 SM.disableFileContentsOverride(File);
2213 // The FileEntry is a virtual file entry with the size of the contents
2214 // that would override the original contents. Set it to the original's
2215 // size/time.
2216 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2217 StoredSize, StoredTime);
2218 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002219
Ben Langmuir198c1682014-03-07 07:27:49 +00002220 bool IsOutOfDate = false;
2221
2222 // For an overridden file, there is nothing to validate.
Richard Smith96fdab62014-10-28 16:24:08 +00002223 if (!Overridden && //
2224 (StoredSize != File->getSize() ||
2225#if defined(LLVM_ON_WIN32)
2226 false
2227#else
Ben Langmuir198c1682014-03-07 07:27:49 +00002228 // In our regression testing, the Windows file system seems to
2229 // have inconsistent modification times that sometimes
2230 // erroneously trigger this error-handling path.
Richard Smith96fdab62014-10-28 16:24:08 +00002231 //
2232 // This also happens in networked file systems, so disable this
2233 // check if validation is disabled or if we have an explicitly
2234 // built PCM file.
2235 //
2236 // FIXME: Should we also do this for PCH files? They could also
2237 // reasonably get shared across a network during a distributed build.
2238 (StoredTime != File->getModificationTime() && !DisableValidation &&
2239 F.Kind != MK_ExplicitModule)
Guy Benyei11169dd2012-12-18 14:30:41 +00002240#endif
Ben Langmuir198c1682014-03-07 07:27:49 +00002241 )) {
2242 if (Complain) {
2243 // Build a list of the PCH imports that got us here (in reverse).
2244 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2245 while (ImportStack.back()->ImportedBy.size() > 0)
2246 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
Ben Langmuire82630d2014-01-17 00:19:09 +00002247
Ben Langmuir198c1682014-03-07 07:27:49 +00002248 // The top-level PCH is stale.
2249 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2250 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
Ben Langmuire82630d2014-01-17 00:19:09 +00002251
Ben Langmuir198c1682014-03-07 07:27:49 +00002252 // Print the import stack.
2253 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2254 Diag(diag::note_pch_required_by)
2255 << Filename << ImportStack[0]->FileName;
2256 for (unsigned I = 1; I < ImportStack.size(); ++I)
Ben Langmuire82630d2014-01-17 00:19:09 +00002257 Diag(diag::note_pch_required_by)
Ben Langmuir198c1682014-03-07 07:27:49 +00002258 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
Douglas Gregor7029ce12013-03-19 00:28:20 +00002259 }
2260
Ben Langmuir198c1682014-03-07 07:27:49 +00002261 if (!Diags.isDiagnosticInFlight())
2262 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
Guy Benyei11169dd2012-12-18 14:30:41 +00002263 }
2264
Ben Langmuir198c1682014-03-07 07:27:49 +00002265 IsOutOfDate = true;
Guy Benyei11169dd2012-12-18 14:30:41 +00002266 }
2267
Ben Langmuir198c1682014-03-07 07:27:49 +00002268 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
2269
2270 // Note that we've loaded this input file.
2271 F.InputFilesLoaded[ID-1] = IF;
2272 return IF;
Guy Benyei11169dd2012-12-18 14:30:41 +00002273}
2274
Richard Smith7ed1bc92014-12-05 22:42:13 +00002275/// \brief If we are loading a relocatable PCH or module file, and the filename
2276/// is not an absolute path, add the system or module root to the beginning of
2277/// the file name.
2278void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2279 // Resolve relative to the base directory, if we have one.
2280 if (!M.BaseDirectory.empty())
2281 return ResolveImportedPath(Filename, M.BaseDirectory);
Guy Benyei11169dd2012-12-18 14:30:41 +00002282}
2283
Richard Smith7ed1bc92014-12-05 22:42:13 +00002284void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002285 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2286 return;
2287
Richard Smith7ed1bc92014-12-05 22:42:13 +00002288 SmallString<128> Buffer;
2289 llvm::sys::path::append(Buffer, Prefix, Filename);
2290 Filename.assign(Buffer.begin(), Buffer.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00002291}
2292
2293ASTReader::ASTReadResult
2294ASTReader::ReadControlBlock(ModuleFile &F,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00002295 SmallVectorImpl<ImportedModule> &Loaded,
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002296 const ModuleFile *ImportedBy,
Guy Benyei11169dd2012-12-18 14:30:41 +00002297 unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002298 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002299
2300 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2301 Error("malformed block record in AST file");
2302 return Failure;
2303 }
2304
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002305 // Should we allow the configuration of the module file to differ from the
2306 // configuration of the current translation unit in a compatible way?
2307 //
2308 // FIXME: Allow this for files explicitly specified with -include-pch too.
2309 bool AllowCompatibleConfigurationMismatch = F.Kind == MK_ExplicitModule;
2310
Guy Benyei11169dd2012-12-18 14:30:41 +00002311 // Read all of the records and blocks in the control block.
2312 RecordData Record;
Richard Smitha1825302014-10-23 22:18:29 +00002313 unsigned NumInputs = 0;
2314 unsigned NumUserInputs = 0;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002315 while (1) {
2316 llvm::BitstreamEntry Entry = Stream.advance();
2317
2318 switch (Entry.Kind) {
2319 case llvm::BitstreamEntry::Error:
2320 Error("malformed block record in AST file");
2321 return Failure;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002322 case llvm::BitstreamEntry::EndBlock: {
2323 // Validate input files.
2324 const HeaderSearchOptions &HSOpts =
2325 PP.getHeaderSearchInfo().getHeaderSearchOpts();
Ben Langmuircb69b572014-03-07 06:40:32 +00002326
Richard Smitha1825302014-10-23 22:18:29 +00002327 // All user input files reside at the index range [0, NumUserInputs), and
2328 // system input files reside at [NumUserInputs, NumInputs).
Ben Langmuiracb803e2014-11-10 22:13:10 +00002329 if (!DisableValidation) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002330 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
Ben Langmuircb69b572014-03-07 06:40:32 +00002331
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002332 // If we are reading a module, we will create a verification timestamp,
2333 // so we verify all input files. Otherwise, verify only user input
2334 // files.
Ben Langmuircb69b572014-03-07 06:40:32 +00002335
2336 unsigned N = NumUserInputs;
2337 if (ValidateSystemInputs ||
Richard Smithe842a472014-10-22 02:05:46 +00002338 (HSOpts.ModulesValidateOncePerBuildSession &&
Ben Langmuiracb803e2014-11-10 22:13:10 +00002339 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
Richard Smithe842a472014-10-22 02:05:46 +00002340 F.Kind == MK_ImplicitModule))
Ben Langmuircb69b572014-03-07 06:40:32 +00002341 N = NumInputs;
2342
Ben Langmuir3d4417c2014-02-07 17:31:11 +00002343 for (unsigned I = 0; I < N; ++I) {
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002344 InputFile IF = getInputFile(F, I+1, Complain);
2345 if (!IF.getFile() || IF.isOutOfDate())
Guy Benyei11169dd2012-12-18 14:30:41 +00002346 return OutOfDate;
Argyrios Kyrtzidis61c3d872013-03-01 03:26:04 +00002347 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002348 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002349
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +00002350 if (Listener)
2351 Listener->visitModuleFile(F.FileName);
2352
Ben Langmuircb69b572014-03-07 06:40:32 +00002353 if (Listener && Listener->needsInputFileVisitation()) {
2354 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2355 : NumUserInputs;
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00002356 for (unsigned I = 0; I < N; ++I) {
2357 bool IsSystem = I >= NumUserInputs;
2358 InputFileInfo FI = readInputFileInfo(F, I+1);
2359 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2360 }
Ben Langmuircb69b572014-03-07 06:40:32 +00002361 }
2362
Guy Benyei11169dd2012-12-18 14:30:41 +00002363 return Success;
Dmitri Gribenkof430da42014-02-12 10:33:14 +00002364 }
2365
Chris Lattnere7b154b2013-01-19 21:39:22 +00002366 case llvm::BitstreamEntry::SubBlock:
2367 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002368 case INPUT_FILES_BLOCK_ID:
2369 F.InputFilesCursor = Stream;
2370 if (Stream.SkipBlock() || // Skip with the main cursor
2371 // Read the abbreviations
2372 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2373 Error("malformed block record in AST file");
2374 return Failure;
2375 }
2376 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002377
Guy Benyei11169dd2012-12-18 14:30:41 +00002378 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002379 if (Stream.SkipBlock()) {
2380 Error("malformed block record in AST file");
2381 return Failure;
2382 }
2383 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00002384 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002385
2386 case llvm::BitstreamEntry::Record:
2387 // The interesting case.
2388 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002389 }
2390
2391 // Read and process a record.
2392 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002393 StringRef Blob;
2394 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002395 case METADATA: {
2396 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2397 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002398 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2399 : diag::err_pch_version_too_new);
Guy Benyei11169dd2012-12-18 14:30:41 +00002400 return VersionMismatch;
2401 }
2402
2403 bool hasErrors = Record[5];
2404 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2405 Diag(diag::err_pch_with_compiler_errors);
2406 return HadErrors;
2407 }
2408
2409 F.RelocatablePCH = Record[4];
Richard Smith7ed1bc92014-12-05 22:42:13 +00002410 // Relative paths in a relocatable PCH are relative to our sysroot.
2411 if (F.RelocatablePCH)
2412 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
Guy Benyei11169dd2012-12-18 14:30:41 +00002413
2414 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002415 StringRef ASTBranch = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002416 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2417 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00002418 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
Guy Benyei11169dd2012-12-18 14:30:41 +00002419 return VersionMismatch;
2420 }
2421 break;
2422 }
2423
Ben Langmuir487ea142014-10-23 18:05:36 +00002424 case SIGNATURE:
2425 assert((!F.Signature || F.Signature == Record[0]) && "signature changed");
2426 F.Signature = Record[0];
2427 break;
2428
Guy Benyei11169dd2012-12-18 14:30:41 +00002429 case IMPORTS: {
2430 // Load each of the imported PCH files.
2431 unsigned Idx = 0, N = Record.size();
2432 while (Idx < N) {
2433 // Read information about the AST file.
2434 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2435 // The import location will be the local one for now; we will adjust
2436 // all import locations of module imports after the global source
2437 // location info are setup.
2438 SourceLocation ImportLoc =
2439 SourceLocation::getFromRawEncoding(Record[Idx++]);
Douglas Gregor7029ce12013-03-19 00:28:20 +00002440 off_t StoredSize = (off_t)Record[Idx++];
2441 time_t StoredModTime = (time_t)Record[Idx++];
Ben Langmuir487ea142014-10-23 18:05:36 +00002442 ASTFileSignature StoredSignature = Record[Idx++];
Richard Smith7ed1bc92014-12-05 22:42:13 +00002443 auto ImportedFile = ReadPath(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00002444
2445 // Load the AST file.
2446 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00002447 StoredSize, StoredModTime, StoredSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00002448 ClientLoadCapabilities)) {
2449 case Failure: return Failure;
2450 // If we have to ignore the dependency, we'll have to ignore this too.
Douglas Gregor2f1806e2013-03-19 00:38:50 +00002451 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00002452 case OutOfDate: return OutOfDate;
2453 case VersionMismatch: return VersionMismatch;
2454 case ConfigurationMismatch: return ConfigurationMismatch;
2455 case HadErrors: return HadErrors;
2456 case Success: break;
2457 }
2458 }
2459 break;
2460 }
2461
2462 case LANGUAGE_OPTIONS: {
2463 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002464 // FIXME: The &F == *ModuleMgr.begin() check is wrong for modules.
Guy Benyei11169dd2012-12-18 14:30:41 +00002465 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002466 ParseLanguageOptions(Record, Complain, *Listener,
2467 AllowCompatibleConfigurationMismatch) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002468 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002469 return ConfigurationMismatch;
2470 break;
2471 }
2472
2473 case TARGET_OPTIONS: {
2474 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2475 if (Listener && &F == *ModuleMgr.begin() &&
2476 ParseTargetOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002477 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002478 return ConfigurationMismatch;
2479 break;
2480 }
2481
2482 case DIAGNOSTIC_OPTIONS: {
Ben Langmuirb92de022014-04-29 16:25:26 +00002483 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
Guy Benyei11169dd2012-12-18 14:30:41 +00002484 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002485 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002486 ParseDiagnosticOptions(Record, Complain, *Listener) &&
Ben Langmuirb92de022014-04-29 16:25:26 +00002487 !DisableValidation)
2488 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00002489 break;
2490 }
2491
2492 case FILE_SYSTEM_OPTIONS: {
2493 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2494 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002495 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002496 ParseFileSystemOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002497 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002498 return ConfigurationMismatch;
2499 break;
2500 }
2501
2502 case HEADER_SEARCH_OPTIONS: {
2503 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2504 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002505 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002506 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002507 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002508 return ConfigurationMismatch;
2509 break;
2510 }
2511
2512 case PREPROCESSOR_OPTIONS: {
2513 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2514 if (Listener && &F == *ModuleMgr.begin() &&
Richard Smith1e2cf0d2014-10-31 02:28:58 +00002515 !AllowCompatibleConfigurationMismatch &&
Guy Benyei11169dd2012-12-18 14:30:41 +00002516 ParsePreprocessorOptions(Record, Complain, *Listener,
2517 SuggestedPredefines) &&
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002518 !DisableValidation && !AllowConfigurationMismatch)
Guy Benyei11169dd2012-12-18 14:30:41 +00002519 return ConfigurationMismatch;
2520 break;
2521 }
2522
2523 case ORIGINAL_FILE:
2524 F.OriginalSourceFileID = FileID::get(Record[0]);
Chris Lattner0e6c9402013-01-20 02:38:54 +00002525 F.ActualOriginalSourceFileName = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002526 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
Richard Smith7ed1bc92014-12-05 22:42:13 +00002527 ResolveImportedPath(F, F.OriginalSourceFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00002528 break;
2529
2530 case ORIGINAL_FILE_ID:
2531 F.OriginalSourceFileID = FileID::get(Record[0]);
2532 break;
2533
2534 case ORIGINAL_PCH_DIR:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002535 F.OriginalDir = Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00002536 break;
2537
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002538 case MODULE_NAME:
2539 F.ModuleName = Blob;
Ben Langmuir4f5212a2014-04-14 22:12:44 +00002540 if (Listener)
2541 Listener->ReadModuleName(F.ModuleName);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002542 break;
2543
Richard Smith223d3f22014-12-06 03:21:08 +00002544 case MODULE_DIRECTORY: {
2545 assert(!F.ModuleName.empty() &&
2546 "MODULE_DIRECTORY found before MODULE_NAME");
2547 // If we've already loaded a module map file covering this module, we may
2548 // have a better path for it (relative to the current build).
2549 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2550 if (M && M->Directory) {
2551 // If we're implicitly loading a module, the base directory can't
2552 // change between the build and use.
2553 if (F.Kind != MK_ExplicitModule) {
2554 const DirectoryEntry *BuildDir =
2555 PP.getFileManager().getDirectory(Blob);
2556 if (!BuildDir || BuildDir != M->Directory) {
2557 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2558 Diag(diag::err_imported_module_relocated)
2559 << F.ModuleName << Blob << M->Directory->getName();
2560 return OutOfDate;
2561 }
2562 }
2563 F.BaseDirectory = M->Directory->getName();
2564 } else {
2565 F.BaseDirectory = Blob;
2566 }
Richard Smith7ed1bc92014-12-05 22:42:13 +00002567 break;
Richard Smith223d3f22014-12-06 03:21:08 +00002568 }
Richard Smith7ed1bc92014-12-05 22:42:13 +00002569
Ben Langmuirbeee15e2014-04-14 18:00:01 +00002570 case MODULE_MAP_FILE:
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00002571 if (ASTReadResult Result =
2572 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2573 return Result;
Ben Langmuir264ea152014-11-08 00:06:39 +00002574 break;
2575
Guy Benyei11169dd2012-12-18 14:30:41 +00002576 case INPUT_FILE_OFFSETS:
Richard Smitha1825302014-10-23 22:18:29 +00002577 NumInputs = Record[0];
2578 NumUserInputs = Record[1];
Richard Smithec216502015-02-13 19:48:37 +00002579 F.InputFileOffsets = (const uint64_t *)Blob.data();
Richard Smitha1825302014-10-23 22:18:29 +00002580 F.InputFilesLoaded.resize(NumInputs);
Guy Benyei11169dd2012-12-18 14:30:41 +00002581 break;
2582 }
2583 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002584}
2585
Ben Langmuir2c9af442014-04-10 17:57:43 +00002586ASTReader::ASTReadResult
2587ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002588 BitstreamCursor &Stream = F.Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002589
2590 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2591 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002592 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002593 }
2594
2595 // Read all of the records and blocks for the AST file.
2596 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002597 while (1) {
2598 llvm::BitstreamEntry Entry = Stream.advance();
2599
2600 switch (Entry.Kind) {
2601 case llvm::BitstreamEntry::Error:
2602 Error("error at end of module block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002603 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002604 case llvm::BitstreamEntry::EndBlock: {
Richard Smithc0fbba72013-04-03 22:49:41 +00002605 // Outside of C++, we do not store a lookup map for the translation unit.
2606 // Instead, mark it as needing a lookup map to be built if this module
2607 // contains any declarations lexically within it (which it always does!).
2608 // This usually has no cost, since we very rarely need the lookup map for
2609 // the translation unit outside C++.
Guy Benyei11169dd2012-12-18 14:30:41 +00002610 DeclContext *DC = Context.getTranslationUnitDecl();
Richard Smithc0fbba72013-04-03 22:49:41 +00002611 if (DC->hasExternalLexicalStorage() &&
2612 !getContext().getLangOpts().CPlusPlus)
Guy Benyei11169dd2012-12-18 14:30:41 +00002613 DC->setMustBuildLookupTable();
Chris Lattnere7b154b2013-01-19 21:39:22 +00002614
Ben Langmuir2c9af442014-04-10 17:57:43 +00002615 return Success;
Guy Benyei11169dd2012-12-18 14:30:41 +00002616 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002617 case llvm::BitstreamEntry::SubBlock:
2618 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002619 case DECLTYPES_BLOCK_ID:
2620 // We lazily load the decls block, but we want to set up the
2621 // DeclsCursor cursor to point into it. Clone our current bitcode
2622 // cursor to it, enter the block and read the abbrevs in that block.
2623 // With the main cursor, we just skip over it.
2624 F.DeclsCursor = Stream;
2625 if (Stream.SkipBlock() || // Skip with the main cursor.
2626 // Read the abbrevs.
2627 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2628 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002629 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002630 }
2631 break;
Richard Smithb9eab6d2014-03-20 19:44:17 +00002632
Guy Benyei11169dd2012-12-18 14:30:41 +00002633 case PREPROCESSOR_BLOCK_ID:
2634 F.MacroCursor = Stream;
2635 if (!PP.getExternalSource())
2636 PP.setExternalSource(this);
Chris Lattnere7b154b2013-01-19 21:39:22 +00002637
Guy Benyei11169dd2012-12-18 14:30:41 +00002638 if (Stream.SkipBlock() ||
2639 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2640 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002641 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002642 }
2643 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2644 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002645
Guy Benyei11169dd2012-12-18 14:30:41 +00002646 case PREPROCESSOR_DETAIL_BLOCK_ID:
2647 F.PreprocessorDetailCursor = Stream;
2648 if (Stream.SkipBlock() ||
Chris Lattnere7b154b2013-01-19 21:39:22 +00002649 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00002650 PREPROCESSOR_DETAIL_BLOCK_ID)) {
Chris Lattnere7b154b2013-01-19 21:39:22 +00002651 Error("malformed preprocessor detail record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002652 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002653 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002654 F.PreprocessorDetailStartOffset
Chris Lattnere7b154b2013-01-19 21:39:22 +00002655 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2656
Guy Benyei11169dd2012-12-18 14:30:41 +00002657 if (!PP.getPreprocessingRecord())
2658 PP.createPreprocessingRecord();
2659 if (!PP.getPreprocessingRecord()->getExternalSource())
2660 PP.getPreprocessingRecord()->SetExternalSource(*this);
2661 break;
2662
2663 case SOURCE_MANAGER_BLOCK_ID:
2664 if (ReadSourceManagerBlock(F))
Ben Langmuir2c9af442014-04-10 17:57:43 +00002665 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002666 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002667
Guy Benyei11169dd2012-12-18 14:30:41 +00002668 case SUBMODULE_BLOCK_ID:
Ben Langmuir2c9af442014-04-10 17:57:43 +00002669 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2670 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00002671 break;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002672
Guy Benyei11169dd2012-12-18 14:30:41 +00002673 case COMMENTS_BLOCK_ID: {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00002674 BitstreamCursor C = Stream;
Guy Benyei11169dd2012-12-18 14:30:41 +00002675 if (Stream.SkipBlock() ||
2676 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2677 Error("malformed comments block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002678 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002679 }
2680 CommentsCursors.push_back(std::make_pair(C, &F));
2681 break;
2682 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00002683
Guy Benyei11169dd2012-12-18 14:30:41 +00002684 default:
Chris Lattnere7b154b2013-01-19 21:39:22 +00002685 if (Stream.SkipBlock()) {
2686 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002687 return Failure;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002688 }
2689 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002690 }
2691 continue;
Chris Lattnere7b154b2013-01-19 21:39:22 +00002692
2693 case llvm::BitstreamEntry::Record:
2694 // The interesting case.
2695 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00002696 }
2697
2698 // Read and process a record.
2699 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00002700 StringRef Blob;
2701 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00002702 default: // Default behavior: ignore.
2703 break;
2704
2705 case TYPE_OFFSET: {
2706 if (F.LocalNumTypes != 0) {
2707 Error("duplicate TYPE_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002708 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002709 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002710 F.TypeOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002711 F.LocalNumTypes = Record[0];
2712 unsigned LocalBaseTypeIndex = Record[1];
2713 F.BaseTypeIndex = getTotalNumTypes();
2714
2715 if (F.LocalNumTypes > 0) {
2716 // Introduce the global -> local mapping for types within this module.
2717 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2718
2719 // Introduce the local -> global mapping for types within this module.
2720 F.TypeRemap.insertOrReplace(
2721 std::make_pair(LocalBaseTypeIndex,
2722 F.BaseTypeIndex - LocalBaseTypeIndex));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002723
2724 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
Guy Benyei11169dd2012-12-18 14:30:41 +00002725 }
2726 break;
2727 }
2728
2729 case DECL_OFFSET: {
2730 if (F.LocalNumDecls != 0) {
2731 Error("duplicate DECL_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002732 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002733 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002734 F.DeclOffsets = (const DeclOffset *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002735 F.LocalNumDecls = Record[0];
2736 unsigned LocalBaseDeclID = Record[1];
2737 F.BaseDeclID = getTotalNumDecls();
2738
2739 if (F.LocalNumDecls > 0) {
2740 // Introduce the global -> local mapping for declarations within this
2741 // module.
2742 GlobalDeclMap.insert(
2743 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2744
2745 // Introduce the local -> global mapping for declarations within this
2746 // module.
2747 F.DeclRemap.insertOrReplace(
2748 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2749
2750 // Introduce the global -> local mapping for declarations within this
2751 // module.
2752 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
Ben Langmuirfe971d92014-08-16 04:54:18 +00002753
Ben Langmuir52ca6782014-10-20 16:27:32 +00002754 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2755 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002756 break;
2757 }
2758
2759 case TU_UPDATE_LEXICAL: {
2760 DeclContext *TU = Context.getTranslationUnitDecl();
2761 DeclContextInfo &Info = F.DeclContextInfos[TU];
Chris Lattner0e6c9402013-01-20 02:38:54 +00002762 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
Guy Benyei11169dd2012-12-18 14:30:41 +00002763 Info.NumLexicalDecls
Chris Lattner0e6c9402013-01-20 02:38:54 +00002764 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
Guy Benyei11169dd2012-12-18 14:30:41 +00002765 TU->setHasExternalLexicalStorage(true);
2766 break;
2767 }
2768
2769 case UPDATE_VISIBLE: {
2770 unsigned Idx = 0;
2771 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2772 ASTDeclContextNameLookupTable *Table =
Justin Bognerda4e6502014-04-14 16:34:29 +00002773 ASTDeclContextNameLookupTable::Create(
2774 (const unsigned char *)Blob.data() + Record[Idx++],
2775 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2776 (const unsigned char *)Blob.data(),
2777 ASTDeclContextNameLookupTrait(*this, F));
Richard Smithcd45dbc2014-04-19 03:48:30 +00002778 if (Decl *D = GetExistingDecl(ID)) {
Richard Smithd9174792014-03-11 03:10:46 +00002779 auto *DC = cast<DeclContext>(D);
2780 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
Richard Smith52e3fba2014-03-11 07:17:35 +00002781 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2782 delete LookupTable;
2783 LookupTable = Table;
Guy Benyei11169dd2012-12-18 14:30:41 +00002784 } else
2785 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2786 break;
2787 }
2788
2789 case IDENTIFIER_TABLE:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002790 F.IdentifierTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002791 if (Record[0]) {
Justin Bognerda4e6502014-04-14 16:34:29 +00002792 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2793 (const unsigned char *)F.IdentifierTableData + Record[0],
2794 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2795 (const unsigned char *)F.IdentifierTableData,
2796 ASTIdentifierLookupTrait(*this, F));
Guy Benyei11169dd2012-12-18 14:30:41 +00002797
2798 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2799 }
2800 break;
2801
2802 case IDENTIFIER_OFFSET: {
2803 if (F.LocalNumIdentifiers != 0) {
2804 Error("duplicate IDENTIFIER_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002805 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002806 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00002807 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002808 F.LocalNumIdentifiers = Record[0];
2809 unsigned LocalBaseIdentifierID = Record[1];
2810 F.BaseIdentifierID = getTotalNumIdentifiers();
2811
2812 if (F.LocalNumIdentifiers > 0) {
2813 // Introduce the global -> local mapping for identifiers within this
2814 // module.
2815 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2816 &F));
2817
2818 // Introduce the local -> global mapping for identifiers within this
2819 // module.
2820 F.IdentifierRemap.insertOrReplace(
2821 std::make_pair(LocalBaseIdentifierID,
2822 F.BaseIdentifierID - LocalBaseIdentifierID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00002823
Ben Langmuir52ca6782014-10-20 16:27:32 +00002824 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2825 + F.LocalNumIdentifiers);
2826 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002827 break;
2828 }
2829
Ben Langmuir332aafe2014-01-31 01:06:56 +00002830 case EAGERLY_DESERIALIZED_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002831 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Ben Langmuir332aafe2014-01-31 01:06:56 +00002832 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002833 break;
2834
2835 case SPECIAL_TYPES:
Douglas Gregor44180f82013-02-01 23:45:03 +00002836 if (SpecialTypes.empty()) {
2837 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2838 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2839 break;
2840 }
2841
2842 if (SpecialTypes.size() != Record.size()) {
2843 Error("invalid special-types record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002844 return Failure;
Douglas Gregor44180f82013-02-01 23:45:03 +00002845 }
2846
2847 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2848 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2849 if (!SpecialTypes[I])
2850 SpecialTypes[I] = ID;
2851 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2852 // merge step?
2853 }
Guy Benyei11169dd2012-12-18 14:30:41 +00002854 break;
2855
2856 case STATISTICS:
2857 TotalNumStatements += Record[0];
2858 TotalNumMacros += Record[1];
2859 TotalLexicalDeclContexts += Record[2];
2860 TotalVisibleDeclContexts += Record[3];
2861 break;
2862
2863 case UNUSED_FILESCOPED_DECLS:
2864 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2865 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2866 break;
2867
2868 case DELEGATING_CTORS:
2869 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2870 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2871 break;
2872
2873 case WEAK_UNDECLARED_IDENTIFIERS:
2874 if (Record.size() % 4 != 0) {
2875 Error("invalid weak identifiers record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00002876 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00002877 }
2878
2879 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2880 // files. This isn't the way to do it :)
2881 WeakUndeclaredIdentifiers.clear();
2882
2883 // Translate the weak, undeclared identifiers into global IDs.
2884 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2885 WeakUndeclaredIdentifiers.push_back(
2886 getGlobalIdentifierID(F, Record[I++]));
2887 WeakUndeclaredIdentifiers.push_back(
2888 getGlobalIdentifierID(F, Record[I++]));
2889 WeakUndeclaredIdentifiers.push_back(
2890 ReadSourceLocation(F, Record, I).getRawEncoding());
2891 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2892 }
2893 break;
2894
Guy Benyei11169dd2012-12-18 14:30:41 +00002895 case SELECTOR_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002896 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002897 F.LocalNumSelectors = Record[0];
2898 unsigned LocalBaseSelectorID = Record[1];
2899 F.BaseSelectorID = getTotalNumSelectors();
2900
2901 if (F.LocalNumSelectors > 0) {
2902 // Introduce the global -> local mapping for selectors within this
2903 // module.
2904 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2905
2906 // Introduce the local -> global mapping for selectors within this
2907 // module.
2908 F.SelectorRemap.insertOrReplace(
2909 std::make_pair(LocalBaseSelectorID,
2910 F.BaseSelectorID - LocalBaseSelectorID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002911
2912 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
Guy Benyei11169dd2012-12-18 14:30:41 +00002913 }
2914 break;
2915 }
2916
2917 case METHOD_POOL:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002918 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002919 if (Record[0])
2920 F.SelectorLookupTable
2921 = ASTSelectorLookupTable::Create(
2922 F.SelectorLookupTableData + Record[0],
2923 F.SelectorLookupTableData,
2924 ASTSelectorLookupTrait(*this, F));
2925 TotalNumMethodPoolEntries += Record[1];
2926 break;
2927
2928 case REFERENCED_SELECTOR_POOL:
2929 if (!Record.empty()) {
2930 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2931 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2932 Record[Idx++]));
2933 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2934 getRawEncoding());
2935 }
2936 }
2937 break;
2938
2939 case PP_COUNTER_VALUE:
2940 if (!Record.empty() && Listener)
2941 Listener->ReadCounter(F, Record[0]);
2942 break;
2943
2944 case FILE_SORTED_DECLS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002945 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002946 F.NumFileSortedDecls = Record[0];
2947 break;
2948
2949 case SOURCE_LOCATION_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002950 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002951 F.LocalNumSLocEntries = Record[0];
2952 unsigned SLocSpaceSize = Record[1];
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00002953 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Ben Langmuir52ca6782014-10-20 16:27:32 +00002954 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
Guy Benyei11169dd2012-12-18 14:30:41 +00002955 SLocSpaceSize);
2956 // Make our entry in the range map. BaseID is negative and growing, so
2957 // we invert it. Because we invert it, though, we need the other end of
2958 // the range.
2959 unsigned RangeStart =
2960 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2961 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2962 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2963
2964 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2965 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2966 GlobalSLocOffsetMap.insert(
2967 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2968 - SLocSpaceSize,&F));
2969
2970 // Initialize the remapping table.
2971 // Invalid stays invalid.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002972 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei11169dd2012-12-18 14:30:41 +00002973 // This module. Base was 2 when being compiled.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002974 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei11169dd2012-12-18 14:30:41 +00002975 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2976
2977 TotalNumSLocEntries += F.LocalNumSLocEntries;
2978 break;
2979 }
2980
2981 case MODULE_OFFSET_MAP: {
2982 // Additional remapping information.
Chris Lattner0e6c9402013-01-20 02:38:54 +00002983 const unsigned char *Data = (const unsigned char*)Blob.data();
2984 const unsigned char *DataEnd = Data + Blob.size();
Richard Smithb9eab6d2014-03-20 19:44:17 +00002985
2986 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2987 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2988 F.SLocRemap.insert(std::make_pair(0U, 0));
2989 F.SLocRemap.insert(std::make_pair(2U, 1));
2990 }
2991
Guy Benyei11169dd2012-12-18 14:30:41 +00002992 // Continuous range maps we may be updating in our module.
Ben Langmuir785180e2014-10-20 16:27:30 +00002993 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
2994 RemapBuilder;
2995 RemapBuilder SLocRemap(F.SLocRemap);
2996 RemapBuilder IdentifierRemap(F.IdentifierRemap);
2997 RemapBuilder MacroRemap(F.MacroRemap);
2998 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2999 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
3000 RemapBuilder SelectorRemap(F.SelectorRemap);
3001 RemapBuilder DeclRemap(F.DeclRemap);
3002 RemapBuilder TypeRemap(F.TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00003003
3004 while(Data < DataEnd) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00003005 using namespace llvm::support;
3006 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00003007 StringRef Name = StringRef((const char*)Data, Len);
3008 Data += Len;
3009 ModuleFile *OM = ModuleMgr.lookup(Name);
3010 if (!OM) {
3011 Error("SourceLocation remap refers to unknown module");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003012 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003013 }
3014
Justin Bogner57ba0b22014-03-28 22:03:24 +00003015 uint32_t SLocOffset =
3016 endian::readNext<uint32_t, little, unaligned>(Data);
3017 uint32_t IdentifierIDOffset =
3018 endian::readNext<uint32_t, little, unaligned>(Data);
3019 uint32_t MacroIDOffset =
3020 endian::readNext<uint32_t, little, unaligned>(Data);
3021 uint32_t PreprocessedEntityIDOffset =
3022 endian::readNext<uint32_t, little, unaligned>(Data);
3023 uint32_t SubmoduleIDOffset =
3024 endian::readNext<uint32_t, little, unaligned>(Data);
3025 uint32_t SelectorIDOffset =
3026 endian::readNext<uint32_t, little, unaligned>(Data);
3027 uint32_t DeclIDOffset =
3028 endian::readNext<uint32_t, little, unaligned>(Data);
3029 uint32_t TypeIndexOffset =
3030 endian::readNext<uint32_t, little, unaligned>(Data);
3031
Ben Langmuir785180e2014-10-20 16:27:30 +00003032 uint32_t None = std::numeric_limits<uint32_t>::max();
3033
3034 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
3035 RemapBuilder &Remap) {
3036 if (Offset != None)
3037 Remap.insert(std::make_pair(Offset,
3038 static_cast<int>(BaseOffset - Offset)));
3039 };
3040 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
3041 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
3042 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
3043 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
3044 PreprocessedEntityRemap);
3045 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
3046 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
3047 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3048 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00003049
3050 // Global -> local mappings.
3051 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3052 }
3053 break;
3054 }
3055
3056 case SOURCE_MANAGER_LINE_TABLE:
3057 if (ParseLineTable(F, Record))
Ben Langmuir2c9af442014-04-10 17:57:43 +00003058 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003059 break;
3060
3061 case SOURCE_LOCATION_PRELOADS: {
3062 // Need to transform from the local view (1-based IDs) to the global view,
3063 // which is based off F.SLocEntryBaseID.
3064 if (!F.PreloadSLocEntries.empty()) {
3065 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003066 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003067 }
3068
3069 F.PreloadSLocEntries.swap(Record);
3070 break;
3071 }
3072
3073 case EXT_VECTOR_DECLS:
3074 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3075 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3076 break;
3077
3078 case VTABLE_USES:
3079 if (Record.size() % 3 != 0) {
3080 Error("Invalid VTABLE_USES record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003081 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003082 }
3083
3084 // Later tables overwrite earlier ones.
3085 // FIXME: Modules will have some trouble with this. This is clearly not
3086 // the right way to do this.
3087 VTableUses.clear();
3088
3089 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3090 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3091 VTableUses.push_back(
3092 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3093 VTableUses.push_back(Record[Idx++]);
3094 }
3095 break;
3096
Guy Benyei11169dd2012-12-18 14:30:41 +00003097 case PENDING_IMPLICIT_INSTANTIATIONS:
3098 if (PendingInstantiations.size() % 2 != 0) {
3099 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003100 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003101 }
3102
3103 if (Record.size() % 2 != 0) {
3104 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003105 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003106 }
3107
3108 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3109 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3110 PendingInstantiations.push_back(
3111 ReadSourceLocation(F, Record, I).getRawEncoding());
3112 }
3113 break;
3114
3115 case SEMA_DECL_REFS:
Richard Smith3d8e97e2013-10-18 06:54:39 +00003116 if (Record.size() != 2) {
3117 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003118 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00003119 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003120 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3121 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3122 break;
3123
3124 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003125 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3126 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3127 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00003128
3129 unsigned LocalBasePreprocessedEntityID = Record[0];
3130
3131 unsigned StartingID;
3132 if (!PP.getPreprocessingRecord())
3133 PP.createPreprocessingRecord();
3134 if (!PP.getPreprocessingRecord()->getExternalSource())
3135 PP.getPreprocessingRecord()->SetExternalSource(*this);
3136 StartingID
3137 = PP.getPreprocessingRecord()
Ben Langmuir52ca6782014-10-20 16:27:32 +00003138 ->allocateLoadedEntities(F.NumPreprocessedEntities);
Guy Benyei11169dd2012-12-18 14:30:41 +00003139 F.BasePreprocessedEntityID = StartingID;
3140
3141 if (F.NumPreprocessedEntities > 0) {
3142 // Introduce the global -> local mapping for preprocessed entities in
3143 // this module.
3144 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3145
3146 // Introduce the local -> global mapping for preprocessed entities in
3147 // this module.
3148 F.PreprocessedEntityRemap.insertOrReplace(
3149 std::make_pair(LocalBasePreprocessedEntityID,
3150 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3151 }
3152
3153 break;
3154 }
3155
3156 case DECL_UPDATE_OFFSETS: {
3157 if (Record.size() % 2 != 0) {
3158 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003159 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003160 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00003161 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3162 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3163 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3164
3165 // If we've already loaded the decl, perform the updates when we finish
3166 // loading this block.
3167 if (Decl *D = GetExistingDecl(ID))
3168 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3169 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003170 break;
3171 }
3172
3173 case DECL_REPLACEMENTS: {
3174 if (Record.size() % 3 != 0) {
3175 Error("invalid DECL_REPLACEMENTS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003176 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003177 }
3178 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3179 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3180 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3181 break;
3182 }
3183
3184 case OBJC_CATEGORIES_MAP: {
3185 if (F.LocalNumObjCCategoriesInMap != 0) {
3186 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003187 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003188 }
3189
3190 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003191 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003192 break;
3193 }
3194
3195 case OBJC_CATEGORIES:
3196 F.ObjCCategories.swap(Record);
3197 break;
3198
3199 case CXX_BASE_SPECIFIER_OFFSETS: {
3200 if (F.LocalNumCXXBaseSpecifiers != 0) {
3201 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003202 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003203 }
3204
3205 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003206 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003207 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3208 break;
3209 }
3210
3211 case DIAG_PRAGMA_MAPPINGS:
3212 if (F.PragmaDiagMappings.empty())
3213 F.PragmaDiagMappings.swap(Record);
3214 else
3215 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3216 Record.begin(), Record.end());
3217 break;
3218
3219 case CUDA_SPECIAL_DECL_REFS:
3220 // Later tables overwrite earlier ones.
3221 // FIXME: Modules will have trouble with this.
3222 CUDASpecialDeclRefs.clear();
3223 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3224 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3225 break;
3226
3227 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003228 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003229 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003230 if (Record[0]) {
3231 F.HeaderFileInfoTable
3232 = HeaderFileInfoLookupTable::Create(
3233 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3234 (const unsigned char *)F.HeaderFileInfoTableData,
3235 HeaderFileInfoTrait(*this, F,
3236 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003237 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003238
3239 PP.getHeaderSearchInfo().SetExternalSource(this);
3240 if (!PP.getHeaderSearchInfo().getExternalLookup())
3241 PP.getHeaderSearchInfo().SetExternalLookup(this);
3242 }
3243 break;
3244 }
3245
3246 case FP_PRAGMA_OPTIONS:
3247 // Later tables overwrite earlier ones.
3248 FPPragmaOptions.swap(Record);
3249 break;
3250
3251 case OPENCL_EXTENSIONS:
3252 // Later tables overwrite earlier ones.
3253 OpenCLExtensions.swap(Record);
3254 break;
3255
3256 case TENTATIVE_DEFINITIONS:
3257 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3258 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3259 break;
3260
3261 case KNOWN_NAMESPACES:
3262 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3263 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3264 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003265
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003266 case UNDEFINED_BUT_USED:
3267 if (UndefinedButUsed.size() % 2 != 0) {
3268 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003269 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003270 }
3271
3272 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003273 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003274 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003275 }
3276 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003277 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3278 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003279 ReadSourceLocation(F, Record, I).getRawEncoding());
3280 }
3281 break;
3282
Guy Benyei11169dd2012-12-18 14:30:41 +00003283 case IMPORTED_MODULES: {
Richard Smithe842a472014-10-22 02:05:46 +00003284 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003285 // If we aren't loading a module (which has its own exports), make
3286 // all of the imported modules visible.
3287 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003288 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3289 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3290 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3291 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003292 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003293 }
3294 }
3295 break;
3296 }
3297
3298 case LOCAL_REDECLARATIONS: {
3299 F.RedeclarationChains.swap(Record);
3300 break;
3301 }
3302
3303 case LOCAL_REDECLARATIONS_MAP: {
3304 if (F.LocalNumRedeclarationsInMap != 0) {
3305 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003306 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003307 }
3308
3309 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003310 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003311 break;
3312 }
3313
Guy Benyei11169dd2012-12-18 14:30:41 +00003314 case MACRO_OFFSET: {
3315 if (F.LocalNumMacros != 0) {
3316 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003317 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003318 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003319 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003320 F.LocalNumMacros = Record[0];
3321 unsigned LocalBaseMacroID = Record[1];
3322 F.BaseMacroID = getTotalNumMacros();
3323
3324 if (F.LocalNumMacros > 0) {
3325 // Introduce the global -> local mapping for macros within this module.
3326 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3327
3328 // Introduce the local -> global mapping for macros within this module.
3329 F.MacroRemap.insertOrReplace(
3330 std::make_pair(LocalBaseMacroID,
3331 F.BaseMacroID - LocalBaseMacroID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003332
3333 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
Guy Benyei11169dd2012-12-18 14:30:41 +00003334 }
3335 break;
3336 }
3337
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00003338 case MACRO_TABLE: {
3339 // FIXME: Not used yet.
Guy Benyei11169dd2012-12-18 14:30:41 +00003340 break;
3341 }
Richard Smithe40f2ba2013-08-07 21:41:30 +00003342
3343 case LATE_PARSED_TEMPLATE: {
3344 LateParsedTemplates.append(Record.begin(), Record.end());
3345 break;
3346 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003347
3348 case OPTIMIZE_PRAGMA_OPTIONS:
3349 if (Record.size() != 1) {
3350 Error("invalid pragma optimize record");
3351 return Failure;
3352 }
3353 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3354 break;
Nico Weber72889432014-09-06 01:25:55 +00003355
3356 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3357 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3358 UnusedLocalTypedefNameCandidates.push_back(
3359 getGlobalDeclID(F, Record[I]));
3360 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003361 }
3362 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003363}
3364
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003365ASTReader::ASTReadResult
3366ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3367 const ModuleFile *ImportedBy,
3368 unsigned ClientLoadCapabilities) {
3369 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00003370 F.ModuleMapPath = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003371
Richard Smithe842a472014-10-22 02:05:46 +00003372 if (F.Kind == MK_ExplicitModule) {
3373 // For an explicitly-loaded module, we don't care whether the original
3374 // module map file exists or matches.
3375 return Success;
3376 }
3377
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003378 // Try to resolve ModuleName in the current header search context and
3379 // verify that it is found in the same module map file as we saved. If the
3380 // top-level AST file is a main file, skip this check because there is no
3381 // usable header search context.
3382 assert(!F.ModuleName.empty() &&
Richard Smithe842a472014-10-22 02:05:46 +00003383 "MODULE_NAME should come before MODULE_MAP_FILE");
3384 if (F.Kind == MK_ImplicitModule &&
3385 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3386 // An implicitly-loaded module file should have its module listed in some
3387 // module map file that we've already loaded.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003388 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
Richard Smithe842a472014-10-22 02:05:46 +00003389 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3390 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3391 if (!ModMap) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003392 assert(ImportedBy && "top-level import should be verified");
3393 if ((ClientLoadCapabilities & ARR_Missing) == 0)
Richard Smithe842a472014-10-22 02:05:46 +00003394 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName
3395 << ImportedBy->FileName
3396 << F.ModuleMapPath;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003397 return Missing;
3398 }
3399
Richard Smithe842a472014-10-22 02:05:46 +00003400 assert(M->Name == F.ModuleName && "found module with different name");
3401
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003402 // Check the primary module map file.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003403 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003404 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3405 assert(ModMap && "found module is missing module map file");
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003406 assert(ImportedBy && "top-level import should be verified");
3407 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3408 Diag(diag::err_imported_module_modmap_changed)
3409 << F.ModuleName << ImportedBy->FileName
3410 << ModMap->getName() << F.ModuleMapPath;
3411 return OutOfDate;
3412 }
3413
3414 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3415 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3416 // FIXME: we should use input files rather than storing names.
Richard Smith7ed1bc92014-12-05 22:42:13 +00003417 std::string Filename = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003418 const FileEntry *F =
3419 FileMgr.getFile(Filename, false, false);
3420 if (F == nullptr) {
3421 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3422 Error("could not find file '" + Filename +"' referenced by AST file");
3423 return OutOfDate;
3424 }
3425 AdditionalStoredMaps.insert(F);
3426 }
3427
3428 // Check any additional module map files (e.g. module.private.modulemap)
3429 // that are not in the pcm.
3430 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3431 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3432 // Remove files that match
3433 // Note: SmallPtrSet::erase is really remove
3434 if (!AdditionalStoredMaps.erase(ModMap)) {
3435 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3436 Diag(diag::err_module_different_modmap)
3437 << F.ModuleName << /*new*/0 << ModMap->getName();
3438 return OutOfDate;
3439 }
3440 }
3441 }
3442
3443 // Check any additional module map files that are in the pcm, but not
3444 // found in header search. Cases that match are already removed.
3445 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3446 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3447 Diag(diag::err_module_different_modmap)
3448 << F.ModuleName << /*not new*/1 << ModMap->getName();
3449 return OutOfDate;
3450 }
3451 }
3452
3453 if (Listener)
3454 Listener->ReadModuleMapFile(F.ModuleMapPath);
3455 return Success;
3456}
3457
3458
Douglas Gregorc1489562013-02-12 23:36:21 +00003459/// \brief Move the given method to the back of the global list of methods.
3460static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3461 // Find the entry for this selector in the method pool.
3462 Sema::GlobalMethodPool::iterator Known
3463 = S.MethodPool.find(Method->getSelector());
3464 if (Known == S.MethodPool.end())
3465 return;
3466
3467 // Retrieve the appropriate method list.
3468 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3469 : Known->second.second;
3470 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003471 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003472 if (!Found) {
Nico Weber2e0c8f72014-12-27 03:58:08 +00003473 if (List->getMethod() == Method) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003474 Found = true;
3475 } else {
3476 // Keep searching.
3477 continue;
3478 }
3479 }
3480
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003481 if (List->getNext())
Nico Weber2e0c8f72014-12-27 03:58:08 +00003482 List->setMethod(List->getNext()->getMethod());
Douglas Gregorc1489562013-02-12 23:36:21 +00003483 else
Nico Weber2e0c8f72014-12-27 03:58:08 +00003484 List->setMethod(Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003485 }
3486}
3487
Richard Smithe657bbd2014-07-18 22:13:40 +00003488void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3489 bool FromFinalization) {
3490 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
Richard Smith57721ac2014-07-21 04:10:40 +00003491 for (Decl *D : Names.HiddenDecls) {
Richard Smith49f906a2014-03-01 00:08:04 +00003492 bool wasHidden = D->Hidden;
3493 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003494
Richard Smith49f906a2014-03-01 00:08:04 +00003495 if (wasHidden && SemaObj) {
3496 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3497 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003498 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003499 }
3500 }
Richard Smith49f906a2014-03-01 00:08:04 +00003501
Richard Smithe657bbd2014-07-18 22:13:40 +00003502 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3503 "nothing to make visible?");
Richard Smithdaa69e02014-07-25 04:40:03 +00003504 for (const auto &Macro : Names.HiddenMacros) {
3505 if (FromFinalization)
3506 PP.appendMacroDirective(Macro.first,
3507 Macro.second->import(PP, SourceLocation()));
3508 else
3509 installImportedMacro(Macro.first, Macro.second, Owner);
3510 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003511}
3512
Richard Smith49f906a2014-03-01 00:08:04 +00003513void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003514 Module::NameVisibilityKind NameVisibility,
Douglas Gregorfb912652013-03-20 21:10:35 +00003515 SourceLocation ImportLoc,
3516 bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003517 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003518 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003519 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003520 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003521 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003522
3523 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003524 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003525 // there is nothing more to do.
3526 continue;
3527 }
Richard Smith49f906a2014-03-01 00:08:04 +00003528
Guy Benyei11169dd2012-12-18 14:30:41 +00003529 if (!Mod->isAvailable()) {
3530 // Modules that aren't available cannot be made visible.
3531 continue;
3532 }
3533
3534 // Update the module's name visibility.
Richard Smith49f906a2014-03-01 00:08:04 +00003535 if (NameVisibility >= Module::MacrosVisible &&
3536 Mod->NameVisibility < Module::MacrosVisible)
3537 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003538 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003539
Guy Benyei11169dd2012-12-18 14:30:41 +00003540 // If we've already deserialized any names from this module,
3541 // mark them as visible.
3542 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3543 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003544 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003545 HiddenNamesMap.erase(Hidden);
Richard Smith57721ac2014-07-21 04:10:40 +00003546 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3547 /*FromFinalization*/false);
3548 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3549 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003550 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003551
Guy Benyei11169dd2012-12-18 14:30:41 +00003552 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003553 SmallVector<Module *, 16> Exports;
3554 Mod->getExportedModules(Exports);
3555 for (SmallVectorImpl<Module *>::iterator
3556 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3557 Module *Exported = *I;
David Blaikie82e95a32014-11-19 07:49:47 +00003558 if (Visited.insert(Exported).second)
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003559 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003560 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003561
3562 // Detect any conflicts.
3563 if (Complain) {
3564 assert(ImportLoc.isValid() && "Missing import location");
3565 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3566 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3567 Diag(ImportLoc, diag::warn_module_conflict)
3568 << Mod->getFullModuleName()
3569 << Mod->Conflicts[I].Other->getFullModuleName()
3570 << Mod->Conflicts[I].Message;
3571 // FIXME: Need note where the other module was imported.
3572 }
3573 }
3574 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003575 }
3576}
3577
Douglas Gregore060e572013-01-25 01:03:03 +00003578bool ASTReader::loadGlobalIndex() {
3579 if (GlobalIndex)
3580 return false;
3581
3582 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3583 !Context.getLangOpts().Modules)
3584 return true;
3585
3586 // Try to load the global index.
3587 TriedLoadingGlobalIndex = true;
3588 StringRef ModuleCachePath
3589 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3590 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003591 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003592 if (!Result.first)
3593 return true;
3594
3595 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003596 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003597 return false;
3598}
3599
3600bool ASTReader::isGlobalIndexUnavailable() const {
3601 return Context.getLangOpts().Modules && UseGlobalIndex &&
3602 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3603}
3604
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003605static void updateModuleTimestamp(ModuleFile &MF) {
3606 // Overwrite the timestamp file contents so that file's mtime changes.
3607 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00003608 std::error_code EC;
3609 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3610 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003611 return;
3612 OS << "Timestamp file\n";
3613}
3614
Guy Benyei11169dd2012-12-18 14:30:41 +00003615ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3616 ModuleKind Type,
3617 SourceLocation ImportLoc,
3618 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003619 llvm::SaveAndRestore<SourceLocation>
3620 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3621
Richard Smithd1c46742014-04-30 02:24:17 +00003622 // Defer any pending actions until we get to the end of reading the AST file.
3623 Deserializing AnASTFile(this);
3624
Guy Benyei11169dd2012-12-18 14:30:41 +00003625 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003626 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003627
3628 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003629 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003630 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003631 /*ImportedBy=*/nullptr, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00003632 0, 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003633 ClientLoadCapabilities)) {
3634 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003635 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003636 case OutOfDate:
3637 case VersionMismatch:
3638 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003639 case HadErrors: {
3640 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3641 for (const ImportedModule &IM : Loaded)
3642 LoadedSet.insert(IM.Mod);
3643
Douglas Gregor7029ce12013-03-19 00:28:20 +00003644 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003645 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003646 Context.getLangOpts().Modules
3647 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003648 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003649
3650 // If we find that any modules are unusable, the global index is going
3651 // to be out-of-date. Just remove it.
3652 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003653 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003654 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003655 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003656 case Success:
3657 break;
3658 }
3659
3660 // Here comes stuff that we only do once the entire chain is loaded.
3661
3662 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003663 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3664 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003665 M != MEnd; ++M) {
3666 ModuleFile &F = *M->Mod;
3667
3668 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003669 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3670 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003671
3672 // Once read, set the ModuleFile bit base offset and update the size in
3673 // bits of all files we've seen.
3674 F.GlobalBitOffset = TotalModulesSizeInBits;
3675 TotalModulesSizeInBits += F.SizeInBits;
3676 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3677
3678 // Preload SLocEntries.
3679 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3680 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3681 // Load it through the SourceManager and don't call ReadSLocEntry()
3682 // directly because the entry may have already been loaded in which case
3683 // calling ReadSLocEntry() directly would trigger an assertion in
3684 // SourceManager.
3685 SourceMgr.getLoadedSLocEntryByID(Index);
3686 }
3687 }
3688
Douglas Gregor603cd862013-03-22 18:50:14 +00003689 // Setup the import locations and notify the module manager that we've
3690 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003691 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3692 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003693 M != MEnd; ++M) {
3694 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003695
3696 ModuleMgr.moduleFileAccepted(&F);
3697
3698 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003699 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003700 if (!M->ImportedBy)
3701 F.ImportLoc = M->ImportLoc;
3702 else
3703 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3704 M->ImportLoc.getRawEncoding());
3705 }
3706
3707 // Mark all of the identifiers in the identifier table as being out of date,
3708 // so that various accessors know to check the loaded modules when the
3709 // identifier is used.
3710 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3711 IdEnd = PP.getIdentifierTable().end();
3712 Id != IdEnd; ++Id)
3713 Id->second->setOutOfDate(true);
3714
3715 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003716 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3717 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003718 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3719 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003720
3721 switch (Unresolved.Kind) {
3722 case UnresolvedModuleRef::Conflict:
3723 if (ResolvedMod) {
3724 Module::Conflict Conflict;
3725 Conflict.Other = ResolvedMod;
3726 Conflict.Message = Unresolved.String.str();
3727 Unresolved.Mod->Conflicts.push_back(Conflict);
3728 }
3729 continue;
3730
3731 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003732 if (ResolvedMod)
3733 Unresolved.Mod->Imports.push_back(ResolvedMod);
3734 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003735
Douglas Gregorfb912652013-03-20 21:10:35 +00003736 case UnresolvedModuleRef::Export:
3737 if (ResolvedMod || Unresolved.IsWildcard)
3738 Unresolved.Mod->Exports.push_back(
3739 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3740 continue;
3741 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003742 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003743 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003744
3745 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3746 // Might be unnecessary as use declarations are only used to build the
3747 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003748
3749 InitializeContext();
3750
Richard Smith3d8e97e2013-10-18 06:54:39 +00003751 if (SemaObj)
3752 UpdateSema();
3753
Guy Benyei11169dd2012-12-18 14:30:41 +00003754 if (DeserializationListener)
3755 DeserializationListener->ReaderInitialized(this);
3756
3757 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3758 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3759 PrimaryModule.OriginalSourceFileID
3760 = FileID::get(PrimaryModule.SLocEntryBaseID
3761 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3762
3763 // If this AST file is a precompiled preamble, then set the
3764 // preamble file ID of the source manager to the file source file
3765 // from which the preamble was built.
3766 if (Type == MK_Preamble) {
3767 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3768 } else if (Type == MK_MainFile) {
3769 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3770 }
3771 }
3772
3773 // For any Objective-C class definitions we have already loaded, make sure
3774 // that we load any additional categories.
3775 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3776 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3777 ObjCClassesLoaded[I],
3778 PreviousGeneration);
3779 }
Douglas Gregore060e572013-01-25 01:03:03 +00003780
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003781 if (PP.getHeaderSearchInfo()
3782 .getHeaderSearchOpts()
3783 .ModulesValidateOncePerBuildSession) {
3784 // Now we are certain that the module and all modules it depends on are
3785 // up to date. Create or update timestamp files for modules that are
3786 // located in the module cache (not for PCH files that could be anywhere
3787 // in the filesystem).
3788 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3789 ImportedModule &M = Loaded[I];
Richard Smithe842a472014-10-22 02:05:46 +00003790 if (M.Mod->Kind == MK_ImplicitModule) {
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003791 updateModuleTimestamp(*M.Mod);
3792 }
3793 }
3794 }
3795
Guy Benyei11169dd2012-12-18 14:30:41 +00003796 return Success;
3797}
3798
Ben Langmuir487ea142014-10-23 18:05:36 +00003799static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile);
3800
Guy Benyei11169dd2012-12-18 14:30:41 +00003801ASTReader::ASTReadResult
3802ASTReader::ReadASTCore(StringRef FileName,
3803 ModuleKind Type,
3804 SourceLocation ImportLoc,
3805 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003806 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003807 off_t ExpectedSize, time_t ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003808 ASTFileSignature ExpectedSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00003809 unsigned ClientLoadCapabilities) {
3810 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003811 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003812 ModuleManager::AddModuleResult AddResult
3813 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003814 getGeneration(), ExpectedSize, ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003815 ExpectedSignature, readASTFileSignature,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003816 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003817
Douglas Gregor7029ce12013-03-19 00:28:20 +00003818 switch (AddResult) {
3819 case ModuleManager::AlreadyLoaded:
3820 return Success;
3821
3822 case ModuleManager::NewlyLoaded:
3823 // Load module file below.
3824 break;
3825
3826 case ModuleManager::Missing:
Richard Smithe842a472014-10-22 02:05:46 +00003827 // The module file was missing; if the client can handle that, return
Douglas Gregor7029ce12013-03-19 00:28:20 +00003828 // it.
3829 if (ClientLoadCapabilities & ARR_Missing)
3830 return Missing;
3831
3832 // Otherwise, return an error.
3833 {
3834 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3835 + ErrorStr;
3836 Error(Msg);
3837 }
3838 return Failure;
3839
3840 case ModuleManager::OutOfDate:
3841 // We couldn't load the module file because it is out-of-date. If the
3842 // client can handle out-of-date, return it.
3843 if (ClientLoadCapabilities & ARR_OutOfDate)
3844 return OutOfDate;
3845
3846 // Otherwise, return an error.
3847 {
3848 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3849 + ErrorStr;
3850 Error(Msg);
3851 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003852 return Failure;
3853 }
3854
Douglas Gregor7029ce12013-03-19 00:28:20 +00003855 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003856
3857 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3858 // module?
3859 if (FileName != "-") {
3860 CurrentDir = llvm::sys::path::parent_path(FileName);
3861 if (CurrentDir.empty()) CurrentDir = ".";
3862 }
3863
3864 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003865 BitstreamCursor &Stream = F.Stream;
Rafael Espindolafd832392014-11-12 14:48:44 +00003866 Stream.init(&F.StreamFile);
Adrian Prantlcbc368c2015-02-25 02:44:04 +00003867 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3868
Guy Benyei11169dd2012-12-18 14:30:41 +00003869 // Sniff for the signature.
3870 if (Stream.Read(8) != 'C' ||
3871 Stream.Read(8) != 'P' ||
3872 Stream.Read(8) != 'C' ||
3873 Stream.Read(8) != 'H') {
3874 Diag(diag::err_not_a_pch_file) << FileName;
3875 return Failure;
3876 }
3877
3878 // This is used for compatibility with older PCH formats.
3879 bool HaveReadControlBlock = false;
3880
Chris Lattnerefa77172013-01-20 00:00:22 +00003881 while (1) {
3882 llvm::BitstreamEntry Entry = Stream.advance();
3883
3884 switch (Entry.Kind) {
3885 case llvm::BitstreamEntry::Error:
3886 case llvm::BitstreamEntry::EndBlock:
3887 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003888 Error("invalid record at top-level of AST file");
3889 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003890
3891 case llvm::BitstreamEntry::SubBlock:
3892 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003893 }
3894
Guy Benyei11169dd2012-12-18 14:30:41 +00003895 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003896 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003897 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3898 if (Stream.ReadBlockInfoBlock()) {
3899 Error("malformed BlockInfoBlock in AST file");
3900 return Failure;
3901 }
3902 break;
3903 case CONTROL_BLOCK_ID:
3904 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003905 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003906 case Success:
3907 break;
3908
3909 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003910 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003911 case OutOfDate: return OutOfDate;
3912 case VersionMismatch: return VersionMismatch;
3913 case ConfigurationMismatch: return ConfigurationMismatch;
3914 case HadErrors: return HadErrors;
3915 }
3916 break;
3917 case AST_BLOCK_ID:
3918 if (!HaveReadControlBlock) {
3919 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003920 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003921 return VersionMismatch;
3922 }
3923
3924 // Record that we've loaded this module.
3925 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3926 return Success;
3927
3928 default:
3929 if (Stream.SkipBlock()) {
3930 Error("malformed block record in AST file");
3931 return Failure;
3932 }
3933 break;
3934 }
3935 }
3936
3937 return Success;
3938}
3939
3940void ASTReader::InitializeContext() {
3941 // If there's a listener, notify them that we "read" the translation unit.
3942 if (DeserializationListener)
3943 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3944 Context.getTranslationUnitDecl());
3945
Guy Benyei11169dd2012-12-18 14:30:41 +00003946 // FIXME: Find a better way to deal with collisions between these
3947 // built-in types. Right now, we just ignore the problem.
3948
3949 // Load the special types.
3950 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3951 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3952 if (!Context.CFConstantStringTypeDecl)
3953 Context.setCFConstantStringType(GetType(String));
3954 }
3955
3956 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3957 QualType FileType = GetType(File);
3958 if (FileType.isNull()) {
3959 Error("FILE type is NULL");
3960 return;
3961 }
3962
3963 if (!Context.FILEDecl) {
3964 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3965 Context.setFILEDecl(Typedef->getDecl());
3966 else {
3967 const TagType *Tag = FileType->getAs<TagType>();
3968 if (!Tag) {
3969 Error("Invalid FILE type in AST file");
3970 return;
3971 }
3972 Context.setFILEDecl(Tag->getDecl());
3973 }
3974 }
3975 }
3976
3977 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3978 QualType Jmp_bufType = GetType(Jmp_buf);
3979 if (Jmp_bufType.isNull()) {
3980 Error("jmp_buf type is NULL");
3981 return;
3982 }
3983
3984 if (!Context.jmp_bufDecl) {
3985 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3986 Context.setjmp_bufDecl(Typedef->getDecl());
3987 else {
3988 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3989 if (!Tag) {
3990 Error("Invalid jmp_buf type in AST file");
3991 return;
3992 }
3993 Context.setjmp_bufDecl(Tag->getDecl());
3994 }
3995 }
3996 }
3997
3998 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3999 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4000 if (Sigjmp_bufType.isNull()) {
4001 Error("sigjmp_buf type is NULL");
4002 return;
4003 }
4004
4005 if (!Context.sigjmp_bufDecl) {
4006 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4007 Context.setsigjmp_bufDecl(Typedef->getDecl());
4008 else {
4009 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4010 assert(Tag && "Invalid sigjmp_buf type in AST file");
4011 Context.setsigjmp_bufDecl(Tag->getDecl());
4012 }
4013 }
4014 }
4015
4016 if (unsigned ObjCIdRedef
4017 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4018 if (Context.ObjCIdRedefinitionType.isNull())
4019 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4020 }
4021
4022 if (unsigned ObjCClassRedef
4023 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4024 if (Context.ObjCClassRedefinitionType.isNull())
4025 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4026 }
4027
4028 if (unsigned ObjCSelRedef
4029 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4030 if (Context.ObjCSelRedefinitionType.isNull())
4031 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4032 }
4033
4034 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4035 QualType Ucontext_tType = GetType(Ucontext_t);
4036 if (Ucontext_tType.isNull()) {
4037 Error("ucontext_t type is NULL");
4038 return;
4039 }
4040
4041 if (!Context.ucontext_tDecl) {
4042 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4043 Context.setucontext_tDecl(Typedef->getDecl());
4044 else {
4045 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4046 assert(Tag && "Invalid ucontext_t type in AST file");
4047 Context.setucontext_tDecl(Tag->getDecl());
4048 }
4049 }
4050 }
4051 }
4052
4053 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4054
4055 // If there were any CUDA special declarations, deserialize them.
4056 if (!CUDASpecialDeclRefs.empty()) {
4057 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4058 Context.setcudaConfigureCallDecl(
4059 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4060 }
Richard Smith56be7542014-03-21 00:33:59 +00004061
Guy Benyei11169dd2012-12-18 14:30:41 +00004062 // Re-export any modules that were imported by a non-module AST file.
Richard Smith56be7542014-03-21 00:33:59 +00004063 // FIXME: This does not make macro-only imports visible again. It also doesn't
4064 // make #includes mapped to module imports visible.
4065 for (auto &Import : ImportedModules) {
4066 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00004067 makeModuleVisible(Imported, Module::AllVisible,
Richard Smith56be7542014-03-21 00:33:59 +00004068 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregorfb912652013-03-20 21:10:35 +00004069 /*Complain=*/false);
Guy Benyei11169dd2012-12-18 14:30:41 +00004070 }
4071 ImportedModules.clear();
4072}
4073
4074void ASTReader::finalizeForWriting() {
Richard Smith57721ac2014-07-21 04:10:40 +00004075 while (!HiddenNamesMap.empty()) {
4076 auto HiddenNames = std::move(*HiddenNamesMap.begin());
4077 HiddenNamesMap.erase(HiddenNamesMap.begin());
4078 makeNamesVisible(HiddenNames.second, HiddenNames.first,
4079 /*FromFinalization*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00004080 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004081}
4082
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004083/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
4084/// cursor into the start of the given block ID, returning false on success and
4085/// true on failure.
4086static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004087 while (1) {
4088 llvm::BitstreamEntry Entry = Cursor.advance();
4089 switch (Entry.Kind) {
4090 case llvm::BitstreamEntry::Error:
4091 case llvm::BitstreamEntry::EndBlock:
4092 return true;
4093
4094 case llvm::BitstreamEntry::Record:
4095 // Ignore top-level records.
4096 Cursor.skipRecord(Entry.ID);
4097 break;
4098
4099 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004100 if (Entry.ID == BlockID) {
4101 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004102 return true;
4103 // Found it!
4104 return false;
4105 }
4106
4107 if (Cursor.SkipBlock())
4108 return true;
4109 }
4110 }
4111}
4112
Ben Langmuir487ea142014-10-23 18:05:36 +00004113static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){
4114 BitstreamCursor Stream(StreamFile);
4115 if (Stream.Read(8) != 'C' ||
4116 Stream.Read(8) != 'P' ||
4117 Stream.Read(8) != 'C' ||
4118 Stream.Read(8) != 'H') {
4119 return 0;
4120 }
4121
4122 // Scan for the CONTROL_BLOCK_ID block.
4123 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4124 return 0;
4125
4126 // Scan for SIGNATURE inside the control block.
4127 ASTReader::RecordData Record;
4128 while (1) {
4129 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4130 if (Entry.Kind == llvm::BitstreamEntry::EndBlock ||
4131 Entry.Kind != llvm::BitstreamEntry::Record)
4132 return 0;
4133
4134 Record.clear();
4135 StringRef Blob;
4136 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4137 return Record[0];
4138 }
4139}
4140
Guy Benyei11169dd2012-12-18 14:30:41 +00004141/// \brief Retrieve the name of the original source file name
4142/// directly from the AST file, without actually loading the AST
4143/// file.
4144std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4145 FileManager &FileMgr,
4146 DiagnosticsEngine &Diags) {
4147 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004148 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00004149 if (!Buffer) {
Benjamin Kramera8857962014-10-26 22:44:13 +00004150 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4151 << ASTFileName << Buffer.getError().message();
Guy Benyei11169dd2012-12-18 14:30:41 +00004152 return std::string();
4153 }
4154
4155 // Initialize the stream
4156 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00004157 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4158 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004159 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004160
4161 // Sniff for the signature.
4162 if (Stream.Read(8) != 'C' ||
4163 Stream.Read(8) != 'P' ||
4164 Stream.Read(8) != 'C' ||
4165 Stream.Read(8) != 'H') {
4166 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4167 return std::string();
4168 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004169
Chris Lattnere7b154b2013-01-19 21:39:22 +00004170 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004171 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004172 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4173 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004174 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004175
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004176 // Scan for ORIGINAL_FILE inside the control block.
4177 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00004178 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004179 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004180 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4181 return std::string();
4182
4183 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4184 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4185 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00004186 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00004187
Guy Benyei11169dd2012-12-18 14:30:41 +00004188 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004189 StringRef Blob;
4190 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4191 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00004192 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004193}
4194
4195namespace {
4196 class SimplePCHValidator : public ASTReaderListener {
4197 const LangOptions &ExistingLangOpts;
4198 const TargetOptions &ExistingTargetOpts;
4199 const PreprocessorOptions &ExistingPPOpts;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004200 std::string ExistingModuleCachePath;
Guy Benyei11169dd2012-12-18 14:30:41 +00004201 FileManager &FileMgr;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004202
Guy Benyei11169dd2012-12-18 14:30:41 +00004203 public:
4204 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4205 const TargetOptions &ExistingTargetOpts,
4206 const PreprocessorOptions &ExistingPPOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004207 StringRef ExistingModuleCachePath,
Guy Benyei11169dd2012-12-18 14:30:41 +00004208 FileManager &FileMgr)
4209 : ExistingLangOpts(ExistingLangOpts),
4210 ExistingTargetOpts(ExistingTargetOpts),
4211 ExistingPPOpts(ExistingPPOpts),
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004212 ExistingModuleCachePath(ExistingModuleCachePath),
Guy Benyei11169dd2012-12-18 14:30:41 +00004213 FileMgr(FileMgr)
4214 {
4215 }
4216
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004217 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4218 bool AllowCompatibleDifferences) override {
4219 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4220 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004221 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004222 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4223 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004224 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004225 }
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004226 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4227 StringRef SpecificModuleCachePath,
4228 bool Complain) override {
4229 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4230 ExistingModuleCachePath,
4231 nullptr, ExistingLangOpts);
4232 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004233 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4234 bool Complain,
4235 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004236 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004237 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00004238 }
4239 };
4240}
4241
4242bool ASTReader::readASTFileControlBlock(StringRef Filename,
4243 FileManager &FileMgr,
4244 ASTReaderListener &Listener) {
4245 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004246 auto Buffer = FileMgr.getBufferForFile(Filename);
Guy Benyei11169dd2012-12-18 14:30:41 +00004247 if (!Buffer) {
4248 return true;
4249 }
4250
4251 // Initialize the stream
4252 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00004253 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4254 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004255 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004256
4257 // Sniff for the signature.
4258 if (Stream.Read(8) != 'C' ||
4259 Stream.Read(8) != 'P' ||
4260 Stream.Read(8) != 'C' ||
4261 Stream.Read(8) != 'H') {
4262 return true;
4263 }
4264
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004265 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004266 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004267 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004268
4269 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00004270 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Richard Smithd4b230b2014-10-27 23:01:16 +00004271 bool NeedsImports = Listener.needsImportVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004272 BitstreamCursor InputFilesCursor;
4273 if (NeedsInputFiles) {
4274 InputFilesCursor = Stream;
4275 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4276 return true;
4277
4278 // Read the abbreviations
4279 while (true) {
4280 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4281 unsigned Code = InputFilesCursor.ReadCode();
4282
4283 // We expect all abbrevs to be at the start of the block.
4284 if (Code != llvm::bitc::DEFINE_ABBREV) {
4285 InputFilesCursor.JumpToBit(Offset);
4286 break;
4287 }
4288 InputFilesCursor.ReadAbbrevRecord();
4289 }
4290 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004291
4292 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00004293 RecordData Record;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004294 std::string ModuleDir;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004295 while (1) {
4296 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4297 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4298 return false;
4299
4300 if (Entry.Kind != llvm::BitstreamEntry::Record)
4301 return true;
4302
Guy Benyei11169dd2012-12-18 14:30:41 +00004303 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004304 StringRef Blob;
4305 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004306 switch ((ControlRecordTypes)RecCode) {
4307 case METADATA: {
4308 if (Record[0] != VERSION_MAJOR)
4309 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004310
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004311 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004312 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004313
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004314 break;
4315 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004316 case MODULE_NAME:
4317 Listener.ReadModuleName(Blob);
4318 break;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004319 case MODULE_DIRECTORY:
4320 ModuleDir = Blob;
4321 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004322 case MODULE_MAP_FILE: {
4323 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004324 auto Path = ReadString(Record, Idx);
4325 ResolveImportedPath(Path, ModuleDir);
4326 Listener.ReadModuleMapFile(Path);
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004327 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004328 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004329 case LANGUAGE_OPTIONS:
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004330 if (ParseLanguageOptions(Record, false, Listener,
4331 /*AllowCompatibleConfigurationMismatch*/false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004332 return true;
4333 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004334
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004335 case TARGET_OPTIONS:
4336 if (ParseTargetOptions(Record, false, Listener))
4337 return true;
4338 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004339
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004340 case DIAGNOSTIC_OPTIONS:
4341 if (ParseDiagnosticOptions(Record, false, Listener))
4342 return true;
4343 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004344
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004345 case FILE_SYSTEM_OPTIONS:
4346 if (ParseFileSystemOptions(Record, false, Listener))
4347 return true;
4348 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004349
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004350 case HEADER_SEARCH_OPTIONS:
4351 if (ParseHeaderSearchOptions(Record, false, Listener))
4352 return true;
4353 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004354
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004355 case PREPROCESSOR_OPTIONS: {
4356 std::string IgnoredSuggestedPredefines;
4357 if (ParsePreprocessorOptions(Record, false, Listener,
4358 IgnoredSuggestedPredefines))
4359 return true;
4360 break;
4361 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004362
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004363 case INPUT_FILE_OFFSETS: {
4364 if (!NeedsInputFiles)
4365 break;
4366
4367 unsigned NumInputFiles = Record[0];
4368 unsigned NumUserFiles = Record[1];
Richard Smithec216502015-02-13 19:48:37 +00004369 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004370 for (unsigned I = 0; I != NumInputFiles; ++I) {
4371 // Go find this input file.
4372 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004373
4374 if (isSystemFile && !NeedsSystemInputFiles)
4375 break; // the rest are system input files
4376
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004377 BitstreamCursor &Cursor = InputFilesCursor;
4378 SavedStreamPosition SavedPosition(Cursor);
4379 Cursor.JumpToBit(InputFileOffs[I]);
4380
4381 unsigned Code = Cursor.ReadCode();
4382 RecordData Record;
4383 StringRef Blob;
4384 bool shouldContinue = false;
4385 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4386 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004387 bool Overridden = static_cast<bool>(Record[3]);
Richard Smith7ed1bc92014-12-05 22:42:13 +00004388 std::string Filename = Blob;
4389 ResolveImportedPath(Filename, ModuleDir);
4390 shouldContinue =
4391 Listener.visitInputFile(Filename, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004392 break;
4393 }
4394 if (!shouldContinue)
4395 break;
4396 }
4397 break;
4398 }
4399
Richard Smithd4b230b2014-10-27 23:01:16 +00004400 case IMPORTS: {
4401 if (!NeedsImports)
4402 break;
4403
4404 unsigned Idx = 0, N = Record.size();
4405 while (Idx < N) {
4406 // Read information about the AST file.
Richard Smith79c98cc2014-10-27 23:25:15 +00004407 Idx += 5; // ImportLoc, Size, ModTime, Signature
Richard Smith7ed1bc92014-12-05 22:42:13 +00004408 std::string Filename = ReadString(Record, Idx);
4409 ResolveImportedPath(Filename, ModuleDir);
4410 Listener.visitImport(Filename);
Richard Smithd4b230b2014-10-27 23:01:16 +00004411 }
4412 break;
4413 }
4414
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004415 default:
4416 // No other validation to perform.
4417 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004418 }
4419 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004420}
4421
4422
4423bool ASTReader::isAcceptableASTFile(StringRef Filename,
4424 FileManager &FileMgr,
4425 const LangOptions &LangOpts,
4426 const TargetOptions &TargetOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004427 const PreprocessorOptions &PPOpts,
4428 std::string ExistingModuleCachePath) {
4429 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4430 ExistingModuleCachePath, FileMgr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004431 return !readASTFileControlBlock(Filename, FileMgr, validator);
4432}
4433
Ben Langmuir2c9af442014-04-10 17:57:43 +00004434ASTReader::ASTReadResult
4435ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004436 // Enter the submodule block.
4437 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4438 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004439 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004440 }
4441
4442 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4443 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004444 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004445 RecordData Record;
4446 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004447 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4448
4449 switch (Entry.Kind) {
4450 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4451 case llvm::BitstreamEntry::Error:
4452 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004453 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004454 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004455 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004456 case llvm::BitstreamEntry::Record:
4457 // The interesting case.
4458 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004459 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004460
Guy Benyei11169dd2012-12-18 14:30:41 +00004461 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004462 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004463 Record.clear();
Richard Smith03478d92014-10-23 22:12:14 +00004464 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4465
4466 if ((Kind == SUBMODULE_METADATA) != First) {
4467 Error("submodule metadata record should be at beginning of block");
4468 return Failure;
4469 }
4470 First = false;
4471
4472 // Submodule information is only valid if we have a current module.
4473 // FIXME: Should we error on these cases?
4474 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4475 Kind != SUBMODULE_DEFINITION)
4476 continue;
4477
4478 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004479 default: // Default behavior: ignore.
4480 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004481
Richard Smith03478d92014-10-23 22:12:14 +00004482 case SUBMODULE_DEFINITION: {
Douglas Gregor8d932422013-03-20 03:59:18 +00004483 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004484 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004485 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004486 }
Richard Smith03478d92014-10-23 22:12:14 +00004487
Chris Lattner0e6c9402013-01-20 02:38:54 +00004488 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004489 unsigned Idx = 0;
4490 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4491 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4492 bool IsFramework = Record[Idx++];
4493 bool IsExplicit = Record[Idx++];
4494 bool IsSystem = Record[Idx++];
4495 bool IsExternC = Record[Idx++];
4496 bool InferSubmodules = Record[Idx++];
4497 bool InferExplicitSubmodules = Record[Idx++];
4498 bool InferExportWildcard = Record[Idx++];
4499 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004500
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004501 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004502 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004503 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004504
Guy Benyei11169dd2012-12-18 14:30:41 +00004505 // Retrieve this (sub)module from the module map, creating it if
4506 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004507 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004508 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004509
4510 // FIXME: set the definition loc for CurrentModule, or call
4511 // ModMap.setInferredModuleAllowedBy()
4512
Guy Benyei11169dd2012-12-18 14:30:41 +00004513 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4514 if (GlobalIndex >= SubmodulesLoaded.size() ||
4515 SubmodulesLoaded[GlobalIndex]) {
4516 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004517 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004518 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004519
Douglas Gregor7029ce12013-03-19 00:28:20 +00004520 if (!ParentModule) {
4521 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4522 if (CurFile != F.File) {
4523 if (!Diags.isDiagnosticInFlight()) {
4524 Diag(diag::err_module_file_conflict)
4525 << CurrentModule->getTopLevelModuleName()
4526 << CurFile->getName()
4527 << F.File->getName();
4528 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004529 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004530 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004531 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004532
4533 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004534 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004535
Guy Benyei11169dd2012-12-18 14:30:41 +00004536 CurrentModule->IsFromModuleFile = true;
4537 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004538 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004539 CurrentModule->InferSubmodules = InferSubmodules;
4540 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4541 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004542 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004543 if (DeserializationListener)
4544 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4545
4546 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004547
Douglas Gregorfb912652013-03-20 21:10:35 +00004548 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004549 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004550 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004551 CurrentModule->UnresolvedConflicts.clear();
4552 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004553 break;
4554 }
4555
4556 case SUBMODULE_UMBRELLA_HEADER: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004557 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004558 if (!CurrentModule->getUmbrellaHeader())
4559 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4560 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuirbc35fbe2015-02-20 21:46:39 +00004561 // This can be a spurious difference caused by changing the VFS to
4562 // point to a different copy of the file, and it is too late to
4563 // to rebuild safely.
4564 // FIXME: If we wrote the virtual paths instead of the 'real' paths,
4565 // after input file validation only real problems would remain and we
4566 // could just error. For now, assume it's okay.
4567 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004568 }
4569 }
4570 break;
4571 }
4572
Richard Smith202210b2014-10-24 20:23:01 +00004573 case SUBMODULE_HEADER:
4574 case SUBMODULE_EXCLUDED_HEADER:
4575 case SUBMODULE_PRIVATE_HEADER:
4576 // We lazily associate headers with their modules via the HeaderInfo table.
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004577 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4578 // of complete filenames or remove it entirely.
Richard Smith202210b2014-10-24 20:23:01 +00004579 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004580
Richard Smith202210b2014-10-24 20:23:01 +00004581 case SUBMODULE_TEXTUAL_HEADER:
4582 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4583 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4584 // them here.
4585 break;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004586
Guy Benyei11169dd2012-12-18 14:30:41 +00004587 case SUBMODULE_TOPHEADER: {
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004588 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004589 break;
4590 }
4591
4592 case SUBMODULE_UMBRELLA_DIR: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004593 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004594 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004595 if (!CurrentModule->getUmbrellaDir())
4596 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4597 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004598 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4599 Error("mismatched umbrella directories in submodule");
4600 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004601 }
4602 }
4603 break;
4604 }
4605
4606 case SUBMODULE_METADATA: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004607 F.BaseSubmoduleID = getTotalNumSubmodules();
4608 F.LocalNumSubmodules = Record[0];
4609 unsigned LocalBaseSubmoduleID = Record[1];
4610 if (F.LocalNumSubmodules > 0) {
4611 // Introduce the global -> local mapping for submodules within this
4612 // module.
4613 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4614
4615 // Introduce the local -> global mapping for submodules within this
4616 // module.
4617 F.SubmoduleRemap.insertOrReplace(
4618 std::make_pair(LocalBaseSubmoduleID,
4619 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00004620
Ben Langmuir52ca6782014-10-20 16:27:32 +00004621 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4622 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004623 break;
4624 }
4625
4626 case SUBMODULE_IMPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004627 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004628 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004629 Unresolved.File = &F;
4630 Unresolved.Mod = CurrentModule;
4631 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004632 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004633 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004634 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004635 }
4636 break;
4637 }
4638
4639 case SUBMODULE_EXPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004640 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004641 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004642 Unresolved.File = &F;
4643 Unresolved.Mod = CurrentModule;
4644 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004645 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004646 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004647 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004648 }
4649
4650 // Once we've loaded the set of exports, there's no reason to keep
4651 // the parsed, unresolved exports around.
4652 CurrentModule->UnresolvedExports.clear();
4653 break;
4654 }
4655 case SUBMODULE_REQUIRES: {
Richard Smitha3feee22013-10-28 22:18:19 +00004656 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004657 Context.getTargetInfo());
4658 break;
4659 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004660
4661 case SUBMODULE_LINK_LIBRARY:
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004662 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004663 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004664 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004665
4666 case SUBMODULE_CONFIG_MACRO:
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004667 CurrentModule->ConfigMacros.push_back(Blob.str());
4668 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004669
4670 case SUBMODULE_CONFLICT: {
Douglas Gregorfb912652013-03-20 21:10:35 +00004671 UnresolvedModuleRef Unresolved;
4672 Unresolved.File = &F;
4673 Unresolved.Mod = CurrentModule;
4674 Unresolved.ID = Record[0];
4675 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4676 Unresolved.IsWildcard = false;
4677 Unresolved.String = Blob;
4678 UnresolvedModuleRefs.push_back(Unresolved);
4679 break;
4680 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004681 }
4682 }
4683}
4684
4685/// \brief Parse the record that corresponds to a LangOptions data
4686/// structure.
4687///
4688/// This routine parses the language options from the AST file and then gives
4689/// them to the AST listener if one is set.
4690///
4691/// \returns true if the listener deems the file unacceptable, false otherwise.
4692bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4693 bool Complain,
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004694 ASTReaderListener &Listener,
4695 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004696 LangOptions LangOpts;
4697 unsigned Idx = 0;
4698#define LANGOPT(Name, Bits, Default, Description) \
4699 LangOpts.Name = Record[Idx++];
4700#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4701 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4702#include "clang/Basic/LangOptions.def"
Alexey Samsonovedf99a92014-11-07 22:29:38 +00004703#define SANITIZER(NAME, ID) \
4704 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
Will Dietzf54319c2013-01-18 11:30:38 +00004705#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004706
4707 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4708 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4709 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4710
4711 unsigned Length = Record[Idx++];
4712 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4713 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004714
4715 Idx += Length;
4716
4717 // Comment options.
4718 for (unsigned N = Record[Idx++]; N; --N) {
4719 LangOpts.CommentOpts.BlockCommandNames.push_back(
4720 ReadString(Record, Idx));
4721 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004722 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004723
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004724 return Listener.ReadLanguageOptions(LangOpts, Complain,
4725 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004726}
4727
4728bool ASTReader::ParseTargetOptions(const RecordData &Record,
4729 bool Complain,
4730 ASTReaderListener &Listener) {
4731 unsigned Idx = 0;
4732 TargetOptions TargetOpts;
4733 TargetOpts.Triple = ReadString(Record, Idx);
4734 TargetOpts.CPU = ReadString(Record, Idx);
4735 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004736 for (unsigned N = Record[Idx++]; N; --N) {
4737 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4738 }
4739 for (unsigned N = Record[Idx++]; N; --N) {
4740 TargetOpts.Features.push_back(ReadString(Record, Idx));
4741 }
4742
4743 return Listener.ReadTargetOptions(TargetOpts, Complain);
4744}
4745
4746bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4747 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004748 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004749 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004750#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004751#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004752 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004753#include "clang/Basic/DiagnosticOptions.def"
4754
Richard Smith3be1cb22014-08-07 00:24:21 +00004755 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004756 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004757 for (unsigned N = Record[Idx++]; N; --N)
4758 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004759
4760 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4761}
4762
4763bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4764 ASTReaderListener &Listener) {
4765 FileSystemOptions FSOpts;
4766 unsigned Idx = 0;
4767 FSOpts.WorkingDir = ReadString(Record, Idx);
4768 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4769}
4770
4771bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4772 bool Complain,
4773 ASTReaderListener &Listener) {
4774 HeaderSearchOptions HSOpts;
4775 unsigned Idx = 0;
4776 HSOpts.Sysroot = ReadString(Record, Idx);
4777
4778 // Include entries.
4779 for (unsigned N = Record[Idx++]; N; --N) {
4780 std::string Path = ReadString(Record, Idx);
4781 frontend::IncludeDirGroup Group
4782 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004783 bool IsFramework = Record[Idx++];
4784 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004785 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004786 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004787 }
4788
4789 // System header prefixes.
4790 for (unsigned N = Record[Idx++]; N; --N) {
4791 std::string Prefix = ReadString(Record, Idx);
4792 bool IsSystemHeader = Record[Idx++];
4793 HSOpts.SystemHeaderPrefixes.push_back(
4794 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4795 }
4796
4797 HSOpts.ResourceDir = ReadString(Record, Idx);
4798 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004799 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004800 HSOpts.DisableModuleHash = Record[Idx++];
4801 HSOpts.UseBuiltinIncludes = Record[Idx++];
4802 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4803 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4804 HSOpts.UseLibcxx = Record[Idx++];
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004805 std::string SpecificModuleCachePath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004806
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004807 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4808 Complain);
Guy Benyei11169dd2012-12-18 14:30:41 +00004809}
4810
4811bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4812 bool Complain,
4813 ASTReaderListener &Listener,
4814 std::string &SuggestedPredefines) {
4815 PreprocessorOptions PPOpts;
4816 unsigned Idx = 0;
4817
4818 // Macro definitions/undefs
4819 for (unsigned N = Record[Idx++]; N; --N) {
4820 std::string Macro = ReadString(Record, Idx);
4821 bool IsUndef = Record[Idx++];
4822 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4823 }
4824
4825 // Includes
4826 for (unsigned N = Record[Idx++]; N; --N) {
4827 PPOpts.Includes.push_back(ReadString(Record, Idx));
4828 }
4829
4830 // Macro Includes
4831 for (unsigned N = Record[Idx++]; N; --N) {
4832 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4833 }
4834
4835 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004836 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004837 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4838 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4839 PPOpts.ObjCXXARCStandardLibrary =
4840 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4841 SuggestedPredefines.clear();
4842 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4843 SuggestedPredefines);
4844}
4845
4846std::pair<ModuleFile *, unsigned>
4847ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4848 GlobalPreprocessedEntityMapType::iterator
4849 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4850 assert(I != GlobalPreprocessedEntityMap.end() &&
4851 "Corrupted global preprocessed entity map");
4852 ModuleFile *M = I->second;
4853 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4854 return std::make_pair(M, LocalIndex);
4855}
4856
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004857llvm::iterator_range<PreprocessingRecord::iterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004858ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4859 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4860 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4861 Mod.NumPreprocessedEntities);
4862
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004863 return llvm::make_range(PreprocessingRecord::iterator(),
4864 PreprocessingRecord::iterator());
Guy Benyei11169dd2012-12-18 14:30:41 +00004865}
4866
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004867llvm::iterator_range<ASTReader::ModuleDeclIterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004868ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004869 return llvm::make_range(
4870 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4871 ModuleDeclIterator(this, &Mod,
4872 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
Guy Benyei11169dd2012-12-18 14:30:41 +00004873}
4874
4875PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4876 PreprocessedEntityID PPID = Index+1;
4877 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4878 ModuleFile &M = *PPInfo.first;
4879 unsigned LocalIndex = PPInfo.second;
4880 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4881
Guy Benyei11169dd2012-12-18 14:30:41 +00004882 if (!PP.getPreprocessingRecord()) {
4883 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004884 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004885 }
4886
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004887 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4888 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4889
4890 llvm::BitstreamEntry Entry =
4891 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4892 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004893 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004894
Guy Benyei11169dd2012-12-18 14:30:41 +00004895 // Read the record.
4896 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4897 ReadSourceLocation(M, PPOffs.End));
4898 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004899 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004900 RecordData Record;
4901 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004902 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4903 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004904 switch (RecType) {
4905 case PPD_MACRO_EXPANSION: {
4906 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004907 IdentifierInfo *Name = nullptr;
4908 MacroDefinition *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004909 if (isBuiltin)
4910 Name = getLocalIdentifier(M, Record[1]);
4911 else {
4912 PreprocessedEntityID
4913 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4914 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4915 }
4916
4917 MacroExpansion *ME;
4918 if (isBuiltin)
4919 ME = new (PPRec) MacroExpansion(Name, Range);
4920 else
4921 ME = new (PPRec) MacroExpansion(Def, Range);
4922
4923 return ME;
4924 }
4925
4926 case PPD_MACRO_DEFINITION: {
4927 // Decode the identifier info and then check again; if the macro is
4928 // still defined and associated with the identifier,
4929 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4930 MacroDefinition *MD
4931 = new (PPRec) MacroDefinition(II, Range);
4932
4933 if (DeserializationListener)
4934 DeserializationListener->MacroDefinitionRead(PPID, MD);
4935
4936 return MD;
4937 }
4938
4939 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004940 const char *FullFileNameStart = Blob.data() + Record[0];
4941 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004942 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004943 if (!FullFileName.empty())
4944 File = PP.getFileManager().getFile(FullFileName);
4945
4946 // FIXME: Stable encoding
4947 InclusionDirective::InclusionKind Kind
4948 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4949 InclusionDirective *ID
4950 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004951 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004952 Record[1], Record[3],
4953 File,
4954 Range);
4955 return ID;
4956 }
4957 }
4958
4959 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4960}
4961
4962/// \brief \arg SLocMapI points at a chunk of a module that contains no
4963/// preprocessed entities or the entities it contains are not the ones we are
4964/// looking for. Find the next module that contains entities and return the ID
4965/// of the first entry.
4966PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4967 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4968 ++SLocMapI;
4969 for (GlobalSLocOffsetMapType::const_iterator
4970 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4971 ModuleFile &M = *SLocMapI->second;
4972 if (M.NumPreprocessedEntities)
4973 return M.BasePreprocessedEntityID;
4974 }
4975
4976 return getTotalNumPreprocessedEntities();
4977}
4978
4979namespace {
4980
4981template <unsigned PPEntityOffset::*PPLoc>
4982struct PPEntityComp {
4983 const ASTReader &Reader;
4984 ModuleFile &M;
4985
4986 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4987
4988 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4989 SourceLocation LHS = getLoc(L);
4990 SourceLocation RHS = getLoc(R);
4991 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4992 }
4993
4994 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4995 SourceLocation LHS = getLoc(L);
4996 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4997 }
4998
4999 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5000 SourceLocation RHS = getLoc(R);
5001 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5002 }
5003
5004 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5005 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
5006 }
5007};
5008
5009}
5010
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005011PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5012 bool EndsAfter) const {
5013 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00005014 return getTotalNumPreprocessedEntities();
5015
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005016 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5017 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00005018 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
5019 "Corrupted global sloc offset map");
5020
5021 if (SLocMapI->second->NumPreprocessedEntities == 0)
5022 return findNextPreprocessedEntity(SLocMapI);
5023
5024 ModuleFile &M = *SLocMapI->second;
5025 typedef const PPEntityOffset *pp_iterator;
5026 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5027 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5028
5029 size_t Count = M.NumPreprocessedEntities;
5030 size_t Half;
5031 pp_iterator First = pp_begin;
5032 pp_iterator PPI;
5033
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005034 if (EndsAfter) {
5035 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5036 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
5037 } else {
5038 // Do a binary search manually instead of using std::lower_bound because
5039 // The end locations of entities may be unordered (when a macro expansion
5040 // is inside another macro argument), but for this case it is not important
5041 // whether we get the first macro expansion or its containing macro.
5042 while (Count > 0) {
5043 Half = Count / 2;
5044 PPI = First;
5045 std::advance(PPI, Half);
5046 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
5047 Loc)) {
5048 First = PPI;
5049 ++First;
5050 Count = Count - Half - 1;
5051 } else
5052 Count = Half;
5053 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005054 }
5055
5056 if (PPI == pp_end)
5057 return findNextPreprocessedEntity(SLocMapI);
5058
5059 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5060}
5061
Guy Benyei11169dd2012-12-18 14:30:41 +00005062/// \brief Returns a pair of [Begin, End) indices of preallocated
5063/// preprocessed entities that \arg Range encompasses.
5064std::pair<unsigned, unsigned>
5065 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5066 if (Range.isInvalid())
5067 return std::make_pair(0,0);
5068 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5069
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005070 PreprocessedEntityID BeginID =
5071 findPreprocessedEntity(Range.getBegin(), false);
5072 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005073 return std::make_pair(BeginID, EndID);
5074}
5075
5076/// \brief Optionally returns true or false if the preallocated preprocessed
5077/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00005078Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00005079 FileID FID) {
5080 if (FID.isInvalid())
5081 return false;
5082
5083 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5084 ModuleFile &M = *PPInfo.first;
5085 unsigned LocalIndex = PPInfo.second;
5086 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5087
5088 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5089 if (Loc.isInvalid())
5090 return false;
5091
5092 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5093 return true;
5094 else
5095 return false;
5096}
5097
5098namespace {
5099 /// \brief Visitor used to search for information about a header file.
5100 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00005101 const FileEntry *FE;
5102
David Blaikie05785d12013-02-20 22:23:23 +00005103 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005104
5105 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005106 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5107 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00005108
5109 static bool visit(ModuleFile &M, void *UserData) {
5110 HeaderFileInfoVisitor *This
5111 = static_cast<HeaderFileInfoVisitor *>(UserData);
5112
Guy Benyei11169dd2012-12-18 14:30:41 +00005113 HeaderFileInfoLookupTable *Table
5114 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5115 if (!Table)
5116 return false;
5117
5118 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00005119 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005120 if (Pos == Table->end())
5121 return false;
5122
5123 This->HFI = *Pos;
5124 return true;
5125 }
5126
David Blaikie05785d12013-02-20 22:23:23 +00005127 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00005128 };
5129}
5130
5131HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005132 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005133 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00005134 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00005135 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005136
5137 return HeaderFileInfo();
5138}
5139
5140void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5141 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00005142 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00005143 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5144 ModuleFile &F = *(*I);
5145 unsigned Idx = 0;
5146 DiagStates.clear();
5147 assert(!Diag.DiagStates.empty());
5148 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5149 while (Idx < F.PragmaDiagMappings.size()) {
5150 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5151 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5152 if (DiagStateID != 0) {
5153 Diag.DiagStatePoints.push_back(
5154 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5155 FullSourceLoc(Loc, SourceMgr)));
5156 continue;
5157 }
5158
5159 assert(DiagStateID == 0);
5160 // A new DiagState was created here.
5161 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5162 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5163 DiagStates.push_back(NewState);
5164 Diag.DiagStatePoints.push_back(
5165 DiagnosticsEngine::DiagStatePoint(NewState,
5166 FullSourceLoc(Loc, SourceMgr)));
5167 while (1) {
5168 assert(Idx < F.PragmaDiagMappings.size() &&
5169 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5170 if (Idx >= F.PragmaDiagMappings.size()) {
5171 break; // Something is messed up but at least avoid infinite loop in
5172 // release build.
5173 }
5174 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5175 if (DiagID == (unsigned)-1) {
5176 break; // no more diag/map pairs for this location.
5177 }
Alp Tokerc726c362014-06-10 09:31:37 +00005178 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5179 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5180 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00005181 }
5182 }
5183 }
5184}
5185
5186/// \brief Get the correct cursor and offset for loading a type.
5187ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5188 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5189 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5190 ModuleFile *M = I->second;
5191 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5192}
5193
5194/// \brief Read and return the type with the given index..
5195///
5196/// The index is the type ID, shifted and minus the number of predefs. This
5197/// routine actually reads the record corresponding to the type at the given
5198/// location. It is a helper routine for GetType, which deals with reading type
5199/// IDs.
5200QualType ASTReader::readTypeRecord(unsigned Index) {
5201 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005202 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005203
5204 // Keep track of where we are in the stream, then jump back there
5205 // after reading this type.
5206 SavedStreamPosition SavedPosition(DeclsCursor);
5207
5208 ReadingKindTracker ReadingKind(Read_Type, *this);
5209
5210 // Note that we are loading a type record.
5211 Deserializing AType(this);
5212
5213 unsigned Idx = 0;
5214 DeclsCursor.JumpToBit(Loc.Offset);
5215 RecordData Record;
5216 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005217 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005218 case TYPE_EXT_QUAL: {
5219 if (Record.size() != 2) {
5220 Error("Incorrect encoding of extended qualifier type");
5221 return QualType();
5222 }
5223 QualType Base = readType(*Loc.F, Record, Idx);
5224 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5225 return Context.getQualifiedType(Base, Quals);
5226 }
5227
5228 case TYPE_COMPLEX: {
5229 if (Record.size() != 1) {
5230 Error("Incorrect encoding of complex type");
5231 return QualType();
5232 }
5233 QualType ElemType = readType(*Loc.F, Record, Idx);
5234 return Context.getComplexType(ElemType);
5235 }
5236
5237 case TYPE_POINTER: {
5238 if (Record.size() != 1) {
5239 Error("Incorrect encoding of pointer type");
5240 return QualType();
5241 }
5242 QualType PointeeType = readType(*Loc.F, Record, Idx);
5243 return Context.getPointerType(PointeeType);
5244 }
5245
Reid Kleckner8a365022013-06-24 17:51:48 +00005246 case TYPE_DECAYED: {
5247 if (Record.size() != 1) {
5248 Error("Incorrect encoding of decayed type");
5249 return QualType();
5250 }
5251 QualType OriginalType = readType(*Loc.F, Record, Idx);
5252 QualType DT = Context.getAdjustedParameterType(OriginalType);
5253 if (!isa<DecayedType>(DT))
5254 Error("Decayed type does not decay");
5255 return DT;
5256 }
5257
Reid Kleckner0503a872013-12-05 01:23:43 +00005258 case TYPE_ADJUSTED: {
5259 if (Record.size() != 2) {
5260 Error("Incorrect encoding of adjusted type");
5261 return QualType();
5262 }
5263 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5264 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5265 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5266 }
5267
Guy Benyei11169dd2012-12-18 14:30:41 +00005268 case TYPE_BLOCK_POINTER: {
5269 if (Record.size() != 1) {
5270 Error("Incorrect encoding of block pointer type");
5271 return QualType();
5272 }
5273 QualType PointeeType = readType(*Loc.F, Record, Idx);
5274 return Context.getBlockPointerType(PointeeType);
5275 }
5276
5277 case TYPE_LVALUE_REFERENCE: {
5278 if (Record.size() != 2) {
5279 Error("Incorrect encoding of lvalue reference type");
5280 return QualType();
5281 }
5282 QualType PointeeType = readType(*Loc.F, Record, Idx);
5283 return Context.getLValueReferenceType(PointeeType, Record[1]);
5284 }
5285
5286 case TYPE_RVALUE_REFERENCE: {
5287 if (Record.size() != 1) {
5288 Error("Incorrect encoding of rvalue reference type");
5289 return QualType();
5290 }
5291 QualType PointeeType = readType(*Loc.F, Record, Idx);
5292 return Context.getRValueReferenceType(PointeeType);
5293 }
5294
5295 case TYPE_MEMBER_POINTER: {
5296 if (Record.size() != 2) {
5297 Error("Incorrect encoding of member pointer type");
5298 return QualType();
5299 }
5300 QualType PointeeType = readType(*Loc.F, Record, Idx);
5301 QualType ClassType = readType(*Loc.F, Record, Idx);
5302 if (PointeeType.isNull() || ClassType.isNull())
5303 return QualType();
5304
5305 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5306 }
5307
5308 case TYPE_CONSTANT_ARRAY: {
5309 QualType ElementType = readType(*Loc.F, Record, Idx);
5310 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5311 unsigned IndexTypeQuals = Record[2];
5312 unsigned Idx = 3;
5313 llvm::APInt Size = ReadAPInt(Record, Idx);
5314 return Context.getConstantArrayType(ElementType, Size,
5315 ASM, IndexTypeQuals);
5316 }
5317
5318 case TYPE_INCOMPLETE_ARRAY: {
5319 QualType ElementType = readType(*Loc.F, Record, Idx);
5320 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5321 unsigned IndexTypeQuals = Record[2];
5322 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5323 }
5324
5325 case TYPE_VARIABLE_ARRAY: {
5326 QualType ElementType = readType(*Loc.F, Record, Idx);
5327 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5328 unsigned IndexTypeQuals = Record[2];
5329 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5330 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5331 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5332 ASM, IndexTypeQuals,
5333 SourceRange(LBLoc, RBLoc));
5334 }
5335
5336 case TYPE_VECTOR: {
5337 if (Record.size() != 3) {
5338 Error("incorrect encoding of vector type in AST file");
5339 return QualType();
5340 }
5341
5342 QualType ElementType = readType(*Loc.F, Record, Idx);
5343 unsigned NumElements = Record[1];
5344 unsigned VecKind = Record[2];
5345 return Context.getVectorType(ElementType, NumElements,
5346 (VectorType::VectorKind)VecKind);
5347 }
5348
5349 case TYPE_EXT_VECTOR: {
5350 if (Record.size() != 3) {
5351 Error("incorrect encoding of extended vector type in AST file");
5352 return QualType();
5353 }
5354
5355 QualType ElementType = readType(*Loc.F, Record, Idx);
5356 unsigned NumElements = Record[1];
5357 return Context.getExtVectorType(ElementType, NumElements);
5358 }
5359
5360 case TYPE_FUNCTION_NO_PROTO: {
5361 if (Record.size() != 6) {
5362 Error("incorrect encoding of no-proto function type");
5363 return QualType();
5364 }
5365 QualType ResultType = readType(*Loc.F, Record, Idx);
5366 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5367 (CallingConv)Record[4], Record[5]);
5368 return Context.getFunctionNoProtoType(ResultType, Info);
5369 }
5370
5371 case TYPE_FUNCTION_PROTO: {
5372 QualType ResultType = readType(*Loc.F, Record, Idx);
5373
5374 FunctionProtoType::ExtProtoInfo EPI;
5375 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5376 /*hasregparm*/ Record[2],
5377 /*regparm*/ Record[3],
5378 static_cast<CallingConv>(Record[4]),
5379 /*produces*/ Record[5]);
5380
5381 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005382
5383 EPI.Variadic = Record[Idx++];
5384 EPI.HasTrailingReturn = Record[Idx++];
5385 EPI.TypeQuals = Record[Idx++];
5386 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005387 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005388 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005389
5390 unsigned NumParams = Record[Idx++];
5391 SmallVector<QualType, 16> ParamTypes;
5392 for (unsigned I = 0; I != NumParams; ++I)
5393 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5394
Jordan Rose5c382722013-03-08 21:51:21 +00005395 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005396 }
5397
5398 case TYPE_UNRESOLVED_USING: {
5399 unsigned Idx = 0;
5400 return Context.getTypeDeclType(
5401 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5402 }
5403
5404 case TYPE_TYPEDEF: {
5405 if (Record.size() != 2) {
5406 Error("incorrect encoding of typedef type");
5407 return QualType();
5408 }
5409 unsigned Idx = 0;
5410 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5411 QualType Canonical = readType(*Loc.F, Record, Idx);
5412 if (!Canonical.isNull())
5413 Canonical = Context.getCanonicalType(Canonical);
5414 return Context.getTypedefType(Decl, Canonical);
5415 }
5416
5417 case TYPE_TYPEOF_EXPR:
5418 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5419
5420 case TYPE_TYPEOF: {
5421 if (Record.size() != 1) {
5422 Error("incorrect encoding of typeof(type) in AST file");
5423 return QualType();
5424 }
5425 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5426 return Context.getTypeOfType(UnderlyingType);
5427 }
5428
5429 case TYPE_DECLTYPE: {
5430 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5431 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5432 }
5433
5434 case TYPE_UNARY_TRANSFORM: {
5435 QualType BaseType = readType(*Loc.F, Record, Idx);
5436 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5437 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5438 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5439 }
5440
Richard Smith74aeef52013-04-26 16:15:35 +00005441 case TYPE_AUTO: {
5442 QualType Deduced = readType(*Loc.F, Record, Idx);
5443 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005444 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005445 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005446 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005447
5448 case TYPE_RECORD: {
5449 if (Record.size() != 2) {
5450 Error("incorrect encoding of record type");
5451 return QualType();
5452 }
5453 unsigned Idx = 0;
5454 bool IsDependent = Record[Idx++];
5455 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5456 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5457 QualType T = Context.getRecordType(RD);
5458 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5459 return T;
5460 }
5461
5462 case TYPE_ENUM: {
5463 if (Record.size() != 2) {
5464 Error("incorrect encoding of enum type");
5465 return QualType();
5466 }
5467 unsigned Idx = 0;
5468 bool IsDependent = Record[Idx++];
5469 QualType T
5470 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5471 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5472 return T;
5473 }
5474
5475 case TYPE_ATTRIBUTED: {
5476 if (Record.size() != 3) {
5477 Error("incorrect encoding of attributed type");
5478 return QualType();
5479 }
5480 QualType modifiedType = readType(*Loc.F, Record, Idx);
5481 QualType equivalentType = readType(*Loc.F, Record, Idx);
5482 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5483 return Context.getAttributedType(kind, modifiedType, equivalentType);
5484 }
5485
5486 case TYPE_PAREN: {
5487 if (Record.size() != 1) {
5488 Error("incorrect encoding of paren type");
5489 return QualType();
5490 }
5491 QualType InnerType = readType(*Loc.F, Record, Idx);
5492 return Context.getParenType(InnerType);
5493 }
5494
5495 case TYPE_PACK_EXPANSION: {
5496 if (Record.size() != 2) {
5497 Error("incorrect encoding of pack expansion type");
5498 return QualType();
5499 }
5500 QualType Pattern = readType(*Loc.F, Record, Idx);
5501 if (Pattern.isNull())
5502 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005503 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005504 if (Record[1])
5505 NumExpansions = Record[1] - 1;
5506 return Context.getPackExpansionType(Pattern, NumExpansions);
5507 }
5508
5509 case TYPE_ELABORATED: {
5510 unsigned Idx = 0;
5511 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5512 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5513 QualType NamedType = readType(*Loc.F, Record, Idx);
5514 return Context.getElaboratedType(Keyword, NNS, NamedType);
5515 }
5516
5517 case TYPE_OBJC_INTERFACE: {
5518 unsigned Idx = 0;
5519 ObjCInterfaceDecl *ItfD
5520 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5521 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5522 }
5523
5524 case TYPE_OBJC_OBJECT: {
5525 unsigned Idx = 0;
5526 QualType Base = readType(*Loc.F, Record, Idx);
5527 unsigned NumProtos = Record[Idx++];
5528 SmallVector<ObjCProtocolDecl*, 4> Protos;
5529 for (unsigned I = 0; I != NumProtos; ++I)
5530 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5531 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5532 }
5533
5534 case TYPE_OBJC_OBJECT_POINTER: {
5535 unsigned Idx = 0;
5536 QualType Pointee = readType(*Loc.F, Record, Idx);
5537 return Context.getObjCObjectPointerType(Pointee);
5538 }
5539
5540 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5541 unsigned Idx = 0;
5542 QualType Parm = readType(*Loc.F, Record, Idx);
5543 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005544 return Context.getSubstTemplateTypeParmType(
5545 cast<TemplateTypeParmType>(Parm),
5546 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005547 }
5548
5549 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5550 unsigned Idx = 0;
5551 QualType Parm = readType(*Loc.F, Record, Idx);
5552 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5553 return Context.getSubstTemplateTypeParmPackType(
5554 cast<TemplateTypeParmType>(Parm),
5555 ArgPack);
5556 }
5557
5558 case TYPE_INJECTED_CLASS_NAME: {
5559 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5560 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5561 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5562 // for AST reading, too much interdependencies.
Richard Smith6377f8f2014-10-21 21:15:18 +00005563 const Type *T = nullptr;
5564 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5565 if (const Type *Existing = DI->getTypeForDecl()) {
5566 T = Existing;
5567 break;
5568 }
5569 }
5570 if (!T) {
Richard Smithf17fdbd2014-04-24 02:25:27 +00005571 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
Richard Smith6377f8f2014-10-21 21:15:18 +00005572 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5573 DI->setTypeForDecl(T);
5574 }
Richard Smithf17fdbd2014-04-24 02:25:27 +00005575 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005576 }
5577
5578 case TYPE_TEMPLATE_TYPE_PARM: {
5579 unsigned Idx = 0;
5580 unsigned Depth = Record[Idx++];
5581 unsigned Index = Record[Idx++];
5582 bool Pack = Record[Idx++];
5583 TemplateTypeParmDecl *D
5584 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5585 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5586 }
5587
5588 case TYPE_DEPENDENT_NAME: {
5589 unsigned Idx = 0;
5590 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5591 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5592 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5593 QualType Canon = readType(*Loc.F, Record, Idx);
5594 if (!Canon.isNull())
5595 Canon = Context.getCanonicalType(Canon);
5596 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5597 }
5598
5599 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5600 unsigned Idx = 0;
5601 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5602 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5603 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5604 unsigned NumArgs = Record[Idx++];
5605 SmallVector<TemplateArgument, 8> Args;
5606 Args.reserve(NumArgs);
5607 while (NumArgs--)
5608 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5609 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5610 Args.size(), Args.data());
5611 }
5612
5613 case TYPE_DEPENDENT_SIZED_ARRAY: {
5614 unsigned Idx = 0;
5615
5616 // ArrayType
5617 QualType ElementType = readType(*Loc.F, Record, Idx);
5618 ArrayType::ArraySizeModifier ASM
5619 = (ArrayType::ArraySizeModifier)Record[Idx++];
5620 unsigned IndexTypeQuals = Record[Idx++];
5621
5622 // DependentSizedArrayType
5623 Expr *NumElts = ReadExpr(*Loc.F);
5624 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5625
5626 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5627 IndexTypeQuals, Brackets);
5628 }
5629
5630 case TYPE_TEMPLATE_SPECIALIZATION: {
5631 unsigned Idx = 0;
5632 bool IsDependent = Record[Idx++];
5633 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5634 SmallVector<TemplateArgument, 8> Args;
5635 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5636 QualType Underlying = readType(*Loc.F, Record, Idx);
5637 QualType T;
5638 if (Underlying.isNull())
5639 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5640 Args.size());
5641 else
5642 T = Context.getTemplateSpecializationType(Name, Args.data(),
5643 Args.size(), Underlying);
5644 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5645 return T;
5646 }
5647
5648 case TYPE_ATOMIC: {
5649 if (Record.size() != 1) {
5650 Error("Incorrect encoding of atomic type");
5651 return QualType();
5652 }
5653 QualType ValueType = readType(*Loc.F, Record, Idx);
5654 return Context.getAtomicType(ValueType);
5655 }
5656 }
5657 llvm_unreachable("Invalid TypeCode!");
5658}
5659
Richard Smith564417a2014-03-20 21:47:22 +00005660void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5661 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005662 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005663 const RecordData &Record, unsigned &Idx) {
5664 ExceptionSpecificationType EST =
5665 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005666 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005667 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005668 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005669 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005670 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005671 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005672 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005673 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005674 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5675 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005676 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005677 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005678 }
5679}
5680
Guy Benyei11169dd2012-12-18 14:30:41 +00005681class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5682 ASTReader &Reader;
5683 ModuleFile &F;
5684 const ASTReader::RecordData &Record;
5685 unsigned &Idx;
5686
5687 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5688 unsigned &I) {
5689 return Reader.ReadSourceLocation(F, R, I);
5690 }
5691
5692 template<typename T>
5693 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5694 return Reader.ReadDeclAs<T>(F, Record, Idx);
5695 }
5696
5697public:
5698 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5699 const ASTReader::RecordData &Record, unsigned &Idx)
5700 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5701 { }
5702
5703 // We want compile-time assurance that we've enumerated all of
5704 // these, so unfortunately we have to declare them first, then
5705 // define them out-of-line.
5706#define ABSTRACT_TYPELOC(CLASS, PARENT)
5707#define TYPELOC(CLASS, PARENT) \
5708 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5709#include "clang/AST/TypeLocNodes.def"
5710
5711 void VisitFunctionTypeLoc(FunctionTypeLoc);
5712 void VisitArrayTypeLoc(ArrayTypeLoc);
5713};
5714
5715void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5716 // nothing to do
5717}
5718void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5719 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5720 if (TL.needsExtraLocalData()) {
5721 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5722 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5723 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5724 TL.setModeAttr(Record[Idx++]);
5725 }
5726}
5727void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5728 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5729}
5730void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5731 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5732}
Reid Kleckner8a365022013-06-24 17:51:48 +00005733void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5734 // nothing to do
5735}
Reid Kleckner0503a872013-12-05 01:23:43 +00005736void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5737 // nothing to do
5738}
Guy Benyei11169dd2012-12-18 14:30:41 +00005739void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5740 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5741}
5742void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5743 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5744}
5745void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5746 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5747}
5748void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5749 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5750 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5751}
5752void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5753 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5754 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5755 if (Record[Idx++])
5756 TL.setSizeExpr(Reader.ReadExpr(F));
5757 else
Craig Toppera13603a2014-05-22 05:54:18 +00005758 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005759}
5760void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5761 VisitArrayTypeLoc(TL);
5762}
5763void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5764 VisitArrayTypeLoc(TL);
5765}
5766void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5767 VisitArrayTypeLoc(TL);
5768}
5769void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5770 DependentSizedArrayTypeLoc TL) {
5771 VisitArrayTypeLoc(TL);
5772}
5773void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5774 DependentSizedExtVectorTypeLoc TL) {
5775 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5776}
5777void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5778 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5779}
5780void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5781 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5782}
5783void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5784 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5785 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5786 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5787 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005788 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5789 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005790 }
5791}
5792void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5793 VisitFunctionTypeLoc(TL);
5794}
5795void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5796 VisitFunctionTypeLoc(TL);
5797}
5798void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5799 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5800}
5801void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5802 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5803}
5804void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5805 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5806 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5807 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5808}
5809void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5810 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5811 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5812 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5813 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5814}
5815void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5816 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5817}
5818void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5819 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5820 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5821 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5822 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5823}
5824void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5825 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5826}
5827void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5828 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5829}
5830void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5831 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5832}
5833void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5834 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5835 if (TL.hasAttrOperand()) {
5836 SourceRange range;
5837 range.setBegin(ReadSourceLocation(Record, Idx));
5838 range.setEnd(ReadSourceLocation(Record, Idx));
5839 TL.setAttrOperandParensRange(range);
5840 }
5841 if (TL.hasAttrExprOperand()) {
5842 if (Record[Idx++])
5843 TL.setAttrExprOperand(Reader.ReadExpr(F));
5844 else
Craig Toppera13603a2014-05-22 05:54:18 +00005845 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005846 } else if (TL.hasAttrEnumOperand())
5847 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5848}
5849void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5850 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5851}
5852void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5853 SubstTemplateTypeParmTypeLoc TL) {
5854 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5855}
5856void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5857 SubstTemplateTypeParmPackTypeLoc TL) {
5858 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5859}
5860void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5861 TemplateSpecializationTypeLoc TL) {
5862 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5863 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5864 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5865 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5866 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5867 TL.setArgLocInfo(i,
5868 Reader.GetTemplateArgumentLocInfo(F,
5869 TL.getTypePtr()->getArg(i).getKind(),
5870 Record, Idx));
5871}
5872void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5873 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5874 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5875}
5876void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5877 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5878 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5879}
5880void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5881 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5882}
5883void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5884 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5885 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5886 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5887}
5888void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5889 DependentTemplateSpecializationTypeLoc TL) {
5890 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5891 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5892 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5893 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5894 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5895 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5896 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5897 TL.setArgLocInfo(I,
5898 Reader.GetTemplateArgumentLocInfo(F,
5899 TL.getTypePtr()->getArg(I).getKind(),
5900 Record, Idx));
5901}
5902void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5903 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5904}
5905void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5906 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5907}
5908void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5909 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5910 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5911 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5912 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5913 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5914}
5915void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5916 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5917}
5918void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5919 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5920 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5921 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5922}
5923
5924TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5925 const RecordData &Record,
5926 unsigned &Idx) {
5927 QualType InfoTy = readType(F, Record, Idx);
5928 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005929 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005930
5931 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5932 TypeLocReader TLR(*this, F, Record, Idx);
5933 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5934 TLR.Visit(TL);
5935 return TInfo;
5936}
5937
5938QualType ASTReader::GetType(TypeID ID) {
5939 unsigned FastQuals = ID & Qualifiers::FastMask;
5940 unsigned Index = ID >> Qualifiers::FastWidth;
5941
5942 if (Index < NUM_PREDEF_TYPE_IDS) {
5943 QualType T;
5944 switch ((PredefinedTypeIDs)Index) {
5945 case PREDEF_TYPE_NULL_ID: return QualType();
5946 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5947 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5948
5949 case PREDEF_TYPE_CHAR_U_ID:
5950 case PREDEF_TYPE_CHAR_S_ID:
5951 // FIXME: Check that the signedness of CharTy is correct!
5952 T = Context.CharTy;
5953 break;
5954
5955 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5956 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5957 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5958 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5959 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5960 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5961 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5962 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5963 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5964 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5965 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5966 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5967 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5968 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5969 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5970 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5971 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5972 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5973 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5974 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5975 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5976 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5977 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5978 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5979 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5980 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5981 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5982 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00005983 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5984 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5985 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5986 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5987 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5988 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00005989 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005990 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005991 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5992
5993 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5994 T = Context.getAutoRRefDeductType();
5995 break;
5996
5997 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5998 T = Context.ARCUnbridgedCastTy;
5999 break;
6000
6001 case PREDEF_TYPE_VA_LIST_TAG:
6002 T = Context.getVaListTagType();
6003 break;
6004
6005 case PREDEF_TYPE_BUILTIN_FN:
6006 T = Context.BuiltinFnTy;
6007 break;
6008 }
6009
6010 assert(!T.isNull() && "Unknown predefined type");
6011 return T.withFastQualifiers(FastQuals);
6012 }
6013
6014 Index -= NUM_PREDEF_TYPE_IDS;
6015 assert(Index < TypesLoaded.size() && "Type index out-of-range");
6016 if (TypesLoaded[Index].isNull()) {
6017 TypesLoaded[Index] = readTypeRecord(Index);
6018 if (TypesLoaded[Index].isNull())
6019 return QualType();
6020
6021 TypesLoaded[Index]->setFromAST();
6022 if (DeserializationListener)
6023 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6024 TypesLoaded[Index]);
6025 }
6026
6027 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6028}
6029
6030QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6031 return GetType(getGlobalTypeID(F, LocalID));
6032}
6033
6034serialization::TypeID
6035ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6036 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6037 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
6038
6039 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6040 return LocalID;
6041
6042 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6043 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
6044 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
6045
6046 unsigned GlobalIndex = LocalIndex + I->second;
6047 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
6048}
6049
6050TemplateArgumentLocInfo
6051ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6052 TemplateArgument::ArgKind Kind,
6053 const RecordData &Record,
6054 unsigned &Index) {
6055 switch (Kind) {
6056 case TemplateArgument::Expression:
6057 return ReadExpr(F);
6058 case TemplateArgument::Type:
6059 return GetTypeSourceInfo(F, Record, Index);
6060 case TemplateArgument::Template: {
6061 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6062 Index);
6063 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6064 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6065 SourceLocation());
6066 }
6067 case TemplateArgument::TemplateExpansion: {
6068 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6069 Index);
6070 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6071 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6072 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6073 EllipsisLoc);
6074 }
6075 case TemplateArgument::Null:
6076 case TemplateArgument::Integral:
6077 case TemplateArgument::Declaration:
6078 case TemplateArgument::NullPtr:
6079 case TemplateArgument::Pack:
6080 // FIXME: Is this right?
6081 return TemplateArgumentLocInfo();
6082 }
6083 llvm_unreachable("unexpected template argument loc");
6084}
6085
6086TemplateArgumentLoc
6087ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6088 const RecordData &Record, unsigned &Index) {
6089 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6090
6091 if (Arg.getKind() == TemplateArgument::Expression) {
6092 if (Record[Index++]) // bool InfoHasSameExpr.
6093 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6094 }
6095 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6096 Record, Index));
6097}
6098
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00006099const ASTTemplateArgumentListInfo*
6100ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6101 const RecordData &Record,
6102 unsigned &Index) {
6103 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6104 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6105 unsigned NumArgsAsWritten = Record[Index++];
6106 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6107 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6108 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6109 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6110}
6111
Guy Benyei11169dd2012-12-18 14:30:41 +00006112Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6113 return GetDecl(ID);
6114}
6115
Richard Smith50895422015-01-31 03:04:55 +00006116template<typename TemplateSpecializationDecl>
6117static void completeRedeclChainForTemplateSpecialization(Decl *D) {
6118 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D))
6119 TSD->getSpecializedTemplate()->LoadLazySpecializations();
6120}
6121
Richard Smith053f6c62014-05-16 23:01:30 +00006122void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00006123 if (NumCurrentElementsDeserializing) {
6124 // We arrange to not care about the complete redeclaration chain while we're
6125 // deserializing. Just remember that the AST has marked this one as complete
6126 // but that it's not actually complete yet, so we know we still need to
6127 // complete it later.
6128 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6129 return;
6130 }
6131
Richard Smith053f6c62014-05-16 23:01:30 +00006132 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6133
Richard Smith053f6c62014-05-16 23:01:30 +00006134 // If this is a named declaration, complete it by looking it up
6135 // within its context.
6136 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00006137 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00006138 // all mergeable entities within it.
6139 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6140 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6141 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6142 auto *II = Name.getAsIdentifierInfo();
6143 if (isa<TranslationUnitDecl>(DC) && II) {
6144 // Outside of C++, we don't have a lookup table for the TU, so update
6145 // the identifier instead. In C++, either way should work fine.
6146 if (II->isOutOfDate())
6147 updateOutOfDateIdentifier(*II);
6148 } else
6149 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00006150 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6151 // FIXME: It'd be nice to do something a bit more targeted here.
6152 D->getDeclContext()->decls_begin();
Richard Smith053f6c62014-05-16 23:01:30 +00006153 }
6154 }
Richard Smith50895422015-01-31 03:04:55 +00006155
6156 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
6157 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
6158 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
6159 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
6160 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6161 if (auto *Template = FD->getPrimaryTemplate())
6162 Template->LoadLazySpecializations();
6163 }
Richard Smith053f6c62014-05-16 23:01:30 +00006164}
6165
Richard Smithcd45dbc2014-04-19 03:48:30 +00006166uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6167 const RecordData &Record,
6168 unsigned &Idx) {
6169 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6170 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00006171 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006172 }
6173
Guy Benyei11169dd2012-12-18 14:30:41 +00006174 unsigned LocalID = Record[Idx++];
6175 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6176}
6177
6178CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6179 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006180 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006181 SavedStreamPosition SavedPosition(Cursor);
6182 Cursor.JumpToBit(Loc.Offset);
6183 ReadingKindTracker ReadingKind(Read_Decl, *this);
6184 RecordData Record;
6185 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00006186 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00006187 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006188 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00006189 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006190 }
6191
6192 unsigned Idx = 0;
6193 unsigned NumBases = Record[Idx++];
6194 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6195 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6196 for (unsigned I = 0; I != NumBases; ++I)
6197 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6198 return Bases;
6199}
6200
6201serialization::DeclID
6202ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6203 if (LocalID < NUM_PREDEF_DECL_IDS)
6204 return LocalID;
6205
6206 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6207 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6208 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6209
6210 return LocalID + I->second;
6211}
6212
6213bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6214 ModuleFile &M) const {
Richard Smithfe620d22015-03-05 23:24:12 +00006215 // Predefined decls aren't from any module.
6216 if (ID < NUM_PREDEF_DECL_IDS)
6217 return false;
6218
Guy Benyei11169dd2012-12-18 14:30:41 +00006219 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6220 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6221 return &M == I->second;
6222}
6223
Douglas Gregor9f782892013-01-21 15:25:38 +00006224ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006225 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00006226 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006227 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6228 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6229 return I->second;
6230}
6231
6232SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6233 if (ID < NUM_PREDEF_DECL_IDS)
6234 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006235
Guy Benyei11169dd2012-12-18 14:30:41 +00006236 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6237
6238 if (Index > DeclsLoaded.size()) {
6239 Error("declaration ID out-of-range for AST file");
6240 return SourceLocation();
6241 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006242
Guy Benyei11169dd2012-12-18 14:30:41 +00006243 if (Decl *D = DeclsLoaded[Index])
6244 return D->getLocation();
6245
6246 unsigned RawLocation = 0;
6247 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6248 return ReadSourceLocation(*Rec.F, RawLocation);
6249}
6250
Richard Smithfe620d22015-03-05 23:24:12 +00006251static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
6252 switch (ID) {
6253 case PREDEF_DECL_NULL_ID:
6254 return nullptr;
6255
6256 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6257 return Context.getTranslationUnitDecl();
6258
6259 case PREDEF_DECL_OBJC_ID_ID:
6260 return Context.getObjCIdDecl();
6261
6262 case PREDEF_DECL_OBJC_SEL_ID:
6263 return Context.getObjCSelDecl();
6264
6265 case PREDEF_DECL_OBJC_CLASS_ID:
6266 return Context.getObjCClassDecl();
6267
6268 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6269 return Context.getObjCProtocolDecl();
6270
6271 case PREDEF_DECL_INT_128_ID:
6272 return Context.getInt128Decl();
6273
6274 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6275 return Context.getUInt128Decl();
6276
6277 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6278 return Context.getObjCInstanceTypeDecl();
6279
6280 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6281 return Context.getBuiltinVaListDecl();
Richard Smithf19e1272015-03-07 00:04:49 +00006282
6283 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
6284 return Context.getExternCContextDecl();
Richard Smithfe620d22015-03-05 23:24:12 +00006285 }
Yaron Keren322bdad2015-03-06 07:49:14 +00006286 llvm_unreachable("PredefinedDeclIDs unknown enum value");
Richard Smithfe620d22015-03-05 23:24:12 +00006287}
6288
Richard Smithcd45dbc2014-04-19 03:48:30 +00006289Decl *ASTReader::GetExistingDecl(DeclID ID) {
6290 if (ID < NUM_PREDEF_DECL_IDS) {
Richard Smithfe620d22015-03-05 23:24:12 +00006291 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID);
6292 if (D) {
6293 // Track that we have merged the declaration with ID \p ID into the
6294 // pre-existing predefined declaration \p D.
6295 auto &Merged = MergedDecls[D->getCanonicalDecl()];
6296 if (Merged.empty())
6297 Merged.push_back(ID);
Guy Benyei11169dd2012-12-18 14:30:41 +00006298 }
Richard Smithfe620d22015-03-05 23:24:12 +00006299 return D;
Guy Benyei11169dd2012-12-18 14:30:41 +00006300 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006301
Guy Benyei11169dd2012-12-18 14:30:41 +00006302 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6303
6304 if (Index >= DeclsLoaded.size()) {
6305 assert(0 && "declaration ID out-of-range for AST file");
6306 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006307 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006308 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006309
6310 return DeclsLoaded[Index];
6311}
6312
6313Decl *ASTReader::GetDecl(DeclID ID) {
6314 if (ID < NUM_PREDEF_DECL_IDS)
6315 return GetExistingDecl(ID);
6316
6317 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6318
6319 if (Index >= DeclsLoaded.size()) {
6320 assert(0 && "declaration ID out-of-range for AST file");
6321 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006322 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006323 }
6324
Guy Benyei11169dd2012-12-18 14:30:41 +00006325 if (!DeclsLoaded[Index]) {
6326 ReadDeclRecord(ID);
6327 if (DeserializationListener)
6328 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6329 }
6330
6331 return DeclsLoaded[Index];
6332}
6333
6334DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6335 DeclID GlobalID) {
6336 if (GlobalID < NUM_PREDEF_DECL_IDS)
6337 return GlobalID;
6338
6339 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6340 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6341 ModuleFile *Owner = I->second;
6342
6343 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6344 = M.GlobalToLocalDeclIDs.find(Owner);
6345 if (Pos == M.GlobalToLocalDeclIDs.end())
6346 return 0;
6347
6348 return GlobalID - Owner->BaseDeclID + Pos->second;
6349}
6350
6351serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6352 const RecordData &Record,
6353 unsigned &Idx) {
6354 if (Idx >= Record.size()) {
6355 Error("Corrupted AST file");
6356 return 0;
6357 }
6358
6359 return getGlobalDeclID(F, Record[Idx++]);
6360}
6361
6362/// \brief Resolve the offset of a statement into a statement.
6363///
6364/// This operation will read a new statement from the external
6365/// source each time it is called, and is meant to be used via a
6366/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6367Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6368 // Switch case IDs are per Decl.
6369 ClearSwitchCaseIDs();
6370
6371 // Offset here is a global offset across the entire chain.
6372 RecordLocation Loc = getLocalBitOffset(Offset);
6373 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6374 return ReadStmtFromStream(*Loc.F);
6375}
6376
6377namespace {
6378 class FindExternalLexicalDeclsVisitor {
6379 ASTReader &Reader;
6380 const DeclContext *DC;
6381 bool (*isKindWeWant)(Decl::Kind);
6382
6383 SmallVectorImpl<Decl*> &Decls;
6384 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6385
6386 public:
6387 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6388 bool (*isKindWeWant)(Decl::Kind),
6389 SmallVectorImpl<Decl*> &Decls)
6390 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6391 {
6392 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6393 PredefsVisited[I] = false;
6394 }
6395
6396 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6397 if (Preorder)
6398 return false;
6399
6400 FindExternalLexicalDeclsVisitor *This
6401 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6402
6403 ModuleFile::DeclContextInfosMap::iterator Info
6404 = M.DeclContextInfos.find(This->DC);
6405 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6406 return false;
6407
6408 // Load all of the declaration IDs
6409 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6410 *IDE = ID + Info->second.NumLexicalDecls;
6411 ID != IDE; ++ID) {
6412 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6413 continue;
6414
6415 // Don't add predefined declarations to the lexical context more
6416 // than once.
6417 if (ID->second < NUM_PREDEF_DECL_IDS) {
6418 if (This->PredefsVisited[ID->second])
6419 continue;
6420
6421 This->PredefsVisited[ID->second] = true;
6422 }
6423
6424 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6425 if (!This->DC->isDeclInLexicalTraversal(D))
6426 This->Decls.push_back(D);
6427 }
6428 }
6429
6430 return false;
6431 }
6432 };
6433}
6434
6435ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6436 bool (*isKindWeWant)(Decl::Kind),
6437 SmallVectorImpl<Decl*> &Decls) {
6438 // There might be lexical decls in multiple modules, for the TU at
6439 // least. Walk all of the modules in the order they were loaded.
6440 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6441 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6442 ++NumLexicalDeclContextsRead;
6443 return ELR_Success;
6444}
6445
6446namespace {
6447
6448class DeclIDComp {
6449 ASTReader &Reader;
6450 ModuleFile &Mod;
6451
6452public:
6453 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6454
6455 bool operator()(LocalDeclID L, LocalDeclID R) const {
6456 SourceLocation LHS = getLocation(L);
6457 SourceLocation RHS = getLocation(R);
6458 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6459 }
6460
6461 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6462 SourceLocation RHS = getLocation(R);
6463 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6464 }
6465
6466 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6467 SourceLocation LHS = getLocation(L);
6468 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6469 }
6470
6471 SourceLocation getLocation(LocalDeclID ID) const {
6472 return Reader.getSourceManager().getFileLoc(
6473 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6474 }
6475};
6476
6477}
6478
6479void ASTReader::FindFileRegionDecls(FileID File,
6480 unsigned Offset, unsigned Length,
6481 SmallVectorImpl<Decl *> &Decls) {
6482 SourceManager &SM = getSourceManager();
6483
6484 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6485 if (I == FileDeclIDs.end())
6486 return;
6487
6488 FileDeclsInfo &DInfo = I->second;
6489 if (DInfo.Decls.empty())
6490 return;
6491
6492 SourceLocation
6493 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6494 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6495
6496 DeclIDComp DIDComp(*this, *DInfo.Mod);
6497 ArrayRef<serialization::LocalDeclID>::iterator
6498 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6499 BeginLoc, DIDComp);
6500 if (BeginIt != DInfo.Decls.begin())
6501 --BeginIt;
6502
6503 // If we are pointing at a top-level decl inside an objc container, we need
6504 // to backtrack until we find it otherwise we will fail to report that the
6505 // region overlaps with an objc container.
6506 while (BeginIt != DInfo.Decls.begin() &&
6507 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6508 ->isTopLevelDeclInObjCContainer())
6509 --BeginIt;
6510
6511 ArrayRef<serialization::LocalDeclID>::iterator
6512 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6513 EndLoc, DIDComp);
6514 if (EndIt != DInfo.Decls.end())
6515 ++EndIt;
6516
6517 for (ArrayRef<serialization::LocalDeclID>::iterator
6518 DIt = BeginIt; DIt != EndIt; ++DIt)
6519 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6520}
6521
6522namespace {
6523 /// \brief ModuleFile visitor used to perform name lookup into a
6524 /// declaration context.
6525 class DeclContextNameLookupVisitor {
6526 ASTReader &Reader;
Richard Smith8c913ec2014-08-14 02:21:01 +00006527 ArrayRef<const DeclContext *> Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006528 DeclarationName Name;
6529 SmallVectorImpl<NamedDecl *> &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006530 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet;
Guy Benyei11169dd2012-12-18 14:30:41 +00006531
6532 public:
Richard Smith8c913ec2014-08-14 02:21:01 +00006533 DeclContextNameLookupVisitor(ASTReader &Reader,
6534 ArrayRef<const DeclContext *> Contexts,
Guy Benyei11169dd2012-12-18 14:30:41 +00006535 DeclarationName Name,
Richard Smith52874ec2015-02-13 20:17:14 +00006536 SmallVectorImpl<NamedDecl *> &Decls,
6537 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet)
6538 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls),
6539 DeclSet(DeclSet) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006540
6541 static bool visit(ModuleFile &M, void *UserData) {
6542 DeclContextNameLookupVisitor *This
6543 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6544
6545 // Check whether we have any visible declaration information for
6546 // this context in this module.
6547 ModuleFile::DeclContextInfosMap::iterator Info;
6548 bool FoundInfo = false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006549 for (auto *DC : This->Contexts) {
6550 Info = M.DeclContextInfos.find(DC);
6551 if (Info != M.DeclContextInfos.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00006552 Info->second.NameLookupTableData) {
6553 FoundInfo = true;
6554 break;
6555 }
6556 }
6557
6558 if (!FoundInfo)
6559 return false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006560
Guy Benyei11169dd2012-12-18 14:30:41 +00006561 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006562 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006563 Info->second.NameLookupTableData;
6564 ASTDeclContextNameLookupTable::iterator Pos
6565 = LookupTable->find(This->Name);
6566 if (Pos == LookupTable->end())
6567 return false;
6568
6569 bool FoundAnything = false;
6570 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6571 for (; Data.first != Data.second; ++Data.first) {
6572 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6573 if (!ND)
6574 continue;
6575
6576 if (ND->getDeclName() != This->Name) {
6577 // A name might be null because the decl's redeclarable part is
6578 // currently read before reading its name. The lookup is triggered by
6579 // building that decl (likely indirectly), and so it is later in the
6580 // sense of "already existing" and can be ignored here.
Richard Smith8c913ec2014-08-14 02:21:01 +00006581 // FIXME: This should not happen; deserializing declarations should
6582 // not perform lookups since that can lead to deserialization cycles.
Guy Benyei11169dd2012-12-18 14:30:41 +00006583 continue;
6584 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006585
Guy Benyei11169dd2012-12-18 14:30:41 +00006586 // Record this declaration.
6587 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006588 if (This->DeclSet.insert(ND).second)
6589 This->Decls.push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006590 }
6591
6592 return FoundAnything;
6593 }
6594 };
6595}
6596
Douglas Gregor9f782892013-01-21 15:25:38 +00006597/// \brief Retrieve the "definitive" module file for the definition of the
6598/// given declaration context, if there is one.
6599///
6600/// The "definitive" module file is the only place where we need to look to
6601/// find information about the declarations within the given declaration
6602/// context. For example, C++ and Objective-C classes, C structs/unions, and
6603/// Objective-C protocols, categories, and extensions are all defined in a
6604/// single place in the source code, so they have definitive module files
6605/// associated with them. C++ namespaces, on the other hand, can have
6606/// definitions in multiple different module files.
6607///
6608/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6609/// NDEBUG checking.
6610static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6611 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006612 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6613 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006614
Craig Toppera13603a2014-05-22 05:54:18 +00006615 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006616}
6617
Richard Smith9ce12e32013-02-07 03:30:24 +00006618bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006619ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6620 DeclarationName Name) {
6621 assert(DC->hasExternalVisibleStorage() &&
6622 "DeclContext has no visible decls in storage");
6623 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006624 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006625
Richard Smith8c913ec2014-08-14 02:21:01 +00006626 Deserializing LookupResults(this);
6627
Guy Benyei11169dd2012-12-18 14:30:41 +00006628 SmallVector<NamedDecl *, 64> Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006629 llvm::SmallPtrSet<NamedDecl*, 64> DeclSet;
Richard Smith8c913ec2014-08-14 02:21:01 +00006630
Guy Benyei11169dd2012-12-18 14:30:41 +00006631 // Compute the declaration contexts we need to look into. Multiple such
6632 // declaration contexts occur when two declaration contexts from disjoint
6633 // modules get merged, e.g., when two namespaces with the same name are
6634 // independently defined in separate modules.
6635 SmallVector<const DeclContext *, 2> Contexts;
6636 Contexts.push_back(DC);
Richard Smith8c913ec2014-08-14 02:21:01 +00006637
Guy Benyei11169dd2012-12-18 14:30:41 +00006638 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006639 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006640 if (Merged != MergedDecls.end()) {
6641 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6642 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6643 }
6644 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006645
6646 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
Richard Smith52874ec2015-02-13 20:17:14 +00006647 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls, DeclSet);
Richard Smith8c913ec2014-08-14 02:21:01 +00006648
6649 // If we can definitively determine which module file to look into,
6650 // only look there. Otherwise, look in all module files.
6651 ModuleFile *Definitive;
6652 if (Contexts.size() == 1 &&
6653 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6654 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6655 } else {
6656 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6657 }
6658 };
6659
6660 LookUpInContexts(Contexts);
6661
6662 // If this might be an implicit special member function, then also search
6663 // all merged definitions of the surrounding class. We need to search them
6664 // individually, because finding an entity in one of them doesn't imply that
6665 // we can't find a different entity in another one.
Richard Smithcd45dbc2014-04-19 03:48:30 +00006666 if (isa<CXXRecordDecl>(DC)) {
Richard Smith8c913ec2014-08-14 02:21:01 +00006667 auto Kind = Name.getNameKind();
6668 if (Kind == DeclarationName::CXXConstructorName ||
6669 Kind == DeclarationName::CXXDestructorName ||
6670 (Kind == DeclarationName::CXXOperatorName &&
6671 Name.getCXXOverloadedOperator() == OO_Equal)) {
6672 auto Merged = MergedLookups.find(DC);
Richard Smithe0612472014-11-21 05:16:13 +00006673 if (Merged != MergedLookups.end()) {
6674 for (unsigned I = 0; I != Merged->second.size(); ++I) {
Daniel Jasperc0b7c802015-02-18 14:13:46 +00006675 const DeclContext *Context = Merged->second[I];
6676 LookUpInContexts(Context);
Richard Smithe0612472014-11-21 05:16:13 +00006677 // We might have just added some more merged lookups. If so, our
6678 // iterator is now invalid, so grab a fresh one before continuing.
6679 Merged = MergedLookups.find(DC);
6680 }
6681 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006682 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006683 }
6684
Guy Benyei11169dd2012-12-18 14:30:41 +00006685 ++NumVisibleDeclContextsRead;
6686 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006687 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006688}
6689
6690namespace {
6691 /// \brief ModuleFile visitor used to retrieve all visible names in a
6692 /// declaration context.
6693 class DeclContextAllNamesVisitor {
6694 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006695 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006696 DeclsMap &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006697 llvm::SmallPtrSet<NamedDecl *, 256> DeclSet;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006698 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006699
6700 public:
6701 DeclContextAllNamesVisitor(ASTReader &Reader,
6702 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006703 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006704 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006705
6706 static bool visit(ModuleFile &M, void *UserData) {
6707 DeclContextAllNamesVisitor *This
6708 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6709
6710 // Check whether we have any visible declaration information for
6711 // this context in this module.
6712 ModuleFile::DeclContextInfosMap::iterator Info;
6713 bool FoundInfo = false;
6714 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6715 Info = M.DeclContextInfos.find(This->Contexts[I]);
6716 if (Info != M.DeclContextInfos.end() &&
6717 Info->second.NameLookupTableData) {
6718 FoundInfo = true;
6719 break;
6720 }
6721 }
6722
6723 if (!FoundInfo)
6724 return false;
6725
Richard Smith52e3fba2014-03-11 07:17:35 +00006726 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006727 Info->second.NameLookupTableData;
6728 bool FoundAnything = false;
6729 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006730 I = LookupTable->data_begin(), E = LookupTable->data_end();
6731 I != E;
6732 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006733 ASTDeclContextNameLookupTrait::data_type Data = *I;
6734 for (; Data.first != Data.second; ++Data.first) {
6735 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6736 *Data.first);
6737 if (!ND)
6738 continue;
6739
6740 // Record this declaration.
6741 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006742 if (This->DeclSet.insert(ND).second)
6743 This->Decls[ND->getDeclName()].push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006744 }
6745 }
6746
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006747 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006748 }
6749 };
6750}
6751
6752void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6753 if (!DC->hasExternalVisibleStorage())
6754 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006755 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006756
6757 // Compute the declaration contexts we need to look into. Multiple such
6758 // declaration contexts occur when two declaration contexts from disjoint
6759 // modules get merged, e.g., when two namespaces with the same name are
6760 // independently defined in separate modules.
6761 SmallVector<const DeclContext *, 2> Contexts;
6762 Contexts.push_back(DC);
6763
6764 if (DC->isNamespace()) {
6765 MergedDeclsMap::iterator Merged
6766 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6767 if (Merged != MergedDecls.end()) {
6768 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6769 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6770 }
6771 }
6772
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006773 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6774 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006775 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6776 ++NumVisibleDeclContextsRead;
6777
Craig Topper79be4cd2013-07-05 04:33:53 +00006778 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006779 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6780 }
6781 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6782}
6783
6784/// \brief Under non-PCH compilation the consumer receives the objc methods
6785/// before receiving the implementation, and codegen depends on this.
6786/// We simulate this by deserializing and passing to consumer the methods of the
6787/// implementation before passing the deserialized implementation decl.
6788static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6789 ASTConsumer *Consumer) {
6790 assert(ImplD && Consumer);
6791
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006792 for (auto *I : ImplD->methods())
6793 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006794
6795 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6796}
6797
6798void ASTReader::PassInterestingDeclsToConsumer() {
6799 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006800
6801 if (PassingDeclsToConsumer)
6802 return;
6803
6804 // Guard variable to avoid recursively redoing the process of passing
6805 // decls to consumer.
6806 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6807 true);
6808
Guy Benyei11169dd2012-12-18 14:30:41 +00006809 while (!InterestingDecls.empty()) {
6810 Decl *D = InterestingDecls.front();
6811 InterestingDecls.pop_front();
6812
6813 PassInterestingDeclToConsumer(D);
6814 }
6815}
6816
6817void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6818 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6819 PassObjCImplDeclToConsumer(ImplD, Consumer);
6820 else
6821 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6822}
6823
6824void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6825 this->Consumer = Consumer;
6826
6827 if (!Consumer)
6828 return;
6829
Ben Langmuir332aafe2014-01-31 01:06:56 +00006830 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006831 // Force deserialization of this decl, which will cause it to be queued for
6832 // passing to the consumer.
Ben Langmuir332aafe2014-01-31 01:06:56 +00006833 GetDecl(EagerlyDeserializedDecls[I]);
Guy Benyei11169dd2012-12-18 14:30:41 +00006834 }
Ben Langmuir332aafe2014-01-31 01:06:56 +00006835 EagerlyDeserializedDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006836
6837 PassInterestingDeclsToConsumer();
6838}
6839
6840void ASTReader::PrintStats() {
6841 std::fprintf(stderr, "*** AST File Statistics:\n");
6842
6843 unsigned NumTypesLoaded
6844 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6845 QualType());
6846 unsigned NumDeclsLoaded
6847 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006848 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006849 unsigned NumIdentifiersLoaded
6850 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6851 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006852 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006853 unsigned NumMacrosLoaded
6854 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6855 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006856 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006857 unsigned NumSelectorsLoaded
6858 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6859 SelectorsLoaded.end(),
6860 Selector());
6861
6862 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6863 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6864 NumSLocEntriesRead, TotalNumSLocEntries,
6865 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6866 if (!TypesLoaded.empty())
6867 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6868 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6869 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6870 if (!DeclsLoaded.empty())
6871 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6872 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6873 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6874 if (!IdentifiersLoaded.empty())
6875 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6876 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6877 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6878 if (!MacrosLoaded.empty())
6879 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6880 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6881 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6882 if (!SelectorsLoaded.empty())
6883 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6884 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6885 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6886 if (TotalNumStatements)
6887 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6888 NumStatementsRead, TotalNumStatements,
6889 ((float)NumStatementsRead/TotalNumStatements * 100));
6890 if (TotalNumMacros)
6891 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6892 NumMacrosRead, TotalNumMacros,
6893 ((float)NumMacrosRead/TotalNumMacros * 100));
6894 if (TotalLexicalDeclContexts)
6895 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6896 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6897 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6898 * 100));
6899 if (TotalVisibleDeclContexts)
6900 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6901 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6902 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6903 * 100));
6904 if (TotalNumMethodPoolEntries) {
6905 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6906 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6907 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6908 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006909 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006910 if (NumMethodPoolLookups) {
6911 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6912 NumMethodPoolHits, NumMethodPoolLookups,
6913 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6914 }
6915 if (NumMethodPoolTableLookups) {
6916 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6917 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6918 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6919 * 100.0));
6920 }
6921
Douglas Gregor00a50f72013-01-25 00:38:33 +00006922 if (NumIdentifierLookupHits) {
6923 std::fprintf(stderr,
6924 " %u / %u identifier table lookups succeeded (%f%%)\n",
6925 NumIdentifierLookupHits, NumIdentifierLookups,
6926 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6927 }
6928
Douglas Gregore060e572013-01-25 01:03:03 +00006929 if (GlobalIndex) {
6930 std::fprintf(stderr, "\n");
6931 GlobalIndex->printStats();
6932 }
6933
Guy Benyei11169dd2012-12-18 14:30:41 +00006934 std::fprintf(stderr, "\n");
6935 dump();
6936 std::fprintf(stderr, "\n");
6937}
6938
6939template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6940static void
6941dumpModuleIDMap(StringRef Name,
6942 const ContinuousRangeMap<Key, ModuleFile *,
6943 InitialCapacity> &Map) {
6944 if (Map.begin() == Map.end())
6945 return;
6946
6947 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6948 llvm::errs() << Name << ":\n";
6949 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6950 I != IEnd; ++I) {
6951 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6952 << "\n";
6953 }
6954}
6955
6956void ASTReader::dump() {
6957 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6958 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6959 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6960 dumpModuleIDMap("Global type map", GlobalTypeMap);
6961 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6962 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6963 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6964 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6965 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6966 dumpModuleIDMap("Global preprocessed entity map",
6967 GlobalPreprocessedEntityMap);
6968
6969 llvm::errs() << "\n*** PCH/Modules Loaded:";
6970 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6971 MEnd = ModuleMgr.end();
6972 M != MEnd; ++M)
6973 (*M)->dump();
6974}
6975
6976/// Return the amount of memory used by memory buffers, breaking down
6977/// by heap-backed versus mmap'ed memory.
6978void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6979 for (ModuleConstIterator I = ModuleMgr.begin(),
6980 E = ModuleMgr.end(); I != E; ++I) {
6981 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6982 size_t bytes = buf->getBufferSize();
6983 switch (buf->getBufferKind()) {
6984 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6985 sizes.malloc_bytes += bytes;
6986 break;
6987 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6988 sizes.mmap_bytes += bytes;
6989 break;
6990 }
6991 }
6992 }
6993}
6994
6995void ASTReader::InitializeSema(Sema &S) {
6996 SemaObj = &S;
6997 S.addExternalSource(this);
6998
6999 // Makes sure any declarations that were deserialized "too early"
7000 // still get added to the identifier's declaration chains.
Ben Langmuir5418f402014-09-10 21:29:41 +00007001 for (uint64_t ID : PreloadedDeclIDs) {
7002 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7003 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00007004 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007005 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007006
Richard Smith3d8e97e2013-10-18 06:54:39 +00007007 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007008 if (!FPPragmaOptions.empty()) {
7009 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
7010 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
7011 }
7012
Richard Smith3d8e97e2013-10-18 06:54:39 +00007013 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007014 if (!OpenCLExtensions.empty()) {
7015 unsigned I = 0;
7016#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
7017#include "clang/Basic/OpenCLExtensions.def"
7018
7019 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
7020 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00007021
7022 UpdateSema();
7023}
7024
7025void ASTReader::UpdateSema() {
7026 assert(SemaObj && "no Sema to update");
7027
7028 // Load the offsets of the declarations that Sema references.
7029 // They will be lazily deserialized when needed.
7030 if (!SemaDeclRefs.empty()) {
7031 assert(SemaDeclRefs.size() % 2 == 0);
7032 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
7033 if (!SemaObj->StdNamespace)
7034 SemaObj->StdNamespace = SemaDeclRefs[I];
7035 if (!SemaObj->StdBadAlloc)
7036 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7037 }
7038 SemaDeclRefs.clear();
7039 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00007040
7041 // Update the state of 'pragma clang optimize'. Use the same API as if we had
7042 // encountered the pragma in the source.
7043 if(OptimizeOffPragmaLocation.isValid())
7044 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00007045}
7046
7047IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
7048 // Note that we are loading an identifier.
7049 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00007050 StringRef Name(NameStart, NameEnd - NameStart);
7051
7052 // If there is a global index, look there first to determine which modules
7053 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00007054 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00007055 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00007056 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00007057 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7058 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00007059 }
7060 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00007061 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00007062 NumIdentifierLookups,
7063 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00007064 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00007065 IdentifierInfo *II = Visitor.getIdentifierInfo();
7066 markIdentifierUpToDate(II);
7067 return II;
7068}
7069
7070namespace clang {
7071 /// \brief An identifier-lookup iterator that enumerates all of the
7072 /// identifiers stored within a set of AST files.
7073 class ASTIdentifierIterator : public IdentifierIterator {
7074 /// \brief The AST reader whose identifiers are being enumerated.
7075 const ASTReader &Reader;
7076
7077 /// \brief The current index into the chain of AST files stored in
7078 /// the AST reader.
7079 unsigned Index;
7080
7081 /// \brief The current position within the identifier lookup table
7082 /// of the current AST file.
7083 ASTIdentifierLookupTable::key_iterator Current;
7084
7085 /// \brief The end position within the identifier lookup table of
7086 /// the current AST file.
7087 ASTIdentifierLookupTable::key_iterator End;
7088
7089 public:
7090 explicit ASTIdentifierIterator(const ASTReader &Reader);
7091
Craig Topper3e89dfe2014-03-13 02:13:41 +00007092 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00007093 };
7094}
7095
7096ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
7097 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
7098 ASTIdentifierLookupTable *IdTable
7099 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
7100 Current = IdTable->key_begin();
7101 End = IdTable->key_end();
7102}
7103
7104StringRef ASTIdentifierIterator::Next() {
7105 while (Current == End) {
7106 // If we have exhausted all of our AST files, we're done.
7107 if (Index == 0)
7108 return StringRef();
7109
7110 --Index;
7111 ASTIdentifierLookupTable *IdTable
7112 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7113 IdentifierLookupTable;
7114 Current = IdTable->key_begin();
7115 End = IdTable->key_end();
7116 }
7117
7118 // We have any identifiers remaining in the current AST file; return
7119 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007120 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00007121 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007122 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00007123}
7124
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007125IdentifierIterator *ASTReader::getIdentifiers() {
7126 if (!loadGlobalIndex())
7127 return GlobalIndex->createIdentifierIterator();
7128
Guy Benyei11169dd2012-12-18 14:30:41 +00007129 return new ASTIdentifierIterator(*this);
7130}
7131
7132namespace clang { namespace serialization {
7133 class ReadMethodPoolVisitor {
7134 ASTReader &Reader;
7135 Selector Sel;
7136 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007137 unsigned InstanceBits;
7138 unsigned FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007139 bool InstanceHasMoreThanOneDecl;
7140 bool FactoryHasMoreThanOneDecl;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00007141 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7142 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007143
7144 public:
Nico Weber2e0c8f72014-12-27 03:58:08 +00007145 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
Guy Benyei11169dd2012-12-18 14:30:41 +00007146 unsigned PriorGeneration)
Nico Weber2e0c8f72014-12-27 03:58:08 +00007147 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
Nico Weberff4b35e2014-12-27 22:14:15 +00007148 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false),
7149 FactoryHasMoreThanOneDecl(false) {}
Nico Weber2e0c8f72014-12-27 03:58:08 +00007150
Guy Benyei11169dd2012-12-18 14:30:41 +00007151 static bool visit(ModuleFile &M, void *UserData) {
7152 ReadMethodPoolVisitor *This
7153 = static_cast<ReadMethodPoolVisitor *>(UserData);
7154
7155 if (!M.SelectorLookupTable)
7156 return false;
7157
7158 // If we've already searched this module file, skip it now.
7159 if (M.Generation <= This->PriorGeneration)
7160 return true;
7161
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007162 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007163 ASTSelectorLookupTable *PoolTable
7164 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7165 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7166 if (Pos == PoolTable->end())
7167 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007168
7169 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007170 ++This->Reader.NumSelectorsRead;
7171 // FIXME: Not quite happy with the statistics here. We probably should
7172 // disable this tracking when called via LoadSelector.
7173 // Also, should entries without methods count as misses?
7174 ++This->Reader.NumMethodPoolEntriesRead;
7175 ASTSelectorLookupTrait::data_type Data = *Pos;
7176 if (This->Reader.DeserializationListener)
7177 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7178 This->Sel);
7179
7180 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7181 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007182 This->InstanceBits = Data.InstanceBits;
7183 This->FactoryBits = Data.FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007184 This->InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
7185 This->FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
Guy Benyei11169dd2012-12-18 14:30:41 +00007186 return true;
7187 }
7188
7189 /// \brief Retrieve the instance methods found by this visitor.
7190 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7191 return InstanceMethods;
7192 }
7193
7194 /// \brief Retrieve the instance methods found by this visitor.
7195 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7196 return FactoryMethods;
7197 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007198
7199 unsigned getInstanceBits() const { return InstanceBits; }
7200 unsigned getFactoryBits() const { return FactoryBits; }
Nico Weberff4b35e2014-12-27 22:14:15 +00007201 bool instanceHasMoreThanOneDecl() const {
7202 return InstanceHasMoreThanOneDecl;
7203 }
7204 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
Guy Benyei11169dd2012-12-18 14:30:41 +00007205 };
7206} } // end namespace clang::serialization
7207
7208/// \brief Add the given set of methods to the method list.
7209static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7210 ObjCMethodList &List) {
7211 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7212 S.addMethodToGlobalList(&List, Methods[I]);
7213 }
7214}
7215
7216void ASTReader::ReadMethodPool(Selector Sel) {
7217 // Get the selector generation and update it to the current generation.
7218 unsigned &Generation = SelectorGeneration[Sel];
7219 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00007220 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00007221
7222 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007223 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007224 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7225 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7226
7227 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007228 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00007229 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007230
7231 ++NumMethodPoolHits;
7232
Guy Benyei11169dd2012-12-18 14:30:41 +00007233 if (!getSema())
7234 return;
7235
7236 Sema &S = *getSema();
7237 Sema::GlobalMethodPool::iterator Pos
7238 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
Ben Langmuira0c32e92015-01-12 19:27:00 +00007239
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007240 Pos->second.first.setBits(Visitor.getInstanceBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007241 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007242 Pos->second.second.setBits(Visitor.getFactoryBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007243 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
Ben Langmuira0c32e92015-01-12 19:27:00 +00007244
7245 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
7246 // when building a module we keep every method individually and may need to
7247 // update hasMoreThanOneDecl as we add the methods.
7248 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7249 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Guy Benyei11169dd2012-12-18 14:30:41 +00007250}
7251
7252void ASTReader::ReadKnownNamespaces(
7253 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7254 Namespaces.clear();
7255
7256 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7257 if (NamespaceDecl *Namespace
7258 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7259 Namespaces.push_back(Namespace);
7260 }
7261}
7262
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007263void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007264 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007265 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7266 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007267 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007268 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007269 Undefined.insert(std::make_pair(D, Loc));
7270 }
7271}
Nick Lewycky8334af82013-01-26 00:35:08 +00007272
Guy Benyei11169dd2012-12-18 14:30:41 +00007273void ASTReader::ReadTentativeDefinitions(
7274 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7275 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7276 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7277 if (Var)
7278 TentativeDefs.push_back(Var);
7279 }
7280 TentativeDefinitions.clear();
7281}
7282
7283void ASTReader::ReadUnusedFileScopedDecls(
7284 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7285 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7286 DeclaratorDecl *D
7287 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7288 if (D)
7289 Decls.push_back(D);
7290 }
7291 UnusedFileScopedDecls.clear();
7292}
7293
7294void ASTReader::ReadDelegatingConstructors(
7295 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7296 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7297 CXXConstructorDecl *D
7298 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7299 if (D)
7300 Decls.push_back(D);
7301 }
7302 DelegatingCtorDecls.clear();
7303}
7304
7305void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7306 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7307 TypedefNameDecl *D
7308 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7309 if (D)
7310 Decls.push_back(D);
7311 }
7312 ExtVectorDecls.clear();
7313}
7314
Nico Weber72889432014-09-06 01:25:55 +00007315void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7316 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7317 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7318 ++I) {
7319 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7320 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7321 if (D)
7322 Decls.insert(D);
7323 }
7324 UnusedLocalTypedefNameCandidates.clear();
7325}
7326
Guy Benyei11169dd2012-12-18 14:30:41 +00007327void ASTReader::ReadReferencedSelectors(
7328 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7329 if (ReferencedSelectorsData.empty())
7330 return;
7331
7332 // If there are @selector references added them to its pool. This is for
7333 // implementation of -Wselector.
7334 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7335 unsigned I = 0;
7336 while (I < DataSize) {
7337 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7338 SourceLocation SelLoc
7339 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7340 Sels.push_back(std::make_pair(Sel, SelLoc));
7341 }
7342 ReferencedSelectorsData.clear();
7343}
7344
7345void ASTReader::ReadWeakUndeclaredIdentifiers(
7346 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7347 if (WeakUndeclaredIdentifiers.empty())
7348 return;
7349
7350 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7351 IdentifierInfo *WeakId
7352 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7353 IdentifierInfo *AliasId
7354 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7355 SourceLocation Loc
7356 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7357 bool Used = WeakUndeclaredIdentifiers[I++];
7358 WeakInfo WI(AliasId, Loc);
7359 WI.setUsed(Used);
7360 WeakIDs.push_back(std::make_pair(WeakId, WI));
7361 }
7362 WeakUndeclaredIdentifiers.clear();
7363}
7364
7365void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7366 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7367 ExternalVTableUse VT;
7368 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7369 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7370 VT.DefinitionRequired = VTableUses[Idx++];
7371 VTables.push_back(VT);
7372 }
7373
7374 VTableUses.clear();
7375}
7376
7377void ASTReader::ReadPendingInstantiations(
7378 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7379 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7380 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7381 SourceLocation Loc
7382 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7383
7384 Pending.push_back(std::make_pair(D, Loc));
7385 }
7386 PendingInstantiations.clear();
7387}
7388
Richard Smithe40f2ba2013-08-07 21:41:30 +00007389void ASTReader::ReadLateParsedTemplates(
7390 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7391 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7392 /* In loop */) {
7393 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7394
7395 LateParsedTemplate *LT = new LateParsedTemplate;
7396 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7397
7398 ModuleFile *F = getOwningModuleFile(LT->D);
7399 assert(F && "No module");
7400
7401 unsigned TokN = LateParsedTemplates[Idx++];
7402 LT->Toks.reserve(TokN);
7403 for (unsigned T = 0; T < TokN; ++T)
7404 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7405
7406 LPTMap[FD] = LT;
7407 }
7408
7409 LateParsedTemplates.clear();
7410}
7411
Guy Benyei11169dd2012-12-18 14:30:41 +00007412void ASTReader::LoadSelector(Selector Sel) {
7413 // It would be complicated to avoid reading the methods anyway. So don't.
7414 ReadMethodPool(Sel);
7415}
7416
7417void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7418 assert(ID && "Non-zero identifier ID required");
7419 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7420 IdentifiersLoaded[ID - 1] = II;
7421 if (DeserializationListener)
7422 DeserializationListener->IdentifierRead(ID, II);
7423}
7424
7425/// \brief Set the globally-visible declarations associated with the given
7426/// identifier.
7427///
7428/// If the AST reader is currently in a state where the given declaration IDs
7429/// cannot safely be resolved, they are queued until it is safe to resolve
7430/// them.
7431///
7432/// \param II an IdentifierInfo that refers to one or more globally-visible
7433/// declarations.
7434///
7435/// \param DeclIDs the set of declaration IDs with the name @p II that are
7436/// visible at global scope.
7437///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007438/// \param Decls if non-null, this vector will be populated with the set of
7439/// deserialized declarations. These declarations will not be pushed into
7440/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007441void
7442ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7443 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007444 SmallVectorImpl<Decl *> *Decls) {
7445 if (NumCurrentElementsDeserializing && !Decls) {
7446 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007447 return;
7448 }
7449
7450 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00007451 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007452 // Queue this declaration so that it will be added to the
7453 // translation unit scope and identifier's declaration chain
7454 // once a Sema object is known.
Ben Langmuir5418f402014-09-10 21:29:41 +00007455 PreloadedDeclIDs.push_back(DeclIDs[I]);
7456 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00007457 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007458
7459 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7460
7461 // If we're simply supposed to record the declarations, do so now.
7462 if (Decls) {
7463 Decls->push_back(D);
7464 continue;
7465 }
7466
7467 // Introduce this declaration into the translation-unit scope
7468 // and add it to the declaration chain for this identifier, so
7469 // that (unqualified) name lookup will find it.
7470 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007471 }
7472}
7473
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007474IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007475 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007476 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007477
7478 if (IdentifiersLoaded.empty()) {
7479 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007480 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007481 }
7482
7483 ID -= 1;
7484 if (!IdentifiersLoaded[ID]) {
7485 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7486 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7487 ModuleFile *M = I->second;
7488 unsigned Index = ID - M->BaseIdentifierID;
7489 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7490
7491 // All of the strings in the AST file are preceded by a 16-bit length.
7492 // Extract that 16-bit length to avoid having to execute strlen().
7493 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7494 // unsigned integers. This is important to avoid integer overflow when
7495 // we cast them to 'unsigned'.
7496 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7497 unsigned StrLen = (((unsigned) StrLenPtr[0])
7498 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007499 IdentifiersLoaded[ID]
7500 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007501 if (DeserializationListener)
7502 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7503 }
7504
7505 return IdentifiersLoaded[ID];
7506}
7507
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007508IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7509 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007510}
7511
7512IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7513 if (LocalID < NUM_PREDEF_IDENT_IDS)
7514 return LocalID;
7515
7516 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7517 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7518 assert(I != M.IdentifierRemap.end()
7519 && "Invalid index into identifier index remap");
7520
7521 return LocalID + I->second;
7522}
7523
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007524MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007525 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007526 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007527
7528 if (MacrosLoaded.empty()) {
7529 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007530 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007531 }
7532
7533 ID -= NUM_PREDEF_MACRO_IDS;
7534 if (!MacrosLoaded[ID]) {
7535 GlobalMacroMapType::iterator I
7536 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7537 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7538 ModuleFile *M = I->second;
7539 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007540 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7541
7542 if (DeserializationListener)
7543 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7544 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007545 }
7546
7547 return MacrosLoaded[ID];
7548}
7549
7550MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7551 if (LocalID < NUM_PREDEF_MACRO_IDS)
7552 return LocalID;
7553
7554 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7555 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7556 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7557
7558 return LocalID + I->second;
7559}
7560
7561serialization::SubmoduleID
7562ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7563 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7564 return LocalID;
7565
7566 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7567 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7568 assert(I != M.SubmoduleRemap.end()
7569 && "Invalid index into submodule index remap");
7570
7571 return LocalID + I->second;
7572}
7573
7574Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7575 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7576 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007577 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007578 }
7579
7580 if (GlobalID > SubmodulesLoaded.size()) {
7581 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007582 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007583 }
7584
7585 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7586}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007587
7588Module *ASTReader::getModule(unsigned ID) {
7589 return getSubmodule(ID);
7590}
7591
Guy Benyei11169dd2012-12-18 14:30:41 +00007592Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7593 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7594}
7595
7596Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7597 if (ID == 0)
7598 return Selector();
7599
7600 if (ID > SelectorsLoaded.size()) {
7601 Error("selector ID out of range in AST file");
7602 return Selector();
7603 }
7604
Craig Toppera13603a2014-05-22 05:54:18 +00007605 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007606 // Load this selector from the selector table.
7607 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7608 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7609 ModuleFile &M = *I->second;
7610 ASTSelectorLookupTrait Trait(*this, M);
7611 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7612 SelectorsLoaded[ID - 1] =
7613 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7614 if (DeserializationListener)
7615 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7616 }
7617
7618 return SelectorsLoaded[ID - 1];
7619}
7620
7621Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7622 return DecodeSelector(ID);
7623}
7624
7625uint32_t ASTReader::GetNumExternalSelectors() {
7626 // ID 0 (the null selector) is considered an external selector.
7627 return getTotalNumSelectors() + 1;
7628}
7629
7630serialization::SelectorID
7631ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7632 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7633 return LocalID;
7634
7635 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7636 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7637 assert(I != M.SelectorRemap.end()
7638 && "Invalid index into selector index remap");
7639
7640 return LocalID + I->second;
7641}
7642
7643DeclarationName
7644ASTReader::ReadDeclarationName(ModuleFile &F,
7645 const RecordData &Record, unsigned &Idx) {
7646 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7647 switch (Kind) {
7648 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007649 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007650
7651 case DeclarationName::ObjCZeroArgSelector:
7652 case DeclarationName::ObjCOneArgSelector:
7653 case DeclarationName::ObjCMultiArgSelector:
7654 return DeclarationName(ReadSelector(F, Record, Idx));
7655
7656 case DeclarationName::CXXConstructorName:
7657 return Context.DeclarationNames.getCXXConstructorName(
7658 Context.getCanonicalType(readType(F, Record, Idx)));
7659
7660 case DeclarationName::CXXDestructorName:
7661 return Context.DeclarationNames.getCXXDestructorName(
7662 Context.getCanonicalType(readType(F, Record, Idx)));
7663
7664 case DeclarationName::CXXConversionFunctionName:
7665 return Context.DeclarationNames.getCXXConversionFunctionName(
7666 Context.getCanonicalType(readType(F, Record, Idx)));
7667
7668 case DeclarationName::CXXOperatorName:
7669 return Context.DeclarationNames.getCXXOperatorName(
7670 (OverloadedOperatorKind)Record[Idx++]);
7671
7672 case DeclarationName::CXXLiteralOperatorName:
7673 return Context.DeclarationNames.getCXXLiteralOperatorName(
7674 GetIdentifierInfo(F, Record, Idx));
7675
7676 case DeclarationName::CXXUsingDirective:
7677 return DeclarationName::getUsingDirectiveName();
7678 }
7679
7680 llvm_unreachable("Invalid NameKind!");
7681}
7682
7683void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7684 DeclarationNameLoc &DNLoc,
7685 DeclarationName Name,
7686 const RecordData &Record, unsigned &Idx) {
7687 switch (Name.getNameKind()) {
7688 case DeclarationName::CXXConstructorName:
7689 case DeclarationName::CXXDestructorName:
7690 case DeclarationName::CXXConversionFunctionName:
7691 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7692 break;
7693
7694 case DeclarationName::CXXOperatorName:
7695 DNLoc.CXXOperatorName.BeginOpNameLoc
7696 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7697 DNLoc.CXXOperatorName.EndOpNameLoc
7698 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7699 break;
7700
7701 case DeclarationName::CXXLiteralOperatorName:
7702 DNLoc.CXXLiteralOperatorName.OpNameLoc
7703 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7704 break;
7705
7706 case DeclarationName::Identifier:
7707 case DeclarationName::ObjCZeroArgSelector:
7708 case DeclarationName::ObjCOneArgSelector:
7709 case DeclarationName::ObjCMultiArgSelector:
7710 case DeclarationName::CXXUsingDirective:
7711 break;
7712 }
7713}
7714
7715void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7716 DeclarationNameInfo &NameInfo,
7717 const RecordData &Record, unsigned &Idx) {
7718 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7719 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7720 DeclarationNameLoc DNLoc;
7721 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7722 NameInfo.setInfo(DNLoc);
7723}
7724
7725void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7726 const RecordData &Record, unsigned &Idx) {
7727 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7728 unsigned NumTPLists = Record[Idx++];
7729 Info.NumTemplParamLists = NumTPLists;
7730 if (NumTPLists) {
7731 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7732 for (unsigned i=0; i != NumTPLists; ++i)
7733 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7734 }
7735}
7736
7737TemplateName
7738ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7739 unsigned &Idx) {
7740 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7741 switch (Kind) {
7742 case TemplateName::Template:
7743 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7744
7745 case TemplateName::OverloadedTemplate: {
7746 unsigned size = Record[Idx++];
7747 UnresolvedSet<8> Decls;
7748 while (size--)
7749 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7750
7751 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7752 }
7753
7754 case TemplateName::QualifiedTemplate: {
7755 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7756 bool hasTemplKeyword = Record[Idx++];
7757 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7758 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7759 }
7760
7761 case TemplateName::DependentTemplate: {
7762 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7763 if (Record[Idx++]) // isIdentifier
7764 return Context.getDependentTemplateName(NNS,
7765 GetIdentifierInfo(F, Record,
7766 Idx));
7767 return Context.getDependentTemplateName(NNS,
7768 (OverloadedOperatorKind)Record[Idx++]);
7769 }
7770
7771 case TemplateName::SubstTemplateTemplateParm: {
7772 TemplateTemplateParmDecl *param
7773 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7774 if (!param) return TemplateName();
7775 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7776 return Context.getSubstTemplateTemplateParm(param, replacement);
7777 }
7778
7779 case TemplateName::SubstTemplateTemplateParmPack: {
7780 TemplateTemplateParmDecl *Param
7781 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7782 if (!Param)
7783 return TemplateName();
7784
7785 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7786 if (ArgPack.getKind() != TemplateArgument::Pack)
7787 return TemplateName();
7788
7789 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7790 }
7791 }
7792
7793 llvm_unreachable("Unhandled template name kind!");
7794}
7795
7796TemplateArgument
7797ASTReader::ReadTemplateArgument(ModuleFile &F,
7798 const RecordData &Record, unsigned &Idx) {
7799 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7800 switch (Kind) {
7801 case TemplateArgument::Null:
7802 return TemplateArgument();
7803 case TemplateArgument::Type:
7804 return TemplateArgument(readType(F, Record, Idx));
7805 case TemplateArgument::Declaration: {
7806 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
David Blaikie0f62c8d2014-10-16 04:21:25 +00007807 return TemplateArgument(D, readType(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007808 }
7809 case TemplateArgument::NullPtr:
7810 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7811 case TemplateArgument::Integral: {
7812 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7813 QualType T = readType(F, Record, Idx);
7814 return TemplateArgument(Context, Value, T);
7815 }
7816 case TemplateArgument::Template:
7817 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7818 case TemplateArgument::TemplateExpansion: {
7819 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007820 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007821 if (unsigned NumExpansions = Record[Idx++])
7822 NumTemplateExpansions = NumExpansions - 1;
7823 return TemplateArgument(Name, NumTemplateExpansions);
7824 }
7825 case TemplateArgument::Expression:
7826 return TemplateArgument(ReadExpr(F));
7827 case TemplateArgument::Pack: {
7828 unsigned NumArgs = Record[Idx++];
7829 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7830 for (unsigned I = 0; I != NumArgs; ++I)
7831 Args[I] = ReadTemplateArgument(F, Record, Idx);
7832 return TemplateArgument(Args, NumArgs);
7833 }
7834 }
7835
7836 llvm_unreachable("Unhandled template argument kind!");
7837}
7838
7839TemplateParameterList *
7840ASTReader::ReadTemplateParameterList(ModuleFile &F,
7841 const RecordData &Record, unsigned &Idx) {
7842 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7843 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7844 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7845
7846 unsigned NumParams = Record[Idx++];
7847 SmallVector<NamedDecl *, 16> Params;
7848 Params.reserve(NumParams);
7849 while (NumParams--)
7850 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7851
7852 TemplateParameterList* TemplateParams =
7853 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7854 Params.data(), Params.size(), RAngleLoc);
7855 return TemplateParams;
7856}
7857
7858void
7859ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007860ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007861 ModuleFile &F, const RecordData &Record,
7862 unsigned &Idx) {
7863 unsigned NumTemplateArgs = Record[Idx++];
7864 TemplArgs.reserve(NumTemplateArgs);
7865 while (NumTemplateArgs--)
7866 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7867}
7868
7869/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007870void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007871 const RecordData &Record, unsigned &Idx) {
7872 unsigned NumDecls = Record[Idx++];
7873 Set.reserve(Context, NumDecls);
7874 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007875 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007876 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007877 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007878 }
7879}
7880
7881CXXBaseSpecifier
7882ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7883 const RecordData &Record, unsigned &Idx) {
7884 bool isVirtual = static_cast<bool>(Record[Idx++]);
7885 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7886 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7887 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7888 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7889 SourceRange Range = ReadSourceRange(F, Record, Idx);
7890 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7891 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7892 EllipsisLoc);
7893 Result.setInheritConstructors(inheritConstructors);
7894 return Result;
7895}
7896
7897std::pair<CXXCtorInitializer **, unsigned>
7898ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7899 unsigned &Idx) {
Craig Toppera13603a2014-05-22 05:54:18 +00007900 CXXCtorInitializer **CtorInitializers = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007901 unsigned NumInitializers = Record[Idx++];
7902 if (NumInitializers) {
7903 CtorInitializers
7904 = new (Context) CXXCtorInitializer*[NumInitializers];
7905 for (unsigned i=0; i != NumInitializers; ++i) {
Craig Toppera13603a2014-05-22 05:54:18 +00007906 TypeSourceInfo *TInfo = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007907 bool IsBaseVirtual = false;
Craig Toppera13603a2014-05-22 05:54:18 +00007908 FieldDecl *Member = nullptr;
7909 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007910
7911 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7912 switch (Type) {
7913 case CTOR_INITIALIZER_BASE:
7914 TInfo = GetTypeSourceInfo(F, Record, Idx);
7915 IsBaseVirtual = Record[Idx++];
7916 break;
7917
7918 case CTOR_INITIALIZER_DELEGATING:
7919 TInfo = GetTypeSourceInfo(F, Record, Idx);
7920 break;
7921
7922 case CTOR_INITIALIZER_MEMBER:
7923 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7924 break;
7925
7926 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7927 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7928 break;
7929 }
7930
7931 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7932 Expr *Init = ReadExpr(F);
7933 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7934 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7935 bool IsWritten = Record[Idx++];
7936 unsigned SourceOrderOrNumArrayIndices;
7937 SmallVector<VarDecl *, 8> Indices;
7938 if (IsWritten) {
7939 SourceOrderOrNumArrayIndices = Record[Idx++];
7940 } else {
7941 SourceOrderOrNumArrayIndices = Record[Idx++];
7942 Indices.reserve(SourceOrderOrNumArrayIndices);
7943 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7944 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7945 }
7946
7947 CXXCtorInitializer *BOMInit;
7948 if (Type == CTOR_INITIALIZER_BASE) {
7949 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7950 LParenLoc, Init, RParenLoc,
7951 MemberOrEllipsisLoc);
7952 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7953 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7954 Init, RParenLoc);
7955 } else if (IsWritten) {
7956 if (Member)
7957 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7958 LParenLoc, Init, RParenLoc);
7959 else
7960 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7961 MemberOrEllipsisLoc, LParenLoc,
7962 Init, RParenLoc);
7963 } else {
Argyrios Kyrtzidis794671d2013-05-30 23:59:46 +00007964 if (IndirectMember) {
7965 assert(Indices.empty() && "Indirect field improperly initialized");
7966 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7967 MemberOrEllipsisLoc, LParenLoc,
7968 Init, RParenLoc);
7969 } else {
7970 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7971 LParenLoc, Init, RParenLoc,
7972 Indices.data(), Indices.size());
7973 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007974 }
7975
7976 if (IsWritten)
7977 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7978 CtorInitializers[i] = BOMInit;
7979 }
7980 }
7981
7982 return std::make_pair(CtorInitializers, NumInitializers);
7983}
7984
7985NestedNameSpecifier *
7986ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7987 const RecordData &Record, unsigned &Idx) {
7988 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00007989 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007990 for (unsigned I = 0; I != N; ++I) {
7991 NestedNameSpecifier::SpecifierKind Kind
7992 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7993 switch (Kind) {
7994 case NestedNameSpecifier::Identifier: {
7995 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7996 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7997 break;
7998 }
7999
8000 case NestedNameSpecifier::Namespace: {
8001 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8002 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8003 break;
8004 }
8005
8006 case NestedNameSpecifier::NamespaceAlias: {
8007 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8008 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8009 break;
8010 }
8011
8012 case NestedNameSpecifier::TypeSpec:
8013 case NestedNameSpecifier::TypeSpecWithTemplate: {
8014 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
8015 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00008016 return nullptr;
8017
Guy Benyei11169dd2012-12-18 14:30:41 +00008018 bool Template = Record[Idx++];
8019 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8020 break;
8021 }
8022
8023 case NestedNameSpecifier::Global: {
8024 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8025 // No associated value, and there can't be a prefix.
8026 break;
8027 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008028
8029 case NestedNameSpecifier::Super: {
8030 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8031 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8032 break;
8033 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008034 }
8035 Prev = NNS;
8036 }
8037 return NNS;
8038}
8039
8040NestedNameSpecifierLoc
8041ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8042 unsigned &Idx) {
8043 unsigned N = Record[Idx++];
8044 NestedNameSpecifierLocBuilder Builder;
8045 for (unsigned I = 0; I != N; ++I) {
8046 NestedNameSpecifier::SpecifierKind Kind
8047 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8048 switch (Kind) {
8049 case NestedNameSpecifier::Identifier: {
8050 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8051 SourceRange Range = ReadSourceRange(F, Record, Idx);
8052 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8053 break;
8054 }
8055
8056 case NestedNameSpecifier::Namespace: {
8057 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8058 SourceRange Range = ReadSourceRange(F, Record, Idx);
8059 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8060 break;
8061 }
8062
8063 case NestedNameSpecifier::NamespaceAlias: {
8064 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8065 SourceRange Range = ReadSourceRange(F, Record, Idx);
8066 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8067 break;
8068 }
8069
8070 case NestedNameSpecifier::TypeSpec:
8071 case NestedNameSpecifier::TypeSpecWithTemplate: {
8072 bool Template = Record[Idx++];
8073 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
8074 if (!T)
8075 return NestedNameSpecifierLoc();
8076 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8077
8078 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8079 Builder.Extend(Context,
8080 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8081 T->getTypeLoc(), ColonColonLoc);
8082 break;
8083 }
8084
8085 case NestedNameSpecifier::Global: {
8086 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8087 Builder.MakeGlobal(Context, ColonColonLoc);
8088 break;
8089 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008090
8091 case NestedNameSpecifier::Super: {
8092 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8093 SourceRange Range = ReadSourceRange(F, Record, Idx);
8094 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8095 break;
8096 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008097 }
8098 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008099
Guy Benyei11169dd2012-12-18 14:30:41 +00008100 return Builder.getWithLocInContext(Context);
8101}
8102
8103SourceRange
8104ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8105 unsigned &Idx) {
8106 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8107 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8108 return SourceRange(beg, end);
8109}
8110
8111/// \brief Read an integral value
8112llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8113 unsigned BitWidth = Record[Idx++];
8114 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8115 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8116 Idx += NumWords;
8117 return Result;
8118}
8119
8120/// \brief Read a signed integral value
8121llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8122 bool isUnsigned = Record[Idx++];
8123 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8124}
8125
8126/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00008127llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8128 const llvm::fltSemantics &Sem,
8129 unsigned &Idx) {
8130 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00008131}
8132
8133// \brief Read a string
8134std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8135 unsigned Len = Record[Idx++];
8136 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8137 Idx += Len;
8138 return Result;
8139}
8140
Richard Smith7ed1bc92014-12-05 22:42:13 +00008141std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8142 unsigned &Idx) {
8143 std::string Filename = ReadString(Record, Idx);
8144 ResolveImportedPath(F, Filename);
8145 return Filename;
8146}
8147
Guy Benyei11169dd2012-12-18 14:30:41 +00008148VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8149 unsigned &Idx) {
8150 unsigned Major = Record[Idx++];
8151 unsigned Minor = Record[Idx++];
8152 unsigned Subminor = Record[Idx++];
8153 if (Minor == 0)
8154 return VersionTuple(Major);
8155 if (Subminor == 0)
8156 return VersionTuple(Major, Minor - 1);
8157 return VersionTuple(Major, Minor - 1, Subminor - 1);
8158}
8159
8160CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8161 const RecordData &Record,
8162 unsigned &Idx) {
8163 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8164 return CXXTemporary::Create(Context, Decl);
8165}
8166
8167DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008168 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008169}
8170
8171DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8172 return Diags.Report(Loc, DiagID);
8173}
8174
8175/// \brief Retrieve the identifier table associated with the
8176/// preprocessor.
8177IdentifierTable &ASTReader::getIdentifierTable() {
8178 return PP.getIdentifierTable();
8179}
8180
8181/// \brief Record that the given ID maps to the given switch-case
8182/// statement.
8183void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008184 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008185 "Already have a SwitchCase with this ID");
8186 (*CurrSwitchCaseStmts)[ID] = SC;
8187}
8188
8189/// \brief Retrieve the switch-case statement with the given ID.
8190SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008191 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008192 return (*CurrSwitchCaseStmts)[ID];
8193}
8194
8195void ASTReader::ClearSwitchCaseIDs() {
8196 CurrSwitchCaseStmts->clear();
8197}
8198
8199void ASTReader::ReadComments() {
8200 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008201 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00008202 serialization::ModuleFile *> >::iterator
8203 I = CommentsCursors.begin(),
8204 E = CommentsCursors.end();
8205 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008206 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008207 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00008208 serialization::ModuleFile &F = *I->second;
8209 SavedStreamPosition SavedPosition(Cursor);
8210
8211 RecordData Record;
8212 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008213 llvm::BitstreamEntry Entry =
8214 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008215
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008216 switch (Entry.Kind) {
8217 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8218 case llvm::BitstreamEntry::Error:
8219 Error("malformed block record in AST file");
8220 return;
8221 case llvm::BitstreamEntry::EndBlock:
8222 goto NextCursor;
8223 case llvm::BitstreamEntry::Record:
8224 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00008225 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008226 }
8227
8228 // Read a record.
8229 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00008230 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008231 case COMMENTS_RAW_COMMENT: {
8232 unsigned Idx = 0;
8233 SourceRange SR = ReadSourceRange(F, Record, Idx);
8234 RawComment::CommentKind Kind =
8235 (RawComment::CommentKind) Record[Idx++];
8236 bool IsTrailingComment = Record[Idx++];
8237 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00008238 Comments.push_back(new (Context) RawComment(
8239 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8240 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00008241 break;
8242 }
8243 }
8244 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008245 NextCursor:
8246 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00008247 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008248}
8249
Argyrios Kyrtzidis1bde1172014-11-18 05:24:18 +00008250void ASTReader::getInputFiles(ModuleFile &F,
8251 SmallVectorImpl<serialization::InputFile> &Files) {
8252 for (unsigned I = 0, E = F.InputFilesLoaded.size(); I != E; ++I) {
8253 unsigned ID = I+1;
8254 Files.push_back(getInputFile(F, ID));
8255 }
8256}
8257
Richard Smithcd45dbc2014-04-19 03:48:30 +00008258std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8259 // If we know the owning module, use it.
8260 if (Module *M = D->getOwningModule())
8261 return M->getFullModuleName();
8262
8263 // Otherwise, use the name of the top-level module the decl is within.
8264 if (ModuleFile *M = getOwningModuleFile(D))
8265 return M->ModuleName;
8266
8267 // Not from a module.
8268 return "";
8269}
8270
Guy Benyei11169dd2012-12-18 14:30:41 +00008271void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008272 while (!PendingIdentifierInfos.empty() ||
8273 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008274 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008275 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008276 // If any identifiers with corresponding top-level declarations have
8277 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008278 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8279 TopLevelDeclsMap;
8280 TopLevelDeclsMap TopLevelDecls;
8281
Guy Benyei11169dd2012-12-18 14:30:41 +00008282 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008283 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008284 SmallVector<uint32_t, 4> DeclIDs =
8285 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008286 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008287
8288 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008289 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008290
Richard Smith851072e2014-05-19 20:59:20 +00008291 // For each decl chain that we wanted to complete while deserializing, mark
8292 // it as "still needs to be completed".
8293 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8294 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8295 }
8296 PendingIncompleteDeclChains.clear();
8297
Guy Benyei11169dd2012-12-18 14:30:41 +00008298 // Load pending declaration chains.
Richard Smithfe620d22015-03-05 23:24:12 +00008299 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008300 loadPendingDeclChain(PendingDeclChains[I]);
Richard Smithfe620d22015-03-05 23:24:12 +00008301 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8302 }
8303 assert(PendingDeclChainsKnown.empty());
Guy Benyei11169dd2012-12-18 14:30:41 +00008304 PendingDeclChains.clear();
8305
Douglas Gregor6168bd22013-02-18 15:53:43 +00008306 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008307 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8308 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008309 IdentifierInfo *II = TLD->first;
8310 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008311 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008312 }
8313 }
8314
Guy Benyei11169dd2012-12-18 14:30:41 +00008315 // Load any pending macro definitions.
8316 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008317 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8318 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8319 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8320 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008321 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008322 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008323 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008324 if (Info.M->Kind != MK_ImplicitModule &&
8325 Info.M->Kind != MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008326 resolvePendingMacro(II, Info);
8327 }
8328 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008329 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008330 ++IDIdx) {
8331 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008332 if (Info.M->Kind == MK_ImplicitModule ||
8333 Info.M->Kind == MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008334 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008335 }
8336 }
8337 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008338
8339 // Wire up the DeclContexts for Decls that we delayed setting until
8340 // recursive loading is completed.
8341 while (!PendingDeclContextInfos.empty()) {
8342 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8343 PendingDeclContextInfos.pop_front();
8344 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8345 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8346 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8347 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008348
Richard Smithd1c46742014-04-30 02:24:17 +00008349 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008350 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008351 auto Update = PendingUpdateRecords.pop_back_val();
8352 ReadingKindTracker ReadingKind(Read_Decl, *this);
8353 loadDeclUpdateRecords(Update.first, Update.second);
8354 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008355 }
Richard Smith8a639892015-01-24 01:07:20 +00008356
8357 // At this point, all update records for loaded decls are in place, so any
8358 // fake class definitions should have become real.
8359 assert(PendingFakeDefinitionData.empty() &&
8360 "faked up a class definition but never saw the real one");
8361
Guy Benyei11169dd2012-12-18 14:30:41 +00008362 // If we deserialized any C++ or Objective-C class definitions, any
8363 // Objective-C protocol definitions, or any redeclarable templates, make sure
8364 // that all redeclarations point to the definitions. Note that this can only
8365 // happen now, after the redeclaration chains have been fully wired.
Craig Topperc6914d02014-08-25 04:15:02 +00008366 for (Decl *D : PendingDefinitions) {
8367 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008368 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008369 // Make sure that the TagType points at the definition.
8370 const_cast<TagType*>(TagT)->decl = TD;
8371 }
Richard Smith8ce51082015-03-11 01:44:51 +00008372
Craig Topperc6914d02014-08-25 04:15:02 +00008373 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00008374 for (auto *R = getMostRecentExistingDecl(RD); R;
8375 R = R->getPreviousDecl()) {
8376 assert((R == D) ==
8377 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
Richard Smith2c381642014-08-27 23:11:59 +00008378 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00008379 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00008380 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008381 }
8382
8383 continue;
8384 }
Richard Smith8ce51082015-03-11 01:44:51 +00008385
Craig Topperc6914d02014-08-25 04:15:02 +00008386 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008387 // Make sure that the ObjCInterfaceType points at the definition.
8388 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8389 ->Decl = ID;
Richard Smith8ce51082015-03-11 01:44:51 +00008390
8391 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
8392 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
8393
Guy Benyei11169dd2012-12-18 14:30:41 +00008394 continue;
8395 }
Richard Smith8ce51082015-03-11 01:44:51 +00008396
Craig Topperc6914d02014-08-25 04:15:02 +00008397 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Richard Smith8ce51082015-03-11 01:44:51 +00008398 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
8399 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
8400
Guy Benyei11169dd2012-12-18 14:30:41 +00008401 continue;
8402 }
Richard Smith8ce51082015-03-11 01:44:51 +00008403
Craig Topperc6914d02014-08-25 04:15:02 +00008404 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Richard Smith8ce51082015-03-11 01:44:51 +00008405 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
8406 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
Guy Benyei11169dd2012-12-18 14:30:41 +00008407 }
8408 PendingDefinitions.clear();
8409
8410 // Load the bodies of any functions or methods we've encountered. We do
8411 // this now (delayed) so that we can be sure that the declaration chains
8412 // have been fully wired up.
Richard Smith8ce51082015-03-11 01:44:51 +00008413 // FIXME: There seems to be no point in delaying this, it does not depend
8414 // on the redecl chains having been wired up.
Guy Benyei11169dd2012-12-18 14:30:41 +00008415 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8416 PBEnd = PendingBodies.end();
8417 PB != PBEnd; ++PB) {
8418 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8419 // FIXME: Check for =delete/=default?
8420 // FIXME: Complain about ODR violations here?
8421 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8422 FD->setLazyBody(PB->second);
8423 continue;
8424 }
8425
8426 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8427 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8428 MD->setLazyBody(PB->second);
8429 }
8430 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008431}
8432
8433void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008434 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8435 return;
8436
Richard Smitha0ce9c42014-07-29 23:23:27 +00008437 // Trigger the import of the full definition of each class that had any
8438 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008439 // These updates may in turn find and diagnose some ODR failures, so take
8440 // ownership of the set first.
8441 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8442 PendingOdrMergeFailures.clear();
8443 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008444 Merge.first->buildLookup();
8445 Merge.first->decls_begin();
8446 Merge.first->bases_begin();
8447 Merge.first->vbases_begin();
8448 for (auto *RD : Merge.second) {
8449 RD->decls_begin();
8450 RD->bases_begin();
8451 RD->vbases_begin();
8452 }
8453 }
8454
8455 // For each declaration from a merged context, check that the canonical
8456 // definition of that context also contains a declaration of the same
8457 // entity.
8458 //
8459 // Caution: this loop does things that might invalidate iterators into
8460 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8461 while (!PendingOdrMergeChecks.empty()) {
8462 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8463
8464 // FIXME: Skip over implicit declarations for now. This matters for things
8465 // like implicitly-declared special member functions. This isn't entirely
8466 // correct; we can end up with multiple unmerged declarations of the same
8467 // implicit entity.
8468 if (D->isImplicit())
8469 continue;
8470
8471 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008472
8473 bool Found = false;
8474 const Decl *DCanon = D->getCanonicalDecl();
8475
Richard Smith01bdb7a2014-08-28 05:44:07 +00008476 for (auto RI : D->redecls()) {
8477 if (RI->getLexicalDeclContext() == CanonDef) {
8478 Found = true;
8479 break;
8480 }
8481 }
8482 if (Found)
8483 continue;
8484
Richard Smitha0ce9c42014-07-29 23:23:27 +00008485 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith01bdb7a2014-08-28 05:44:07 +00008486 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
Richard Smitha0ce9c42014-07-29 23:23:27 +00008487 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8488 !Found && I != E; ++I) {
8489 for (auto RI : (*I)->redecls()) {
8490 if (RI->getLexicalDeclContext() == CanonDef) {
8491 // This declaration is present in the canonical definition. If it's
8492 // in the same redecl chain, it's the one we're looking for.
8493 if (RI->getCanonicalDecl() == DCanon)
8494 Found = true;
8495 else
8496 Candidates.push_back(cast<NamedDecl>(RI));
8497 break;
8498 }
8499 }
8500 }
8501
8502 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00008503 // The AST doesn't like TagDecls becoming invalid after they've been
8504 // completed. We only really need to mark FieldDecls as invalid here.
8505 if (!isa<TagDecl>(D))
8506 D->setInvalidDecl();
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008507
8508 // Ensure we don't accidentally recursively enter deserialization while
8509 // we're producing our diagnostic.
8510 Deserializing RecursionGuard(this);
Richard Smitha0ce9c42014-07-29 23:23:27 +00008511
8512 std::string CanonDefModule =
8513 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8514 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8515 << D << getOwningModuleNameForDiagnostic(D)
8516 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8517
8518 if (Candidates.empty())
8519 Diag(cast<Decl>(CanonDef)->getLocation(),
8520 diag::note_module_odr_violation_no_possible_decls) << D;
8521 else {
8522 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8523 Diag(Candidates[I]->getLocation(),
8524 diag::note_module_odr_violation_possible_decl)
8525 << Candidates[I];
8526 }
8527
8528 DiagnosedOdrMergeFailures.insert(CanonDef);
8529 }
8530 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008531
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008532 if (OdrMergeFailures.empty())
8533 return;
8534
8535 // Ensure we don't accidentally recursively enter deserialization while
8536 // we're producing our diagnostics.
8537 Deserializing RecursionGuard(this);
8538
Richard Smithcd45dbc2014-04-19 03:48:30 +00008539 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008540 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008541 // If we've already pointed out a specific problem with this class, don't
8542 // bother issuing a general "something's different" diagnostic.
David Blaikie82e95a32014-11-19 07:49:47 +00008543 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
Richard Smithcd45dbc2014-04-19 03:48:30 +00008544 continue;
8545
8546 bool Diagnosed = false;
8547 for (auto *RD : Merge.second) {
8548 // Multiple different declarations got merged together; tell the user
8549 // where they came from.
8550 if (Merge.first != RD) {
8551 // FIXME: Walk the definition, figure out what's different,
8552 // and diagnose that.
8553 if (!Diagnosed) {
8554 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8555 Diag(Merge.first->getLocation(),
8556 diag::err_module_odr_violation_different_definitions)
8557 << Merge.first << Module.empty() << Module;
8558 Diagnosed = true;
8559 }
8560
8561 Diag(RD->getLocation(),
8562 diag::note_module_odr_violation_different_definitions)
8563 << getOwningModuleNameForDiagnostic(RD);
8564 }
8565 }
8566
8567 if (!Diagnosed) {
8568 // All definitions are updates to the same declaration. This happens if a
8569 // module instantiates the declaration of a class template specialization
8570 // and two or more other modules instantiate its definition.
8571 //
8572 // FIXME: Indicate which modules had instantiations of this definition.
8573 // FIXME: How can this even happen?
8574 Diag(Merge.first->getLocation(),
8575 diag::err_module_odr_violation_different_instantiations)
8576 << Merge.first;
8577 }
8578 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008579}
8580
8581void ASTReader::FinishedDeserializing() {
8582 assert(NumCurrentElementsDeserializing &&
8583 "FinishedDeserializing not paired with StartedDeserializing");
8584 if (NumCurrentElementsDeserializing == 1) {
8585 // We decrease NumCurrentElementsDeserializing only after pending actions
8586 // are finished, to avoid recursively re-calling finishPendingActions().
8587 finishPendingActions();
8588 }
8589 --NumCurrentElementsDeserializing;
8590
Richard Smitha0ce9c42014-07-29 23:23:27 +00008591 if (NumCurrentElementsDeserializing == 0) {
8592 diagnoseOdrViolations();
8593
Richard Smith04d05b52014-03-23 00:27:18 +00008594 // We are not in recursive loading, so it's safe to pass the "interesting"
8595 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008596 if (Consumer)
8597 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008598 }
8599}
8600
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008601void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Rafael Espindola7b56f6c2013-10-19 16:55:03 +00008602 D = D->getMostRecentDecl();
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008603
8604 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8605 SemaObj->TUScope->AddDecl(D);
8606 } else if (SemaObj->TUScope) {
8607 // Adding the decl to IdResolver may have failed because it was already in
8608 // (even though it was not added in scope). If it is already in, make sure
8609 // it gets in the scope as well.
8610 if (std::find(SemaObj->IdResolver.begin(Name),
8611 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8612 SemaObj->TUScope->AddDecl(D);
8613 }
8614}
8615
Nico Weber824285e2014-05-08 04:26:47 +00008616ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8617 bool DisableValidation, bool AllowASTWithCompilerErrors,
8618 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008619 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008620 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008621 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008622 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8623 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8624 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8625 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008626 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8627 AllowConfigurationMismatch(AllowConfigurationMismatch),
8628 ValidateSystemInputs(ValidateSystemInputs),
8629 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008630 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008631 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8632 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8633 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8634 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8635 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8636 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8637 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8638 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8639 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8640 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8641 ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008642 SourceMgr.setExternalSLocEntrySource(this);
8643}
8644
8645ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008646 if (OwnsDeserializationListener)
8647 delete DeserializationListener;
8648
Guy Benyei11169dd2012-12-18 14:30:41 +00008649 for (DeclContextVisibleUpdatesPending::iterator
8650 I = PendingVisibleUpdates.begin(),
8651 E = PendingVisibleUpdates.end();
8652 I != E; ++I) {
8653 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8654 F = I->second.end();
8655 J != F; ++J)
8656 delete J->first;
8657 }
8658}