blob: 7774b7b1c6e74024d9928bd9ecb272bfcb02e0f6 [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
Richard Smith78165b52013-01-10 23:43:47 +00002895 case LOCALLY_SCOPED_EXTERN_C_DECLS:
Guy Benyei11169dd2012-12-18 14:30:41 +00002896 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Richard Smith78165b52013-01-10 23:43:47 +00002897 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00002898 break;
2899
2900 case SELECTOR_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002901 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002902 F.LocalNumSelectors = Record[0];
2903 unsigned LocalBaseSelectorID = Record[1];
2904 F.BaseSelectorID = getTotalNumSelectors();
2905
2906 if (F.LocalNumSelectors > 0) {
2907 // Introduce the global -> local mapping for selectors within this
2908 // module.
2909 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2910
2911 // Introduce the local -> global mapping for selectors within this
2912 // module.
2913 F.SelectorRemap.insertOrReplace(
2914 std::make_pair(LocalBaseSelectorID,
2915 F.BaseSelectorID - LocalBaseSelectorID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00002916
2917 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
Guy Benyei11169dd2012-12-18 14:30:41 +00002918 }
2919 break;
2920 }
2921
2922 case METHOD_POOL:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002923 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002924 if (Record[0])
2925 F.SelectorLookupTable
2926 = ASTSelectorLookupTable::Create(
2927 F.SelectorLookupTableData + Record[0],
2928 F.SelectorLookupTableData,
2929 ASTSelectorLookupTrait(*this, F));
2930 TotalNumMethodPoolEntries += Record[1];
2931 break;
2932
2933 case REFERENCED_SELECTOR_POOL:
2934 if (!Record.empty()) {
2935 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2936 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2937 Record[Idx++]));
2938 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2939 getRawEncoding());
2940 }
2941 }
2942 break;
2943
2944 case PP_COUNTER_VALUE:
2945 if (!Record.empty() && Listener)
2946 Listener->ReadCounter(F, Record[0]);
2947 break;
2948
2949 case FILE_SORTED_DECLS:
Chris Lattner0e6c9402013-01-20 02:38:54 +00002950 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002951 F.NumFileSortedDecls = Record[0];
2952 break;
2953
2954 case SOURCE_LOCATION_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00002955 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00002956 F.LocalNumSLocEntries = Record[0];
2957 unsigned SLocSpaceSize = Record[1];
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00002958 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
Ben Langmuir52ca6782014-10-20 16:27:32 +00002959 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
Guy Benyei11169dd2012-12-18 14:30:41 +00002960 SLocSpaceSize);
2961 // Make our entry in the range map. BaseID is negative and growing, so
2962 // we invert it. Because we invert it, though, we need the other end of
2963 // the range.
2964 unsigned RangeStart =
2965 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2966 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2967 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2968
2969 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2970 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2971 GlobalSLocOffsetMap.insert(
2972 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2973 - SLocSpaceSize,&F));
2974
2975 // Initialize the remapping table.
2976 // Invalid stays invalid.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002977 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
Guy Benyei11169dd2012-12-18 14:30:41 +00002978 // This module. Base was 2 when being compiled.
Richard Smithb9eab6d2014-03-20 19:44:17 +00002979 F.SLocRemap.insertOrReplace(std::make_pair(2U,
Guy Benyei11169dd2012-12-18 14:30:41 +00002980 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2981
2982 TotalNumSLocEntries += F.LocalNumSLocEntries;
2983 break;
2984 }
2985
2986 case MODULE_OFFSET_MAP: {
2987 // Additional remapping information.
Chris Lattner0e6c9402013-01-20 02:38:54 +00002988 const unsigned char *Data = (const unsigned char*)Blob.data();
2989 const unsigned char *DataEnd = Data + Blob.size();
Richard Smithb9eab6d2014-03-20 19:44:17 +00002990
2991 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2992 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2993 F.SLocRemap.insert(std::make_pair(0U, 0));
2994 F.SLocRemap.insert(std::make_pair(2U, 1));
2995 }
2996
Guy Benyei11169dd2012-12-18 14:30:41 +00002997 // Continuous range maps we may be updating in our module.
Ben Langmuir785180e2014-10-20 16:27:30 +00002998 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
2999 RemapBuilder;
3000 RemapBuilder SLocRemap(F.SLocRemap);
3001 RemapBuilder IdentifierRemap(F.IdentifierRemap);
3002 RemapBuilder MacroRemap(F.MacroRemap);
3003 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
3004 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
3005 RemapBuilder SelectorRemap(F.SelectorRemap);
3006 RemapBuilder DeclRemap(F.DeclRemap);
3007 RemapBuilder TypeRemap(F.TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00003008
3009 while(Data < DataEnd) {
Justin Bogner57ba0b22014-03-28 22:03:24 +00003010 using namespace llvm::support;
3011 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
Guy Benyei11169dd2012-12-18 14:30:41 +00003012 StringRef Name = StringRef((const char*)Data, Len);
3013 Data += Len;
3014 ModuleFile *OM = ModuleMgr.lookup(Name);
3015 if (!OM) {
3016 Error("SourceLocation remap refers to unknown module");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003017 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003018 }
3019
Justin Bogner57ba0b22014-03-28 22:03:24 +00003020 uint32_t SLocOffset =
3021 endian::readNext<uint32_t, little, unaligned>(Data);
3022 uint32_t IdentifierIDOffset =
3023 endian::readNext<uint32_t, little, unaligned>(Data);
3024 uint32_t MacroIDOffset =
3025 endian::readNext<uint32_t, little, unaligned>(Data);
3026 uint32_t PreprocessedEntityIDOffset =
3027 endian::readNext<uint32_t, little, unaligned>(Data);
3028 uint32_t SubmoduleIDOffset =
3029 endian::readNext<uint32_t, little, unaligned>(Data);
3030 uint32_t SelectorIDOffset =
3031 endian::readNext<uint32_t, little, unaligned>(Data);
3032 uint32_t DeclIDOffset =
3033 endian::readNext<uint32_t, little, unaligned>(Data);
3034 uint32_t TypeIndexOffset =
3035 endian::readNext<uint32_t, little, unaligned>(Data);
3036
Ben Langmuir785180e2014-10-20 16:27:30 +00003037 uint32_t None = std::numeric_limits<uint32_t>::max();
3038
3039 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
3040 RemapBuilder &Remap) {
3041 if (Offset != None)
3042 Remap.insert(std::make_pair(Offset,
3043 static_cast<int>(BaseOffset - Offset)));
3044 };
3045 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
3046 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
3047 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
3048 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
3049 PreprocessedEntityRemap);
3050 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
3051 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
3052 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
3053 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
Guy Benyei11169dd2012-12-18 14:30:41 +00003054
3055 // Global -> local mappings.
3056 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
3057 }
3058 break;
3059 }
3060
3061 case SOURCE_MANAGER_LINE_TABLE:
3062 if (ParseLineTable(F, Record))
Ben Langmuir2c9af442014-04-10 17:57:43 +00003063 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003064 break;
3065
3066 case SOURCE_LOCATION_PRELOADS: {
3067 // Need to transform from the local view (1-based IDs) to the global view,
3068 // which is based off F.SLocEntryBaseID.
3069 if (!F.PreloadSLocEntries.empty()) {
3070 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003071 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003072 }
3073
3074 F.PreloadSLocEntries.swap(Record);
3075 break;
3076 }
3077
3078 case EXT_VECTOR_DECLS:
3079 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3080 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3081 break;
3082
3083 case VTABLE_USES:
3084 if (Record.size() % 3 != 0) {
3085 Error("Invalid VTABLE_USES record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003086 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003087 }
3088
3089 // Later tables overwrite earlier ones.
3090 // FIXME: Modules will have some trouble with this. This is clearly not
3091 // the right way to do this.
3092 VTableUses.clear();
3093
3094 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3095 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3096 VTableUses.push_back(
3097 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3098 VTableUses.push_back(Record[Idx++]);
3099 }
3100 break;
3101
3102 case DYNAMIC_CLASSES:
3103 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3104 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
3105 break;
3106
3107 case PENDING_IMPLICIT_INSTANTIATIONS:
3108 if (PendingInstantiations.size() % 2 != 0) {
3109 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003110 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003111 }
3112
3113 if (Record.size() % 2 != 0) {
3114 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003115 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003116 }
3117
3118 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3119 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3120 PendingInstantiations.push_back(
3121 ReadSourceLocation(F, Record, I).getRawEncoding());
3122 }
3123 break;
3124
3125 case SEMA_DECL_REFS:
Richard Smith3d8e97e2013-10-18 06:54:39 +00003126 if (Record.size() != 2) {
3127 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003128 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00003129 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003130 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3131 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3132 break;
3133
3134 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003135 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3136 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3137 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00003138
3139 unsigned LocalBasePreprocessedEntityID = Record[0];
3140
3141 unsigned StartingID;
3142 if (!PP.getPreprocessingRecord())
3143 PP.createPreprocessingRecord();
3144 if (!PP.getPreprocessingRecord()->getExternalSource())
3145 PP.getPreprocessingRecord()->SetExternalSource(*this);
3146 StartingID
3147 = PP.getPreprocessingRecord()
Ben Langmuir52ca6782014-10-20 16:27:32 +00003148 ->allocateLoadedEntities(F.NumPreprocessedEntities);
Guy Benyei11169dd2012-12-18 14:30:41 +00003149 F.BasePreprocessedEntityID = StartingID;
3150
3151 if (F.NumPreprocessedEntities > 0) {
3152 // Introduce the global -> local mapping for preprocessed entities in
3153 // this module.
3154 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3155
3156 // Introduce the local -> global mapping for preprocessed entities in
3157 // this module.
3158 F.PreprocessedEntityRemap.insertOrReplace(
3159 std::make_pair(LocalBasePreprocessedEntityID,
3160 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3161 }
3162
3163 break;
3164 }
3165
3166 case DECL_UPDATE_OFFSETS: {
3167 if (Record.size() % 2 != 0) {
3168 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003169 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003170 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00003171 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3172 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3173 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3174
3175 // If we've already loaded the decl, perform the updates when we finish
3176 // loading this block.
3177 if (Decl *D = GetExistingDecl(ID))
3178 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3179 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003180 break;
3181 }
3182
3183 case DECL_REPLACEMENTS: {
3184 if (Record.size() % 3 != 0) {
3185 Error("invalid DECL_REPLACEMENTS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003186 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003187 }
3188 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3189 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3190 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3191 break;
3192 }
3193
3194 case OBJC_CATEGORIES_MAP: {
3195 if (F.LocalNumObjCCategoriesInMap != 0) {
3196 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003197 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003198 }
3199
3200 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003201 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003202 break;
3203 }
3204
3205 case OBJC_CATEGORIES:
3206 F.ObjCCategories.swap(Record);
3207 break;
3208
3209 case CXX_BASE_SPECIFIER_OFFSETS: {
3210 if (F.LocalNumCXXBaseSpecifiers != 0) {
3211 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003212 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003213 }
3214
3215 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003216 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003217 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3218 break;
3219 }
3220
3221 case DIAG_PRAGMA_MAPPINGS:
3222 if (F.PragmaDiagMappings.empty())
3223 F.PragmaDiagMappings.swap(Record);
3224 else
3225 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3226 Record.begin(), Record.end());
3227 break;
3228
3229 case CUDA_SPECIAL_DECL_REFS:
3230 // Later tables overwrite earlier ones.
3231 // FIXME: Modules will have trouble with this.
3232 CUDASpecialDeclRefs.clear();
3233 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3234 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3235 break;
3236
3237 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003238 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003239 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003240 if (Record[0]) {
3241 F.HeaderFileInfoTable
3242 = HeaderFileInfoLookupTable::Create(
3243 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3244 (const unsigned char *)F.HeaderFileInfoTableData,
3245 HeaderFileInfoTrait(*this, F,
3246 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003247 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003248
3249 PP.getHeaderSearchInfo().SetExternalSource(this);
3250 if (!PP.getHeaderSearchInfo().getExternalLookup())
3251 PP.getHeaderSearchInfo().SetExternalLookup(this);
3252 }
3253 break;
3254 }
3255
3256 case FP_PRAGMA_OPTIONS:
3257 // Later tables overwrite earlier ones.
3258 FPPragmaOptions.swap(Record);
3259 break;
3260
3261 case OPENCL_EXTENSIONS:
3262 // Later tables overwrite earlier ones.
3263 OpenCLExtensions.swap(Record);
3264 break;
3265
3266 case TENTATIVE_DEFINITIONS:
3267 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3268 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3269 break;
3270
3271 case KNOWN_NAMESPACES:
3272 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3273 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3274 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003275
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003276 case UNDEFINED_BUT_USED:
3277 if (UndefinedButUsed.size() % 2 != 0) {
3278 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003279 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003280 }
3281
3282 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003283 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003284 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003285 }
3286 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003287 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3288 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003289 ReadSourceLocation(F, Record, I).getRawEncoding());
3290 }
3291 break;
3292
Guy Benyei11169dd2012-12-18 14:30:41 +00003293 case IMPORTED_MODULES: {
Richard Smithe842a472014-10-22 02:05:46 +00003294 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003295 // If we aren't loading a module (which has its own exports), make
3296 // all of the imported modules visible.
3297 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003298 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3299 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3300 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3301 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003302 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003303 }
3304 }
3305 break;
3306 }
3307
3308 case LOCAL_REDECLARATIONS: {
3309 F.RedeclarationChains.swap(Record);
3310 break;
3311 }
3312
3313 case LOCAL_REDECLARATIONS_MAP: {
3314 if (F.LocalNumRedeclarationsInMap != 0) {
3315 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003316 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003317 }
3318
3319 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003320 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003321 break;
3322 }
3323
3324 case MERGED_DECLARATIONS: {
3325 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
3326 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
3327 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
3328 for (unsigned N = Record[Idx++]; N > 0; --N)
3329 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
3330 }
3331 break;
3332 }
3333
3334 case MACRO_OFFSET: {
3335 if (F.LocalNumMacros != 0) {
3336 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003337 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003338 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003339 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003340 F.LocalNumMacros = Record[0];
3341 unsigned LocalBaseMacroID = Record[1];
3342 F.BaseMacroID = getTotalNumMacros();
3343
3344 if (F.LocalNumMacros > 0) {
3345 // Introduce the global -> local mapping for macros within this module.
3346 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3347
3348 // Introduce the local -> global mapping for macros within this module.
3349 F.MacroRemap.insertOrReplace(
3350 std::make_pair(LocalBaseMacroID,
3351 F.BaseMacroID - LocalBaseMacroID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003352
3353 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
Guy Benyei11169dd2012-12-18 14:30:41 +00003354 }
3355 break;
3356 }
3357
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00003358 case MACRO_TABLE: {
3359 // FIXME: Not used yet.
Guy Benyei11169dd2012-12-18 14:30:41 +00003360 break;
3361 }
Richard Smithe40f2ba2013-08-07 21:41:30 +00003362
3363 case LATE_PARSED_TEMPLATE: {
3364 LateParsedTemplates.append(Record.begin(), Record.end());
3365 break;
3366 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003367
3368 case OPTIMIZE_PRAGMA_OPTIONS:
3369 if (Record.size() != 1) {
3370 Error("invalid pragma optimize record");
3371 return Failure;
3372 }
3373 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3374 break;
Nico Weber72889432014-09-06 01:25:55 +00003375
3376 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3377 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3378 UnusedLocalTypedefNameCandidates.push_back(
3379 getGlobalDeclID(F, Record[I]));
3380 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003381 }
3382 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003383}
3384
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003385ASTReader::ASTReadResult
3386ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3387 const ModuleFile *ImportedBy,
3388 unsigned ClientLoadCapabilities) {
3389 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00003390 F.ModuleMapPath = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003391
Richard Smithe842a472014-10-22 02:05:46 +00003392 if (F.Kind == MK_ExplicitModule) {
3393 // For an explicitly-loaded module, we don't care whether the original
3394 // module map file exists or matches.
3395 return Success;
3396 }
3397
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003398 // Try to resolve ModuleName in the current header search context and
3399 // verify that it is found in the same module map file as we saved. If the
3400 // top-level AST file is a main file, skip this check because there is no
3401 // usable header search context.
3402 assert(!F.ModuleName.empty() &&
Richard Smithe842a472014-10-22 02:05:46 +00003403 "MODULE_NAME should come before MODULE_MAP_FILE");
3404 if (F.Kind == MK_ImplicitModule &&
3405 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3406 // An implicitly-loaded module file should have its module listed in some
3407 // module map file that we've already loaded.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003408 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
Richard Smithe842a472014-10-22 02:05:46 +00003409 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3410 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3411 if (!ModMap) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003412 assert(ImportedBy && "top-level import should be verified");
3413 if ((ClientLoadCapabilities & ARR_Missing) == 0)
Richard Smithe842a472014-10-22 02:05:46 +00003414 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName
3415 << ImportedBy->FileName
3416 << F.ModuleMapPath;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003417 return Missing;
3418 }
3419
Richard Smithe842a472014-10-22 02:05:46 +00003420 assert(M->Name == F.ModuleName && "found module with different name");
3421
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003422 // Check the primary module map file.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003423 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003424 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3425 assert(ModMap && "found module is missing module map file");
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003426 assert(ImportedBy && "top-level import should be verified");
3427 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3428 Diag(diag::err_imported_module_modmap_changed)
3429 << F.ModuleName << ImportedBy->FileName
3430 << ModMap->getName() << F.ModuleMapPath;
3431 return OutOfDate;
3432 }
3433
3434 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3435 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3436 // FIXME: we should use input files rather than storing names.
Richard Smith7ed1bc92014-12-05 22:42:13 +00003437 std::string Filename = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003438 const FileEntry *F =
3439 FileMgr.getFile(Filename, false, false);
3440 if (F == nullptr) {
3441 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3442 Error("could not find file '" + Filename +"' referenced by AST file");
3443 return OutOfDate;
3444 }
3445 AdditionalStoredMaps.insert(F);
3446 }
3447
3448 // Check any additional module map files (e.g. module.private.modulemap)
3449 // that are not in the pcm.
3450 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3451 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3452 // Remove files that match
3453 // Note: SmallPtrSet::erase is really remove
3454 if (!AdditionalStoredMaps.erase(ModMap)) {
3455 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3456 Diag(diag::err_module_different_modmap)
3457 << F.ModuleName << /*new*/0 << ModMap->getName();
3458 return OutOfDate;
3459 }
3460 }
3461 }
3462
3463 // Check any additional module map files that are in the pcm, but not
3464 // found in header search. Cases that match are already removed.
3465 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3466 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3467 Diag(diag::err_module_different_modmap)
3468 << F.ModuleName << /*not new*/1 << ModMap->getName();
3469 return OutOfDate;
3470 }
Ben Langmuir18dd78a2015-02-12 21:51:31 +00003471
3472 // Check whether the 'IsSystem' bit changed.
3473 if (M->IsSystem != static_cast<bool>(Record[Idx])) {
3474 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3475 Diag(diag::err_module_system_change) << F.ModuleName << M->IsSystem;
3476 return OutOfDate;
3477 }
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003478 }
3479
3480 if (Listener)
3481 Listener->ReadModuleMapFile(F.ModuleMapPath);
3482 return Success;
3483}
3484
3485
Douglas Gregorc1489562013-02-12 23:36:21 +00003486/// \brief Move the given method to the back of the global list of methods.
3487static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3488 // Find the entry for this selector in the method pool.
3489 Sema::GlobalMethodPool::iterator Known
3490 = S.MethodPool.find(Method->getSelector());
3491 if (Known == S.MethodPool.end())
3492 return;
3493
3494 // Retrieve the appropriate method list.
3495 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3496 : Known->second.second;
3497 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003498 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003499 if (!Found) {
Nico Weber2e0c8f72014-12-27 03:58:08 +00003500 if (List->getMethod() == Method) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003501 Found = true;
3502 } else {
3503 // Keep searching.
3504 continue;
3505 }
3506 }
3507
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003508 if (List->getNext())
Nico Weber2e0c8f72014-12-27 03:58:08 +00003509 List->setMethod(List->getNext()->getMethod());
Douglas Gregorc1489562013-02-12 23:36:21 +00003510 else
Nico Weber2e0c8f72014-12-27 03:58:08 +00003511 List->setMethod(Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003512 }
3513}
3514
Richard Smithe657bbd2014-07-18 22:13:40 +00003515void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3516 bool FromFinalization) {
3517 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
Richard Smith57721ac2014-07-21 04:10:40 +00003518 for (Decl *D : Names.HiddenDecls) {
Richard Smith49f906a2014-03-01 00:08:04 +00003519 bool wasHidden = D->Hidden;
3520 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003521
Richard Smith49f906a2014-03-01 00:08:04 +00003522 if (wasHidden && SemaObj) {
3523 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3524 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003525 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003526 }
3527 }
Richard Smith49f906a2014-03-01 00:08:04 +00003528
Richard Smithe657bbd2014-07-18 22:13:40 +00003529 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3530 "nothing to make visible?");
Richard Smithdaa69e02014-07-25 04:40:03 +00003531 for (const auto &Macro : Names.HiddenMacros) {
3532 if (FromFinalization)
3533 PP.appendMacroDirective(Macro.first,
3534 Macro.second->import(PP, SourceLocation()));
3535 else
3536 installImportedMacro(Macro.first, Macro.second, Owner);
3537 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003538}
3539
Richard Smith49f906a2014-03-01 00:08:04 +00003540void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003541 Module::NameVisibilityKind NameVisibility,
Douglas Gregorfb912652013-03-20 21:10:35 +00003542 SourceLocation ImportLoc,
3543 bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003544 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003545 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003546 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003547 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003548 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003549
3550 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003551 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003552 // there is nothing more to do.
3553 continue;
3554 }
Richard Smith49f906a2014-03-01 00:08:04 +00003555
Guy Benyei11169dd2012-12-18 14:30:41 +00003556 if (!Mod->isAvailable()) {
3557 // Modules that aren't available cannot be made visible.
3558 continue;
3559 }
3560
3561 // Update the module's name visibility.
Richard Smith49f906a2014-03-01 00:08:04 +00003562 if (NameVisibility >= Module::MacrosVisible &&
3563 Mod->NameVisibility < Module::MacrosVisible)
3564 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003565 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003566
Guy Benyei11169dd2012-12-18 14:30:41 +00003567 // If we've already deserialized any names from this module,
3568 // mark them as visible.
3569 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3570 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003571 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003572 HiddenNamesMap.erase(Hidden);
Richard Smith57721ac2014-07-21 04:10:40 +00003573 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3574 /*FromFinalization*/false);
3575 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3576 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003577 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003578
Guy Benyei11169dd2012-12-18 14:30:41 +00003579 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003580 SmallVector<Module *, 16> Exports;
3581 Mod->getExportedModules(Exports);
3582 for (SmallVectorImpl<Module *>::iterator
3583 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3584 Module *Exported = *I;
David Blaikie82e95a32014-11-19 07:49:47 +00003585 if (Visited.insert(Exported).second)
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003586 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003587 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003588
3589 // Detect any conflicts.
3590 if (Complain) {
3591 assert(ImportLoc.isValid() && "Missing import location");
3592 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3593 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3594 Diag(ImportLoc, diag::warn_module_conflict)
3595 << Mod->getFullModuleName()
3596 << Mod->Conflicts[I].Other->getFullModuleName()
3597 << Mod->Conflicts[I].Message;
3598 // FIXME: Need note where the other module was imported.
3599 }
3600 }
3601 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003602 }
3603}
3604
Douglas Gregore060e572013-01-25 01:03:03 +00003605bool ASTReader::loadGlobalIndex() {
3606 if (GlobalIndex)
3607 return false;
3608
3609 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3610 !Context.getLangOpts().Modules)
3611 return true;
3612
3613 // Try to load the global index.
3614 TriedLoadingGlobalIndex = true;
3615 StringRef ModuleCachePath
3616 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3617 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003618 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003619 if (!Result.first)
3620 return true;
3621
3622 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003623 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003624 return false;
3625}
3626
3627bool ASTReader::isGlobalIndexUnavailable() const {
3628 return Context.getLangOpts().Modules && UseGlobalIndex &&
3629 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3630}
3631
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003632static void updateModuleTimestamp(ModuleFile &MF) {
3633 // Overwrite the timestamp file contents so that file's mtime changes.
3634 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00003635 std::error_code EC;
3636 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3637 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003638 return;
3639 OS << "Timestamp file\n";
3640}
3641
Guy Benyei11169dd2012-12-18 14:30:41 +00003642ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3643 ModuleKind Type,
3644 SourceLocation ImportLoc,
3645 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003646 llvm::SaveAndRestore<SourceLocation>
3647 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3648
Richard Smithd1c46742014-04-30 02:24:17 +00003649 // Defer any pending actions until we get to the end of reading the AST file.
3650 Deserializing AnASTFile(this);
3651
Guy Benyei11169dd2012-12-18 14:30:41 +00003652 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003653 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003654
3655 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003656 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003657 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003658 /*ImportedBy=*/nullptr, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00003659 0, 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003660 ClientLoadCapabilities)) {
3661 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003662 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003663 case OutOfDate:
3664 case VersionMismatch:
3665 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003666 case HadErrors: {
3667 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3668 for (const ImportedModule &IM : Loaded)
3669 LoadedSet.insert(IM.Mod);
3670
Douglas Gregor7029ce12013-03-19 00:28:20 +00003671 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003672 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003673 Context.getLangOpts().Modules
3674 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003675 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003676
3677 // If we find that any modules are unusable, the global index is going
3678 // to be out-of-date. Just remove it.
3679 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003680 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003681 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003682 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003683 case Success:
3684 break;
3685 }
3686
3687 // Here comes stuff that we only do once the entire chain is loaded.
3688
3689 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003690 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3691 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003692 M != MEnd; ++M) {
3693 ModuleFile &F = *M->Mod;
3694
3695 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003696 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3697 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003698
3699 // Once read, set the ModuleFile bit base offset and update the size in
3700 // bits of all files we've seen.
3701 F.GlobalBitOffset = TotalModulesSizeInBits;
3702 TotalModulesSizeInBits += F.SizeInBits;
3703 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3704
3705 // Preload SLocEntries.
3706 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3707 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3708 // Load it through the SourceManager and don't call ReadSLocEntry()
3709 // directly because the entry may have already been loaded in which case
3710 // calling ReadSLocEntry() directly would trigger an assertion in
3711 // SourceManager.
3712 SourceMgr.getLoadedSLocEntryByID(Index);
3713 }
3714 }
3715
Douglas Gregor603cd862013-03-22 18:50:14 +00003716 // Setup the import locations and notify the module manager that we've
3717 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003718 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3719 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003720 M != MEnd; ++M) {
3721 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003722
3723 ModuleMgr.moduleFileAccepted(&F);
3724
3725 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003726 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003727 if (!M->ImportedBy)
3728 F.ImportLoc = M->ImportLoc;
3729 else
3730 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3731 M->ImportLoc.getRawEncoding());
3732 }
3733
3734 // Mark all of the identifiers in the identifier table as being out of date,
3735 // so that various accessors know to check the loaded modules when the
3736 // identifier is used.
3737 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3738 IdEnd = PP.getIdentifierTable().end();
3739 Id != IdEnd; ++Id)
3740 Id->second->setOutOfDate(true);
3741
3742 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003743 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3744 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003745 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3746 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003747
3748 switch (Unresolved.Kind) {
3749 case UnresolvedModuleRef::Conflict:
3750 if (ResolvedMod) {
3751 Module::Conflict Conflict;
3752 Conflict.Other = ResolvedMod;
3753 Conflict.Message = Unresolved.String.str();
3754 Unresolved.Mod->Conflicts.push_back(Conflict);
3755 }
3756 continue;
3757
3758 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003759 if (ResolvedMod)
3760 Unresolved.Mod->Imports.push_back(ResolvedMod);
3761 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003762
Douglas Gregorfb912652013-03-20 21:10:35 +00003763 case UnresolvedModuleRef::Export:
3764 if (ResolvedMod || Unresolved.IsWildcard)
3765 Unresolved.Mod->Exports.push_back(
3766 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3767 continue;
3768 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003769 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003770 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003771
3772 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3773 // Might be unnecessary as use declarations are only used to build the
3774 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003775
3776 InitializeContext();
3777
Richard Smith3d8e97e2013-10-18 06:54:39 +00003778 if (SemaObj)
3779 UpdateSema();
3780
Guy Benyei11169dd2012-12-18 14:30:41 +00003781 if (DeserializationListener)
3782 DeserializationListener->ReaderInitialized(this);
3783
3784 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3785 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3786 PrimaryModule.OriginalSourceFileID
3787 = FileID::get(PrimaryModule.SLocEntryBaseID
3788 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3789
3790 // If this AST file is a precompiled preamble, then set the
3791 // preamble file ID of the source manager to the file source file
3792 // from which the preamble was built.
3793 if (Type == MK_Preamble) {
3794 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3795 } else if (Type == MK_MainFile) {
3796 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3797 }
3798 }
3799
3800 // For any Objective-C class definitions we have already loaded, make sure
3801 // that we load any additional categories.
3802 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3803 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3804 ObjCClassesLoaded[I],
3805 PreviousGeneration);
3806 }
Douglas Gregore060e572013-01-25 01:03:03 +00003807
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003808 if (PP.getHeaderSearchInfo()
3809 .getHeaderSearchOpts()
3810 .ModulesValidateOncePerBuildSession) {
3811 // Now we are certain that the module and all modules it depends on are
3812 // up to date. Create or update timestamp files for modules that are
3813 // located in the module cache (not for PCH files that could be anywhere
3814 // in the filesystem).
3815 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3816 ImportedModule &M = Loaded[I];
Richard Smithe842a472014-10-22 02:05:46 +00003817 if (M.Mod->Kind == MK_ImplicitModule) {
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003818 updateModuleTimestamp(*M.Mod);
3819 }
3820 }
3821 }
3822
Guy Benyei11169dd2012-12-18 14:30:41 +00003823 return Success;
3824}
3825
Ben Langmuir487ea142014-10-23 18:05:36 +00003826static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile);
3827
Guy Benyei11169dd2012-12-18 14:30:41 +00003828ASTReader::ASTReadResult
3829ASTReader::ReadASTCore(StringRef FileName,
3830 ModuleKind Type,
3831 SourceLocation ImportLoc,
3832 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003833 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003834 off_t ExpectedSize, time_t ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003835 ASTFileSignature ExpectedSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00003836 unsigned ClientLoadCapabilities) {
3837 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003838 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003839 ModuleManager::AddModuleResult AddResult
3840 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003841 getGeneration(), ExpectedSize, ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003842 ExpectedSignature, readASTFileSignature,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003843 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003844
Douglas Gregor7029ce12013-03-19 00:28:20 +00003845 switch (AddResult) {
3846 case ModuleManager::AlreadyLoaded:
3847 return Success;
3848
3849 case ModuleManager::NewlyLoaded:
3850 // Load module file below.
3851 break;
3852
3853 case ModuleManager::Missing:
Richard Smithe842a472014-10-22 02:05:46 +00003854 // The module file was missing; if the client can handle that, return
Douglas Gregor7029ce12013-03-19 00:28:20 +00003855 // it.
3856 if (ClientLoadCapabilities & ARR_Missing)
3857 return Missing;
3858
3859 // Otherwise, return an error.
3860 {
3861 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3862 + ErrorStr;
3863 Error(Msg);
3864 }
3865 return Failure;
3866
3867 case ModuleManager::OutOfDate:
3868 // We couldn't load the module file because it is out-of-date. If the
3869 // client can handle out-of-date, return it.
3870 if (ClientLoadCapabilities & ARR_OutOfDate)
3871 return OutOfDate;
3872
3873 // Otherwise, return an error.
3874 {
3875 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3876 + ErrorStr;
3877 Error(Msg);
3878 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003879 return Failure;
3880 }
3881
Douglas Gregor7029ce12013-03-19 00:28:20 +00003882 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003883
3884 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3885 // module?
3886 if (FileName != "-") {
3887 CurrentDir = llvm::sys::path::parent_path(FileName);
3888 if (CurrentDir.empty()) CurrentDir = ".";
3889 }
3890
3891 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003892 BitstreamCursor &Stream = F.Stream;
Rafael Espindolafd832392014-11-12 14:48:44 +00003893 Stream.init(&F.StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00003894 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3895
3896 // Sniff for the signature.
3897 if (Stream.Read(8) != 'C' ||
3898 Stream.Read(8) != 'P' ||
3899 Stream.Read(8) != 'C' ||
3900 Stream.Read(8) != 'H') {
3901 Diag(diag::err_not_a_pch_file) << FileName;
3902 return Failure;
3903 }
3904
3905 // This is used for compatibility with older PCH formats.
3906 bool HaveReadControlBlock = false;
3907
Chris Lattnerefa77172013-01-20 00:00:22 +00003908 while (1) {
3909 llvm::BitstreamEntry Entry = Stream.advance();
3910
3911 switch (Entry.Kind) {
3912 case llvm::BitstreamEntry::Error:
3913 case llvm::BitstreamEntry::EndBlock:
3914 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003915 Error("invalid record at top-level of AST file");
3916 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003917
3918 case llvm::BitstreamEntry::SubBlock:
3919 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003920 }
3921
Guy Benyei11169dd2012-12-18 14:30:41 +00003922 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003923 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003924 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3925 if (Stream.ReadBlockInfoBlock()) {
3926 Error("malformed BlockInfoBlock in AST file");
3927 return Failure;
3928 }
3929 break;
3930 case CONTROL_BLOCK_ID:
3931 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003932 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003933 case Success:
3934 break;
3935
3936 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003937 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003938 case OutOfDate: return OutOfDate;
3939 case VersionMismatch: return VersionMismatch;
3940 case ConfigurationMismatch: return ConfigurationMismatch;
3941 case HadErrors: return HadErrors;
3942 }
3943 break;
3944 case AST_BLOCK_ID:
3945 if (!HaveReadControlBlock) {
3946 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003947 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003948 return VersionMismatch;
3949 }
3950
3951 // Record that we've loaded this module.
3952 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3953 return Success;
3954
3955 default:
3956 if (Stream.SkipBlock()) {
3957 Error("malformed block record in AST file");
3958 return Failure;
3959 }
3960 break;
3961 }
3962 }
3963
3964 return Success;
3965}
3966
3967void ASTReader::InitializeContext() {
3968 // If there's a listener, notify them that we "read" the translation unit.
3969 if (DeserializationListener)
3970 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3971 Context.getTranslationUnitDecl());
3972
Guy Benyei11169dd2012-12-18 14:30:41 +00003973 // FIXME: Find a better way to deal with collisions between these
3974 // built-in types. Right now, we just ignore the problem.
3975
3976 // Load the special types.
3977 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3978 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3979 if (!Context.CFConstantStringTypeDecl)
3980 Context.setCFConstantStringType(GetType(String));
3981 }
3982
3983 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3984 QualType FileType = GetType(File);
3985 if (FileType.isNull()) {
3986 Error("FILE type is NULL");
3987 return;
3988 }
3989
3990 if (!Context.FILEDecl) {
3991 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3992 Context.setFILEDecl(Typedef->getDecl());
3993 else {
3994 const TagType *Tag = FileType->getAs<TagType>();
3995 if (!Tag) {
3996 Error("Invalid FILE type in AST file");
3997 return;
3998 }
3999 Context.setFILEDecl(Tag->getDecl());
4000 }
4001 }
4002 }
4003
4004 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
4005 QualType Jmp_bufType = GetType(Jmp_buf);
4006 if (Jmp_bufType.isNull()) {
4007 Error("jmp_buf type is NULL");
4008 return;
4009 }
4010
4011 if (!Context.jmp_bufDecl) {
4012 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
4013 Context.setjmp_bufDecl(Typedef->getDecl());
4014 else {
4015 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4016 if (!Tag) {
4017 Error("Invalid jmp_buf type in AST file");
4018 return;
4019 }
4020 Context.setjmp_bufDecl(Tag->getDecl());
4021 }
4022 }
4023 }
4024
4025 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4026 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4027 if (Sigjmp_bufType.isNull()) {
4028 Error("sigjmp_buf type is NULL");
4029 return;
4030 }
4031
4032 if (!Context.sigjmp_bufDecl) {
4033 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4034 Context.setsigjmp_bufDecl(Typedef->getDecl());
4035 else {
4036 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4037 assert(Tag && "Invalid sigjmp_buf type in AST file");
4038 Context.setsigjmp_bufDecl(Tag->getDecl());
4039 }
4040 }
4041 }
4042
4043 if (unsigned ObjCIdRedef
4044 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4045 if (Context.ObjCIdRedefinitionType.isNull())
4046 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4047 }
4048
4049 if (unsigned ObjCClassRedef
4050 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4051 if (Context.ObjCClassRedefinitionType.isNull())
4052 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4053 }
4054
4055 if (unsigned ObjCSelRedef
4056 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4057 if (Context.ObjCSelRedefinitionType.isNull())
4058 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4059 }
4060
4061 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4062 QualType Ucontext_tType = GetType(Ucontext_t);
4063 if (Ucontext_tType.isNull()) {
4064 Error("ucontext_t type is NULL");
4065 return;
4066 }
4067
4068 if (!Context.ucontext_tDecl) {
4069 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4070 Context.setucontext_tDecl(Typedef->getDecl());
4071 else {
4072 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4073 assert(Tag && "Invalid ucontext_t type in AST file");
4074 Context.setucontext_tDecl(Tag->getDecl());
4075 }
4076 }
4077 }
4078 }
4079
4080 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4081
4082 // If there were any CUDA special declarations, deserialize them.
4083 if (!CUDASpecialDeclRefs.empty()) {
4084 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4085 Context.setcudaConfigureCallDecl(
4086 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4087 }
Richard Smith56be7542014-03-21 00:33:59 +00004088
Guy Benyei11169dd2012-12-18 14:30:41 +00004089 // Re-export any modules that were imported by a non-module AST file.
Richard Smith56be7542014-03-21 00:33:59 +00004090 // FIXME: This does not make macro-only imports visible again. It also doesn't
4091 // make #includes mapped to module imports visible.
4092 for (auto &Import : ImportedModules) {
4093 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00004094 makeModuleVisible(Imported, Module::AllVisible,
Richard Smith56be7542014-03-21 00:33:59 +00004095 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregorfb912652013-03-20 21:10:35 +00004096 /*Complain=*/false);
Guy Benyei11169dd2012-12-18 14:30:41 +00004097 }
4098 ImportedModules.clear();
4099}
4100
4101void ASTReader::finalizeForWriting() {
Richard Smith57721ac2014-07-21 04:10:40 +00004102 while (!HiddenNamesMap.empty()) {
4103 auto HiddenNames = std::move(*HiddenNamesMap.begin());
4104 HiddenNamesMap.erase(HiddenNamesMap.begin());
4105 makeNamesVisible(HiddenNames.second, HiddenNames.first,
4106 /*FromFinalization*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00004107 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004108}
4109
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004110/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
4111/// cursor into the start of the given block ID, returning false on success and
4112/// true on failure.
4113static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004114 while (1) {
4115 llvm::BitstreamEntry Entry = Cursor.advance();
4116 switch (Entry.Kind) {
4117 case llvm::BitstreamEntry::Error:
4118 case llvm::BitstreamEntry::EndBlock:
4119 return true;
4120
4121 case llvm::BitstreamEntry::Record:
4122 // Ignore top-level records.
4123 Cursor.skipRecord(Entry.ID);
4124 break;
4125
4126 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004127 if (Entry.ID == BlockID) {
4128 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004129 return true;
4130 // Found it!
4131 return false;
4132 }
4133
4134 if (Cursor.SkipBlock())
4135 return true;
4136 }
4137 }
4138}
4139
Ben Langmuir487ea142014-10-23 18:05:36 +00004140static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){
4141 BitstreamCursor Stream(StreamFile);
4142 if (Stream.Read(8) != 'C' ||
4143 Stream.Read(8) != 'P' ||
4144 Stream.Read(8) != 'C' ||
4145 Stream.Read(8) != 'H') {
4146 return 0;
4147 }
4148
4149 // Scan for the CONTROL_BLOCK_ID block.
4150 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4151 return 0;
4152
4153 // Scan for SIGNATURE inside the control block.
4154 ASTReader::RecordData Record;
4155 while (1) {
4156 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4157 if (Entry.Kind == llvm::BitstreamEntry::EndBlock ||
4158 Entry.Kind != llvm::BitstreamEntry::Record)
4159 return 0;
4160
4161 Record.clear();
4162 StringRef Blob;
4163 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4164 return Record[0];
4165 }
4166}
4167
Guy Benyei11169dd2012-12-18 14:30:41 +00004168/// \brief Retrieve the name of the original source file name
4169/// directly from the AST file, without actually loading the AST
4170/// file.
4171std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4172 FileManager &FileMgr,
4173 DiagnosticsEngine &Diags) {
4174 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004175 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00004176 if (!Buffer) {
Benjamin Kramera8857962014-10-26 22:44:13 +00004177 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4178 << ASTFileName << Buffer.getError().message();
Guy Benyei11169dd2012-12-18 14:30:41 +00004179 return std::string();
4180 }
4181
4182 // Initialize the stream
4183 llvm::BitstreamReader StreamFile;
Benjamin Kramera8857962014-10-26 22:44:13 +00004184 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4185 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004186 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004187
4188 // Sniff for the signature.
4189 if (Stream.Read(8) != 'C' ||
4190 Stream.Read(8) != 'P' ||
4191 Stream.Read(8) != 'C' ||
4192 Stream.Read(8) != 'H') {
4193 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4194 return std::string();
4195 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004196
Chris Lattnere7b154b2013-01-19 21:39:22 +00004197 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004198 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004199 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4200 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004201 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004202
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004203 // Scan for ORIGINAL_FILE inside the control block.
4204 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00004205 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004206 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004207 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4208 return std::string();
4209
4210 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4211 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4212 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00004213 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00004214
Guy Benyei11169dd2012-12-18 14:30:41 +00004215 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004216 StringRef Blob;
4217 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4218 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00004219 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004220}
4221
4222namespace {
4223 class SimplePCHValidator : public ASTReaderListener {
4224 const LangOptions &ExistingLangOpts;
4225 const TargetOptions &ExistingTargetOpts;
4226 const PreprocessorOptions &ExistingPPOpts;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004227 std::string ExistingModuleCachePath;
Guy Benyei11169dd2012-12-18 14:30:41 +00004228 FileManager &FileMgr;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004229
Guy Benyei11169dd2012-12-18 14:30:41 +00004230 public:
4231 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4232 const TargetOptions &ExistingTargetOpts,
4233 const PreprocessorOptions &ExistingPPOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004234 StringRef ExistingModuleCachePath,
Guy Benyei11169dd2012-12-18 14:30:41 +00004235 FileManager &FileMgr)
4236 : ExistingLangOpts(ExistingLangOpts),
4237 ExistingTargetOpts(ExistingTargetOpts),
4238 ExistingPPOpts(ExistingPPOpts),
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004239 ExistingModuleCachePath(ExistingModuleCachePath),
Guy Benyei11169dd2012-12-18 14:30:41 +00004240 FileMgr(FileMgr)
4241 {
4242 }
4243
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004244 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4245 bool AllowCompatibleDifferences) override {
4246 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4247 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004248 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004249 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4250 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004251 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004252 }
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004253 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4254 StringRef SpecificModuleCachePath,
4255 bool Complain) override {
4256 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4257 ExistingModuleCachePath,
4258 nullptr, ExistingLangOpts);
4259 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004260 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4261 bool Complain,
4262 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004263 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004264 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00004265 }
4266 };
4267}
4268
4269bool ASTReader::readASTFileControlBlock(StringRef Filename,
4270 FileManager &FileMgr,
4271 ASTReaderListener &Listener) {
4272 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004273 auto Buffer = FileMgr.getBufferForFile(Filename);
Guy Benyei11169dd2012-12-18 14:30:41 +00004274 if (!Buffer) {
4275 return true;
4276 }
4277
4278 // Initialize the stream
4279 llvm::BitstreamReader StreamFile;
Benjamin Kramera8857962014-10-26 22:44:13 +00004280 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4281 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004282 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004283
4284 // Sniff for the signature.
4285 if (Stream.Read(8) != 'C' ||
4286 Stream.Read(8) != 'P' ||
4287 Stream.Read(8) != 'C' ||
4288 Stream.Read(8) != 'H') {
4289 return true;
4290 }
4291
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004292 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004293 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004294 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004295
4296 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00004297 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Richard Smithd4b230b2014-10-27 23:01:16 +00004298 bool NeedsImports = Listener.needsImportVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004299 BitstreamCursor InputFilesCursor;
4300 if (NeedsInputFiles) {
4301 InputFilesCursor = Stream;
4302 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4303 return true;
4304
4305 // Read the abbreviations
4306 while (true) {
4307 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4308 unsigned Code = InputFilesCursor.ReadCode();
4309
4310 // We expect all abbrevs to be at the start of the block.
4311 if (Code != llvm::bitc::DEFINE_ABBREV) {
4312 InputFilesCursor.JumpToBit(Offset);
4313 break;
4314 }
4315 InputFilesCursor.ReadAbbrevRecord();
4316 }
4317 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004318
4319 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00004320 RecordData Record;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004321 std::string ModuleDir;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004322 while (1) {
4323 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4324 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4325 return false;
4326
4327 if (Entry.Kind != llvm::BitstreamEntry::Record)
4328 return true;
4329
Guy Benyei11169dd2012-12-18 14:30:41 +00004330 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004331 StringRef Blob;
4332 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004333 switch ((ControlRecordTypes)RecCode) {
4334 case METADATA: {
4335 if (Record[0] != VERSION_MAJOR)
4336 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004337
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004338 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004339 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004340
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004341 break;
4342 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004343 case MODULE_NAME:
4344 Listener.ReadModuleName(Blob);
4345 break;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004346 case MODULE_DIRECTORY:
4347 ModuleDir = Blob;
4348 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004349 case MODULE_MAP_FILE: {
4350 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004351 auto Path = ReadString(Record, Idx);
4352 ResolveImportedPath(Path, ModuleDir);
4353 Listener.ReadModuleMapFile(Path);
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004354 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004355 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004356 case LANGUAGE_OPTIONS:
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004357 if (ParseLanguageOptions(Record, false, Listener,
4358 /*AllowCompatibleConfigurationMismatch*/false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004359 return true;
4360 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004361
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004362 case TARGET_OPTIONS:
4363 if (ParseTargetOptions(Record, false, Listener))
4364 return true;
4365 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004366
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004367 case DIAGNOSTIC_OPTIONS:
4368 if (ParseDiagnosticOptions(Record, false, Listener))
4369 return true;
4370 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004371
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004372 case FILE_SYSTEM_OPTIONS:
4373 if (ParseFileSystemOptions(Record, false, Listener))
4374 return true;
4375 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004376
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004377 case HEADER_SEARCH_OPTIONS:
4378 if (ParseHeaderSearchOptions(Record, false, Listener))
4379 return true;
4380 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004381
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004382 case PREPROCESSOR_OPTIONS: {
4383 std::string IgnoredSuggestedPredefines;
4384 if (ParsePreprocessorOptions(Record, false, Listener,
4385 IgnoredSuggestedPredefines))
4386 return true;
4387 break;
4388 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004389
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004390 case INPUT_FILE_OFFSETS: {
4391 if (!NeedsInputFiles)
4392 break;
4393
4394 unsigned NumInputFiles = Record[0];
4395 unsigned NumUserFiles = Record[1];
Richard Smithec216502015-02-13 19:48:37 +00004396 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004397 for (unsigned I = 0; I != NumInputFiles; ++I) {
4398 // Go find this input file.
4399 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004400
4401 if (isSystemFile && !NeedsSystemInputFiles)
4402 break; // the rest are system input files
4403
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004404 BitstreamCursor &Cursor = InputFilesCursor;
4405 SavedStreamPosition SavedPosition(Cursor);
4406 Cursor.JumpToBit(InputFileOffs[I]);
4407
4408 unsigned Code = Cursor.ReadCode();
4409 RecordData Record;
4410 StringRef Blob;
4411 bool shouldContinue = false;
4412 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4413 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004414 bool Overridden = static_cast<bool>(Record[3]);
Richard Smith7ed1bc92014-12-05 22:42:13 +00004415 std::string Filename = Blob;
4416 ResolveImportedPath(Filename, ModuleDir);
4417 shouldContinue =
4418 Listener.visitInputFile(Filename, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004419 break;
4420 }
4421 if (!shouldContinue)
4422 break;
4423 }
4424 break;
4425 }
4426
Richard Smithd4b230b2014-10-27 23:01:16 +00004427 case IMPORTS: {
4428 if (!NeedsImports)
4429 break;
4430
4431 unsigned Idx = 0, N = Record.size();
4432 while (Idx < N) {
4433 // Read information about the AST file.
Richard Smith79c98cc2014-10-27 23:25:15 +00004434 Idx += 5; // ImportLoc, Size, ModTime, Signature
Richard Smith7ed1bc92014-12-05 22:42:13 +00004435 std::string Filename = ReadString(Record, Idx);
4436 ResolveImportedPath(Filename, ModuleDir);
4437 Listener.visitImport(Filename);
Richard Smithd4b230b2014-10-27 23:01:16 +00004438 }
4439 break;
4440 }
4441
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004442 default:
4443 // No other validation to perform.
4444 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004445 }
4446 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004447}
4448
4449
4450bool ASTReader::isAcceptableASTFile(StringRef Filename,
4451 FileManager &FileMgr,
4452 const LangOptions &LangOpts,
4453 const TargetOptions &TargetOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004454 const PreprocessorOptions &PPOpts,
4455 std::string ExistingModuleCachePath) {
4456 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4457 ExistingModuleCachePath, FileMgr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004458 return !readASTFileControlBlock(Filename, FileMgr, validator);
4459}
4460
Ben Langmuir2c9af442014-04-10 17:57:43 +00004461ASTReader::ASTReadResult
4462ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004463 // Enter the submodule block.
4464 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4465 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004466 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004467 }
4468
4469 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4470 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004471 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004472 RecordData Record;
4473 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004474 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4475
4476 switch (Entry.Kind) {
4477 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4478 case llvm::BitstreamEntry::Error:
4479 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004480 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004481 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004482 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004483 case llvm::BitstreamEntry::Record:
4484 // The interesting case.
4485 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004486 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004487
Guy Benyei11169dd2012-12-18 14:30:41 +00004488 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004489 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004490 Record.clear();
Richard Smith03478d92014-10-23 22:12:14 +00004491 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4492
4493 if ((Kind == SUBMODULE_METADATA) != First) {
4494 Error("submodule metadata record should be at beginning of block");
4495 return Failure;
4496 }
4497 First = false;
4498
4499 // Submodule information is only valid if we have a current module.
4500 // FIXME: Should we error on these cases?
4501 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4502 Kind != SUBMODULE_DEFINITION)
4503 continue;
4504
4505 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004506 default: // Default behavior: ignore.
4507 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004508
Richard Smith03478d92014-10-23 22:12:14 +00004509 case SUBMODULE_DEFINITION: {
Douglas Gregor8d932422013-03-20 03:59:18 +00004510 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004511 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004512 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004513 }
Richard Smith03478d92014-10-23 22:12:14 +00004514
Chris Lattner0e6c9402013-01-20 02:38:54 +00004515 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004516 unsigned Idx = 0;
4517 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4518 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4519 bool IsFramework = Record[Idx++];
4520 bool IsExplicit = Record[Idx++];
4521 bool IsSystem = Record[Idx++];
4522 bool IsExternC = Record[Idx++];
4523 bool InferSubmodules = Record[Idx++];
4524 bool InferExplicitSubmodules = Record[Idx++];
4525 bool InferExportWildcard = Record[Idx++];
4526 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004527
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004528 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004529 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004530 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004531
Guy Benyei11169dd2012-12-18 14:30:41 +00004532 // Retrieve this (sub)module from the module map, creating it if
4533 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004534 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004535 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004536
4537 // FIXME: set the definition loc for CurrentModule, or call
4538 // ModMap.setInferredModuleAllowedBy()
4539
Guy Benyei11169dd2012-12-18 14:30:41 +00004540 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4541 if (GlobalIndex >= SubmodulesLoaded.size() ||
4542 SubmodulesLoaded[GlobalIndex]) {
4543 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004544 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004545 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004546
Douglas Gregor7029ce12013-03-19 00:28:20 +00004547 if (!ParentModule) {
4548 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4549 if (CurFile != F.File) {
4550 if (!Diags.isDiagnosticInFlight()) {
4551 Diag(diag::err_module_file_conflict)
4552 << CurrentModule->getTopLevelModuleName()
4553 << CurFile->getName()
4554 << F.File->getName();
4555 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004556 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004557 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004558 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004559
4560 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004561 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004562
Guy Benyei11169dd2012-12-18 14:30:41 +00004563 CurrentModule->IsFromModuleFile = true;
4564 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004565 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004566 CurrentModule->InferSubmodules = InferSubmodules;
4567 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4568 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004569 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004570 if (DeserializationListener)
4571 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4572
4573 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004574
Douglas Gregorfb912652013-03-20 21:10:35 +00004575 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004576 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004577 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004578 CurrentModule->UnresolvedConflicts.clear();
4579 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004580 break;
4581 }
4582
4583 case SUBMODULE_UMBRELLA_HEADER: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004584 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004585 if (!CurrentModule->getUmbrellaHeader())
4586 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4587 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004588 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4589 Error("mismatched umbrella headers in submodule");
4590 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004591 }
4592 }
4593 break;
4594 }
4595
Richard Smith202210b2014-10-24 20:23:01 +00004596 case SUBMODULE_HEADER:
4597 case SUBMODULE_EXCLUDED_HEADER:
4598 case SUBMODULE_PRIVATE_HEADER:
4599 // We lazily associate headers with their modules via the HeaderInfo table.
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004600 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4601 // of complete filenames or remove it entirely.
Richard Smith202210b2014-10-24 20:23:01 +00004602 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004603
Richard Smith202210b2014-10-24 20:23:01 +00004604 case SUBMODULE_TEXTUAL_HEADER:
4605 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4606 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4607 // them here.
4608 break;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004609
Guy Benyei11169dd2012-12-18 14:30:41 +00004610 case SUBMODULE_TOPHEADER: {
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004611 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004612 break;
4613 }
4614
4615 case SUBMODULE_UMBRELLA_DIR: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004616 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004617 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004618 if (!CurrentModule->getUmbrellaDir())
4619 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4620 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004621 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4622 Error("mismatched umbrella directories in submodule");
4623 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004624 }
4625 }
4626 break;
4627 }
4628
4629 case SUBMODULE_METADATA: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004630 F.BaseSubmoduleID = getTotalNumSubmodules();
4631 F.LocalNumSubmodules = Record[0];
4632 unsigned LocalBaseSubmoduleID = Record[1];
4633 if (F.LocalNumSubmodules > 0) {
4634 // Introduce the global -> local mapping for submodules within this
4635 // module.
4636 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4637
4638 // Introduce the local -> global mapping for submodules within this
4639 // module.
4640 F.SubmoduleRemap.insertOrReplace(
4641 std::make_pair(LocalBaseSubmoduleID,
4642 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00004643
Ben Langmuir52ca6782014-10-20 16:27:32 +00004644 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4645 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004646 break;
4647 }
4648
4649 case SUBMODULE_IMPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004650 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004651 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004652 Unresolved.File = &F;
4653 Unresolved.Mod = CurrentModule;
4654 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004655 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004656 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004657 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004658 }
4659 break;
4660 }
4661
4662 case SUBMODULE_EXPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004663 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004664 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004665 Unresolved.File = &F;
4666 Unresolved.Mod = CurrentModule;
4667 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004668 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004669 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004670 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004671 }
4672
4673 // Once we've loaded the set of exports, there's no reason to keep
4674 // the parsed, unresolved exports around.
4675 CurrentModule->UnresolvedExports.clear();
4676 break;
4677 }
4678 case SUBMODULE_REQUIRES: {
Richard Smitha3feee22013-10-28 22:18:19 +00004679 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004680 Context.getTargetInfo());
4681 break;
4682 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004683
4684 case SUBMODULE_LINK_LIBRARY:
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004685 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004686 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004687 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004688
4689 case SUBMODULE_CONFIG_MACRO:
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004690 CurrentModule->ConfigMacros.push_back(Blob.str());
4691 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004692
4693 case SUBMODULE_CONFLICT: {
Douglas Gregorfb912652013-03-20 21:10:35 +00004694 UnresolvedModuleRef Unresolved;
4695 Unresolved.File = &F;
4696 Unresolved.Mod = CurrentModule;
4697 Unresolved.ID = Record[0];
4698 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4699 Unresolved.IsWildcard = false;
4700 Unresolved.String = Blob;
4701 UnresolvedModuleRefs.push_back(Unresolved);
4702 break;
4703 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004704 }
4705 }
4706}
4707
4708/// \brief Parse the record that corresponds to a LangOptions data
4709/// structure.
4710///
4711/// This routine parses the language options from the AST file and then gives
4712/// them to the AST listener if one is set.
4713///
4714/// \returns true if the listener deems the file unacceptable, false otherwise.
4715bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4716 bool Complain,
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004717 ASTReaderListener &Listener,
4718 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004719 LangOptions LangOpts;
4720 unsigned Idx = 0;
4721#define LANGOPT(Name, Bits, Default, Description) \
4722 LangOpts.Name = Record[Idx++];
4723#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4724 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4725#include "clang/Basic/LangOptions.def"
Alexey Samsonovedf99a92014-11-07 22:29:38 +00004726#define SANITIZER(NAME, ID) \
4727 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
Will Dietzf54319c2013-01-18 11:30:38 +00004728#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004729
4730 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4731 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4732 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4733
4734 unsigned Length = Record[Idx++];
4735 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4736 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004737
4738 Idx += Length;
4739
4740 // Comment options.
4741 for (unsigned N = Record[Idx++]; N; --N) {
4742 LangOpts.CommentOpts.BlockCommandNames.push_back(
4743 ReadString(Record, Idx));
4744 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004745 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004746
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004747 return Listener.ReadLanguageOptions(LangOpts, Complain,
4748 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004749}
4750
4751bool ASTReader::ParseTargetOptions(const RecordData &Record,
4752 bool Complain,
4753 ASTReaderListener &Listener) {
4754 unsigned Idx = 0;
4755 TargetOptions TargetOpts;
4756 TargetOpts.Triple = ReadString(Record, Idx);
4757 TargetOpts.CPU = ReadString(Record, Idx);
4758 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004759 for (unsigned N = Record[Idx++]; N; --N) {
4760 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4761 }
4762 for (unsigned N = Record[Idx++]; N; --N) {
4763 TargetOpts.Features.push_back(ReadString(Record, Idx));
4764 }
4765
4766 return Listener.ReadTargetOptions(TargetOpts, Complain);
4767}
4768
4769bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4770 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004771 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004772 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004773#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004774#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004775 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004776#include "clang/Basic/DiagnosticOptions.def"
4777
Richard Smith3be1cb22014-08-07 00:24:21 +00004778 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004779 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004780 for (unsigned N = Record[Idx++]; N; --N)
4781 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004782
4783 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4784}
4785
4786bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4787 ASTReaderListener &Listener) {
4788 FileSystemOptions FSOpts;
4789 unsigned Idx = 0;
4790 FSOpts.WorkingDir = ReadString(Record, Idx);
4791 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4792}
4793
4794bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4795 bool Complain,
4796 ASTReaderListener &Listener) {
4797 HeaderSearchOptions HSOpts;
4798 unsigned Idx = 0;
4799 HSOpts.Sysroot = ReadString(Record, Idx);
4800
4801 // Include entries.
4802 for (unsigned N = Record[Idx++]; N; --N) {
4803 std::string Path = ReadString(Record, Idx);
4804 frontend::IncludeDirGroup Group
4805 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004806 bool IsFramework = Record[Idx++];
4807 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004808 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004809 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004810 }
4811
4812 // System header prefixes.
4813 for (unsigned N = Record[Idx++]; N; --N) {
4814 std::string Prefix = ReadString(Record, Idx);
4815 bool IsSystemHeader = Record[Idx++];
4816 HSOpts.SystemHeaderPrefixes.push_back(
4817 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4818 }
4819
4820 HSOpts.ResourceDir = ReadString(Record, Idx);
4821 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004822 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004823 HSOpts.DisableModuleHash = Record[Idx++];
4824 HSOpts.UseBuiltinIncludes = Record[Idx++];
4825 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4826 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4827 HSOpts.UseLibcxx = Record[Idx++];
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004828 std::string SpecificModuleCachePath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004829
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004830 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4831 Complain);
Guy Benyei11169dd2012-12-18 14:30:41 +00004832}
4833
4834bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4835 bool Complain,
4836 ASTReaderListener &Listener,
4837 std::string &SuggestedPredefines) {
4838 PreprocessorOptions PPOpts;
4839 unsigned Idx = 0;
4840
4841 // Macro definitions/undefs
4842 for (unsigned N = Record[Idx++]; N; --N) {
4843 std::string Macro = ReadString(Record, Idx);
4844 bool IsUndef = Record[Idx++];
4845 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4846 }
4847
4848 // Includes
4849 for (unsigned N = Record[Idx++]; N; --N) {
4850 PPOpts.Includes.push_back(ReadString(Record, Idx));
4851 }
4852
4853 // Macro Includes
4854 for (unsigned N = Record[Idx++]; N; --N) {
4855 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4856 }
4857
4858 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004859 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004860 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4861 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4862 PPOpts.ObjCXXARCStandardLibrary =
4863 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4864 SuggestedPredefines.clear();
4865 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4866 SuggestedPredefines);
4867}
4868
4869std::pair<ModuleFile *, unsigned>
4870ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4871 GlobalPreprocessedEntityMapType::iterator
4872 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4873 assert(I != GlobalPreprocessedEntityMap.end() &&
4874 "Corrupted global preprocessed entity map");
4875 ModuleFile *M = I->second;
4876 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4877 return std::make_pair(M, LocalIndex);
4878}
4879
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004880llvm::iterator_range<PreprocessingRecord::iterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004881ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4882 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4883 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4884 Mod.NumPreprocessedEntities);
4885
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004886 return llvm::make_range(PreprocessingRecord::iterator(),
4887 PreprocessingRecord::iterator());
Guy Benyei11169dd2012-12-18 14:30:41 +00004888}
4889
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004890llvm::iterator_range<ASTReader::ModuleDeclIterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004891ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004892 return llvm::make_range(
4893 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4894 ModuleDeclIterator(this, &Mod,
4895 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
Guy Benyei11169dd2012-12-18 14:30:41 +00004896}
4897
4898PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4899 PreprocessedEntityID PPID = Index+1;
4900 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4901 ModuleFile &M = *PPInfo.first;
4902 unsigned LocalIndex = PPInfo.second;
4903 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4904
Guy Benyei11169dd2012-12-18 14:30:41 +00004905 if (!PP.getPreprocessingRecord()) {
4906 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004907 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004908 }
4909
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004910 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4911 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4912
4913 llvm::BitstreamEntry Entry =
4914 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4915 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004916 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004917
Guy Benyei11169dd2012-12-18 14:30:41 +00004918 // Read the record.
4919 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4920 ReadSourceLocation(M, PPOffs.End));
4921 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004922 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004923 RecordData Record;
4924 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004925 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4926 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004927 switch (RecType) {
4928 case PPD_MACRO_EXPANSION: {
4929 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004930 IdentifierInfo *Name = nullptr;
4931 MacroDefinition *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004932 if (isBuiltin)
4933 Name = getLocalIdentifier(M, Record[1]);
4934 else {
4935 PreprocessedEntityID
4936 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4937 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4938 }
4939
4940 MacroExpansion *ME;
4941 if (isBuiltin)
4942 ME = new (PPRec) MacroExpansion(Name, Range);
4943 else
4944 ME = new (PPRec) MacroExpansion(Def, Range);
4945
4946 return ME;
4947 }
4948
4949 case PPD_MACRO_DEFINITION: {
4950 // Decode the identifier info and then check again; if the macro is
4951 // still defined and associated with the identifier,
4952 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4953 MacroDefinition *MD
4954 = new (PPRec) MacroDefinition(II, Range);
4955
4956 if (DeserializationListener)
4957 DeserializationListener->MacroDefinitionRead(PPID, MD);
4958
4959 return MD;
4960 }
4961
4962 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004963 const char *FullFileNameStart = Blob.data() + Record[0];
4964 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004965 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004966 if (!FullFileName.empty())
4967 File = PP.getFileManager().getFile(FullFileName);
4968
4969 // FIXME: Stable encoding
4970 InclusionDirective::InclusionKind Kind
4971 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4972 InclusionDirective *ID
4973 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004974 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004975 Record[1], Record[3],
4976 File,
4977 Range);
4978 return ID;
4979 }
4980 }
4981
4982 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4983}
4984
4985/// \brief \arg SLocMapI points at a chunk of a module that contains no
4986/// preprocessed entities or the entities it contains are not the ones we are
4987/// looking for. Find the next module that contains entities and return the ID
4988/// of the first entry.
4989PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4990 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4991 ++SLocMapI;
4992 for (GlobalSLocOffsetMapType::const_iterator
4993 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4994 ModuleFile &M = *SLocMapI->second;
4995 if (M.NumPreprocessedEntities)
4996 return M.BasePreprocessedEntityID;
4997 }
4998
4999 return getTotalNumPreprocessedEntities();
5000}
5001
5002namespace {
5003
5004template <unsigned PPEntityOffset::*PPLoc>
5005struct PPEntityComp {
5006 const ASTReader &Reader;
5007 ModuleFile &M;
5008
5009 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
5010
5011 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
5012 SourceLocation LHS = getLoc(L);
5013 SourceLocation RHS = getLoc(R);
5014 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5015 }
5016
5017 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
5018 SourceLocation LHS = getLoc(L);
5019 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5020 }
5021
5022 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5023 SourceLocation RHS = getLoc(R);
5024 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5025 }
5026
5027 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5028 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
5029 }
5030};
5031
5032}
5033
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005034PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5035 bool EndsAfter) const {
5036 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00005037 return getTotalNumPreprocessedEntities();
5038
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005039 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5040 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00005041 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
5042 "Corrupted global sloc offset map");
5043
5044 if (SLocMapI->second->NumPreprocessedEntities == 0)
5045 return findNextPreprocessedEntity(SLocMapI);
5046
5047 ModuleFile &M = *SLocMapI->second;
5048 typedef const PPEntityOffset *pp_iterator;
5049 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5050 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5051
5052 size_t Count = M.NumPreprocessedEntities;
5053 size_t Half;
5054 pp_iterator First = pp_begin;
5055 pp_iterator PPI;
5056
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005057 if (EndsAfter) {
5058 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5059 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
5060 } else {
5061 // Do a binary search manually instead of using std::lower_bound because
5062 // The end locations of entities may be unordered (when a macro expansion
5063 // is inside another macro argument), but for this case it is not important
5064 // whether we get the first macro expansion or its containing macro.
5065 while (Count > 0) {
5066 Half = Count / 2;
5067 PPI = First;
5068 std::advance(PPI, Half);
5069 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
5070 Loc)) {
5071 First = PPI;
5072 ++First;
5073 Count = Count - Half - 1;
5074 } else
5075 Count = Half;
5076 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005077 }
5078
5079 if (PPI == pp_end)
5080 return findNextPreprocessedEntity(SLocMapI);
5081
5082 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5083}
5084
Guy Benyei11169dd2012-12-18 14:30:41 +00005085/// \brief Returns a pair of [Begin, End) indices of preallocated
5086/// preprocessed entities that \arg Range encompasses.
5087std::pair<unsigned, unsigned>
5088 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5089 if (Range.isInvalid())
5090 return std::make_pair(0,0);
5091 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5092
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005093 PreprocessedEntityID BeginID =
5094 findPreprocessedEntity(Range.getBegin(), false);
5095 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005096 return std::make_pair(BeginID, EndID);
5097}
5098
5099/// \brief Optionally returns true or false if the preallocated preprocessed
5100/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00005101Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00005102 FileID FID) {
5103 if (FID.isInvalid())
5104 return false;
5105
5106 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5107 ModuleFile &M = *PPInfo.first;
5108 unsigned LocalIndex = PPInfo.second;
5109 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5110
5111 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5112 if (Loc.isInvalid())
5113 return false;
5114
5115 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5116 return true;
5117 else
5118 return false;
5119}
5120
5121namespace {
5122 /// \brief Visitor used to search for information about a header file.
5123 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00005124 const FileEntry *FE;
5125
David Blaikie05785d12013-02-20 22:23:23 +00005126 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005127
5128 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005129 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5130 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00005131
5132 static bool visit(ModuleFile &M, void *UserData) {
5133 HeaderFileInfoVisitor *This
5134 = static_cast<HeaderFileInfoVisitor *>(UserData);
5135
Guy Benyei11169dd2012-12-18 14:30:41 +00005136 HeaderFileInfoLookupTable *Table
5137 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5138 if (!Table)
5139 return false;
5140
5141 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00005142 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005143 if (Pos == Table->end())
5144 return false;
5145
5146 This->HFI = *Pos;
5147 return true;
5148 }
5149
David Blaikie05785d12013-02-20 22:23:23 +00005150 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00005151 };
5152}
5153
5154HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005155 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005156 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00005157 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00005158 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005159
5160 return HeaderFileInfo();
5161}
5162
5163void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5164 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00005165 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00005166 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5167 ModuleFile &F = *(*I);
5168 unsigned Idx = 0;
5169 DiagStates.clear();
5170 assert(!Diag.DiagStates.empty());
5171 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5172 while (Idx < F.PragmaDiagMappings.size()) {
5173 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5174 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5175 if (DiagStateID != 0) {
5176 Diag.DiagStatePoints.push_back(
5177 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5178 FullSourceLoc(Loc, SourceMgr)));
5179 continue;
5180 }
5181
5182 assert(DiagStateID == 0);
5183 // A new DiagState was created here.
5184 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5185 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5186 DiagStates.push_back(NewState);
5187 Diag.DiagStatePoints.push_back(
5188 DiagnosticsEngine::DiagStatePoint(NewState,
5189 FullSourceLoc(Loc, SourceMgr)));
5190 while (1) {
5191 assert(Idx < F.PragmaDiagMappings.size() &&
5192 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5193 if (Idx >= F.PragmaDiagMappings.size()) {
5194 break; // Something is messed up but at least avoid infinite loop in
5195 // release build.
5196 }
5197 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5198 if (DiagID == (unsigned)-1) {
5199 break; // no more diag/map pairs for this location.
5200 }
Alp Tokerc726c362014-06-10 09:31:37 +00005201 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5202 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5203 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00005204 }
5205 }
5206 }
5207}
5208
5209/// \brief Get the correct cursor and offset for loading a type.
5210ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5211 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5212 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5213 ModuleFile *M = I->second;
5214 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5215}
5216
5217/// \brief Read and return the type with the given index..
5218///
5219/// The index is the type ID, shifted and minus the number of predefs. This
5220/// routine actually reads the record corresponding to the type at the given
5221/// location. It is a helper routine for GetType, which deals with reading type
5222/// IDs.
5223QualType ASTReader::readTypeRecord(unsigned Index) {
5224 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005225 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005226
5227 // Keep track of where we are in the stream, then jump back there
5228 // after reading this type.
5229 SavedStreamPosition SavedPosition(DeclsCursor);
5230
5231 ReadingKindTracker ReadingKind(Read_Type, *this);
5232
5233 // Note that we are loading a type record.
5234 Deserializing AType(this);
5235
5236 unsigned Idx = 0;
5237 DeclsCursor.JumpToBit(Loc.Offset);
5238 RecordData Record;
5239 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005240 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005241 case TYPE_EXT_QUAL: {
5242 if (Record.size() != 2) {
5243 Error("Incorrect encoding of extended qualifier type");
5244 return QualType();
5245 }
5246 QualType Base = readType(*Loc.F, Record, Idx);
5247 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5248 return Context.getQualifiedType(Base, Quals);
5249 }
5250
5251 case TYPE_COMPLEX: {
5252 if (Record.size() != 1) {
5253 Error("Incorrect encoding of complex type");
5254 return QualType();
5255 }
5256 QualType ElemType = readType(*Loc.F, Record, Idx);
5257 return Context.getComplexType(ElemType);
5258 }
5259
5260 case TYPE_POINTER: {
5261 if (Record.size() != 1) {
5262 Error("Incorrect encoding of pointer type");
5263 return QualType();
5264 }
5265 QualType PointeeType = readType(*Loc.F, Record, Idx);
5266 return Context.getPointerType(PointeeType);
5267 }
5268
Reid Kleckner8a365022013-06-24 17:51:48 +00005269 case TYPE_DECAYED: {
5270 if (Record.size() != 1) {
5271 Error("Incorrect encoding of decayed type");
5272 return QualType();
5273 }
5274 QualType OriginalType = readType(*Loc.F, Record, Idx);
5275 QualType DT = Context.getAdjustedParameterType(OriginalType);
5276 if (!isa<DecayedType>(DT))
5277 Error("Decayed type does not decay");
5278 return DT;
5279 }
5280
Reid Kleckner0503a872013-12-05 01:23:43 +00005281 case TYPE_ADJUSTED: {
5282 if (Record.size() != 2) {
5283 Error("Incorrect encoding of adjusted type");
5284 return QualType();
5285 }
5286 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5287 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5288 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5289 }
5290
Guy Benyei11169dd2012-12-18 14:30:41 +00005291 case TYPE_BLOCK_POINTER: {
5292 if (Record.size() != 1) {
5293 Error("Incorrect encoding of block pointer type");
5294 return QualType();
5295 }
5296 QualType PointeeType = readType(*Loc.F, Record, Idx);
5297 return Context.getBlockPointerType(PointeeType);
5298 }
5299
5300 case TYPE_LVALUE_REFERENCE: {
5301 if (Record.size() != 2) {
5302 Error("Incorrect encoding of lvalue reference type");
5303 return QualType();
5304 }
5305 QualType PointeeType = readType(*Loc.F, Record, Idx);
5306 return Context.getLValueReferenceType(PointeeType, Record[1]);
5307 }
5308
5309 case TYPE_RVALUE_REFERENCE: {
5310 if (Record.size() != 1) {
5311 Error("Incorrect encoding of rvalue reference type");
5312 return QualType();
5313 }
5314 QualType PointeeType = readType(*Loc.F, Record, Idx);
5315 return Context.getRValueReferenceType(PointeeType);
5316 }
5317
5318 case TYPE_MEMBER_POINTER: {
5319 if (Record.size() != 2) {
5320 Error("Incorrect encoding of member pointer type");
5321 return QualType();
5322 }
5323 QualType PointeeType = readType(*Loc.F, Record, Idx);
5324 QualType ClassType = readType(*Loc.F, Record, Idx);
5325 if (PointeeType.isNull() || ClassType.isNull())
5326 return QualType();
5327
5328 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5329 }
5330
5331 case TYPE_CONSTANT_ARRAY: {
5332 QualType ElementType = readType(*Loc.F, Record, Idx);
5333 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5334 unsigned IndexTypeQuals = Record[2];
5335 unsigned Idx = 3;
5336 llvm::APInt Size = ReadAPInt(Record, Idx);
5337 return Context.getConstantArrayType(ElementType, Size,
5338 ASM, IndexTypeQuals);
5339 }
5340
5341 case TYPE_INCOMPLETE_ARRAY: {
5342 QualType ElementType = readType(*Loc.F, Record, Idx);
5343 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5344 unsigned IndexTypeQuals = Record[2];
5345 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5346 }
5347
5348 case TYPE_VARIABLE_ARRAY: {
5349 QualType ElementType = readType(*Loc.F, Record, Idx);
5350 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5351 unsigned IndexTypeQuals = Record[2];
5352 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5353 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5354 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5355 ASM, IndexTypeQuals,
5356 SourceRange(LBLoc, RBLoc));
5357 }
5358
5359 case TYPE_VECTOR: {
5360 if (Record.size() != 3) {
5361 Error("incorrect encoding of vector type in AST file");
5362 return QualType();
5363 }
5364
5365 QualType ElementType = readType(*Loc.F, Record, Idx);
5366 unsigned NumElements = Record[1];
5367 unsigned VecKind = Record[2];
5368 return Context.getVectorType(ElementType, NumElements,
5369 (VectorType::VectorKind)VecKind);
5370 }
5371
5372 case TYPE_EXT_VECTOR: {
5373 if (Record.size() != 3) {
5374 Error("incorrect encoding of extended vector type in AST file");
5375 return QualType();
5376 }
5377
5378 QualType ElementType = readType(*Loc.F, Record, Idx);
5379 unsigned NumElements = Record[1];
5380 return Context.getExtVectorType(ElementType, NumElements);
5381 }
5382
5383 case TYPE_FUNCTION_NO_PROTO: {
5384 if (Record.size() != 6) {
5385 Error("incorrect encoding of no-proto function type");
5386 return QualType();
5387 }
5388 QualType ResultType = readType(*Loc.F, Record, Idx);
5389 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5390 (CallingConv)Record[4], Record[5]);
5391 return Context.getFunctionNoProtoType(ResultType, Info);
5392 }
5393
5394 case TYPE_FUNCTION_PROTO: {
5395 QualType ResultType = readType(*Loc.F, Record, Idx);
5396
5397 FunctionProtoType::ExtProtoInfo EPI;
5398 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5399 /*hasregparm*/ Record[2],
5400 /*regparm*/ Record[3],
5401 static_cast<CallingConv>(Record[4]),
5402 /*produces*/ Record[5]);
5403
5404 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005405
5406 EPI.Variadic = Record[Idx++];
5407 EPI.HasTrailingReturn = Record[Idx++];
5408 EPI.TypeQuals = Record[Idx++];
5409 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005410 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005411 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005412
5413 unsigned NumParams = Record[Idx++];
5414 SmallVector<QualType, 16> ParamTypes;
5415 for (unsigned I = 0; I != NumParams; ++I)
5416 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5417
Jordan Rose5c382722013-03-08 21:51:21 +00005418 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005419 }
5420
5421 case TYPE_UNRESOLVED_USING: {
5422 unsigned Idx = 0;
5423 return Context.getTypeDeclType(
5424 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5425 }
5426
5427 case TYPE_TYPEDEF: {
5428 if (Record.size() != 2) {
5429 Error("incorrect encoding of typedef type");
5430 return QualType();
5431 }
5432 unsigned Idx = 0;
5433 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5434 QualType Canonical = readType(*Loc.F, Record, Idx);
5435 if (!Canonical.isNull())
5436 Canonical = Context.getCanonicalType(Canonical);
5437 return Context.getTypedefType(Decl, Canonical);
5438 }
5439
5440 case TYPE_TYPEOF_EXPR:
5441 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5442
5443 case TYPE_TYPEOF: {
5444 if (Record.size() != 1) {
5445 Error("incorrect encoding of typeof(type) in AST file");
5446 return QualType();
5447 }
5448 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5449 return Context.getTypeOfType(UnderlyingType);
5450 }
5451
5452 case TYPE_DECLTYPE: {
5453 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5454 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5455 }
5456
5457 case TYPE_UNARY_TRANSFORM: {
5458 QualType BaseType = readType(*Loc.F, Record, Idx);
5459 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5460 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5461 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5462 }
5463
Richard Smith74aeef52013-04-26 16:15:35 +00005464 case TYPE_AUTO: {
5465 QualType Deduced = readType(*Loc.F, Record, Idx);
5466 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005467 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005468 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005469 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005470
5471 case TYPE_RECORD: {
5472 if (Record.size() != 2) {
5473 Error("incorrect encoding of record type");
5474 return QualType();
5475 }
5476 unsigned Idx = 0;
5477 bool IsDependent = Record[Idx++];
5478 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5479 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5480 QualType T = Context.getRecordType(RD);
5481 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5482 return T;
5483 }
5484
5485 case TYPE_ENUM: {
5486 if (Record.size() != 2) {
5487 Error("incorrect encoding of enum type");
5488 return QualType();
5489 }
5490 unsigned Idx = 0;
5491 bool IsDependent = Record[Idx++];
5492 QualType T
5493 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5494 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5495 return T;
5496 }
5497
5498 case TYPE_ATTRIBUTED: {
5499 if (Record.size() != 3) {
5500 Error("incorrect encoding of attributed type");
5501 return QualType();
5502 }
5503 QualType modifiedType = readType(*Loc.F, Record, Idx);
5504 QualType equivalentType = readType(*Loc.F, Record, Idx);
5505 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5506 return Context.getAttributedType(kind, modifiedType, equivalentType);
5507 }
5508
5509 case TYPE_PAREN: {
5510 if (Record.size() != 1) {
5511 Error("incorrect encoding of paren type");
5512 return QualType();
5513 }
5514 QualType InnerType = readType(*Loc.F, Record, Idx);
5515 return Context.getParenType(InnerType);
5516 }
5517
5518 case TYPE_PACK_EXPANSION: {
5519 if (Record.size() != 2) {
5520 Error("incorrect encoding of pack expansion type");
5521 return QualType();
5522 }
5523 QualType Pattern = readType(*Loc.F, Record, Idx);
5524 if (Pattern.isNull())
5525 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005526 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005527 if (Record[1])
5528 NumExpansions = Record[1] - 1;
5529 return Context.getPackExpansionType(Pattern, NumExpansions);
5530 }
5531
5532 case TYPE_ELABORATED: {
5533 unsigned Idx = 0;
5534 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5535 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5536 QualType NamedType = readType(*Loc.F, Record, Idx);
5537 return Context.getElaboratedType(Keyword, NNS, NamedType);
5538 }
5539
5540 case TYPE_OBJC_INTERFACE: {
5541 unsigned Idx = 0;
5542 ObjCInterfaceDecl *ItfD
5543 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5544 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5545 }
5546
5547 case TYPE_OBJC_OBJECT: {
5548 unsigned Idx = 0;
5549 QualType Base = readType(*Loc.F, Record, Idx);
5550 unsigned NumProtos = Record[Idx++];
5551 SmallVector<ObjCProtocolDecl*, 4> Protos;
5552 for (unsigned I = 0; I != NumProtos; ++I)
5553 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5554 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5555 }
5556
5557 case TYPE_OBJC_OBJECT_POINTER: {
5558 unsigned Idx = 0;
5559 QualType Pointee = readType(*Loc.F, Record, Idx);
5560 return Context.getObjCObjectPointerType(Pointee);
5561 }
5562
5563 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5564 unsigned Idx = 0;
5565 QualType Parm = readType(*Loc.F, Record, Idx);
5566 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005567 return Context.getSubstTemplateTypeParmType(
5568 cast<TemplateTypeParmType>(Parm),
5569 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005570 }
5571
5572 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5573 unsigned Idx = 0;
5574 QualType Parm = readType(*Loc.F, Record, Idx);
5575 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5576 return Context.getSubstTemplateTypeParmPackType(
5577 cast<TemplateTypeParmType>(Parm),
5578 ArgPack);
5579 }
5580
5581 case TYPE_INJECTED_CLASS_NAME: {
5582 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5583 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5584 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5585 // for AST reading, too much interdependencies.
Richard Smith6377f8f2014-10-21 21:15:18 +00005586 const Type *T = nullptr;
5587 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5588 if (const Type *Existing = DI->getTypeForDecl()) {
5589 T = Existing;
5590 break;
5591 }
5592 }
5593 if (!T) {
Richard Smithf17fdbd2014-04-24 02:25:27 +00005594 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
Richard Smith6377f8f2014-10-21 21:15:18 +00005595 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5596 DI->setTypeForDecl(T);
5597 }
Richard Smithf17fdbd2014-04-24 02:25:27 +00005598 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005599 }
5600
5601 case TYPE_TEMPLATE_TYPE_PARM: {
5602 unsigned Idx = 0;
5603 unsigned Depth = Record[Idx++];
5604 unsigned Index = Record[Idx++];
5605 bool Pack = Record[Idx++];
5606 TemplateTypeParmDecl *D
5607 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5608 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5609 }
5610
5611 case TYPE_DEPENDENT_NAME: {
5612 unsigned Idx = 0;
5613 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5614 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5615 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5616 QualType Canon = readType(*Loc.F, Record, Idx);
5617 if (!Canon.isNull())
5618 Canon = Context.getCanonicalType(Canon);
5619 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5620 }
5621
5622 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5623 unsigned Idx = 0;
5624 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5625 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5626 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5627 unsigned NumArgs = Record[Idx++];
5628 SmallVector<TemplateArgument, 8> Args;
5629 Args.reserve(NumArgs);
5630 while (NumArgs--)
5631 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5632 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5633 Args.size(), Args.data());
5634 }
5635
5636 case TYPE_DEPENDENT_SIZED_ARRAY: {
5637 unsigned Idx = 0;
5638
5639 // ArrayType
5640 QualType ElementType = readType(*Loc.F, Record, Idx);
5641 ArrayType::ArraySizeModifier ASM
5642 = (ArrayType::ArraySizeModifier)Record[Idx++];
5643 unsigned IndexTypeQuals = Record[Idx++];
5644
5645 // DependentSizedArrayType
5646 Expr *NumElts = ReadExpr(*Loc.F);
5647 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5648
5649 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5650 IndexTypeQuals, Brackets);
5651 }
5652
5653 case TYPE_TEMPLATE_SPECIALIZATION: {
5654 unsigned Idx = 0;
5655 bool IsDependent = Record[Idx++];
5656 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5657 SmallVector<TemplateArgument, 8> Args;
5658 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5659 QualType Underlying = readType(*Loc.F, Record, Idx);
5660 QualType T;
5661 if (Underlying.isNull())
5662 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5663 Args.size());
5664 else
5665 T = Context.getTemplateSpecializationType(Name, Args.data(),
5666 Args.size(), Underlying);
5667 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5668 return T;
5669 }
5670
5671 case TYPE_ATOMIC: {
5672 if (Record.size() != 1) {
5673 Error("Incorrect encoding of atomic type");
5674 return QualType();
5675 }
5676 QualType ValueType = readType(*Loc.F, Record, Idx);
5677 return Context.getAtomicType(ValueType);
5678 }
5679 }
5680 llvm_unreachable("Invalid TypeCode!");
5681}
5682
Richard Smith564417a2014-03-20 21:47:22 +00005683void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5684 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005685 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005686 const RecordData &Record, unsigned &Idx) {
5687 ExceptionSpecificationType EST =
5688 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005689 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005690 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005691 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005692 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005693 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005694 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005695 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005696 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005697 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5698 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005699 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005700 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005701 }
5702}
5703
Guy Benyei11169dd2012-12-18 14:30:41 +00005704class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5705 ASTReader &Reader;
5706 ModuleFile &F;
5707 const ASTReader::RecordData &Record;
5708 unsigned &Idx;
5709
5710 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5711 unsigned &I) {
5712 return Reader.ReadSourceLocation(F, R, I);
5713 }
5714
5715 template<typename T>
5716 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5717 return Reader.ReadDeclAs<T>(F, Record, Idx);
5718 }
5719
5720public:
5721 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5722 const ASTReader::RecordData &Record, unsigned &Idx)
5723 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5724 { }
5725
5726 // We want compile-time assurance that we've enumerated all of
5727 // these, so unfortunately we have to declare them first, then
5728 // define them out-of-line.
5729#define ABSTRACT_TYPELOC(CLASS, PARENT)
5730#define TYPELOC(CLASS, PARENT) \
5731 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5732#include "clang/AST/TypeLocNodes.def"
5733
5734 void VisitFunctionTypeLoc(FunctionTypeLoc);
5735 void VisitArrayTypeLoc(ArrayTypeLoc);
5736};
5737
5738void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5739 // nothing to do
5740}
5741void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5742 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5743 if (TL.needsExtraLocalData()) {
5744 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5745 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5746 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5747 TL.setModeAttr(Record[Idx++]);
5748 }
5749}
5750void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5751 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5752}
5753void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5754 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5755}
Reid Kleckner8a365022013-06-24 17:51:48 +00005756void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5757 // nothing to do
5758}
Reid Kleckner0503a872013-12-05 01:23:43 +00005759void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5760 // nothing to do
5761}
Guy Benyei11169dd2012-12-18 14:30:41 +00005762void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5763 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5764}
5765void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5766 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5767}
5768void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5769 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5770}
5771void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5772 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5773 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5774}
5775void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5776 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5777 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5778 if (Record[Idx++])
5779 TL.setSizeExpr(Reader.ReadExpr(F));
5780 else
Craig Toppera13603a2014-05-22 05:54:18 +00005781 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005782}
5783void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5784 VisitArrayTypeLoc(TL);
5785}
5786void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5787 VisitArrayTypeLoc(TL);
5788}
5789void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5790 VisitArrayTypeLoc(TL);
5791}
5792void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5793 DependentSizedArrayTypeLoc TL) {
5794 VisitArrayTypeLoc(TL);
5795}
5796void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5797 DependentSizedExtVectorTypeLoc TL) {
5798 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5799}
5800void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5801 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5802}
5803void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5804 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5805}
5806void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5807 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5808 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5809 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5810 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005811 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5812 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005813 }
5814}
5815void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5816 VisitFunctionTypeLoc(TL);
5817}
5818void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5819 VisitFunctionTypeLoc(TL);
5820}
5821void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5822 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5823}
5824void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5825 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5826}
5827void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5828 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5829 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5830 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5831}
5832void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5833 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5834 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5835 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5836 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5837}
5838void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5839 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5840}
5841void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5842 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5843 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5844 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5845 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5846}
5847void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5848 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5849}
5850void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5851 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5852}
5853void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5854 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5855}
5856void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5857 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5858 if (TL.hasAttrOperand()) {
5859 SourceRange range;
5860 range.setBegin(ReadSourceLocation(Record, Idx));
5861 range.setEnd(ReadSourceLocation(Record, Idx));
5862 TL.setAttrOperandParensRange(range);
5863 }
5864 if (TL.hasAttrExprOperand()) {
5865 if (Record[Idx++])
5866 TL.setAttrExprOperand(Reader.ReadExpr(F));
5867 else
Craig Toppera13603a2014-05-22 05:54:18 +00005868 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005869 } else if (TL.hasAttrEnumOperand())
5870 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5871}
5872void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5873 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5874}
5875void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5876 SubstTemplateTypeParmTypeLoc TL) {
5877 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5878}
5879void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5880 SubstTemplateTypeParmPackTypeLoc TL) {
5881 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5882}
5883void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5884 TemplateSpecializationTypeLoc TL) {
5885 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5886 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5887 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5888 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5889 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5890 TL.setArgLocInfo(i,
5891 Reader.GetTemplateArgumentLocInfo(F,
5892 TL.getTypePtr()->getArg(i).getKind(),
5893 Record, Idx));
5894}
5895void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5896 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5897 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5898}
5899void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5900 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5901 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5902}
5903void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5904 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5905}
5906void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5907 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5908 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5909 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5910}
5911void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5912 DependentTemplateSpecializationTypeLoc TL) {
5913 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5914 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5915 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5916 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5917 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5918 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5919 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5920 TL.setArgLocInfo(I,
5921 Reader.GetTemplateArgumentLocInfo(F,
5922 TL.getTypePtr()->getArg(I).getKind(),
5923 Record, Idx));
5924}
5925void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5926 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5927}
5928void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5929 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5930}
5931void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5932 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5933 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5934 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5935 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5936 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5937}
5938void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5939 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5940}
5941void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5942 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5943 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5944 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5945}
5946
5947TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5948 const RecordData &Record,
5949 unsigned &Idx) {
5950 QualType InfoTy = readType(F, Record, Idx);
5951 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005952 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005953
5954 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5955 TypeLocReader TLR(*this, F, Record, Idx);
5956 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5957 TLR.Visit(TL);
5958 return TInfo;
5959}
5960
5961QualType ASTReader::GetType(TypeID ID) {
5962 unsigned FastQuals = ID & Qualifiers::FastMask;
5963 unsigned Index = ID >> Qualifiers::FastWidth;
5964
5965 if (Index < NUM_PREDEF_TYPE_IDS) {
5966 QualType T;
5967 switch ((PredefinedTypeIDs)Index) {
5968 case PREDEF_TYPE_NULL_ID: return QualType();
5969 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5970 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5971
5972 case PREDEF_TYPE_CHAR_U_ID:
5973 case PREDEF_TYPE_CHAR_S_ID:
5974 // FIXME: Check that the signedness of CharTy is correct!
5975 T = Context.CharTy;
5976 break;
5977
5978 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5979 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5980 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5981 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5982 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5983 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5984 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5985 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5986 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5987 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5988 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5989 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5990 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5991 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5992 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5993 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5994 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5995 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5996 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5997 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5998 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5999 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
6000 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
6001 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
6002 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
6003 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
6004 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
6005 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00006006 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
6007 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
6008 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
6009 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
6010 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
6011 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00006012 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00006013 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00006014 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
6015
6016 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
6017 T = Context.getAutoRRefDeductType();
6018 break;
6019
6020 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6021 T = Context.ARCUnbridgedCastTy;
6022 break;
6023
6024 case PREDEF_TYPE_VA_LIST_TAG:
6025 T = Context.getVaListTagType();
6026 break;
6027
6028 case PREDEF_TYPE_BUILTIN_FN:
6029 T = Context.BuiltinFnTy;
6030 break;
6031 }
6032
6033 assert(!T.isNull() && "Unknown predefined type");
6034 return T.withFastQualifiers(FastQuals);
6035 }
6036
6037 Index -= NUM_PREDEF_TYPE_IDS;
6038 assert(Index < TypesLoaded.size() && "Type index out-of-range");
6039 if (TypesLoaded[Index].isNull()) {
6040 TypesLoaded[Index] = readTypeRecord(Index);
6041 if (TypesLoaded[Index].isNull())
6042 return QualType();
6043
6044 TypesLoaded[Index]->setFromAST();
6045 if (DeserializationListener)
6046 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6047 TypesLoaded[Index]);
6048 }
6049
6050 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6051}
6052
6053QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6054 return GetType(getGlobalTypeID(F, LocalID));
6055}
6056
6057serialization::TypeID
6058ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6059 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6060 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
6061
6062 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6063 return LocalID;
6064
6065 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6066 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
6067 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
6068
6069 unsigned GlobalIndex = LocalIndex + I->second;
6070 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
6071}
6072
6073TemplateArgumentLocInfo
6074ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6075 TemplateArgument::ArgKind Kind,
6076 const RecordData &Record,
6077 unsigned &Index) {
6078 switch (Kind) {
6079 case TemplateArgument::Expression:
6080 return ReadExpr(F);
6081 case TemplateArgument::Type:
6082 return GetTypeSourceInfo(F, Record, Index);
6083 case TemplateArgument::Template: {
6084 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6085 Index);
6086 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6087 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6088 SourceLocation());
6089 }
6090 case TemplateArgument::TemplateExpansion: {
6091 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6092 Index);
6093 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6094 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6095 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6096 EllipsisLoc);
6097 }
6098 case TemplateArgument::Null:
6099 case TemplateArgument::Integral:
6100 case TemplateArgument::Declaration:
6101 case TemplateArgument::NullPtr:
6102 case TemplateArgument::Pack:
6103 // FIXME: Is this right?
6104 return TemplateArgumentLocInfo();
6105 }
6106 llvm_unreachable("unexpected template argument loc");
6107}
6108
6109TemplateArgumentLoc
6110ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6111 const RecordData &Record, unsigned &Index) {
6112 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6113
6114 if (Arg.getKind() == TemplateArgument::Expression) {
6115 if (Record[Index++]) // bool InfoHasSameExpr.
6116 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6117 }
6118 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6119 Record, Index));
6120}
6121
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00006122const ASTTemplateArgumentListInfo*
6123ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6124 const RecordData &Record,
6125 unsigned &Index) {
6126 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6127 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6128 unsigned NumArgsAsWritten = Record[Index++];
6129 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6130 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6131 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6132 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6133}
6134
Guy Benyei11169dd2012-12-18 14:30:41 +00006135Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6136 return GetDecl(ID);
6137}
6138
Richard Smith50895422015-01-31 03:04:55 +00006139template<typename TemplateSpecializationDecl>
6140static void completeRedeclChainForTemplateSpecialization(Decl *D) {
6141 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D))
6142 TSD->getSpecializedTemplate()->LoadLazySpecializations();
6143}
6144
Richard Smith053f6c62014-05-16 23:01:30 +00006145void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00006146 if (NumCurrentElementsDeserializing) {
6147 // We arrange to not care about the complete redeclaration chain while we're
6148 // deserializing. Just remember that the AST has marked this one as complete
6149 // but that it's not actually complete yet, so we know we still need to
6150 // complete it later.
6151 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6152 return;
6153 }
6154
Richard Smith053f6c62014-05-16 23:01:30 +00006155 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6156
Richard Smith053f6c62014-05-16 23:01:30 +00006157 // If this is a named declaration, complete it by looking it up
6158 // within its context.
6159 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00006160 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00006161 // all mergeable entities within it.
6162 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6163 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6164 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6165 auto *II = Name.getAsIdentifierInfo();
6166 if (isa<TranslationUnitDecl>(DC) && II) {
6167 // Outside of C++, we don't have a lookup table for the TU, so update
6168 // the identifier instead. In C++, either way should work fine.
6169 if (II->isOutOfDate())
6170 updateOutOfDateIdentifier(*II);
6171 } else
6172 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00006173 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6174 // FIXME: It'd be nice to do something a bit more targeted here.
6175 D->getDeclContext()->decls_begin();
Richard Smith053f6c62014-05-16 23:01:30 +00006176 }
6177 }
Richard Smith50895422015-01-31 03:04:55 +00006178
6179 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
6180 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
6181 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
6182 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
6183 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6184 if (auto *Template = FD->getPrimaryTemplate())
6185 Template->LoadLazySpecializations();
6186 }
Richard Smith053f6c62014-05-16 23:01:30 +00006187}
6188
Richard Smithcd45dbc2014-04-19 03:48:30 +00006189uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6190 const RecordData &Record,
6191 unsigned &Idx) {
6192 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6193 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00006194 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006195 }
6196
Guy Benyei11169dd2012-12-18 14:30:41 +00006197 unsigned LocalID = Record[Idx++];
6198 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6199}
6200
6201CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6202 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006203 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006204 SavedStreamPosition SavedPosition(Cursor);
6205 Cursor.JumpToBit(Loc.Offset);
6206 ReadingKindTracker ReadingKind(Read_Decl, *this);
6207 RecordData Record;
6208 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00006209 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00006210 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006211 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00006212 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006213 }
6214
6215 unsigned Idx = 0;
6216 unsigned NumBases = Record[Idx++];
6217 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6218 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6219 for (unsigned I = 0; I != NumBases; ++I)
6220 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6221 return Bases;
6222}
6223
6224serialization::DeclID
6225ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6226 if (LocalID < NUM_PREDEF_DECL_IDS)
6227 return LocalID;
6228
6229 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6230 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6231 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6232
6233 return LocalID + I->second;
6234}
6235
6236bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6237 ModuleFile &M) const {
6238 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6239 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6240 return &M == I->second;
6241}
6242
Douglas Gregor9f782892013-01-21 15:25:38 +00006243ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006244 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00006245 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006246 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6247 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6248 return I->second;
6249}
6250
6251SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6252 if (ID < NUM_PREDEF_DECL_IDS)
6253 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006254
Guy Benyei11169dd2012-12-18 14:30:41 +00006255 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6256
6257 if (Index > DeclsLoaded.size()) {
6258 Error("declaration ID out-of-range for AST file");
6259 return SourceLocation();
6260 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006261
Guy Benyei11169dd2012-12-18 14:30:41 +00006262 if (Decl *D = DeclsLoaded[Index])
6263 return D->getLocation();
6264
6265 unsigned RawLocation = 0;
6266 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6267 return ReadSourceLocation(*Rec.F, RawLocation);
6268}
6269
Richard Smithcd45dbc2014-04-19 03:48:30 +00006270Decl *ASTReader::GetExistingDecl(DeclID ID) {
6271 if (ID < NUM_PREDEF_DECL_IDS) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006272 switch ((PredefinedDeclIDs)ID) {
6273 case PREDEF_DECL_NULL_ID:
Craig Toppera13603a2014-05-22 05:54:18 +00006274 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006275
Guy Benyei11169dd2012-12-18 14:30:41 +00006276 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6277 return Context.getTranslationUnitDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006278
Guy Benyei11169dd2012-12-18 14:30:41 +00006279 case PREDEF_DECL_OBJC_ID_ID:
6280 return Context.getObjCIdDecl();
6281
6282 case PREDEF_DECL_OBJC_SEL_ID:
6283 return Context.getObjCSelDecl();
6284
6285 case PREDEF_DECL_OBJC_CLASS_ID:
6286 return Context.getObjCClassDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006287
Guy Benyei11169dd2012-12-18 14:30:41 +00006288 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6289 return Context.getObjCProtocolDecl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006290
Guy Benyei11169dd2012-12-18 14:30:41 +00006291 case PREDEF_DECL_INT_128_ID:
6292 return Context.getInt128Decl();
6293
6294 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6295 return Context.getUInt128Decl();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006296
Guy Benyei11169dd2012-12-18 14:30:41 +00006297 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6298 return Context.getObjCInstanceTypeDecl();
6299
6300 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6301 return Context.getBuiltinVaListDecl();
6302 }
6303 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006304
Guy Benyei11169dd2012-12-18 14:30:41 +00006305 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6306
6307 if (Index >= DeclsLoaded.size()) {
6308 assert(0 && "declaration ID out-of-range for AST file");
6309 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006310 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006311 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006312
6313 return DeclsLoaded[Index];
6314}
6315
6316Decl *ASTReader::GetDecl(DeclID ID) {
6317 if (ID < NUM_PREDEF_DECL_IDS)
6318 return GetExistingDecl(ID);
6319
6320 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6321
6322 if (Index >= DeclsLoaded.size()) {
6323 assert(0 && "declaration ID out-of-range for AST file");
6324 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006325 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006326 }
6327
Guy Benyei11169dd2012-12-18 14:30:41 +00006328 if (!DeclsLoaded[Index]) {
6329 ReadDeclRecord(ID);
6330 if (DeserializationListener)
6331 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6332 }
6333
6334 return DeclsLoaded[Index];
6335}
6336
6337DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6338 DeclID GlobalID) {
6339 if (GlobalID < NUM_PREDEF_DECL_IDS)
6340 return GlobalID;
6341
6342 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6343 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6344 ModuleFile *Owner = I->second;
6345
6346 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6347 = M.GlobalToLocalDeclIDs.find(Owner);
6348 if (Pos == M.GlobalToLocalDeclIDs.end())
6349 return 0;
6350
6351 return GlobalID - Owner->BaseDeclID + Pos->second;
6352}
6353
6354serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6355 const RecordData &Record,
6356 unsigned &Idx) {
6357 if (Idx >= Record.size()) {
6358 Error("Corrupted AST file");
6359 return 0;
6360 }
6361
6362 return getGlobalDeclID(F, Record[Idx++]);
6363}
6364
6365/// \brief Resolve the offset of a statement into a statement.
6366///
6367/// This operation will read a new statement from the external
6368/// source each time it is called, and is meant to be used via a
6369/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6370Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6371 // Switch case IDs are per Decl.
6372 ClearSwitchCaseIDs();
6373
6374 // Offset here is a global offset across the entire chain.
6375 RecordLocation Loc = getLocalBitOffset(Offset);
6376 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6377 return ReadStmtFromStream(*Loc.F);
6378}
6379
6380namespace {
6381 class FindExternalLexicalDeclsVisitor {
6382 ASTReader &Reader;
6383 const DeclContext *DC;
6384 bool (*isKindWeWant)(Decl::Kind);
6385
6386 SmallVectorImpl<Decl*> &Decls;
6387 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6388
6389 public:
6390 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6391 bool (*isKindWeWant)(Decl::Kind),
6392 SmallVectorImpl<Decl*> &Decls)
6393 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6394 {
6395 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6396 PredefsVisited[I] = false;
6397 }
6398
6399 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6400 if (Preorder)
6401 return false;
6402
6403 FindExternalLexicalDeclsVisitor *This
6404 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6405
6406 ModuleFile::DeclContextInfosMap::iterator Info
6407 = M.DeclContextInfos.find(This->DC);
6408 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6409 return false;
6410
6411 // Load all of the declaration IDs
6412 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6413 *IDE = ID + Info->second.NumLexicalDecls;
6414 ID != IDE; ++ID) {
6415 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6416 continue;
6417
6418 // Don't add predefined declarations to the lexical context more
6419 // than once.
6420 if (ID->second < NUM_PREDEF_DECL_IDS) {
6421 if (This->PredefsVisited[ID->second])
6422 continue;
6423
6424 This->PredefsVisited[ID->second] = true;
6425 }
6426
6427 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6428 if (!This->DC->isDeclInLexicalTraversal(D))
6429 This->Decls.push_back(D);
6430 }
6431 }
6432
6433 return false;
6434 }
6435 };
6436}
6437
6438ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6439 bool (*isKindWeWant)(Decl::Kind),
6440 SmallVectorImpl<Decl*> &Decls) {
6441 // There might be lexical decls in multiple modules, for the TU at
6442 // least. Walk all of the modules in the order they were loaded.
6443 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6444 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6445 ++NumLexicalDeclContextsRead;
6446 return ELR_Success;
6447}
6448
6449namespace {
6450
6451class DeclIDComp {
6452 ASTReader &Reader;
6453 ModuleFile &Mod;
6454
6455public:
6456 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6457
6458 bool operator()(LocalDeclID L, LocalDeclID R) const {
6459 SourceLocation LHS = getLocation(L);
6460 SourceLocation RHS = getLocation(R);
6461 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6462 }
6463
6464 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6465 SourceLocation RHS = getLocation(R);
6466 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6467 }
6468
6469 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6470 SourceLocation LHS = getLocation(L);
6471 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6472 }
6473
6474 SourceLocation getLocation(LocalDeclID ID) const {
6475 return Reader.getSourceManager().getFileLoc(
6476 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6477 }
6478};
6479
6480}
6481
6482void ASTReader::FindFileRegionDecls(FileID File,
6483 unsigned Offset, unsigned Length,
6484 SmallVectorImpl<Decl *> &Decls) {
6485 SourceManager &SM = getSourceManager();
6486
6487 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6488 if (I == FileDeclIDs.end())
6489 return;
6490
6491 FileDeclsInfo &DInfo = I->second;
6492 if (DInfo.Decls.empty())
6493 return;
6494
6495 SourceLocation
6496 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6497 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6498
6499 DeclIDComp DIDComp(*this, *DInfo.Mod);
6500 ArrayRef<serialization::LocalDeclID>::iterator
6501 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6502 BeginLoc, DIDComp);
6503 if (BeginIt != DInfo.Decls.begin())
6504 --BeginIt;
6505
6506 // If we are pointing at a top-level decl inside an objc container, we need
6507 // to backtrack until we find it otherwise we will fail to report that the
6508 // region overlaps with an objc container.
6509 while (BeginIt != DInfo.Decls.begin() &&
6510 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6511 ->isTopLevelDeclInObjCContainer())
6512 --BeginIt;
6513
6514 ArrayRef<serialization::LocalDeclID>::iterator
6515 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6516 EndLoc, DIDComp);
6517 if (EndIt != DInfo.Decls.end())
6518 ++EndIt;
6519
6520 for (ArrayRef<serialization::LocalDeclID>::iterator
6521 DIt = BeginIt; DIt != EndIt; ++DIt)
6522 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6523}
6524
6525namespace {
6526 /// \brief ModuleFile visitor used to perform name lookup into a
6527 /// declaration context.
6528 class DeclContextNameLookupVisitor {
6529 ASTReader &Reader;
Richard Smith8c913ec2014-08-14 02:21:01 +00006530 ArrayRef<const DeclContext *> Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006531 DeclarationName Name;
6532 SmallVectorImpl<NamedDecl *> &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006533 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet;
Guy Benyei11169dd2012-12-18 14:30:41 +00006534
6535 public:
Richard Smith8c913ec2014-08-14 02:21:01 +00006536 DeclContextNameLookupVisitor(ASTReader &Reader,
6537 ArrayRef<const DeclContext *> Contexts,
Guy Benyei11169dd2012-12-18 14:30:41 +00006538 DeclarationName Name,
Richard Smith52874ec2015-02-13 20:17:14 +00006539 SmallVectorImpl<NamedDecl *> &Decls,
6540 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet)
6541 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls),
6542 DeclSet(DeclSet) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006543
6544 static bool visit(ModuleFile &M, void *UserData) {
6545 DeclContextNameLookupVisitor *This
6546 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6547
6548 // Check whether we have any visible declaration information for
6549 // this context in this module.
6550 ModuleFile::DeclContextInfosMap::iterator Info;
6551 bool FoundInfo = false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006552 for (auto *DC : This->Contexts) {
6553 Info = M.DeclContextInfos.find(DC);
6554 if (Info != M.DeclContextInfos.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00006555 Info->second.NameLookupTableData) {
6556 FoundInfo = true;
6557 break;
6558 }
6559 }
6560
6561 if (!FoundInfo)
6562 return false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006563
Guy Benyei11169dd2012-12-18 14:30:41 +00006564 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006565 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006566 Info->second.NameLookupTableData;
6567 ASTDeclContextNameLookupTable::iterator Pos
6568 = LookupTable->find(This->Name);
6569 if (Pos == LookupTable->end())
6570 return false;
6571
6572 bool FoundAnything = false;
6573 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6574 for (; Data.first != Data.second; ++Data.first) {
6575 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6576 if (!ND)
6577 continue;
6578
6579 if (ND->getDeclName() != This->Name) {
6580 // A name might be null because the decl's redeclarable part is
6581 // currently read before reading its name. The lookup is triggered by
6582 // building that decl (likely indirectly), and so it is later in the
6583 // sense of "already existing" and can be ignored here.
Richard Smith8c913ec2014-08-14 02:21:01 +00006584 // FIXME: This should not happen; deserializing declarations should
6585 // not perform lookups since that can lead to deserialization cycles.
Guy Benyei11169dd2012-12-18 14:30:41 +00006586 continue;
6587 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006588
Guy Benyei11169dd2012-12-18 14:30:41 +00006589 // Record this declaration.
6590 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006591 if (This->DeclSet.insert(ND).second)
6592 This->Decls.push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006593 }
6594
6595 return FoundAnything;
6596 }
6597 };
6598}
6599
Douglas Gregor9f782892013-01-21 15:25:38 +00006600/// \brief Retrieve the "definitive" module file for the definition of the
6601/// given declaration context, if there is one.
6602///
6603/// The "definitive" module file is the only place where we need to look to
6604/// find information about the declarations within the given declaration
6605/// context. For example, C++ and Objective-C classes, C structs/unions, and
6606/// Objective-C protocols, categories, and extensions are all defined in a
6607/// single place in the source code, so they have definitive module files
6608/// associated with them. C++ namespaces, on the other hand, can have
6609/// definitions in multiple different module files.
6610///
6611/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6612/// NDEBUG checking.
6613static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6614 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006615 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6616 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006617
Craig Toppera13603a2014-05-22 05:54:18 +00006618 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006619}
6620
Richard Smith9ce12e32013-02-07 03:30:24 +00006621bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006622ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6623 DeclarationName Name) {
6624 assert(DC->hasExternalVisibleStorage() &&
6625 "DeclContext has no visible decls in storage");
6626 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006627 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006628
Richard Smith8c913ec2014-08-14 02:21:01 +00006629 Deserializing LookupResults(this);
6630
Guy Benyei11169dd2012-12-18 14:30:41 +00006631 SmallVector<NamedDecl *, 64> Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006632 llvm::SmallPtrSet<NamedDecl*, 64> DeclSet;
Richard Smith8c913ec2014-08-14 02:21:01 +00006633
Guy Benyei11169dd2012-12-18 14:30:41 +00006634 // Compute the declaration contexts we need to look into. Multiple such
6635 // declaration contexts occur when two declaration contexts from disjoint
6636 // modules get merged, e.g., when two namespaces with the same name are
6637 // independently defined in separate modules.
6638 SmallVector<const DeclContext *, 2> Contexts;
6639 Contexts.push_back(DC);
Richard Smith8c913ec2014-08-14 02:21:01 +00006640
Guy Benyei11169dd2012-12-18 14:30:41 +00006641 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006642 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006643 if (Merged != MergedDecls.end()) {
6644 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6645 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6646 }
6647 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006648
6649 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
Richard Smith52874ec2015-02-13 20:17:14 +00006650 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls, DeclSet);
Richard Smith8c913ec2014-08-14 02:21:01 +00006651
6652 // If we can definitively determine which module file to look into,
6653 // only look there. Otherwise, look in all module files.
6654 ModuleFile *Definitive;
6655 if (Contexts.size() == 1 &&
6656 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6657 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6658 } else {
6659 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6660 }
6661 };
6662
6663 LookUpInContexts(Contexts);
6664
6665 // If this might be an implicit special member function, then also search
6666 // all merged definitions of the surrounding class. We need to search them
6667 // individually, because finding an entity in one of them doesn't imply that
6668 // we can't find a different entity in another one.
Richard Smithcd45dbc2014-04-19 03:48:30 +00006669 if (isa<CXXRecordDecl>(DC)) {
Richard Smith8c913ec2014-08-14 02:21:01 +00006670 auto Kind = Name.getNameKind();
6671 if (Kind == DeclarationName::CXXConstructorName ||
6672 Kind == DeclarationName::CXXDestructorName ||
6673 (Kind == DeclarationName::CXXOperatorName &&
6674 Name.getCXXOverloadedOperator() == OO_Equal)) {
6675 auto Merged = MergedLookups.find(DC);
Richard Smithe0612472014-11-21 05:16:13 +00006676 if (Merged != MergedLookups.end()) {
6677 for (unsigned I = 0; I != Merged->second.size(); ++I) {
Daniel Jasperc0b7c802015-02-18 14:13:46 +00006678 const DeclContext *Context = Merged->second[I];
6679 LookUpInContexts(Context);
Richard Smithe0612472014-11-21 05:16:13 +00006680 // We might have just added some more merged lookups. If so, our
6681 // iterator is now invalid, so grab a fresh one before continuing.
6682 Merged = MergedLookups.find(DC);
6683 }
6684 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006685 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006686 }
6687
Guy Benyei11169dd2012-12-18 14:30:41 +00006688 ++NumVisibleDeclContextsRead;
6689 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006690 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006691}
6692
6693namespace {
6694 /// \brief ModuleFile visitor used to retrieve all visible names in a
6695 /// declaration context.
6696 class DeclContextAllNamesVisitor {
6697 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006698 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006699 DeclsMap &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006700 llvm::SmallPtrSet<NamedDecl *, 256> DeclSet;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006701 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006702
6703 public:
6704 DeclContextAllNamesVisitor(ASTReader &Reader,
6705 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006706 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006707 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006708
6709 static bool visit(ModuleFile &M, void *UserData) {
6710 DeclContextAllNamesVisitor *This
6711 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6712
6713 // Check whether we have any visible declaration information for
6714 // this context in this module.
6715 ModuleFile::DeclContextInfosMap::iterator Info;
6716 bool FoundInfo = false;
6717 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6718 Info = M.DeclContextInfos.find(This->Contexts[I]);
6719 if (Info != M.DeclContextInfos.end() &&
6720 Info->second.NameLookupTableData) {
6721 FoundInfo = true;
6722 break;
6723 }
6724 }
6725
6726 if (!FoundInfo)
6727 return false;
6728
Richard Smith52e3fba2014-03-11 07:17:35 +00006729 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006730 Info->second.NameLookupTableData;
6731 bool FoundAnything = false;
6732 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006733 I = LookupTable->data_begin(), E = LookupTable->data_end();
6734 I != E;
6735 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006736 ASTDeclContextNameLookupTrait::data_type Data = *I;
6737 for (; Data.first != Data.second; ++Data.first) {
6738 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6739 *Data.first);
6740 if (!ND)
6741 continue;
6742
6743 // Record this declaration.
6744 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006745 if (This->DeclSet.insert(ND).second)
6746 This->Decls[ND->getDeclName()].push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006747 }
6748 }
6749
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006750 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006751 }
6752 };
6753}
6754
6755void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6756 if (!DC->hasExternalVisibleStorage())
6757 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006758 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006759
6760 // Compute the declaration contexts we need to look into. Multiple such
6761 // declaration contexts occur when two declaration contexts from disjoint
6762 // modules get merged, e.g., when two namespaces with the same name are
6763 // independently defined in separate modules.
6764 SmallVector<const DeclContext *, 2> Contexts;
6765 Contexts.push_back(DC);
6766
6767 if (DC->isNamespace()) {
6768 MergedDeclsMap::iterator Merged
6769 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6770 if (Merged != MergedDecls.end()) {
6771 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6772 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6773 }
6774 }
6775
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006776 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6777 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006778 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6779 ++NumVisibleDeclContextsRead;
6780
Craig Topper79be4cd2013-07-05 04:33:53 +00006781 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006782 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6783 }
6784 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6785}
6786
6787/// \brief Under non-PCH compilation the consumer receives the objc methods
6788/// before receiving the implementation, and codegen depends on this.
6789/// We simulate this by deserializing and passing to consumer the methods of the
6790/// implementation before passing the deserialized implementation decl.
6791static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6792 ASTConsumer *Consumer) {
6793 assert(ImplD && Consumer);
6794
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006795 for (auto *I : ImplD->methods())
6796 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006797
6798 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6799}
6800
6801void ASTReader::PassInterestingDeclsToConsumer() {
6802 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006803
6804 if (PassingDeclsToConsumer)
6805 return;
6806
6807 // Guard variable to avoid recursively redoing the process of passing
6808 // decls to consumer.
6809 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6810 true);
6811
Guy Benyei11169dd2012-12-18 14:30:41 +00006812 while (!InterestingDecls.empty()) {
6813 Decl *D = InterestingDecls.front();
6814 InterestingDecls.pop_front();
6815
6816 PassInterestingDeclToConsumer(D);
6817 }
6818}
6819
6820void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6821 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6822 PassObjCImplDeclToConsumer(ImplD, Consumer);
6823 else
6824 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6825}
6826
6827void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6828 this->Consumer = Consumer;
6829
6830 if (!Consumer)
6831 return;
6832
Ben Langmuir332aafe2014-01-31 01:06:56 +00006833 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006834 // Force deserialization of this decl, which will cause it to be queued for
6835 // passing to the consumer.
Ben Langmuir332aafe2014-01-31 01:06:56 +00006836 GetDecl(EagerlyDeserializedDecls[I]);
Guy Benyei11169dd2012-12-18 14:30:41 +00006837 }
Ben Langmuir332aafe2014-01-31 01:06:56 +00006838 EagerlyDeserializedDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006839
6840 PassInterestingDeclsToConsumer();
6841}
6842
6843void ASTReader::PrintStats() {
6844 std::fprintf(stderr, "*** AST File Statistics:\n");
6845
6846 unsigned NumTypesLoaded
6847 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6848 QualType());
6849 unsigned NumDeclsLoaded
6850 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006851 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006852 unsigned NumIdentifiersLoaded
6853 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6854 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006855 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006856 unsigned NumMacrosLoaded
6857 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6858 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006859 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006860 unsigned NumSelectorsLoaded
6861 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6862 SelectorsLoaded.end(),
6863 Selector());
6864
6865 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6866 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6867 NumSLocEntriesRead, TotalNumSLocEntries,
6868 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6869 if (!TypesLoaded.empty())
6870 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6871 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6872 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6873 if (!DeclsLoaded.empty())
6874 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6875 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6876 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6877 if (!IdentifiersLoaded.empty())
6878 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6879 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6880 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6881 if (!MacrosLoaded.empty())
6882 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6883 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6884 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6885 if (!SelectorsLoaded.empty())
6886 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6887 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6888 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6889 if (TotalNumStatements)
6890 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6891 NumStatementsRead, TotalNumStatements,
6892 ((float)NumStatementsRead/TotalNumStatements * 100));
6893 if (TotalNumMacros)
6894 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6895 NumMacrosRead, TotalNumMacros,
6896 ((float)NumMacrosRead/TotalNumMacros * 100));
6897 if (TotalLexicalDeclContexts)
6898 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6899 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6900 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6901 * 100));
6902 if (TotalVisibleDeclContexts)
6903 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6904 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6905 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6906 * 100));
6907 if (TotalNumMethodPoolEntries) {
6908 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6909 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6910 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6911 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006912 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006913 if (NumMethodPoolLookups) {
6914 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6915 NumMethodPoolHits, NumMethodPoolLookups,
6916 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6917 }
6918 if (NumMethodPoolTableLookups) {
6919 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6920 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6921 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6922 * 100.0));
6923 }
6924
Douglas Gregor00a50f72013-01-25 00:38:33 +00006925 if (NumIdentifierLookupHits) {
6926 std::fprintf(stderr,
6927 " %u / %u identifier table lookups succeeded (%f%%)\n",
6928 NumIdentifierLookupHits, NumIdentifierLookups,
6929 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6930 }
6931
Douglas Gregore060e572013-01-25 01:03:03 +00006932 if (GlobalIndex) {
6933 std::fprintf(stderr, "\n");
6934 GlobalIndex->printStats();
6935 }
6936
Guy Benyei11169dd2012-12-18 14:30:41 +00006937 std::fprintf(stderr, "\n");
6938 dump();
6939 std::fprintf(stderr, "\n");
6940}
6941
6942template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6943static void
6944dumpModuleIDMap(StringRef Name,
6945 const ContinuousRangeMap<Key, ModuleFile *,
6946 InitialCapacity> &Map) {
6947 if (Map.begin() == Map.end())
6948 return;
6949
6950 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6951 llvm::errs() << Name << ":\n";
6952 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6953 I != IEnd; ++I) {
6954 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6955 << "\n";
6956 }
6957}
6958
6959void ASTReader::dump() {
6960 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6961 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6962 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6963 dumpModuleIDMap("Global type map", GlobalTypeMap);
6964 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6965 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6966 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6967 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6968 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6969 dumpModuleIDMap("Global preprocessed entity map",
6970 GlobalPreprocessedEntityMap);
6971
6972 llvm::errs() << "\n*** PCH/Modules Loaded:";
6973 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6974 MEnd = ModuleMgr.end();
6975 M != MEnd; ++M)
6976 (*M)->dump();
6977}
6978
6979/// Return the amount of memory used by memory buffers, breaking down
6980/// by heap-backed versus mmap'ed memory.
6981void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6982 for (ModuleConstIterator I = ModuleMgr.begin(),
6983 E = ModuleMgr.end(); I != E; ++I) {
6984 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6985 size_t bytes = buf->getBufferSize();
6986 switch (buf->getBufferKind()) {
6987 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6988 sizes.malloc_bytes += bytes;
6989 break;
6990 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6991 sizes.mmap_bytes += bytes;
6992 break;
6993 }
6994 }
6995 }
6996}
6997
6998void ASTReader::InitializeSema(Sema &S) {
6999 SemaObj = &S;
7000 S.addExternalSource(this);
7001
7002 // Makes sure any declarations that were deserialized "too early"
7003 // still get added to the identifier's declaration chains.
Ben Langmuir5418f402014-09-10 21:29:41 +00007004 for (uint64_t ID : PreloadedDeclIDs) {
7005 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7006 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00007007 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007008 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007009
Richard Smith3d8e97e2013-10-18 06:54:39 +00007010 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007011 if (!FPPragmaOptions.empty()) {
7012 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
7013 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
7014 }
7015
Richard Smith3d8e97e2013-10-18 06:54:39 +00007016 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007017 if (!OpenCLExtensions.empty()) {
7018 unsigned I = 0;
7019#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
7020#include "clang/Basic/OpenCLExtensions.def"
7021
7022 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
7023 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00007024
7025 UpdateSema();
7026}
7027
7028void ASTReader::UpdateSema() {
7029 assert(SemaObj && "no Sema to update");
7030
7031 // Load the offsets of the declarations that Sema references.
7032 // They will be lazily deserialized when needed.
7033 if (!SemaDeclRefs.empty()) {
7034 assert(SemaDeclRefs.size() % 2 == 0);
7035 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
7036 if (!SemaObj->StdNamespace)
7037 SemaObj->StdNamespace = SemaDeclRefs[I];
7038 if (!SemaObj->StdBadAlloc)
7039 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7040 }
7041 SemaDeclRefs.clear();
7042 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00007043
7044 // Update the state of 'pragma clang optimize'. Use the same API as if we had
7045 // encountered the pragma in the source.
7046 if(OptimizeOffPragmaLocation.isValid())
7047 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00007048}
7049
7050IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
7051 // Note that we are loading an identifier.
7052 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00007053 StringRef Name(NameStart, NameEnd - NameStart);
7054
7055 // If there is a global index, look there first to determine which modules
7056 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00007057 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00007058 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00007059 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00007060 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7061 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00007062 }
7063 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00007064 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00007065 NumIdentifierLookups,
7066 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00007067 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00007068 IdentifierInfo *II = Visitor.getIdentifierInfo();
7069 markIdentifierUpToDate(II);
7070 return II;
7071}
7072
7073namespace clang {
7074 /// \brief An identifier-lookup iterator that enumerates all of the
7075 /// identifiers stored within a set of AST files.
7076 class ASTIdentifierIterator : public IdentifierIterator {
7077 /// \brief The AST reader whose identifiers are being enumerated.
7078 const ASTReader &Reader;
7079
7080 /// \brief The current index into the chain of AST files stored in
7081 /// the AST reader.
7082 unsigned Index;
7083
7084 /// \brief The current position within the identifier lookup table
7085 /// of the current AST file.
7086 ASTIdentifierLookupTable::key_iterator Current;
7087
7088 /// \brief The end position within the identifier lookup table of
7089 /// the current AST file.
7090 ASTIdentifierLookupTable::key_iterator End;
7091
7092 public:
7093 explicit ASTIdentifierIterator(const ASTReader &Reader);
7094
Craig Topper3e89dfe2014-03-13 02:13:41 +00007095 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00007096 };
7097}
7098
7099ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
7100 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
7101 ASTIdentifierLookupTable *IdTable
7102 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
7103 Current = IdTable->key_begin();
7104 End = IdTable->key_end();
7105}
7106
7107StringRef ASTIdentifierIterator::Next() {
7108 while (Current == End) {
7109 // If we have exhausted all of our AST files, we're done.
7110 if (Index == 0)
7111 return StringRef();
7112
7113 --Index;
7114 ASTIdentifierLookupTable *IdTable
7115 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7116 IdentifierLookupTable;
7117 Current = IdTable->key_begin();
7118 End = IdTable->key_end();
7119 }
7120
7121 // We have any identifiers remaining in the current AST file; return
7122 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007123 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00007124 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007125 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00007126}
7127
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007128IdentifierIterator *ASTReader::getIdentifiers() {
7129 if (!loadGlobalIndex())
7130 return GlobalIndex->createIdentifierIterator();
7131
Guy Benyei11169dd2012-12-18 14:30:41 +00007132 return new ASTIdentifierIterator(*this);
7133}
7134
7135namespace clang { namespace serialization {
7136 class ReadMethodPoolVisitor {
7137 ASTReader &Reader;
7138 Selector Sel;
7139 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007140 unsigned InstanceBits;
7141 unsigned FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007142 bool InstanceHasMoreThanOneDecl;
7143 bool FactoryHasMoreThanOneDecl;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00007144 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7145 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007146
7147 public:
Nico Weber2e0c8f72014-12-27 03:58:08 +00007148 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
Guy Benyei11169dd2012-12-18 14:30:41 +00007149 unsigned PriorGeneration)
Nico Weber2e0c8f72014-12-27 03:58:08 +00007150 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
Nico Weberff4b35e2014-12-27 22:14:15 +00007151 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false),
7152 FactoryHasMoreThanOneDecl(false) {}
Nico Weber2e0c8f72014-12-27 03:58:08 +00007153
Guy Benyei11169dd2012-12-18 14:30:41 +00007154 static bool visit(ModuleFile &M, void *UserData) {
7155 ReadMethodPoolVisitor *This
7156 = static_cast<ReadMethodPoolVisitor *>(UserData);
7157
7158 if (!M.SelectorLookupTable)
7159 return false;
7160
7161 // If we've already searched this module file, skip it now.
7162 if (M.Generation <= This->PriorGeneration)
7163 return true;
7164
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007165 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007166 ASTSelectorLookupTable *PoolTable
7167 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7168 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7169 if (Pos == PoolTable->end())
7170 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007171
7172 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007173 ++This->Reader.NumSelectorsRead;
7174 // FIXME: Not quite happy with the statistics here. We probably should
7175 // disable this tracking when called via LoadSelector.
7176 // Also, should entries without methods count as misses?
7177 ++This->Reader.NumMethodPoolEntriesRead;
7178 ASTSelectorLookupTrait::data_type Data = *Pos;
7179 if (This->Reader.DeserializationListener)
7180 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7181 This->Sel);
7182
7183 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7184 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007185 This->InstanceBits = Data.InstanceBits;
7186 This->FactoryBits = Data.FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007187 This->InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
7188 This->FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
Guy Benyei11169dd2012-12-18 14:30:41 +00007189 return true;
7190 }
7191
7192 /// \brief Retrieve the instance methods found by this visitor.
7193 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7194 return InstanceMethods;
7195 }
7196
7197 /// \brief Retrieve the instance methods found by this visitor.
7198 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7199 return FactoryMethods;
7200 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007201
7202 unsigned getInstanceBits() const { return InstanceBits; }
7203 unsigned getFactoryBits() const { return FactoryBits; }
Nico Weberff4b35e2014-12-27 22:14:15 +00007204 bool instanceHasMoreThanOneDecl() const {
7205 return InstanceHasMoreThanOneDecl;
7206 }
7207 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
Guy Benyei11169dd2012-12-18 14:30:41 +00007208 };
7209} } // end namespace clang::serialization
7210
7211/// \brief Add the given set of methods to the method list.
7212static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7213 ObjCMethodList &List) {
7214 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7215 S.addMethodToGlobalList(&List, Methods[I]);
7216 }
7217}
7218
7219void ASTReader::ReadMethodPool(Selector Sel) {
7220 // Get the selector generation and update it to the current generation.
7221 unsigned &Generation = SelectorGeneration[Sel];
7222 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00007223 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00007224
7225 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007226 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007227 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7228 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7229
7230 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007231 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00007232 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007233
7234 ++NumMethodPoolHits;
7235
Guy Benyei11169dd2012-12-18 14:30:41 +00007236 if (!getSema())
7237 return;
7238
7239 Sema &S = *getSema();
7240 Sema::GlobalMethodPool::iterator Pos
7241 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
Ben Langmuira0c32e92015-01-12 19:27:00 +00007242
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007243 Pos->second.first.setBits(Visitor.getInstanceBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007244 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007245 Pos->second.second.setBits(Visitor.getFactoryBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007246 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
Ben Langmuira0c32e92015-01-12 19:27:00 +00007247
7248 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
7249 // when building a module we keep every method individually and may need to
7250 // update hasMoreThanOneDecl as we add the methods.
7251 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7252 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Guy Benyei11169dd2012-12-18 14:30:41 +00007253}
7254
7255void ASTReader::ReadKnownNamespaces(
7256 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7257 Namespaces.clear();
7258
7259 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7260 if (NamespaceDecl *Namespace
7261 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7262 Namespaces.push_back(Namespace);
7263 }
7264}
7265
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007266void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007267 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007268 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7269 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007270 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007271 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007272 Undefined.insert(std::make_pair(D, Loc));
7273 }
7274}
Nick Lewycky8334af82013-01-26 00:35:08 +00007275
Guy Benyei11169dd2012-12-18 14:30:41 +00007276void ASTReader::ReadTentativeDefinitions(
7277 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7278 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7279 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7280 if (Var)
7281 TentativeDefs.push_back(Var);
7282 }
7283 TentativeDefinitions.clear();
7284}
7285
7286void ASTReader::ReadUnusedFileScopedDecls(
7287 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7288 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7289 DeclaratorDecl *D
7290 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7291 if (D)
7292 Decls.push_back(D);
7293 }
7294 UnusedFileScopedDecls.clear();
7295}
7296
7297void ASTReader::ReadDelegatingConstructors(
7298 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7299 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7300 CXXConstructorDecl *D
7301 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7302 if (D)
7303 Decls.push_back(D);
7304 }
7305 DelegatingCtorDecls.clear();
7306}
7307
7308void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7309 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7310 TypedefNameDecl *D
7311 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7312 if (D)
7313 Decls.push_back(D);
7314 }
7315 ExtVectorDecls.clear();
7316}
7317
7318void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
7319 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
7320 CXXRecordDecl *D
7321 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
7322 if (D)
7323 Decls.push_back(D);
7324 }
7325 DynamicClasses.clear();
7326}
7327
Nico Weber72889432014-09-06 01:25:55 +00007328void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7329 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7330 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7331 ++I) {
7332 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7333 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7334 if (D)
7335 Decls.insert(D);
7336 }
7337 UnusedLocalTypedefNameCandidates.clear();
7338}
7339
Guy Benyei11169dd2012-12-18 14:30:41 +00007340void
Richard Smith78165b52013-01-10 23:43:47 +00007341ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7342 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7343 NamedDecl *D
7344 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00007345 if (D)
7346 Decls.push_back(D);
7347 }
Richard Smith78165b52013-01-10 23:43:47 +00007348 LocallyScopedExternCDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007349}
7350
7351void ASTReader::ReadReferencedSelectors(
7352 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7353 if (ReferencedSelectorsData.empty())
7354 return;
7355
7356 // If there are @selector references added them to its pool. This is for
7357 // implementation of -Wselector.
7358 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7359 unsigned I = 0;
7360 while (I < DataSize) {
7361 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7362 SourceLocation SelLoc
7363 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7364 Sels.push_back(std::make_pair(Sel, SelLoc));
7365 }
7366 ReferencedSelectorsData.clear();
7367}
7368
7369void ASTReader::ReadWeakUndeclaredIdentifiers(
7370 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7371 if (WeakUndeclaredIdentifiers.empty())
7372 return;
7373
7374 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7375 IdentifierInfo *WeakId
7376 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7377 IdentifierInfo *AliasId
7378 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7379 SourceLocation Loc
7380 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7381 bool Used = WeakUndeclaredIdentifiers[I++];
7382 WeakInfo WI(AliasId, Loc);
7383 WI.setUsed(Used);
7384 WeakIDs.push_back(std::make_pair(WeakId, WI));
7385 }
7386 WeakUndeclaredIdentifiers.clear();
7387}
7388
7389void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7390 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7391 ExternalVTableUse VT;
7392 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7393 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7394 VT.DefinitionRequired = VTableUses[Idx++];
7395 VTables.push_back(VT);
7396 }
7397
7398 VTableUses.clear();
7399}
7400
7401void ASTReader::ReadPendingInstantiations(
7402 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7403 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7404 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7405 SourceLocation Loc
7406 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7407
7408 Pending.push_back(std::make_pair(D, Loc));
7409 }
7410 PendingInstantiations.clear();
7411}
7412
Richard Smithe40f2ba2013-08-07 21:41:30 +00007413void ASTReader::ReadLateParsedTemplates(
7414 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7415 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7416 /* In loop */) {
7417 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7418
7419 LateParsedTemplate *LT = new LateParsedTemplate;
7420 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7421
7422 ModuleFile *F = getOwningModuleFile(LT->D);
7423 assert(F && "No module");
7424
7425 unsigned TokN = LateParsedTemplates[Idx++];
7426 LT->Toks.reserve(TokN);
7427 for (unsigned T = 0; T < TokN; ++T)
7428 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7429
7430 LPTMap[FD] = LT;
7431 }
7432
7433 LateParsedTemplates.clear();
7434}
7435
Guy Benyei11169dd2012-12-18 14:30:41 +00007436void ASTReader::LoadSelector(Selector Sel) {
7437 // It would be complicated to avoid reading the methods anyway. So don't.
7438 ReadMethodPool(Sel);
7439}
7440
7441void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7442 assert(ID && "Non-zero identifier ID required");
7443 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7444 IdentifiersLoaded[ID - 1] = II;
7445 if (DeserializationListener)
7446 DeserializationListener->IdentifierRead(ID, II);
7447}
7448
7449/// \brief Set the globally-visible declarations associated with the given
7450/// identifier.
7451///
7452/// If the AST reader is currently in a state where the given declaration IDs
7453/// cannot safely be resolved, they are queued until it is safe to resolve
7454/// them.
7455///
7456/// \param II an IdentifierInfo that refers to one or more globally-visible
7457/// declarations.
7458///
7459/// \param DeclIDs the set of declaration IDs with the name @p II that are
7460/// visible at global scope.
7461///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007462/// \param Decls if non-null, this vector will be populated with the set of
7463/// deserialized declarations. These declarations will not be pushed into
7464/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007465void
7466ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7467 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007468 SmallVectorImpl<Decl *> *Decls) {
7469 if (NumCurrentElementsDeserializing && !Decls) {
7470 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007471 return;
7472 }
7473
7474 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00007475 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007476 // Queue this declaration so that it will be added to the
7477 // translation unit scope and identifier's declaration chain
7478 // once a Sema object is known.
Ben Langmuir5418f402014-09-10 21:29:41 +00007479 PreloadedDeclIDs.push_back(DeclIDs[I]);
7480 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00007481 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007482
7483 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7484
7485 // If we're simply supposed to record the declarations, do so now.
7486 if (Decls) {
7487 Decls->push_back(D);
7488 continue;
7489 }
7490
7491 // Introduce this declaration into the translation-unit scope
7492 // and add it to the declaration chain for this identifier, so
7493 // that (unqualified) name lookup will find it.
7494 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007495 }
7496}
7497
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007498IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007499 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007500 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007501
7502 if (IdentifiersLoaded.empty()) {
7503 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007504 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007505 }
7506
7507 ID -= 1;
7508 if (!IdentifiersLoaded[ID]) {
7509 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7510 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7511 ModuleFile *M = I->second;
7512 unsigned Index = ID - M->BaseIdentifierID;
7513 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7514
7515 // All of the strings in the AST file are preceded by a 16-bit length.
7516 // Extract that 16-bit length to avoid having to execute strlen().
7517 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7518 // unsigned integers. This is important to avoid integer overflow when
7519 // we cast them to 'unsigned'.
7520 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7521 unsigned StrLen = (((unsigned) StrLenPtr[0])
7522 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007523 IdentifiersLoaded[ID]
7524 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007525 if (DeserializationListener)
7526 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7527 }
7528
7529 return IdentifiersLoaded[ID];
7530}
7531
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007532IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7533 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007534}
7535
7536IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7537 if (LocalID < NUM_PREDEF_IDENT_IDS)
7538 return LocalID;
7539
7540 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7541 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7542 assert(I != M.IdentifierRemap.end()
7543 && "Invalid index into identifier index remap");
7544
7545 return LocalID + I->second;
7546}
7547
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007548MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007549 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007550 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007551
7552 if (MacrosLoaded.empty()) {
7553 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007554 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007555 }
7556
7557 ID -= NUM_PREDEF_MACRO_IDS;
7558 if (!MacrosLoaded[ID]) {
7559 GlobalMacroMapType::iterator I
7560 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7561 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7562 ModuleFile *M = I->second;
7563 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007564 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7565
7566 if (DeserializationListener)
7567 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7568 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007569 }
7570
7571 return MacrosLoaded[ID];
7572}
7573
7574MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7575 if (LocalID < NUM_PREDEF_MACRO_IDS)
7576 return LocalID;
7577
7578 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7579 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7580 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7581
7582 return LocalID + I->second;
7583}
7584
7585serialization::SubmoduleID
7586ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7587 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7588 return LocalID;
7589
7590 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7591 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7592 assert(I != M.SubmoduleRemap.end()
7593 && "Invalid index into submodule index remap");
7594
7595 return LocalID + I->second;
7596}
7597
7598Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7599 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7600 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007601 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007602 }
7603
7604 if (GlobalID > SubmodulesLoaded.size()) {
7605 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007606 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007607 }
7608
7609 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7610}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007611
7612Module *ASTReader::getModule(unsigned ID) {
7613 return getSubmodule(ID);
7614}
7615
Guy Benyei11169dd2012-12-18 14:30:41 +00007616Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7617 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7618}
7619
7620Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7621 if (ID == 0)
7622 return Selector();
7623
7624 if (ID > SelectorsLoaded.size()) {
7625 Error("selector ID out of range in AST file");
7626 return Selector();
7627 }
7628
Craig Toppera13603a2014-05-22 05:54:18 +00007629 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007630 // Load this selector from the selector table.
7631 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7632 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7633 ModuleFile &M = *I->second;
7634 ASTSelectorLookupTrait Trait(*this, M);
7635 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7636 SelectorsLoaded[ID - 1] =
7637 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7638 if (DeserializationListener)
7639 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7640 }
7641
7642 return SelectorsLoaded[ID - 1];
7643}
7644
7645Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7646 return DecodeSelector(ID);
7647}
7648
7649uint32_t ASTReader::GetNumExternalSelectors() {
7650 // ID 0 (the null selector) is considered an external selector.
7651 return getTotalNumSelectors() + 1;
7652}
7653
7654serialization::SelectorID
7655ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7656 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7657 return LocalID;
7658
7659 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7660 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7661 assert(I != M.SelectorRemap.end()
7662 && "Invalid index into selector index remap");
7663
7664 return LocalID + I->second;
7665}
7666
7667DeclarationName
7668ASTReader::ReadDeclarationName(ModuleFile &F,
7669 const RecordData &Record, unsigned &Idx) {
7670 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7671 switch (Kind) {
7672 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007673 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007674
7675 case DeclarationName::ObjCZeroArgSelector:
7676 case DeclarationName::ObjCOneArgSelector:
7677 case DeclarationName::ObjCMultiArgSelector:
7678 return DeclarationName(ReadSelector(F, Record, Idx));
7679
7680 case DeclarationName::CXXConstructorName:
7681 return Context.DeclarationNames.getCXXConstructorName(
7682 Context.getCanonicalType(readType(F, Record, Idx)));
7683
7684 case DeclarationName::CXXDestructorName:
7685 return Context.DeclarationNames.getCXXDestructorName(
7686 Context.getCanonicalType(readType(F, Record, Idx)));
7687
7688 case DeclarationName::CXXConversionFunctionName:
7689 return Context.DeclarationNames.getCXXConversionFunctionName(
7690 Context.getCanonicalType(readType(F, Record, Idx)));
7691
7692 case DeclarationName::CXXOperatorName:
7693 return Context.DeclarationNames.getCXXOperatorName(
7694 (OverloadedOperatorKind)Record[Idx++]);
7695
7696 case DeclarationName::CXXLiteralOperatorName:
7697 return Context.DeclarationNames.getCXXLiteralOperatorName(
7698 GetIdentifierInfo(F, Record, Idx));
7699
7700 case DeclarationName::CXXUsingDirective:
7701 return DeclarationName::getUsingDirectiveName();
7702 }
7703
7704 llvm_unreachable("Invalid NameKind!");
7705}
7706
7707void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7708 DeclarationNameLoc &DNLoc,
7709 DeclarationName Name,
7710 const RecordData &Record, unsigned &Idx) {
7711 switch (Name.getNameKind()) {
7712 case DeclarationName::CXXConstructorName:
7713 case DeclarationName::CXXDestructorName:
7714 case DeclarationName::CXXConversionFunctionName:
7715 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7716 break;
7717
7718 case DeclarationName::CXXOperatorName:
7719 DNLoc.CXXOperatorName.BeginOpNameLoc
7720 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7721 DNLoc.CXXOperatorName.EndOpNameLoc
7722 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7723 break;
7724
7725 case DeclarationName::CXXLiteralOperatorName:
7726 DNLoc.CXXLiteralOperatorName.OpNameLoc
7727 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7728 break;
7729
7730 case DeclarationName::Identifier:
7731 case DeclarationName::ObjCZeroArgSelector:
7732 case DeclarationName::ObjCOneArgSelector:
7733 case DeclarationName::ObjCMultiArgSelector:
7734 case DeclarationName::CXXUsingDirective:
7735 break;
7736 }
7737}
7738
7739void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7740 DeclarationNameInfo &NameInfo,
7741 const RecordData &Record, unsigned &Idx) {
7742 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7743 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7744 DeclarationNameLoc DNLoc;
7745 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7746 NameInfo.setInfo(DNLoc);
7747}
7748
7749void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7750 const RecordData &Record, unsigned &Idx) {
7751 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7752 unsigned NumTPLists = Record[Idx++];
7753 Info.NumTemplParamLists = NumTPLists;
7754 if (NumTPLists) {
7755 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7756 for (unsigned i=0; i != NumTPLists; ++i)
7757 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7758 }
7759}
7760
7761TemplateName
7762ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7763 unsigned &Idx) {
7764 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7765 switch (Kind) {
7766 case TemplateName::Template:
7767 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7768
7769 case TemplateName::OverloadedTemplate: {
7770 unsigned size = Record[Idx++];
7771 UnresolvedSet<8> Decls;
7772 while (size--)
7773 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7774
7775 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7776 }
7777
7778 case TemplateName::QualifiedTemplate: {
7779 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7780 bool hasTemplKeyword = Record[Idx++];
7781 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7782 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7783 }
7784
7785 case TemplateName::DependentTemplate: {
7786 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7787 if (Record[Idx++]) // isIdentifier
7788 return Context.getDependentTemplateName(NNS,
7789 GetIdentifierInfo(F, Record,
7790 Idx));
7791 return Context.getDependentTemplateName(NNS,
7792 (OverloadedOperatorKind)Record[Idx++]);
7793 }
7794
7795 case TemplateName::SubstTemplateTemplateParm: {
7796 TemplateTemplateParmDecl *param
7797 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7798 if (!param) return TemplateName();
7799 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7800 return Context.getSubstTemplateTemplateParm(param, replacement);
7801 }
7802
7803 case TemplateName::SubstTemplateTemplateParmPack: {
7804 TemplateTemplateParmDecl *Param
7805 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7806 if (!Param)
7807 return TemplateName();
7808
7809 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7810 if (ArgPack.getKind() != TemplateArgument::Pack)
7811 return TemplateName();
7812
7813 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7814 }
7815 }
7816
7817 llvm_unreachable("Unhandled template name kind!");
7818}
7819
7820TemplateArgument
7821ASTReader::ReadTemplateArgument(ModuleFile &F,
7822 const RecordData &Record, unsigned &Idx) {
7823 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7824 switch (Kind) {
7825 case TemplateArgument::Null:
7826 return TemplateArgument();
7827 case TemplateArgument::Type:
7828 return TemplateArgument(readType(F, Record, Idx));
7829 case TemplateArgument::Declaration: {
7830 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
David Blaikie0f62c8d2014-10-16 04:21:25 +00007831 return TemplateArgument(D, readType(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007832 }
7833 case TemplateArgument::NullPtr:
7834 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7835 case TemplateArgument::Integral: {
7836 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7837 QualType T = readType(F, Record, Idx);
7838 return TemplateArgument(Context, Value, T);
7839 }
7840 case TemplateArgument::Template:
7841 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7842 case TemplateArgument::TemplateExpansion: {
7843 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007844 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007845 if (unsigned NumExpansions = Record[Idx++])
7846 NumTemplateExpansions = NumExpansions - 1;
7847 return TemplateArgument(Name, NumTemplateExpansions);
7848 }
7849 case TemplateArgument::Expression:
7850 return TemplateArgument(ReadExpr(F));
7851 case TemplateArgument::Pack: {
7852 unsigned NumArgs = Record[Idx++];
7853 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7854 for (unsigned I = 0; I != NumArgs; ++I)
7855 Args[I] = ReadTemplateArgument(F, Record, Idx);
7856 return TemplateArgument(Args, NumArgs);
7857 }
7858 }
7859
7860 llvm_unreachable("Unhandled template argument kind!");
7861}
7862
7863TemplateParameterList *
7864ASTReader::ReadTemplateParameterList(ModuleFile &F,
7865 const RecordData &Record, unsigned &Idx) {
7866 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7867 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7868 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7869
7870 unsigned NumParams = Record[Idx++];
7871 SmallVector<NamedDecl *, 16> Params;
7872 Params.reserve(NumParams);
7873 while (NumParams--)
7874 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7875
7876 TemplateParameterList* TemplateParams =
7877 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7878 Params.data(), Params.size(), RAngleLoc);
7879 return TemplateParams;
7880}
7881
7882void
7883ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007884ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007885 ModuleFile &F, const RecordData &Record,
7886 unsigned &Idx) {
7887 unsigned NumTemplateArgs = Record[Idx++];
7888 TemplArgs.reserve(NumTemplateArgs);
7889 while (NumTemplateArgs--)
7890 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7891}
7892
7893/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007894void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007895 const RecordData &Record, unsigned &Idx) {
7896 unsigned NumDecls = Record[Idx++];
7897 Set.reserve(Context, NumDecls);
7898 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007899 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007900 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007901 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007902 }
7903}
7904
7905CXXBaseSpecifier
7906ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7907 const RecordData &Record, unsigned &Idx) {
7908 bool isVirtual = static_cast<bool>(Record[Idx++]);
7909 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7910 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7911 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7912 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7913 SourceRange Range = ReadSourceRange(F, Record, Idx);
7914 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7915 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7916 EllipsisLoc);
7917 Result.setInheritConstructors(inheritConstructors);
7918 return Result;
7919}
7920
7921std::pair<CXXCtorInitializer **, unsigned>
7922ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7923 unsigned &Idx) {
Craig Toppera13603a2014-05-22 05:54:18 +00007924 CXXCtorInitializer **CtorInitializers = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007925 unsigned NumInitializers = Record[Idx++];
7926 if (NumInitializers) {
7927 CtorInitializers
7928 = new (Context) CXXCtorInitializer*[NumInitializers];
7929 for (unsigned i=0; i != NumInitializers; ++i) {
Craig Toppera13603a2014-05-22 05:54:18 +00007930 TypeSourceInfo *TInfo = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007931 bool IsBaseVirtual = false;
Craig Toppera13603a2014-05-22 05:54:18 +00007932 FieldDecl *Member = nullptr;
7933 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007934
7935 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7936 switch (Type) {
7937 case CTOR_INITIALIZER_BASE:
7938 TInfo = GetTypeSourceInfo(F, Record, Idx);
7939 IsBaseVirtual = Record[Idx++];
7940 break;
7941
7942 case CTOR_INITIALIZER_DELEGATING:
7943 TInfo = GetTypeSourceInfo(F, Record, Idx);
7944 break;
7945
7946 case CTOR_INITIALIZER_MEMBER:
7947 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7948 break;
7949
7950 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7951 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7952 break;
7953 }
7954
7955 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7956 Expr *Init = ReadExpr(F);
7957 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7958 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7959 bool IsWritten = Record[Idx++];
7960 unsigned SourceOrderOrNumArrayIndices;
7961 SmallVector<VarDecl *, 8> Indices;
7962 if (IsWritten) {
7963 SourceOrderOrNumArrayIndices = Record[Idx++];
7964 } else {
7965 SourceOrderOrNumArrayIndices = Record[Idx++];
7966 Indices.reserve(SourceOrderOrNumArrayIndices);
7967 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7968 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7969 }
7970
7971 CXXCtorInitializer *BOMInit;
7972 if (Type == CTOR_INITIALIZER_BASE) {
7973 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7974 LParenLoc, Init, RParenLoc,
7975 MemberOrEllipsisLoc);
7976 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7977 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7978 Init, RParenLoc);
7979 } else if (IsWritten) {
7980 if (Member)
7981 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7982 LParenLoc, Init, RParenLoc);
7983 else
7984 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7985 MemberOrEllipsisLoc, LParenLoc,
7986 Init, RParenLoc);
7987 } else {
Argyrios Kyrtzidis794671d2013-05-30 23:59:46 +00007988 if (IndirectMember) {
7989 assert(Indices.empty() && "Indirect field improperly initialized");
7990 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7991 MemberOrEllipsisLoc, LParenLoc,
7992 Init, RParenLoc);
7993 } else {
7994 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7995 LParenLoc, Init, RParenLoc,
7996 Indices.data(), Indices.size());
7997 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007998 }
7999
8000 if (IsWritten)
8001 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
8002 CtorInitializers[i] = BOMInit;
8003 }
8004 }
8005
8006 return std::make_pair(CtorInitializers, NumInitializers);
8007}
8008
8009NestedNameSpecifier *
8010ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
8011 const RecordData &Record, unsigned &Idx) {
8012 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00008013 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008014 for (unsigned I = 0; I != N; ++I) {
8015 NestedNameSpecifier::SpecifierKind Kind
8016 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8017 switch (Kind) {
8018 case NestedNameSpecifier::Identifier: {
8019 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8020 NNS = NestedNameSpecifier::Create(Context, Prev, II);
8021 break;
8022 }
8023
8024 case NestedNameSpecifier::Namespace: {
8025 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8026 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8027 break;
8028 }
8029
8030 case NestedNameSpecifier::NamespaceAlias: {
8031 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8032 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8033 break;
8034 }
8035
8036 case NestedNameSpecifier::TypeSpec:
8037 case NestedNameSpecifier::TypeSpecWithTemplate: {
8038 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
8039 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00008040 return nullptr;
8041
Guy Benyei11169dd2012-12-18 14:30:41 +00008042 bool Template = Record[Idx++];
8043 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8044 break;
8045 }
8046
8047 case NestedNameSpecifier::Global: {
8048 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8049 // No associated value, and there can't be a prefix.
8050 break;
8051 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008052
8053 case NestedNameSpecifier::Super: {
8054 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8055 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8056 break;
8057 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008058 }
8059 Prev = NNS;
8060 }
8061 return NNS;
8062}
8063
8064NestedNameSpecifierLoc
8065ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8066 unsigned &Idx) {
8067 unsigned N = Record[Idx++];
8068 NestedNameSpecifierLocBuilder Builder;
8069 for (unsigned I = 0; I != N; ++I) {
8070 NestedNameSpecifier::SpecifierKind Kind
8071 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8072 switch (Kind) {
8073 case NestedNameSpecifier::Identifier: {
8074 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8075 SourceRange Range = ReadSourceRange(F, Record, Idx);
8076 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8077 break;
8078 }
8079
8080 case NestedNameSpecifier::Namespace: {
8081 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8082 SourceRange Range = ReadSourceRange(F, Record, Idx);
8083 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8084 break;
8085 }
8086
8087 case NestedNameSpecifier::NamespaceAlias: {
8088 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8089 SourceRange Range = ReadSourceRange(F, Record, Idx);
8090 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8091 break;
8092 }
8093
8094 case NestedNameSpecifier::TypeSpec:
8095 case NestedNameSpecifier::TypeSpecWithTemplate: {
8096 bool Template = Record[Idx++];
8097 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
8098 if (!T)
8099 return NestedNameSpecifierLoc();
8100 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8101
8102 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8103 Builder.Extend(Context,
8104 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8105 T->getTypeLoc(), ColonColonLoc);
8106 break;
8107 }
8108
8109 case NestedNameSpecifier::Global: {
8110 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8111 Builder.MakeGlobal(Context, ColonColonLoc);
8112 break;
8113 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008114
8115 case NestedNameSpecifier::Super: {
8116 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8117 SourceRange Range = ReadSourceRange(F, Record, Idx);
8118 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8119 break;
8120 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008121 }
8122 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008123
Guy Benyei11169dd2012-12-18 14:30:41 +00008124 return Builder.getWithLocInContext(Context);
8125}
8126
8127SourceRange
8128ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8129 unsigned &Idx) {
8130 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8131 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8132 return SourceRange(beg, end);
8133}
8134
8135/// \brief Read an integral value
8136llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8137 unsigned BitWidth = Record[Idx++];
8138 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8139 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8140 Idx += NumWords;
8141 return Result;
8142}
8143
8144/// \brief Read a signed integral value
8145llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8146 bool isUnsigned = Record[Idx++];
8147 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8148}
8149
8150/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00008151llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8152 const llvm::fltSemantics &Sem,
8153 unsigned &Idx) {
8154 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00008155}
8156
8157// \brief Read a string
8158std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8159 unsigned Len = Record[Idx++];
8160 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8161 Idx += Len;
8162 return Result;
8163}
8164
Richard Smith7ed1bc92014-12-05 22:42:13 +00008165std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8166 unsigned &Idx) {
8167 std::string Filename = ReadString(Record, Idx);
8168 ResolveImportedPath(F, Filename);
8169 return Filename;
8170}
8171
Guy Benyei11169dd2012-12-18 14:30:41 +00008172VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8173 unsigned &Idx) {
8174 unsigned Major = Record[Idx++];
8175 unsigned Minor = Record[Idx++];
8176 unsigned Subminor = Record[Idx++];
8177 if (Minor == 0)
8178 return VersionTuple(Major);
8179 if (Subminor == 0)
8180 return VersionTuple(Major, Minor - 1);
8181 return VersionTuple(Major, Minor - 1, Subminor - 1);
8182}
8183
8184CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8185 const RecordData &Record,
8186 unsigned &Idx) {
8187 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8188 return CXXTemporary::Create(Context, Decl);
8189}
8190
8191DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008192 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008193}
8194
8195DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8196 return Diags.Report(Loc, DiagID);
8197}
8198
8199/// \brief Retrieve the identifier table associated with the
8200/// preprocessor.
8201IdentifierTable &ASTReader::getIdentifierTable() {
8202 return PP.getIdentifierTable();
8203}
8204
8205/// \brief Record that the given ID maps to the given switch-case
8206/// statement.
8207void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008208 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008209 "Already have a SwitchCase with this ID");
8210 (*CurrSwitchCaseStmts)[ID] = SC;
8211}
8212
8213/// \brief Retrieve the switch-case statement with the given ID.
8214SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008215 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008216 return (*CurrSwitchCaseStmts)[ID];
8217}
8218
8219void ASTReader::ClearSwitchCaseIDs() {
8220 CurrSwitchCaseStmts->clear();
8221}
8222
8223void ASTReader::ReadComments() {
8224 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008225 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00008226 serialization::ModuleFile *> >::iterator
8227 I = CommentsCursors.begin(),
8228 E = CommentsCursors.end();
8229 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008230 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008231 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00008232 serialization::ModuleFile &F = *I->second;
8233 SavedStreamPosition SavedPosition(Cursor);
8234
8235 RecordData Record;
8236 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008237 llvm::BitstreamEntry Entry =
8238 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008239
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008240 switch (Entry.Kind) {
8241 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8242 case llvm::BitstreamEntry::Error:
8243 Error("malformed block record in AST file");
8244 return;
8245 case llvm::BitstreamEntry::EndBlock:
8246 goto NextCursor;
8247 case llvm::BitstreamEntry::Record:
8248 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00008249 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008250 }
8251
8252 // Read a record.
8253 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00008254 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008255 case COMMENTS_RAW_COMMENT: {
8256 unsigned Idx = 0;
8257 SourceRange SR = ReadSourceRange(F, Record, Idx);
8258 RawComment::CommentKind Kind =
8259 (RawComment::CommentKind) Record[Idx++];
8260 bool IsTrailingComment = Record[Idx++];
8261 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00008262 Comments.push_back(new (Context) RawComment(
8263 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8264 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00008265 break;
8266 }
8267 }
8268 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008269 NextCursor:
8270 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00008271 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008272}
8273
Argyrios Kyrtzidis1bde1172014-11-18 05:24:18 +00008274void ASTReader::getInputFiles(ModuleFile &F,
8275 SmallVectorImpl<serialization::InputFile> &Files) {
8276 for (unsigned I = 0, E = F.InputFilesLoaded.size(); I != E; ++I) {
8277 unsigned ID = I+1;
8278 Files.push_back(getInputFile(F, ID));
8279 }
8280}
8281
Richard Smithcd45dbc2014-04-19 03:48:30 +00008282std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8283 // If we know the owning module, use it.
8284 if (Module *M = D->getOwningModule())
8285 return M->getFullModuleName();
8286
8287 // Otherwise, use the name of the top-level module the decl is within.
8288 if (ModuleFile *M = getOwningModuleFile(D))
8289 return M->ModuleName;
8290
8291 // Not from a module.
8292 return "";
8293}
8294
Guy Benyei11169dd2012-12-18 14:30:41 +00008295void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008296 while (!PendingIdentifierInfos.empty() ||
8297 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008298 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008299 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008300 // If any identifiers with corresponding top-level declarations have
8301 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008302 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8303 TopLevelDeclsMap;
8304 TopLevelDeclsMap TopLevelDecls;
8305
Guy Benyei11169dd2012-12-18 14:30:41 +00008306 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008307 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008308 SmallVector<uint32_t, 4> DeclIDs =
8309 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008310 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008311
8312 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008313 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008314
Richard Smith851072e2014-05-19 20:59:20 +00008315 // For each decl chain that we wanted to complete while deserializing, mark
8316 // it as "still needs to be completed".
8317 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8318 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8319 }
8320 PendingIncompleteDeclChains.clear();
8321
Guy Benyei11169dd2012-12-18 14:30:41 +00008322 // Load pending declaration chains.
8323 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
8324 loadPendingDeclChain(PendingDeclChains[I]);
8325 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8326 }
8327 PendingDeclChains.clear();
8328
Douglas Gregor6168bd22013-02-18 15:53:43 +00008329 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008330 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8331 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008332 IdentifierInfo *II = TLD->first;
8333 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008334 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008335 }
8336 }
8337
Guy Benyei11169dd2012-12-18 14:30:41 +00008338 // Load any pending macro definitions.
8339 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008340 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8341 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8342 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8343 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008344 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008345 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008346 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008347 if (Info.M->Kind != MK_ImplicitModule &&
8348 Info.M->Kind != MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008349 resolvePendingMacro(II, Info);
8350 }
8351 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008352 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008353 ++IDIdx) {
8354 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008355 if (Info.M->Kind == MK_ImplicitModule ||
8356 Info.M->Kind == MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008357 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008358 }
8359 }
8360 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008361
8362 // Wire up the DeclContexts for Decls that we delayed setting until
8363 // recursive loading is completed.
8364 while (!PendingDeclContextInfos.empty()) {
8365 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8366 PendingDeclContextInfos.pop_front();
8367 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8368 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8369 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8370 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008371
Richard Smithd1c46742014-04-30 02:24:17 +00008372 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008373 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008374 auto Update = PendingUpdateRecords.pop_back_val();
8375 ReadingKindTracker ReadingKind(Read_Decl, *this);
8376 loadDeclUpdateRecords(Update.first, Update.second);
8377 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008378 }
Richard Smith8a639892015-01-24 01:07:20 +00008379
8380 // At this point, all update records for loaded decls are in place, so any
8381 // fake class definitions should have become real.
8382 assert(PendingFakeDefinitionData.empty() &&
8383 "faked up a class definition but never saw the real one");
8384
Guy Benyei11169dd2012-12-18 14:30:41 +00008385 // If we deserialized any C++ or Objective-C class definitions, any
8386 // Objective-C protocol definitions, or any redeclarable templates, make sure
8387 // that all redeclarations point to the definitions. Note that this can only
8388 // happen now, after the redeclaration chains have been fully wired.
Craig Topperc6914d02014-08-25 04:15:02 +00008389 for (Decl *D : PendingDefinitions) {
8390 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008391 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008392 // Make sure that the TagType points at the definition.
8393 const_cast<TagType*>(TagT)->decl = TD;
8394 }
8395
Craig Topperc6914d02014-08-25 04:15:02 +00008396 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith2c381642014-08-27 23:11:59 +00008397 for (auto R : RD->redecls()) {
8398 assert((R == D) == R->isThisDeclarationADefinition() &&
8399 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00008400 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00008401 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008402 }
8403
8404 continue;
8405 }
8406
Craig Topperc6914d02014-08-25 04:15:02 +00008407 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008408 // Make sure that the ObjCInterfaceType points at the definition.
8409 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8410 ->Decl = ID;
8411
Aaron Ballman86c93902014-03-06 23:45:36 +00008412 for (auto R : ID->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008413 R->Data = ID->Data;
8414
8415 continue;
8416 }
8417
Craig Topperc6914d02014-08-25 04:15:02 +00008418 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Aaron Ballman86c93902014-03-06 23:45:36 +00008419 for (auto R : PD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008420 R->Data = PD->Data;
8421
8422 continue;
8423 }
8424
Craig Topperc6914d02014-08-25 04:15:02 +00008425 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Aaron Ballman86c93902014-03-06 23:45:36 +00008426 for (auto R : RTD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008427 R->Common = RTD->Common;
8428 }
8429 PendingDefinitions.clear();
8430
8431 // Load the bodies of any functions or methods we've encountered. We do
8432 // this now (delayed) so that we can be sure that the declaration chains
8433 // have been fully wired up.
8434 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8435 PBEnd = PendingBodies.end();
8436 PB != PBEnd; ++PB) {
8437 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8438 // FIXME: Check for =delete/=default?
8439 // FIXME: Complain about ODR violations here?
8440 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8441 FD->setLazyBody(PB->second);
8442 continue;
8443 }
8444
8445 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8446 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8447 MD->setLazyBody(PB->second);
8448 }
8449 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008450}
8451
8452void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008453 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8454 return;
8455
Richard Smitha0ce9c42014-07-29 23:23:27 +00008456 // Trigger the import of the full definition of each class that had any
8457 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008458 // These updates may in turn find and diagnose some ODR failures, so take
8459 // ownership of the set first.
8460 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8461 PendingOdrMergeFailures.clear();
8462 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008463 Merge.first->buildLookup();
8464 Merge.first->decls_begin();
8465 Merge.first->bases_begin();
8466 Merge.first->vbases_begin();
8467 for (auto *RD : Merge.second) {
8468 RD->decls_begin();
8469 RD->bases_begin();
8470 RD->vbases_begin();
8471 }
8472 }
8473
8474 // For each declaration from a merged context, check that the canonical
8475 // definition of that context also contains a declaration of the same
8476 // entity.
8477 //
8478 // Caution: this loop does things that might invalidate iterators into
8479 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8480 while (!PendingOdrMergeChecks.empty()) {
8481 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8482
8483 // FIXME: Skip over implicit declarations for now. This matters for things
8484 // like implicitly-declared special member functions. This isn't entirely
8485 // correct; we can end up with multiple unmerged declarations of the same
8486 // implicit entity.
8487 if (D->isImplicit())
8488 continue;
8489
8490 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008491
8492 bool Found = false;
8493 const Decl *DCanon = D->getCanonicalDecl();
8494
Richard Smith01bdb7a2014-08-28 05:44:07 +00008495 for (auto RI : D->redecls()) {
8496 if (RI->getLexicalDeclContext() == CanonDef) {
8497 Found = true;
8498 break;
8499 }
8500 }
8501 if (Found)
8502 continue;
8503
Richard Smitha0ce9c42014-07-29 23:23:27 +00008504 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith01bdb7a2014-08-28 05:44:07 +00008505 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
Richard Smitha0ce9c42014-07-29 23:23:27 +00008506 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8507 !Found && I != E; ++I) {
8508 for (auto RI : (*I)->redecls()) {
8509 if (RI->getLexicalDeclContext() == CanonDef) {
8510 // This declaration is present in the canonical definition. If it's
8511 // in the same redecl chain, it's the one we're looking for.
8512 if (RI->getCanonicalDecl() == DCanon)
8513 Found = true;
8514 else
8515 Candidates.push_back(cast<NamedDecl>(RI));
8516 break;
8517 }
8518 }
8519 }
8520
8521 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00008522 // The AST doesn't like TagDecls becoming invalid after they've been
8523 // completed. We only really need to mark FieldDecls as invalid here.
8524 if (!isa<TagDecl>(D))
8525 D->setInvalidDecl();
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008526
8527 // Ensure we don't accidentally recursively enter deserialization while
8528 // we're producing our diagnostic.
8529 Deserializing RecursionGuard(this);
Richard Smitha0ce9c42014-07-29 23:23:27 +00008530
8531 std::string CanonDefModule =
8532 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8533 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8534 << D << getOwningModuleNameForDiagnostic(D)
8535 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8536
8537 if (Candidates.empty())
8538 Diag(cast<Decl>(CanonDef)->getLocation(),
8539 diag::note_module_odr_violation_no_possible_decls) << D;
8540 else {
8541 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8542 Diag(Candidates[I]->getLocation(),
8543 diag::note_module_odr_violation_possible_decl)
8544 << Candidates[I];
8545 }
8546
8547 DiagnosedOdrMergeFailures.insert(CanonDef);
8548 }
8549 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008550
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008551 if (OdrMergeFailures.empty())
8552 return;
8553
8554 // Ensure we don't accidentally recursively enter deserialization while
8555 // we're producing our diagnostics.
8556 Deserializing RecursionGuard(this);
8557
Richard Smithcd45dbc2014-04-19 03:48:30 +00008558 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008559 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008560 // If we've already pointed out a specific problem with this class, don't
8561 // bother issuing a general "something's different" diagnostic.
David Blaikie82e95a32014-11-19 07:49:47 +00008562 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
Richard Smithcd45dbc2014-04-19 03:48:30 +00008563 continue;
8564
8565 bool Diagnosed = false;
8566 for (auto *RD : Merge.second) {
8567 // Multiple different declarations got merged together; tell the user
8568 // where they came from.
8569 if (Merge.first != RD) {
8570 // FIXME: Walk the definition, figure out what's different,
8571 // and diagnose that.
8572 if (!Diagnosed) {
8573 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8574 Diag(Merge.first->getLocation(),
8575 diag::err_module_odr_violation_different_definitions)
8576 << Merge.first << Module.empty() << Module;
8577 Diagnosed = true;
8578 }
8579
8580 Diag(RD->getLocation(),
8581 diag::note_module_odr_violation_different_definitions)
8582 << getOwningModuleNameForDiagnostic(RD);
8583 }
8584 }
8585
8586 if (!Diagnosed) {
8587 // All definitions are updates to the same declaration. This happens if a
8588 // module instantiates the declaration of a class template specialization
8589 // and two or more other modules instantiate its definition.
8590 //
8591 // FIXME: Indicate which modules had instantiations of this definition.
8592 // FIXME: How can this even happen?
8593 Diag(Merge.first->getLocation(),
8594 diag::err_module_odr_violation_different_instantiations)
8595 << Merge.first;
8596 }
8597 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008598}
8599
8600void ASTReader::FinishedDeserializing() {
8601 assert(NumCurrentElementsDeserializing &&
8602 "FinishedDeserializing not paired with StartedDeserializing");
8603 if (NumCurrentElementsDeserializing == 1) {
8604 // We decrease NumCurrentElementsDeserializing only after pending actions
8605 // are finished, to avoid recursively re-calling finishPendingActions().
8606 finishPendingActions();
8607 }
8608 --NumCurrentElementsDeserializing;
8609
Richard Smitha0ce9c42014-07-29 23:23:27 +00008610 if (NumCurrentElementsDeserializing == 0) {
8611 diagnoseOdrViolations();
8612
Richard Smith04d05b52014-03-23 00:27:18 +00008613 // We are not in recursive loading, so it's safe to pass the "interesting"
8614 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008615 if (Consumer)
8616 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008617 }
8618}
8619
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008620void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Rafael Espindola7b56f6c2013-10-19 16:55:03 +00008621 D = D->getMostRecentDecl();
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008622
8623 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8624 SemaObj->TUScope->AddDecl(D);
8625 } else if (SemaObj->TUScope) {
8626 // Adding the decl to IdResolver may have failed because it was already in
8627 // (even though it was not added in scope). If it is already in, make sure
8628 // it gets in the scope as well.
8629 if (std::find(SemaObj->IdResolver.begin(Name),
8630 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8631 SemaObj->TUScope->AddDecl(D);
8632 }
8633}
8634
Nico Weber824285e2014-05-08 04:26:47 +00008635ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8636 bool DisableValidation, bool AllowASTWithCompilerErrors,
8637 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008638 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008639 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008640 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008641 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8642 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8643 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8644 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008645 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8646 AllowConfigurationMismatch(AllowConfigurationMismatch),
8647 ValidateSystemInputs(ValidateSystemInputs),
8648 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008649 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008650 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8651 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8652 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8653 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8654 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8655 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8656 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8657 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8658 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8659 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8660 ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008661 SourceMgr.setExternalSLocEntrySource(this);
8662}
8663
8664ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008665 if (OwnsDeserializationListener)
8666 delete DeserializationListener;
8667
Guy Benyei11169dd2012-12-18 14:30:41 +00008668 for (DeclContextVisibleUpdatesPending::iterator
8669 I = PendingVisibleUpdates.begin(),
8670 E = PendingVisibleUpdates.end();
8671 I != E; ++I) {
8672 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8673 F = I->second.end();
8674 J != F; ++J)
8675 delete J->first;
8676 }
8677}