blob: d3721bbe34234e067525cb44f84aa55cf9760637 [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
Guy Benyei11169dd2012-12-18 14:30:41 +00003102 case PENDING_IMPLICIT_INSTANTIATIONS:
3103 if (PendingInstantiations.size() % 2 != 0) {
3104 Error("Invalid existing PendingInstantiations");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003105 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003106 }
3107
3108 if (Record.size() % 2 != 0) {
3109 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003110 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003111 }
3112
3113 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3114 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3115 PendingInstantiations.push_back(
3116 ReadSourceLocation(F, Record, I).getRawEncoding());
3117 }
3118 break;
3119
3120 case SEMA_DECL_REFS:
Richard Smith3d8e97e2013-10-18 06:54:39 +00003121 if (Record.size() != 2) {
3122 Error("Invalid SEMA_DECL_REFS block");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003123 return Failure;
Richard Smith3d8e97e2013-10-18 06:54:39 +00003124 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003125 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3126 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3127 break;
3128
3129 case PPD_ENTITIES_OFFSETS: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003130 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3131 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3132 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei11169dd2012-12-18 14:30:41 +00003133
3134 unsigned LocalBasePreprocessedEntityID = Record[0];
3135
3136 unsigned StartingID;
3137 if (!PP.getPreprocessingRecord())
3138 PP.createPreprocessingRecord();
3139 if (!PP.getPreprocessingRecord()->getExternalSource())
3140 PP.getPreprocessingRecord()->SetExternalSource(*this);
3141 StartingID
3142 = PP.getPreprocessingRecord()
Ben Langmuir52ca6782014-10-20 16:27:32 +00003143 ->allocateLoadedEntities(F.NumPreprocessedEntities);
Guy Benyei11169dd2012-12-18 14:30:41 +00003144 F.BasePreprocessedEntityID = StartingID;
3145
3146 if (F.NumPreprocessedEntities > 0) {
3147 // Introduce the global -> local mapping for preprocessed entities in
3148 // this module.
3149 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3150
3151 // Introduce the local -> global mapping for preprocessed entities in
3152 // this module.
3153 F.PreprocessedEntityRemap.insertOrReplace(
3154 std::make_pair(LocalBasePreprocessedEntityID,
3155 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3156 }
3157
3158 break;
3159 }
3160
3161 case DECL_UPDATE_OFFSETS: {
3162 if (Record.size() % 2 != 0) {
3163 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003164 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003165 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00003166 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3167 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3168 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3169
3170 // If we've already loaded the decl, perform the updates when we finish
3171 // loading this block.
3172 if (Decl *D = GetExistingDecl(ID))
3173 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3174 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003175 break;
3176 }
3177
3178 case DECL_REPLACEMENTS: {
3179 if (Record.size() % 3 != 0) {
3180 Error("invalid DECL_REPLACEMENTS block in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003181 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003182 }
3183 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3184 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3185 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3186 break;
3187 }
3188
3189 case OBJC_CATEGORIES_MAP: {
3190 if (F.LocalNumObjCCategoriesInMap != 0) {
3191 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003192 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003193 }
3194
3195 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003196 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003197 break;
3198 }
3199
3200 case OBJC_CATEGORIES:
3201 F.ObjCCategories.swap(Record);
3202 break;
3203
3204 case CXX_BASE_SPECIFIER_OFFSETS: {
3205 if (F.LocalNumCXXBaseSpecifiers != 0) {
3206 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003207 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003208 }
3209
3210 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003211 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003212 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3213 break;
3214 }
3215
3216 case DIAG_PRAGMA_MAPPINGS:
3217 if (F.PragmaDiagMappings.empty())
3218 F.PragmaDiagMappings.swap(Record);
3219 else
3220 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3221 Record.begin(), Record.end());
3222 break;
3223
3224 case CUDA_SPECIAL_DECL_REFS:
3225 // Later tables overwrite earlier ones.
3226 // FIXME: Modules will have trouble with this.
3227 CUDASpecialDeclRefs.clear();
3228 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3229 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3230 break;
3231
3232 case HEADER_SEARCH_TABLE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00003233 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003234 F.LocalNumHeaderFileInfos = Record[1];
Guy Benyei11169dd2012-12-18 14:30:41 +00003235 if (Record[0]) {
3236 F.HeaderFileInfoTable
3237 = HeaderFileInfoLookupTable::Create(
3238 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3239 (const unsigned char *)F.HeaderFileInfoTableData,
3240 HeaderFileInfoTrait(*this, F,
3241 &PP.getHeaderSearchInfo(),
Chris Lattner0e6c9402013-01-20 02:38:54 +00003242 Blob.data() + Record[2]));
Guy Benyei11169dd2012-12-18 14:30:41 +00003243
3244 PP.getHeaderSearchInfo().SetExternalSource(this);
3245 if (!PP.getHeaderSearchInfo().getExternalLookup())
3246 PP.getHeaderSearchInfo().SetExternalLookup(this);
3247 }
3248 break;
3249 }
3250
3251 case FP_PRAGMA_OPTIONS:
3252 // Later tables overwrite earlier ones.
3253 FPPragmaOptions.swap(Record);
3254 break;
3255
3256 case OPENCL_EXTENSIONS:
3257 // Later tables overwrite earlier ones.
3258 OpenCLExtensions.swap(Record);
3259 break;
3260
3261 case TENTATIVE_DEFINITIONS:
3262 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3263 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3264 break;
3265
3266 case KNOWN_NAMESPACES:
3267 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3268 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3269 break;
Nick Lewycky8334af82013-01-26 00:35:08 +00003270
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003271 case UNDEFINED_BUT_USED:
3272 if (UndefinedButUsed.size() % 2 != 0) {
3273 Error("Invalid existing UndefinedButUsed");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003274 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003275 }
3276
3277 if (Record.size() % 2 != 0) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003278 Error("invalid undefined-but-used record");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003279 return Failure;
Nick Lewycky8334af82013-01-26 00:35:08 +00003280 }
3281 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00003282 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3283 UndefinedButUsed.push_back(
Nick Lewycky8334af82013-01-26 00:35:08 +00003284 ReadSourceLocation(F, Record, I).getRawEncoding());
3285 }
3286 break;
3287
Guy Benyei11169dd2012-12-18 14:30:41 +00003288 case IMPORTED_MODULES: {
Richard Smithe842a472014-10-22 02:05:46 +00003289 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003290 // If we aren't loading a module (which has its own exports), make
3291 // all of the imported modules visible.
3292 // FIXME: Deal with macros-only imports.
Richard Smith56be7542014-03-21 00:33:59 +00003293 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3294 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3295 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3296 if (GlobalID)
Aaron Ballman4f45b712014-03-21 15:22:56 +00003297 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
Guy Benyei11169dd2012-12-18 14:30:41 +00003298 }
3299 }
3300 break;
3301 }
3302
3303 case LOCAL_REDECLARATIONS: {
3304 F.RedeclarationChains.swap(Record);
3305 break;
3306 }
3307
3308 case LOCAL_REDECLARATIONS_MAP: {
3309 if (F.LocalNumRedeclarationsInMap != 0) {
3310 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003311 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003312 }
3313
3314 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattner0e6c9402013-01-20 02:38:54 +00003315 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003316 break;
3317 }
3318
Guy Benyei11169dd2012-12-18 14:30:41 +00003319 case MACRO_OFFSET: {
3320 if (F.LocalNumMacros != 0) {
3321 Error("duplicate MACRO_OFFSET record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00003322 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00003323 }
Chris Lattner0e6c9402013-01-20 02:38:54 +00003324 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei11169dd2012-12-18 14:30:41 +00003325 F.LocalNumMacros = Record[0];
3326 unsigned LocalBaseMacroID = Record[1];
3327 F.BaseMacroID = getTotalNumMacros();
3328
3329 if (F.LocalNumMacros > 0) {
3330 // Introduce the global -> local mapping for macros within this module.
3331 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3332
3333 // Introduce the local -> global mapping for macros within this module.
3334 F.MacroRemap.insertOrReplace(
3335 std::make_pair(LocalBaseMacroID,
3336 F.BaseMacroID - LocalBaseMacroID));
Ben Langmuir52ca6782014-10-20 16:27:32 +00003337
3338 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
Guy Benyei11169dd2012-12-18 14:30:41 +00003339 }
3340 break;
3341 }
3342
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00003343 case MACRO_TABLE: {
3344 // FIXME: Not used yet.
Guy Benyei11169dd2012-12-18 14:30:41 +00003345 break;
3346 }
Richard Smithe40f2ba2013-08-07 21:41:30 +00003347
3348 case LATE_PARSED_TEMPLATE: {
3349 LateParsedTemplates.append(Record.begin(), Record.end());
3350 break;
3351 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00003352
3353 case OPTIMIZE_PRAGMA_OPTIONS:
3354 if (Record.size() != 1) {
3355 Error("invalid pragma optimize record");
3356 return Failure;
3357 }
3358 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3359 break;
Nico Weber72889432014-09-06 01:25:55 +00003360
3361 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3362 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3363 UnusedLocalTypedefNameCandidates.push_back(
3364 getGlobalDeclID(F, Record[I]));
3365 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003366 }
3367 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003368}
3369
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003370ASTReader::ASTReadResult
3371ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3372 const ModuleFile *ImportedBy,
3373 unsigned ClientLoadCapabilities) {
3374 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00003375 F.ModuleMapPath = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003376
Richard Smithe842a472014-10-22 02:05:46 +00003377 if (F.Kind == MK_ExplicitModule) {
3378 // For an explicitly-loaded module, we don't care whether the original
3379 // module map file exists or matches.
3380 return Success;
3381 }
3382
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003383 // Try to resolve ModuleName in the current header search context and
3384 // verify that it is found in the same module map file as we saved. If the
3385 // top-level AST file is a main file, skip this check because there is no
3386 // usable header search context.
3387 assert(!F.ModuleName.empty() &&
Richard Smithe842a472014-10-22 02:05:46 +00003388 "MODULE_NAME should come before MODULE_MAP_FILE");
3389 if (F.Kind == MK_ImplicitModule &&
3390 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3391 // An implicitly-loaded module file should have its module listed in some
3392 // module map file that we've already loaded.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003393 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
Richard Smithe842a472014-10-22 02:05:46 +00003394 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3395 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3396 if (!ModMap) {
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003397 assert(ImportedBy && "top-level import should be verified");
3398 if ((ClientLoadCapabilities & ARR_Missing) == 0)
Richard Smithe842a472014-10-22 02:05:46 +00003399 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName
3400 << ImportedBy->FileName
3401 << F.ModuleMapPath;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003402 return Missing;
3403 }
3404
Richard Smithe842a472014-10-22 02:05:46 +00003405 assert(M->Name == F.ModuleName && "found module with different name");
3406
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003407 // Check the primary module map file.
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003408 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003409 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3410 assert(ModMap && "found module is missing module map file");
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003411 assert(ImportedBy && "top-level import should be verified");
3412 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3413 Diag(diag::err_imported_module_modmap_changed)
3414 << F.ModuleName << ImportedBy->FileName
3415 << ModMap->getName() << F.ModuleMapPath;
3416 return OutOfDate;
3417 }
3418
3419 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3420 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3421 // FIXME: we should use input files rather than storing names.
Richard Smith7ed1bc92014-12-05 22:42:13 +00003422 std::string Filename = ReadPath(F, Record, Idx);
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00003423 const FileEntry *F =
3424 FileMgr.getFile(Filename, false, false);
3425 if (F == nullptr) {
3426 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3427 Error("could not find file '" + Filename +"' referenced by AST file");
3428 return OutOfDate;
3429 }
3430 AdditionalStoredMaps.insert(F);
3431 }
3432
3433 // Check any additional module map files (e.g. module.private.modulemap)
3434 // that are not in the pcm.
3435 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3436 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3437 // Remove files that match
3438 // Note: SmallPtrSet::erase is really remove
3439 if (!AdditionalStoredMaps.erase(ModMap)) {
3440 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3441 Diag(diag::err_module_different_modmap)
3442 << F.ModuleName << /*new*/0 << ModMap->getName();
3443 return OutOfDate;
3444 }
3445 }
3446 }
3447
3448 // Check any additional module map files that are in the pcm, but not
3449 // found in header search. Cases that match are already removed.
3450 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3451 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3452 Diag(diag::err_module_different_modmap)
3453 << F.ModuleName << /*not new*/1 << ModMap->getName();
3454 return OutOfDate;
3455 }
3456 }
3457
3458 if (Listener)
3459 Listener->ReadModuleMapFile(F.ModuleMapPath);
3460 return Success;
3461}
3462
3463
Douglas Gregorc1489562013-02-12 23:36:21 +00003464/// \brief Move the given method to the back of the global list of methods.
3465static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3466 // Find the entry for this selector in the method pool.
3467 Sema::GlobalMethodPool::iterator Known
3468 = S.MethodPool.find(Method->getSelector());
3469 if (Known == S.MethodPool.end())
3470 return;
3471
3472 // Retrieve the appropriate method list.
3473 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3474 : Known->second.second;
3475 bool Found = false;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003476 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003477 if (!Found) {
Nico Weber2e0c8f72014-12-27 03:58:08 +00003478 if (List->getMethod() == Method) {
Douglas Gregorc1489562013-02-12 23:36:21 +00003479 Found = true;
3480 } else {
3481 // Keep searching.
3482 continue;
3483 }
3484 }
3485
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00003486 if (List->getNext())
Nico Weber2e0c8f72014-12-27 03:58:08 +00003487 List->setMethod(List->getNext()->getMethod());
Douglas Gregorc1489562013-02-12 23:36:21 +00003488 else
Nico Weber2e0c8f72014-12-27 03:58:08 +00003489 List->setMethod(Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003490 }
3491}
3492
Richard Smithe657bbd2014-07-18 22:13:40 +00003493void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3494 bool FromFinalization) {
3495 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
Richard Smith57721ac2014-07-21 04:10:40 +00003496 for (Decl *D : Names.HiddenDecls) {
Richard Smith49f906a2014-03-01 00:08:04 +00003497 bool wasHidden = D->Hidden;
3498 D->Hidden = false;
Guy Benyei11169dd2012-12-18 14:30:41 +00003499
Richard Smith49f906a2014-03-01 00:08:04 +00003500 if (wasHidden && SemaObj) {
3501 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3502 moveMethodToBackOfGlobalList(*SemaObj, Method);
Douglas Gregorc1489562013-02-12 23:36:21 +00003503 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003504 }
3505 }
Richard Smith49f906a2014-03-01 00:08:04 +00003506
Richard Smithe657bbd2014-07-18 22:13:40 +00003507 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3508 "nothing to make visible?");
Richard Smithdaa69e02014-07-25 04:40:03 +00003509 for (const auto &Macro : Names.HiddenMacros) {
3510 if (FromFinalization)
3511 PP.appendMacroDirective(Macro.first,
3512 Macro.second->import(PP, SourceLocation()));
3513 else
3514 installImportedMacro(Macro.first, Macro.second, Owner);
3515 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003516}
3517
Richard Smith49f906a2014-03-01 00:08:04 +00003518void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00003519 Module::NameVisibilityKind NameVisibility,
Douglas Gregorfb912652013-03-20 21:10:35 +00003520 SourceLocation ImportLoc,
3521 bool Complain) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003522 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003523 SmallVector<Module *, 4> Stack;
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003524 Stack.push_back(Mod);
Guy Benyei11169dd2012-12-18 14:30:41 +00003525 while (!Stack.empty()) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003526 Mod = Stack.pop_back_val();
Guy Benyei11169dd2012-12-18 14:30:41 +00003527
3528 if (NameVisibility <= Mod->NameVisibility) {
Robert Wilhelm25284cc2013-08-23 16:11:15 +00003529 // This module already has this level of visibility (or greater), so
Guy Benyei11169dd2012-12-18 14:30:41 +00003530 // there is nothing more to do.
3531 continue;
3532 }
Richard Smith49f906a2014-03-01 00:08:04 +00003533
Guy Benyei11169dd2012-12-18 14:30:41 +00003534 if (!Mod->isAvailable()) {
3535 // Modules that aren't available cannot be made visible.
3536 continue;
3537 }
3538
3539 // Update the module's name visibility.
Richard Smith49f906a2014-03-01 00:08:04 +00003540 if (NameVisibility >= Module::MacrosVisible &&
3541 Mod->NameVisibility < Module::MacrosVisible)
3542 Mod->MacroVisibilityLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003543 Mod->NameVisibility = NameVisibility;
Richard Smith49f906a2014-03-01 00:08:04 +00003544
Guy Benyei11169dd2012-12-18 14:30:41 +00003545 // If we've already deserialized any names from this module,
3546 // mark them as visible.
3547 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3548 if (Hidden != HiddenNamesMap.end()) {
Richard Smith57721ac2014-07-21 04:10:40 +00003549 auto HiddenNames = std::move(*Hidden);
Guy Benyei11169dd2012-12-18 14:30:41 +00003550 HiddenNamesMap.erase(Hidden);
Richard Smith57721ac2014-07-21 04:10:40 +00003551 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3552 /*FromFinalization*/false);
3553 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3554 "making names visible added hidden names");
Guy Benyei11169dd2012-12-18 14:30:41 +00003555 }
Dmitri Gribenkoe9bcf5b2013-11-04 21:51:33 +00003556
Guy Benyei11169dd2012-12-18 14:30:41 +00003557 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003558 SmallVector<Module *, 16> Exports;
3559 Mod->getExportedModules(Exports);
3560 for (SmallVectorImpl<Module *>::iterator
3561 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3562 Module *Exported = *I;
David Blaikie82e95a32014-11-19 07:49:47 +00003563 if (Visited.insert(Exported).second)
Argyrios Kyrtzidis8739f7b2013-02-19 19:34:40 +00003564 Stack.push_back(Exported);
Guy Benyei11169dd2012-12-18 14:30:41 +00003565 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003566
3567 // Detect any conflicts.
3568 if (Complain) {
3569 assert(ImportLoc.isValid() && "Missing import location");
3570 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3571 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3572 Diag(ImportLoc, diag::warn_module_conflict)
3573 << Mod->getFullModuleName()
3574 << Mod->Conflicts[I].Other->getFullModuleName()
3575 << Mod->Conflicts[I].Message;
3576 // FIXME: Need note where the other module was imported.
3577 }
3578 }
3579 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003580 }
3581}
3582
Douglas Gregore060e572013-01-25 01:03:03 +00003583bool ASTReader::loadGlobalIndex() {
3584 if (GlobalIndex)
3585 return false;
3586
3587 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3588 !Context.getLangOpts().Modules)
3589 return true;
3590
3591 // Try to load the global index.
3592 TriedLoadingGlobalIndex = true;
3593 StringRef ModuleCachePath
3594 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3595 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
Douglas Gregor7029ce12013-03-19 00:28:20 +00003596 = GlobalModuleIndex::readIndex(ModuleCachePath);
Douglas Gregore060e572013-01-25 01:03:03 +00003597 if (!Result.first)
3598 return true;
3599
3600 GlobalIndex.reset(Result.first);
Douglas Gregor7211ac12013-01-25 23:32:03 +00003601 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregore060e572013-01-25 01:03:03 +00003602 return false;
3603}
3604
3605bool ASTReader::isGlobalIndexUnavailable() const {
3606 return Context.getLangOpts().Modules && UseGlobalIndex &&
3607 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3608}
3609
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003610static void updateModuleTimestamp(ModuleFile &MF) {
3611 // Overwrite the timestamp file contents so that file's mtime changes.
3612 std::string TimestampFilename = MF.getTimestampFilename();
Rafael Espindoladae941a2014-08-25 18:17:04 +00003613 std::error_code EC;
3614 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3615 if (EC)
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003616 return;
3617 OS << "Timestamp file\n";
3618}
3619
Guy Benyei11169dd2012-12-18 14:30:41 +00003620ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3621 ModuleKind Type,
3622 SourceLocation ImportLoc,
3623 unsigned ClientLoadCapabilities) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00003624 llvm::SaveAndRestore<SourceLocation>
3625 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3626
Richard Smithd1c46742014-04-30 02:24:17 +00003627 // Defer any pending actions until we get to the end of reading the AST file.
3628 Deserializing AnASTFile(this);
3629
Guy Benyei11169dd2012-12-18 14:30:41 +00003630 // Bump the generation number.
Richard Smith053f6c62014-05-16 23:01:30 +00003631 unsigned PreviousGeneration = incrementGeneration(Context);
Guy Benyei11169dd2012-12-18 14:30:41 +00003632
3633 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003634 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei11169dd2012-12-18 14:30:41 +00003635 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
Craig Toppera13603a2014-05-22 05:54:18 +00003636 /*ImportedBy=*/nullptr, Loaded,
Ben Langmuir487ea142014-10-23 18:05:36 +00003637 0, 0, 0,
Guy Benyei11169dd2012-12-18 14:30:41 +00003638 ClientLoadCapabilities)) {
3639 case Failure:
Douglas Gregor7029ce12013-03-19 00:28:20 +00003640 case Missing:
Guy Benyei11169dd2012-12-18 14:30:41 +00003641 case OutOfDate:
3642 case VersionMismatch:
3643 case ConfigurationMismatch:
Ben Langmuir9801b252014-06-20 00:24:56 +00003644 case HadErrors: {
3645 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3646 for (const ImportedModule &IM : Loaded)
3647 LoadedSet.insert(IM.Mod);
3648
Douglas Gregor7029ce12013-03-19 00:28:20 +00003649 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
Ben Langmuir9801b252014-06-20 00:24:56 +00003650 LoadedSet,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003651 Context.getLangOpts().Modules
3652 ? &PP.getHeaderSearchInfo().getModuleMap()
Craig Toppera13603a2014-05-22 05:54:18 +00003653 : nullptr);
Douglas Gregore060e572013-01-25 01:03:03 +00003654
3655 // If we find that any modules are unusable, the global index is going
3656 // to be out-of-date. Just remove it.
3657 GlobalIndex.reset();
Craig Toppera13603a2014-05-22 05:54:18 +00003658 ModuleMgr.setGlobalIndex(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003659 return ReadResult;
Ben Langmuir9801b252014-06-20 00:24:56 +00003660 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003661 case Success:
3662 break;
3663 }
3664
3665 // Here comes stuff that we only do once the entire chain is loaded.
3666
3667 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003668 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3669 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003670 M != MEnd; ++M) {
3671 ModuleFile &F = *M->Mod;
3672
3673 // Read the AST block.
Ben Langmuir2c9af442014-04-10 17:57:43 +00003674 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3675 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00003676
3677 // Once read, set the ModuleFile bit base offset and update the size in
3678 // bits of all files we've seen.
3679 F.GlobalBitOffset = TotalModulesSizeInBits;
3680 TotalModulesSizeInBits += F.SizeInBits;
3681 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3682
3683 // Preload SLocEntries.
3684 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3685 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3686 // Load it through the SourceManager and don't call ReadSLocEntry()
3687 // directly because the entry may have already been loaded in which case
3688 // calling ReadSLocEntry() directly would trigger an assertion in
3689 // SourceManager.
3690 SourceMgr.getLoadedSLocEntryByID(Index);
3691 }
3692 }
3693
Douglas Gregor603cd862013-03-22 18:50:14 +00003694 // Setup the import locations and notify the module manager that we've
3695 // committed to these module files.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003696 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3697 MEnd = Loaded.end();
Guy Benyei11169dd2012-12-18 14:30:41 +00003698 M != MEnd; ++M) {
3699 ModuleFile &F = *M->Mod;
Douglas Gregor603cd862013-03-22 18:50:14 +00003700
3701 ModuleMgr.moduleFileAccepted(&F);
3702
3703 // Set the import location.
Argyrios Kyrtzidis71c1af82013-02-01 16:36:14 +00003704 F.DirectImportLoc = ImportLoc;
Guy Benyei11169dd2012-12-18 14:30:41 +00003705 if (!M->ImportedBy)
3706 F.ImportLoc = M->ImportLoc;
3707 else
3708 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3709 M->ImportLoc.getRawEncoding());
3710 }
3711
3712 // Mark all of the identifiers in the identifier table as being out of date,
3713 // so that various accessors know to check the loaded modules when the
3714 // identifier is used.
3715 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3716 IdEnd = PP.getIdentifierTable().end();
3717 Id != IdEnd; ++Id)
3718 Id->second->setOutOfDate(true);
3719
3720 // Resolve any unresolved module exports.
Douglas Gregorfb912652013-03-20 21:10:35 +00003721 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3722 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
Guy Benyei11169dd2012-12-18 14:30:41 +00003723 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3724 Module *ResolvedMod = getSubmodule(GlobalID);
Douglas Gregorfb912652013-03-20 21:10:35 +00003725
3726 switch (Unresolved.Kind) {
3727 case UnresolvedModuleRef::Conflict:
3728 if (ResolvedMod) {
3729 Module::Conflict Conflict;
3730 Conflict.Other = ResolvedMod;
3731 Conflict.Message = Unresolved.String.str();
3732 Unresolved.Mod->Conflicts.push_back(Conflict);
3733 }
3734 continue;
3735
3736 case UnresolvedModuleRef::Import:
Guy Benyei11169dd2012-12-18 14:30:41 +00003737 if (ResolvedMod)
3738 Unresolved.Mod->Imports.push_back(ResolvedMod);
3739 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00003740
Douglas Gregorfb912652013-03-20 21:10:35 +00003741 case UnresolvedModuleRef::Export:
3742 if (ResolvedMod || Unresolved.IsWildcard)
3743 Unresolved.Mod->Exports.push_back(
3744 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3745 continue;
3746 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003747 }
Douglas Gregorfb912652013-03-20 21:10:35 +00003748 UnresolvedModuleRefs.clear();
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003749
3750 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3751 // Might be unnecessary as use declarations are only used to build the
3752 // module itself.
Guy Benyei11169dd2012-12-18 14:30:41 +00003753
3754 InitializeContext();
3755
Richard Smith3d8e97e2013-10-18 06:54:39 +00003756 if (SemaObj)
3757 UpdateSema();
3758
Guy Benyei11169dd2012-12-18 14:30:41 +00003759 if (DeserializationListener)
3760 DeserializationListener->ReaderInitialized(this);
3761
3762 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3763 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3764 PrimaryModule.OriginalSourceFileID
3765 = FileID::get(PrimaryModule.SLocEntryBaseID
3766 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3767
3768 // If this AST file is a precompiled preamble, then set the
3769 // preamble file ID of the source manager to the file source file
3770 // from which the preamble was built.
3771 if (Type == MK_Preamble) {
3772 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3773 } else if (Type == MK_MainFile) {
3774 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3775 }
3776 }
3777
3778 // For any Objective-C class definitions we have already loaded, make sure
3779 // that we load any additional categories.
3780 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3781 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3782 ObjCClassesLoaded[I],
3783 PreviousGeneration);
3784 }
Douglas Gregore060e572013-01-25 01:03:03 +00003785
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003786 if (PP.getHeaderSearchInfo()
3787 .getHeaderSearchOpts()
3788 .ModulesValidateOncePerBuildSession) {
3789 // Now we are certain that the module and all modules it depends on are
3790 // up to date. Create or update timestamp files for modules that are
3791 // located in the module cache (not for PCH files that could be anywhere
3792 // in the filesystem).
3793 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3794 ImportedModule &M = Loaded[I];
Richard Smithe842a472014-10-22 02:05:46 +00003795 if (M.Mod->Kind == MK_ImplicitModule) {
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003796 updateModuleTimestamp(*M.Mod);
3797 }
3798 }
3799 }
3800
Guy Benyei11169dd2012-12-18 14:30:41 +00003801 return Success;
3802}
3803
Ben Langmuir487ea142014-10-23 18:05:36 +00003804static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile);
3805
Guy Benyei11169dd2012-12-18 14:30:41 +00003806ASTReader::ASTReadResult
3807ASTReader::ReadASTCore(StringRef FileName,
3808 ModuleKind Type,
3809 SourceLocation ImportLoc,
3810 ModuleFile *ImportedBy,
Dmitri Gribenkof8579502013-01-12 19:30:44 +00003811 SmallVectorImpl<ImportedModule> &Loaded,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003812 off_t ExpectedSize, time_t ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003813 ASTFileSignature ExpectedSignature,
Guy Benyei11169dd2012-12-18 14:30:41 +00003814 unsigned ClientLoadCapabilities) {
3815 ModuleFile *M;
Guy Benyei11169dd2012-12-18 14:30:41 +00003816 std::string ErrorStr;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003817 ModuleManager::AddModuleResult AddResult
3818 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
Richard Smith053f6c62014-05-16 23:01:30 +00003819 getGeneration(), ExpectedSize, ExpectedModTime,
Ben Langmuir487ea142014-10-23 18:05:36 +00003820 ExpectedSignature, readASTFileSignature,
Douglas Gregor7029ce12013-03-19 00:28:20 +00003821 M, ErrorStr);
Guy Benyei11169dd2012-12-18 14:30:41 +00003822
Douglas Gregor7029ce12013-03-19 00:28:20 +00003823 switch (AddResult) {
3824 case ModuleManager::AlreadyLoaded:
3825 return Success;
3826
3827 case ModuleManager::NewlyLoaded:
3828 // Load module file below.
3829 break;
3830
3831 case ModuleManager::Missing:
Richard Smithe842a472014-10-22 02:05:46 +00003832 // The module file was missing; if the client can handle that, return
Douglas Gregor7029ce12013-03-19 00:28:20 +00003833 // it.
3834 if (ClientLoadCapabilities & ARR_Missing)
3835 return Missing;
3836
3837 // Otherwise, return an error.
3838 {
3839 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3840 + ErrorStr;
3841 Error(Msg);
3842 }
3843 return Failure;
3844
3845 case ModuleManager::OutOfDate:
3846 // We couldn't load the module file because it is out-of-date. If the
3847 // client can handle out-of-date, return it.
3848 if (ClientLoadCapabilities & ARR_OutOfDate)
3849 return OutOfDate;
3850
3851 // Otherwise, return an error.
3852 {
3853 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3854 + ErrorStr;
3855 Error(Msg);
3856 }
Guy Benyei11169dd2012-12-18 14:30:41 +00003857 return Failure;
3858 }
3859
Douglas Gregor7029ce12013-03-19 00:28:20 +00003860 assert(M && "Missing module file");
Guy Benyei11169dd2012-12-18 14:30:41 +00003861
3862 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3863 // module?
3864 if (FileName != "-") {
3865 CurrentDir = llvm::sys::path::parent_path(FileName);
3866 if (CurrentDir.empty()) CurrentDir = ".";
3867 }
3868
3869 ModuleFile &F = *M;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00003870 BitstreamCursor &Stream = F.Stream;
Rafael Espindolafd832392014-11-12 14:48:44 +00003871 Stream.init(&F.StreamFile);
Adrian Prantlcbc368c2015-02-25 02:44:04 +00003872 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3873
Guy Benyei11169dd2012-12-18 14:30:41 +00003874 // Sniff for the signature.
3875 if (Stream.Read(8) != 'C' ||
3876 Stream.Read(8) != 'P' ||
3877 Stream.Read(8) != 'C' ||
3878 Stream.Read(8) != 'H') {
3879 Diag(diag::err_not_a_pch_file) << FileName;
3880 return Failure;
3881 }
3882
3883 // This is used for compatibility with older PCH formats.
3884 bool HaveReadControlBlock = false;
3885
Chris Lattnerefa77172013-01-20 00:00:22 +00003886 while (1) {
3887 llvm::BitstreamEntry Entry = Stream.advance();
3888
3889 switch (Entry.Kind) {
3890 case llvm::BitstreamEntry::Error:
3891 case llvm::BitstreamEntry::EndBlock:
3892 case llvm::BitstreamEntry::Record:
Guy Benyei11169dd2012-12-18 14:30:41 +00003893 Error("invalid record at top-level of AST file");
3894 return Failure;
Chris Lattnerefa77172013-01-20 00:00:22 +00003895
3896 case llvm::BitstreamEntry::SubBlock:
3897 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00003898 }
3899
Guy Benyei11169dd2012-12-18 14:30:41 +00003900 // We only know the control subblock ID.
Chris Lattnerefa77172013-01-20 00:00:22 +00003901 switch (Entry.ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003902 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3903 if (Stream.ReadBlockInfoBlock()) {
3904 Error("malformed BlockInfoBlock in AST file");
3905 return Failure;
3906 }
3907 break;
3908 case CONTROL_BLOCK_ID:
3909 HaveReadControlBlock = true;
Ben Langmuirbeee15e2014-04-14 18:00:01 +00003910 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00003911 case Success:
3912 break;
3913
3914 case Failure: return Failure;
Douglas Gregor7029ce12013-03-19 00:28:20 +00003915 case Missing: return Missing;
Guy Benyei11169dd2012-12-18 14:30:41 +00003916 case OutOfDate: return OutOfDate;
3917 case VersionMismatch: return VersionMismatch;
3918 case ConfigurationMismatch: return ConfigurationMismatch;
3919 case HadErrors: return HadErrors;
3920 }
3921 break;
3922 case AST_BLOCK_ID:
3923 if (!HaveReadControlBlock) {
3924 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
Dmitri Gribenko2228cd32014-02-11 15:40:09 +00003925 Diag(diag::err_pch_version_too_old);
Guy Benyei11169dd2012-12-18 14:30:41 +00003926 return VersionMismatch;
3927 }
3928
3929 // Record that we've loaded this module.
3930 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3931 return Success;
3932
3933 default:
3934 if (Stream.SkipBlock()) {
3935 Error("malformed block record in AST file");
3936 return Failure;
3937 }
3938 break;
3939 }
3940 }
3941
3942 return Success;
3943}
3944
3945void ASTReader::InitializeContext() {
3946 // If there's a listener, notify them that we "read" the translation unit.
3947 if (DeserializationListener)
3948 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3949 Context.getTranslationUnitDecl());
3950
Guy Benyei11169dd2012-12-18 14:30:41 +00003951 // FIXME: Find a better way to deal with collisions between these
3952 // built-in types. Right now, we just ignore the problem.
3953
3954 // Load the special types.
3955 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3956 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3957 if (!Context.CFConstantStringTypeDecl)
3958 Context.setCFConstantStringType(GetType(String));
3959 }
3960
3961 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3962 QualType FileType = GetType(File);
3963 if (FileType.isNull()) {
3964 Error("FILE type is NULL");
3965 return;
3966 }
3967
3968 if (!Context.FILEDecl) {
3969 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3970 Context.setFILEDecl(Typedef->getDecl());
3971 else {
3972 const TagType *Tag = FileType->getAs<TagType>();
3973 if (!Tag) {
3974 Error("Invalid FILE type in AST file");
3975 return;
3976 }
3977 Context.setFILEDecl(Tag->getDecl());
3978 }
3979 }
3980 }
3981
3982 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3983 QualType Jmp_bufType = GetType(Jmp_buf);
3984 if (Jmp_bufType.isNull()) {
3985 Error("jmp_buf type is NULL");
3986 return;
3987 }
3988
3989 if (!Context.jmp_bufDecl) {
3990 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3991 Context.setjmp_bufDecl(Typedef->getDecl());
3992 else {
3993 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3994 if (!Tag) {
3995 Error("Invalid jmp_buf type in AST file");
3996 return;
3997 }
3998 Context.setjmp_bufDecl(Tag->getDecl());
3999 }
4000 }
4001 }
4002
4003 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4004 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4005 if (Sigjmp_bufType.isNull()) {
4006 Error("sigjmp_buf type is NULL");
4007 return;
4008 }
4009
4010 if (!Context.sigjmp_bufDecl) {
4011 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4012 Context.setsigjmp_bufDecl(Typedef->getDecl());
4013 else {
4014 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4015 assert(Tag && "Invalid sigjmp_buf type in AST file");
4016 Context.setsigjmp_bufDecl(Tag->getDecl());
4017 }
4018 }
4019 }
4020
4021 if (unsigned ObjCIdRedef
4022 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4023 if (Context.ObjCIdRedefinitionType.isNull())
4024 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4025 }
4026
4027 if (unsigned ObjCClassRedef
4028 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4029 if (Context.ObjCClassRedefinitionType.isNull())
4030 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4031 }
4032
4033 if (unsigned ObjCSelRedef
4034 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4035 if (Context.ObjCSelRedefinitionType.isNull())
4036 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4037 }
4038
4039 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4040 QualType Ucontext_tType = GetType(Ucontext_t);
4041 if (Ucontext_tType.isNull()) {
4042 Error("ucontext_t type is NULL");
4043 return;
4044 }
4045
4046 if (!Context.ucontext_tDecl) {
4047 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4048 Context.setucontext_tDecl(Typedef->getDecl());
4049 else {
4050 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4051 assert(Tag && "Invalid ucontext_t type in AST file");
4052 Context.setucontext_tDecl(Tag->getDecl());
4053 }
4054 }
4055 }
4056 }
4057
4058 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4059
4060 // If there were any CUDA special declarations, deserialize them.
4061 if (!CUDASpecialDeclRefs.empty()) {
4062 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4063 Context.setcudaConfigureCallDecl(
4064 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4065 }
Richard Smith56be7542014-03-21 00:33:59 +00004066
Guy Benyei11169dd2012-12-18 14:30:41 +00004067 // Re-export any modules that were imported by a non-module AST file.
Richard Smith56be7542014-03-21 00:33:59 +00004068 // FIXME: This does not make macro-only imports visible again. It also doesn't
4069 // make #includes mapped to module imports visible.
4070 for (auto &Import : ImportedModules) {
4071 if (Module *Imported = getSubmodule(Import.ID))
Argyrios Kyrtzidis125df052013-02-01 16:36:12 +00004072 makeModuleVisible(Imported, Module::AllVisible,
Richard Smith56be7542014-03-21 00:33:59 +00004073 /*ImportLoc=*/Import.ImportLoc,
Douglas Gregorfb912652013-03-20 21:10:35 +00004074 /*Complain=*/false);
Guy Benyei11169dd2012-12-18 14:30:41 +00004075 }
4076 ImportedModules.clear();
4077}
4078
4079void ASTReader::finalizeForWriting() {
Richard Smith57721ac2014-07-21 04:10:40 +00004080 while (!HiddenNamesMap.empty()) {
4081 auto HiddenNames = std::move(*HiddenNamesMap.begin());
4082 HiddenNamesMap.erase(HiddenNamesMap.begin());
4083 makeNamesVisible(HiddenNames.second, HiddenNames.first,
4084 /*FromFinalization*/true);
Guy Benyei11169dd2012-12-18 14:30:41 +00004085 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004086}
4087
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004088/// \brief Given a cursor at the start of an AST file, scan ahead and drop the
4089/// cursor into the start of the given block ID, returning false on success and
4090/// true on failure.
4091static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004092 while (1) {
4093 llvm::BitstreamEntry Entry = Cursor.advance();
4094 switch (Entry.Kind) {
4095 case llvm::BitstreamEntry::Error:
4096 case llvm::BitstreamEntry::EndBlock:
4097 return true;
4098
4099 case llvm::BitstreamEntry::Record:
4100 // Ignore top-level records.
4101 Cursor.skipRecord(Entry.ID);
4102 break;
4103
4104 case llvm::BitstreamEntry::SubBlock:
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004105 if (Entry.ID == BlockID) {
4106 if (Cursor.EnterSubBlock(BlockID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004107 return true;
4108 // Found it!
4109 return false;
4110 }
4111
4112 if (Cursor.SkipBlock())
4113 return true;
4114 }
4115 }
4116}
4117
Ben Langmuir487ea142014-10-23 18:05:36 +00004118static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){
4119 BitstreamCursor Stream(StreamFile);
4120 if (Stream.Read(8) != 'C' ||
4121 Stream.Read(8) != 'P' ||
4122 Stream.Read(8) != 'C' ||
4123 Stream.Read(8) != 'H') {
4124 return 0;
4125 }
4126
4127 // Scan for the CONTROL_BLOCK_ID block.
4128 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4129 return 0;
4130
4131 // Scan for SIGNATURE inside the control block.
4132 ASTReader::RecordData Record;
4133 while (1) {
4134 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4135 if (Entry.Kind == llvm::BitstreamEntry::EndBlock ||
4136 Entry.Kind != llvm::BitstreamEntry::Record)
4137 return 0;
4138
4139 Record.clear();
4140 StringRef Blob;
4141 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4142 return Record[0];
4143 }
4144}
4145
Guy Benyei11169dd2012-12-18 14:30:41 +00004146/// \brief Retrieve the name of the original source file name
4147/// directly from the AST file, without actually loading the AST
4148/// file.
4149std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4150 FileManager &FileMgr,
4151 DiagnosticsEngine &Diags) {
4152 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004153 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
Guy Benyei11169dd2012-12-18 14:30:41 +00004154 if (!Buffer) {
Benjamin Kramera8857962014-10-26 22:44:13 +00004155 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4156 << ASTFileName << Buffer.getError().message();
Guy Benyei11169dd2012-12-18 14:30:41 +00004157 return std::string();
4158 }
4159
4160 // Initialize the stream
4161 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00004162 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4163 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004164 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004165
4166 // Sniff for the signature.
4167 if (Stream.Read(8) != 'C' ||
4168 Stream.Read(8) != 'P' ||
4169 Stream.Read(8) != 'C' ||
4170 Stream.Read(8) != 'H') {
4171 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4172 return std::string();
4173 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004174
Chris Lattnere7b154b2013-01-19 21:39:22 +00004175 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004176 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004177 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4178 return std::string();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004179 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004180
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004181 // Scan for ORIGINAL_FILE inside the control block.
4182 RecordData Record;
Chris Lattnere7b154b2013-01-19 21:39:22 +00004183 while (1) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004184 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattnere7b154b2013-01-19 21:39:22 +00004185 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4186 return std::string();
4187
4188 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4189 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4190 return std::string();
Guy Benyei11169dd2012-12-18 14:30:41 +00004191 }
Chris Lattnere7b154b2013-01-19 21:39:22 +00004192
Guy Benyei11169dd2012-12-18 14:30:41 +00004193 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004194 StringRef Blob;
4195 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4196 return Blob.str();
Guy Benyei11169dd2012-12-18 14:30:41 +00004197 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004198}
4199
4200namespace {
4201 class SimplePCHValidator : public ASTReaderListener {
4202 const LangOptions &ExistingLangOpts;
4203 const TargetOptions &ExistingTargetOpts;
4204 const PreprocessorOptions &ExistingPPOpts;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004205 std::string ExistingModuleCachePath;
Guy Benyei11169dd2012-12-18 14:30:41 +00004206 FileManager &FileMgr;
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004207
Guy Benyei11169dd2012-12-18 14:30:41 +00004208 public:
4209 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4210 const TargetOptions &ExistingTargetOpts,
4211 const PreprocessorOptions &ExistingPPOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004212 StringRef ExistingModuleCachePath,
Guy Benyei11169dd2012-12-18 14:30:41 +00004213 FileManager &FileMgr)
4214 : ExistingLangOpts(ExistingLangOpts),
4215 ExistingTargetOpts(ExistingTargetOpts),
4216 ExistingPPOpts(ExistingPPOpts),
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004217 ExistingModuleCachePath(ExistingModuleCachePath),
Guy Benyei11169dd2012-12-18 14:30:41 +00004218 FileMgr(FileMgr)
4219 {
4220 }
4221
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004222 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4223 bool AllowCompatibleDifferences) override {
4224 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4225 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004226 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004227 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4228 bool Complain) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004229 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004230 }
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004231 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4232 StringRef SpecificModuleCachePath,
4233 bool Complain) override {
4234 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4235 ExistingModuleCachePath,
4236 nullptr, ExistingLangOpts);
4237 }
Craig Topper3e89dfe2014-03-13 02:13:41 +00004238 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4239 bool Complain,
4240 std::string &SuggestedPredefines) override {
Craig Toppera13603a2014-05-22 05:54:18 +00004241 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004242 SuggestedPredefines, ExistingLangOpts);
Guy Benyei11169dd2012-12-18 14:30:41 +00004243 }
4244 };
4245}
4246
4247bool ASTReader::readASTFileControlBlock(StringRef Filename,
4248 FileManager &FileMgr,
4249 ASTReaderListener &Listener) {
4250 // Open the AST file.
Benjamin Kramera8857962014-10-26 22:44:13 +00004251 auto Buffer = FileMgr.getBufferForFile(Filename);
Guy Benyei11169dd2012-12-18 14:30:41 +00004252 if (!Buffer) {
4253 return true;
4254 }
4255
4256 // Initialize the stream
4257 llvm::BitstreamReader StreamFile;
Adrian Prantlcbc368c2015-02-25 02:44:04 +00004258 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
4259 (const unsigned char *)(*Buffer)->getBufferEnd());
Rafael Espindolaaf0e40a2014-11-12 14:42:25 +00004260 BitstreamCursor Stream(StreamFile);
Guy Benyei11169dd2012-12-18 14:30:41 +00004261
4262 // Sniff for the signature.
4263 if (Stream.Read(8) != 'C' ||
4264 Stream.Read(8) != 'P' ||
4265 Stream.Read(8) != 'C' ||
4266 Stream.Read(8) != 'H') {
4267 return true;
4268 }
4269
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004270 // Scan for the CONTROL_BLOCK_ID block.
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004271 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004272 return true;
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004273
4274 bool NeedsInputFiles = Listener.needsInputFileVisitation();
Ben Langmuircb69b572014-03-07 06:40:32 +00004275 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
Richard Smithd4b230b2014-10-27 23:01:16 +00004276 bool NeedsImports = Listener.needsImportVisitation();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004277 BitstreamCursor InputFilesCursor;
4278 if (NeedsInputFiles) {
4279 InputFilesCursor = Stream;
4280 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4281 return true;
4282
4283 // Read the abbreviations
4284 while (true) {
4285 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4286 unsigned Code = InputFilesCursor.ReadCode();
4287
4288 // We expect all abbrevs to be at the start of the block.
4289 if (Code != llvm::bitc::DEFINE_ABBREV) {
4290 InputFilesCursor.JumpToBit(Offset);
4291 break;
4292 }
4293 InputFilesCursor.ReadAbbrevRecord();
4294 }
4295 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004296
4297 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei11169dd2012-12-18 14:30:41 +00004298 RecordData Record;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004299 std::string ModuleDir;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004300 while (1) {
4301 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4302 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4303 return false;
4304
4305 if (Entry.Kind != llvm::BitstreamEntry::Record)
4306 return true;
4307
Guy Benyei11169dd2012-12-18 14:30:41 +00004308 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004309 StringRef Blob;
4310 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004311 switch ((ControlRecordTypes)RecCode) {
4312 case METADATA: {
4313 if (Record[0] != VERSION_MAJOR)
4314 return true;
Guy Benyei11169dd2012-12-18 14:30:41 +00004315
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004316 if (Listener.ReadFullVersionInformation(Blob))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004317 return true;
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004318
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004319 break;
4320 }
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004321 case MODULE_NAME:
4322 Listener.ReadModuleName(Blob);
4323 break;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004324 case MODULE_DIRECTORY:
4325 ModuleDir = Blob;
4326 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004327 case MODULE_MAP_FILE: {
4328 unsigned Idx = 0;
Richard Smith7ed1bc92014-12-05 22:42:13 +00004329 auto Path = ReadString(Record, Idx);
4330 ResolveImportedPath(Path, ModuleDir);
4331 Listener.ReadModuleMapFile(Path);
Ben Langmuir4f5212a2014-04-14 22:12:44 +00004332 break;
Ben Langmuir4b8a9e92014-08-12 16:42:33 +00004333 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004334 case LANGUAGE_OPTIONS:
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004335 if (ParseLanguageOptions(Record, false, Listener,
4336 /*AllowCompatibleConfigurationMismatch*/false))
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004337 return true;
4338 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004339
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004340 case TARGET_OPTIONS:
4341 if (ParseTargetOptions(Record, false, Listener))
4342 return true;
4343 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004344
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004345 case DIAGNOSTIC_OPTIONS:
4346 if (ParseDiagnosticOptions(Record, false, Listener))
4347 return true;
4348 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004349
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004350 case FILE_SYSTEM_OPTIONS:
4351 if (ParseFileSystemOptions(Record, false, Listener))
4352 return true;
4353 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004354
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004355 case HEADER_SEARCH_OPTIONS:
4356 if (ParseHeaderSearchOptions(Record, false, Listener))
4357 return true;
4358 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004359
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004360 case PREPROCESSOR_OPTIONS: {
4361 std::string IgnoredSuggestedPredefines;
4362 if (ParsePreprocessorOptions(Record, false, Listener,
4363 IgnoredSuggestedPredefines))
4364 return true;
4365 break;
4366 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004367
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004368 case INPUT_FILE_OFFSETS: {
4369 if (!NeedsInputFiles)
4370 break;
4371
4372 unsigned NumInputFiles = Record[0];
4373 unsigned NumUserFiles = Record[1];
Richard Smithec216502015-02-13 19:48:37 +00004374 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004375 for (unsigned I = 0; I != NumInputFiles; ++I) {
4376 // Go find this input file.
4377 bool isSystemFile = I >= NumUserFiles;
Ben Langmuircb69b572014-03-07 06:40:32 +00004378
4379 if (isSystemFile && !NeedsSystemInputFiles)
4380 break; // the rest are system input files
4381
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004382 BitstreamCursor &Cursor = InputFilesCursor;
4383 SavedStreamPosition SavedPosition(Cursor);
4384 Cursor.JumpToBit(InputFileOffs[I]);
4385
4386 unsigned Code = Cursor.ReadCode();
4387 RecordData Record;
4388 StringRef Blob;
4389 bool shouldContinue = false;
4390 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4391 case INPUT_FILE:
Argyrios Kyrtzidis68ccbe02014-03-14 02:26:31 +00004392 bool Overridden = static_cast<bool>(Record[3]);
Richard Smith7ed1bc92014-12-05 22:42:13 +00004393 std::string Filename = Blob;
4394 ResolveImportedPath(Filename, ModuleDir);
4395 shouldContinue =
4396 Listener.visitInputFile(Filename, isSystemFile, Overridden);
Argyrios Kyrtzidisc4cd2c42013-05-06 19:23:40 +00004397 break;
4398 }
4399 if (!shouldContinue)
4400 break;
4401 }
4402 break;
4403 }
4404
Richard Smithd4b230b2014-10-27 23:01:16 +00004405 case IMPORTS: {
4406 if (!NeedsImports)
4407 break;
4408
4409 unsigned Idx = 0, N = Record.size();
4410 while (Idx < N) {
4411 // Read information about the AST file.
Richard Smith79c98cc2014-10-27 23:25:15 +00004412 Idx += 5; // ImportLoc, Size, ModTime, Signature
Richard Smith7ed1bc92014-12-05 22:42:13 +00004413 std::string Filename = ReadString(Record, Idx);
4414 ResolveImportedPath(Filename, ModuleDir);
4415 Listener.visitImport(Filename);
Richard Smithd4b230b2014-10-27 23:01:16 +00004416 }
4417 break;
4418 }
4419
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004420 default:
4421 // No other validation to perform.
4422 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004423 }
4424 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004425}
4426
4427
4428bool ASTReader::isAcceptableASTFile(StringRef Filename,
4429 FileManager &FileMgr,
4430 const LangOptions &LangOpts,
4431 const TargetOptions &TargetOpts,
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004432 const PreprocessorOptions &PPOpts,
4433 std::string ExistingModuleCachePath) {
4434 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4435 ExistingModuleCachePath, FileMgr);
Guy Benyei11169dd2012-12-18 14:30:41 +00004436 return !readASTFileControlBlock(Filename, FileMgr, validator);
4437}
4438
Ben Langmuir2c9af442014-04-10 17:57:43 +00004439ASTReader::ASTReadResult
4440ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004441 // Enter the submodule block.
4442 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4443 Error("malformed submodule block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004444 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004445 }
4446
4447 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4448 bool First = true;
Craig Toppera13603a2014-05-22 05:54:18 +00004449 Module *CurrentModule = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004450 RecordData Record;
4451 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004452 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4453
4454 switch (Entry.Kind) {
4455 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4456 case llvm::BitstreamEntry::Error:
4457 Error("malformed block record in AST file");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004458 return Failure;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004459 case llvm::BitstreamEntry::EndBlock:
Ben Langmuir2c9af442014-04-10 17:57:43 +00004460 return Success;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004461 case llvm::BitstreamEntry::Record:
4462 // The interesting case.
4463 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004464 }
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004465
Guy Benyei11169dd2012-12-18 14:30:41 +00004466 // Read a record.
Chris Lattner0e6c9402013-01-20 02:38:54 +00004467 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004468 Record.clear();
Richard Smith03478d92014-10-23 22:12:14 +00004469 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4470
4471 if ((Kind == SUBMODULE_METADATA) != First) {
4472 Error("submodule metadata record should be at beginning of block");
4473 return Failure;
4474 }
4475 First = false;
4476
4477 // Submodule information is only valid if we have a current module.
4478 // FIXME: Should we error on these cases?
4479 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4480 Kind != SUBMODULE_DEFINITION)
4481 continue;
4482
4483 switch (Kind) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004484 default: // Default behavior: ignore.
4485 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004486
Richard Smith03478d92014-10-23 22:12:14 +00004487 case SUBMODULE_DEFINITION: {
Douglas Gregor8d932422013-03-20 03:59:18 +00004488 if (Record.size() < 8) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004489 Error("malformed module definition");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004490 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004491 }
Richard Smith03478d92014-10-23 22:12:14 +00004492
Chris Lattner0e6c9402013-01-20 02:38:54 +00004493 StringRef Name = Blob;
Richard Smith9bca2982014-03-08 00:03:56 +00004494 unsigned Idx = 0;
4495 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4496 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4497 bool IsFramework = Record[Idx++];
4498 bool IsExplicit = Record[Idx++];
4499 bool IsSystem = Record[Idx++];
4500 bool IsExternC = Record[Idx++];
4501 bool InferSubmodules = Record[Idx++];
4502 bool InferExplicitSubmodules = Record[Idx++];
4503 bool InferExportWildcard = Record[Idx++];
4504 bool ConfigMacrosExhaustive = Record[Idx++];
Douglas Gregor8d932422013-03-20 03:59:18 +00004505
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004506 Module *ParentModule = nullptr;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004507 if (Parent)
Guy Benyei11169dd2012-12-18 14:30:41 +00004508 ParentModule = getSubmodule(Parent);
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004509
Guy Benyei11169dd2012-12-18 14:30:41 +00004510 // Retrieve this (sub)module from the module map, creating it if
4511 // necessary.
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004512 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
Guy Benyei11169dd2012-12-18 14:30:41 +00004513 IsExplicit).first;
Ben Langmuir9d6448b2014-08-09 00:57:23 +00004514
4515 // FIXME: set the definition loc for CurrentModule, or call
4516 // ModMap.setInferredModuleAllowedBy()
4517
Guy Benyei11169dd2012-12-18 14:30:41 +00004518 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4519 if (GlobalIndex >= SubmodulesLoaded.size() ||
4520 SubmodulesLoaded[GlobalIndex]) {
4521 Error("too many submodules");
Ben Langmuir2c9af442014-04-10 17:57:43 +00004522 return Failure;
Guy Benyei11169dd2012-12-18 14:30:41 +00004523 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004524
Douglas Gregor7029ce12013-03-19 00:28:20 +00004525 if (!ParentModule) {
4526 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4527 if (CurFile != F.File) {
4528 if (!Diags.isDiagnosticInFlight()) {
4529 Diag(diag::err_module_file_conflict)
4530 << CurrentModule->getTopLevelModuleName()
4531 << CurFile->getName()
4532 << F.File->getName();
4533 }
Ben Langmuir2c9af442014-04-10 17:57:43 +00004534 return Failure;
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004535 }
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004536 }
Douglas Gregor7029ce12013-03-19 00:28:20 +00004537
4538 CurrentModule->setASTFile(F.File);
Douglas Gregor8a114ab2013-02-06 22:40:31 +00004539 }
Ben Langmuirbeee15e2014-04-14 18:00:01 +00004540
Guy Benyei11169dd2012-12-18 14:30:41 +00004541 CurrentModule->IsFromModuleFile = true;
4542 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
Richard Smith9bca2982014-03-08 00:03:56 +00004543 CurrentModule->IsExternC = IsExternC;
Guy Benyei11169dd2012-12-18 14:30:41 +00004544 CurrentModule->InferSubmodules = InferSubmodules;
4545 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4546 CurrentModule->InferExportWildcard = InferExportWildcard;
Douglas Gregor8d932422013-03-20 03:59:18 +00004547 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
Guy Benyei11169dd2012-12-18 14:30:41 +00004548 if (DeserializationListener)
4549 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4550
4551 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004552
Douglas Gregorfb912652013-03-20 21:10:35 +00004553 // Clear out data that will be replaced by what is the module file.
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004554 CurrentModule->LinkLibraries.clear();
Douglas Gregor8d932422013-03-20 03:59:18 +00004555 CurrentModule->ConfigMacros.clear();
Douglas Gregorfb912652013-03-20 21:10:35 +00004556 CurrentModule->UnresolvedConflicts.clear();
4557 CurrentModule->Conflicts.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00004558 break;
4559 }
4560
4561 case SUBMODULE_UMBRELLA_HEADER: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004562 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004563 if (!CurrentModule->getUmbrellaHeader())
4564 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4565 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
Ben Langmuirbc35fbe2015-02-20 21:46:39 +00004566 // This can be a spurious difference caused by changing the VFS to
4567 // point to a different copy of the file, and it is too late to
4568 // to rebuild safely.
4569 // FIXME: If we wrote the virtual paths instead of the 'real' paths,
4570 // after input file validation only real problems would remain and we
4571 // could just error. For now, assume it's okay.
4572 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004573 }
4574 }
4575 break;
4576 }
4577
Richard Smith202210b2014-10-24 20:23:01 +00004578 case SUBMODULE_HEADER:
4579 case SUBMODULE_EXCLUDED_HEADER:
4580 case SUBMODULE_PRIVATE_HEADER:
4581 // We lazily associate headers with their modules via the HeaderInfo table.
Argyrios Kyrtzidisb146baa2013-03-13 21:13:51 +00004582 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4583 // of complete filenames or remove it entirely.
Richard Smith202210b2014-10-24 20:23:01 +00004584 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00004585
Richard Smith202210b2014-10-24 20:23:01 +00004586 case SUBMODULE_TEXTUAL_HEADER:
4587 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4588 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4589 // them here.
4590 break;
Lawrence Crowlb53e5482013-06-20 21:14:14 +00004591
Guy Benyei11169dd2012-12-18 14:30:41 +00004592 case SUBMODULE_TOPHEADER: {
Argyrios Kyrtzidis3c5305c2013-03-13 21:13:43 +00004593 CurrentModule->addTopHeaderFilename(Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004594 break;
4595 }
4596
4597 case SUBMODULE_UMBRELLA_DIR: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004598 if (const DirectoryEntry *Umbrella
Chris Lattner0e6c9402013-01-20 02:38:54 +00004599 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004600 if (!CurrentModule->getUmbrellaDir())
4601 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4602 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
Ben Langmuir2c9af442014-04-10 17:57:43 +00004603 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4604 Error("mismatched umbrella directories in submodule");
4605 return OutOfDate;
Guy Benyei11169dd2012-12-18 14:30:41 +00004606 }
4607 }
4608 break;
4609 }
4610
4611 case SUBMODULE_METADATA: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004612 F.BaseSubmoduleID = getTotalNumSubmodules();
4613 F.LocalNumSubmodules = Record[0];
4614 unsigned LocalBaseSubmoduleID = Record[1];
4615 if (F.LocalNumSubmodules > 0) {
4616 // Introduce the global -> local mapping for submodules within this
4617 // module.
4618 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4619
4620 // Introduce the local -> global mapping for submodules within this
4621 // module.
4622 F.SubmoduleRemap.insertOrReplace(
4623 std::make_pair(LocalBaseSubmoduleID,
4624 F.BaseSubmoduleID - LocalBaseSubmoduleID));
Ben Langmuirfe971d92014-08-16 04:54:18 +00004625
Ben Langmuir52ca6782014-10-20 16:27:32 +00004626 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4627 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004628 break;
4629 }
4630
4631 case SUBMODULE_IMPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004632 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004633 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004634 Unresolved.File = &F;
4635 Unresolved.Mod = CurrentModule;
4636 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004637 Unresolved.Kind = UnresolvedModuleRef::Import;
Guy Benyei11169dd2012-12-18 14:30:41 +00004638 Unresolved.IsWildcard = false;
Douglas Gregorfb912652013-03-20 21:10:35 +00004639 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004640 }
4641 break;
4642 }
4643
4644 case SUBMODULE_EXPORTS: {
Guy Benyei11169dd2012-12-18 14:30:41 +00004645 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
Douglas Gregorfb912652013-03-20 21:10:35 +00004646 UnresolvedModuleRef Unresolved;
Guy Benyei11169dd2012-12-18 14:30:41 +00004647 Unresolved.File = &F;
4648 Unresolved.Mod = CurrentModule;
4649 Unresolved.ID = Record[Idx];
Douglas Gregorfb912652013-03-20 21:10:35 +00004650 Unresolved.Kind = UnresolvedModuleRef::Export;
Guy Benyei11169dd2012-12-18 14:30:41 +00004651 Unresolved.IsWildcard = Record[Idx + 1];
Douglas Gregorfb912652013-03-20 21:10:35 +00004652 UnresolvedModuleRefs.push_back(Unresolved);
Guy Benyei11169dd2012-12-18 14:30:41 +00004653 }
4654
4655 // Once we've loaded the set of exports, there's no reason to keep
4656 // the parsed, unresolved exports around.
4657 CurrentModule->UnresolvedExports.clear();
4658 break;
4659 }
4660 case SUBMODULE_REQUIRES: {
Richard Smitha3feee22013-10-28 22:18:19 +00004661 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
Guy Benyei11169dd2012-12-18 14:30:41 +00004662 Context.getTargetInfo());
4663 break;
4664 }
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004665
4666 case SUBMODULE_LINK_LIBRARY:
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004667 CurrentModule->LinkLibraries.push_back(
Chris Lattner0e6c9402013-01-20 02:38:54 +00004668 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregor6ddfca92013-01-14 17:21:00 +00004669 break;
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004670
4671 case SUBMODULE_CONFIG_MACRO:
Douglas Gregor35b13ec2013-03-20 00:22:05 +00004672 CurrentModule->ConfigMacros.push_back(Blob.str());
4673 break;
Douglas Gregorfb912652013-03-20 21:10:35 +00004674
4675 case SUBMODULE_CONFLICT: {
Douglas Gregorfb912652013-03-20 21:10:35 +00004676 UnresolvedModuleRef Unresolved;
4677 Unresolved.File = &F;
4678 Unresolved.Mod = CurrentModule;
4679 Unresolved.ID = Record[0];
4680 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4681 Unresolved.IsWildcard = false;
4682 Unresolved.String = Blob;
4683 UnresolvedModuleRefs.push_back(Unresolved);
4684 break;
4685 }
Guy Benyei11169dd2012-12-18 14:30:41 +00004686 }
4687 }
4688}
4689
4690/// \brief Parse the record that corresponds to a LangOptions data
4691/// structure.
4692///
4693/// This routine parses the language options from the AST file and then gives
4694/// them to the AST listener if one is set.
4695///
4696/// \returns true if the listener deems the file unacceptable, false otherwise.
4697bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4698 bool Complain,
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004699 ASTReaderListener &Listener,
4700 bool AllowCompatibleDifferences) {
Guy Benyei11169dd2012-12-18 14:30:41 +00004701 LangOptions LangOpts;
4702 unsigned Idx = 0;
4703#define LANGOPT(Name, Bits, Default, Description) \
4704 LangOpts.Name = Record[Idx++];
4705#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4706 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4707#include "clang/Basic/LangOptions.def"
Alexey Samsonovedf99a92014-11-07 22:29:38 +00004708#define SANITIZER(NAME, ID) \
4709 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
Will Dietzf54319c2013-01-18 11:30:38 +00004710#include "clang/Basic/Sanitizers.def"
Guy Benyei11169dd2012-12-18 14:30:41 +00004711
4712 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4713 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4714 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4715
4716 unsigned Length = Record[Idx++];
4717 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4718 Record.begin() + Idx + Length);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004719
4720 Idx += Length;
4721
4722 // Comment options.
4723 for (unsigned N = Record[Idx++]; N; --N) {
4724 LangOpts.CommentOpts.BlockCommandNames.push_back(
4725 ReadString(Record, Idx));
4726 }
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004727 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004728
Richard Smith1e2cf0d2014-10-31 02:28:58 +00004729 return Listener.ReadLanguageOptions(LangOpts, Complain,
4730 AllowCompatibleDifferences);
Guy Benyei11169dd2012-12-18 14:30:41 +00004731}
4732
4733bool ASTReader::ParseTargetOptions(const RecordData &Record,
4734 bool Complain,
4735 ASTReaderListener &Listener) {
4736 unsigned Idx = 0;
4737 TargetOptions TargetOpts;
4738 TargetOpts.Triple = ReadString(Record, Idx);
4739 TargetOpts.CPU = ReadString(Record, Idx);
4740 TargetOpts.ABI = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004741 for (unsigned N = Record[Idx++]; N; --N) {
4742 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4743 }
4744 for (unsigned N = Record[Idx++]; N; --N) {
4745 TargetOpts.Features.push_back(ReadString(Record, Idx));
4746 }
4747
4748 return Listener.ReadTargetOptions(TargetOpts, Complain);
4749}
4750
4751bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4752 ASTReaderListener &Listener) {
Ben Langmuirb92de022014-04-29 16:25:26 +00004753 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
Guy Benyei11169dd2012-12-18 14:30:41 +00004754 unsigned Idx = 0;
Ben Langmuirb92de022014-04-29 16:25:26 +00004755#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004756#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
Ben Langmuirb92de022014-04-29 16:25:26 +00004757 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
Guy Benyei11169dd2012-12-18 14:30:41 +00004758#include "clang/Basic/DiagnosticOptions.def"
4759
Richard Smith3be1cb22014-08-07 00:24:21 +00004760 for (unsigned N = Record[Idx++]; N; --N)
Ben Langmuirb92de022014-04-29 16:25:26 +00004761 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
Richard Smith3be1cb22014-08-07 00:24:21 +00004762 for (unsigned N = Record[Idx++]; N; --N)
4763 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00004764
4765 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4766}
4767
4768bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4769 ASTReaderListener &Listener) {
4770 FileSystemOptions FSOpts;
4771 unsigned Idx = 0;
4772 FSOpts.WorkingDir = ReadString(Record, Idx);
4773 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4774}
4775
4776bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4777 bool Complain,
4778 ASTReaderListener &Listener) {
4779 HeaderSearchOptions HSOpts;
4780 unsigned Idx = 0;
4781 HSOpts.Sysroot = ReadString(Record, Idx);
4782
4783 // Include entries.
4784 for (unsigned N = Record[Idx++]; N; --N) {
4785 std::string Path = ReadString(Record, Idx);
4786 frontend::IncludeDirGroup Group
4787 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei11169dd2012-12-18 14:30:41 +00004788 bool IsFramework = Record[Idx++];
4789 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004790 HSOpts.UserEntries.push_back(
Daniel Dunbar53681732013-01-30 00:34:26 +00004791 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei11169dd2012-12-18 14:30:41 +00004792 }
4793
4794 // System header prefixes.
4795 for (unsigned N = Record[Idx++]; N; --N) {
4796 std::string Prefix = ReadString(Record, Idx);
4797 bool IsSystemHeader = Record[Idx++];
4798 HSOpts.SystemHeaderPrefixes.push_back(
4799 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4800 }
4801
4802 HSOpts.ResourceDir = ReadString(Record, Idx);
4803 HSOpts.ModuleCachePath = ReadString(Record, Idx);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004804 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004805 HSOpts.DisableModuleHash = Record[Idx++];
4806 HSOpts.UseBuiltinIncludes = Record[Idx++];
4807 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4808 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4809 HSOpts.UseLibcxx = Record[Idx++];
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004810 std::string SpecificModuleCachePath = ReadString(Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00004811
Argyrios Kyrtzidisbd0b6512015-02-19 20:12:20 +00004812 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4813 Complain);
Guy Benyei11169dd2012-12-18 14:30:41 +00004814}
4815
4816bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4817 bool Complain,
4818 ASTReaderListener &Listener,
4819 std::string &SuggestedPredefines) {
4820 PreprocessorOptions PPOpts;
4821 unsigned Idx = 0;
4822
4823 // Macro definitions/undefs
4824 for (unsigned N = Record[Idx++]; N; --N) {
4825 std::string Macro = ReadString(Record, Idx);
4826 bool IsUndef = Record[Idx++];
4827 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4828 }
4829
4830 // Includes
4831 for (unsigned N = Record[Idx++]; N; --N) {
4832 PPOpts.Includes.push_back(ReadString(Record, Idx));
4833 }
4834
4835 // Macro Includes
4836 for (unsigned N = Record[Idx++]; N; --N) {
4837 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4838 }
4839
4840 PPOpts.UsePredefines = Record[Idx++];
Argyrios Kyrtzidisd3afa0c2013-04-26 21:33:40 +00004841 PPOpts.DetailedRecord = Record[Idx++];
Guy Benyei11169dd2012-12-18 14:30:41 +00004842 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4843 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4844 PPOpts.ObjCXXARCStandardLibrary =
4845 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4846 SuggestedPredefines.clear();
4847 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4848 SuggestedPredefines);
4849}
4850
4851std::pair<ModuleFile *, unsigned>
4852ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4853 GlobalPreprocessedEntityMapType::iterator
4854 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4855 assert(I != GlobalPreprocessedEntityMap.end() &&
4856 "Corrupted global preprocessed entity map");
4857 ModuleFile *M = I->second;
4858 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4859 return std::make_pair(M, LocalIndex);
4860}
4861
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004862llvm::iterator_range<PreprocessingRecord::iterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004863ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4864 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4865 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4866 Mod.NumPreprocessedEntities);
4867
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004868 return llvm::make_range(PreprocessingRecord::iterator(),
4869 PreprocessingRecord::iterator());
Guy Benyei11169dd2012-12-18 14:30:41 +00004870}
4871
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004872llvm::iterator_range<ASTReader::ModuleDeclIterator>
Guy Benyei11169dd2012-12-18 14:30:41 +00004873ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
Benjamin Kramerb4ef6682015-02-06 17:25:10 +00004874 return llvm::make_range(
4875 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4876 ModuleDeclIterator(this, &Mod,
4877 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
Guy Benyei11169dd2012-12-18 14:30:41 +00004878}
4879
4880PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4881 PreprocessedEntityID PPID = Index+1;
4882 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4883 ModuleFile &M = *PPInfo.first;
4884 unsigned LocalIndex = PPInfo.second;
4885 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4886
Guy Benyei11169dd2012-12-18 14:30:41 +00004887 if (!PP.getPreprocessingRecord()) {
4888 Error("no preprocessing record");
Craig Toppera13603a2014-05-22 05:54:18 +00004889 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004890 }
4891
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004892 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4893 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4894
4895 llvm::BitstreamEntry Entry =
4896 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4897 if (Entry.Kind != llvm::BitstreamEntry::Record)
Craig Toppera13603a2014-05-22 05:54:18 +00004898 return nullptr;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00004899
Guy Benyei11169dd2012-12-18 14:30:41 +00004900 // Read the record.
4901 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4902 ReadSourceLocation(M, PPOffs.End));
4903 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattner0e6c9402013-01-20 02:38:54 +00004904 StringRef Blob;
Guy Benyei11169dd2012-12-18 14:30:41 +00004905 RecordData Record;
4906 PreprocessorDetailRecordTypes RecType =
Chris Lattner0e6c9402013-01-20 02:38:54 +00004907 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4908 Entry.ID, Record, &Blob);
Guy Benyei11169dd2012-12-18 14:30:41 +00004909 switch (RecType) {
4910 case PPD_MACRO_EXPANSION: {
4911 bool isBuiltin = Record[0];
Craig Toppera13603a2014-05-22 05:54:18 +00004912 IdentifierInfo *Name = nullptr;
4913 MacroDefinition *Def = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004914 if (isBuiltin)
4915 Name = getLocalIdentifier(M, Record[1]);
4916 else {
4917 PreprocessedEntityID
4918 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4919 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4920 }
4921
4922 MacroExpansion *ME;
4923 if (isBuiltin)
4924 ME = new (PPRec) MacroExpansion(Name, Range);
4925 else
4926 ME = new (PPRec) MacroExpansion(Def, Range);
4927
4928 return ME;
4929 }
4930
4931 case PPD_MACRO_DEFINITION: {
4932 // Decode the identifier info and then check again; if the macro is
4933 // still defined and associated with the identifier,
4934 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4935 MacroDefinition *MD
4936 = new (PPRec) MacroDefinition(II, Range);
4937
4938 if (DeserializationListener)
4939 DeserializationListener->MacroDefinitionRead(PPID, MD);
4940
4941 return MD;
4942 }
4943
4944 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattner0e6c9402013-01-20 02:38:54 +00004945 const char *FullFileNameStart = Blob.data() + Record[0];
4946 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Craig Toppera13603a2014-05-22 05:54:18 +00004947 const FileEntry *File = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00004948 if (!FullFileName.empty())
4949 File = PP.getFileManager().getFile(FullFileName);
4950
4951 // FIXME: Stable encoding
4952 InclusionDirective::InclusionKind Kind
4953 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4954 InclusionDirective *ID
4955 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattner0e6c9402013-01-20 02:38:54 +00004956 StringRef(Blob.data(), Record[0]),
Guy Benyei11169dd2012-12-18 14:30:41 +00004957 Record[1], Record[3],
4958 File,
4959 Range);
4960 return ID;
4961 }
4962 }
4963
4964 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4965}
4966
4967/// \brief \arg SLocMapI points at a chunk of a module that contains no
4968/// preprocessed entities or the entities it contains are not the ones we are
4969/// looking for. Find the next module that contains entities and return the ID
4970/// of the first entry.
4971PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4972 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4973 ++SLocMapI;
4974 for (GlobalSLocOffsetMapType::const_iterator
4975 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4976 ModuleFile &M = *SLocMapI->second;
4977 if (M.NumPreprocessedEntities)
4978 return M.BasePreprocessedEntityID;
4979 }
4980
4981 return getTotalNumPreprocessedEntities();
4982}
4983
4984namespace {
4985
4986template <unsigned PPEntityOffset::*PPLoc>
4987struct PPEntityComp {
4988 const ASTReader &Reader;
4989 ModuleFile &M;
4990
4991 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4992
4993 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4994 SourceLocation LHS = getLoc(L);
4995 SourceLocation RHS = getLoc(R);
4996 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4997 }
4998
4999 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
5000 SourceLocation LHS = getLoc(L);
5001 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5002 }
5003
5004 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5005 SourceLocation RHS = getLoc(R);
5006 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5007 }
5008
5009 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5010 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
5011 }
5012};
5013
5014}
5015
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005016PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5017 bool EndsAfter) const {
5018 if (SourceMgr.isLocalSourceLocation(Loc))
Guy Benyei11169dd2012-12-18 14:30:41 +00005019 return getTotalNumPreprocessedEntities();
5020
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005021 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5022 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
Guy Benyei11169dd2012-12-18 14:30:41 +00005023 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
5024 "Corrupted global sloc offset map");
5025
5026 if (SLocMapI->second->NumPreprocessedEntities == 0)
5027 return findNextPreprocessedEntity(SLocMapI);
5028
5029 ModuleFile &M = *SLocMapI->second;
5030 typedef const PPEntityOffset *pp_iterator;
5031 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5032 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5033
5034 size_t Count = M.NumPreprocessedEntities;
5035 size_t Half;
5036 pp_iterator First = pp_begin;
5037 pp_iterator PPI;
5038
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005039 if (EndsAfter) {
5040 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5041 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
5042 } else {
5043 // Do a binary search manually instead of using std::lower_bound because
5044 // The end locations of entities may be unordered (when a macro expansion
5045 // is inside another macro argument), but for this case it is not important
5046 // whether we get the first macro expansion or its containing macro.
5047 while (Count > 0) {
5048 Half = Count / 2;
5049 PPI = First;
5050 std::advance(PPI, Half);
5051 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
5052 Loc)) {
5053 First = PPI;
5054 ++First;
5055 Count = Count - Half - 1;
5056 } else
5057 Count = Half;
5058 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005059 }
5060
5061 if (PPI == pp_end)
5062 return findNextPreprocessedEntity(SLocMapI);
5063
5064 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5065}
5066
Guy Benyei11169dd2012-12-18 14:30:41 +00005067/// \brief Returns a pair of [Begin, End) indices of preallocated
5068/// preprocessed entities that \arg Range encompasses.
5069std::pair<unsigned, unsigned>
5070 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5071 if (Range.isInvalid())
5072 return std::make_pair(0,0);
5073 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5074
Alp Toker2e9ce4c2014-05-16 18:59:21 +00005075 PreprocessedEntityID BeginID =
5076 findPreprocessedEntity(Range.getBegin(), false);
5077 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
Guy Benyei11169dd2012-12-18 14:30:41 +00005078 return std::make_pair(BeginID, EndID);
5079}
5080
5081/// \brief Optionally returns true or false if the preallocated preprocessed
5082/// entity with index \arg Index came from file \arg FID.
David Blaikie05785d12013-02-20 22:23:23 +00005083Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei11169dd2012-12-18 14:30:41 +00005084 FileID FID) {
5085 if (FID.isInvalid())
5086 return false;
5087
5088 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5089 ModuleFile &M = *PPInfo.first;
5090 unsigned LocalIndex = PPInfo.second;
5091 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5092
5093 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5094 if (Loc.isInvalid())
5095 return false;
5096
5097 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5098 return true;
5099 else
5100 return false;
5101}
5102
5103namespace {
5104 /// \brief Visitor used to search for information about a header file.
5105 class HeaderFileInfoVisitor {
Guy Benyei11169dd2012-12-18 14:30:41 +00005106 const FileEntry *FE;
5107
David Blaikie05785d12013-02-20 22:23:23 +00005108 Optional<HeaderFileInfo> HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005109
5110 public:
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005111 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5112 : FE(FE) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00005113
5114 static bool visit(ModuleFile &M, void *UserData) {
5115 HeaderFileInfoVisitor *This
5116 = static_cast<HeaderFileInfoVisitor *>(UserData);
5117
Guy Benyei11169dd2012-12-18 14:30:41 +00005118 HeaderFileInfoLookupTable *Table
5119 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5120 if (!Table)
5121 return false;
5122
5123 // Look in the on-disk hash table for an entry for this file name.
Argyrios Kyrtzidis5c2a3452013-03-06 18:12:47 +00005124 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005125 if (Pos == Table->end())
5126 return false;
5127
5128 This->HFI = *Pos;
5129 return true;
5130 }
5131
David Blaikie05785d12013-02-20 22:23:23 +00005132 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei11169dd2012-12-18 14:30:41 +00005133 };
5134}
5135
5136HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
Argyrios Kyrtzidis61a38962013-03-06 18:12:44 +00005137 HeaderFileInfoVisitor Visitor(FE);
Guy Benyei11169dd2012-12-18 14:30:41 +00005138 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
Argyrios Kyrtzidis1054bbf2013-05-08 23:46:55 +00005139 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
Guy Benyei11169dd2012-12-18 14:30:41 +00005140 return *HFI;
Guy Benyei11169dd2012-12-18 14:30:41 +00005141
5142 return HeaderFileInfo();
5143}
5144
5145void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5146 // FIXME: Make it work properly with modules.
Dmitri Gribenkof8579502013-01-12 19:30:44 +00005147 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei11169dd2012-12-18 14:30:41 +00005148 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5149 ModuleFile &F = *(*I);
5150 unsigned Idx = 0;
5151 DiagStates.clear();
5152 assert(!Diag.DiagStates.empty());
5153 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5154 while (Idx < F.PragmaDiagMappings.size()) {
5155 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5156 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5157 if (DiagStateID != 0) {
5158 Diag.DiagStatePoints.push_back(
5159 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5160 FullSourceLoc(Loc, SourceMgr)));
5161 continue;
5162 }
5163
5164 assert(DiagStateID == 0);
5165 // A new DiagState was created here.
5166 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5167 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5168 DiagStates.push_back(NewState);
5169 Diag.DiagStatePoints.push_back(
5170 DiagnosticsEngine::DiagStatePoint(NewState,
5171 FullSourceLoc(Loc, SourceMgr)));
5172 while (1) {
5173 assert(Idx < F.PragmaDiagMappings.size() &&
5174 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5175 if (Idx >= F.PragmaDiagMappings.size()) {
5176 break; // Something is messed up but at least avoid infinite loop in
5177 // release build.
5178 }
5179 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5180 if (DiagID == (unsigned)-1) {
5181 break; // no more diag/map pairs for this location.
5182 }
Alp Tokerc726c362014-06-10 09:31:37 +00005183 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5184 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5185 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
Guy Benyei11169dd2012-12-18 14:30:41 +00005186 }
5187 }
5188 }
5189}
5190
5191/// \brief Get the correct cursor and offset for loading a type.
5192ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5193 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5194 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5195 ModuleFile *M = I->second;
5196 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5197}
5198
5199/// \brief Read and return the type with the given index..
5200///
5201/// The index is the type ID, shifted and minus the number of predefs. This
5202/// routine actually reads the record corresponding to the type at the given
5203/// location. It is a helper routine for GetType, which deals with reading type
5204/// IDs.
5205QualType ASTReader::readTypeRecord(unsigned Index) {
5206 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00005207 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00005208
5209 // Keep track of where we are in the stream, then jump back there
5210 // after reading this type.
5211 SavedStreamPosition SavedPosition(DeclsCursor);
5212
5213 ReadingKindTracker ReadingKind(Read_Type, *this);
5214
5215 // Note that we are loading a type record.
5216 Deserializing AType(this);
5217
5218 unsigned Idx = 0;
5219 DeclsCursor.JumpToBit(Loc.Offset);
5220 RecordData Record;
5221 unsigned Code = DeclsCursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00005222 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00005223 case TYPE_EXT_QUAL: {
5224 if (Record.size() != 2) {
5225 Error("Incorrect encoding of extended qualifier type");
5226 return QualType();
5227 }
5228 QualType Base = readType(*Loc.F, Record, Idx);
5229 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5230 return Context.getQualifiedType(Base, Quals);
5231 }
5232
5233 case TYPE_COMPLEX: {
5234 if (Record.size() != 1) {
5235 Error("Incorrect encoding of complex type");
5236 return QualType();
5237 }
5238 QualType ElemType = readType(*Loc.F, Record, Idx);
5239 return Context.getComplexType(ElemType);
5240 }
5241
5242 case TYPE_POINTER: {
5243 if (Record.size() != 1) {
5244 Error("Incorrect encoding of pointer type");
5245 return QualType();
5246 }
5247 QualType PointeeType = readType(*Loc.F, Record, Idx);
5248 return Context.getPointerType(PointeeType);
5249 }
5250
Reid Kleckner8a365022013-06-24 17:51:48 +00005251 case TYPE_DECAYED: {
5252 if (Record.size() != 1) {
5253 Error("Incorrect encoding of decayed type");
5254 return QualType();
5255 }
5256 QualType OriginalType = readType(*Loc.F, Record, Idx);
5257 QualType DT = Context.getAdjustedParameterType(OriginalType);
5258 if (!isa<DecayedType>(DT))
5259 Error("Decayed type does not decay");
5260 return DT;
5261 }
5262
Reid Kleckner0503a872013-12-05 01:23:43 +00005263 case TYPE_ADJUSTED: {
5264 if (Record.size() != 2) {
5265 Error("Incorrect encoding of adjusted type");
5266 return QualType();
5267 }
5268 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5269 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5270 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5271 }
5272
Guy Benyei11169dd2012-12-18 14:30:41 +00005273 case TYPE_BLOCK_POINTER: {
5274 if (Record.size() != 1) {
5275 Error("Incorrect encoding of block pointer type");
5276 return QualType();
5277 }
5278 QualType PointeeType = readType(*Loc.F, Record, Idx);
5279 return Context.getBlockPointerType(PointeeType);
5280 }
5281
5282 case TYPE_LVALUE_REFERENCE: {
5283 if (Record.size() != 2) {
5284 Error("Incorrect encoding of lvalue reference type");
5285 return QualType();
5286 }
5287 QualType PointeeType = readType(*Loc.F, Record, Idx);
5288 return Context.getLValueReferenceType(PointeeType, Record[1]);
5289 }
5290
5291 case TYPE_RVALUE_REFERENCE: {
5292 if (Record.size() != 1) {
5293 Error("Incorrect encoding of rvalue reference type");
5294 return QualType();
5295 }
5296 QualType PointeeType = readType(*Loc.F, Record, Idx);
5297 return Context.getRValueReferenceType(PointeeType);
5298 }
5299
5300 case TYPE_MEMBER_POINTER: {
5301 if (Record.size() != 2) {
5302 Error("Incorrect encoding of member pointer type");
5303 return QualType();
5304 }
5305 QualType PointeeType = readType(*Loc.F, Record, Idx);
5306 QualType ClassType = readType(*Loc.F, Record, Idx);
5307 if (PointeeType.isNull() || ClassType.isNull())
5308 return QualType();
5309
5310 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5311 }
5312
5313 case TYPE_CONSTANT_ARRAY: {
5314 QualType ElementType = readType(*Loc.F, Record, Idx);
5315 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5316 unsigned IndexTypeQuals = Record[2];
5317 unsigned Idx = 3;
5318 llvm::APInt Size = ReadAPInt(Record, Idx);
5319 return Context.getConstantArrayType(ElementType, Size,
5320 ASM, IndexTypeQuals);
5321 }
5322
5323 case TYPE_INCOMPLETE_ARRAY: {
5324 QualType ElementType = readType(*Loc.F, Record, Idx);
5325 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5326 unsigned IndexTypeQuals = Record[2];
5327 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5328 }
5329
5330 case TYPE_VARIABLE_ARRAY: {
5331 QualType ElementType = readType(*Loc.F, Record, Idx);
5332 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5333 unsigned IndexTypeQuals = Record[2];
5334 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5335 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5336 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5337 ASM, IndexTypeQuals,
5338 SourceRange(LBLoc, RBLoc));
5339 }
5340
5341 case TYPE_VECTOR: {
5342 if (Record.size() != 3) {
5343 Error("incorrect encoding of vector type in AST file");
5344 return QualType();
5345 }
5346
5347 QualType ElementType = readType(*Loc.F, Record, Idx);
5348 unsigned NumElements = Record[1];
5349 unsigned VecKind = Record[2];
5350 return Context.getVectorType(ElementType, NumElements,
5351 (VectorType::VectorKind)VecKind);
5352 }
5353
5354 case TYPE_EXT_VECTOR: {
5355 if (Record.size() != 3) {
5356 Error("incorrect encoding of extended vector type in AST file");
5357 return QualType();
5358 }
5359
5360 QualType ElementType = readType(*Loc.F, Record, Idx);
5361 unsigned NumElements = Record[1];
5362 return Context.getExtVectorType(ElementType, NumElements);
5363 }
5364
5365 case TYPE_FUNCTION_NO_PROTO: {
5366 if (Record.size() != 6) {
5367 Error("incorrect encoding of no-proto function type");
5368 return QualType();
5369 }
5370 QualType ResultType = readType(*Loc.F, Record, Idx);
5371 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5372 (CallingConv)Record[4], Record[5]);
5373 return Context.getFunctionNoProtoType(ResultType, Info);
5374 }
5375
5376 case TYPE_FUNCTION_PROTO: {
5377 QualType ResultType = readType(*Loc.F, Record, Idx);
5378
5379 FunctionProtoType::ExtProtoInfo EPI;
5380 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5381 /*hasregparm*/ Record[2],
5382 /*regparm*/ Record[3],
5383 static_cast<CallingConv>(Record[4]),
5384 /*produces*/ Record[5]);
5385
5386 unsigned Idx = 6;
Guy Benyei11169dd2012-12-18 14:30:41 +00005387
5388 EPI.Variadic = Record[Idx++];
5389 EPI.HasTrailingReturn = Record[Idx++];
5390 EPI.TypeQuals = Record[Idx++];
5391 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
Richard Smith564417a2014-03-20 21:47:22 +00005392 SmallVector<QualType, 8> ExceptionStorage;
Richard Smith8acb4282014-07-31 21:57:55 +00005393 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
Richard Smith01b2cb42014-07-26 06:37:51 +00005394
5395 unsigned NumParams = Record[Idx++];
5396 SmallVector<QualType, 16> ParamTypes;
5397 for (unsigned I = 0; I != NumParams; ++I)
5398 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5399
Jordan Rose5c382722013-03-08 21:51:21 +00005400 return Context.getFunctionType(ResultType, ParamTypes, EPI);
Guy Benyei11169dd2012-12-18 14:30:41 +00005401 }
5402
5403 case TYPE_UNRESOLVED_USING: {
5404 unsigned Idx = 0;
5405 return Context.getTypeDeclType(
5406 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5407 }
5408
5409 case TYPE_TYPEDEF: {
5410 if (Record.size() != 2) {
5411 Error("incorrect encoding of typedef type");
5412 return QualType();
5413 }
5414 unsigned Idx = 0;
5415 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5416 QualType Canonical = readType(*Loc.F, Record, Idx);
5417 if (!Canonical.isNull())
5418 Canonical = Context.getCanonicalType(Canonical);
5419 return Context.getTypedefType(Decl, Canonical);
5420 }
5421
5422 case TYPE_TYPEOF_EXPR:
5423 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5424
5425 case TYPE_TYPEOF: {
5426 if (Record.size() != 1) {
5427 Error("incorrect encoding of typeof(type) in AST file");
5428 return QualType();
5429 }
5430 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5431 return Context.getTypeOfType(UnderlyingType);
5432 }
5433
5434 case TYPE_DECLTYPE: {
5435 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5436 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5437 }
5438
5439 case TYPE_UNARY_TRANSFORM: {
5440 QualType BaseType = readType(*Loc.F, Record, Idx);
5441 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5442 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5443 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5444 }
5445
Richard Smith74aeef52013-04-26 16:15:35 +00005446 case TYPE_AUTO: {
5447 QualType Deduced = readType(*Loc.F, Record, Idx);
5448 bool IsDecltypeAuto = Record[Idx++];
Richard Smith27d807c2013-04-30 13:56:41 +00005449 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
Manuel Klimek2fdbea22013-08-22 12:12:24 +00005450 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
Richard Smith74aeef52013-04-26 16:15:35 +00005451 }
Guy Benyei11169dd2012-12-18 14:30:41 +00005452
5453 case TYPE_RECORD: {
5454 if (Record.size() != 2) {
5455 Error("incorrect encoding of record type");
5456 return QualType();
5457 }
5458 unsigned Idx = 0;
5459 bool IsDependent = Record[Idx++];
5460 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5461 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5462 QualType T = Context.getRecordType(RD);
5463 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5464 return T;
5465 }
5466
5467 case TYPE_ENUM: {
5468 if (Record.size() != 2) {
5469 Error("incorrect encoding of enum type");
5470 return QualType();
5471 }
5472 unsigned Idx = 0;
5473 bool IsDependent = Record[Idx++];
5474 QualType T
5475 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5476 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5477 return T;
5478 }
5479
5480 case TYPE_ATTRIBUTED: {
5481 if (Record.size() != 3) {
5482 Error("incorrect encoding of attributed type");
5483 return QualType();
5484 }
5485 QualType modifiedType = readType(*Loc.F, Record, Idx);
5486 QualType equivalentType = readType(*Loc.F, Record, Idx);
5487 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5488 return Context.getAttributedType(kind, modifiedType, equivalentType);
5489 }
5490
5491 case TYPE_PAREN: {
5492 if (Record.size() != 1) {
5493 Error("incorrect encoding of paren type");
5494 return QualType();
5495 }
5496 QualType InnerType = readType(*Loc.F, Record, Idx);
5497 return Context.getParenType(InnerType);
5498 }
5499
5500 case TYPE_PACK_EXPANSION: {
5501 if (Record.size() != 2) {
5502 Error("incorrect encoding of pack expansion type");
5503 return QualType();
5504 }
5505 QualType Pattern = readType(*Loc.F, Record, Idx);
5506 if (Pattern.isNull())
5507 return QualType();
David Blaikie05785d12013-02-20 22:23:23 +00005508 Optional<unsigned> NumExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00005509 if (Record[1])
5510 NumExpansions = Record[1] - 1;
5511 return Context.getPackExpansionType(Pattern, NumExpansions);
5512 }
5513
5514 case TYPE_ELABORATED: {
5515 unsigned Idx = 0;
5516 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5517 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5518 QualType NamedType = readType(*Loc.F, Record, Idx);
5519 return Context.getElaboratedType(Keyword, NNS, NamedType);
5520 }
5521
5522 case TYPE_OBJC_INTERFACE: {
5523 unsigned Idx = 0;
5524 ObjCInterfaceDecl *ItfD
5525 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5526 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5527 }
5528
5529 case TYPE_OBJC_OBJECT: {
5530 unsigned Idx = 0;
5531 QualType Base = readType(*Loc.F, Record, Idx);
5532 unsigned NumProtos = Record[Idx++];
5533 SmallVector<ObjCProtocolDecl*, 4> Protos;
5534 for (unsigned I = 0; I != NumProtos; ++I)
5535 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5536 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5537 }
5538
5539 case TYPE_OBJC_OBJECT_POINTER: {
5540 unsigned Idx = 0;
5541 QualType Pointee = readType(*Loc.F, Record, Idx);
5542 return Context.getObjCObjectPointerType(Pointee);
5543 }
5544
5545 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5546 unsigned Idx = 0;
5547 QualType Parm = readType(*Loc.F, Record, Idx);
5548 QualType Replacement = readType(*Loc.F, Record, Idx);
Stephan Tolksdorfe96f8b32014-03-15 10:23:27 +00005549 return Context.getSubstTemplateTypeParmType(
5550 cast<TemplateTypeParmType>(Parm),
5551 Context.getCanonicalType(Replacement));
Guy Benyei11169dd2012-12-18 14:30:41 +00005552 }
5553
5554 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5555 unsigned Idx = 0;
5556 QualType Parm = readType(*Loc.F, Record, Idx);
5557 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5558 return Context.getSubstTemplateTypeParmPackType(
5559 cast<TemplateTypeParmType>(Parm),
5560 ArgPack);
5561 }
5562
5563 case TYPE_INJECTED_CLASS_NAME: {
5564 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5565 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5566 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5567 // for AST reading, too much interdependencies.
Richard Smith6377f8f2014-10-21 21:15:18 +00005568 const Type *T = nullptr;
5569 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5570 if (const Type *Existing = DI->getTypeForDecl()) {
5571 T = Existing;
5572 break;
5573 }
5574 }
5575 if (!T) {
Richard Smithf17fdbd2014-04-24 02:25:27 +00005576 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
Richard Smith6377f8f2014-10-21 21:15:18 +00005577 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5578 DI->setTypeForDecl(T);
5579 }
Richard Smithf17fdbd2014-04-24 02:25:27 +00005580 return QualType(T, 0);
Guy Benyei11169dd2012-12-18 14:30:41 +00005581 }
5582
5583 case TYPE_TEMPLATE_TYPE_PARM: {
5584 unsigned Idx = 0;
5585 unsigned Depth = Record[Idx++];
5586 unsigned Index = Record[Idx++];
5587 bool Pack = Record[Idx++];
5588 TemplateTypeParmDecl *D
5589 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5590 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5591 }
5592
5593 case TYPE_DEPENDENT_NAME: {
5594 unsigned Idx = 0;
5595 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5596 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5597 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5598 QualType Canon = readType(*Loc.F, Record, Idx);
5599 if (!Canon.isNull())
5600 Canon = Context.getCanonicalType(Canon);
5601 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5602 }
5603
5604 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5605 unsigned Idx = 0;
5606 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5607 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5608 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5609 unsigned NumArgs = Record[Idx++];
5610 SmallVector<TemplateArgument, 8> Args;
5611 Args.reserve(NumArgs);
5612 while (NumArgs--)
5613 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5614 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5615 Args.size(), Args.data());
5616 }
5617
5618 case TYPE_DEPENDENT_SIZED_ARRAY: {
5619 unsigned Idx = 0;
5620
5621 // ArrayType
5622 QualType ElementType = readType(*Loc.F, Record, Idx);
5623 ArrayType::ArraySizeModifier ASM
5624 = (ArrayType::ArraySizeModifier)Record[Idx++];
5625 unsigned IndexTypeQuals = Record[Idx++];
5626
5627 // DependentSizedArrayType
5628 Expr *NumElts = ReadExpr(*Loc.F);
5629 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5630
5631 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5632 IndexTypeQuals, Brackets);
5633 }
5634
5635 case TYPE_TEMPLATE_SPECIALIZATION: {
5636 unsigned Idx = 0;
5637 bool IsDependent = Record[Idx++];
5638 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5639 SmallVector<TemplateArgument, 8> Args;
5640 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5641 QualType Underlying = readType(*Loc.F, Record, Idx);
5642 QualType T;
5643 if (Underlying.isNull())
5644 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5645 Args.size());
5646 else
5647 T = Context.getTemplateSpecializationType(Name, Args.data(),
5648 Args.size(), Underlying);
5649 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5650 return T;
5651 }
5652
5653 case TYPE_ATOMIC: {
5654 if (Record.size() != 1) {
5655 Error("Incorrect encoding of atomic type");
5656 return QualType();
5657 }
5658 QualType ValueType = readType(*Loc.F, Record, Idx);
5659 return Context.getAtomicType(ValueType);
5660 }
5661 }
5662 llvm_unreachable("Invalid TypeCode!");
5663}
5664
Richard Smith564417a2014-03-20 21:47:22 +00005665void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5666 SmallVectorImpl<QualType> &Exceptions,
Richard Smith8acb4282014-07-31 21:57:55 +00005667 FunctionProtoType::ExceptionSpecInfo &ESI,
Richard Smith564417a2014-03-20 21:47:22 +00005668 const RecordData &Record, unsigned &Idx) {
5669 ExceptionSpecificationType EST =
5670 static_cast<ExceptionSpecificationType>(Record[Idx++]);
Richard Smith8acb4282014-07-31 21:57:55 +00005671 ESI.Type = EST;
Richard Smith564417a2014-03-20 21:47:22 +00005672 if (EST == EST_Dynamic) {
Richard Smith8acb4282014-07-31 21:57:55 +00005673 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
Richard Smith564417a2014-03-20 21:47:22 +00005674 Exceptions.push_back(readType(ModuleFile, Record, Idx));
Richard Smith8acb4282014-07-31 21:57:55 +00005675 ESI.Exceptions = Exceptions;
Richard Smith564417a2014-03-20 21:47:22 +00005676 } else if (EST == EST_ComputedNoexcept) {
Richard Smith8acb4282014-07-31 21:57:55 +00005677 ESI.NoexceptExpr = ReadExpr(ModuleFile);
Richard Smith564417a2014-03-20 21:47:22 +00005678 } else if (EST == EST_Uninstantiated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005679 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5680 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005681 } else if (EST == EST_Unevaluated) {
Richard Smith8acb4282014-07-31 21:57:55 +00005682 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
Richard Smith564417a2014-03-20 21:47:22 +00005683 }
5684}
5685
Guy Benyei11169dd2012-12-18 14:30:41 +00005686class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5687 ASTReader &Reader;
5688 ModuleFile &F;
5689 const ASTReader::RecordData &Record;
5690 unsigned &Idx;
5691
5692 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5693 unsigned &I) {
5694 return Reader.ReadSourceLocation(F, R, I);
5695 }
5696
5697 template<typename T>
5698 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5699 return Reader.ReadDeclAs<T>(F, Record, Idx);
5700 }
5701
5702public:
5703 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5704 const ASTReader::RecordData &Record, unsigned &Idx)
5705 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5706 { }
5707
5708 // We want compile-time assurance that we've enumerated all of
5709 // these, so unfortunately we have to declare them first, then
5710 // define them out-of-line.
5711#define ABSTRACT_TYPELOC(CLASS, PARENT)
5712#define TYPELOC(CLASS, PARENT) \
5713 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5714#include "clang/AST/TypeLocNodes.def"
5715
5716 void VisitFunctionTypeLoc(FunctionTypeLoc);
5717 void VisitArrayTypeLoc(ArrayTypeLoc);
5718};
5719
5720void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5721 // nothing to do
5722}
5723void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5724 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5725 if (TL.needsExtraLocalData()) {
5726 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5727 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5728 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5729 TL.setModeAttr(Record[Idx++]);
5730 }
5731}
5732void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5733 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5734}
5735void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5736 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5737}
Reid Kleckner8a365022013-06-24 17:51:48 +00005738void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5739 // nothing to do
5740}
Reid Kleckner0503a872013-12-05 01:23:43 +00005741void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5742 // nothing to do
5743}
Guy Benyei11169dd2012-12-18 14:30:41 +00005744void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5745 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5746}
5747void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5748 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5749}
5750void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5751 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5752}
5753void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5754 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5755 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5756}
5757void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5758 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5759 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5760 if (Record[Idx++])
5761 TL.setSizeExpr(Reader.ReadExpr(F));
5762 else
Craig Toppera13603a2014-05-22 05:54:18 +00005763 TL.setSizeExpr(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005764}
5765void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5766 VisitArrayTypeLoc(TL);
5767}
5768void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5769 VisitArrayTypeLoc(TL);
5770}
5771void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5772 VisitArrayTypeLoc(TL);
5773}
5774void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5775 DependentSizedArrayTypeLoc TL) {
5776 VisitArrayTypeLoc(TL);
5777}
5778void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5779 DependentSizedExtVectorTypeLoc TL) {
5780 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5781}
5782void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5783 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5784}
5785void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5786 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5787}
5788void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5789 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5790 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5791 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5792 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00005793 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5794 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00005795 }
5796}
5797void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5798 VisitFunctionTypeLoc(TL);
5799}
5800void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5801 VisitFunctionTypeLoc(TL);
5802}
5803void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5804 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5805}
5806void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5807 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5808}
5809void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5810 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5811 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5812 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5813}
5814void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5815 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5816 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5817 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5818 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5819}
5820void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5821 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5822}
5823void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5824 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5825 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5826 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5827 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5828}
5829void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5830 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5831}
5832void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5833 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5834}
5835void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5836 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5837}
5838void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5839 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5840 if (TL.hasAttrOperand()) {
5841 SourceRange range;
5842 range.setBegin(ReadSourceLocation(Record, Idx));
5843 range.setEnd(ReadSourceLocation(Record, Idx));
5844 TL.setAttrOperandParensRange(range);
5845 }
5846 if (TL.hasAttrExprOperand()) {
5847 if (Record[Idx++])
5848 TL.setAttrExprOperand(Reader.ReadExpr(F));
5849 else
Craig Toppera13603a2014-05-22 05:54:18 +00005850 TL.setAttrExprOperand(nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00005851 } else if (TL.hasAttrEnumOperand())
5852 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5853}
5854void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5855 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5856}
5857void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5858 SubstTemplateTypeParmTypeLoc TL) {
5859 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5860}
5861void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5862 SubstTemplateTypeParmPackTypeLoc TL) {
5863 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5864}
5865void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5866 TemplateSpecializationTypeLoc TL) {
5867 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5868 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5869 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5870 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5871 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5872 TL.setArgLocInfo(i,
5873 Reader.GetTemplateArgumentLocInfo(F,
5874 TL.getTypePtr()->getArg(i).getKind(),
5875 Record, Idx));
5876}
5877void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5878 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5879 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5880}
5881void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5882 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5883 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5884}
5885void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5886 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5887}
5888void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5889 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5890 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5891 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5892}
5893void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5894 DependentTemplateSpecializationTypeLoc TL) {
5895 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5896 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5897 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5898 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5899 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5900 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5901 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5902 TL.setArgLocInfo(I,
5903 Reader.GetTemplateArgumentLocInfo(F,
5904 TL.getTypePtr()->getArg(I).getKind(),
5905 Record, Idx));
5906}
5907void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5908 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5909}
5910void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5911 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5912}
5913void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5914 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5915 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5916 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5917 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5918 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5919}
5920void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5921 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5922}
5923void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5924 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5925 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5926 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5927}
5928
5929TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5930 const RecordData &Record,
5931 unsigned &Idx) {
5932 QualType InfoTy = readType(F, Record, Idx);
5933 if (InfoTy.isNull())
Craig Toppera13603a2014-05-22 05:54:18 +00005934 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00005935
5936 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5937 TypeLocReader TLR(*this, F, Record, Idx);
5938 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5939 TLR.Visit(TL);
5940 return TInfo;
5941}
5942
5943QualType ASTReader::GetType(TypeID ID) {
5944 unsigned FastQuals = ID & Qualifiers::FastMask;
5945 unsigned Index = ID >> Qualifiers::FastWidth;
5946
5947 if (Index < NUM_PREDEF_TYPE_IDS) {
5948 QualType T;
5949 switch ((PredefinedTypeIDs)Index) {
5950 case PREDEF_TYPE_NULL_ID: return QualType();
5951 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5952 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5953
5954 case PREDEF_TYPE_CHAR_U_ID:
5955 case PREDEF_TYPE_CHAR_S_ID:
5956 // FIXME: Check that the signedness of CharTy is correct!
5957 T = Context.CharTy;
5958 break;
5959
5960 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5961 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5962 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5963 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5964 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5965 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5966 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5967 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5968 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5969 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5970 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5971 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5972 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5973 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5974 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5975 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5976 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5977 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5978 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5979 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5980 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5981 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5982 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5983 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5984 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5985 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5986 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5987 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeid8a08ea2012-12-18 14:38:23 +00005988 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5989 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5990 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5991 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5992 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5993 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei61054192013-02-07 10:55:47 +00005994 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyei1b4fb3e2013-01-20 12:31:11 +00005995 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei11169dd2012-12-18 14:30:41 +00005996 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5997
5998 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5999 T = Context.getAutoRRefDeductType();
6000 break;
6001
6002 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6003 T = Context.ARCUnbridgedCastTy;
6004 break;
6005
6006 case PREDEF_TYPE_VA_LIST_TAG:
6007 T = Context.getVaListTagType();
6008 break;
6009
6010 case PREDEF_TYPE_BUILTIN_FN:
6011 T = Context.BuiltinFnTy;
6012 break;
6013 }
6014
6015 assert(!T.isNull() && "Unknown predefined type");
6016 return T.withFastQualifiers(FastQuals);
6017 }
6018
6019 Index -= NUM_PREDEF_TYPE_IDS;
6020 assert(Index < TypesLoaded.size() && "Type index out-of-range");
6021 if (TypesLoaded[Index].isNull()) {
6022 TypesLoaded[Index] = readTypeRecord(Index);
6023 if (TypesLoaded[Index].isNull())
6024 return QualType();
6025
6026 TypesLoaded[Index]->setFromAST();
6027 if (DeserializationListener)
6028 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6029 TypesLoaded[Index]);
6030 }
6031
6032 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6033}
6034
6035QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6036 return GetType(getGlobalTypeID(F, LocalID));
6037}
6038
6039serialization::TypeID
6040ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6041 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6042 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
6043
6044 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6045 return LocalID;
6046
6047 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6048 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
6049 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
6050
6051 unsigned GlobalIndex = LocalIndex + I->second;
6052 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
6053}
6054
6055TemplateArgumentLocInfo
6056ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6057 TemplateArgument::ArgKind Kind,
6058 const RecordData &Record,
6059 unsigned &Index) {
6060 switch (Kind) {
6061 case TemplateArgument::Expression:
6062 return ReadExpr(F);
6063 case TemplateArgument::Type:
6064 return GetTypeSourceInfo(F, Record, Index);
6065 case TemplateArgument::Template: {
6066 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6067 Index);
6068 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6069 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6070 SourceLocation());
6071 }
6072 case TemplateArgument::TemplateExpansion: {
6073 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6074 Index);
6075 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6076 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6077 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6078 EllipsisLoc);
6079 }
6080 case TemplateArgument::Null:
6081 case TemplateArgument::Integral:
6082 case TemplateArgument::Declaration:
6083 case TemplateArgument::NullPtr:
6084 case TemplateArgument::Pack:
6085 // FIXME: Is this right?
6086 return TemplateArgumentLocInfo();
6087 }
6088 llvm_unreachable("unexpected template argument loc");
6089}
6090
6091TemplateArgumentLoc
6092ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6093 const RecordData &Record, unsigned &Index) {
6094 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6095
6096 if (Arg.getKind() == TemplateArgument::Expression) {
6097 if (Record[Index++]) // bool InfoHasSameExpr.
6098 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6099 }
6100 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6101 Record, Index));
6102}
6103
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00006104const ASTTemplateArgumentListInfo*
6105ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6106 const RecordData &Record,
6107 unsigned &Index) {
6108 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6109 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6110 unsigned NumArgsAsWritten = Record[Index++];
6111 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6112 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6113 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6114 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6115}
6116
Guy Benyei11169dd2012-12-18 14:30:41 +00006117Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6118 return GetDecl(ID);
6119}
6120
Richard Smith50895422015-01-31 03:04:55 +00006121template<typename TemplateSpecializationDecl>
6122static void completeRedeclChainForTemplateSpecialization(Decl *D) {
6123 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D))
6124 TSD->getSpecializedTemplate()->LoadLazySpecializations();
6125}
6126
Richard Smith053f6c62014-05-16 23:01:30 +00006127void ASTReader::CompleteRedeclChain(const Decl *D) {
Richard Smith851072e2014-05-19 20:59:20 +00006128 if (NumCurrentElementsDeserializing) {
6129 // We arrange to not care about the complete redeclaration chain while we're
6130 // deserializing. Just remember that the AST has marked this one as complete
6131 // but that it's not actually complete yet, so we know we still need to
6132 // complete it later.
6133 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6134 return;
6135 }
6136
Richard Smith053f6c62014-05-16 23:01:30 +00006137 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6138
Richard Smith053f6c62014-05-16 23:01:30 +00006139 // If this is a named declaration, complete it by looking it up
6140 // within its context.
6141 //
Richard Smith01bdb7a2014-08-28 05:44:07 +00006142 // FIXME: Merging a function definition should merge
Richard Smith053f6c62014-05-16 23:01:30 +00006143 // all mergeable entities within it.
6144 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6145 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6146 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6147 auto *II = Name.getAsIdentifierInfo();
6148 if (isa<TranslationUnitDecl>(DC) && II) {
6149 // Outside of C++, we don't have a lookup table for the TU, so update
6150 // the identifier instead. In C++, either way should work fine.
6151 if (II->isOutOfDate())
6152 updateOutOfDateIdentifier(*II);
6153 } else
6154 DC->lookup(Name);
Richard Smith01bdb7a2014-08-28 05:44:07 +00006155 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6156 // FIXME: It'd be nice to do something a bit more targeted here.
6157 D->getDeclContext()->decls_begin();
Richard Smith053f6c62014-05-16 23:01:30 +00006158 }
6159 }
Richard Smith50895422015-01-31 03:04:55 +00006160
6161 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
6162 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
6163 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
6164 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
6165 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6166 if (auto *Template = FD->getPrimaryTemplate())
6167 Template->LoadLazySpecializations();
6168 }
Richard Smith053f6c62014-05-16 23:01:30 +00006169}
6170
Richard Smithcd45dbc2014-04-19 03:48:30 +00006171uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6172 const RecordData &Record,
6173 unsigned &Idx) {
6174 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6175 Error("malformed AST file: missing C++ base specifier");
Guy Benyei11169dd2012-12-18 14:30:41 +00006176 return 0;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006177 }
6178
Guy Benyei11169dd2012-12-18 14:30:41 +00006179 unsigned LocalID = Record[Idx++];
6180 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6181}
6182
6183CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6184 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner7fb3bef2013-01-20 00:56:42 +00006185 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei11169dd2012-12-18 14:30:41 +00006186 SavedStreamPosition SavedPosition(Cursor);
6187 Cursor.JumpToBit(Loc.Offset);
6188 ReadingKindTracker ReadingKind(Read_Decl, *this);
6189 RecordData Record;
6190 unsigned Code = Cursor.ReadCode();
Chris Lattner0e6c9402013-01-20 02:38:54 +00006191 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei11169dd2012-12-18 14:30:41 +00006192 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006193 Error("malformed AST file: missing C++ base specifiers");
Craig Toppera13603a2014-05-22 05:54:18 +00006194 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006195 }
6196
6197 unsigned Idx = 0;
6198 unsigned NumBases = Record[Idx++];
6199 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6200 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6201 for (unsigned I = 0; I != NumBases; ++I)
6202 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6203 return Bases;
6204}
6205
6206serialization::DeclID
6207ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6208 if (LocalID < NUM_PREDEF_DECL_IDS)
6209 return LocalID;
6210
6211 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6212 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6213 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6214
6215 return LocalID + I->second;
6216}
6217
6218bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6219 ModuleFile &M) const {
Richard Smithfe620d22015-03-05 23:24:12 +00006220 // Predefined decls aren't from any module.
6221 if (ID < NUM_PREDEF_DECL_IDS)
6222 return false;
6223
Guy Benyei11169dd2012-12-18 14:30:41 +00006224 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6225 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6226 return &M == I->second;
6227}
6228
Douglas Gregor9f782892013-01-21 15:25:38 +00006229ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006230 if (!D->isFromASTFile())
Craig Toppera13603a2014-05-22 05:54:18 +00006231 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006232 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6233 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6234 return I->second;
6235}
6236
6237SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6238 if (ID < NUM_PREDEF_DECL_IDS)
6239 return SourceLocation();
Richard Smithcd45dbc2014-04-19 03:48:30 +00006240
Guy Benyei11169dd2012-12-18 14:30:41 +00006241 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6242
6243 if (Index > DeclsLoaded.size()) {
6244 Error("declaration ID out-of-range for AST file");
6245 return SourceLocation();
6246 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006247
Guy Benyei11169dd2012-12-18 14:30:41 +00006248 if (Decl *D = DeclsLoaded[Index])
6249 return D->getLocation();
6250
6251 unsigned RawLocation = 0;
6252 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6253 return ReadSourceLocation(*Rec.F, RawLocation);
6254}
6255
Richard Smithfe620d22015-03-05 23:24:12 +00006256static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
6257 switch (ID) {
6258 case PREDEF_DECL_NULL_ID:
6259 return nullptr;
6260
6261 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6262 return Context.getTranslationUnitDecl();
6263
6264 case PREDEF_DECL_OBJC_ID_ID:
6265 return Context.getObjCIdDecl();
6266
6267 case PREDEF_DECL_OBJC_SEL_ID:
6268 return Context.getObjCSelDecl();
6269
6270 case PREDEF_DECL_OBJC_CLASS_ID:
6271 return Context.getObjCClassDecl();
6272
6273 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6274 return Context.getObjCProtocolDecl();
6275
6276 case PREDEF_DECL_INT_128_ID:
6277 return Context.getInt128Decl();
6278
6279 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6280 return Context.getUInt128Decl();
6281
6282 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6283 return Context.getObjCInstanceTypeDecl();
6284
6285 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6286 return Context.getBuiltinVaListDecl();
6287 }
Yaron Keren322bdad2015-03-06 07:49:14 +00006288 llvm_unreachable("PredefinedDeclIDs unknown enum value");
Richard Smithfe620d22015-03-05 23:24:12 +00006289}
6290
Richard Smithcd45dbc2014-04-19 03:48:30 +00006291Decl *ASTReader::GetExistingDecl(DeclID ID) {
6292 if (ID < NUM_PREDEF_DECL_IDS) {
Richard Smithfe620d22015-03-05 23:24:12 +00006293 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID);
6294 if (D) {
6295 // Track that we have merged the declaration with ID \p ID into the
6296 // pre-existing predefined declaration \p D.
6297 auto &Merged = MergedDecls[D->getCanonicalDecl()];
6298 if (Merged.empty())
6299 Merged.push_back(ID);
Guy Benyei11169dd2012-12-18 14:30:41 +00006300 }
Richard Smithfe620d22015-03-05 23:24:12 +00006301 return D;
Guy Benyei11169dd2012-12-18 14:30:41 +00006302 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006303
Guy Benyei11169dd2012-12-18 14:30:41 +00006304 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6305
6306 if (Index >= DeclsLoaded.size()) {
6307 assert(0 && "declaration ID out-of-range for AST file");
6308 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006309 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00006310 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006311
6312 return DeclsLoaded[Index];
6313}
6314
6315Decl *ASTReader::GetDecl(DeclID ID) {
6316 if (ID < NUM_PREDEF_DECL_IDS)
6317 return GetExistingDecl(ID);
6318
6319 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6320
6321 if (Index >= DeclsLoaded.size()) {
6322 assert(0 && "declaration ID out-of-range for AST file");
6323 Error("declaration ID out-of-range for AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00006324 return nullptr;
Richard Smithcd45dbc2014-04-19 03:48:30 +00006325 }
6326
Guy Benyei11169dd2012-12-18 14:30:41 +00006327 if (!DeclsLoaded[Index]) {
6328 ReadDeclRecord(ID);
6329 if (DeserializationListener)
6330 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6331 }
6332
6333 return DeclsLoaded[Index];
6334}
6335
6336DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6337 DeclID GlobalID) {
6338 if (GlobalID < NUM_PREDEF_DECL_IDS)
6339 return GlobalID;
6340
6341 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6342 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6343 ModuleFile *Owner = I->second;
6344
6345 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6346 = M.GlobalToLocalDeclIDs.find(Owner);
6347 if (Pos == M.GlobalToLocalDeclIDs.end())
6348 return 0;
6349
6350 return GlobalID - Owner->BaseDeclID + Pos->second;
6351}
6352
6353serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6354 const RecordData &Record,
6355 unsigned &Idx) {
6356 if (Idx >= Record.size()) {
6357 Error("Corrupted AST file");
6358 return 0;
6359 }
6360
6361 return getGlobalDeclID(F, Record[Idx++]);
6362}
6363
6364/// \brief Resolve the offset of a statement into a statement.
6365///
6366/// This operation will read a new statement from the external
6367/// source each time it is called, and is meant to be used via a
6368/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6369Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6370 // Switch case IDs are per Decl.
6371 ClearSwitchCaseIDs();
6372
6373 // Offset here is a global offset across the entire chain.
6374 RecordLocation Loc = getLocalBitOffset(Offset);
6375 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6376 return ReadStmtFromStream(*Loc.F);
6377}
6378
6379namespace {
6380 class FindExternalLexicalDeclsVisitor {
6381 ASTReader &Reader;
6382 const DeclContext *DC;
6383 bool (*isKindWeWant)(Decl::Kind);
6384
6385 SmallVectorImpl<Decl*> &Decls;
6386 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6387
6388 public:
6389 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6390 bool (*isKindWeWant)(Decl::Kind),
6391 SmallVectorImpl<Decl*> &Decls)
6392 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6393 {
6394 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6395 PredefsVisited[I] = false;
6396 }
6397
6398 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6399 if (Preorder)
6400 return false;
6401
6402 FindExternalLexicalDeclsVisitor *This
6403 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6404
6405 ModuleFile::DeclContextInfosMap::iterator Info
6406 = M.DeclContextInfos.find(This->DC);
6407 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6408 return false;
6409
6410 // Load all of the declaration IDs
6411 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6412 *IDE = ID + Info->second.NumLexicalDecls;
6413 ID != IDE; ++ID) {
6414 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6415 continue;
6416
6417 // Don't add predefined declarations to the lexical context more
6418 // than once.
6419 if (ID->second < NUM_PREDEF_DECL_IDS) {
6420 if (This->PredefsVisited[ID->second])
6421 continue;
6422
6423 This->PredefsVisited[ID->second] = true;
6424 }
6425
6426 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6427 if (!This->DC->isDeclInLexicalTraversal(D))
6428 This->Decls.push_back(D);
6429 }
6430 }
6431
6432 return false;
6433 }
6434 };
6435}
6436
6437ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6438 bool (*isKindWeWant)(Decl::Kind),
6439 SmallVectorImpl<Decl*> &Decls) {
6440 // There might be lexical decls in multiple modules, for the TU at
6441 // least. Walk all of the modules in the order they were loaded.
6442 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6443 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6444 ++NumLexicalDeclContextsRead;
6445 return ELR_Success;
6446}
6447
6448namespace {
6449
6450class DeclIDComp {
6451 ASTReader &Reader;
6452 ModuleFile &Mod;
6453
6454public:
6455 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6456
6457 bool operator()(LocalDeclID L, LocalDeclID R) const {
6458 SourceLocation LHS = getLocation(L);
6459 SourceLocation RHS = getLocation(R);
6460 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6461 }
6462
6463 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6464 SourceLocation RHS = getLocation(R);
6465 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6466 }
6467
6468 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6469 SourceLocation LHS = getLocation(L);
6470 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6471 }
6472
6473 SourceLocation getLocation(LocalDeclID ID) const {
6474 return Reader.getSourceManager().getFileLoc(
6475 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6476 }
6477};
6478
6479}
6480
6481void ASTReader::FindFileRegionDecls(FileID File,
6482 unsigned Offset, unsigned Length,
6483 SmallVectorImpl<Decl *> &Decls) {
6484 SourceManager &SM = getSourceManager();
6485
6486 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6487 if (I == FileDeclIDs.end())
6488 return;
6489
6490 FileDeclsInfo &DInfo = I->second;
6491 if (DInfo.Decls.empty())
6492 return;
6493
6494 SourceLocation
6495 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6496 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6497
6498 DeclIDComp DIDComp(*this, *DInfo.Mod);
6499 ArrayRef<serialization::LocalDeclID>::iterator
6500 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6501 BeginLoc, DIDComp);
6502 if (BeginIt != DInfo.Decls.begin())
6503 --BeginIt;
6504
6505 // If we are pointing at a top-level decl inside an objc container, we need
6506 // to backtrack until we find it otherwise we will fail to report that the
6507 // region overlaps with an objc container.
6508 while (BeginIt != DInfo.Decls.begin() &&
6509 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6510 ->isTopLevelDeclInObjCContainer())
6511 --BeginIt;
6512
6513 ArrayRef<serialization::LocalDeclID>::iterator
6514 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6515 EndLoc, DIDComp);
6516 if (EndIt != DInfo.Decls.end())
6517 ++EndIt;
6518
6519 for (ArrayRef<serialization::LocalDeclID>::iterator
6520 DIt = BeginIt; DIt != EndIt; ++DIt)
6521 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6522}
6523
6524namespace {
6525 /// \brief ModuleFile visitor used to perform name lookup into a
6526 /// declaration context.
6527 class DeclContextNameLookupVisitor {
6528 ASTReader &Reader;
Richard Smith8c913ec2014-08-14 02:21:01 +00006529 ArrayRef<const DeclContext *> Contexts;
Guy Benyei11169dd2012-12-18 14:30:41 +00006530 DeclarationName Name;
6531 SmallVectorImpl<NamedDecl *> &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006532 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet;
Guy Benyei11169dd2012-12-18 14:30:41 +00006533
6534 public:
Richard Smith8c913ec2014-08-14 02:21:01 +00006535 DeclContextNameLookupVisitor(ASTReader &Reader,
6536 ArrayRef<const DeclContext *> Contexts,
Guy Benyei11169dd2012-12-18 14:30:41 +00006537 DeclarationName Name,
Richard Smith52874ec2015-02-13 20:17:14 +00006538 SmallVectorImpl<NamedDecl *> &Decls,
6539 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet)
6540 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls),
6541 DeclSet(DeclSet) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006542
6543 static bool visit(ModuleFile &M, void *UserData) {
6544 DeclContextNameLookupVisitor *This
6545 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6546
6547 // Check whether we have any visible declaration information for
6548 // this context in this module.
6549 ModuleFile::DeclContextInfosMap::iterator Info;
6550 bool FoundInfo = false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006551 for (auto *DC : This->Contexts) {
6552 Info = M.DeclContextInfos.find(DC);
6553 if (Info != M.DeclContextInfos.end() &&
Guy Benyei11169dd2012-12-18 14:30:41 +00006554 Info->second.NameLookupTableData) {
6555 FoundInfo = true;
6556 break;
6557 }
6558 }
6559
6560 if (!FoundInfo)
6561 return false;
Richard Smith8c913ec2014-08-14 02:21:01 +00006562
Guy Benyei11169dd2012-12-18 14:30:41 +00006563 // Look for this name within this module.
Richard Smith52e3fba2014-03-11 07:17:35 +00006564 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006565 Info->second.NameLookupTableData;
6566 ASTDeclContextNameLookupTable::iterator Pos
6567 = LookupTable->find(This->Name);
6568 if (Pos == LookupTable->end())
6569 return false;
6570
6571 bool FoundAnything = false;
6572 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6573 for (; Data.first != Data.second; ++Data.first) {
6574 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6575 if (!ND)
6576 continue;
6577
6578 if (ND->getDeclName() != This->Name) {
6579 // A name might be null because the decl's redeclarable part is
6580 // currently read before reading its name. The lookup is triggered by
6581 // building that decl (likely indirectly), and so it is later in the
6582 // sense of "already existing" and can be ignored here.
Richard Smith8c913ec2014-08-14 02:21:01 +00006583 // FIXME: This should not happen; deserializing declarations should
6584 // not perform lookups since that can lead to deserialization cycles.
Guy Benyei11169dd2012-12-18 14:30:41 +00006585 continue;
6586 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006587
Guy Benyei11169dd2012-12-18 14:30:41 +00006588 // Record this declaration.
6589 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006590 if (This->DeclSet.insert(ND).second)
6591 This->Decls.push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006592 }
6593
6594 return FoundAnything;
6595 }
6596 };
6597}
6598
Douglas Gregor9f782892013-01-21 15:25:38 +00006599/// \brief Retrieve the "definitive" module file for the definition of the
6600/// given declaration context, if there is one.
6601///
6602/// The "definitive" module file is the only place where we need to look to
6603/// find information about the declarations within the given declaration
6604/// context. For example, C++ and Objective-C classes, C structs/unions, and
6605/// Objective-C protocols, categories, and extensions are all defined in a
6606/// single place in the source code, so they have definitive module files
6607/// associated with them. C++ namespaces, on the other hand, can have
6608/// definitions in multiple different module files.
6609///
6610/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6611/// NDEBUG checking.
6612static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6613 ASTReader &Reader) {
Douglas Gregor7a6e2002013-01-22 17:08:30 +00006614 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6615 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor9f782892013-01-21 15:25:38 +00006616
Craig Toppera13603a2014-05-22 05:54:18 +00006617 return nullptr;
Douglas Gregor9f782892013-01-21 15:25:38 +00006618}
6619
Richard Smith9ce12e32013-02-07 03:30:24 +00006620bool
Guy Benyei11169dd2012-12-18 14:30:41 +00006621ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6622 DeclarationName Name) {
6623 assert(DC->hasExternalVisibleStorage() &&
6624 "DeclContext has no visible decls in storage");
6625 if (!Name)
Richard Smith9ce12e32013-02-07 03:30:24 +00006626 return false;
Guy Benyei11169dd2012-12-18 14:30:41 +00006627
Richard Smith8c913ec2014-08-14 02:21:01 +00006628 Deserializing LookupResults(this);
6629
Guy Benyei11169dd2012-12-18 14:30:41 +00006630 SmallVector<NamedDecl *, 64> Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006631 llvm::SmallPtrSet<NamedDecl*, 64> DeclSet;
Richard Smith8c913ec2014-08-14 02:21:01 +00006632
Guy Benyei11169dd2012-12-18 14:30:41 +00006633 // Compute the declaration contexts we need to look into. Multiple such
6634 // declaration contexts occur when two declaration contexts from disjoint
6635 // modules get merged, e.g., when two namespaces with the same name are
6636 // independently defined in separate modules.
6637 SmallVector<const DeclContext *, 2> Contexts;
6638 Contexts.push_back(DC);
Richard Smith8c913ec2014-08-14 02:21:01 +00006639
Guy Benyei11169dd2012-12-18 14:30:41 +00006640 if (DC->isNamespace()) {
Richard Smithcd45dbc2014-04-19 03:48:30 +00006641 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
Guy Benyei11169dd2012-12-18 14:30:41 +00006642 if (Merged != MergedDecls.end()) {
6643 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6644 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6645 }
6646 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006647
6648 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
Richard Smith52874ec2015-02-13 20:17:14 +00006649 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls, DeclSet);
Richard Smith8c913ec2014-08-14 02:21:01 +00006650
6651 // If we can definitively determine which module file to look into,
6652 // only look there. Otherwise, look in all module files.
6653 ModuleFile *Definitive;
6654 if (Contexts.size() == 1 &&
6655 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6656 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6657 } else {
6658 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6659 }
6660 };
6661
6662 LookUpInContexts(Contexts);
6663
6664 // If this might be an implicit special member function, then also search
6665 // all merged definitions of the surrounding class. We need to search them
6666 // individually, because finding an entity in one of them doesn't imply that
6667 // we can't find a different entity in another one.
Richard Smithcd45dbc2014-04-19 03:48:30 +00006668 if (isa<CXXRecordDecl>(DC)) {
Richard Smith8c913ec2014-08-14 02:21:01 +00006669 auto Kind = Name.getNameKind();
6670 if (Kind == DeclarationName::CXXConstructorName ||
6671 Kind == DeclarationName::CXXDestructorName ||
6672 (Kind == DeclarationName::CXXOperatorName &&
6673 Name.getCXXOverloadedOperator() == OO_Equal)) {
6674 auto Merged = MergedLookups.find(DC);
Richard Smithe0612472014-11-21 05:16:13 +00006675 if (Merged != MergedLookups.end()) {
6676 for (unsigned I = 0; I != Merged->second.size(); ++I) {
Daniel Jasperc0b7c802015-02-18 14:13:46 +00006677 const DeclContext *Context = Merged->second[I];
6678 LookUpInContexts(Context);
Richard Smithe0612472014-11-21 05:16:13 +00006679 // We might have just added some more merged lookups. If so, our
6680 // iterator is now invalid, so grab a fresh one before continuing.
6681 Merged = MergedLookups.find(DC);
6682 }
6683 }
Richard Smith8c913ec2014-08-14 02:21:01 +00006684 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00006685 }
6686
Guy Benyei11169dd2012-12-18 14:30:41 +00006687 ++NumVisibleDeclContextsRead;
6688 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith9ce12e32013-02-07 03:30:24 +00006689 return !Decls.empty();
Guy Benyei11169dd2012-12-18 14:30:41 +00006690}
6691
6692namespace {
6693 /// \brief ModuleFile visitor used to retrieve all visible names in a
6694 /// declaration context.
6695 class DeclContextAllNamesVisitor {
6696 ASTReader &Reader;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00006697 SmallVectorImpl<const DeclContext *> &Contexts;
Craig Topper3598eb72013-07-05 04:43:31 +00006698 DeclsMap &Decls;
Richard Smith52874ec2015-02-13 20:17:14 +00006699 llvm::SmallPtrSet<NamedDecl *, 256> DeclSet;
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006700 bool VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006701
6702 public:
6703 DeclContextAllNamesVisitor(ASTReader &Reader,
6704 SmallVectorImpl<const DeclContext *> &Contexts,
Craig Topper3598eb72013-07-05 04:43:31 +00006705 DeclsMap &Decls, bool VisitAll)
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006706 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei11169dd2012-12-18 14:30:41 +00006707
6708 static bool visit(ModuleFile &M, void *UserData) {
6709 DeclContextAllNamesVisitor *This
6710 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6711
6712 // Check whether we have any visible declaration information for
6713 // this context in this module.
6714 ModuleFile::DeclContextInfosMap::iterator Info;
6715 bool FoundInfo = false;
6716 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6717 Info = M.DeclContextInfos.find(This->Contexts[I]);
6718 if (Info != M.DeclContextInfos.end() &&
6719 Info->second.NameLookupTableData) {
6720 FoundInfo = true;
6721 break;
6722 }
6723 }
6724
6725 if (!FoundInfo)
6726 return false;
6727
Richard Smith52e3fba2014-03-11 07:17:35 +00006728 ASTDeclContextNameLookupTable *LookupTable =
Guy Benyei11169dd2012-12-18 14:30:41 +00006729 Info->second.NameLookupTableData;
6730 bool FoundAnything = false;
6731 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregor5e306b12013-01-23 22:38:11 +00006732 I = LookupTable->data_begin(), E = LookupTable->data_end();
6733 I != E;
6734 ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006735 ASTDeclContextNameLookupTrait::data_type Data = *I;
6736 for (; Data.first != Data.second; ++Data.first) {
6737 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6738 *Data.first);
6739 if (!ND)
6740 continue;
6741
6742 // Record this declaration.
6743 FoundAnything = true;
Richard Smith52874ec2015-02-13 20:17:14 +00006744 if (This->DeclSet.insert(ND).second)
6745 This->Decls[ND->getDeclName()].push_back(ND);
Guy Benyei11169dd2012-12-18 14:30:41 +00006746 }
6747 }
6748
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006749 return FoundAnything && !This->VisitAll;
Guy Benyei11169dd2012-12-18 14:30:41 +00006750 }
6751 };
6752}
6753
6754void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6755 if (!DC->hasExternalVisibleStorage())
6756 return;
Craig Topper79be4cd2013-07-05 04:33:53 +00006757 DeclsMap Decls;
Guy Benyei11169dd2012-12-18 14:30:41 +00006758
6759 // Compute the declaration contexts we need to look into. Multiple such
6760 // declaration contexts occur when two declaration contexts from disjoint
6761 // modules get merged, e.g., when two namespaces with the same name are
6762 // independently defined in separate modules.
6763 SmallVector<const DeclContext *, 2> Contexts;
6764 Contexts.push_back(DC);
6765
6766 if (DC->isNamespace()) {
6767 MergedDeclsMap::iterator Merged
6768 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6769 if (Merged != MergedDecls.end()) {
6770 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6771 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6772 }
6773 }
6774
Argyrios Kyrtzidis2810e9d2012-12-19 22:21:18 +00006775 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6776 /*VisitAll=*/DC->isFileContext());
Guy Benyei11169dd2012-12-18 14:30:41 +00006777 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6778 ++NumVisibleDeclContextsRead;
6779
Craig Topper79be4cd2013-07-05 04:33:53 +00006780 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006781 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6782 }
6783 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6784}
6785
6786/// \brief Under non-PCH compilation the consumer receives the objc methods
6787/// before receiving the implementation, and codegen depends on this.
6788/// We simulate this by deserializing and passing to consumer the methods of the
6789/// implementation before passing the deserialized implementation decl.
6790static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6791 ASTConsumer *Consumer) {
6792 assert(ImplD && Consumer);
6793
Aaron Ballmanaff18c02014-03-13 19:03:34 +00006794 for (auto *I : ImplD->methods())
6795 Consumer->HandleInterestingDecl(DeclGroupRef(I));
Guy Benyei11169dd2012-12-18 14:30:41 +00006796
6797 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6798}
6799
6800void ASTReader::PassInterestingDeclsToConsumer() {
6801 assert(Consumer);
Richard Smith04d05b52014-03-23 00:27:18 +00006802
6803 if (PassingDeclsToConsumer)
6804 return;
6805
6806 // Guard variable to avoid recursively redoing the process of passing
6807 // decls to consumer.
6808 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6809 true);
6810
Guy Benyei11169dd2012-12-18 14:30:41 +00006811 while (!InterestingDecls.empty()) {
6812 Decl *D = InterestingDecls.front();
6813 InterestingDecls.pop_front();
6814
6815 PassInterestingDeclToConsumer(D);
6816 }
6817}
6818
6819void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6820 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6821 PassObjCImplDeclToConsumer(ImplD, Consumer);
6822 else
6823 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6824}
6825
6826void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6827 this->Consumer = Consumer;
6828
6829 if (!Consumer)
6830 return;
6831
Ben Langmuir332aafe2014-01-31 01:06:56 +00006832 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00006833 // Force deserialization of this decl, which will cause it to be queued for
6834 // passing to the consumer.
Ben Langmuir332aafe2014-01-31 01:06:56 +00006835 GetDecl(EagerlyDeserializedDecls[I]);
Guy Benyei11169dd2012-12-18 14:30:41 +00006836 }
Ben Langmuir332aafe2014-01-31 01:06:56 +00006837 EagerlyDeserializedDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00006838
6839 PassInterestingDeclsToConsumer();
6840}
6841
6842void ASTReader::PrintStats() {
6843 std::fprintf(stderr, "*** AST File Statistics:\n");
6844
6845 unsigned NumTypesLoaded
6846 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6847 QualType());
6848 unsigned NumDeclsLoaded
6849 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006850 (Decl *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006851 unsigned NumIdentifiersLoaded
6852 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6853 IdentifiersLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006854 (IdentifierInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006855 unsigned NumMacrosLoaded
6856 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6857 MacrosLoaded.end(),
Craig Toppera13603a2014-05-22 05:54:18 +00006858 (MacroInfo *)nullptr);
Guy Benyei11169dd2012-12-18 14:30:41 +00006859 unsigned NumSelectorsLoaded
6860 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6861 SelectorsLoaded.end(),
6862 Selector());
6863
6864 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6865 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6866 NumSLocEntriesRead, TotalNumSLocEntries,
6867 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6868 if (!TypesLoaded.empty())
6869 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6870 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6871 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6872 if (!DeclsLoaded.empty())
6873 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6874 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6875 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6876 if (!IdentifiersLoaded.empty())
6877 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6878 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6879 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6880 if (!MacrosLoaded.empty())
6881 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6882 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6883 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6884 if (!SelectorsLoaded.empty())
6885 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6886 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6887 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6888 if (TotalNumStatements)
6889 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6890 NumStatementsRead, TotalNumStatements,
6891 ((float)NumStatementsRead/TotalNumStatements * 100));
6892 if (TotalNumMacros)
6893 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6894 NumMacrosRead, TotalNumMacros,
6895 ((float)NumMacrosRead/TotalNumMacros * 100));
6896 if (TotalLexicalDeclContexts)
6897 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6898 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6899 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6900 * 100));
6901 if (TotalVisibleDeclContexts)
6902 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6903 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6904 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6905 * 100));
6906 if (TotalNumMethodPoolEntries) {
6907 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6908 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6909 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6910 * 100));
Guy Benyei11169dd2012-12-18 14:30:41 +00006911 }
Douglas Gregorad2f7a52013-01-28 17:54:36 +00006912 if (NumMethodPoolLookups) {
6913 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6914 NumMethodPoolHits, NumMethodPoolLookups,
6915 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6916 }
6917 if (NumMethodPoolTableLookups) {
6918 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6919 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6920 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6921 * 100.0));
6922 }
6923
Douglas Gregor00a50f72013-01-25 00:38:33 +00006924 if (NumIdentifierLookupHits) {
6925 std::fprintf(stderr,
6926 " %u / %u identifier table lookups succeeded (%f%%)\n",
6927 NumIdentifierLookupHits, NumIdentifierLookups,
6928 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6929 }
6930
Douglas Gregore060e572013-01-25 01:03:03 +00006931 if (GlobalIndex) {
6932 std::fprintf(stderr, "\n");
6933 GlobalIndex->printStats();
6934 }
6935
Guy Benyei11169dd2012-12-18 14:30:41 +00006936 std::fprintf(stderr, "\n");
6937 dump();
6938 std::fprintf(stderr, "\n");
6939}
6940
6941template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6942static void
6943dumpModuleIDMap(StringRef Name,
6944 const ContinuousRangeMap<Key, ModuleFile *,
6945 InitialCapacity> &Map) {
6946 if (Map.begin() == Map.end())
6947 return;
6948
6949 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6950 llvm::errs() << Name << ":\n";
6951 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6952 I != IEnd; ++I) {
6953 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6954 << "\n";
6955 }
6956}
6957
6958void ASTReader::dump() {
6959 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6960 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6961 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6962 dumpModuleIDMap("Global type map", GlobalTypeMap);
6963 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6964 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6965 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6966 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6967 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6968 dumpModuleIDMap("Global preprocessed entity map",
6969 GlobalPreprocessedEntityMap);
6970
6971 llvm::errs() << "\n*** PCH/Modules Loaded:";
6972 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6973 MEnd = ModuleMgr.end();
6974 M != MEnd; ++M)
6975 (*M)->dump();
6976}
6977
6978/// Return the amount of memory used by memory buffers, breaking down
6979/// by heap-backed versus mmap'ed memory.
6980void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6981 for (ModuleConstIterator I = ModuleMgr.begin(),
6982 E = ModuleMgr.end(); I != E; ++I) {
6983 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6984 size_t bytes = buf->getBufferSize();
6985 switch (buf->getBufferKind()) {
6986 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6987 sizes.malloc_bytes += bytes;
6988 break;
6989 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6990 sizes.mmap_bytes += bytes;
6991 break;
6992 }
6993 }
6994 }
6995}
6996
6997void ASTReader::InitializeSema(Sema &S) {
6998 SemaObj = &S;
6999 S.addExternalSource(this);
7000
7001 // Makes sure any declarations that were deserialized "too early"
7002 // still get added to the identifier's declaration chains.
Ben Langmuir5418f402014-09-10 21:29:41 +00007003 for (uint64_t ID : PreloadedDeclIDs) {
7004 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7005 pushExternalDeclIntoScope(D, D->getDeclName());
Guy Benyei11169dd2012-12-18 14:30:41 +00007006 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007007 PreloadedDeclIDs.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007008
Richard Smith3d8e97e2013-10-18 06:54:39 +00007009 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007010 if (!FPPragmaOptions.empty()) {
7011 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
7012 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
7013 }
7014
Richard Smith3d8e97e2013-10-18 06:54:39 +00007015 // FIXME: What happens if these are changed by a module import?
Guy Benyei11169dd2012-12-18 14:30:41 +00007016 if (!OpenCLExtensions.empty()) {
7017 unsigned I = 0;
7018#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
7019#include "clang/Basic/OpenCLExtensions.def"
7020
7021 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
7022 }
Richard Smith3d8e97e2013-10-18 06:54:39 +00007023
7024 UpdateSema();
7025}
7026
7027void ASTReader::UpdateSema() {
7028 assert(SemaObj && "no Sema to update");
7029
7030 // Load the offsets of the declarations that Sema references.
7031 // They will be lazily deserialized when needed.
7032 if (!SemaDeclRefs.empty()) {
7033 assert(SemaDeclRefs.size() % 2 == 0);
7034 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
7035 if (!SemaObj->StdNamespace)
7036 SemaObj->StdNamespace = SemaDeclRefs[I];
7037 if (!SemaObj->StdBadAlloc)
7038 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7039 }
7040 SemaDeclRefs.clear();
7041 }
Dario Domizioli13a0a382014-05-23 12:13:25 +00007042
7043 // Update the state of 'pragma clang optimize'. Use the same API as if we had
7044 // encountered the pragma in the source.
7045 if(OptimizeOffPragmaLocation.isValid())
7046 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
Guy Benyei11169dd2012-12-18 14:30:41 +00007047}
7048
7049IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
7050 // Note that we are loading an identifier.
7051 Deserializing AnIdentifier(this);
Douglas Gregore060e572013-01-25 01:03:03 +00007052 StringRef Name(NameStart, NameEnd - NameStart);
7053
7054 // If there is a global index, look there first to determine which modules
7055 // provably do not have any results for this identifier.
Douglas Gregor7211ac12013-01-25 23:32:03 +00007056 GlobalModuleIndex::HitSet Hits;
Craig Toppera13603a2014-05-22 05:54:18 +00007057 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
Douglas Gregore060e572013-01-25 01:03:03 +00007058 if (!loadGlobalIndex()) {
Douglas Gregor7211ac12013-01-25 23:32:03 +00007059 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7060 HitsPtr = &Hits;
Douglas Gregore060e572013-01-25 01:03:03 +00007061 }
7062 }
Douglas Gregor7211ac12013-01-25 23:32:03 +00007063 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregor00a50f72013-01-25 00:38:33 +00007064 NumIdentifierLookups,
7065 NumIdentifierLookupHits);
Douglas Gregor7211ac12013-01-25 23:32:03 +00007066 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei11169dd2012-12-18 14:30:41 +00007067 IdentifierInfo *II = Visitor.getIdentifierInfo();
7068 markIdentifierUpToDate(II);
7069 return II;
7070}
7071
7072namespace clang {
7073 /// \brief An identifier-lookup iterator that enumerates all of the
7074 /// identifiers stored within a set of AST files.
7075 class ASTIdentifierIterator : public IdentifierIterator {
7076 /// \brief The AST reader whose identifiers are being enumerated.
7077 const ASTReader &Reader;
7078
7079 /// \brief The current index into the chain of AST files stored in
7080 /// the AST reader.
7081 unsigned Index;
7082
7083 /// \brief The current position within the identifier lookup table
7084 /// of the current AST file.
7085 ASTIdentifierLookupTable::key_iterator Current;
7086
7087 /// \brief The end position within the identifier lookup table of
7088 /// the current AST file.
7089 ASTIdentifierLookupTable::key_iterator End;
7090
7091 public:
7092 explicit ASTIdentifierIterator(const ASTReader &Reader);
7093
Craig Topper3e89dfe2014-03-13 02:13:41 +00007094 StringRef Next() override;
Guy Benyei11169dd2012-12-18 14:30:41 +00007095 };
7096}
7097
7098ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
7099 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
7100 ASTIdentifierLookupTable *IdTable
7101 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
7102 Current = IdTable->key_begin();
7103 End = IdTable->key_end();
7104}
7105
7106StringRef ASTIdentifierIterator::Next() {
7107 while (Current == End) {
7108 // If we have exhausted all of our AST files, we're done.
7109 if (Index == 0)
7110 return StringRef();
7111
7112 --Index;
7113 ASTIdentifierLookupTable *IdTable
7114 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7115 IdentifierLookupTable;
7116 Current = IdTable->key_begin();
7117 End = IdTable->key_end();
7118 }
7119
7120 // We have any identifiers remaining in the current AST file; return
7121 // the next one.
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007122 StringRef Result = *Current;
Guy Benyei11169dd2012-12-18 14:30:41 +00007123 ++Current;
Douglas Gregorbfd73d72013-01-23 18:53:14 +00007124 return Result;
Guy Benyei11169dd2012-12-18 14:30:41 +00007125}
7126
Argyrios Kyrtzidis9aca3c62013-04-17 22:10:55 +00007127IdentifierIterator *ASTReader::getIdentifiers() {
7128 if (!loadGlobalIndex())
7129 return GlobalIndex->createIdentifierIterator();
7130
Guy Benyei11169dd2012-12-18 14:30:41 +00007131 return new ASTIdentifierIterator(*this);
7132}
7133
7134namespace clang { namespace serialization {
7135 class ReadMethodPoolVisitor {
7136 ASTReader &Reader;
7137 Selector Sel;
7138 unsigned PriorGeneration;
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007139 unsigned InstanceBits;
7140 unsigned FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007141 bool InstanceHasMoreThanOneDecl;
7142 bool FactoryHasMoreThanOneDecl;
Dmitri Gribenkof8579502013-01-12 19:30:44 +00007143 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7144 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei11169dd2012-12-18 14:30:41 +00007145
7146 public:
Nico Weber2e0c8f72014-12-27 03:58:08 +00007147 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
Guy Benyei11169dd2012-12-18 14:30:41 +00007148 unsigned PriorGeneration)
Nico Weber2e0c8f72014-12-27 03:58:08 +00007149 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
Nico Weberff4b35e2014-12-27 22:14:15 +00007150 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false),
7151 FactoryHasMoreThanOneDecl(false) {}
Nico Weber2e0c8f72014-12-27 03:58:08 +00007152
Guy Benyei11169dd2012-12-18 14:30:41 +00007153 static bool visit(ModuleFile &M, void *UserData) {
7154 ReadMethodPoolVisitor *This
7155 = static_cast<ReadMethodPoolVisitor *>(UserData);
7156
7157 if (!M.SelectorLookupTable)
7158 return false;
7159
7160 // If we've already searched this module file, skip it now.
7161 if (M.Generation <= This->PriorGeneration)
7162 return true;
7163
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007164 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007165 ASTSelectorLookupTable *PoolTable
7166 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7167 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7168 if (Pos == PoolTable->end())
7169 return false;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007170
7171 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei11169dd2012-12-18 14:30:41 +00007172 ++This->Reader.NumSelectorsRead;
7173 // FIXME: Not quite happy with the statistics here. We probably should
7174 // disable this tracking when called via LoadSelector.
7175 // Also, should entries without methods count as misses?
7176 ++This->Reader.NumMethodPoolEntriesRead;
7177 ASTSelectorLookupTrait::data_type Data = *Pos;
7178 if (This->Reader.DeserializationListener)
7179 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7180 This->Sel);
7181
7182 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7183 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007184 This->InstanceBits = Data.InstanceBits;
7185 This->FactoryBits = Data.FactoryBits;
Nico Weberff4b35e2014-12-27 22:14:15 +00007186 This->InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
7187 This->FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
Guy Benyei11169dd2012-12-18 14:30:41 +00007188 return true;
7189 }
7190
7191 /// \brief Retrieve the instance methods found by this visitor.
7192 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7193 return InstanceMethods;
7194 }
7195
7196 /// \brief Retrieve the instance methods found by this visitor.
7197 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7198 return FactoryMethods;
7199 }
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007200
7201 unsigned getInstanceBits() const { return InstanceBits; }
7202 unsigned getFactoryBits() const { return FactoryBits; }
Nico Weberff4b35e2014-12-27 22:14:15 +00007203 bool instanceHasMoreThanOneDecl() const {
7204 return InstanceHasMoreThanOneDecl;
7205 }
7206 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
Guy Benyei11169dd2012-12-18 14:30:41 +00007207 };
7208} } // end namespace clang::serialization
7209
7210/// \brief Add the given set of methods to the method list.
7211static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7212 ObjCMethodList &List) {
7213 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7214 S.addMethodToGlobalList(&List, Methods[I]);
7215 }
7216}
7217
7218void ASTReader::ReadMethodPool(Selector Sel) {
7219 // Get the selector generation and update it to the current generation.
7220 unsigned &Generation = SelectorGeneration[Sel];
7221 unsigned PriorGeneration = Generation;
Richard Smith053f6c62014-05-16 23:01:30 +00007222 Generation = getGeneration();
Guy Benyei11169dd2012-12-18 14:30:41 +00007223
7224 // Search for methods defined with this selector.
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007225 ++NumMethodPoolLookups;
Guy Benyei11169dd2012-12-18 14:30:41 +00007226 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7227 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7228
7229 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007230 Visitor.getFactoryMethods().empty())
Guy Benyei11169dd2012-12-18 14:30:41 +00007231 return;
Douglas Gregorad2f7a52013-01-28 17:54:36 +00007232
7233 ++NumMethodPoolHits;
7234
Guy Benyei11169dd2012-12-18 14:30:41 +00007235 if (!getSema())
7236 return;
7237
7238 Sema &S = *getSema();
7239 Sema::GlobalMethodPool::iterator Pos
7240 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
Ben Langmuira0c32e92015-01-12 19:27:00 +00007241
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007242 Pos->second.first.setBits(Visitor.getInstanceBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007243 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
Argyrios Kyrtzidisd3da6e02013-04-17 00:08:58 +00007244 Pos->second.second.setBits(Visitor.getFactoryBits());
Nico Weberff4b35e2014-12-27 22:14:15 +00007245 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
Ben Langmuira0c32e92015-01-12 19:27:00 +00007246
7247 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
7248 // when building a module we keep every method individually and may need to
7249 // update hasMoreThanOneDecl as we add the methods.
7250 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7251 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
Guy Benyei11169dd2012-12-18 14:30:41 +00007252}
7253
7254void ASTReader::ReadKnownNamespaces(
7255 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7256 Namespaces.clear();
7257
7258 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7259 if (NamespaceDecl *Namespace
7260 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7261 Namespaces.push_back(Namespace);
7262 }
7263}
7264
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007265void ASTReader::ReadUndefinedButUsed(
Nick Lewyckyf0f56162013-01-31 03:23:57 +00007266 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007267 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7268 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky8334af82013-01-26 00:35:08 +00007269 SourceLocation Loc =
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +00007270 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky8334af82013-01-26 00:35:08 +00007271 Undefined.insert(std::make_pair(D, Loc));
7272 }
7273}
Nick Lewycky8334af82013-01-26 00:35:08 +00007274
Guy Benyei11169dd2012-12-18 14:30:41 +00007275void ASTReader::ReadTentativeDefinitions(
7276 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7277 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7278 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7279 if (Var)
7280 TentativeDefs.push_back(Var);
7281 }
7282 TentativeDefinitions.clear();
7283}
7284
7285void ASTReader::ReadUnusedFileScopedDecls(
7286 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7287 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7288 DeclaratorDecl *D
7289 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7290 if (D)
7291 Decls.push_back(D);
7292 }
7293 UnusedFileScopedDecls.clear();
7294}
7295
7296void ASTReader::ReadDelegatingConstructors(
7297 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7298 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7299 CXXConstructorDecl *D
7300 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7301 if (D)
7302 Decls.push_back(D);
7303 }
7304 DelegatingCtorDecls.clear();
7305}
7306
7307void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7308 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7309 TypedefNameDecl *D
7310 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7311 if (D)
7312 Decls.push_back(D);
7313 }
7314 ExtVectorDecls.clear();
7315}
7316
Nico Weber72889432014-09-06 01:25:55 +00007317void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7318 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7319 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7320 ++I) {
7321 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7322 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7323 if (D)
7324 Decls.insert(D);
7325 }
7326 UnusedLocalTypedefNameCandidates.clear();
7327}
7328
Guy Benyei11169dd2012-12-18 14:30:41 +00007329void
Richard Smith78165b52013-01-10 23:43:47 +00007330ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7331 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7332 NamedDecl *D
7333 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
Guy Benyei11169dd2012-12-18 14:30:41 +00007334 if (D)
7335 Decls.push_back(D);
7336 }
Richard Smith78165b52013-01-10 23:43:47 +00007337 LocallyScopedExternCDecls.clear();
Guy Benyei11169dd2012-12-18 14:30:41 +00007338}
7339
7340void ASTReader::ReadReferencedSelectors(
7341 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7342 if (ReferencedSelectorsData.empty())
7343 return;
7344
7345 // If there are @selector references added them to its pool. This is for
7346 // implementation of -Wselector.
7347 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7348 unsigned I = 0;
7349 while (I < DataSize) {
7350 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7351 SourceLocation SelLoc
7352 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7353 Sels.push_back(std::make_pair(Sel, SelLoc));
7354 }
7355 ReferencedSelectorsData.clear();
7356}
7357
7358void ASTReader::ReadWeakUndeclaredIdentifiers(
7359 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7360 if (WeakUndeclaredIdentifiers.empty())
7361 return;
7362
7363 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7364 IdentifierInfo *WeakId
7365 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7366 IdentifierInfo *AliasId
7367 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7368 SourceLocation Loc
7369 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7370 bool Used = WeakUndeclaredIdentifiers[I++];
7371 WeakInfo WI(AliasId, Loc);
7372 WI.setUsed(Used);
7373 WeakIDs.push_back(std::make_pair(WeakId, WI));
7374 }
7375 WeakUndeclaredIdentifiers.clear();
7376}
7377
7378void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7379 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7380 ExternalVTableUse VT;
7381 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7382 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7383 VT.DefinitionRequired = VTableUses[Idx++];
7384 VTables.push_back(VT);
7385 }
7386
7387 VTableUses.clear();
7388}
7389
7390void ASTReader::ReadPendingInstantiations(
7391 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7392 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7393 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7394 SourceLocation Loc
7395 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7396
7397 Pending.push_back(std::make_pair(D, Loc));
7398 }
7399 PendingInstantiations.clear();
7400}
7401
Richard Smithe40f2ba2013-08-07 21:41:30 +00007402void ASTReader::ReadLateParsedTemplates(
7403 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7404 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7405 /* In loop */) {
7406 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7407
7408 LateParsedTemplate *LT = new LateParsedTemplate;
7409 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7410
7411 ModuleFile *F = getOwningModuleFile(LT->D);
7412 assert(F && "No module");
7413
7414 unsigned TokN = LateParsedTemplates[Idx++];
7415 LT->Toks.reserve(TokN);
7416 for (unsigned T = 0; T < TokN; ++T)
7417 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7418
7419 LPTMap[FD] = LT;
7420 }
7421
7422 LateParsedTemplates.clear();
7423}
7424
Guy Benyei11169dd2012-12-18 14:30:41 +00007425void ASTReader::LoadSelector(Selector Sel) {
7426 // It would be complicated to avoid reading the methods anyway. So don't.
7427 ReadMethodPool(Sel);
7428}
7429
7430void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7431 assert(ID && "Non-zero identifier ID required");
7432 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7433 IdentifiersLoaded[ID - 1] = II;
7434 if (DeserializationListener)
7435 DeserializationListener->IdentifierRead(ID, II);
7436}
7437
7438/// \brief Set the globally-visible declarations associated with the given
7439/// identifier.
7440///
7441/// If the AST reader is currently in a state where the given declaration IDs
7442/// cannot safely be resolved, they are queued until it is safe to resolve
7443/// them.
7444///
7445/// \param II an IdentifierInfo that refers to one or more globally-visible
7446/// declarations.
7447///
7448/// \param DeclIDs the set of declaration IDs with the name @p II that are
7449/// visible at global scope.
7450///
Douglas Gregor6168bd22013-02-18 15:53:43 +00007451/// \param Decls if non-null, this vector will be populated with the set of
7452/// deserialized declarations. These declarations will not be pushed into
7453/// scope.
Guy Benyei11169dd2012-12-18 14:30:41 +00007454void
7455ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7456 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregor6168bd22013-02-18 15:53:43 +00007457 SmallVectorImpl<Decl *> *Decls) {
7458 if (NumCurrentElementsDeserializing && !Decls) {
7459 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei11169dd2012-12-18 14:30:41 +00007460 return;
7461 }
7462
7463 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
Ben Langmuir5418f402014-09-10 21:29:41 +00007464 if (!SemaObj) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007465 // Queue this declaration so that it will be added to the
7466 // translation unit scope and identifier's declaration chain
7467 // once a Sema object is known.
Ben Langmuir5418f402014-09-10 21:29:41 +00007468 PreloadedDeclIDs.push_back(DeclIDs[I]);
7469 continue;
Guy Benyei11169dd2012-12-18 14:30:41 +00007470 }
Ben Langmuir5418f402014-09-10 21:29:41 +00007471
7472 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7473
7474 // If we're simply supposed to record the declarations, do so now.
7475 if (Decls) {
7476 Decls->push_back(D);
7477 continue;
7478 }
7479
7480 // Introduce this declaration into the translation-unit scope
7481 // and add it to the declaration chain for this identifier, so
7482 // that (unqualified) name lookup will find it.
7483 pushExternalDeclIntoScope(D, II);
Guy Benyei11169dd2012-12-18 14:30:41 +00007484 }
7485}
7486
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007487IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007488 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007489 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007490
7491 if (IdentifiersLoaded.empty()) {
7492 Error("no identifier table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007493 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007494 }
7495
7496 ID -= 1;
7497 if (!IdentifiersLoaded[ID]) {
7498 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7499 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7500 ModuleFile *M = I->second;
7501 unsigned Index = ID - M->BaseIdentifierID;
7502 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7503
7504 // All of the strings in the AST file are preceded by a 16-bit length.
7505 // Extract that 16-bit length to avoid having to execute strlen().
7506 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7507 // unsigned integers. This is important to avoid integer overflow when
7508 // we cast them to 'unsigned'.
7509 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7510 unsigned StrLen = (((unsigned) StrLenPtr[0])
7511 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007512 IdentifiersLoaded[ID]
7513 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei11169dd2012-12-18 14:30:41 +00007514 if (DeserializationListener)
7515 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7516 }
7517
7518 return IdentifiersLoaded[ID];
7519}
7520
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007521IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7522 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei11169dd2012-12-18 14:30:41 +00007523}
7524
7525IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7526 if (LocalID < NUM_PREDEF_IDENT_IDS)
7527 return LocalID;
7528
7529 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7530 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7531 assert(I != M.IdentifierRemap.end()
7532 && "Invalid index into identifier index remap");
7533
7534 return LocalID + I->second;
7535}
7536
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007537MacroInfo *ASTReader::getMacro(MacroID ID) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007538 if (ID == 0)
Craig Toppera13603a2014-05-22 05:54:18 +00007539 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007540
7541 if (MacrosLoaded.empty()) {
7542 Error("no macro table in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007543 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007544 }
7545
7546 ID -= NUM_PREDEF_MACRO_IDS;
7547 if (!MacrosLoaded[ID]) {
7548 GlobalMacroMapType::iterator I
7549 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7550 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7551 ModuleFile *M = I->second;
7552 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00007553 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7554
7555 if (DeserializationListener)
7556 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7557 MacrosLoaded[ID]);
Guy Benyei11169dd2012-12-18 14:30:41 +00007558 }
7559
7560 return MacrosLoaded[ID];
7561}
7562
7563MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7564 if (LocalID < NUM_PREDEF_MACRO_IDS)
7565 return LocalID;
7566
7567 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7568 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7569 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7570
7571 return LocalID + I->second;
7572}
7573
7574serialization::SubmoduleID
7575ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7576 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7577 return LocalID;
7578
7579 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7580 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7581 assert(I != M.SubmoduleRemap.end()
7582 && "Invalid index into submodule index remap");
7583
7584 return LocalID + I->second;
7585}
7586
7587Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7588 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7589 assert(GlobalID == 0 && "Unhandled global submodule ID");
Craig Toppera13603a2014-05-22 05:54:18 +00007590 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007591 }
7592
7593 if (GlobalID > SubmodulesLoaded.size()) {
7594 Error("submodule ID out of range in AST file");
Craig Toppera13603a2014-05-22 05:54:18 +00007595 return nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007596 }
7597
7598 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7599}
Douglas Gregorc147b0b2013-01-12 01:29:50 +00007600
7601Module *ASTReader::getModule(unsigned ID) {
7602 return getSubmodule(ID);
7603}
7604
Guy Benyei11169dd2012-12-18 14:30:41 +00007605Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7606 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7607}
7608
7609Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7610 if (ID == 0)
7611 return Selector();
7612
7613 if (ID > SelectorsLoaded.size()) {
7614 Error("selector ID out of range in AST file");
7615 return Selector();
7616 }
7617
Craig Toppera13603a2014-05-22 05:54:18 +00007618 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
Guy Benyei11169dd2012-12-18 14:30:41 +00007619 // Load this selector from the selector table.
7620 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7621 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7622 ModuleFile &M = *I->second;
7623 ASTSelectorLookupTrait Trait(*this, M);
7624 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7625 SelectorsLoaded[ID - 1] =
7626 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7627 if (DeserializationListener)
7628 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7629 }
7630
7631 return SelectorsLoaded[ID - 1];
7632}
7633
7634Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7635 return DecodeSelector(ID);
7636}
7637
7638uint32_t ASTReader::GetNumExternalSelectors() {
7639 // ID 0 (the null selector) is considered an external selector.
7640 return getTotalNumSelectors() + 1;
7641}
7642
7643serialization::SelectorID
7644ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7645 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7646 return LocalID;
7647
7648 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7649 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7650 assert(I != M.SelectorRemap.end()
7651 && "Invalid index into selector index remap");
7652
7653 return LocalID + I->second;
7654}
7655
7656DeclarationName
7657ASTReader::ReadDeclarationName(ModuleFile &F,
7658 const RecordData &Record, unsigned &Idx) {
7659 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7660 switch (Kind) {
7661 case DeclarationName::Identifier:
Douglas Gregorc8a992f2013-01-21 16:52:34 +00007662 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007663
7664 case DeclarationName::ObjCZeroArgSelector:
7665 case DeclarationName::ObjCOneArgSelector:
7666 case DeclarationName::ObjCMultiArgSelector:
7667 return DeclarationName(ReadSelector(F, Record, Idx));
7668
7669 case DeclarationName::CXXConstructorName:
7670 return Context.DeclarationNames.getCXXConstructorName(
7671 Context.getCanonicalType(readType(F, Record, Idx)));
7672
7673 case DeclarationName::CXXDestructorName:
7674 return Context.DeclarationNames.getCXXDestructorName(
7675 Context.getCanonicalType(readType(F, Record, Idx)));
7676
7677 case DeclarationName::CXXConversionFunctionName:
7678 return Context.DeclarationNames.getCXXConversionFunctionName(
7679 Context.getCanonicalType(readType(F, Record, Idx)));
7680
7681 case DeclarationName::CXXOperatorName:
7682 return Context.DeclarationNames.getCXXOperatorName(
7683 (OverloadedOperatorKind)Record[Idx++]);
7684
7685 case DeclarationName::CXXLiteralOperatorName:
7686 return Context.DeclarationNames.getCXXLiteralOperatorName(
7687 GetIdentifierInfo(F, Record, Idx));
7688
7689 case DeclarationName::CXXUsingDirective:
7690 return DeclarationName::getUsingDirectiveName();
7691 }
7692
7693 llvm_unreachable("Invalid NameKind!");
7694}
7695
7696void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7697 DeclarationNameLoc &DNLoc,
7698 DeclarationName Name,
7699 const RecordData &Record, unsigned &Idx) {
7700 switch (Name.getNameKind()) {
7701 case DeclarationName::CXXConstructorName:
7702 case DeclarationName::CXXDestructorName:
7703 case DeclarationName::CXXConversionFunctionName:
7704 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7705 break;
7706
7707 case DeclarationName::CXXOperatorName:
7708 DNLoc.CXXOperatorName.BeginOpNameLoc
7709 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7710 DNLoc.CXXOperatorName.EndOpNameLoc
7711 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7712 break;
7713
7714 case DeclarationName::CXXLiteralOperatorName:
7715 DNLoc.CXXLiteralOperatorName.OpNameLoc
7716 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7717 break;
7718
7719 case DeclarationName::Identifier:
7720 case DeclarationName::ObjCZeroArgSelector:
7721 case DeclarationName::ObjCOneArgSelector:
7722 case DeclarationName::ObjCMultiArgSelector:
7723 case DeclarationName::CXXUsingDirective:
7724 break;
7725 }
7726}
7727
7728void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7729 DeclarationNameInfo &NameInfo,
7730 const RecordData &Record, unsigned &Idx) {
7731 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7732 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7733 DeclarationNameLoc DNLoc;
7734 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7735 NameInfo.setInfo(DNLoc);
7736}
7737
7738void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7739 const RecordData &Record, unsigned &Idx) {
7740 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7741 unsigned NumTPLists = Record[Idx++];
7742 Info.NumTemplParamLists = NumTPLists;
7743 if (NumTPLists) {
7744 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7745 for (unsigned i=0; i != NumTPLists; ++i)
7746 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7747 }
7748}
7749
7750TemplateName
7751ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7752 unsigned &Idx) {
7753 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7754 switch (Kind) {
7755 case TemplateName::Template:
7756 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7757
7758 case TemplateName::OverloadedTemplate: {
7759 unsigned size = Record[Idx++];
7760 UnresolvedSet<8> Decls;
7761 while (size--)
7762 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7763
7764 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7765 }
7766
7767 case TemplateName::QualifiedTemplate: {
7768 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7769 bool hasTemplKeyword = Record[Idx++];
7770 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7771 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7772 }
7773
7774 case TemplateName::DependentTemplate: {
7775 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7776 if (Record[Idx++]) // isIdentifier
7777 return Context.getDependentTemplateName(NNS,
7778 GetIdentifierInfo(F, Record,
7779 Idx));
7780 return Context.getDependentTemplateName(NNS,
7781 (OverloadedOperatorKind)Record[Idx++]);
7782 }
7783
7784 case TemplateName::SubstTemplateTemplateParm: {
7785 TemplateTemplateParmDecl *param
7786 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7787 if (!param) return TemplateName();
7788 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7789 return Context.getSubstTemplateTemplateParm(param, replacement);
7790 }
7791
7792 case TemplateName::SubstTemplateTemplateParmPack: {
7793 TemplateTemplateParmDecl *Param
7794 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7795 if (!Param)
7796 return TemplateName();
7797
7798 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7799 if (ArgPack.getKind() != TemplateArgument::Pack)
7800 return TemplateName();
7801
7802 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7803 }
7804 }
7805
7806 llvm_unreachable("Unhandled template name kind!");
7807}
7808
7809TemplateArgument
7810ASTReader::ReadTemplateArgument(ModuleFile &F,
7811 const RecordData &Record, unsigned &Idx) {
7812 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7813 switch (Kind) {
7814 case TemplateArgument::Null:
7815 return TemplateArgument();
7816 case TemplateArgument::Type:
7817 return TemplateArgument(readType(F, Record, Idx));
7818 case TemplateArgument::Declaration: {
7819 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
David Blaikie0f62c8d2014-10-16 04:21:25 +00007820 return TemplateArgument(D, readType(F, Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00007821 }
7822 case TemplateArgument::NullPtr:
7823 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7824 case TemplateArgument::Integral: {
7825 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7826 QualType T = readType(F, Record, Idx);
7827 return TemplateArgument(Context, Value, T);
7828 }
7829 case TemplateArgument::Template:
7830 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7831 case TemplateArgument::TemplateExpansion: {
7832 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikie05785d12013-02-20 22:23:23 +00007833 Optional<unsigned> NumTemplateExpansions;
Guy Benyei11169dd2012-12-18 14:30:41 +00007834 if (unsigned NumExpansions = Record[Idx++])
7835 NumTemplateExpansions = NumExpansions - 1;
7836 return TemplateArgument(Name, NumTemplateExpansions);
7837 }
7838 case TemplateArgument::Expression:
7839 return TemplateArgument(ReadExpr(F));
7840 case TemplateArgument::Pack: {
7841 unsigned NumArgs = Record[Idx++];
7842 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7843 for (unsigned I = 0; I != NumArgs; ++I)
7844 Args[I] = ReadTemplateArgument(F, Record, Idx);
7845 return TemplateArgument(Args, NumArgs);
7846 }
7847 }
7848
7849 llvm_unreachable("Unhandled template argument kind!");
7850}
7851
7852TemplateParameterList *
7853ASTReader::ReadTemplateParameterList(ModuleFile &F,
7854 const RecordData &Record, unsigned &Idx) {
7855 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7856 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7857 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7858
7859 unsigned NumParams = Record[Idx++];
7860 SmallVector<NamedDecl *, 16> Params;
7861 Params.reserve(NumParams);
7862 while (NumParams--)
7863 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7864
7865 TemplateParameterList* TemplateParams =
7866 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7867 Params.data(), Params.size(), RAngleLoc);
7868 return TemplateParams;
7869}
7870
7871void
7872ASTReader::
Craig Topper5603df42013-07-05 19:34:19 +00007873ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
Guy Benyei11169dd2012-12-18 14:30:41 +00007874 ModuleFile &F, const RecordData &Record,
7875 unsigned &Idx) {
7876 unsigned NumTemplateArgs = Record[Idx++];
7877 TemplArgs.reserve(NumTemplateArgs);
7878 while (NumTemplateArgs--)
7879 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7880}
7881
7882/// \brief Read a UnresolvedSet structure.
Richard Smitha4ba74c2013-08-30 04:46:40 +00007883void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
Guy Benyei11169dd2012-12-18 14:30:41 +00007884 const RecordData &Record, unsigned &Idx) {
7885 unsigned NumDecls = Record[Idx++];
7886 Set.reserve(Context, NumDecls);
7887 while (NumDecls--) {
Richard Smitha4ba74c2013-08-30 04:46:40 +00007888 DeclID ID = ReadDeclID(F, Record, Idx);
Guy Benyei11169dd2012-12-18 14:30:41 +00007889 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
Richard Smitha4ba74c2013-08-30 04:46:40 +00007890 Set.addLazyDecl(Context, ID, AS);
Guy Benyei11169dd2012-12-18 14:30:41 +00007891 }
7892}
7893
7894CXXBaseSpecifier
7895ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7896 const RecordData &Record, unsigned &Idx) {
7897 bool isVirtual = static_cast<bool>(Record[Idx++]);
7898 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7899 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7900 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7901 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7902 SourceRange Range = ReadSourceRange(F, Record, Idx);
7903 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7904 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7905 EllipsisLoc);
7906 Result.setInheritConstructors(inheritConstructors);
7907 return Result;
7908}
7909
7910std::pair<CXXCtorInitializer **, unsigned>
7911ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7912 unsigned &Idx) {
Craig Toppera13603a2014-05-22 05:54:18 +00007913 CXXCtorInitializer **CtorInitializers = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007914 unsigned NumInitializers = Record[Idx++];
7915 if (NumInitializers) {
7916 CtorInitializers
7917 = new (Context) CXXCtorInitializer*[NumInitializers];
7918 for (unsigned i=0; i != NumInitializers; ++i) {
Craig Toppera13603a2014-05-22 05:54:18 +00007919 TypeSourceInfo *TInfo = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007920 bool IsBaseVirtual = false;
Craig Toppera13603a2014-05-22 05:54:18 +00007921 FieldDecl *Member = nullptr;
7922 IndirectFieldDecl *IndirectMember = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00007923
7924 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7925 switch (Type) {
7926 case CTOR_INITIALIZER_BASE:
7927 TInfo = GetTypeSourceInfo(F, Record, Idx);
7928 IsBaseVirtual = Record[Idx++];
7929 break;
7930
7931 case CTOR_INITIALIZER_DELEGATING:
7932 TInfo = GetTypeSourceInfo(F, Record, Idx);
7933 break;
7934
7935 case CTOR_INITIALIZER_MEMBER:
7936 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7937 break;
7938
7939 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7940 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7941 break;
7942 }
7943
7944 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7945 Expr *Init = ReadExpr(F);
7946 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7947 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7948 bool IsWritten = Record[Idx++];
7949 unsigned SourceOrderOrNumArrayIndices;
7950 SmallVector<VarDecl *, 8> Indices;
7951 if (IsWritten) {
7952 SourceOrderOrNumArrayIndices = Record[Idx++];
7953 } else {
7954 SourceOrderOrNumArrayIndices = Record[Idx++];
7955 Indices.reserve(SourceOrderOrNumArrayIndices);
7956 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7957 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7958 }
7959
7960 CXXCtorInitializer *BOMInit;
7961 if (Type == CTOR_INITIALIZER_BASE) {
7962 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7963 LParenLoc, Init, RParenLoc,
7964 MemberOrEllipsisLoc);
7965 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7966 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7967 Init, RParenLoc);
7968 } else if (IsWritten) {
7969 if (Member)
7970 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7971 LParenLoc, Init, RParenLoc);
7972 else
7973 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7974 MemberOrEllipsisLoc, LParenLoc,
7975 Init, RParenLoc);
7976 } else {
Argyrios Kyrtzidis794671d2013-05-30 23:59:46 +00007977 if (IndirectMember) {
7978 assert(Indices.empty() && "Indirect field improperly initialized");
7979 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7980 MemberOrEllipsisLoc, LParenLoc,
7981 Init, RParenLoc);
7982 } else {
7983 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7984 LParenLoc, Init, RParenLoc,
7985 Indices.data(), Indices.size());
7986 }
Guy Benyei11169dd2012-12-18 14:30:41 +00007987 }
7988
7989 if (IsWritten)
7990 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7991 CtorInitializers[i] = BOMInit;
7992 }
7993 }
7994
7995 return std::make_pair(CtorInitializers, NumInitializers);
7996}
7997
7998NestedNameSpecifier *
7999ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
8000 const RecordData &Record, unsigned &Idx) {
8001 unsigned N = Record[Idx++];
Craig Toppera13603a2014-05-22 05:54:18 +00008002 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
Guy Benyei11169dd2012-12-18 14:30:41 +00008003 for (unsigned I = 0; I != N; ++I) {
8004 NestedNameSpecifier::SpecifierKind Kind
8005 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8006 switch (Kind) {
8007 case NestedNameSpecifier::Identifier: {
8008 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8009 NNS = NestedNameSpecifier::Create(Context, Prev, II);
8010 break;
8011 }
8012
8013 case NestedNameSpecifier::Namespace: {
8014 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8015 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8016 break;
8017 }
8018
8019 case NestedNameSpecifier::NamespaceAlias: {
8020 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8021 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8022 break;
8023 }
8024
8025 case NestedNameSpecifier::TypeSpec:
8026 case NestedNameSpecifier::TypeSpecWithTemplate: {
8027 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
8028 if (!T)
Craig Toppera13603a2014-05-22 05:54:18 +00008029 return nullptr;
8030
Guy Benyei11169dd2012-12-18 14:30:41 +00008031 bool Template = Record[Idx++];
8032 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8033 break;
8034 }
8035
8036 case NestedNameSpecifier::Global: {
8037 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8038 // No associated value, and there can't be a prefix.
8039 break;
8040 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008041
8042 case NestedNameSpecifier::Super: {
8043 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8044 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8045 break;
8046 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008047 }
8048 Prev = NNS;
8049 }
8050 return NNS;
8051}
8052
8053NestedNameSpecifierLoc
8054ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8055 unsigned &Idx) {
8056 unsigned N = Record[Idx++];
8057 NestedNameSpecifierLocBuilder Builder;
8058 for (unsigned I = 0; I != N; ++I) {
8059 NestedNameSpecifier::SpecifierKind Kind
8060 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8061 switch (Kind) {
8062 case NestedNameSpecifier::Identifier: {
8063 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8064 SourceRange Range = ReadSourceRange(F, Record, Idx);
8065 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8066 break;
8067 }
8068
8069 case NestedNameSpecifier::Namespace: {
8070 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8071 SourceRange Range = ReadSourceRange(F, Record, Idx);
8072 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8073 break;
8074 }
8075
8076 case NestedNameSpecifier::NamespaceAlias: {
8077 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8078 SourceRange Range = ReadSourceRange(F, Record, Idx);
8079 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8080 break;
8081 }
8082
8083 case NestedNameSpecifier::TypeSpec:
8084 case NestedNameSpecifier::TypeSpecWithTemplate: {
8085 bool Template = Record[Idx++];
8086 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
8087 if (!T)
8088 return NestedNameSpecifierLoc();
8089 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8090
8091 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8092 Builder.Extend(Context,
8093 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8094 T->getTypeLoc(), ColonColonLoc);
8095 break;
8096 }
8097
8098 case NestedNameSpecifier::Global: {
8099 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8100 Builder.MakeGlobal(Context, ColonColonLoc);
8101 break;
8102 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008103
8104 case NestedNameSpecifier::Super: {
8105 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8106 SourceRange Range = ReadSourceRange(F, Record, Idx);
8107 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8108 break;
8109 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008110 }
8111 }
Nikola Smiljanic67860242014-09-26 00:28:20 +00008112
Guy Benyei11169dd2012-12-18 14:30:41 +00008113 return Builder.getWithLocInContext(Context);
8114}
8115
8116SourceRange
8117ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8118 unsigned &Idx) {
8119 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8120 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8121 return SourceRange(beg, end);
8122}
8123
8124/// \brief Read an integral value
8125llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8126 unsigned BitWidth = Record[Idx++];
8127 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8128 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8129 Idx += NumWords;
8130 return Result;
8131}
8132
8133/// \brief Read a signed integral value
8134llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8135 bool isUnsigned = Record[Idx++];
8136 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8137}
8138
8139/// \brief Read a floating-point value
Tim Northover178723a2013-01-22 09:46:51 +00008140llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8141 const llvm::fltSemantics &Sem,
8142 unsigned &Idx) {
8143 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei11169dd2012-12-18 14:30:41 +00008144}
8145
8146// \brief Read a string
8147std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8148 unsigned Len = Record[Idx++];
8149 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8150 Idx += Len;
8151 return Result;
8152}
8153
Richard Smith7ed1bc92014-12-05 22:42:13 +00008154std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8155 unsigned &Idx) {
8156 std::string Filename = ReadString(Record, Idx);
8157 ResolveImportedPath(F, Filename);
8158 return Filename;
8159}
8160
Guy Benyei11169dd2012-12-18 14:30:41 +00008161VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8162 unsigned &Idx) {
8163 unsigned Major = Record[Idx++];
8164 unsigned Minor = Record[Idx++];
8165 unsigned Subminor = Record[Idx++];
8166 if (Minor == 0)
8167 return VersionTuple(Major);
8168 if (Subminor == 0)
8169 return VersionTuple(Major, Minor - 1);
8170 return VersionTuple(Major, Minor - 1, Subminor - 1);
8171}
8172
8173CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8174 const RecordData &Record,
8175 unsigned &Idx) {
8176 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8177 return CXXTemporary::Create(Context, Decl);
8178}
8179
8180DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
Argyrios Kyrtzidisdc9fdaf2013-05-24 05:44:08 +00008181 return Diag(CurrentImportLoc, DiagID);
Guy Benyei11169dd2012-12-18 14:30:41 +00008182}
8183
8184DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8185 return Diags.Report(Loc, DiagID);
8186}
8187
8188/// \brief Retrieve the identifier table associated with the
8189/// preprocessor.
8190IdentifierTable &ASTReader::getIdentifierTable() {
8191 return PP.getIdentifierTable();
8192}
8193
8194/// \brief Record that the given ID maps to the given switch-case
8195/// statement.
8196void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008197 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
Guy Benyei11169dd2012-12-18 14:30:41 +00008198 "Already have a SwitchCase with this ID");
8199 (*CurrSwitchCaseStmts)[ID] = SC;
8200}
8201
8202/// \brief Retrieve the switch-case statement with the given ID.
8203SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
Craig Toppera13603a2014-05-22 05:54:18 +00008204 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
Guy Benyei11169dd2012-12-18 14:30:41 +00008205 return (*CurrSwitchCaseStmts)[ID];
8206}
8207
8208void ASTReader::ClearSwitchCaseIDs() {
8209 CurrSwitchCaseStmts->clear();
8210}
8211
8212void ASTReader::ReadComments() {
8213 std::vector<RawComment *> Comments;
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008214 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei11169dd2012-12-18 14:30:41 +00008215 serialization::ModuleFile *> >::iterator
8216 I = CommentsCursors.begin(),
8217 E = CommentsCursors.end();
8218 I != E; ++I) {
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008219 Comments.clear();
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008220 BitstreamCursor &Cursor = I->first;
Guy Benyei11169dd2012-12-18 14:30:41 +00008221 serialization::ModuleFile &F = *I->second;
8222 SavedStreamPosition SavedPosition(Cursor);
8223
8224 RecordData Record;
8225 while (true) {
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008226 llvm::BitstreamEntry Entry =
8227 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008228
Chris Lattner7fb3bef2013-01-20 00:56:42 +00008229 switch (Entry.Kind) {
8230 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8231 case llvm::BitstreamEntry::Error:
8232 Error("malformed block record in AST file");
8233 return;
8234 case llvm::BitstreamEntry::EndBlock:
8235 goto NextCursor;
8236 case llvm::BitstreamEntry::Record:
8237 // The interesting case.
Guy Benyei11169dd2012-12-18 14:30:41 +00008238 break;
Guy Benyei11169dd2012-12-18 14:30:41 +00008239 }
8240
8241 // Read a record.
8242 Record.clear();
Chris Lattner0e6c9402013-01-20 02:38:54 +00008243 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008244 case COMMENTS_RAW_COMMENT: {
8245 unsigned Idx = 0;
8246 SourceRange SR = ReadSourceRange(F, Record, Idx);
8247 RawComment::CommentKind Kind =
8248 (RawComment::CommentKind) Record[Idx++];
8249 bool IsTrailingComment = Record[Idx++];
8250 bool IsAlmostTrailingComment = Record[Idx++];
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00008251 Comments.push_back(new (Context) RawComment(
8252 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8253 Context.getLangOpts().CommentOpts.ParseAllComments));
Guy Benyei11169dd2012-12-18 14:30:41 +00008254 break;
8255 }
8256 }
8257 }
Dmitri Gribenko9ee0e302014-03-27 15:40:39 +00008258 NextCursor:
8259 Context.Comments.addDeserializedComments(Comments);
Guy Benyei11169dd2012-12-18 14:30:41 +00008260 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008261}
8262
Argyrios Kyrtzidis1bde1172014-11-18 05:24:18 +00008263void ASTReader::getInputFiles(ModuleFile &F,
8264 SmallVectorImpl<serialization::InputFile> &Files) {
8265 for (unsigned I = 0, E = F.InputFilesLoaded.size(); I != E; ++I) {
8266 unsigned ID = I+1;
8267 Files.push_back(getInputFile(F, ID));
8268 }
8269}
8270
Richard Smithcd45dbc2014-04-19 03:48:30 +00008271std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8272 // If we know the owning module, use it.
8273 if (Module *M = D->getOwningModule())
8274 return M->getFullModuleName();
8275
8276 // Otherwise, use the name of the top-level module the decl is within.
8277 if (ModuleFile *M = getOwningModuleFile(D))
8278 return M->ModuleName;
8279
8280 // Not from a module.
8281 return "";
8282}
8283
Guy Benyei11169dd2012-12-18 14:30:41 +00008284void ASTReader::finishPendingActions() {
Richard Smith851072e2014-05-19 20:59:20 +00008285 while (!PendingIdentifierInfos.empty() ||
8286 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
Richard Smith2b9e3e32013-10-18 06:05:18 +00008287 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
Richard Smitha0ce9c42014-07-29 23:23:27 +00008288 !PendingUpdateRecords.empty()) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008289 // If any identifiers with corresponding top-level declarations have
8290 // been loaded, load those declarations now.
Craig Topper79be4cd2013-07-05 04:33:53 +00008291 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8292 TopLevelDeclsMap;
8293 TopLevelDeclsMap TopLevelDecls;
8294
Guy Benyei11169dd2012-12-18 14:30:41 +00008295 while (!PendingIdentifierInfos.empty()) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008296 IdentifierInfo *II = PendingIdentifierInfos.back().first;
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008297 SmallVector<uint32_t, 4> DeclIDs =
8298 std::move(PendingIdentifierInfos.back().second);
Douglas Gregorcb15f082013-02-19 18:26:28 +00008299 PendingIdentifierInfos.pop_back();
Douglas Gregor6168bd22013-02-18 15:53:43 +00008300
8301 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei11169dd2012-12-18 14:30:41 +00008302 }
Richard Smithf0ae3c2d2014-03-28 17:31:23 +00008303
Richard Smith851072e2014-05-19 20:59:20 +00008304 // For each decl chain that we wanted to complete while deserializing, mark
8305 // it as "still needs to be completed".
8306 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8307 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8308 }
8309 PendingIncompleteDeclChains.clear();
8310
Guy Benyei11169dd2012-12-18 14:30:41 +00008311 // Load pending declaration chains.
Richard Smithfe620d22015-03-05 23:24:12 +00008312 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008313 loadPendingDeclChain(PendingDeclChains[I]);
Richard Smithfe620d22015-03-05 23:24:12 +00008314 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8315 }
8316 assert(PendingDeclChainsKnown.empty());
Guy Benyei11169dd2012-12-18 14:30:41 +00008317 PendingDeclChains.clear();
8318
Douglas Gregor6168bd22013-02-18 15:53:43 +00008319 // Make the most recent of the top-level declarations visible.
Craig Topper79be4cd2013-07-05 04:33:53 +00008320 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8321 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
Douglas Gregor6168bd22013-02-18 15:53:43 +00008322 IdentifierInfo *II = TLD->first;
8323 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008324 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
Douglas Gregor6168bd22013-02-18 15:53:43 +00008325 }
8326 }
8327
Guy Benyei11169dd2012-12-18 14:30:41 +00008328 // Load any pending macro definitions.
8329 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008330 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8331 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8332 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8333 // Initialize the macro history from chained-PCHs ahead of module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008334 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidis719736c2013-01-19 03:14:56 +00008335 ++IDIdx) {
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008336 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008337 if (Info.M->Kind != MK_ImplicitModule &&
8338 Info.M->Kind != MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008339 resolvePendingMacro(II, Info);
8340 }
8341 // Handle module imports.
Richard Smith49f906a2014-03-01 00:08:04 +00008342 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008343 ++IDIdx) {
8344 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
Richard Smithe842a472014-10-22 02:05:46 +00008345 if (Info.M->Kind == MK_ImplicitModule ||
8346 Info.M->Kind == MK_ExplicitModule)
Argyrios Kyrtzidiseb663da2013-03-22 21:12:57 +00008347 resolvePendingMacro(II, Info);
Guy Benyei11169dd2012-12-18 14:30:41 +00008348 }
8349 }
8350 PendingMacroIDs.clear();
Argyrios Kyrtzidis83a6e3b2013-02-16 00:48:59 +00008351
8352 // Wire up the DeclContexts for Decls that we delayed setting until
8353 // recursive loading is completed.
8354 while (!PendingDeclContextInfos.empty()) {
8355 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8356 PendingDeclContextInfos.pop_front();
8357 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8358 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8359 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8360 }
Richard Smith2b9e3e32013-10-18 06:05:18 +00008361
Richard Smithd1c46742014-04-30 02:24:17 +00008362 // Perform any pending declaration updates.
Richard Smithd6db68c2014-08-07 20:58:41 +00008363 while (!PendingUpdateRecords.empty()) {
Richard Smithd1c46742014-04-30 02:24:17 +00008364 auto Update = PendingUpdateRecords.pop_back_val();
8365 ReadingKindTracker ReadingKind(Read_Decl, *this);
8366 loadDeclUpdateRecords(Update.first, Update.second);
8367 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008368 }
Richard Smith8a639892015-01-24 01:07:20 +00008369
8370 // At this point, all update records for loaded decls are in place, so any
8371 // fake class definitions should have become real.
8372 assert(PendingFakeDefinitionData.empty() &&
8373 "faked up a class definition but never saw the real one");
8374
Guy Benyei11169dd2012-12-18 14:30:41 +00008375 // If we deserialized any C++ or Objective-C class definitions, any
8376 // Objective-C protocol definitions, or any redeclarable templates, make sure
8377 // that all redeclarations point to the definitions. Note that this can only
8378 // happen now, after the redeclaration chains have been fully wired.
Craig Topperc6914d02014-08-25 04:15:02 +00008379 for (Decl *D : PendingDefinitions) {
8380 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
Richard Smith5b21db82014-04-23 18:20:42 +00008381 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008382 // Make sure that the TagType points at the definition.
8383 const_cast<TagType*>(TagT)->decl = TD;
8384 }
8385
Craig Topperc6914d02014-08-25 04:15:02 +00008386 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
Richard Smith2c381642014-08-27 23:11:59 +00008387 for (auto R : RD->redecls()) {
8388 assert((R == D) == R->isThisDeclarationADefinition() &&
8389 "declaration thinks it's the definition but it isn't");
Aaron Ballman86c93902014-03-06 23:45:36 +00008390 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
Richard Smith2c381642014-08-27 23:11:59 +00008391 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008392 }
8393
8394 continue;
8395 }
8396
Craig Topperc6914d02014-08-25 04:15:02 +00008397 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008398 // Make sure that the ObjCInterfaceType points at the definition.
8399 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8400 ->Decl = ID;
8401
Aaron Ballman86c93902014-03-06 23:45:36 +00008402 for (auto R : ID->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008403 R->Data = ID->Data;
8404
8405 continue;
8406 }
8407
Craig Topperc6914d02014-08-25 04:15:02 +00008408 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
Aaron Ballman86c93902014-03-06 23:45:36 +00008409 for (auto R : PD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008410 R->Data = PD->Data;
8411
8412 continue;
8413 }
8414
Craig Topperc6914d02014-08-25 04:15:02 +00008415 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
Aaron Ballman86c93902014-03-06 23:45:36 +00008416 for (auto R : RTD->redecls())
Guy Benyei11169dd2012-12-18 14:30:41 +00008417 R->Common = RTD->Common;
8418 }
8419 PendingDefinitions.clear();
8420
8421 // Load the bodies of any functions or methods we've encountered. We do
8422 // this now (delayed) so that we can be sure that the declaration chains
8423 // have been fully wired up.
8424 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8425 PBEnd = PendingBodies.end();
8426 PB != PBEnd; ++PB) {
8427 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8428 // FIXME: Check for =delete/=default?
8429 // FIXME: Complain about ODR violations here?
8430 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8431 FD->setLazyBody(PB->second);
8432 continue;
8433 }
8434
8435 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8436 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8437 MD->setLazyBody(PB->second);
8438 }
8439 PendingBodies.clear();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008440}
8441
8442void ASTReader::diagnoseOdrViolations() {
Richard Smithbb853c72014-08-13 01:23:33 +00008443 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8444 return;
8445
Richard Smitha0ce9c42014-07-29 23:23:27 +00008446 // Trigger the import of the full definition of each class that had any
8447 // odr-merging problems, so we can produce better diagnostics for them.
Richard Smithbb853c72014-08-13 01:23:33 +00008448 // These updates may in turn find and diagnose some ODR failures, so take
8449 // ownership of the set first.
8450 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8451 PendingOdrMergeFailures.clear();
8452 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008453 Merge.first->buildLookup();
8454 Merge.first->decls_begin();
8455 Merge.first->bases_begin();
8456 Merge.first->vbases_begin();
8457 for (auto *RD : Merge.second) {
8458 RD->decls_begin();
8459 RD->bases_begin();
8460 RD->vbases_begin();
8461 }
8462 }
8463
8464 // For each declaration from a merged context, check that the canonical
8465 // definition of that context also contains a declaration of the same
8466 // entity.
8467 //
8468 // Caution: this loop does things that might invalidate iterators into
8469 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8470 while (!PendingOdrMergeChecks.empty()) {
8471 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8472
8473 // FIXME: Skip over implicit declarations for now. This matters for things
8474 // like implicitly-declared special member functions. This isn't entirely
8475 // correct; we can end up with multiple unmerged declarations of the same
8476 // implicit entity.
8477 if (D->isImplicit())
8478 continue;
8479
8480 DeclContext *CanonDef = D->getDeclContext();
Richard Smitha0ce9c42014-07-29 23:23:27 +00008481
8482 bool Found = false;
8483 const Decl *DCanon = D->getCanonicalDecl();
8484
Richard Smith01bdb7a2014-08-28 05:44:07 +00008485 for (auto RI : D->redecls()) {
8486 if (RI->getLexicalDeclContext() == CanonDef) {
8487 Found = true;
8488 break;
8489 }
8490 }
8491 if (Found)
8492 continue;
8493
Richard Smitha0ce9c42014-07-29 23:23:27 +00008494 llvm::SmallVector<const NamedDecl*, 4> Candidates;
Richard Smith01bdb7a2014-08-28 05:44:07 +00008495 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
Richard Smitha0ce9c42014-07-29 23:23:27 +00008496 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8497 !Found && I != E; ++I) {
8498 for (auto RI : (*I)->redecls()) {
8499 if (RI->getLexicalDeclContext() == CanonDef) {
8500 // This declaration is present in the canonical definition. If it's
8501 // in the same redecl chain, it's the one we're looking for.
8502 if (RI->getCanonicalDecl() == DCanon)
8503 Found = true;
8504 else
8505 Candidates.push_back(cast<NamedDecl>(RI));
8506 break;
8507 }
8508 }
8509 }
8510
8511 if (!Found) {
Richard Smithd08aeb62014-08-28 01:33:39 +00008512 // The AST doesn't like TagDecls becoming invalid after they've been
8513 // completed. We only really need to mark FieldDecls as invalid here.
8514 if (!isa<TagDecl>(D))
8515 D->setInvalidDecl();
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008516
8517 // Ensure we don't accidentally recursively enter deserialization while
8518 // we're producing our diagnostic.
8519 Deserializing RecursionGuard(this);
Richard Smitha0ce9c42014-07-29 23:23:27 +00008520
8521 std::string CanonDefModule =
8522 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8523 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8524 << D << getOwningModuleNameForDiagnostic(D)
8525 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8526
8527 if (Candidates.empty())
8528 Diag(cast<Decl>(CanonDef)->getLocation(),
8529 diag::note_module_odr_violation_no_possible_decls) << D;
8530 else {
8531 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8532 Diag(Candidates[I]->getLocation(),
8533 diag::note_module_odr_violation_possible_decl)
8534 << Candidates[I];
8535 }
8536
8537 DiagnosedOdrMergeFailures.insert(CanonDef);
8538 }
8539 }
Richard Smithcd45dbc2014-04-19 03:48:30 +00008540
Richard Smith4ab3dbd2015-02-13 22:43:51 +00008541 if (OdrMergeFailures.empty())
8542 return;
8543
8544 // Ensure we don't accidentally recursively enter deserialization while
8545 // we're producing our diagnostics.
8546 Deserializing RecursionGuard(this);
8547
Richard Smithcd45dbc2014-04-19 03:48:30 +00008548 // Issue any pending ODR-failure diagnostics.
Richard Smithbb853c72014-08-13 01:23:33 +00008549 for (auto &Merge : OdrMergeFailures) {
Richard Smitha0ce9c42014-07-29 23:23:27 +00008550 // If we've already pointed out a specific problem with this class, don't
8551 // bother issuing a general "something's different" diagnostic.
David Blaikie82e95a32014-11-19 07:49:47 +00008552 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
Richard Smithcd45dbc2014-04-19 03:48:30 +00008553 continue;
8554
8555 bool Diagnosed = false;
8556 for (auto *RD : Merge.second) {
8557 // Multiple different declarations got merged together; tell the user
8558 // where they came from.
8559 if (Merge.first != RD) {
8560 // FIXME: Walk the definition, figure out what's different,
8561 // and diagnose that.
8562 if (!Diagnosed) {
8563 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8564 Diag(Merge.first->getLocation(),
8565 diag::err_module_odr_violation_different_definitions)
8566 << Merge.first << Module.empty() << Module;
8567 Diagnosed = true;
8568 }
8569
8570 Diag(RD->getLocation(),
8571 diag::note_module_odr_violation_different_definitions)
8572 << getOwningModuleNameForDiagnostic(RD);
8573 }
8574 }
8575
8576 if (!Diagnosed) {
8577 // All definitions are updates to the same declaration. This happens if a
8578 // module instantiates the declaration of a class template specialization
8579 // and two or more other modules instantiate its definition.
8580 //
8581 // FIXME: Indicate which modules had instantiations of this definition.
8582 // FIXME: How can this even happen?
8583 Diag(Merge.first->getLocation(),
8584 diag::err_module_odr_violation_different_instantiations)
8585 << Merge.first;
8586 }
8587 }
Guy Benyei11169dd2012-12-18 14:30:41 +00008588}
8589
8590void ASTReader::FinishedDeserializing() {
8591 assert(NumCurrentElementsDeserializing &&
8592 "FinishedDeserializing not paired with StartedDeserializing");
8593 if (NumCurrentElementsDeserializing == 1) {
8594 // We decrease NumCurrentElementsDeserializing only after pending actions
8595 // are finished, to avoid recursively re-calling finishPendingActions().
8596 finishPendingActions();
8597 }
8598 --NumCurrentElementsDeserializing;
8599
Richard Smitha0ce9c42014-07-29 23:23:27 +00008600 if (NumCurrentElementsDeserializing == 0) {
8601 diagnoseOdrViolations();
8602
Richard Smith04d05b52014-03-23 00:27:18 +00008603 // We are not in recursive loading, so it's safe to pass the "interesting"
8604 // decls to the consumer.
Richard Smitha0ce9c42014-07-29 23:23:27 +00008605 if (Consumer)
8606 PassInterestingDeclsToConsumer();
Guy Benyei11169dd2012-12-18 14:30:41 +00008607 }
8608}
8609
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008610void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
Rafael Espindola7b56f6c2013-10-19 16:55:03 +00008611 D = D->getMostRecentDecl();
Argyrios Kyrtzidise5edbf92013-04-26 21:33:35 +00008612
8613 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8614 SemaObj->TUScope->AddDecl(D);
8615 } else if (SemaObj->TUScope) {
8616 // Adding the decl to IdResolver may have failed because it was already in
8617 // (even though it was not added in scope). If it is already in, make sure
8618 // it gets in the scope as well.
8619 if (std::find(SemaObj->IdResolver.begin(Name),
8620 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8621 SemaObj->TUScope->AddDecl(D);
8622 }
8623}
8624
Nico Weber824285e2014-05-08 04:26:47 +00008625ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8626 bool DisableValidation, bool AllowASTWithCompilerErrors,
8627 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
Ben Langmuir2cb4a782014-02-05 22:21:15 +00008628 bool UseGlobalIndex)
Craig Toppera13603a2014-05-22 05:54:18 +00008629 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
Nico Weber824285e2014-05-08 04:26:47 +00008630 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
Craig Toppera13603a2014-05-22 05:54:18 +00008631 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8632 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8633 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8634 DisableValidation(DisableValidation),
Nico Weber824285e2014-05-08 04:26:47 +00008635 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8636 AllowConfigurationMismatch(AllowConfigurationMismatch),
8637 ValidateSystemInputs(ValidateSystemInputs),
8638 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Richard Smith053f6c62014-05-16 23:01:30 +00008639 CurrSwitchCaseStmts(&SwitchCaseStmts),
Nico Weber824285e2014-05-08 04:26:47 +00008640 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8641 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8642 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8643 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8644 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8645 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8646 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8647 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8648 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8649 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8650 ReadingKind(Read_None) {
Guy Benyei11169dd2012-12-18 14:30:41 +00008651 SourceMgr.setExternalSLocEntrySource(this);
8652}
8653
8654ASTReader::~ASTReader() {
Nico Weber824285e2014-05-08 04:26:47 +00008655 if (OwnsDeserializationListener)
8656 delete DeserializationListener;
8657
Guy Benyei11169dd2012-12-18 14:30:41 +00008658 for (DeclContextVisibleUpdatesPending::iterator
8659 I = PendingVisibleUpdates.begin(),
8660 E = PendingVisibleUpdates.end();
8661 I != E; ++I) {
8662 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8663 F = I->second.end();
8664 J != F; ++J)
8665 delete J->first;
8666 }
8667}