blob: 6dff373fda7e62d6bf57dd3713d889b8ef956ddb [file] [log] [blame]
Nick Lewycky995e26b2013-01-31 03:23:57 +00001//===--- ASTReader.cpp - AST File Reader ----------------------------------===//
Guy Benyei7f92f2d2012-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"
25#include "clang/Basic/FileManager.h"
Guy Benyei7f92f2d2012-12-18 14:30:41 +000026#include "clang/Basic/SourceManager.h"
27#include "clang/Basic/SourceManagerInternals.h"
28#include "clang/Basic/TargetInfo.h"
29#include "clang/Basic/TargetOptions.h"
30#include "clang/Basic/Version.h"
31#include "clang/Basic/VersionTuple.h"
32#include "clang/Lex/HeaderSearch.h"
33#include "clang/Lex/HeaderSearchOptions.h"
34#include "clang/Lex/MacroInfo.h"
35#include "clang/Lex/PreprocessingRecord.h"
36#include "clang/Lex/Preprocessor.h"
37#include "clang/Lex/PreprocessorOptions.h"
38#include "clang/Sema/Scope.h"
39#include "clang/Sema/Sema.h"
40#include "clang/Serialization/ASTDeserializationListener.h"
Douglas Gregor1a49d972013-01-25 01:03:03 +000041#include "clang/Serialization/GlobalModuleIndex.h"
Guy Benyei7f92f2d2012-12-18 14:30:41 +000042#include "clang/Serialization/ModuleManager.h"
43#include "clang/Serialization/SerializationDiagnostic.h"
44#include "llvm/ADT/StringExtras.h"
45#include "llvm/Bitcode/BitstreamReader.h"
46#include "llvm/Support/ErrorHandling.h"
47#include "llvm/Support/FileSystem.h"
48#include "llvm/Support/MemoryBuffer.h"
49#include "llvm/Support/Path.h"
50#include "llvm/Support/SaveAndRestore.h"
51#include "llvm/Support/system_error.h"
52#include <algorithm>
Chris Lattnere4e4a882013-01-20 00:57:52 +000053#include <cstdio>
Guy Benyei7f92f2d2012-12-18 14:30:41 +000054#include <iterator>
55
56using namespace clang;
57using namespace clang::serialization;
58using namespace clang::serialization::reader;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +000059using llvm::BitstreamCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +000060
61//===----------------------------------------------------------------------===//
62// PCH validator implementation
63//===----------------------------------------------------------------------===//
64
65ASTReaderListener::~ASTReaderListener() {}
66
67/// \brief Compare the given set of language options against an existing set of
68/// language options.
69///
70/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
71///
72/// \returns true if the languagae options mis-match, false otherwise.
73static bool checkLanguageOptions(const LangOptions &LangOpts,
74 const LangOptions &ExistingLangOpts,
75 DiagnosticsEngine *Diags) {
76#define LANGOPT(Name, Bits, Default, Description) \
77 if (ExistingLangOpts.Name != LangOpts.Name) { \
78 if (Diags) \
79 Diags->Report(diag::err_pch_langopt_mismatch) \
80 << Description << LangOpts.Name << ExistingLangOpts.Name; \
81 return true; \
82 }
83
84#define VALUE_LANGOPT(Name, Bits, Default, Description) \
85 if (ExistingLangOpts.Name != LangOpts.Name) { \
86 if (Diags) \
87 Diags->Report(diag::err_pch_langopt_value_mismatch) \
88 << Description; \
89 return true; \
90 }
91
92#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
93 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
94 if (Diags) \
95 Diags->Report(diag::err_pch_langopt_value_mismatch) \
96 << Description; \
97 return true; \
98 }
99
100#define BENIGN_LANGOPT(Name, Bits, Default, Description)
101#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
102#include "clang/Basic/LangOptions.def"
103
104 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
105 if (Diags)
106 Diags->Report(diag::err_pch_langopt_value_mismatch)
107 << "target Objective-C runtime";
108 return true;
109 }
110
111 return false;
112}
113
114/// \brief Compare the given set of target options against an existing set of
115/// target options.
116///
117/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
118///
119/// \returns true if the target options mis-match, false otherwise.
120static bool checkTargetOptions(const TargetOptions &TargetOpts,
121 const TargetOptions &ExistingTargetOpts,
122 DiagnosticsEngine *Diags) {
123#define CHECK_TARGET_OPT(Field, Name) \
124 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
125 if (Diags) \
126 Diags->Report(diag::err_pch_targetopt_mismatch) \
127 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
128 return true; \
129 }
130
131 CHECK_TARGET_OPT(Triple, "target");
132 CHECK_TARGET_OPT(CPU, "target CPU");
133 CHECK_TARGET_OPT(ABI, "target ABI");
134 CHECK_TARGET_OPT(CXXABI, "target C++ ABI");
135 CHECK_TARGET_OPT(LinkerVersion, "target linker version");
136#undef CHECK_TARGET_OPT
137
138 // Compare feature sets.
139 SmallVector<StringRef, 4> ExistingFeatures(
140 ExistingTargetOpts.FeaturesAsWritten.begin(),
141 ExistingTargetOpts.FeaturesAsWritten.end());
142 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
143 TargetOpts.FeaturesAsWritten.end());
144 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
145 std::sort(ReadFeatures.begin(), ReadFeatures.end());
146
147 unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size();
148 unsigned ReadIdx = 0, ReadN = ReadFeatures.size();
149 while (ExistingIdx < ExistingN && ReadIdx < ReadN) {
150 if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) {
151 ++ExistingIdx;
152 ++ReadIdx;
153 continue;
154 }
155
156 if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) {
157 if (Diags)
158 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
159 << false << ReadFeatures[ReadIdx];
160 return true;
161 }
162
163 if (Diags)
164 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
165 << true << ExistingFeatures[ExistingIdx];
166 return true;
167 }
168
169 if (ExistingIdx < ExistingN) {
170 if (Diags)
171 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
172 << true << ExistingFeatures[ExistingIdx];
173 return true;
174 }
175
176 if (ReadIdx < ReadN) {
177 if (Diags)
178 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
179 << false << ReadFeatures[ReadIdx];
180 return true;
181 }
182
183 return false;
184}
185
186bool
187PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
188 bool Complain) {
189 const LangOptions &ExistingLangOpts = PP.getLangOpts();
190 return checkLanguageOptions(LangOpts, ExistingLangOpts,
191 Complain? &Reader.Diags : 0);
192}
193
194bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
195 bool Complain) {
196 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
197 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
198 Complain? &Reader.Diags : 0);
199}
200
201namespace {
202 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
203 MacroDefinitionsMap;
204}
205
206/// \brief Collect the macro definitions provided by the given preprocessor
207/// options.
208static void collectMacroDefinitions(const PreprocessorOptions &PPOpts,
209 MacroDefinitionsMap &Macros,
210 SmallVectorImpl<StringRef> *MacroNames = 0){
211 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
212 StringRef Macro = PPOpts.Macros[I].first;
213 bool IsUndef = PPOpts.Macros[I].second;
214
215 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
216 StringRef MacroName = MacroPair.first;
217 StringRef MacroBody = MacroPair.second;
218
219 // For an #undef'd macro, we only care about the name.
220 if (IsUndef) {
221 if (MacroNames && !Macros.count(MacroName))
222 MacroNames->push_back(MacroName);
223
224 Macros[MacroName] = std::make_pair("", true);
225 continue;
226 }
227
228 // For a #define'd macro, figure out the actual definition.
229 if (MacroName.size() == Macro.size())
230 MacroBody = "1";
231 else {
232 // Note: GCC drops anything following an end-of-line character.
233 StringRef::size_type End = MacroBody.find_first_of("\n\r");
234 MacroBody = MacroBody.substr(0, End);
235 }
236
237 if (MacroNames && !Macros.count(MacroName))
238 MacroNames->push_back(MacroName);
239 Macros[MacroName] = std::make_pair(MacroBody, false);
240 }
241}
242
243/// \brief Check the preprocessor options deserialized from the control block
244/// against the preprocessor options in an existing preprocessor.
245///
246/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
247static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
248 const PreprocessorOptions &ExistingPPOpts,
249 DiagnosticsEngine *Diags,
250 FileManager &FileMgr,
251 std::string &SuggestedPredefines) {
252 // Check macro definitions.
253 MacroDefinitionsMap ASTFileMacros;
254 collectMacroDefinitions(PPOpts, ASTFileMacros);
255 MacroDefinitionsMap ExistingMacros;
256 SmallVector<StringRef, 4> ExistingMacroNames;
257 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
258
259 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
260 // Dig out the macro definition in the existing preprocessor options.
261 StringRef MacroName = ExistingMacroNames[I];
262 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
263
264 // Check whether we know anything about this macro name or not.
265 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
266 = ASTFileMacros.find(MacroName);
267 if (Known == ASTFileMacros.end()) {
268 // FIXME: Check whether this identifier was referenced anywhere in the
269 // AST file. If so, we should reject the AST file. Unfortunately, this
270 // information isn't in the control block. What shall we do about it?
271
272 if (Existing.second) {
273 SuggestedPredefines += "#undef ";
274 SuggestedPredefines += MacroName.str();
275 SuggestedPredefines += '\n';
276 } else {
277 SuggestedPredefines += "#define ";
278 SuggestedPredefines += MacroName.str();
279 SuggestedPredefines += ' ';
280 SuggestedPredefines += Existing.first.str();
281 SuggestedPredefines += '\n';
282 }
283 continue;
284 }
285
286 // If the macro was defined in one but undef'd in the other, we have a
287 // conflict.
288 if (Existing.second != Known->second.second) {
289 if (Diags) {
290 Diags->Report(diag::err_pch_macro_def_undef)
291 << MacroName << Known->second.second;
292 }
293 return true;
294 }
295
296 // If the macro was #undef'd in both, or if the macro bodies are identical,
297 // it's fine.
298 if (Existing.second || Existing.first == Known->second.first)
299 continue;
300
301 // The macro bodies differ; complain.
302 if (Diags) {
303 Diags->Report(diag::err_pch_macro_def_conflict)
304 << MacroName << Known->second.first << Existing.first;
305 }
306 return true;
307 }
308
309 // Check whether we're using predefines.
310 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
311 if (Diags) {
312 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
313 }
314 return true;
315 }
316
317 // Compute the #include and #include_macros lines we need.
318 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
319 StringRef File = ExistingPPOpts.Includes[I];
320 if (File == ExistingPPOpts.ImplicitPCHInclude)
321 continue;
322
323 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
324 != PPOpts.Includes.end())
325 continue;
326
327 SuggestedPredefines += "#include \"";
328 SuggestedPredefines +=
329 HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
330 SuggestedPredefines += "\"\n";
331 }
332
333 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
334 StringRef File = ExistingPPOpts.MacroIncludes[I];
335 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
336 File)
337 != PPOpts.MacroIncludes.end())
338 continue;
339
340 SuggestedPredefines += "#__include_macros \"";
341 SuggestedPredefines +=
342 HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
343 SuggestedPredefines += "\"\n##\n";
344 }
345
346 return false;
347}
348
349bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
350 bool Complain,
351 std::string &SuggestedPredefines) {
352 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
353
354 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
355 Complain? &Reader.Diags : 0,
356 PP.getFileManager(),
357 SuggestedPredefines);
358}
359
360void PCHValidator::ReadHeaderFileInfo(const HeaderFileInfo &HFI,
361 unsigned ID) {
362 PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, ID);
363 ++NumHeaderInfos;
364}
365
366void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
367 PP.setCounterValue(Value);
368}
369
370//===----------------------------------------------------------------------===//
371// AST reader implementation
372//===----------------------------------------------------------------------===//
373
374void
375ASTReader::setDeserializationListener(ASTDeserializationListener *Listener) {
376 DeserializationListener = Listener;
377}
378
379
380
381unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
382 return serialization::ComputeHash(Sel);
383}
384
385
386std::pair<unsigned, unsigned>
387ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
388 using namespace clang::io;
389 unsigned KeyLen = ReadUnalignedLE16(d);
390 unsigned DataLen = ReadUnalignedLE16(d);
391 return std::make_pair(KeyLen, DataLen);
392}
393
394ASTSelectorLookupTrait::internal_key_type
395ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
396 using namespace clang::io;
397 SelectorTable &SelTable = Reader.getContext().Selectors;
398 unsigned N = ReadUnalignedLE16(d);
399 IdentifierInfo *FirstII
Douglas Gregor8222b892013-01-21 16:52:34 +0000400 = Reader.getLocalIdentifier(F, ReadUnalignedLE32(d));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000401 if (N == 0)
402 return SelTable.getNullarySelector(FirstII);
403 else if (N == 1)
404 return SelTable.getUnarySelector(FirstII);
405
406 SmallVector<IdentifierInfo *, 16> Args;
407 Args.push_back(FirstII);
408 for (unsigned I = 1; I != N; ++I)
Douglas Gregor8222b892013-01-21 16:52:34 +0000409 Args.push_back(Reader.getLocalIdentifier(F, ReadUnalignedLE32(d)));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000410
411 return SelTable.getSelector(N, Args.data());
412}
413
414ASTSelectorLookupTrait::data_type
415ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
416 unsigned DataLen) {
417 using namespace clang::io;
418
419 data_type Result;
420
421 Result.ID = Reader.getGlobalSelectorID(F, ReadUnalignedLE32(d));
422 unsigned NumInstanceMethods = ReadUnalignedLE16(d);
423 unsigned NumFactoryMethods = ReadUnalignedLE16(d);
424
425 // Load instance methods
426 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
427 if (ObjCMethodDecl *Method
428 = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d)))
429 Result.Instance.push_back(Method);
430 }
431
432 // Load factory methods
433 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
434 if (ObjCMethodDecl *Method
435 = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d)))
436 Result.Factory.push_back(Method);
437 }
438
439 return Result;
440}
441
Douglas Gregor479633c2013-01-23 18:53:14 +0000442unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
443 return llvm::HashString(a);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000444}
445
446std::pair<unsigned, unsigned>
Douglas Gregor479633c2013-01-23 18:53:14 +0000447ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000448 using namespace clang::io;
449 unsigned DataLen = ReadUnalignedLE16(d);
450 unsigned KeyLen = ReadUnalignedLE16(d);
451 return std::make_pair(KeyLen, DataLen);
452}
453
Douglas Gregor479633c2013-01-23 18:53:14 +0000454ASTIdentifierLookupTraitBase::internal_key_type
455ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000456 assert(n >= 2 && d[n-1] == '\0');
Douglas Gregor479633c2013-01-23 18:53:14 +0000457 return StringRef((const char*) d, n-1);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000458}
459
Douglas Gregorf4e955b2013-02-11 18:16:18 +0000460/// \brief Whether the given identifier is "interesting".
461static bool isInterestingIdentifier(IdentifierInfo &II) {
462 return II.isPoisoned() ||
463 II.isExtensionToken() ||
464 II.getObjCOrBuiltinID() ||
465 II.hasRevertedTokenIDToIdentifier() ||
466 II.hadMacroDefinition() ||
467 II.getFETokenInfo<void>();
468}
469
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000470IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
471 const unsigned char* d,
472 unsigned DataLen) {
473 using namespace clang::io;
474 unsigned RawID = ReadUnalignedLE32(d);
475 bool IsInteresting = RawID & 0x01;
476
477 // Wipe out the "is interesting" bit.
478 RawID = RawID >> 1;
479
480 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
481 if (!IsInteresting) {
482 // For uninteresting identifiers, just build the IdentifierInfo
483 // and associate it with the persistent ID.
484 IdentifierInfo *II = KnownII;
485 if (!II) {
Douglas Gregor479633c2013-01-23 18:53:14 +0000486 II = &Reader.getIdentifierTable().getOwn(k);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000487 KnownII = II;
488 }
489 Reader.SetIdentifierInfo(ID, II);
Douglas Gregorf4e955b2013-02-11 18:16:18 +0000490 if (!II->isFromAST()) {
491 bool WasInteresting = isInterestingIdentifier(*II);
492 II->setIsFromAST();
493 if (WasInteresting)
494 II->setChangedSinceDeserialization();
495 }
496 Reader.markIdentifierUpToDate(II);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000497 return II;
498 }
499
500 unsigned ObjCOrBuiltinID = ReadUnalignedLE16(d);
501 unsigned Bits = ReadUnalignedLE16(d);
502 bool CPlusPlusOperatorKeyword = Bits & 0x01;
503 Bits >>= 1;
504 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
505 Bits >>= 1;
506 bool Poisoned = Bits & 0x01;
507 Bits >>= 1;
508 bool ExtensionToken = Bits & 0x01;
509 Bits >>= 1;
510 bool hadMacroDefinition = Bits & 0x01;
511 Bits >>= 1;
512
513 assert(Bits == 0 && "Extra bits in the identifier?");
514 DataLen -= 8;
515
516 // Build the IdentifierInfo itself and link the identifier ID with
517 // the new IdentifierInfo.
518 IdentifierInfo *II = KnownII;
519 if (!II) {
Douglas Gregor479633c2013-01-23 18:53:14 +0000520 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000521 KnownII = II;
522 }
523 Reader.markIdentifierUpToDate(II);
Douglas Gregorf4e955b2013-02-11 18:16:18 +0000524 if (!II->isFromAST()) {
525 bool WasInteresting = isInterestingIdentifier(*II);
526 II->setIsFromAST();
527 if (WasInteresting)
528 II->setChangedSinceDeserialization();
529 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000530
531 // Set or check the various bits in the IdentifierInfo structure.
532 // Token IDs are read-only.
533 if (HasRevertedTokenIDToIdentifier)
534 II->RevertTokenIDToIdentifier();
535 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
536 assert(II->isExtensionToken() == ExtensionToken &&
537 "Incorrect extension token flag");
538 (void)ExtensionToken;
539 if (Poisoned)
540 II->setIsPoisoned(true);
541 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
542 "Incorrect C++ operator keyword flag");
543 (void)CPlusPlusOperatorKeyword;
544
545 // If this identifier is a macro, deserialize the macro
546 // definition.
547 if (hadMacroDefinition) {
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +0000548 SmallVector<MacroID, 4> MacroIDs;
549 while (uint32_t LocalID = ReadUnalignedLE32(d)) {
550 MacroIDs.push_back(Reader.getGlobalMacroID(F, LocalID));
551 DataLen -= 4;
552 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000553 DataLen -= 4;
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +0000554 Reader.setIdentifierIsMacro(II, MacroIDs);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000555 }
556
557 Reader.SetIdentifierInfo(ID, II);
558
559 // Read all of the declarations visible at global scope with this
560 // name.
561 if (DataLen > 0) {
562 SmallVector<uint32_t, 4> DeclIDs;
563 for (; DataLen > 0; DataLen -= 4)
564 DeclIDs.push_back(Reader.getGlobalDeclID(F, ReadUnalignedLE32(d)));
565 Reader.SetGloballyVisibleDecls(II, DeclIDs);
566 }
567
568 return II;
569}
570
571unsigned
572ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
573 llvm::FoldingSetNodeID ID;
574 ID.AddInteger(Key.Kind);
575
576 switch (Key.Kind) {
577 case DeclarationName::Identifier:
578 case DeclarationName::CXXLiteralOperatorName:
579 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
580 break;
581 case DeclarationName::ObjCZeroArgSelector:
582 case DeclarationName::ObjCOneArgSelector:
583 case DeclarationName::ObjCMultiArgSelector:
584 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
585 break;
586 case DeclarationName::CXXOperatorName:
587 ID.AddInteger((OverloadedOperatorKind)Key.Data);
588 break;
589 case DeclarationName::CXXConstructorName:
590 case DeclarationName::CXXDestructorName:
591 case DeclarationName::CXXConversionFunctionName:
592 case DeclarationName::CXXUsingDirective:
593 break;
594 }
595
596 return ID.ComputeHash();
597}
598
599ASTDeclContextNameLookupTrait::internal_key_type
600ASTDeclContextNameLookupTrait::GetInternalKey(
601 const external_key_type& Name) const {
602 DeclNameKey Key;
603 Key.Kind = Name.getNameKind();
604 switch (Name.getNameKind()) {
605 case DeclarationName::Identifier:
606 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
607 break;
608 case DeclarationName::ObjCZeroArgSelector:
609 case DeclarationName::ObjCOneArgSelector:
610 case DeclarationName::ObjCMultiArgSelector:
611 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
612 break;
613 case DeclarationName::CXXOperatorName:
614 Key.Data = Name.getCXXOverloadedOperator();
615 break;
616 case DeclarationName::CXXLiteralOperatorName:
617 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
618 break;
619 case DeclarationName::CXXConstructorName:
620 case DeclarationName::CXXDestructorName:
621 case DeclarationName::CXXConversionFunctionName:
622 case DeclarationName::CXXUsingDirective:
623 Key.Data = 0;
624 break;
625 }
626
627 return Key;
628}
629
630std::pair<unsigned, unsigned>
631ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
632 using namespace clang::io;
633 unsigned KeyLen = ReadUnalignedLE16(d);
634 unsigned DataLen = ReadUnalignedLE16(d);
635 return std::make_pair(KeyLen, DataLen);
636}
637
638ASTDeclContextNameLookupTrait::internal_key_type
639ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
640 using namespace clang::io;
641
642 DeclNameKey Key;
643 Key.Kind = (DeclarationName::NameKind)*d++;
644 switch (Key.Kind) {
645 case DeclarationName::Identifier:
646 Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d));
647 break;
648 case DeclarationName::ObjCZeroArgSelector:
649 case DeclarationName::ObjCOneArgSelector:
650 case DeclarationName::ObjCMultiArgSelector:
651 Key.Data =
652 (uint64_t)Reader.getLocalSelector(F, ReadUnalignedLE32(d))
653 .getAsOpaquePtr();
654 break;
655 case DeclarationName::CXXOperatorName:
656 Key.Data = *d++; // OverloadedOperatorKind
657 break;
658 case DeclarationName::CXXLiteralOperatorName:
659 Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d));
660 break;
661 case DeclarationName::CXXConstructorName:
662 case DeclarationName::CXXDestructorName:
663 case DeclarationName::CXXConversionFunctionName:
664 case DeclarationName::CXXUsingDirective:
665 Key.Data = 0;
666 break;
667 }
668
669 return Key;
670}
671
672ASTDeclContextNameLookupTrait::data_type
673ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
674 const unsigned char* d,
675 unsigned DataLen) {
676 using namespace clang::io;
677 unsigned NumDecls = ReadUnalignedLE16(d);
Argyrios Kyrtzidise8b61cf2013-01-11 22:29:49 +0000678 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
679 const_cast<unsigned char *>(d));
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000680 return std::make_pair(Start, Start + NumDecls);
681}
682
683bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
Chris Lattner8f9a1eb2013-01-20 00:56:42 +0000684 BitstreamCursor &Cursor,
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000685 const std::pair<uint64_t, uint64_t> &Offsets,
686 DeclContextInfo &Info) {
687 SavedStreamPosition SavedPosition(Cursor);
688 // First the lexical decls.
689 if (Offsets.first != 0) {
690 Cursor.JumpToBit(Offsets.first);
691
692 RecordData Record;
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000693 StringRef Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000694 unsigned Code = Cursor.ReadCode();
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000695 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000696 if (RecCode != DECL_CONTEXT_LEXICAL) {
697 Error("Expected lexical block");
698 return true;
699 }
700
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000701 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
702 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000703 }
704
705 // Now the lookup table.
706 if (Offsets.second != 0) {
707 Cursor.JumpToBit(Offsets.second);
708
709 RecordData Record;
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000710 StringRef Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000711 unsigned Code = Cursor.ReadCode();
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000712 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000713 if (RecCode != DECL_CONTEXT_VISIBLE) {
714 Error("Expected visible lookup table block");
715 return true;
716 }
717 Info.NameLookupTableData
718 = ASTDeclContextNameLookupTable::Create(
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000719 (const unsigned char *)Blob.data() + Record[0],
720 (const unsigned char *)Blob.data(),
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000721 ASTDeclContextNameLookupTrait(*this, M));
722 }
723
724 return false;
725}
726
727void ASTReader::Error(StringRef Msg) {
728 Error(diag::err_fe_pch_malformed, Msg);
729}
730
731void ASTReader::Error(unsigned DiagID,
732 StringRef Arg1, StringRef Arg2) {
733 if (Diags.isDiagnosticInFlight())
734 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
735 else
736 Diag(DiagID) << Arg1 << Arg2;
737}
738
739//===----------------------------------------------------------------------===//
740// Source Manager Deserialization
741//===----------------------------------------------------------------------===//
742
743/// \brief Read the line table in the source manager block.
744/// \returns true if there was an error.
745bool ASTReader::ParseLineTable(ModuleFile &F,
746 SmallVectorImpl<uint64_t> &Record) {
747 unsigned Idx = 0;
748 LineTableInfo &LineTable = SourceMgr.getLineTable();
749
750 // Parse the file names
751 std::map<int, int> FileIDs;
752 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
753 // Extract the file name
754 unsigned FilenameLen = Record[Idx++];
755 std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
756 Idx += FilenameLen;
757 MaybeAddSystemRootToFilename(F, Filename);
758 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
759 }
760
761 // Parse the line entries
762 std::vector<LineEntry> Entries;
763 while (Idx < Record.size()) {
764 int FID = Record[Idx++];
765 assert(FID >= 0 && "Serialized line entries for non-local file.");
766 // Remap FileID from 1-based old view.
767 FID += F.SLocEntryBaseID - 1;
768
769 // Extract the line entries
770 unsigned NumEntries = Record[Idx++];
771 assert(NumEntries && "Numentries is 00000");
772 Entries.clear();
773 Entries.reserve(NumEntries);
774 for (unsigned I = 0; I != NumEntries; ++I) {
775 unsigned FileOffset = Record[Idx++];
776 unsigned LineNo = Record[Idx++];
777 int FilenameID = FileIDs[Record[Idx++]];
778 SrcMgr::CharacteristicKind FileKind
779 = (SrcMgr::CharacteristicKind)Record[Idx++];
780 unsigned IncludeOffset = Record[Idx++];
781 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
782 FileKind, IncludeOffset));
783 }
784 LineTable.AddEntry(FileID::get(FID), Entries);
785 }
786
787 return false;
788}
789
790/// \brief Read a source manager block
791bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
792 using namespace SrcMgr;
793
Chris Lattner8f9a1eb2013-01-20 00:56:42 +0000794 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000795
796 // Set the source-location entry cursor to the current position in
797 // the stream. This cursor will be used to read the contents of the
798 // source manager block initially, and then lazily read
799 // source-location entries as needed.
800 SLocEntryCursor = F.Stream;
801
802 // The stream itself is going to skip over the source manager block.
803 if (F.Stream.SkipBlock()) {
804 Error("malformed block record in AST file");
805 return true;
806 }
807
808 // Enter the source manager block.
809 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
810 Error("malformed source manager block record in AST file");
811 return true;
812 }
813
814 RecordData Record;
815 while (true) {
Chris Lattner88bde502013-01-19 21:39:22 +0000816 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
817
818 switch (E.Kind) {
819 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
820 case llvm::BitstreamEntry::Error:
821 Error("malformed block record in AST file");
822 return true;
823 case llvm::BitstreamEntry::EndBlock:
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000824 return false;
Chris Lattner88bde502013-01-19 21:39:22 +0000825 case llvm::BitstreamEntry::Record:
826 // The interesting case.
827 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000828 }
Chris Lattner88bde502013-01-19 21:39:22 +0000829
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000830 // Read a record.
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000831 Record.clear();
Chris Lattner125eb3e2013-01-21 18:28:26 +0000832 StringRef Blob;
833 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000834 default: // Default behavior: ignore.
835 break;
836
837 case SM_SLOC_FILE_ENTRY:
838 case SM_SLOC_BUFFER_ENTRY:
839 case SM_SLOC_EXPANSION_ENTRY:
840 // Once we hit one of the source location entries, we're done.
841 return false;
842 }
843 }
844}
845
846/// \brief If a header file is not found at the path that we expect it to be
847/// and the PCH file was moved from its original location, try to resolve the
848/// file by assuming that header+PCH were moved together and the header is in
849/// the same place relative to the PCH.
850static std::string
851resolveFileRelativeToOriginalDir(const std::string &Filename,
852 const std::string &OriginalDir,
853 const std::string &CurrDir) {
854 assert(OriginalDir != CurrDir &&
855 "No point trying to resolve the file if the PCH dir didn't change");
856 using namespace llvm::sys;
857 SmallString<128> filePath(Filename);
858 fs::make_absolute(filePath);
859 assert(path::is_absolute(OriginalDir));
860 SmallString<128> currPCHPath(CurrDir);
861
862 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
863 fileDirE = path::end(path::parent_path(filePath));
864 path::const_iterator origDirI = path::begin(OriginalDir),
865 origDirE = path::end(OriginalDir);
866 // Skip the common path components from filePath and OriginalDir.
867 while (fileDirI != fileDirE && origDirI != origDirE &&
868 *fileDirI == *origDirI) {
869 ++fileDirI;
870 ++origDirI;
871 }
872 for (; origDirI != origDirE; ++origDirI)
873 path::append(currPCHPath, "..");
874 path::append(currPCHPath, fileDirI, fileDirE);
875 path::append(currPCHPath, path::filename(Filename));
876 return currPCHPath.str();
877}
878
879bool ASTReader::ReadSLocEntry(int ID) {
880 if (ID == 0)
881 return false;
882
883 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
884 Error("source location entry ID out-of-range for AST file");
885 return true;
886 }
887
888 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
889 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
Chris Lattner8f9a1eb2013-01-20 00:56:42 +0000890 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000891 unsigned BaseOffset = F->SLocEntryBaseOffset;
892
893 ++NumSLocEntriesRead;
Chris Lattner88bde502013-01-19 21:39:22 +0000894 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
895 if (Entry.Kind != llvm::BitstreamEntry::Record) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000896 Error("incorrectly-formatted source location entry in AST file");
897 return true;
898 }
Chris Lattner88bde502013-01-19 21:39:22 +0000899
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000900 RecordData Record;
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000901 StringRef Blob;
902 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000903 default:
904 Error("incorrectly-formatted source location entry in AST file");
905 return true;
906
907 case SM_SLOC_FILE_ENTRY: {
908 // We will detect whether a file changed and return 'Failure' for it, but
909 // we will also try to fail gracefully by setting up the SLocEntry.
910 unsigned InputID = Record[4];
911 InputFile IF = getInputFile(*F, InputID);
912 const FileEntry *File = IF.getPointer();
913 bool OverriddenBuffer = IF.getInt();
914
915 if (!IF.getPointer())
916 return true;
917
918 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
919 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
920 // This is the module's main file.
921 IncludeLoc = getImportLocation(F);
922 }
923 SrcMgr::CharacteristicKind
924 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
925 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
926 ID, BaseOffset + Record[0]);
927 SrcMgr::FileInfo &FileInfo =
928 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
929 FileInfo.NumCreatedFIDs = Record[5];
930 if (Record[3])
931 FileInfo.setHasLineDirectives();
932
933 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
934 unsigned NumFileDecls = Record[7];
935 if (NumFileDecls) {
936 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
937 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
938 NumFileDecls));
939 }
940
941 const SrcMgr::ContentCache *ContentCache
942 = SourceMgr.getOrCreateContentCache(File,
943 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
944 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
945 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
946 unsigned Code = SLocEntryCursor.ReadCode();
947 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000948 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000949
950 if (RecCode != SM_SLOC_BUFFER_BLOB) {
951 Error("AST record has invalid code");
952 return true;
953 }
954
955 llvm::MemoryBuffer *Buffer
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000956 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000957 SourceMgr.overrideFileContents(File, Buffer);
958 }
959
960 break;
961 }
962
963 case SM_SLOC_BUFFER_ENTRY: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000964 const char *Name = Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000965 unsigned Offset = Record[0];
966 SrcMgr::CharacteristicKind
967 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
968 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
969 if (IncludeLoc.isInvalid() && F->Kind == MK_Module) {
970 IncludeLoc = getImportLocation(F);
971 }
972 unsigned Code = SLocEntryCursor.ReadCode();
973 Record.clear();
974 unsigned RecCode
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000975 = SLocEntryCursor.readRecord(Code, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000976
977 if (RecCode != SM_SLOC_BUFFER_BLOB) {
978 Error("AST record has invalid code");
979 return true;
980 }
981
982 llvm::MemoryBuffer *Buffer
Chris Lattnerb3ce3572013-01-20 02:38:54 +0000983 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
Guy Benyei7f92f2d2012-12-18 14:30:41 +0000984 SourceMgr.createFileIDForMemBuffer(Buffer, FileCharacter, ID,
985 BaseOffset + Offset, IncludeLoc);
986 break;
987 }
988
989 case SM_SLOC_EXPANSION_ENTRY: {
990 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
991 SourceMgr.createExpansionLoc(SpellingLoc,
992 ReadSourceLocation(*F, Record[2]),
993 ReadSourceLocation(*F, Record[3]),
994 Record[4],
995 ID,
996 BaseOffset + Record[0]);
997 break;
998 }
999 }
1000
1001 return false;
1002}
1003
1004std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1005 if (ID == 0)
1006 return std::make_pair(SourceLocation(), "");
1007
1008 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1009 Error("source location entry ID out-of-range for AST file");
1010 return std::make_pair(SourceLocation(), "");
1011 }
1012
1013 // Find which module file this entry lands in.
1014 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1015 if (M->Kind != MK_Module)
1016 return std::make_pair(SourceLocation(), "");
1017
1018 // FIXME: Can we map this down to a particular submodule? That would be
1019 // ideal.
1020 return std::make_pair(M->ImportLoc, llvm::sys::path::stem(M->FileName));
1021}
1022
1023/// \brief Find the location where the module F is imported.
1024SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1025 if (F->ImportLoc.isValid())
1026 return F->ImportLoc;
1027
1028 // Otherwise we have a PCH. It's considered to be "imported" at the first
1029 // location of its includer.
1030 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1031 // Main file is the importer. We assume that it is the first entry in the
1032 // entry table. We can't ask the manager, because at the time of PCH loading
1033 // the main file entry doesn't exist yet.
1034 // The very first entry is the invalid instantiation loc, which takes up
1035 // offsets 0 and 1.
1036 return SourceLocation::getFromRawEncoding(2U);
1037 }
1038 //return F->Loaders[0]->FirstLoc;
1039 return F->ImportedBy[0]->FirstLoc;
1040}
1041
1042/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1043/// specified cursor. Read the abbreviations that are at the top of the block
1044/// and then leave the cursor pointing into the block.
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001045bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001046 if (Cursor.EnterSubBlock(BlockID)) {
1047 Error("malformed block record in AST file");
1048 return Failure;
1049 }
1050
1051 while (true) {
1052 uint64_t Offset = Cursor.GetCurrentBitNo();
1053 unsigned Code = Cursor.ReadCode();
1054
1055 // We expect all abbrevs to be at the start of the block.
1056 if (Code != llvm::bitc::DEFINE_ABBREV) {
1057 Cursor.JumpToBit(Offset);
1058 return false;
1059 }
1060 Cursor.ReadAbbrevRecord();
1061 }
1062}
1063
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00001064void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset,
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001065 MacroDirective *Hint) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001066 BitstreamCursor &Stream = F.MacroCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001067
1068 // Keep track of where we are in the stream, then jump back there
1069 // after reading this macro.
1070 SavedStreamPosition SavedPosition(Stream);
1071
1072 Stream.JumpToBit(Offset);
1073 RecordData Record;
1074 SmallVector<IdentifierInfo*, 16> MacroArgs;
1075 MacroInfo *Macro = 0;
1076
Douglas Gregord3b036e2013-01-18 04:34:14 +00001077 // RAII object to add the loaded macro information once we're done
1078 // adding tokens.
1079 struct AddLoadedMacroInfoRAII {
1080 Preprocessor &PP;
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001081 MacroDirective *Hint;
1082 MacroDirective *MD;
Douglas Gregord3b036e2013-01-18 04:34:14 +00001083 IdentifierInfo *II;
1084
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001085 AddLoadedMacroInfoRAII(Preprocessor &PP, MacroDirective *Hint)
1086 : PP(PP), Hint(Hint), MD(), II() { }
Douglas Gregord3b036e2013-01-18 04:34:14 +00001087 ~AddLoadedMacroInfoRAII( ) {
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001088 if (MD) {
Douglas Gregord3b036e2013-01-18 04:34:14 +00001089 // Finally, install the macro.
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001090 PP.addLoadedMacroInfo(II, MD, Hint);
Douglas Gregord3b036e2013-01-18 04:34:14 +00001091 }
1092 }
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00001093 } AddLoadedMacroInfo(PP, Hint);
Douglas Gregord3b036e2013-01-18 04:34:14 +00001094
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001095 while (true) {
Chris Lattner99a5af02013-01-20 00:00:22 +00001096 // Advance to the next record, but if we get to the end of the block, don't
1097 // pop it (removing all the abbreviations from the cursor) since we want to
1098 // be able to reseek within the block and read entries.
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001099 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
Chris Lattner99a5af02013-01-20 00:00:22 +00001100 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1101
1102 switch (Entry.Kind) {
1103 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1104 case llvm::BitstreamEntry::Error:
1105 Error("malformed block record in AST file");
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001106 return;
Chris Lattner99a5af02013-01-20 00:00:22 +00001107 case llvm::BitstreamEntry::EndBlock:
1108 return;
1109 case llvm::BitstreamEntry::Record:
1110 // The interesting case.
1111 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001112 }
1113
1114 // Read a record.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001115 Record.clear();
1116 PreprocessorRecordTypes RecType =
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001117 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001118 switch (RecType) {
1119 case PP_MACRO_OBJECT_LIKE:
1120 case PP_MACRO_FUNCTION_LIKE: {
1121 // If we already have a macro, that means that we've hit the end
1122 // of the definition of the macro we were looking for. We're
1123 // done.
1124 if (Macro)
1125 return;
1126
1127 IdentifierInfo *II = getLocalIdentifier(F, Record[0]);
1128 if (II == 0) {
1129 Error("macro must have a name in AST file");
1130 return;
1131 }
1132
1133 unsigned GlobalID = getGlobalMacroID(F, Record[1]);
1134
1135 // If this macro has already been loaded, don't do so again.
1136 if (MacrosLoaded[GlobalID - NUM_PREDEF_MACRO_IDS])
1137 return;
1138
1139 SubmoduleID GlobalSubmoduleID = getGlobalSubmoduleID(F, Record[2]);
1140 unsigned NextIndex = 3;
1141 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1142 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001143 // FIXME: Location should be import location in case of module.
1144 MacroDirective *MD = PP.AllocateMacroDirective(MI, Loc,
1145 /*isImported=*/true);
Argyrios Kyrtzidis8169b672013-01-07 19:16:23 +00001146 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001147
1148 // Record this macro.
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001149 MacrosLoaded[GlobalID - NUM_PREDEF_MACRO_IDS] = MD;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001150
1151 SourceLocation UndefLoc = ReadSourceLocation(F, Record, NextIndex);
1152 if (UndefLoc.isValid())
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001153 MD->setUndefLoc(UndefLoc);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001154
1155 MI->setIsUsed(Record[NextIndex++]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001156
1157 bool IsPublic = Record[NextIndex++];
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001158 MD->setVisibility(IsPublic, ReadSourceLocation(F, Record, NextIndex));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001159
1160 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1161 // Decode function-like macro info.
1162 bool isC99VarArgs = Record[NextIndex++];
1163 bool isGNUVarArgs = Record[NextIndex++];
1164 bool hasCommaPasting = Record[NextIndex++];
1165 MacroArgs.clear();
1166 unsigned NumArgs = Record[NextIndex++];
1167 for (unsigned i = 0; i != NumArgs; ++i)
1168 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1169
1170 // Install function-like macro info.
1171 MI->setIsFunctionLike();
1172 if (isC99VarArgs) MI->setIsC99Varargs();
1173 if (isGNUVarArgs) MI->setIsGNUVarargs();
1174 if (hasCommaPasting) MI->setHasCommaPasting();
1175 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1176 PP.getPreprocessorAllocator());
1177 }
1178
1179 if (DeserializationListener)
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001180 DeserializationListener->MacroRead(GlobalID, MD);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001181
1182 // If an update record marked this as undefined, do so now.
1183 // FIXME: Only if the submodule this update came from is visible?
1184 MacroUpdatesMap::iterator Update = MacroUpdates.find(GlobalID);
1185 if (Update != MacroUpdates.end()) {
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001186 if (MD->getUndefLoc().isInvalid()) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001187 for (unsigned I = 0, N = Update->second.size(); I != N; ++I) {
1188 bool Hidden = false;
1189 if (unsigned SubmoduleID = Update->second[I].first) {
1190 if (Module *Owner = getSubmodule(SubmoduleID)) {
1191 if (Owner->NameVisibility == Module::Hidden) {
1192 // Note that this #undef is hidden.
1193 Hidden = true;
1194
1195 // Record this hiding for later.
1196 HiddenNamesMap[Owner].push_back(
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001197 HiddenName(II, MD, Update->second[I].second.UndefLoc));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001198 }
1199 }
1200 }
1201
1202 if (!Hidden) {
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001203 MD->setUndefLoc(Update->second[I].second.UndefLoc);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001204 if (PPMutationListener *Listener = PP.getPPMutationListener())
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001205 Listener->UndefinedMacro(MD);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001206 break;
1207 }
1208 }
1209 }
1210 MacroUpdates.erase(Update);
1211 }
1212
1213 // Determine whether this macro definition is visible.
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001214 bool Hidden = !MD->isPublic();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001215 if (!Hidden && GlobalSubmoduleID) {
1216 if (Module *Owner = getSubmodule(GlobalSubmoduleID)) {
1217 if (Owner->NameVisibility == Module::Hidden) {
1218 // The owning module is not visible, and this macro definition
1219 // should not be, either.
1220 Hidden = true;
1221
1222 // Note that this macro definition was hidden because its owning
1223 // module is not yet visible.
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001224 HiddenNamesMap[Owner].push_back(HiddenName(II, MD));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001225 }
1226 }
1227 }
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001228 MD->setHidden(Hidden);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001229
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00001230 // Make sure we install the macro once we're done.
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00001231 AddLoadedMacroInfo.MD = MD;
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00001232 AddLoadedMacroInfo.II = II;
Douglas Gregord3b036e2013-01-18 04:34:14 +00001233
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001234 // Remember that we saw this macro last so that we add the tokens that
1235 // form its body to it.
1236 Macro = MI;
1237
1238 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1239 Record[NextIndex]) {
1240 // We have a macro definition. Register the association
1241 PreprocessedEntityID
1242 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1243 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1244 PPRec.RegisterMacroDefinition(Macro,
1245 PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true));
1246 }
1247
1248 ++NumMacrosRead;
1249 break;
1250 }
1251
1252 case PP_TOKEN: {
1253 // If we see a TOKEN before a PP_MACRO_*, then the file is
1254 // erroneous, just pretend we didn't see this.
1255 if (Macro == 0) break;
1256
1257 Token Tok;
1258 Tok.startToken();
1259 Tok.setLocation(ReadSourceLocation(F, Record[0]));
1260 Tok.setLength(Record[1]);
1261 if (IdentifierInfo *II = getLocalIdentifier(F, Record[2]))
1262 Tok.setIdentifierInfo(II);
1263 Tok.setKind((tok::TokenKind)Record[3]);
1264 Tok.setFlag((Token::TokenFlags)Record[4]);
1265 Macro->AddTokenToBody(Tok);
1266 break;
1267 }
1268 }
1269 }
1270}
1271
1272PreprocessedEntityID
1273ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1274 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1275 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1276 assert(I != M.PreprocessedEntityRemap.end()
1277 && "Invalid index into preprocessed entity index remap");
1278
1279 return LocalID + I->second;
1280}
1281
1282unsigned HeaderFileInfoTrait::ComputeHash(const char *path) {
1283 return llvm::HashString(llvm::sys::path::filename(path));
1284}
1285
1286HeaderFileInfoTrait::internal_key_type
1287HeaderFileInfoTrait::GetInternalKey(const char *path) { return path; }
1288
1289bool HeaderFileInfoTrait::EqualKey(internal_key_type a, internal_key_type b) {
1290 if (strcmp(a, b) == 0)
1291 return true;
1292
1293 if (llvm::sys::path::filename(a) != llvm::sys::path::filename(b))
1294 return false;
1295
1296 // Determine whether the actual files are equivalent.
1297 bool Result = false;
1298 if (llvm::sys::fs::equivalent(a, b, Result))
1299 return false;
1300
1301 return Result;
1302}
1303
1304std::pair<unsigned, unsigned>
1305HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1306 unsigned KeyLen = (unsigned) clang::io::ReadUnalignedLE16(d);
1307 unsigned DataLen = (unsigned) *d++;
1308 return std::make_pair(KeyLen + 1, DataLen);
1309}
1310
1311HeaderFileInfoTrait::data_type
1312HeaderFileInfoTrait::ReadData(const internal_key_type, const unsigned char *d,
1313 unsigned DataLen) {
1314 const unsigned char *End = d + DataLen;
1315 using namespace clang::io;
1316 HeaderFileInfo HFI;
1317 unsigned Flags = *d++;
1318 HFI.isImport = (Flags >> 5) & 0x01;
1319 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1320 HFI.DirInfo = (Flags >> 2) & 0x03;
1321 HFI.Resolved = (Flags >> 1) & 0x01;
1322 HFI.IndexHeaderMapHeader = Flags & 0x01;
1323 HFI.NumIncludes = ReadUnalignedLE16(d);
1324 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(M,
1325 ReadUnalignedLE32(d));
1326 if (unsigned FrameworkOffset = ReadUnalignedLE32(d)) {
1327 // The framework offset is 1 greater than the actual offset,
1328 // since 0 is used as an indicator for "no framework name".
1329 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1330 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1331 }
1332
1333 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1334 (void)End;
1335
1336 // This HeaderFileInfo was externally loaded.
1337 HFI.External = true;
1338 return HFI;
1339}
1340
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00001341void ASTReader::setIdentifierIsMacro(IdentifierInfo *II, ArrayRef<MacroID> IDs){
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001342 II->setHadMacroDefinition(true);
1343 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00001344 PendingMacroIDs[II].append(IDs.begin(), IDs.end());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001345}
1346
1347void ASTReader::ReadDefinedMacros() {
1348 // Note that we are loading defined macros.
1349 Deserializing Macros(this);
1350
1351 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1352 E = ModuleMgr.rend(); I != E; ++I) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001353 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001354
1355 // If there was no preprocessor block, skip this file.
1356 if (!MacroCursor.getBitStreamReader())
1357 continue;
1358
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001359 BitstreamCursor Cursor = MacroCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001360 Cursor.JumpToBit((*I)->MacroStartOffset);
1361
1362 RecordData Record;
1363 while (true) {
Chris Lattner88bde502013-01-19 21:39:22 +00001364 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1365
1366 switch (E.Kind) {
1367 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1368 case llvm::BitstreamEntry::Error:
1369 Error("malformed block record in AST file");
1370 return;
1371 case llvm::BitstreamEntry::EndBlock:
1372 goto NextCursor;
1373
1374 case llvm::BitstreamEntry::Record:
Chris Lattner88bde502013-01-19 21:39:22 +00001375 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001376 switch (Cursor.readRecord(E.ID, Record)) {
Chris Lattner88bde502013-01-19 21:39:22 +00001377 default: // Default behavior: ignore.
1378 break;
1379
1380 case PP_MACRO_OBJECT_LIKE:
1381 case PP_MACRO_FUNCTION_LIKE:
1382 getLocalIdentifier(**I, Record[0]);
1383 break;
1384
1385 case PP_TOKEN:
1386 // Ignore tokens.
1387 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001388 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001389 break;
1390 }
1391 }
Chris Lattner88bde502013-01-19 21:39:22 +00001392 NextCursor: ;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001393 }
1394}
1395
1396namespace {
1397 /// \brief Visitor class used to look up identifirs in an AST file.
1398 class IdentifierLookupVisitor {
1399 StringRef Name;
1400 unsigned PriorGeneration;
Douglas Gregore1698072013-01-25 00:38:33 +00001401 unsigned &NumIdentifierLookups;
1402 unsigned &NumIdentifierLookupHits;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001403 IdentifierInfo *Found;
Douglas Gregore1698072013-01-25 00:38:33 +00001404
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001405 public:
Douglas Gregore1698072013-01-25 00:38:33 +00001406 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1407 unsigned &NumIdentifierLookups,
1408 unsigned &NumIdentifierLookupHits)
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001409 : Name(Name), PriorGeneration(PriorGeneration),
Douglas Gregore1698072013-01-25 00:38:33 +00001410 NumIdentifierLookups(NumIdentifierLookups),
1411 NumIdentifierLookupHits(NumIdentifierLookupHits),
1412 Found()
1413 {
1414 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001415
1416 static bool visit(ModuleFile &M, void *UserData) {
1417 IdentifierLookupVisitor *This
1418 = static_cast<IdentifierLookupVisitor *>(UserData);
1419
1420 // If we've already searched this module file, skip it now.
1421 if (M.Generation <= This->PriorGeneration)
1422 return true;
Douglas Gregor1a49d972013-01-25 01:03:03 +00001423
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001424 ASTIdentifierLookupTable *IdTable
1425 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1426 if (!IdTable)
1427 return false;
1428
1429 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1430 M, This->Found);
Douglas Gregore1698072013-01-25 00:38:33 +00001431 ++This->NumIdentifierLookups;
1432 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001433 if (Pos == IdTable->end())
1434 return false;
1435
1436 // Dereferencing the iterator has the effect of building the
1437 // IdentifierInfo node and populating it with the various
1438 // declarations it needs.
Douglas Gregore1698072013-01-25 00:38:33 +00001439 ++This->NumIdentifierLookupHits;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001440 This->Found = *Pos;
1441 return true;
1442 }
1443
1444 // \brief Retrieve the identifier info found within the module
1445 // files.
1446 IdentifierInfo *getIdentifierInfo() const { return Found; }
1447 };
1448}
1449
1450void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1451 // Note that we are loading an identifier.
1452 Deserializing AnIdentifier(this);
1453
1454 unsigned PriorGeneration = 0;
1455 if (getContext().getLangOpts().Modules)
1456 PriorGeneration = IdentifierGeneration[&II];
Douglas Gregor1a49d972013-01-25 01:03:03 +00001457
1458 // If there is a global index, look there first to determine which modules
1459 // provably do not have any results for this identifier.
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001460 GlobalModuleIndex::HitSet Hits;
1461 GlobalModuleIndex::HitSet *HitsPtr = 0;
Douglas Gregor1a49d972013-01-25 01:03:03 +00001462 if (!loadGlobalIndex()) {
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001463 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1464 HitsPtr = &Hits;
Douglas Gregor1a49d972013-01-25 01:03:03 +00001465 }
1466 }
1467
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001468 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
Douglas Gregore1698072013-01-25 00:38:33 +00001469 NumIdentifierLookups,
1470 NumIdentifierLookupHits);
Douglas Gregor188bdcd2013-01-25 23:32:03 +00001471 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001472 markIdentifierUpToDate(&II);
1473}
1474
1475void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1476 if (!II)
1477 return;
1478
1479 II->setOutOfDate(false);
1480
1481 // Update the generation for this identifier.
1482 if (getContext().getLangOpts().Modules)
1483 IdentifierGeneration[II] = CurrentGeneration;
1484}
1485
1486llvm::PointerIntPair<const FileEntry *, 1, bool>
1487ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
1488 // If this ID is bogus, just return an empty input file.
1489 if (ID == 0 || ID > F.InputFilesLoaded.size())
1490 return InputFile();
1491
1492 // If we've already loaded this input file, return it.
1493 if (F.InputFilesLoaded[ID-1].getPointer())
1494 return F.InputFilesLoaded[ID-1];
1495
1496 // Go find this input file.
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001497 BitstreamCursor &Cursor = F.InputFilesCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001498 SavedStreamPosition SavedPosition(Cursor);
1499 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
1500
1501 unsigned Code = Cursor.ReadCode();
1502 RecordData Record;
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001503 StringRef Blob;
1504 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001505 case INPUT_FILE: {
1506 unsigned StoredID = Record[0];
1507 assert(ID == StoredID && "Bogus stored ID or offset");
1508 (void)StoredID;
1509 off_t StoredSize = (off_t)Record[1];
1510 time_t StoredTime = (time_t)Record[2];
1511 bool Overridden = (bool)Record[3];
1512
1513 // Get the file entry for this input file.
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001514 StringRef OrigFilename = Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001515 std::string Filename = OrigFilename;
1516 MaybeAddSystemRootToFilename(F, Filename);
1517 const FileEntry *File
1518 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
1519 : FileMgr.getFile(Filename, /*OpenFile=*/false);
1520
1521 // If we didn't find the file, resolve it relative to the
1522 // original directory from which this AST file was created.
1523 if (File == 0 && !F.OriginalDir.empty() && !CurrentDir.empty() &&
1524 F.OriginalDir != CurrentDir) {
1525 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
1526 F.OriginalDir,
1527 CurrentDir);
1528 if (!Resolved.empty())
1529 File = FileMgr.getFile(Resolved);
1530 }
1531
1532 // For an overridden file, create a virtual file with the stored
1533 // size/timestamp.
1534 if (Overridden && File == 0) {
1535 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
1536 }
1537
1538 if (File == 0) {
1539 if (Complain) {
1540 std::string ErrorStr = "could not find file '";
1541 ErrorStr += Filename;
1542 ErrorStr += "' referenced by AST file";
1543 Error(ErrorStr.c_str());
1544 }
1545 return InputFile();
1546 }
1547
1548 // Note that we've loaded this input file.
1549 F.InputFilesLoaded[ID-1] = InputFile(File, Overridden);
1550
1551 // Check if there was a request to override the contents of the file
1552 // that was part of the precompiled header. Overridding such a file
1553 // can lead to problems when lexing using the source locations from the
1554 // PCH.
1555 SourceManager &SM = getSourceManager();
1556 if (!Overridden && SM.isFileOverridden(File)) {
1557 Error(diag::err_fe_pch_file_overridden, Filename);
1558 // After emitting the diagnostic, recover by disabling the override so
1559 // that the original file will be used.
1560 SM.disableFileContentsOverride(File);
1561 // The FileEntry is a virtual file entry with the size of the contents
1562 // that would override the original contents. Set it to the original's
1563 // size/time.
1564 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
1565 StoredSize, StoredTime);
1566 }
1567
1568 // For an overridden file, there is nothing to validate.
1569 if (Overridden)
1570 return InputFile(File, Overridden);
1571
1572 if ((StoredSize != File->getSize()
1573#if !defined(LLVM_ON_WIN32)
1574 // In our regression testing, the Windows file system seems to
1575 // have inconsistent modification times that sometimes
1576 // erroneously trigger this error-handling path.
1577 || StoredTime != File->getModificationTime()
1578#endif
1579 )) {
1580 if (Complain)
1581 Error(diag::err_fe_pch_file_modified, Filename);
1582
1583 return InputFile();
1584 }
1585
1586 return InputFile(File, Overridden);
1587 }
1588 }
1589
1590 return InputFile();
1591}
1592
1593const FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) {
1594 ModuleFile &M = ModuleMgr.getPrimaryModule();
1595 std::string Filename = filenameStrRef;
1596 MaybeAddSystemRootToFilename(M, Filename);
1597 const FileEntry *File = FileMgr.getFile(Filename);
1598 if (File == 0 && !M.OriginalDir.empty() && !CurrentDir.empty() &&
1599 M.OriginalDir != CurrentDir) {
1600 std::string resolved = resolveFileRelativeToOriginalDir(Filename,
1601 M.OriginalDir,
1602 CurrentDir);
1603 if (!resolved.empty())
1604 File = FileMgr.getFile(resolved);
1605 }
1606
1607 return File;
1608}
1609
1610/// \brief If we are loading a relocatable PCH file, and the filename is
1611/// not an absolute path, add the system root to the beginning of the file
1612/// name.
1613void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M,
1614 std::string &Filename) {
1615 // If this is not a relocatable PCH file, there's nothing to do.
1616 if (!M.RelocatablePCH)
1617 return;
1618
1619 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
1620 return;
1621
1622 if (isysroot.empty()) {
1623 // If no system root was given, default to '/'
1624 Filename.insert(Filename.begin(), '/');
1625 return;
1626 }
1627
1628 unsigned Length = isysroot.size();
1629 if (isysroot[Length - 1] != '/')
1630 Filename.insert(Filename.begin(), '/');
1631
1632 Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end());
1633}
1634
1635ASTReader::ASTReadResult
1636ASTReader::ReadControlBlock(ModuleFile &F,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00001637 SmallVectorImpl<ImportedModule> &Loaded,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001638 unsigned ClientLoadCapabilities) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001639 BitstreamCursor &Stream = F.Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001640
1641 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
1642 Error("malformed block record in AST file");
1643 return Failure;
1644 }
1645
1646 // Read all of the records and blocks in the control block.
1647 RecordData Record;
Chris Lattner88bde502013-01-19 21:39:22 +00001648 while (1) {
1649 llvm::BitstreamEntry Entry = Stream.advance();
1650
1651 switch (Entry.Kind) {
1652 case llvm::BitstreamEntry::Error:
1653 Error("malformed block record in AST file");
1654 return Failure;
1655 case llvm::BitstreamEntry::EndBlock:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001656 // Validate all of the input files.
1657 if (!DisableValidation) {
1658 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
1659 for (unsigned I = 0, N = Record[0]; I < N; ++I)
1660 if (!getInputFile(F, I+1, Complain).getPointer())
1661 return OutOfDate;
1662 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001663 return Success;
Chris Lattner88bde502013-01-19 21:39:22 +00001664
1665 case llvm::BitstreamEntry::SubBlock:
1666 switch (Entry.ID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001667 case INPUT_FILES_BLOCK_ID:
1668 F.InputFilesCursor = Stream;
1669 if (Stream.SkipBlock() || // Skip with the main cursor
1670 // Read the abbreviations
1671 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
1672 Error("malformed block record in AST file");
1673 return Failure;
1674 }
1675 continue;
Chris Lattner88bde502013-01-19 21:39:22 +00001676
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001677 default:
Chris Lattner88bde502013-01-19 21:39:22 +00001678 if (Stream.SkipBlock()) {
1679 Error("malformed block record in AST file");
1680 return Failure;
1681 }
1682 continue;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001683 }
Chris Lattner88bde502013-01-19 21:39:22 +00001684
1685 case llvm::BitstreamEntry::Record:
1686 // The interesting case.
1687 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001688 }
1689
1690 // Read and process a record.
1691 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001692 StringRef Blob;
1693 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001694 case METADATA: {
1695 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
1696 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
1697 Diag(Record[0] < VERSION_MAJOR? diag::warn_pch_version_too_old
1698 : diag::warn_pch_version_too_new);
1699 return VersionMismatch;
1700 }
1701
1702 bool hasErrors = Record[5];
1703 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
1704 Diag(diag::err_pch_with_compiler_errors);
1705 return HadErrors;
1706 }
1707
1708 F.RelocatablePCH = Record[4];
1709
1710 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001711 StringRef ASTBranch = Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001712 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
1713 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
1714 Diag(diag::warn_pch_different_branch) << ASTBranch << CurBranch;
1715 return VersionMismatch;
1716 }
1717 break;
1718 }
1719
1720 case IMPORTS: {
1721 // Load each of the imported PCH files.
1722 unsigned Idx = 0, N = Record.size();
1723 while (Idx < N) {
1724 // Read information about the AST file.
1725 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
1726 // The import location will be the local one for now; we will adjust
1727 // all import locations of module imports after the global source
1728 // location info are setup.
1729 SourceLocation ImportLoc =
1730 SourceLocation::getFromRawEncoding(Record[Idx++]);
1731 unsigned Length = Record[Idx++];
1732 SmallString<128> ImportedFile(Record.begin() + Idx,
1733 Record.begin() + Idx + Length);
1734 Idx += Length;
1735
1736 // Load the AST file.
1737 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
1738 ClientLoadCapabilities)) {
1739 case Failure: return Failure;
1740 // If we have to ignore the dependency, we'll have to ignore this too.
1741 case OutOfDate: return OutOfDate;
1742 case VersionMismatch: return VersionMismatch;
1743 case ConfigurationMismatch: return ConfigurationMismatch;
1744 case HadErrors: return HadErrors;
1745 case Success: break;
1746 }
1747 }
1748 break;
1749 }
1750
1751 case LANGUAGE_OPTIONS: {
1752 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
1753 if (Listener && &F == *ModuleMgr.begin() &&
1754 ParseLanguageOptions(Record, Complain, *Listener) &&
1755 !DisableValidation)
1756 return ConfigurationMismatch;
1757 break;
1758 }
1759
1760 case TARGET_OPTIONS: {
1761 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1762 if (Listener && &F == *ModuleMgr.begin() &&
1763 ParseTargetOptions(Record, Complain, *Listener) &&
1764 !DisableValidation)
1765 return ConfigurationMismatch;
1766 break;
1767 }
1768
1769 case DIAGNOSTIC_OPTIONS: {
1770 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1771 if (Listener && &F == *ModuleMgr.begin() &&
1772 ParseDiagnosticOptions(Record, Complain, *Listener) &&
1773 !DisableValidation)
1774 return ConfigurationMismatch;
1775 break;
1776 }
1777
1778 case FILE_SYSTEM_OPTIONS: {
1779 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1780 if (Listener && &F == *ModuleMgr.begin() &&
1781 ParseFileSystemOptions(Record, Complain, *Listener) &&
1782 !DisableValidation)
1783 return ConfigurationMismatch;
1784 break;
1785 }
1786
1787 case HEADER_SEARCH_OPTIONS: {
1788 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1789 if (Listener && &F == *ModuleMgr.begin() &&
1790 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
1791 !DisableValidation)
1792 return ConfigurationMismatch;
1793 break;
1794 }
1795
1796 case PREPROCESSOR_OPTIONS: {
1797 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1798 if (Listener && &F == *ModuleMgr.begin() &&
1799 ParsePreprocessorOptions(Record, Complain, *Listener,
1800 SuggestedPredefines) &&
1801 !DisableValidation)
1802 return ConfigurationMismatch;
1803 break;
1804 }
1805
1806 case ORIGINAL_FILE:
1807 F.OriginalSourceFileID = FileID::get(Record[0]);
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001808 F.ActualOriginalSourceFileName = Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001809 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
1810 MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName);
1811 break;
1812
1813 case ORIGINAL_FILE_ID:
1814 F.OriginalSourceFileID = FileID::get(Record[0]);
1815 break;
1816
1817 case ORIGINAL_PCH_DIR:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001818 F.OriginalDir = Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001819 break;
1820
1821 case INPUT_FILE_OFFSETS:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001822 F.InputFileOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001823 F.InputFilesLoaded.resize(Record[0]);
1824 break;
1825 }
1826 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001827}
1828
1829bool ASTReader::ReadASTBlock(ModuleFile &F) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001830 BitstreamCursor &Stream = F.Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001831
1832 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
1833 Error("malformed block record in AST file");
1834 return true;
1835 }
1836
1837 // Read all of the records and blocks for the AST file.
1838 RecordData Record;
Chris Lattner88bde502013-01-19 21:39:22 +00001839 while (1) {
1840 llvm::BitstreamEntry Entry = Stream.advance();
1841
1842 switch (Entry.Kind) {
1843 case llvm::BitstreamEntry::Error:
1844 Error("error at end of module block in AST file");
1845 return true;
1846 case llvm::BitstreamEntry::EndBlock: {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001847 DeclContext *DC = Context.getTranslationUnitDecl();
1848 if (!DC->hasExternalVisibleStorage() && DC->hasExternalLexicalStorage())
1849 DC->setMustBuildLookupTable();
Chris Lattner88bde502013-01-19 21:39:22 +00001850
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001851 return false;
1852 }
Chris Lattner88bde502013-01-19 21:39:22 +00001853 case llvm::BitstreamEntry::SubBlock:
1854 switch (Entry.ID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001855 case DECLTYPES_BLOCK_ID:
1856 // We lazily load the decls block, but we want to set up the
1857 // DeclsCursor cursor to point into it. Clone our current bitcode
1858 // cursor to it, enter the block and read the abbrevs in that block.
1859 // With the main cursor, we just skip over it.
1860 F.DeclsCursor = Stream;
1861 if (Stream.SkipBlock() || // Skip with the main cursor.
1862 // Read the abbrevs.
1863 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
1864 Error("malformed block record in AST file");
1865 return true;
1866 }
1867 break;
Chris Lattner88bde502013-01-19 21:39:22 +00001868
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001869 case DECL_UPDATES_BLOCK_ID:
1870 if (Stream.SkipBlock()) {
1871 Error("malformed block record in AST file");
1872 return true;
1873 }
1874 break;
Chris Lattner88bde502013-01-19 21:39:22 +00001875
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001876 case PREPROCESSOR_BLOCK_ID:
1877 F.MacroCursor = Stream;
1878 if (!PP.getExternalSource())
1879 PP.setExternalSource(this);
Chris Lattner88bde502013-01-19 21:39:22 +00001880
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001881 if (Stream.SkipBlock() ||
1882 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
1883 Error("malformed block record in AST file");
1884 return true;
1885 }
1886 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
1887 break;
Chris Lattner88bde502013-01-19 21:39:22 +00001888
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001889 case PREPROCESSOR_DETAIL_BLOCK_ID:
1890 F.PreprocessorDetailCursor = Stream;
1891 if (Stream.SkipBlock() ||
Chris Lattner88bde502013-01-19 21:39:22 +00001892 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001893 PREPROCESSOR_DETAIL_BLOCK_ID)) {
Chris Lattner88bde502013-01-19 21:39:22 +00001894 Error("malformed preprocessor detail record in AST file");
1895 return true;
1896 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001897 F.PreprocessorDetailStartOffset
Chris Lattner88bde502013-01-19 21:39:22 +00001898 = F.PreprocessorDetailCursor.GetCurrentBitNo();
1899
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001900 if (!PP.getPreprocessingRecord())
1901 PP.createPreprocessingRecord();
1902 if (!PP.getPreprocessingRecord()->getExternalSource())
1903 PP.getPreprocessingRecord()->SetExternalSource(*this);
1904 break;
1905
1906 case SOURCE_MANAGER_BLOCK_ID:
1907 if (ReadSourceManagerBlock(F))
1908 return true;
1909 break;
Chris Lattner88bde502013-01-19 21:39:22 +00001910
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001911 case SUBMODULE_BLOCK_ID:
1912 if (ReadSubmoduleBlock(F))
1913 return true;
1914 break;
Chris Lattner88bde502013-01-19 21:39:22 +00001915
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001916 case COMMENTS_BLOCK_ID: {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00001917 BitstreamCursor C = Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001918 if (Stream.SkipBlock() ||
1919 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
1920 Error("malformed comments block in AST file");
1921 return true;
1922 }
1923 CommentsCursors.push_back(std::make_pair(C, &F));
1924 break;
1925 }
Chris Lattner88bde502013-01-19 21:39:22 +00001926
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001927 default:
Chris Lattner88bde502013-01-19 21:39:22 +00001928 if (Stream.SkipBlock()) {
1929 Error("malformed block record in AST file");
1930 return true;
1931 }
1932 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001933 }
1934 continue;
Chris Lattner88bde502013-01-19 21:39:22 +00001935
1936 case llvm::BitstreamEntry::Record:
1937 // The interesting case.
1938 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001939 }
1940
1941 // Read and process a record.
1942 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001943 StringRef Blob;
1944 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001945 default: // Default behavior: ignore.
1946 break;
1947
1948 case TYPE_OFFSET: {
1949 if (F.LocalNumTypes != 0) {
1950 Error("duplicate TYPE_OFFSET record in AST file");
1951 return true;
1952 }
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001953 F.TypeOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001954 F.LocalNumTypes = Record[0];
1955 unsigned LocalBaseTypeIndex = Record[1];
1956 F.BaseTypeIndex = getTotalNumTypes();
1957
1958 if (F.LocalNumTypes > 0) {
1959 // Introduce the global -> local mapping for types within this module.
1960 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
1961
1962 // Introduce the local -> global mapping for types within this module.
1963 F.TypeRemap.insertOrReplace(
1964 std::make_pair(LocalBaseTypeIndex,
1965 F.BaseTypeIndex - LocalBaseTypeIndex));
1966
1967 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
1968 }
1969 break;
1970 }
1971
1972 case DECL_OFFSET: {
1973 if (F.LocalNumDecls != 0) {
1974 Error("duplicate DECL_OFFSET record in AST file");
1975 return true;
1976 }
Chris Lattnerb3ce3572013-01-20 02:38:54 +00001977 F.DeclOffsets = (const DeclOffset *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00001978 F.LocalNumDecls = Record[0];
1979 unsigned LocalBaseDeclID = Record[1];
1980 F.BaseDeclID = getTotalNumDecls();
1981
1982 if (F.LocalNumDecls > 0) {
1983 // Introduce the global -> local mapping for declarations within this
1984 // module.
1985 GlobalDeclMap.insert(
1986 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
1987
1988 // Introduce the local -> global mapping for declarations within this
1989 // module.
1990 F.DeclRemap.insertOrReplace(
1991 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
1992
1993 // Introduce the global -> local mapping for declarations within this
1994 // module.
1995 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
1996
1997 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
1998 }
1999 break;
2000 }
2001
2002 case TU_UPDATE_LEXICAL: {
2003 DeclContext *TU = Context.getTranslationUnitDecl();
2004 DeclContextInfo &Info = F.DeclContextInfos[TU];
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002005 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002006 Info.NumLexicalDecls
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002007 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002008 TU->setHasExternalLexicalStorage(true);
2009 break;
2010 }
2011
2012 case UPDATE_VISIBLE: {
2013 unsigned Idx = 0;
2014 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2015 ASTDeclContextNameLookupTable *Table =
2016 ASTDeclContextNameLookupTable::Create(
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002017 (const unsigned char *)Blob.data() + Record[Idx++],
2018 (const unsigned char *)Blob.data(),
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002019 ASTDeclContextNameLookupTrait(*this, F));
2020 if (ID == PREDEF_DECL_TRANSLATION_UNIT_ID) { // Is it the TU?
2021 DeclContext *TU = Context.getTranslationUnitDecl();
2022 F.DeclContextInfos[TU].NameLookupTableData = Table;
2023 TU->setHasExternalVisibleStorage(true);
2024 } else
2025 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2026 break;
2027 }
2028
2029 case IDENTIFIER_TABLE:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002030 F.IdentifierTableData = Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002031 if (Record[0]) {
2032 F.IdentifierLookupTable
2033 = ASTIdentifierLookupTable::Create(
2034 (const unsigned char *)F.IdentifierTableData + Record[0],
2035 (const unsigned char *)F.IdentifierTableData,
2036 ASTIdentifierLookupTrait(*this, F));
2037
2038 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2039 }
2040 break;
2041
2042 case IDENTIFIER_OFFSET: {
2043 if (F.LocalNumIdentifiers != 0) {
2044 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2045 return true;
2046 }
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002047 F.IdentifierOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002048 F.LocalNumIdentifiers = Record[0];
2049 unsigned LocalBaseIdentifierID = Record[1];
2050 F.BaseIdentifierID = getTotalNumIdentifiers();
2051
2052 if (F.LocalNumIdentifiers > 0) {
2053 // Introduce the global -> local mapping for identifiers within this
2054 // module.
2055 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2056 &F));
2057
2058 // Introduce the local -> global mapping for identifiers within this
2059 // module.
2060 F.IdentifierRemap.insertOrReplace(
2061 std::make_pair(LocalBaseIdentifierID,
2062 F.BaseIdentifierID - LocalBaseIdentifierID));
2063
2064 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2065 + F.LocalNumIdentifiers);
2066 }
2067 break;
2068 }
2069
2070 case EXTERNAL_DEFINITIONS:
2071 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2072 ExternalDefinitions.push_back(getGlobalDeclID(F, Record[I]));
2073 break;
2074
2075 case SPECIAL_TYPES:
Douglas Gregorf5cfc892013-02-01 23:45:03 +00002076 if (SpecialTypes.empty()) {
2077 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2078 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2079 break;
2080 }
2081
2082 if (SpecialTypes.size() != Record.size()) {
2083 Error("invalid special-types record");
2084 return true;
2085 }
2086
2087 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2088 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2089 if (!SpecialTypes[I])
2090 SpecialTypes[I] = ID;
2091 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2092 // merge step?
2093 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002094 break;
2095
2096 case STATISTICS:
2097 TotalNumStatements += Record[0];
2098 TotalNumMacros += Record[1];
2099 TotalLexicalDeclContexts += Record[2];
2100 TotalVisibleDeclContexts += Record[3];
2101 break;
2102
2103 case UNUSED_FILESCOPED_DECLS:
2104 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2105 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2106 break;
2107
2108 case DELEGATING_CTORS:
2109 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2110 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2111 break;
2112
2113 case WEAK_UNDECLARED_IDENTIFIERS:
2114 if (Record.size() % 4 != 0) {
2115 Error("invalid weak identifiers record");
2116 return true;
2117 }
2118
2119 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2120 // files. This isn't the way to do it :)
2121 WeakUndeclaredIdentifiers.clear();
2122
2123 // Translate the weak, undeclared identifiers into global IDs.
2124 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2125 WeakUndeclaredIdentifiers.push_back(
2126 getGlobalIdentifierID(F, Record[I++]));
2127 WeakUndeclaredIdentifiers.push_back(
2128 getGlobalIdentifierID(F, Record[I++]));
2129 WeakUndeclaredIdentifiers.push_back(
2130 ReadSourceLocation(F, Record, I).getRawEncoding());
2131 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2132 }
2133 break;
2134
Richard Smith5ea6ef42013-01-10 23:43:47 +00002135 case LOCALLY_SCOPED_EXTERN_C_DECLS:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002136 for (unsigned I = 0, N = Record.size(); I != N; ++I)
Richard Smith5ea6ef42013-01-10 23:43:47 +00002137 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002138 break;
2139
2140 case SELECTOR_OFFSETS: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002141 F.SelectorOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002142 F.LocalNumSelectors = Record[0];
2143 unsigned LocalBaseSelectorID = Record[1];
2144 F.BaseSelectorID = getTotalNumSelectors();
2145
2146 if (F.LocalNumSelectors > 0) {
2147 // Introduce the global -> local mapping for selectors within this
2148 // module.
2149 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2150
2151 // Introduce the local -> global mapping for selectors within this
2152 // module.
2153 F.SelectorRemap.insertOrReplace(
2154 std::make_pair(LocalBaseSelectorID,
2155 F.BaseSelectorID - LocalBaseSelectorID));
2156
2157 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2158 }
2159 break;
2160 }
2161
2162 case METHOD_POOL:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002163 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002164 if (Record[0])
2165 F.SelectorLookupTable
2166 = ASTSelectorLookupTable::Create(
2167 F.SelectorLookupTableData + Record[0],
2168 F.SelectorLookupTableData,
2169 ASTSelectorLookupTrait(*this, F));
2170 TotalNumMethodPoolEntries += Record[1];
2171 break;
2172
2173 case REFERENCED_SELECTOR_POOL:
2174 if (!Record.empty()) {
2175 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2176 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2177 Record[Idx++]));
2178 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2179 getRawEncoding());
2180 }
2181 }
2182 break;
2183
2184 case PP_COUNTER_VALUE:
2185 if (!Record.empty() && Listener)
2186 Listener->ReadCounter(F, Record[0]);
2187 break;
2188
2189 case FILE_SORTED_DECLS:
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002190 F.FileSortedDecls = (const DeclID *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002191 F.NumFileSortedDecls = Record[0];
2192 break;
2193
2194 case SOURCE_LOCATION_OFFSETS: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002195 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002196 F.LocalNumSLocEntries = Record[0];
2197 unsigned SLocSpaceSize = Record[1];
2198 llvm::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
2199 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
2200 SLocSpaceSize);
2201 // Make our entry in the range map. BaseID is negative and growing, so
2202 // we invert it. Because we invert it, though, we need the other end of
2203 // the range.
2204 unsigned RangeStart =
2205 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2206 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2207 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2208
2209 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2210 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2211 GlobalSLocOffsetMap.insert(
2212 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2213 - SLocSpaceSize,&F));
2214
2215 // Initialize the remapping table.
2216 // Invalid stays invalid.
2217 F.SLocRemap.insert(std::make_pair(0U, 0));
2218 // This module. Base was 2 when being compiled.
2219 F.SLocRemap.insert(std::make_pair(2U,
2220 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2221
2222 TotalNumSLocEntries += F.LocalNumSLocEntries;
2223 break;
2224 }
2225
2226 case MODULE_OFFSET_MAP: {
2227 // Additional remapping information.
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002228 const unsigned char *Data = (const unsigned char*)Blob.data();
2229 const unsigned char *DataEnd = Data + Blob.size();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002230
2231 // Continuous range maps we may be updating in our module.
2232 ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap);
2233 ContinuousRangeMap<uint32_t, int, 2>::Builder
2234 IdentifierRemap(F.IdentifierRemap);
2235 ContinuousRangeMap<uint32_t, int, 2>::Builder
2236 MacroRemap(F.MacroRemap);
2237 ContinuousRangeMap<uint32_t, int, 2>::Builder
2238 PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2239 ContinuousRangeMap<uint32_t, int, 2>::Builder
2240 SubmoduleRemap(F.SubmoduleRemap);
2241 ContinuousRangeMap<uint32_t, int, 2>::Builder
2242 SelectorRemap(F.SelectorRemap);
2243 ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap);
2244 ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap);
2245
2246 while(Data < DataEnd) {
2247 uint16_t Len = io::ReadUnalignedLE16(Data);
2248 StringRef Name = StringRef((const char*)Data, Len);
2249 Data += Len;
2250 ModuleFile *OM = ModuleMgr.lookup(Name);
2251 if (!OM) {
2252 Error("SourceLocation remap refers to unknown module");
2253 return true;
2254 }
2255
2256 uint32_t SLocOffset = io::ReadUnalignedLE32(Data);
2257 uint32_t IdentifierIDOffset = io::ReadUnalignedLE32(Data);
2258 uint32_t MacroIDOffset = io::ReadUnalignedLE32(Data);
2259 uint32_t PreprocessedEntityIDOffset = io::ReadUnalignedLE32(Data);
2260 uint32_t SubmoduleIDOffset = io::ReadUnalignedLE32(Data);
2261 uint32_t SelectorIDOffset = io::ReadUnalignedLE32(Data);
2262 uint32_t DeclIDOffset = io::ReadUnalignedLE32(Data);
2263 uint32_t TypeIndexOffset = io::ReadUnalignedLE32(Data);
2264
2265 // Source location offset is mapped to OM->SLocEntryBaseOffset.
2266 SLocRemap.insert(std::make_pair(SLocOffset,
2267 static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset)));
2268 IdentifierRemap.insert(
2269 std::make_pair(IdentifierIDOffset,
2270 OM->BaseIdentifierID - IdentifierIDOffset));
2271 MacroRemap.insert(std::make_pair(MacroIDOffset,
2272 OM->BaseMacroID - MacroIDOffset));
2273 PreprocessedEntityRemap.insert(
2274 std::make_pair(PreprocessedEntityIDOffset,
2275 OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset));
2276 SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset,
2277 OM->BaseSubmoduleID - SubmoduleIDOffset));
2278 SelectorRemap.insert(std::make_pair(SelectorIDOffset,
2279 OM->BaseSelectorID - SelectorIDOffset));
2280 DeclRemap.insert(std::make_pair(DeclIDOffset,
2281 OM->BaseDeclID - DeclIDOffset));
2282
2283 TypeRemap.insert(std::make_pair(TypeIndexOffset,
2284 OM->BaseTypeIndex - TypeIndexOffset));
2285
2286 // Global -> local mappings.
2287 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2288 }
2289 break;
2290 }
2291
2292 case SOURCE_MANAGER_LINE_TABLE:
2293 if (ParseLineTable(F, Record))
2294 return true;
2295 break;
2296
2297 case SOURCE_LOCATION_PRELOADS: {
2298 // Need to transform from the local view (1-based IDs) to the global view,
2299 // which is based off F.SLocEntryBaseID.
2300 if (!F.PreloadSLocEntries.empty()) {
2301 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
2302 return true;
2303 }
2304
2305 F.PreloadSLocEntries.swap(Record);
2306 break;
2307 }
2308
2309 case EXT_VECTOR_DECLS:
2310 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2311 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2312 break;
2313
2314 case VTABLE_USES:
2315 if (Record.size() % 3 != 0) {
2316 Error("Invalid VTABLE_USES record");
2317 return true;
2318 }
2319
2320 // Later tables overwrite earlier ones.
2321 // FIXME: Modules will have some trouble with this. This is clearly not
2322 // the right way to do this.
2323 VTableUses.clear();
2324
2325 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
2326 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
2327 VTableUses.push_back(
2328 ReadSourceLocation(F, Record, Idx).getRawEncoding());
2329 VTableUses.push_back(Record[Idx++]);
2330 }
2331 break;
2332
2333 case DYNAMIC_CLASSES:
2334 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2335 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
2336 break;
2337
2338 case PENDING_IMPLICIT_INSTANTIATIONS:
2339 if (PendingInstantiations.size() % 2 != 0) {
2340 Error("Invalid existing PendingInstantiations");
2341 return true;
2342 }
2343
2344 if (Record.size() % 2 != 0) {
2345 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
2346 return true;
2347 }
2348
2349 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
2350 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
2351 PendingInstantiations.push_back(
2352 ReadSourceLocation(F, Record, I).getRawEncoding());
2353 }
2354 break;
2355
2356 case SEMA_DECL_REFS:
2357 // Later tables overwrite earlier ones.
2358 // FIXME: Modules will have some trouble with this.
2359 SemaDeclRefs.clear();
2360 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2361 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
2362 break;
2363
2364 case PPD_ENTITIES_OFFSETS: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002365 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
2366 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
2367 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002368
2369 unsigned LocalBasePreprocessedEntityID = Record[0];
2370
2371 unsigned StartingID;
2372 if (!PP.getPreprocessingRecord())
2373 PP.createPreprocessingRecord();
2374 if (!PP.getPreprocessingRecord()->getExternalSource())
2375 PP.getPreprocessingRecord()->SetExternalSource(*this);
2376 StartingID
2377 = PP.getPreprocessingRecord()
2378 ->allocateLoadedEntities(F.NumPreprocessedEntities);
2379 F.BasePreprocessedEntityID = StartingID;
2380
2381 if (F.NumPreprocessedEntities > 0) {
2382 // Introduce the global -> local mapping for preprocessed entities in
2383 // this module.
2384 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
2385
2386 // Introduce the local -> global mapping for preprocessed entities in
2387 // this module.
2388 F.PreprocessedEntityRemap.insertOrReplace(
2389 std::make_pair(LocalBasePreprocessedEntityID,
2390 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
2391 }
2392
2393 break;
2394 }
2395
2396 case DECL_UPDATE_OFFSETS: {
2397 if (Record.size() % 2 != 0) {
2398 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
2399 return true;
2400 }
2401 for (unsigned I = 0, N = Record.size(); I != N; I += 2)
2402 DeclUpdateOffsets[getGlobalDeclID(F, Record[I])]
2403 .push_back(std::make_pair(&F, Record[I+1]));
2404 break;
2405 }
2406
2407 case DECL_REPLACEMENTS: {
2408 if (Record.size() % 3 != 0) {
2409 Error("invalid DECL_REPLACEMENTS block in AST file");
2410 return true;
2411 }
2412 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
2413 ReplacedDecls[getGlobalDeclID(F, Record[I])]
2414 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
2415 break;
2416 }
2417
2418 case OBJC_CATEGORIES_MAP: {
2419 if (F.LocalNumObjCCategoriesInMap != 0) {
2420 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
2421 return true;
2422 }
2423
2424 F.LocalNumObjCCategoriesInMap = Record[0];
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002425 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002426 break;
2427 }
2428
2429 case OBJC_CATEGORIES:
2430 F.ObjCCategories.swap(Record);
2431 break;
2432
2433 case CXX_BASE_SPECIFIER_OFFSETS: {
2434 if (F.LocalNumCXXBaseSpecifiers != 0) {
2435 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
2436 return true;
2437 }
2438
2439 F.LocalNumCXXBaseSpecifiers = Record[0];
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002440 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002441 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
2442 break;
2443 }
2444
2445 case DIAG_PRAGMA_MAPPINGS:
2446 if (F.PragmaDiagMappings.empty())
2447 F.PragmaDiagMappings.swap(Record);
2448 else
2449 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
2450 Record.begin(), Record.end());
2451 break;
2452
2453 case CUDA_SPECIAL_DECL_REFS:
2454 // Later tables overwrite earlier ones.
2455 // FIXME: Modules will have trouble with this.
2456 CUDASpecialDeclRefs.clear();
2457 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2458 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
2459 break;
2460
2461 case HEADER_SEARCH_TABLE: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002462 F.HeaderFileInfoTableData = Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002463 F.LocalNumHeaderFileInfos = Record[1];
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002464 F.HeaderFileFrameworkStrings = Blob.data() + Record[2];
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002465 if (Record[0]) {
2466 F.HeaderFileInfoTable
2467 = HeaderFileInfoLookupTable::Create(
2468 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
2469 (const unsigned char *)F.HeaderFileInfoTableData,
2470 HeaderFileInfoTrait(*this, F,
2471 &PP.getHeaderSearchInfo(),
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002472 Blob.data() + Record[2]));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002473
2474 PP.getHeaderSearchInfo().SetExternalSource(this);
2475 if (!PP.getHeaderSearchInfo().getExternalLookup())
2476 PP.getHeaderSearchInfo().SetExternalLookup(this);
2477 }
2478 break;
2479 }
2480
2481 case FP_PRAGMA_OPTIONS:
2482 // Later tables overwrite earlier ones.
2483 FPPragmaOptions.swap(Record);
2484 break;
2485
2486 case OPENCL_EXTENSIONS:
2487 // Later tables overwrite earlier ones.
2488 OpenCLExtensions.swap(Record);
2489 break;
2490
2491 case TENTATIVE_DEFINITIONS:
2492 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2493 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
2494 break;
2495
2496 case KNOWN_NAMESPACES:
2497 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2498 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
2499 break;
Nick Lewycky01a41142013-01-26 00:35:08 +00002500
Nick Lewyckycd0655b2013-02-01 08:13:20 +00002501 case UNDEFINED_BUT_USED:
2502 if (UndefinedButUsed.size() % 2 != 0) {
2503 Error("Invalid existing UndefinedButUsed");
Nick Lewycky01a41142013-01-26 00:35:08 +00002504 return true;
2505 }
2506
2507 if (Record.size() % 2 != 0) {
Nick Lewyckycd0655b2013-02-01 08:13:20 +00002508 Error("invalid undefined-but-used record");
Nick Lewycky01a41142013-01-26 00:35:08 +00002509 return true;
2510 }
2511 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
Nick Lewyckycd0655b2013-02-01 08:13:20 +00002512 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
2513 UndefinedButUsed.push_back(
Nick Lewycky01a41142013-01-26 00:35:08 +00002514 ReadSourceLocation(F, Record, I).getRawEncoding());
2515 }
2516 break;
2517
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002518 case IMPORTED_MODULES: {
2519 if (F.Kind != MK_Module) {
2520 // If we aren't loading a module (which has its own exports), make
2521 // all of the imported modules visible.
2522 // FIXME: Deal with macros-only imports.
2523 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2524 if (unsigned GlobalID = getGlobalSubmoduleID(F, Record[I]))
2525 ImportedModules.push_back(GlobalID);
2526 }
2527 }
2528 break;
2529 }
2530
2531 case LOCAL_REDECLARATIONS: {
2532 F.RedeclarationChains.swap(Record);
2533 break;
2534 }
2535
2536 case LOCAL_REDECLARATIONS_MAP: {
2537 if (F.LocalNumRedeclarationsInMap != 0) {
2538 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
2539 return true;
2540 }
2541
2542 F.LocalNumRedeclarationsInMap = Record[0];
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002543 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002544 break;
2545 }
2546
2547 case MERGED_DECLARATIONS: {
2548 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
2549 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
2550 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
2551 for (unsigned N = Record[Idx++]; N > 0; --N)
2552 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
2553 }
2554 break;
2555 }
2556
2557 case MACRO_OFFSET: {
2558 if (F.LocalNumMacros != 0) {
2559 Error("duplicate MACRO_OFFSET record in AST file");
2560 return true;
2561 }
Chris Lattnerb3ce3572013-01-20 02:38:54 +00002562 F.MacroOffsets = (const uint32_t *)Blob.data();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002563 F.LocalNumMacros = Record[0];
2564 unsigned LocalBaseMacroID = Record[1];
2565 F.BaseMacroID = getTotalNumMacros();
2566
2567 if (F.LocalNumMacros > 0) {
2568 // Introduce the global -> local mapping for macros within this module.
2569 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
2570
2571 // Introduce the local -> global mapping for macros within this module.
2572 F.MacroRemap.insertOrReplace(
2573 std::make_pair(LocalBaseMacroID,
2574 F.BaseMacroID - LocalBaseMacroID));
2575
2576 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
2577 }
2578 break;
2579 }
2580
2581 case MACRO_UPDATES: {
2582 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
2583 MacroID ID = getGlobalMacroID(F, Record[I++]);
2584 if (I == N)
2585 break;
2586
2587 SourceLocation UndefLoc = ReadSourceLocation(F, Record, I);
2588 SubmoduleID SubmoduleID = getGlobalSubmoduleID(F, Record[I++]);;
2589 MacroUpdate Update;
2590 Update.UndefLoc = UndefLoc;
2591 MacroUpdates[ID].push_back(std::make_pair(SubmoduleID, Update));
2592 }
2593 break;
2594 }
2595 }
2596 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002597}
2598
Douglas Gregor2cbd4272013-02-12 23:36:21 +00002599/// \brief Move the given method to the back of the global list of methods.
2600static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
2601 // Find the entry for this selector in the method pool.
2602 Sema::GlobalMethodPool::iterator Known
2603 = S.MethodPool.find(Method->getSelector());
2604 if (Known == S.MethodPool.end())
2605 return;
2606
2607 // Retrieve the appropriate method list.
2608 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
2609 : Known->second.second;
2610 bool Found = false;
2611 for (ObjCMethodList *List = &Start; List; List = List->Next) {
2612 if (!Found) {
2613 if (List->Method == Method) {
2614 Found = true;
2615 } else {
2616 // Keep searching.
2617 continue;
2618 }
2619 }
2620
2621 if (List->Next)
2622 List->Method = List->Next->Method;
2623 else
2624 List->Method = Method;
2625 }
2626}
2627
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002628void ASTReader::makeNamesVisible(const HiddenNames &Names) {
2629 for (unsigned I = 0, N = Names.size(); I != N; ++I) {
2630 switch (Names[I].getKind()) {
Douglas Gregor2cbd4272013-02-12 23:36:21 +00002631 case HiddenName::Declaration: {
2632 Decl *D = Names[I].getDecl();
2633 bool wasHidden = D->Hidden;
2634 D->Hidden = false;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002635
Douglas Gregor2cbd4272013-02-12 23:36:21 +00002636 if (wasHidden && SemaObj) {
2637 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
2638 moveMethodToBackOfGlobalList(*SemaObj, Method);
2639 }
2640 }
2641 break;
2642 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002643 case HiddenName::MacroVisibility: {
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00002644 std::pair<IdentifierInfo *, MacroDirective *> Macro = Names[I].getMacro();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002645 Macro.second->setHidden(!Macro.second->isPublic());
2646 if (Macro.second->isDefined()) {
2647 PP.makeLoadedMacroInfoVisible(Macro.first, Macro.second);
2648 }
2649 break;
2650 }
2651
2652 case HiddenName::MacroUndef: {
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00002653 std::pair<IdentifierInfo *, MacroDirective *> Macro = Names[I].getMacro();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002654 if (Macro.second->isDefined()) {
2655 Macro.second->setUndefLoc(Names[I].getMacroUndefLoc());
2656 if (PPMutationListener *Listener = PP.getPPMutationListener())
2657 Listener->UndefinedMacro(Macro.second);
2658 PP.makeLoadedMacroInfoVisible(Macro.first, Macro.second);
2659 }
2660 break;
2661 }
2662 }
2663 }
2664}
2665
2666void ASTReader::makeModuleVisible(Module *Mod,
Argyrios Kyrtzidis5ebcb202013-02-01 16:36:12 +00002667 Module::NameVisibilityKind NameVisibility,
2668 SourceLocation ImportLoc) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002669 llvm::SmallPtrSet<Module *, 4> Visited;
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00002670 SmallVector<Module *, 4> Stack;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002671 Stack.push_back(Mod);
2672 while (!Stack.empty()) {
2673 Mod = Stack.back();
2674 Stack.pop_back();
2675
2676 if (NameVisibility <= Mod->NameVisibility) {
2677 // This module already has this level of visibility (or greater), so
2678 // there is nothing more to do.
2679 continue;
2680 }
2681
2682 if (!Mod->isAvailable()) {
2683 // Modules that aren't available cannot be made visible.
2684 continue;
2685 }
2686
2687 // Update the module's name visibility.
2688 Mod->NameVisibility = NameVisibility;
2689
2690 // If we've already deserialized any names from this module,
2691 // mark them as visible.
2692 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
2693 if (Hidden != HiddenNamesMap.end()) {
2694 makeNamesVisible(Hidden->second);
2695 HiddenNamesMap.erase(Hidden);
2696 }
2697
2698 // Push any non-explicit submodules onto the stack to be marked as
2699 // visible.
2700 for (Module::submodule_iterator Sub = Mod->submodule_begin(),
2701 SubEnd = Mod->submodule_end();
2702 Sub != SubEnd; ++Sub) {
2703 if (!(*Sub)->IsExplicit && Visited.insert(*Sub))
2704 Stack.push_back(*Sub);
2705 }
2706
2707 // Push any exported modules onto the stack to be marked as visible.
Argyrios Kyrtzidis21a00042013-02-19 19:34:40 +00002708 SmallVector<Module *, 16> Exports;
2709 Mod->getExportedModules(Exports);
2710 for (SmallVectorImpl<Module *>::iterator
2711 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
2712 Module *Exported = *I;
2713 if (Visited.insert(Exported))
2714 Stack.push_back(Exported);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002715 }
2716 }
2717}
2718
Douglas Gregor1a49d972013-01-25 01:03:03 +00002719bool ASTReader::loadGlobalIndex() {
2720 if (GlobalIndex)
2721 return false;
2722
2723 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
2724 !Context.getLangOpts().Modules)
2725 return true;
2726
2727 // Try to load the global index.
2728 TriedLoadingGlobalIndex = true;
2729 StringRef ModuleCachePath
2730 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
2731 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
2732 = GlobalModuleIndex::readIndex(FileMgr, ModuleCachePath);
2733 if (!Result.first)
2734 return true;
2735
2736 GlobalIndex.reset(Result.first);
Douglas Gregor188bdcd2013-01-25 23:32:03 +00002737 ModuleMgr.setGlobalIndex(GlobalIndex.get());
Douglas Gregor1a49d972013-01-25 01:03:03 +00002738 return false;
2739}
2740
2741bool ASTReader::isGlobalIndexUnavailable() const {
2742 return Context.getLangOpts().Modules && UseGlobalIndex &&
2743 !hasGlobalIndex() && TriedLoadingGlobalIndex;
2744}
2745
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002746ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
2747 ModuleKind Type,
2748 SourceLocation ImportLoc,
2749 unsigned ClientLoadCapabilities) {
2750 // Bump the generation number.
2751 unsigned PreviousGeneration = CurrentGeneration++;
2752
2753 unsigned NumModules = ModuleMgr.size();
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00002754 SmallVector<ImportedModule, 4> Loaded;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002755 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
2756 /*ImportedBy=*/0, Loaded,
2757 ClientLoadCapabilities)) {
2758 case Failure:
2759 case OutOfDate:
2760 case VersionMismatch:
2761 case ConfigurationMismatch:
2762 case HadErrors:
2763 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end());
Douglas Gregor1a49d972013-01-25 01:03:03 +00002764
2765 // If we find that any modules are unusable, the global index is going
2766 // to be out-of-date. Just remove it.
2767 GlobalIndex.reset();
Douglas Gregor188bdcd2013-01-25 23:32:03 +00002768 ModuleMgr.setGlobalIndex(0);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002769 return ReadResult;
2770
2771 case Success:
2772 break;
2773 }
2774
2775 // Here comes stuff that we only do once the entire chain is loaded.
2776
2777 // Load the AST blocks of all of the modules that we loaded.
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00002778 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
2779 MEnd = Loaded.end();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002780 M != MEnd; ++M) {
2781 ModuleFile &F = *M->Mod;
2782
2783 // Read the AST block.
2784 if (ReadASTBlock(F))
2785 return Failure;
2786
2787 // Once read, set the ModuleFile bit base offset and update the size in
2788 // bits of all files we've seen.
2789 F.GlobalBitOffset = TotalModulesSizeInBits;
2790 TotalModulesSizeInBits += F.SizeInBits;
2791 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
2792
2793 // Preload SLocEntries.
2794 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
2795 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
2796 // Load it through the SourceManager and don't call ReadSLocEntry()
2797 // directly because the entry may have already been loaded in which case
2798 // calling ReadSLocEntry() directly would trigger an assertion in
2799 // SourceManager.
2800 SourceMgr.getLoadedSLocEntryByID(Index);
2801 }
2802 }
2803
2804 // Setup the import locations.
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00002805 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
2806 MEnd = Loaded.end();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002807 M != MEnd; ++M) {
2808 ModuleFile &F = *M->Mod;
Argyrios Kyrtzidis8b136d82013-02-01 16:36:14 +00002809 F.DirectImportLoc = ImportLoc;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002810 if (!M->ImportedBy)
2811 F.ImportLoc = M->ImportLoc;
2812 else
2813 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
2814 M->ImportLoc.getRawEncoding());
2815 }
2816
2817 // Mark all of the identifiers in the identifier table as being out of date,
2818 // so that various accessors know to check the loaded modules when the
2819 // identifier is used.
2820 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
2821 IdEnd = PP.getIdentifierTable().end();
2822 Id != IdEnd; ++Id)
2823 Id->second->setOutOfDate(true);
2824
2825 // Resolve any unresolved module exports.
2826 for (unsigned I = 0, N = UnresolvedModuleImportExports.size(); I != N; ++I) {
2827 UnresolvedModuleImportExport &Unresolved = UnresolvedModuleImportExports[I];
2828 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
2829 Module *ResolvedMod = getSubmodule(GlobalID);
2830
2831 if (Unresolved.IsImport) {
2832 if (ResolvedMod)
2833 Unresolved.Mod->Imports.push_back(ResolvedMod);
2834 continue;
2835 }
2836
2837 if (ResolvedMod || Unresolved.IsWildcard)
2838 Unresolved.Mod->Exports.push_back(
2839 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
2840 }
2841 UnresolvedModuleImportExports.clear();
2842
2843 InitializeContext();
2844
2845 if (DeserializationListener)
2846 DeserializationListener->ReaderInitialized(this);
2847
2848 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
2849 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
2850 PrimaryModule.OriginalSourceFileID
2851 = FileID::get(PrimaryModule.SLocEntryBaseID
2852 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
2853
2854 // If this AST file is a precompiled preamble, then set the
2855 // preamble file ID of the source manager to the file source file
2856 // from which the preamble was built.
2857 if (Type == MK_Preamble) {
2858 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
2859 } else if (Type == MK_MainFile) {
2860 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
2861 }
2862 }
2863
2864 // For any Objective-C class definitions we have already loaded, make sure
2865 // that we load any additional categories.
2866 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
2867 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
2868 ObjCClassesLoaded[I],
2869 PreviousGeneration);
2870 }
Douglas Gregor1a49d972013-01-25 01:03:03 +00002871
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002872 return Success;
2873}
2874
2875ASTReader::ASTReadResult
2876ASTReader::ReadASTCore(StringRef FileName,
2877 ModuleKind Type,
2878 SourceLocation ImportLoc,
2879 ModuleFile *ImportedBy,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00002880 SmallVectorImpl<ImportedModule> &Loaded,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002881 unsigned ClientLoadCapabilities) {
2882 ModuleFile *M;
2883 bool NewModule;
2884 std::string ErrorStr;
2885 llvm::tie(M, NewModule) = ModuleMgr.addModule(FileName, Type, ImportLoc,
2886 ImportedBy, CurrentGeneration,
2887 ErrorStr);
2888
2889 if (!M) {
2890 // We couldn't load the module.
2891 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
2892 + ErrorStr;
2893 Error(Msg);
2894 return Failure;
2895 }
2896
2897 if (!NewModule) {
2898 // We've already loaded this module.
2899 return Success;
2900 }
2901
2902 // FIXME: This seems rather a hack. Should CurrentDir be part of the
2903 // module?
2904 if (FileName != "-") {
2905 CurrentDir = llvm::sys::path::parent_path(FileName);
2906 if (CurrentDir.empty()) CurrentDir = ".";
2907 }
2908
2909 ModuleFile &F = *M;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00002910 BitstreamCursor &Stream = F.Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002911 Stream.init(F.StreamFile);
2912 F.SizeInBits = F.Buffer->getBufferSize() * 8;
2913
2914 // Sniff for the signature.
2915 if (Stream.Read(8) != 'C' ||
2916 Stream.Read(8) != 'P' ||
2917 Stream.Read(8) != 'C' ||
2918 Stream.Read(8) != 'H') {
2919 Diag(diag::err_not_a_pch_file) << FileName;
2920 return Failure;
2921 }
2922
2923 // This is used for compatibility with older PCH formats.
2924 bool HaveReadControlBlock = false;
2925
Chris Lattner99a5af02013-01-20 00:00:22 +00002926 while (1) {
2927 llvm::BitstreamEntry Entry = Stream.advance();
2928
2929 switch (Entry.Kind) {
2930 case llvm::BitstreamEntry::Error:
2931 case llvm::BitstreamEntry::EndBlock:
2932 case llvm::BitstreamEntry::Record:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002933 Error("invalid record at top-level of AST file");
2934 return Failure;
Chris Lattner99a5af02013-01-20 00:00:22 +00002935
2936 case llvm::BitstreamEntry::SubBlock:
2937 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002938 }
2939
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002940 // We only know the control subblock ID.
Chris Lattner99a5af02013-01-20 00:00:22 +00002941 switch (Entry.ID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002942 case llvm::bitc::BLOCKINFO_BLOCK_ID:
2943 if (Stream.ReadBlockInfoBlock()) {
2944 Error("malformed BlockInfoBlock in AST file");
2945 return Failure;
2946 }
2947 break;
2948 case CONTROL_BLOCK_ID:
2949 HaveReadControlBlock = true;
2950 switch (ReadControlBlock(F, Loaded, ClientLoadCapabilities)) {
2951 case Success:
2952 break;
2953
2954 case Failure: return Failure;
2955 case OutOfDate: return OutOfDate;
2956 case VersionMismatch: return VersionMismatch;
2957 case ConfigurationMismatch: return ConfigurationMismatch;
2958 case HadErrors: return HadErrors;
2959 }
2960 break;
2961 case AST_BLOCK_ID:
2962 if (!HaveReadControlBlock) {
2963 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2964 Diag(diag::warn_pch_version_too_old);
2965 return VersionMismatch;
2966 }
2967
2968 // Record that we've loaded this module.
2969 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
2970 return Success;
2971
2972 default:
2973 if (Stream.SkipBlock()) {
2974 Error("malformed block record in AST file");
2975 return Failure;
2976 }
2977 break;
2978 }
2979 }
2980
2981 return Success;
2982}
2983
2984void ASTReader::InitializeContext() {
2985 // If there's a listener, notify them that we "read" the translation unit.
2986 if (DeserializationListener)
2987 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
2988 Context.getTranslationUnitDecl());
2989
2990 // Make sure we load the declaration update records for the translation unit,
2991 // if there are any.
2992 loadDeclUpdateRecords(PREDEF_DECL_TRANSLATION_UNIT_ID,
2993 Context.getTranslationUnitDecl());
2994
2995 // FIXME: Find a better way to deal with collisions between these
2996 // built-in types. Right now, we just ignore the problem.
2997
2998 // Load the special types.
2999 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3000 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3001 if (!Context.CFConstantStringTypeDecl)
3002 Context.setCFConstantStringType(GetType(String));
3003 }
3004
3005 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3006 QualType FileType = GetType(File);
3007 if (FileType.isNull()) {
3008 Error("FILE type is NULL");
3009 return;
3010 }
3011
3012 if (!Context.FILEDecl) {
3013 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3014 Context.setFILEDecl(Typedef->getDecl());
3015 else {
3016 const TagType *Tag = FileType->getAs<TagType>();
3017 if (!Tag) {
3018 Error("Invalid FILE type in AST file");
3019 return;
3020 }
3021 Context.setFILEDecl(Tag->getDecl());
3022 }
3023 }
3024 }
3025
3026 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3027 QualType Jmp_bufType = GetType(Jmp_buf);
3028 if (Jmp_bufType.isNull()) {
3029 Error("jmp_buf type is NULL");
3030 return;
3031 }
3032
3033 if (!Context.jmp_bufDecl) {
3034 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3035 Context.setjmp_bufDecl(Typedef->getDecl());
3036 else {
3037 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3038 if (!Tag) {
3039 Error("Invalid jmp_buf type in AST file");
3040 return;
3041 }
3042 Context.setjmp_bufDecl(Tag->getDecl());
3043 }
3044 }
3045 }
3046
3047 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3048 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3049 if (Sigjmp_bufType.isNull()) {
3050 Error("sigjmp_buf type is NULL");
3051 return;
3052 }
3053
3054 if (!Context.sigjmp_bufDecl) {
3055 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3056 Context.setsigjmp_bufDecl(Typedef->getDecl());
3057 else {
3058 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3059 assert(Tag && "Invalid sigjmp_buf type in AST file");
3060 Context.setsigjmp_bufDecl(Tag->getDecl());
3061 }
3062 }
3063 }
3064
3065 if (unsigned ObjCIdRedef
3066 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3067 if (Context.ObjCIdRedefinitionType.isNull())
3068 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3069 }
3070
3071 if (unsigned ObjCClassRedef
3072 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3073 if (Context.ObjCClassRedefinitionType.isNull())
3074 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3075 }
3076
3077 if (unsigned ObjCSelRedef
3078 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3079 if (Context.ObjCSelRedefinitionType.isNull())
3080 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3081 }
3082
3083 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3084 QualType Ucontext_tType = GetType(Ucontext_t);
3085 if (Ucontext_tType.isNull()) {
3086 Error("ucontext_t type is NULL");
3087 return;
3088 }
3089
3090 if (!Context.ucontext_tDecl) {
3091 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3092 Context.setucontext_tDecl(Typedef->getDecl());
3093 else {
3094 const TagType *Tag = Ucontext_tType->getAs<TagType>();
3095 assert(Tag && "Invalid ucontext_t type in AST file");
3096 Context.setucontext_tDecl(Tag->getDecl());
3097 }
3098 }
3099 }
3100 }
3101
3102 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3103
3104 // If there were any CUDA special declarations, deserialize them.
3105 if (!CUDASpecialDeclRefs.empty()) {
3106 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3107 Context.setcudaConfigureCallDecl(
3108 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3109 }
3110
3111 // Re-export any modules that were imported by a non-module AST file.
3112 for (unsigned I = 0, N = ImportedModules.size(); I != N; ++I) {
3113 if (Module *Imported = getSubmodule(ImportedModules[I]))
Argyrios Kyrtzidis5ebcb202013-02-01 16:36:12 +00003114 makeModuleVisible(Imported, Module::AllVisible,
3115 /*ImportLoc=*/SourceLocation());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003116 }
3117 ImportedModules.clear();
3118}
3119
3120void ASTReader::finalizeForWriting() {
3121 for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(),
3122 HiddenEnd = HiddenNamesMap.end();
3123 Hidden != HiddenEnd; ++Hidden) {
3124 makeNamesVisible(Hidden->second);
3125 }
3126 HiddenNamesMap.clear();
3127}
3128
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003129/// SkipCursorToControlBlock - Given a cursor at the start of an AST file, scan
3130/// ahead and drop the cursor into the start of the CONTROL_BLOCK, returning
3131/// false on success and true on failure.
3132static bool SkipCursorToControlBlock(BitstreamCursor &Cursor) {
3133 while (1) {
3134 llvm::BitstreamEntry Entry = Cursor.advance();
3135 switch (Entry.Kind) {
3136 case llvm::BitstreamEntry::Error:
3137 case llvm::BitstreamEntry::EndBlock:
3138 return true;
3139
3140 case llvm::BitstreamEntry::Record:
3141 // Ignore top-level records.
3142 Cursor.skipRecord(Entry.ID);
3143 break;
3144
3145 case llvm::BitstreamEntry::SubBlock:
3146 if (Entry.ID == CONTROL_BLOCK_ID) {
3147 if (Cursor.EnterSubBlock(CONTROL_BLOCK_ID))
3148 return true;
3149 // Found it!
3150 return false;
3151 }
3152
3153 if (Cursor.SkipBlock())
3154 return true;
3155 }
3156 }
3157}
3158
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003159/// \brief Retrieve the name of the original source file name
3160/// directly from the AST file, without actually loading the AST
3161/// file.
3162std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
3163 FileManager &FileMgr,
3164 DiagnosticsEngine &Diags) {
3165 // Open the AST file.
3166 std::string ErrStr;
3167 OwningPtr<llvm::MemoryBuffer> Buffer;
3168 Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
3169 if (!Buffer) {
3170 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
3171 return std::string();
3172 }
3173
3174 // Initialize the stream
3175 llvm::BitstreamReader StreamFile;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003176 BitstreamCursor Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003177 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3178 (const unsigned char *)Buffer->getBufferEnd());
3179 Stream.init(StreamFile);
3180
3181 // Sniff for the signature.
3182 if (Stream.Read(8) != 'C' ||
3183 Stream.Read(8) != 'P' ||
3184 Stream.Read(8) != 'C' ||
3185 Stream.Read(8) != 'H') {
3186 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
3187 return std::string();
3188 }
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003189
Chris Lattner88bde502013-01-19 21:39:22 +00003190 // Scan for the CONTROL_BLOCK_ID block.
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003191 if (SkipCursorToControlBlock(Stream)) {
3192 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3193 return std::string();
Chris Lattner88bde502013-01-19 21:39:22 +00003194 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003195
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003196 // Scan for ORIGINAL_FILE inside the control block.
3197 RecordData Record;
Chris Lattner88bde502013-01-19 21:39:22 +00003198 while (1) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003199 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
Chris Lattner88bde502013-01-19 21:39:22 +00003200 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3201 return std::string();
3202
3203 if (Entry.Kind != llvm::BitstreamEntry::Record) {
3204 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3205 return std::string();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003206 }
Chris Lattner88bde502013-01-19 21:39:22 +00003207
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003208 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003209 StringRef Blob;
3210 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
3211 return Blob.str();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003212 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003213}
3214
3215namespace {
3216 class SimplePCHValidator : public ASTReaderListener {
3217 const LangOptions &ExistingLangOpts;
3218 const TargetOptions &ExistingTargetOpts;
3219 const PreprocessorOptions &ExistingPPOpts;
3220 FileManager &FileMgr;
3221
3222 public:
3223 SimplePCHValidator(const LangOptions &ExistingLangOpts,
3224 const TargetOptions &ExistingTargetOpts,
3225 const PreprocessorOptions &ExistingPPOpts,
3226 FileManager &FileMgr)
3227 : ExistingLangOpts(ExistingLangOpts),
3228 ExistingTargetOpts(ExistingTargetOpts),
3229 ExistingPPOpts(ExistingPPOpts),
3230 FileMgr(FileMgr)
3231 {
3232 }
3233
3234 virtual bool ReadLanguageOptions(const LangOptions &LangOpts,
3235 bool Complain) {
3236 return checkLanguageOptions(ExistingLangOpts, LangOpts, 0);
3237 }
3238 virtual bool ReadTargetOptions(const TargetOptions &TargetOpts,
3239 bool Complain) {
3240 return checkTargetOptions(ExistingTargetOpts, TargetOpts, 0);
3241 }
3242 virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
3243 bool Complain,
3244 std::string &SuggestedPredefines) {
3245 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, 0, FileMgr,
3246 SuggestedPredefines);
3247 }
3248 };
3249}
3250
3251bool ASTReader::readASTFileControlBlock(StringRef Filename,
3252 FileManager &FileMgr,
3253 ASTReaderListener &Listener) {
3254 // Open the AST file.
3255 std::string ErrStr;
3256 OwningPtr<llvm::MemoryBuffer> Buffer;
3257 Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr));
3258 if (!Buffer) {
3259 return true;
3260 }
3261
3262 // Initialize the stream
3263 llvm::BitstreamReader StreamFile;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003264 BitstreamCursor Stream;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003265 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3266 (const unsigned char *)Buffer->getBufferEnd());
3267 Stream.init(StreamFile);
3268
3269 // Sniff for the signature.
3270 if (Stream.Read(8) != 'C' ||
3271 Stream.Read(8) != 'P' ||
3272 Stream.Read(8) != 'C' ||
3273 Stream.Read(8) != 'H') {
3274 return true;
3275 }
3276
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003277 // Scan for the CONTROL_BLOCK_ID block.
3278 if (SkipCursorToControlBlock(Stream))
3279 return true;
3280
3281 // Scan for ORIGINAL_FILE inside the control block.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003282 RecordData Record;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003283 while (1) {
3284 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
3285 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3286 return false;
3287
3288 if (Entry.Kind != llvm::BitstreamEntry::Record)
3289 return true;
3290
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003291 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003292 StringRef Blob;
3293 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003294 switch ((ControlRecordTypes)RecCode) {
3295 case METADATA: {
3296 if (Record[0] != VERSION_MAJOR)
3297 return true;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003298
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003299 const std::string &CurBranch = getClangFullRepositoryVersion();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003300 if (StringRef(CurBranch) != Blob)
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003301 return true;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003302
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003303 break;
3304 }
3305 case LANGUAGE_OPTIONS:
3306 if (ParseLanguageOptions(Record, false, Listener))
3307 return true;
3308 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003309
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003310 case TARGET_OPTIONS:
3311 if (ParseTargetOptions(Record, false, Listener))
3312 return true;
3313 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003314
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003315 case DIAGNOSTIC_OPTIONS:
3316 if (ParseDiagnosticOptions(Record, false, Listener))
3317 return true;
3318 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003319
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003320 case FILE_SYSTEM_OPTIONS:
3321 if (ParseFileSystemOptions(Record, false, Listener))
3322 return true;
3323 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003324
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003325 case HEADER_SEARCH_OPTIONS:
3326 if (ParseHeaderSearchOptions(Record, false, Listener))
3327 return true;
3328 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003329
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003330 case PREPROCESSOR_OPTIONS: {
3331 std::string IgnoredSuggestedPredefines;
3332 if (ParsePreprocessorOptions(Record, false, Listener,
3333 IgnoredSuggestedPredefines))
3334 return true;
3335 break;
3336 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003337
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003338 default:
3339 // No other validation to perform.
3340 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003341 }
3342 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003343}
3344
3345
3346bool ASTReader::isAcceptableASTFile(StringRef Filename,
3347 FileManager &FileMgr,
3348 const LangOptions &LangOpts,
3349 const TargetOptions &TargetOpts,
3350 const PreprocessorOptions &PPOpts) {
3351 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
3352 return !readASTFileControlBlock(Filename, FileMgr, validator);
3353}
3354
3355bool ASTReader::ReadSubmoduleBlock(ModuleFile &F) {
3356 // Enter the submodule block.
3357 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
3358 Error("malformed submodule block record in AST file");
3359 return true;
3360 }
3361
3362 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
3363 bool First = true;
3364 Module *CurrentModule = 0;
3365 RecordData Record;
3366 while (true) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003367 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
3368
3369 switch (Entry.Kind) {
3370 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
3371 case llvm::BitstreamEntry::Error:
3372 Error("malformed block record in AST file");
3373 return true;
3374 case llvm::BitstreamEntry::EndBlock:
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003375 return false;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003376 case llvm::BitstreamEntry::Record:
3377 // The interesting case.
3378 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003379 }
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003380
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003381 // Read a record.
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003382 StringRef Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003383 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003384 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003385 default: // Default behavior: ignore.
3386 break;
3387
3388 case SUBMODULE_DEFINITION: {
3389 if (First) {
3390 Error("missing submodule metadata record at beginning of block");
3391 return true;
3392 }
3393
3394 if (Record.size() < 7) {
3395 Error("malformed module definition");
3396 return true;
3397 }
3398
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003399 StringRef Name = Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003400 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
3401 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[1]);
3402 bool IsFramework = Record[2];
3403 bool IsExplicit = Record[3];
3404 bool IsSystem = Record[4];
3405 bool InferSubmodules = Record[5];
3406 bool InferExplicitSubmodules = Record[6];
3407 bool InferExportWildcard = Record[7];
3408
3409 Module *ParentModule = 0;
3410 if (Parent)
3411 ParentModule = getSubmodule(Parent);
3412
3413 // Retrieve this (sub)module from the module map, creating it if
3414 // necessary.
3415 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule,
3416 IsFramework,
3417 IsExplicit).first;
3418 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
3419 if (GlobalIndex >= SubmodulesLoaded.size() ||
3420 SubmodulesLoaded[GlobalIndex]) {
3421 Error("too many submodules");
3422 return true;
3423 }
Douglas Gregor8bf778e2013-02-06 22:40:31 +00003424
3425 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
3426 if (CurFile != F.File) {
3427 if (!Diags.isDiagnosticInFlight()) {
3428 Diag(diag::err_module_file_conflict)
3429 << CurrentModule->getTopLevelModuleName()
3430 << CurFile->getName()
3431 << F.File->getName();
3432 }
3433 return true;
3434 }
3435 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003436 CurrentModule->setASTFile(F.File);
3437 CurrentModule->IsFromModuleFile = true;
3438 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
3439 CurrentModule->InferSubmodules = InferSubmodules;
3440 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
3441 CurrentModule->InferExportWildcard = InferExportWildcard;
3442 if (DeserializationListener)
3443 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
3444
3445 SubmodulesLoaded[GlobalIndex] = CurrentModule;
Douglas Gregorb6cbe512013-01-14 17:21:00 +00003446
3447 // Clear out link libraries; the module file has them.
3448 CurrentModule->LinkLibraries.clear();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003449 break;
3450 }
3451
3452 case SUBMODULE_UMBRELLA_HEADER: {
3453 if (First) {
3454 Error("missing submodule metadata record at beginning of block");
3455 return true;
3456 }
3457
3458 if (!CurrentModule)
3459 break;
3460
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003461 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003462 if (!CurrentModule->getUmbrellaHeader())
3463 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
3464 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
3465 Error("mismatched umbrella headers in submodule");
3466 return true;
3467 }
3468 }
3469 break;
3470 }
3471
3472 case SUBMODULE_HEADER: {
3473 if (First) {
3474 Error("missing submodule metadata record at beginning of block");
3475 return true;
3476 }
3477
3478 if (!CurrentModule)
3479 break;
3480
3481 // FIXME: Be more lazy about this!
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003482 if (const FileEntry *File = PP.getFileManager().getFile(Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003483 if (std::find(CurrentModule->Headers.begin(),
3484 CurrentModule->Headers.end(),
3485 File) == CurrentModule->Headers.end())
3486 ModMap.addHeader(CurrentModule, File, false);
3487 }
3488 break;
3489 }
3490
3491 case SUBMODULE_EXCLUDED_HEADER: {
3492 if (First) {
3493 Error("missing submodule metadata record at beginning of block");
3494 return true;
3495 }
3496
3497 if (!CurrentModule)
3498 break;
3499
3500 // FIXME: Be more lazy about this!
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003501 if (const FileEntry *File = PP.getFileManager().getFile(Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003502 if (std::find(CurrentModule->Headers.begin(),
3503 CurrentModule->Headers.end(),
3504 File) == CurrentModule->Headers.end())
3505 ModMap.addHeader(CurrentModule, File, true);
3506 }
3507 break;
3508 }
3509
3510 case SUBMODULE_TOPHEADER: {
3511 if (First) {
3512 Error("missing submodule metadata record at beginning of block");
3513 return true;
3514 }
3515
3516 if (!CurrentModule)
3517 break;
3518
3519 // FIXME: Be more lazy about this!
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003520 if (const FileEntry *File = PP.getFileManager().getFile(Blob))
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003521 CurrentModule->TopHeaders.insert(File);
3522 break;
3523 }
3524
3525 case SUBMODULE_UMBRELLA_DIR: {
3526 if (First) {
3527 Error("missing submodule metadata record at beginning of block");
3528 return true;
3529 }
3530
3531 if (!CurrentModule)
3532 break;
3533
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003534 if (const DirectoryEntry *Umbrella
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003535 = PP.getFileManager().getDirectory(Blob)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003536 if (!CurrentModule->getUmbrellaDir())
3537 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
3538 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
3539 Error("mismatched umbrella directories in submodule");
3540 return true;
3541 }
3542 }
3543 break;
3544 }
3545
3546 case SUBMODULE_METADATA: {
3547 if (!First) {
3548 Error("submodule metadata record not at beginning of block");
3549 return true;
3550 }
3551 First = false;
3552
3553 F.BaseSubmoduleID = getTotalNumSubmodules();
3554 F.LocalNumSubmodules = Record[0];
3555 unsigned LocalBaseSubmoduleID = Record[1];
3556 if (F.LocalNumSubmodules > 0) {
3557 // Introduce the global -> local mapping for submodules within this
3558 // module.
3559 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
3560
3561 // Introduce the local -> global mapping for submodules within this
3562 // module.
3563 F.SubmoduleRemap.insertOrReplace(
3564 std::make_pair(LocalBaseSubmoduleID,
3565 F.BaseSubmoduleID - LocalBaseSubmoduleID));
3566
3567 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
3568 }
3569 break;
3570 }
3571
3572 case SUBMODULE_IMPORTS: {
3573 if (First) {
3574 Error("missing submodule metadata record at beginning of block");
3575 return true;
3576 }
3577
3578 if (!CurrentModule)
3579 break;
3580
3581 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
3582 UnresolvedModuleImportExport Unresolved;
3583 Unresolved.File = &F;
3584 Unresolved.Mod = CurrentModule;
3585 Unresolved.ID = Record[Idx];
3586 Unresolved.IsImport = true;
3587 Unresolved.IsWildcard = false;
3588 UnresolvedModuleImportExports.push_back(Unresolved);
3589 }
3590 break;
3591 }
3592
3593 case SUBMODULE_EXPORTS: {
3594 if (First) {
3595 Error("missing submodule metadata record at beginning of block");
3596 return true;
3597 }
3598
3599 if (!CurrentModule)
3600 break;
3601
3602 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
3603 UnresolvedModuleImportExport Unresolved;
3604 Unresolved.File = &F;
3605 Unresolved.Mod = CurrentModule;
3606 Unresolved.ID = Record[Idx];
3607 Unresolved.IsImport = false;
3608 Unresolved.IsWildcard = Record[Idx + 1];
3609 UnresolvedModuleImportExports.push_back(Unresolved);
3610 }
3611
3612 // Once we've loaded the set of exports, there's no reason to keep
3613 // the parsed, unresolved exports around.
3614 CurrentModule->UnresolvedExports.clear();
3615 break;
3616 }
3617 case SUBMODULE_REQUIRES: {
3618 if (First) {
3619 Error("missing submodule metadata record at beginning of block");
3620 return true;
3621 }
3622
3623 if (!CurrentModule)
3624 break;
3625
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003626 CurrentModule->addRequirement(Blob, Context.getLangOpts(),
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003627 Context.getTargetInfo());
3628 break;
3629 }
Douglas Gregorb6cbe512013-01-14 17:21:00 +00003630
3631 case SUBMODULE_LINK_LIBRARY:
3632 if (First) {
3633 Error("missing submodule metadata record at beginning of block");
3634 return true;
3635 }
3636
3637 if (!CurrentModule)
3638 break;
3639
3640 CurrentModule->LinkLibraries.push_back(
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003641 Module::LinkLibrary(Blob, Record[0]));
Douglas Gregorb6cbe512013-01-14 17:21:00 +00003642 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003643 }
3644 }
3645}
3646
3647/// \brief Parse the record that corresponds to a LangOptions data
3648/// structure.
3649///
3650/// This routine parses the language options from the AST file and then gives
3651/// them to the AST listener if one is set.
3652///
3653/// \returns true if the listener deems the file unacceptable, false otherwise.
3654bool ASTReader::ParseLanguageOptions(const RecordData &Record,
3655 bool Complain,
3656 ASTReaderListener &Listener) {
3657 LangOptions LangOpts;
3658 unsigned Idx = 0;
3659#define LANGOPT(Name, Bits, Default, Description) \
3660 LangOpts.Name = Record[Idx++];
3661#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
3662 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
3663#include "clang/Basic/LangOptions.def"
Will Dietz4f45bc02013-01-18 11:30:38 +00003664#define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
3665#include "clang/Basic/Sanitizers.def"
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003666
3667 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
3668 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
3669 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
3670
3671 unsigned Length = Record[Idx++];
3672 LangOpts.CurrentModule.assign(Record.begin() + Idx,
3673 Record.begin() + Idx + Length);
3674 return Listener.ReadLanguageOptions(LangOpts, Complain);
3675}
3676
3677bool ASTReader::ParseTargetOptions(const RecordData &Record,
3678 bool Complain,
3679 ASTReaderListener &Listener) {
3680 unsigned Idx = 0;
3681 TargetOptions TargetOpts;
3682 TargetOpts.Triple = ReadString(Record, Idx);
3683 TargetOpts.CPU = ReadString(Record, Idx);
3684 TargetOpts.ABI = ReadString(Record, Idx);
3685 TargetOpts.CXXABI = ReadString(Record, Idx);
3686 TargetOpts.LinkerVersion = ReadString(Record, Idx);
3687 for (unsigned N = Record[Idx++]; N; --N) {
3688 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
3689 }
3690 for (unsigned N = Record[Idx++]; N; --N) {
3691 TargetOpts.Features.push_back(ReadString(Record, Idx));
3692 }
3693
3694 return Listener.ReadTargetOptions(TargetOpts, Complain);
3695}
3696
3697bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
3698 ASTReaderListener &Listener) {
3699 DiagnosticOptions DiagOpts;
3700 unsigned Idx = 0;
3701#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
3702#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
3703 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
3704#include "clang/Basic/DiagnosticOptions.def"
3705
3706 for (unsigned N = Record[Idx++]; N; --N) {
3707 DiagOpts.Warnings.push_back(ReadString(Record, Idx));
3708 }
3709
3710 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
3711}
3712
3713bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
3714 ASTReaderListener &Listener) {
3715 FileSystemOptions FSOpts;
3716 unsigned Idx = 0;
3717 FSOpts.WorkingDir = ReadString(Record, Idx);
3718 return Listener.ReadFileSystemOptions(FSOpts, Complain);
3719}
3720
3721bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
3722 bool Complain,
3723 ASTReaderListener &Listener) {
3724 HeaderSearchOptions HSOpts;
3725 unsigned Idx = 0;
3726 HSOpts.Sysroot = ReadString(Record, Idx);
3727
3728 // Include entries.
3729 for (unsigned N = Record[Idx++]; N; --N) {
3730 std::string Path = ReadString(Record, Idx);
3731 frontend::IncludeDirGroup Group
3732 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003733 bool IsFramework = Record[Idx++];
3734 bool IgnoreSysRoot = Record[Idx++];
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003735 HSOpts.UserEntries.push_back(
Daniel Dunbar59fd6352013-01-30 00:34:26 +00003736 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003737 }
3738
3739 // System header prefixes.
3740 for (unsigned N = Record[Idx++]; N; --N) {
3741 std::string Prefix = ReadString(Record, Idx);
3742 bool IsSystemHeader = Record[Idx++];
3743 HSOpts.SystemHeaderPrefixes.push_back(
3744 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
3745 }
3746
3747 HSOpts.ResourceDir = ReadString(Record, Idx);
3748 HSOpts.ModuleCachePath = ReadString(Record, Idx);
3749 HSOpts.DisableModuleHash = Record[Idx++];
3750 HSOpts.UseBuiltinIncludes = Record[Idx++];
3751 HSOpts.UseStandardSystemIncludes = Record[Idx++];
3752 HSOpts.UseStandardCXXIncludes = Record[Idx++];
3753 HSOpts.UseLibcxx = Record[Idx++];
3754
3755 return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
3756}
3757
3758bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
3759 bool Complain,
3760 ASTReaderListener &Listener,
3761 std::string &SuggestedPredefines) {
3762 PreprocessorOptions PPOpts;
3763 unsigned Idx = 0;
3764
3765 // Macro definitions/undefs
3766 for (unsigned N = Record[Idx++]; N; --N) {
3767 std::string Macro = ReadString(Record, Idx);
3768 bool IsUndef = Record[Idx++];
3769 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
3770 }
3771
3772 // Includes
3773 for (unsigned N = Record[Idx++]; N; --N) {
3774 PPOpts.Includes.push_back(ReadString(Record, Idx));
3775 }
3776
3777 // Macro Includes
3778 for (unsigned N = Record[Idx++]; N; --N) {
3779 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
3780 }
3781
3782 PPOpts.UsePredefines = Record[Idx++];
3783 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
3784 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
3785 PPOpts.ObjCXXARCStandardLibrary =
3786 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
3787 SuggestedPredefines.clear();
3788 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
3789 SuggestedPredefines);
3790}
3791
3792std::pair<ModuleFile *, unsigned>
3793ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
3794 GlobalPreprocessedEntityMapType::iterator
3795 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
3796 assert(I != GlobalPreprocessedEntityMap.end() &&
3797 "Corrupted global preprocessed entity map");
3798 ModuleFile *M = I->second;
3799 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
3800 return std::make_pair(M, LocalIndex);
3801}
3802
3803std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
3804ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
3805 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
3806 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
3807 Mod.NumPreprocessedEntities);
3808
3809 return std::make_pair(PreprocessingRecord::iterator(),
3810 PreprocessingRecord::iterator());
3811}
3812
3813std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
3814ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
3815 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
3816 ModuleDeclIterator(this, &Mod,
3817 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
3818}
3819
3820PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
3821 PreprocessedEntityID PPID = Index+1;
3822 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
3823 ModuleFile &M = *PPInfo.first;
3824 unsigned LocalIndex = PPInfo.second;
3825 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
3826
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003827 if (!PP.getPreprocessingRecord()) {
3828 Error("no preprocessing record");
3829 return 0;
3830 }
3831
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00003832 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
3833 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
3834
3835 llvm::BitstreamEntry Entry =
3836 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
3837 if (Entry.Kind != llvm::BitstreamEntry::Record)
3838 return 0;
3839
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003840 // Read the record.
3841 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
3842 ReadSourceLocation(M, PPOffs.End));
3843 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003844 StringRef Blob;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003845 RecordData Record;
3846 PreprocessorDetailRecordTypes RecType =
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003847 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
3848 Entry.ID, Record, &Blob);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003849 switch (RecType) {
3850 case PPD_MACRO_EXPANSION: {
3851 bool isBuiltin = Record[0];
3852 IdentifierInfo *Name = 0;
3853 MacroDefinition *Def = 0;
3854 if (isBuiltin)
3855 Name = getLocalIdentifier(M, Record[1]);
3856 else {
3857 PreprocessedEntityID
3858 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
3859 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
3860 }
3861
3862 MacroExpansion *ME;
3863 if (isBuiltin)
3864 ME = new (PPRec) MacroExpansion(Name, Range);
3865 else
3866 ME = new (PPRec) MacroExpansion(Def, Range);
3867
3868 return ME;
3869 }
3870
3871 case PPD_MACRO_DEFINITION: {
3872 // Decode the identifier info and then check again; if the macro is
3873 // still defined and associated with the identifier,
3874 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
3875 MacroDefinition *MD
3876 = new (PPRec) MacroDefinition(II, Range);
3877
3878 if (DeserializationListener)
3879 DeserializationListener->MacroDefinitionRead(PPID, MD);
3880
3881 return MD;
3882 }
3883
3884 case PPD_INCLUSION_DIRECTIVE: {
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003885 const char *FullFileNameStart = Blob.data() + Record[0];
3886 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003887 const FileEntry *File = 0;
3888 if (!FullFileName.empty())
3889 File = PP.getFileManager().getFile(FullFileName);
3890
3891 // FIXME: Stable encoding
3892 InclusionDirective::InclusionKind Kind
3893 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
3894 InclusionDirective *ID
3895 = new (PPRec) InclusionDirective(PPRec, Kind,
Chris Lattnerb3ce3572013-01-20 02:38:54 +00003896 StringRef(Blob.data(), Record[0]),
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003897 Record[1], Record[3],
3898 File,
3899 Range);
3900 return ID;
3901 }
3902 }
3903
3904 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
3905}
3906
3907/// \brief \arg SLocMapI points at a chunk of a module that contains no
3908/// preprocessed entities or the entities it contains are not the ones we are
3909/// looking for. Find the next module that contains entities and return the ID
3910/// of the first entry.
3911PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
3912 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
3913 ++SLocMapI;
3914 for (GlobalSLocOffsetMapType::const_iterator
3915 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
3916 ModuleFile &M = *SLocMapI->second;
3917 if (M.NumPreprocessedEntities)
3918 return M.BasePreprocessedEntityID;
3919 }
3920
3921 return getTotalNumPreprocessedEntities();
3922}
3923
3924namespace {
3925
3926template <unsigned PPEntityOffset::*PPLoc>
3927struct PPEntityComp {
3928 const ASTReader &Reader;
3929 ModuleFile &M;
3930
3931 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
3932
3933 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
3934 SourceLocation LHS = getLoc(L);
3935 SourceLocation RHS = getLoc(R);
3936 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
3937 }
3938
3939 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
3940 SourceLocation LHS = getLoc(L);
3941 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
3942 }
3943
3944 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
3945 SourceLocation RHS = getLoc(R);
3946 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
3947 }
3948
3949 SourceLocation getLoc(const PPEntityOffset &PPE) const {
3950 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
3951 }
3952};
3953
3954}
3955
3956/// \brief Returns the first preprocessed entity ID that ends after \arg BLoc.
3957PreprocessedEntityID
3958ASTReader::findBeginPreprocessedEntity(SourceLocation BLoc) const {
3959 if (SourceMgr.isLocalSourceLocation(BLoc))
3960 return getTotalNumPreprocessedEntities();
3961
3962 GlobalSLocOffsetMapType::const_iterator
3963 SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset -
3964 BLoc.getOffset());
3965 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
3966 "Corrupted global sloc offset map");
3967
3968 if (SLocMapI->second->NumPreprocessedEntities == 0)
3969 return findNextPreprocessedEntity(SLocMapI);
3970
3971 ModuleFile &M = *SLocMapI->second;
3972 typedef const PPEntityOffset *pp_iterator;
3973 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
3974 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
3975
3976 size_t Count = M.NumPreprocessedEntities;
3977 size_t Half;
3978 pp_iterator First = pp_begin;
3979 pp_iterator PPI;
3980
3981 // Do a binary search manually instead of using std::lower_bound because
3982 // The end locations of entities may be unordered (when a macro expansion
3983 // is inside another macro argument), but for this case it is not important
3984 // whether we get the first macro expansion or its containing macro.
3985 while (Count > 0) {
3986 Half = Count/2;
3987 PPI = First;
3988 std::advance(PPI, Half);
3989 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
3990 BLoc)){
3991 First = PPI;
3992 ++First;
3993 Count = Count - Half - 1;
3994 } else
3995 Count = Half;
3996 }
3997
3998 if (PPI == pp_end)
3999 return findNextPreprocessedEntity(SLocMapI);
4000
4001 return M.BasePreprocessedEntityID + (PPI - pp_begin);
4002}
4003
4004/// \brief Returns the first preprocessed entity ID that begins after \arg ELoc.
4005PreprocessedEntityID
4006ASTReader::findEndPreprocessedEntity(SourceLocation ELoc) const {
4007 if (SourceMgr.isLocalSourceLocation(ELoc))
4008 return getTotalNumPreprocessedEntities();
4009
4010 GlobalSLocOffsetMapType::const_iterator
4011 SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset -
4012 ELoc.getOffset());
4013 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4014 "Corrupted global sloc offset map");
4015
4016 if (SLocMapI->second->NumPreprocessedEntities == 0)
4017 return findNextPreprocessedEntity(SLocMapI);
4018
4019 ModuleFile &M = *SLocMapI->second;
4020 typedef const PPEntityOffset *pp_iterator;
4021 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4022 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4023 pp_iterator PPI =
4024 std::upper_bound(pp_begin, pp_end, ELoc,
4025 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4026
4027 if (PPI == pp_end)
4028 return findNextPreprocessedEntity(SLocMapI);
4029
4030 return M.BasePreprocessedEntityID + (PPI - pp_begin);
4031}
4032
4033/// \brief Returns a pair of [Begin, End) indices of preallocated
4034/// preprocessed entities that \arg Range encompasses.
4035std::pair<unsigned, unsigned>
4036 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
4037 if (Range.isInvalid())
4038 return std::make_pair(0,0);
4039 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
4040
4041 PreprocessedEntityID BeginID = findBeginPreprocessedEntity(Range.getBegin());
4042 PreprocessedEntityID EndID = findEndPreprocessedEntity(Range.getEnd());
4043 return std::make_pair(BeginID, EndID);
4044}
4045
4046/// \brief Optionally returns true or false if the preallocated preprocessed
4047/// entity with index \arg Index came from file \arg FID.
David Blaikiedc84cd52013-02-20 22:23:23 +00004048Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004049 FileID FID) {
4050 if (FID.isInvalid())
4051 return false;
4052
4053 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4054 ModuleFile &M = *PPInfo.first;
4055 unsigned LocalIndex = PPInfo.second;
4056 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4057
4058 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
4059 if (Loc.isInvalid())
4060 return false;
4061
4062 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
4063 return true;
4064 else
4065 return false;
4066}
4067
4068namespace {
4069 /// \brief Visitor used to search for information about a header file.
4070 class HeaderFileInfoVisitor {
4071 ASTReader &Reader;
4072 const FileEntry *FE;
4073
David Blaikiedc84cd52013-02-20 22:23:23 +00004074 Optional<HeaderFileInfo> HFI;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004075
4076 public:
4077 HeaderFileInfoVisitor(ASTReader &Reader, const FileEntry *FE)
4078 : Reader(Reader), FE(FE) { }
4079
4080 static bool visit(ModuleFile &M, void *UserData) {
4081 HeaderFileInfoVisitor *This
4082 = static_cast<HeaderFileInfoVisitor *>(UserData);
4083
4084 HeaderFileInfoTrait Trait(This->Reader, M,
4085 &This->Reader.getPreprocessor().getHeaderSearchInfo(),
4086 M.HeaderFileFrameworkStrings,
4087 This->FE->getName());
4088
4089 HeaderFileInfoLookupTable *Table
4090 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
4091 if (!Table)
4092 return false;
4093
4094 // Look in the on-disk hash table for an entry for this file name.
4095 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE->getName(),
4096 &Trait);
4097 if (Pos == Table->end())
4098 return false;
4099
4100 This->HFI = *Pos;
4101 return true;
4102 }
4103
David Blaikiedc84cd52013-02-20 22:23:23 +00004104 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004105 };
4106}
4107
4108HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
4109 HeaderFileInfoVisitor Visitor(*this, FE);
4110 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
David Blaikiedc84cd52013-02-20 22:23:23 +00004111 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004112 if (Listener)
4113 Listener->ReadHeaderFileInfo(*HFI, FE->getUID());
4114 return *HFI;
4115 }
4116
4117 return HeaderFileInfo();
4118}
4119
4120void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
4121 // FIXME: Make it work properly with modules.
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00004122 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004123 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
4124 ModuleFile &F = *(*I);
4125 unsigned Idx = 0;
4126 DiagStates.clear();
4127 assert(!Diag.DiagStates.empty());
4128 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
4129 while (Idx < F.PragmaDiagMappings.size()) {
4130 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
4131 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
4132 if (DiagStateID != 0) {
4133 Diag.DiagStatePoints.push_back(
4134 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
4135 FullSourceLoc(Loc, SourceMgr)));
4136 continue;
4137 }
4138
4139 assert(DiagStateID == 0);
4140 // A new DiagState was created here.
4141 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
4142 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
4143 DiagStates.push_back(NewState);
4144 Diag.DiagStatePoints.push_back(
4145 DiagnosticsEngine::DiagStatePoint(NewState,
4146 FullSourceLoc(Loc, SourceMgr)));
4147 while (1) {
4148 assert(Idx < F.PragmaDiagMappings.size() &&
4149 "Invalid data, didn't find '-1' marking end of diag/map pairs");
4150 if (Idx >= F.PragmaDiagMappings.size()) {
4151 break; // Something is messed up but at least avoid infinite loop in
4152 // release build.
4153 }
4154 unsigned DiagID = F.PragmaDiagMappings[Idx++];
4155 if (DiagID == (unsigned)-1) {
4156 break; // no more diag/map pairs for this location.
4157 }
4158 diag::Mapping Map = (diag::Mapping)F.PragmaDiagMappings[Idx++];
4159 DiagnosticMappingInfo MappingInfo = Diag.makeMappingInfo(Map, Loc);
4160 Diag.GetCurDiagState()->setMappingInfo(DiagID, MappingInfo);
4161 }
4162 }
4163 }
4164}
4165
4166/// \brief Get the correct cursor and offset for loading a type.
4167ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
4168 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
4169 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
4170 ModuleFile *M = I->second;
4171 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
4172}
4173
4174/// \brief Read and return the type with the given index..
4175///
4176/// The index is the type ID, shifted and minus the number of predefs. This
4177/// routine actually reads the record corresponding to the type at the given
4178/// location. It is a helper routine for GetType, which deals with reading type
4179/// IDs.
4180QualType ASTReader::readTypeRecord(unsigned Index) {
4181 RecordLocation Loc = TypeCursorForIndex(Index);
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00004182 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004183
4184 // Keep track of where we are in the stream, then jump back there
4185 // after reading this type.
4186 SavedStreamPosition SavedPosition(DeclsCursor);
4187
4188 ReadingKindTracker ReadingKind(Read_Type, *this);
4189
4190 // Note that we are loading a type record.
4191 Deserializing AType(this);
4192
4193 unsigned Idx = 0;
4194 DeclsCursor.JumpToBit(Loc.Offset);
4195 RecordData Record;
4196 unsigned Code = DeclsCursor.ReadCode();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00004197 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004198 case TYPE_EXT_QUAL: {
4199 if (Record.size() != 2) {
4200 Error("Incorrect encoding of extended qualifier type");
4201 return QualType();
4202 }
4203 QualType Base = readType(*Loc.F, Record, Idx);
4204 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
4205 return Context.getQualifiedType(Base, Quals);
4206 }
4207
4208 case TYPE_COMPLEX: {
4209 if (Record.size() != 1) {
4210 Error("Incorrect encoding of complex type");
4211 return QualType();
4212 }
4213 QualType ElemType = readType(*Loc.F, Record, Idx);
4214 return Context.getComplexType(ElemType);
4215 }
4216
4217 case TYPE_POINTER: {
4218 if (Record.size() != 1) {
4219 Error("Incorrect encoding of pointer type");
4220 return QualType();
4221 }
4222 QualType PointeeType = readType(*Loc.F, Record, Idx);
4223 return Context.getPointerType(PointeeType);
4224 }
4225
4226 case TYPE_BLOCK_POINTER: {
4227 if (Record.size() != 1) {
4228 Error("Incorrect encoding of block pointer type");
4229 return QualType();
4230 }
4231 QualType PointeeType = readType(*Loc.F, Record, Idx);
4232 return Context.getBlockPointerType(PointeeType);
4233 }
4234
4235 case TYPE_LVALUE_REFERENCE: {
4236 if (Record.size() != 2) {
4237 Error("Incorrect encoding of lvalue reference type");
4238 return QualType();
4239 }
4240 QualType PointeeType = readType(*Loc.F, Record, Idx);
4241 return Context.getLValueReferenceType(PointeeType, Record[1]);
4242 }
4243
4244 case TYPE_RVALUE_REFERENCE: {
4245 if (Record.size() != 1) {
4246 Error("Incorrect encoding of rvalue reference type");
4247 return QualType();
4248 }
4249 QualType PointeeType = readType(*Loc.F, Record, Idx);
4250 return Context.getRValueReferenceType(PointeeType);
4251 }
4252
4253 case TYPE_MEMBER_POINTER: {
4254 if (Record.size() != 2) {
4255 Error("Incorrect encoding of member pointer type");
4256 return QualType();
4257 }
4258 QualType PointeeType = readType(*Loc.F, Record, Idx);
4259 QualType ClassType = readType(*Loc.F, Record, Idx);
4260 if (PointeeType.isNull() || ClassType.isNull())
4261 return QualType();
4262
4263 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
4264 }
4265
4266 case TYPE_CONSTANT_ARRAY: {
4267 QualType ElementType = readType(*Loc.F, Record, Idx);
4268 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
4269 unsigned IndexTypeQuals = Record[2];
4270 unsigned Idx = 3;
4271 llvm::APInt Size = ReadAPInt(Record, Idx);
4272 return Context.getConstantArrayType(ElementType, Size,
4273 ASM, IndexTypeQuals);
4274 }
4275
4276 case TYPE_INCOMPLETE_ARRAY: {
4277 QualType ElementType = readType(*Loc.F, Record, Idx);
4278 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
4279 unsigned IndexTypeQuals = Record[2];
4280 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
4281 }
4282
4283 case TYPE_VARIABLE_ARRAY: {
4284 QualType ElementType = readType(*Loc.F, Record, Idx);
4285 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
4286 unsigned IndexTypeQuals = Record[2];
4287 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
4288 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
4289 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
4290 ASM, IndexTypeQuals,
4291 SourceRange(LBLoc, RBLoc));
4292 }
4293
4294 case TYPE_VECTOR: {
4295 if (Record.size() != 3) {
4296 Error("incorrect encoding of vector type in AST file");
4297 return QualType();
4298 }
4299
4300 QualType ElementType = readType(*Loc.F, Record, Idx);
4301 unsigned NumElements = Record[1];
4302 unsigned VecKind = Record[2];
4303 return Context.getVectorType(ElementType, NumElements,
4304 (VectorType::VectorKind)VecKind);
4305 }
4306
4307 case TYPE_EXT_VECTOR: {
4308 if (Record.size() != 3) {
4309 Error("incorrect encoding of extended vector type in AST file");
4310 return QualType();
4311 }
4312
4313 QualType ElementType = readType(*Loc.F, Record, Idx);
4314 unsigned NumElements = Record[1];
4315 return Context.getExtVectorType(ElementType, NumElements);
4316 }
4317
4318 case TYPE_FUNCTION_NO_PROTO: {
4319 if (Record.size() != 6) {
4320 Error("incorrect encoding of no-proto function type");
4321 return QualType();
4322 }
4323 QualType ResultType = readType(*Loc.F, Record, Idx);
4324 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
4325 (CallingConv)Record[4], Record[5]);
4326 return Context.getFunctionNoProtoType(ResultType, Info);
4327 }
4328
4329 case TYPE_FUNCTION_PROTO: {
4330 QualType ResultType = readType(*Loc.F, Record, Idx);
4331
4332 FunctionProtoType::ExtProtoInfo EPI;
4333 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
4334 /*hasregparm*/ Record[2],
4335 /*regparm*/ Record[3],
4336 static_cast<CallingConv>(Record[4]),
4337 /*produces*/ Record[5]);
4338
4339 unsigned Idx = 6;
4340 unsigned NumParams = Record[Idx++];
4341 SmallVector<QualType, 16> ParamTypes;
4342 for (unsigned I = 0; I != NumParams; ++I)
4343 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
4344
4345 EPI.Variadic = Record[Idx++];
4346 EPI.HasTrailingReturn = Record[Idx++];
4347 EPI.TypeQuals = Record[Idx++];
4348 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
4349 ExceptionSpecificationType EST =
4350 static_cast<ExceptionSpecificationType>(Record[Idx++]);
4351 EPI.ExceptionSpecType = EST;
4352 SmallVector<QualType, 2> Exceptions;
4353 if (EST == EST_Dynamic) {
4354 EPI.NumExceptions = Record[Idx++];
4355 for (unsigned I = 0; I != EPI.NumExceptions; ++I)
4356 Exceptions.push_back(readType(*Loc.F, Record, Idx));
4357 EPI.Exceptions = Exceptions.data();
4358 } else if (EST == EST_ComputedNoexcept) {
4359 EPI.NoexceptExpr = ReadExpr(*Loc.F);
4360 } else if (EST == EST_Uninstantiated) {
4361 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
4362 EPI.ExceptionSpecTemplate = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
4363 } else if (EST == EST_Unevaluated) {
4364 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
4365 }
4366 return Context.getFunctionType(ResultType, ParamTypes.data(), NumParams,
4367 EPI);
4368 }
4369
4370 case TYPE_UNRESOLVED_USING: {
4371 unsigned Idx = 0;
4372 return Context.getTypeDeclType(
4373 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
4374 }
4375
4376 case TYPE_TYPEDEF: {
4377 if (Record.size() != 2) {
4378 Error("incorrect encoding of typedef type");
4379 return QualType();
4380 }
4381 unsigned Idx = 0;
4382 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
4383 QualType Canonical = readType(*Loc.F, Record, Idx);
4384 if (!Canonical.isNull())
4385 Canonical = Context.getCanonicalType(Canonical);
4386 return Context.getTypedefType(Decl, Canonical);
4387 }
4388
4389 case TYPE_TYPEOF_EXPR:
4390 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
4391
4392 case TYPE_TYPEOF: {
4393 if (Record.size() != 1) {
4394 Error("incorrect encoding of typeof(type) in AST file");
4395 return QualType();
4396 }
4397 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
4398 return Context.getTypeOfType(UnderlyingType);
4399 }
4400
4401 case TYPE_DECLTYPE: {
4402 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
4403 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
4404 }
4405
4406 case TYPE_UNARY_TRANSFORM: {
4407 QualType BaseType = readType(*Loc.F, Record, Idx);
4408 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
4409 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
4410 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
4411 }
4412
4413 case TYPE_AUTO:
4414 return Context.getAutoType(readType(*Loc.F, Record, Idx));
4415
4416 case TYPE_RECORD: {
4417 if (Record.size() != 2) {
4418 Error("incorrect encoding of record type");
4419 return QualType();
4420 }
4421 unsigned Idx = 0;
4422 bool IsDependent = Record[Idx++];
4423 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
4424 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
4425 QualType T = Context.getRecordType(RD);
4426 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4427 return T;
4428 }
4429
4430 case TYPE_ENUM: {
4431 if (Record.size() != 2) {
4432 Error("incorrect encoding of enum type");
4433 return QualType();
4434 }
4435 unsigned Idx = 0;
4436 bool IsDependent = Record[Idx++];
4437 QualType T
4438 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
4439 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4440 return T;
4441 }
4442
4443 case TYPE_ATTRIBUTED: {
4444 if (Record.size() != 3) {
4445 Error("incorrect encoding of attributed type");
4446 return QualType();
4447 }
4448 QualType modifiedType = readType(*Loc.F, Record, Idx);
4449 QualType equivalentType = readType(*Loc.F, Record, Idx);
4450 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
4451 return Context.getAttributedType(kind, modifiedType, equivalentType);
4452 }
4453
4454 case TYPE_PAREN: {
4455 if (Record.size() != 1) {
4456 Error("incorrect encoding of paren type");
4457 return QualType();
4458 }
4459 QualType InnerType = readType(*Loc.F, Record, Idx);
4460 return Context.getParenType(InnerType);
4461 }
4462
4463 case TYPE_PACK_EXPANSION: {
4464 if (Record.size() != 2) {
4465 Error("incorrect encoding of pack expansion type");
4466 return QualType();
4467 }
4468 QualType Pattern = readType(*Loc.F, Record, Idx);
4469 if (Pattern.isNull())
4470 return QualType();
David Blaikiedc84cd52013-02-20 22:23:23 +00004471 Optional<unsigned> NumExpansions;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004472 if (Record[1])
4473 NumExpansions = Record[1] - 1;
4474 return Context.getPackExpansionType(Pattern, NumExpansions);
4475 }
4476
4477 case TYPE_ELABORATED: {
4478 unsigned Idx = 0;
4479 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4480 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4481 QualType NamedType = readType(*Loc.F, Record, Idx);
4482 return Context.getElaboratedType(Keyword, NNS, NamedType);
4483 }
4484
4485 case TYPE_OBJC_INTERFACE: {
4486 unsigned Idx = 0;
4487 ObjCInterfaceDecl *ItfD
4488 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
4489 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
4490 }
4491
4492 case TYPE_OBJC_OBJECT: {
4493 unsigned Idx = 0;
4494 QualType Base = readType(*Loc.F, Record, Idx);
4495 unsigned NumProtos = Record[Idx++];
4496 SmallVector<ObjCProtocolDecl*, 4> Protos;
4497 for (unsigned I = 0; I != NumProtos; ++I)
4498 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
4499 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
4500 }
4501
4502 case TYPE_OBJC_OBJECT_POINTER: {
4503 unsigned Idx = 0;
4504 QualType Pointee = readType(*Loc.F, Record, Idx);
4505 return Context.getObjCObjectPointerType(Pointee);
4506 }
4507
4508 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
4509 unsigned Idx = 0;
4510 QualType Parm = readType(*Loc.F, Record, Idx);
4511 QualType Replacement = readType(*Loc.F, Record, Idx);
4512 return
4513 Context.getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm),
4514 Replacement);
4515 }
4516
4517 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
4518 unsigned Idx = 0;
4519 QualType Parm = readType(*Loc.F, Record, Idx);
4520 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
4521 return Context.getSubstTemplateTypeParmPackType(
4522 cast<TemplateTypeParmType>(Parm),
4523 ArgPack);
4524 }
4525
4526 case TYPE_INJECTED_CLASS_NAME: {
4527 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
4528 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
4529 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
4530 // for AST reading, too much interdependencies.
4531 return
4532 QualType(new (Context, TypeAlignment) InjectedClassNameType(D, TST), 0);
4533 }
4534
4535 case TYPE_TEMPLATE_TYPE_PARM: {
4536 unsigned Idx = 0;
4537 unsigned Depth = Record[Idx++];
4538 unsigned Index = Record[Idx++];
4539 bool Pack = Record[Idx++];
4540 TemplateTypeParmDecl *D
4541 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
4542 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
4543 }
4544
4545 case TYPE_DEPENDENT_NAME: {
4546 unsigned Idx = 0;
4547 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4548 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4549 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
4550 QualType Canon = readType(*Loc.F, Record, Idx);
4551 if (!Canon.isNull())
4552 Canon = Context.getCanonicalType(Canon);
4553 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
4554 }
4555
4556 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
4557 unsigned Idx = 0;
4558 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4559 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4560 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
4561 unsigned NumArgs = Record[Idx++];
4562 SmallVector<TemplateArgument, 8> Args;
4563 Args.reserve(NumArgs);
4564 while (NumArgs--)
4565 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
4566 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
4567 Args.size(), Args.data());
4568 }
4569
4570 case TYPE_DEPENDENT_SIZED_ARRAY: {
4571 unsigned Idx = 0;
4572
4573 // ArrayType
4574 QualType ElementType = readType(*Loc.F, Record, Idx);
4575 ArrayType::ArraySizeModifier ASM
4576 = (ArrayType::ArraySizeModifier)Record[Idx++];
4577 unsigned IndexTypeQuals = Record[Idx++];
4578
4579 // DependentSizedArrayType
4580 Expr *NumElts = ReadExpr(*Loc.F);
4581 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
4582
4583 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
4584 IndexTypeQuals, Brackets);
4585 }
4586
4587 case TYPE_TEMPLATE_SPECIALIZATION: {
4588 unsigned Idx = 0;
4589 bool IsDependent = Record[Idx++];
4590 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
4591 SmallVector<TemplateArgument, 8> Args;
4592 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
4593 QualType Underlying = readType(*Loc.F, Record, Idx);
4594 QualType T;
4595 if (Underlying.isNull())
4596 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
4597 Args.size());
4598 else
4599 T = Context.getTemplateSpecializationType(Name, Args.data(),
4600 Args.size(), Underlying);
4601 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4602 return T;
4603 }
4604
4605 case TYPE_ATOMIC: {
4606 if (Record.size() != 1) {
4607 Error("Incorrect encoding of atomic type");
4608 return QualType();
4609 }
4610 QualType ValueType = readType(*Loc.F, Record, Idx);
4611 return Context.getAtomicType(ValueType);
4612 }
4613 }
4614 llvm_unreachable("Invalid TypeCode!");
4615}
4616
4617class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
4618 ASTReader &Reader;
4619 ModuleFile &F;
4620 const ASTReader::RecordData &Record;
4621 unsigned &Idx;
4622
4623 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
4624 unsigned &I) {
4625 return Reader.ReadSourceLocation(F, R, I);
4626 }
4627
4628 template<typename T>
4629 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
4630 return Reader.ReadDeclAs<T>(F, Record, Idx);
4631 }
4632
4633public:
4634 TypeLocReader(ASTReader &Reader, ModuleFile &F,
4635 const ASTReader::RecordData &Record, unsigned &Idx)
4636 : Reader(Reader), F(F), Record(Record), Idx(Idx)
4637 { }
4638
4639 // We want compile-time assurance that we've enumerated all of
4640 // these, so unfortunately we have to declare them first, then
4641 // define them out-of-line.
4642#define ABSTRACT_TYPELOC(CLASS, PARENT)
4643#define TYPELOC(CLASS, PARENT) \
4644 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
4645#include "clang/AST/TypeLocNodes.def"
4646
4647 void VisitFunctionTypeLoc(FunctionTypeLoc);
4648 void VisitArrayTypeLoc(ArrayTypeLoc);
4649};
4650
4651void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
4652 // nothing to do
4653}
4654void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
4655 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
4656 if (TL.needsExtraLocalData()) {
4657 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
4658 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
4659 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
4660 TL.setModeAttr(Record[Idx++]);
4661 }
4662}
4663void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
4664 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4665}
4666void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
4667 TL.setStarLoc(ReadSourceLocation(Record, Idx));
4668}
4669void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
4670 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
4671}
4672void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
4673 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
4674}
4675void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
4676 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
4677}
4678void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
4679 TL.setStarLoc(ReadSourceLocation(Record, Idx));
4680 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4681}
4682void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
4683 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
4684 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
4685 if (Record[Idx++])
4686 TL.setSizeExpr(Reader.ReadExpr(F));
4687 else
4688 TL.setSizeExpr(0);
4689}
4690void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
4691 VisitArrayTypeLoc(TL);
4692}
4693void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
4694 VisitArrayTypeLoc(TL);
4695}
4696void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
4697 VisitArrayTypeLoc(TL);
4698}
4699void TypeLocReader::VisitDependentSizedArrayTypeLoc(
4700 DependentSizedArrayTypeLoc TL) {
4701 VisitArrayTypeLoc(TL);
4702}
4703void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
4704 DependentSizedExtVectorTypeLoc TL) {
4705 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4706}
4707void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
4708 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4709}
4710void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
4711 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4712}
4713void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
4714 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
4715 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4716 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4717 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
4718 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
4719 TL.setArg(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
4720 }
4721}
4722void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
4723 VisitFunctionTypeLoc(TL);
4724}
4725void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
4726 VisitFunctionTypeLoc(TL);
4727}
4728void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
4729 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4730}
4731void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
4732 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4733}
4734void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
4735 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
4736 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4737 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4738}
4739void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
4740 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
4741 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4742 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4743 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4744}
4745void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
4746 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4747}
4748void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
4749 TL.setKWLoc(ReadSourceLocation(Record, Idx));
4750 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4751 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4752 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4753}
4754void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
4755 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4756}
4757void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
4758 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4759}
4760void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
4761 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4762}
4763void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
4764 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
4765 if (TL.hasAttrOperand()) {
4766 SourceRange range;
4767 range.setBegin(ReadSourceLocation(Record, Idx));
4768 range.setEnd(ReadSourceLocation(Record, Idx));
4769 TL.setAttrOperandParensRange(range);
4770 }
4771 if (TL.hasAttrExprOperand()) {
4772 if (Record[Idx++])
4773 TL.setAttrExprOperand(Reader.ReadExpr(F));
4774 else
4775 TL.setAttrExprOperand(0);
4776 } else if (TL.hasAttrEnumOperand())
4777 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
4778}
4779void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
4780 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4781}
4782void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
4783 SubstTemplateTypeParmTypeLoc TL) {
4784 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4785}
4786void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
4787 SubstTemplateTypeParmPackTypeLoc TL) {
4788 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4789}
4790void TypeLocReader::VisitTemplateSpecializationTypeLoc(
4791 TemplateSpecializationTypeLoc TL) {
4792 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
4793 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
4794 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4795 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4796 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
4797 TL.setArgLocInfo(i,
4798 Reader.GetTemplateArgumentLocInfo(F,
4799 TL.getTypePtr()->getArg(i).getKind(),
4800 Record, Idx));
4801}
4802void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
4803 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4804 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4805}
4806void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
4807 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
4808 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4809}
4810void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
4811 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4812}
4813void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
4814 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
4815 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4816 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4817}
4818void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
4819 DependentTemplateSpecializationTypeLoc TL) {
4820 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
4821 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4822 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
4823 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
4824 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4825 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4826 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
4827 TL.setArgLocInfo(I,
4828 Reader.GetTemplateArgumentLocInfo(F,
4829 TL.getTypePtr()->getArg(I).getKind(),
4830 Record, Idx));
4831}
4832void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
4833 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
4834}
4835void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
4836 TL.setNameLoc(ReadSourceLocation(Record, Idx));
4837}
4838void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
4839 TL.setHasBaseTypeAsWritten(Record[Idx++]);
4840 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4841 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4842 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
4843 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
4844}
4845void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
4846 TL.setStarLoc(ReadSourceLocation(Record, Idx));
4847}
4848void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
4849 TL.setKWLoc(ReadSourceLocation(Record, Idx));
4850 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4851 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4852}
4853
4854TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
4855 const RecordData &Record,
4856 unsigned &Idx) {
4857 QualType InfoTy = readType(F, Record, Idx);
4858 if (InfoTy.isNull())
4859 return 0;
4860
4861 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
4862 TypeLocReader TLR(*this, F, Record, Idx);
4863 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
4864 TLR.Visit(TL);
4865 return TInfo;
4866}
4867
4868QualType ASTReader::GetType(TypeID ID) {
4869 unsigned FastQuals = ID & Qualifiers::FastMask;
4870 unsigned Index = ID >> Qualifiers::FastWidth;
4871
4872 if (Index < NUM_PREDEF_TYPE_IDS) {
4873 QualType T;
4874 switch ((PredefinedTypeIDs)Index) {
4875 case PREDEF_TYPE_NULL_ID: return QualType();
4876 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
4877 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
4878
4879 case PREDEF_TYPE_CHAR_U_ID:
4880 case PREDEF_TYPE_CHAR_S_ID:
4881 // FIXME: Check that the signedness of CharTy is correct!
4882 T = Context.CharTy;
4883 break;
4884
4885 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
4886 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
4887 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
4888 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
4889 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
4890 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
4891 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
4892 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
4893 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
4894 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
4895 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
4896 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
4897 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
4898 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
4899 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
4900 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
4901 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
4902 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
4903 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
4904 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
4905 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
4906 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
4907 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
4908 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
4909 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
4910 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
4911 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
4912 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
Guy Benyeib13621d2012-12-18 14:38:23 +00004913 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
4914 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
4915 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
4916 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
4917 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
4918 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
Guy Benyei21f18c42013-02-07 10:55:47 +00004919 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
Guy Benyeie6b9d802013-01-20 12:31:11 +00004920 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004921 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
4922
4923 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
4924 T = Context.getAutoRRefDeductType();
4925 break;
4926
4927 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
4928 T = Context.ARCUnbridgedCastTy;
4929 break;
4930
4931 case PREDEF_TYPE_VA_LIST_TAG:
4932 T = Context.getVaListTagType();
4933 break;
4934
4935 case PREDEF_TYPE_BUILTIN_FN:
4936 T = Context.BuiltinFnTy;
4937 break;
4938 }
4939
4940 assert(!T.isNull() && "Unknown predefined type");
4941 return T.withFastQualifiers(FastQuals);
4942 }
4943
4944 Index -= NUM_PREDEF_TYPE_IDS;
4945 assert(Index < TypesLoaded.size() && "Type index out-of-range");
4946 if (TypesLoaded[Index].isNull()) {
4947 TypesLoaded[Index] = readTypeRecord(Index);
4948 if (TypesLoaded[Index].isNull())
4949 return QualType();
4950
4951 TypesLoaded[Index]->setFromAST();
4952 if (DeserializationListener)
4953 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
4954 TypesLoaded[Index]);
4955 }
4956
4957 return TypesLoaded[Index].withFastQualifiers(FastQuals);
4958}
4959
4960QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
4961 return GetType(getGlobalTypeID(F, LocalID));
4962}
4963
4964serialization::TypeID
4965ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
4966 unsigned FastQuals = LocalID & Qualifiers::FastMask;
4967 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
4968
4969 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
4970 return LocalID;
4971
4972 ContinuousRangeMap<uint32_t, int, 2>::iterator I
4973 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
4974 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
4975
4976 unsigned GlobalIndex = LocalIndex + I->second;
4977 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
4978}
4979
4980TemplateArgumentLocInfo
4981ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
4982 TemplateArgument::ArgKind Kind,
4983 const RecordData &Record,
4984 unsigned &Index) {
4985 switch (Kind) {
4986 case TemplateArgument::Expression:
4987 return ReadExpr(F);
4988 case TemplateArgument::Type:
4989 return GetTypeSourceInfo(F, Record, Index);
4990 case TemplateArgument::Template: {
4991 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
4992 Index);
4993 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
4994 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
4995 SourceLocation());
4996 }
4997 case TemplateArgument::TemplateExpansion: {
4998 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
4999 Index);
5000 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5001 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
5002 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5003 EllipsisLoc);
5004 }
5005 case TemplateArgument::Null:
5006 case TemplateArgument::Integral:
5007 case TemplateArgument::Declaration:
5008 case TemplateArgument::NullPtr:
5009 case TemplateArgument::Pack:
5010 // FIXME: Is this right?
5011 return TemplateArgumentLocInfo();
5012 }
5013 llvm_unreachable("unexpected template argument loc");
5014}
5015
5016TemplateArgumentLoc
5017ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
5018 const RecordData &Record, unsigned &Index) {
5019 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
5020
5021 if (Arg.getKind() == TemplateArgument::Expression) {
5022 if (Record[Index++]) // bool InfoHasSameExpr.
5023 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
5024 }
5025 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
5026 Record, Index));
5027}
5028
5029Decl *ASTReader::GetExternalDecl(uint32_t ID) {
5030 return GetDecl(ID);
5031}
5032
5033uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, const RecordData &Record,
5034 unsigned &Idx){
5035 if (Idx >= Record.size())
5036 return 0;
5037
5038 unsigned LocalID = Record[Idx++];
5039 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
5040}
5041
5042CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
5043 RecordLocation Loc = getLocalBitOffset(Offset);
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00005044 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005045 SavedStreamPosition SavedPosition(Cursor);
5046 Cursor.JumpToBit(Loc.Offset);
5047 ReadingKindTracker ReadingKind(Read_Decl, *this);
5048 RecordData Record;
5049 unsigned Code = Cursor.ReadCode();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00005050 unsigned RecCode = Cursor.readRecord(Code, Record);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005051 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
5052 Error("Malformed AST file: missing C++ base specifiers");
5053 return 0;
5054 }
5055
5056 unsigned Idx = 0;
5057 unsigned NumBases = Record[Idx++];
5058 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
5059 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
5060 for (unsigned I = 0; I != NumBases; ++I)
5061 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
5062 return Bases;
5063}
5064
5065serialization::DeclID
5066ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
5067 if (LocalID < NUM_PREDEF_DECL_IDS)
5068 return LocalID;
5069
5070 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5071 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
5072 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
5073
5074 return LocalID + I->second;
5075}
5076
5077bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
5078 ModuleFile &M) const {
5079 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
5080 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5081 return &M == I->second;
5082}
5083
Douglas Gregor5a04f9f2013-01-21 15:25:38 +00005084ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005085 if (!D->isFromASTFile())
5086 return 0;
5087 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
5088 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5089 return I->second;
5090}
5091
5092SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
5093 if (ID < NUM_PREDEF_DECL_IDS)
5094 return SourceLocation();
5095
5096 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
5097
5098 if (Index > DeclsLoaded.size()) {
5099 Error("declaration ID out-of-range for AST file");
5100 return SourceLocation();
5101 }
5102
5103 if (Decl *D = DeclsLoaded[Index])
5104 return D->getLocation();
5105
5106 unsigned RawLocation = 0;
5107 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
5108 return ReadSourceLocation(*Rec.F, RawLocation);
5109}
5110
5111Decl *ASTReader::GetDecl(DeclID ID) {
5112 if (ID < NUM_PREDEF_DECL_IDS) {
5113 switch ((PredefinedDeclIDs)ID) {
5114 case PREDEF_DECL_NULL_ID:
5115 return 0;
5116
5117 case PREDEF_DECL_TRANSLATION_UNIT_ID:
5118 return Context.getTranslationUnitDecl();
5119
5120 case PREDEF_DECL_OBJC_ID_ID:
5121 return Context.getObjCIdDecl();
5122
5123 case PREDEF_DECL_OBJC_SEL_ID:
5124 return Context.getObjCSelDecl();
5125
5126 case PREDEF_DECL_OBJC_CLASS_ID:
5127 return Context.getObjCClassDecl();
5128
5129 case PREDEF_DECL_OBJC_PROTOCOL_ID:
5130 return Context.getObjCProtocolDecl();
5131
5132 case PREDEF_DECL_INT_128_ID:
5133 return Context.getInt128Decl();
5134
5135 case PREDEF_DECL_UNSIGNED_INT_128_ID:
5136 return Context.getUInt128Decl();
5137
5138 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
5139 return Context.getObjCInstanceTypeDecl();
5140
5141 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
5142 return Context.getBuiltinVaListDecl();
5143 }
5144 }
5145
5146 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
5147
5148 if (Index >= DeclsLoaded.size()) {
5149 assert(0 && "declaration ID out-of-range for AST file");
5150 Error("declaration ID out-of-range for AST file");
5151 return 0;
5152 }
5153
5154 if (!DeclsLoaded[Index]) {
5155 ReadDeclRecord(ID);
5156 if (DeserializationListener)
5157 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
5158 }
5159
5160 return DeclsLoaded[Index];
5161}
5162
5163DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
5164 DeclID GlobalID) {
5165 if (GlobalID < NUM_PREDEF_DECL_IDS)
5166 return GlobalID;
5167
5168 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
5169 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5170 ModuleFile *Owner = I->second;
5171
5172 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
5173 = M.GlobalToLocalDeclIDs.find(Owner);
5174 if (Pos == M.GlobalToLocalDeclIDs.end())
5175 return 0;
5176
5177 return GlobalID - Owner->BaseDeclID + Pos->second;
5178}
5179
5180serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
5181 const RecordData &Record,
5182 unsigned &Idx) {
5183 if (Idx >= Record.size()) {
5184 Error("Corrupted AST file");
5185 return 0;
5186 }
5187
5188 return getGlobalDeclID(F, Record[Idx++]);
5189}
5190
5191/// \brief Resolve the offset of a statement into a statement.
5192///
5193/// This operation will read a new statement from the external
5194/// source each time it is called, and is meant to be used via a
5195/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
5196Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
5197 // Switch case IDs are per Decl.
5198 ClearSwitchCaseIDs();
5199
5200 // Offset here is a global offset across the entire chain.
5201 RecordLocation Loc = getLocalBitOffset(Offset);
5202 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
5203 return ReadStmtFromStream(*Loc.F);
5204}
5205
5206namespace {
5207 class FindExternalLexicalDeclsVisitor {
5208 ASTReader &Reader;
5209 const DeclContext *DC;
5210 bool (*isKindWeWant)(Decl::Kind);
5211
5212 SmallVectorImpl<Decl*> &Decls;
5213 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
5214
5215 public:
5216 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
5217 bool (*isKindWeWant)(Decl::Kind),
5218 SmallVectorImpl<Decl*> &Decls)
5219 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
5220 {
5221 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
5222 PredefsVisited[I] = false;
5223 }
5224
5225 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
5226 if (Preorder)
5227 return false;
5228
5229 FindExternalLexicalDeclsVisitor *This
5230 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
5231
5232 ModuleFile::DeclContextInfosMap::iterator Info
5233 = M.DeclContextInfos.find(This->DC);
5234 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
5235 return false;
5236
5237 // Load all of the declaration IDs
5238 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
5239 *IDE = ID + Info->second.NumLexicalDecls;
5240 ID != IDE; ++ID) {
5241 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
5242 continue;
5243
5244 // Don't add predefined declarations to the lexical context more
5245 // than once.
5246 if (ID->second < NUM_PREDEF_DECL_IDS) {
5247 if (This->PredefsVisited[ID->second])
5248 continue;
5249
5250 This->PredefsVisited[ID->second] = true;
5251 }
5252
5253 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
5254 if (!This->DC->isDeclInLexicalTraversal(D))
5255 This->Decls.push_back(D);
5256 }
5257 }
5258
5259 return false;
5260 }
5261 };
5262}
5263
5264ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
5265 bool (*isKindWeWant)(Decl::Kind),
5266 SmallVectorImpl<Decl*> &Decls) {
5267 // There might be lexical decls in multiple modules, for the TU at
5268 // least. Walk all of the modules in the order they were loaded.
5269 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
5270 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
5271 ++NumLexicalDeclContextsRead;
5272 return ELR_Success;
5273}
5274
5275namespace {
5276
5277class DeclIDComp {
5278 ASTReader &Reader;
5279 ModuleFile &Mod;
5280
5281public:
5282 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
5283
5284 bool operator()(LocalDeclID L, LocalDeclID R) const {
5285 SourceLocation LHS = getLocation(L);
5286 SourceLocation RHS = getLocation(R);
5287 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5288 }
5289
5290 bool operator()(SourceLocation LHS, LocalDeclID R) const {
5291 SourceLocation RHS = getLocation(R);
5292 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5293 }
5294
5295 bool operator()(LocalDeclID L, SourceLocation RHS) const {
5296 SourceLocation LHS = getLocation(L);
5297 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5298 }
5299
5300 SourceLocation getLocation(LocalDeclID ID) const {
5301 return Reader.getSourceManager().getFileLoc(
5302 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
5303 }
5304};
5305
5306}
5307
5308void ASTReader::FindFileRegionDecls(FileID File,
5309 unsigned Offset, unsigned Length,
5310 SmallVectorImpl<Decl *> &Decls) {
5311 SourceManager &SM = getSourceManager();
5312
5313 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
5314 if (I == FileDeclIDs.end())
5315 return;
5316
5317 FileDeclsInfo &DInfo = I->second;
5318 if (DInfo.Decls.empty())
5319 return;
5320
5321 SourceLocation
5322 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
5323 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
5324
5325 DeclIDComp DIDComp(*this, *DInfo.Mod);
5326 ArrayRef<serialization::LocalDeclID>::iterator
5327 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
5328 BeginLoc, DIDComp);
5329 if (BeginIt != DInfo.Decls.begin())
5330 --BeginIt;
5331
5332 // If we are pointing at a top-level decl inside an objc container, we need
5333 // to backtrack until we find it otherwise we will fail to report that the
5334 // region overlaps with an objc container.
5335 while (BeginIt != DInfo.Decls.begin() &&
5336 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
5337 ->isTopLevelDeclInObjCContainer())
5338 --BeginIt;
5339
5340 ArrayRef<serialization::LocalDeclID>::iterator
5341 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
5342 EndLoc, DIDComp);
5343 if (EndIt != DInfo.Decls.end())
5344 ++EndIt;
5345
5346 for (ArrayRef<serialization::LocalDeclID>::iterator
5347 DIt = BeginIt; DIt != EndIt; ++DIt)
5348 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
5349}
5350
5351namespace {
5352 /// \brief ModuleFile visitor used to perform name lookup into a
5353 /// declaration context.
5354 class DeclContextNameLookupVisitor {
5355 ASTReader &Reader;
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005356 SmallVectorImpl<const DeclContext *> &Contexts;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005357 DeclarationName Name;
5358 SmallVectorImpl<NamedDecl *> &Decls;
5359
5360 public:
5361 DeclContextNameLookupVisitor(ASTReader &Reader,
5362 SmallVectorImpl<const DeclContext *> &Contexts,
5363 DeclarationName Name,
5364 SmallVectorImpl<NamedDecl *> &Decls)
5365 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
5366
5367 static bool visit(ModuleFile &M, void *UserData) {
5368 DeclContextNameLookupVisitor *This
5369 = static_cast<DeclContextNameLookupVisitor *>(UserData);
5370
5371 // Check whether we have any visible declaration information for
5372 // this context in this module.
5373 ModuleFile::DeclContextInfosMap::iterator Info;
5374 bool FoundInfo = false;
5375 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
5376 Info = M.DeclContextInfos.find(This->Contexts[I]);
5377 if (Info != M.DeclContextInfos.end() &&
5378 Info->second.NameLookupTableData) {
5379 FoundInfo = true;
5380 break;
5381 }
5382 }
5383
5384 if (!FoundInfo)
5385 return false;
5386
5387 // Look for this name within this module.
5388 ASTDeclContextNameLookupTable *LookupTable =
5389 Info->second.NameLookupTableData;
5390 ASTDeclContextNameLookupTable::iterator Pos
5391 = LookupTable->find(This->Name);
5392 if (Pos == LookupTable->end())
5393 return false;
5394
5395 bool FoundAnything = false;
5396 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
5397 for (; Data.first != Data.second; ++Data.first) {
5398 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
5399 if (!ND)
5400 continue;
5401
5402 if (ND->getDeclName() != This->Name) {
5403 // A name might be null because the decl's redeclarable part is
5404 // currently read before reading its name. The lookup is triggered by
5405 // building that decl (likely indirectly), and so it is later in the
5406 // sense of "already existing" and can be ignored here.
5407 continue;
5408 }
5409
5410 // Record this declaration.
5411 FoundAnything = true;
5412 This->Decls.push_back(ND);
5413 }
5414
5415 return FoundAnything;
5416 }
5417 };
5418}
5419
Douglas Gregor5a04f9f2013-01-21 15:25:38 +00005420/// \brief Retrieve the "definitive" module file for the definition of the
5421/// given declaration context, if there is one.
5422///
5423/// The "definitive" module file is the only place where we need to look to
5424/// find information about the declarations within the given declaration
5425/// context. For example, C++ and Objective-C classes, C structs/unions, and
5426/// Objective-C protocols, categories, and extensions are all defined in a
5427/// single place in the source code, so they have definitive module files
5428/// associated with them. C++ namespaces, on the other hand, can have
5429/// definitions in multiple different module files.
5430///
5431/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
5432/// NDEBUG checking.
5433static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
5434 ASTReader &Reader) {
Douglas Gregore0d20662013-01-22 17:08:30 +00005435 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
5436 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
Douglas Gregor5a04f9f2013-01-21 15:25:38 +00005437
5438 return 0;
5439}
5440
Richard Smith3646c682013-02-07 03:30:24 +00005441bool
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005442ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
5443 DeclarationName Name) {
5444 assert(DC->hasExternalVisibleStorage() &&
5445 "DeclContext has no visible decls in storage");
5446 if (!Name)
Richard Smith3646c682013-02-07 03:30:24 +00005447 return false;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005448
5449 SmallVector<NamedDecl *, 64> Decls;
5450
5451 // Compute the declaration contexts we need to look into. Multiple such
5452 // declaration contexts occur when two declaration contexts from disjoint
5453 // modules get merged, e.g., when two namespaces with the same name are
5454 // independently defined in separate modules.
5455 SmallVector<const DeclContext *, 2> Contexts;
5456 Contexts.push_back(DC);
5457
5458 if (DC->isNamespace()) {
5459 MergedDeclsMap::iterator Merged
5460 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
5461 if (Merged != MergedDecls.end()) {
5462 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
5463 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
5464 }
5465 }
5466
5467 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
Douglas Gregor5a04f9f2013-01-21 15:25:38 +00005468
5469 // If we can definitively determine which module file to look into,
5470 // only look there. Otherwise, look in all module files.
5471 ModuleFile *Definitive;
5472 if (Contexts.size() == 1 &&
5473 (Definitive = getDefinitiveModuleFileFor(DC, *this))) {
5474 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
5475 } else {
5476 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
5477 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005478 ++NumVisibleDeclContextsRead;
5479 SetExternalVisibleDeclsForName(DC, Name, Decls);
Richard Smith3646c682013-02-07 03:30:24 +00005480 return !Decls.empty();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005481}
5482
5483namespace {
5484 /// \brief ModuleFile visitor used to retrieve all visible names in a
5485 /// declaration context.
5486 class DeclContextAllNamesVisitor {
5487 ASTReader &Reader;
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005488 SmallVectorImpl<const DeclContext *> &Contexts;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005489 llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > &Decls;
Argyrios Kyrtzidisca40f302012-12-19 22:21:18 +00005490 bool VisitAll;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005491
5492 public:
5493 DeclContextAllNamesVisitor(ASTReader &Reader,
5494 SmallVectorImpl<const DeclContext *> &Contexts,
5495 llvm::DenseMap<DeclarationName,
Argyrios Kyrtzidisca40f302012-12-19 22:21:18 +00005496 SmallVector<NamedDecl *, 8> > &Decls,
5497 bool VisitAll)
5498 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005499
5500 static bool visit(ModuleFile &M, void *UserData) {
5501 DeclContextAllNamesVisitor *This
5502 = static_cast<DeclContextAllNamesVisitor *>(UserData);
5503
5504 // Check whether we have any visible declaration information for
5505 // this context in this module.
5506 ModuleFile::DeclContextInfosMap::iterator Info;
5507 bool FoundInfo = false;
5508 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
5509 Info = M.DeclContextInfos.find(This->Contexts[I]);
5510 if (Info != M.DeclContextInfos.end() &&
5511 Info->second.NameLookupTableData) {
5512 FoundInfo = true;
5513 break;
5514 }
5515 }
5516
5517 if (!FoundInfo)
5518 return false;
5519
5520 ASTDeclContextNameLookupTable *LookupTable =
5521 Info->second.NameLookupTableData;
5522 bool FoundAnything = false;
5523 for (ASTDeclContextNameLookupTable::data_iterator
Douglas Gregora6b00fc2013-01-23 22:38:11 +00005524 I = LookupTable->data_begin(), E = LookupTable->data_end();
5525 I != E;
5526 ++I) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005527 ASTDeclContextNameLookupTrait::data_type Data = *I;
5528 for (; Data.first != Data.second; ++Data.first) {
5529 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
5530 *Data.first);
5531 if (!ND)
5532 continue;
5533
5534 // Record this declaration.
5535 FoundAnything = true;
5536 This->Decls[ND->getDeclName()].push_back(ND);
5537 }
5538 }
5539
Argyrios Kyrtzidisca40f302012-12-19 22:21:18 +00005540 return FoundAnything && !This->VisitAll;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005541 }
5542 };
5543}
5544
5545void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
5546 if (!DC->hasExternalVisibleStorage())
5547 return;
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005548 llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > Decls;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005549
5550 // Compute the declaration contexts we need to look into. Multiple such
5551 // declaration contexts occur when two declaration contexts from disjoint
5552 // modules get merged, e.g., when two namespaces with the same name are
5553 // independently defined in separate modules.
5554 SmallVector<const DeclContext *, 2> Contexts;
5555 Contexts.push_back(DC);
5556
5557 if (DC->isNamespace()) {
5558 MergedDeclsMap::iterator Merged
5559 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
5560 if (Merged != MergedDecls.end()) {
5561 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
5562 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
5563 }
5564 }
5565
Argyrios Kyrtzidisca40f302012-12-19 22:21:18 +00005566 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
5567 /*VisitAll=*/DC->isFileContext());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005568 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
5569 ++NumVisibleDeclContextsRead;
5570
5571 for (llvm::DenseMap<DeclarationName,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005572 SmallVector<NamedDecl *, 8> >::iterator
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005573 I = Decls.begin(), E = Decls.end(); I != E; ++I) {
5574 SetExternalVisibleDeclsForName(DC, I->first, I->second);
5575 }
5576 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
5577}
5578
5579/// \brief Under non-PCH compilation the consumer receives the objc methods
5580/// before receiving the implementation, and codegen depends on this.
5581/// We simulate this by deserializing and passing to consumer the methods of the
5582/// implementation before passing the deserialized implementation decl.
5583static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
5584 ASTConsumer *Consumer) {
5585 assert(ImplD && Consumer);
5586
5587 for (ObjCImplDecl::method_iterator
5588 I = ImplD->meth_begin(), E = ImplD->meth_end(); I != E; ++I)
5589 Consumer->HandleInterestingDecl(DeclGroupRef(*I));
5590
5591 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
5592}
5593
5594void ASTReader::PassInterestingDeclsToConsumer() {
5595 assert(Consumer);
5596 while (!InterestingDecls.empty()) {
5597 Decl *D = InterestingDecls.front();
5598 InterestingDecls.pop_front();
5599
5600 PassInterestingDeclToConsumer(D);
5601 }
5602}
5603
5604void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
5605 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
5606 PassObjCImplDeclToConsumer(ImplD, Consumer);
5607 else
5608 Consumer->HandleInterestingDecl(DeclGroupRef(D));
5609}
5610
5611void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
5612 this->Consumer = Consumer;
5613
5614 if (!Consumer)
5615 return;
5616
5617 for (unsigned I = 0, N = ExternalDefinitions.size(); I != N; ++I) {
5618 // Force deserialization of this decl, which will cause it to be queued for
5619 // passing to the consumer.
5620 GetDecl(ExternalDefinitions[I]);
5621 }
5622 ExternalDefinitions.clear();
5623
5624 PassInterestingDeclsToConsumer();
5625}
5626
5627void ASTReader::PrintStats() {
5628 std::fprintf(stderr, "*** AST File Statistics:\n");
5629
5630 unsigned NumTypesLoaded
5631 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
5632 QualType());
5633 unsigned NumDeclsLoaded
5634 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
5635 (Decl *)0);
5636 unsigned NumIdentifiersLoaded
5637 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
5638 IdentifiersLoaded.end(),
5639 (IdentifierInfo *)0);
5640 unsigned NumMacrosLoaded
5641 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
5642 MacrosLoaded.end(),
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00005643 (MacroDirective *)0);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005644 unsigned NumSelectorsLoaded
5645 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
5646 SelectorsLoaded.end(),
5647 Selector());
5648
5649 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
5650 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
5651 NumSLocEntriesRead, TotalNumSLocEntries,
5652 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
5653 if (!TypesLoaded.empty())
5654 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
5655 NumTypesLoaded, (unsigned)TypesLoaded.size(),
5656 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
5657 if (!DeclsLoaded.empty())
5658 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
5659 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
5660 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
5661 if (!IdentifiersLoaded.empty())
5662 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
5663 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
5664 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
5665 if (!MacrosLoaded.empty())
5666 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
5667 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
5668 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
5669 if (!SelectorsLoaded.empty())
5670 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
5671 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
5672 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
5673 if (TotalNumStatements)
5674 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
5675 NumStatementsRead, TotalNumStatements,
5676 ((float)NumStatementsRead/TotalNumStatements * 100));
5677 if (TotalNumMacros)
5678 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
5679 NumMacrosRead, TotalNumMacros,
5680 ((float)NumMacrosRead/TotalNumMacros * 100));
5681 if (TotalLexicalDeclContexts)
5682 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
5683 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
5684 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
5685 * 100));
5686 if (TotalVisibleDeclContexts)
5687 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
5688 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
5689 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
5690 * 100));
5691 if (TotalNumMethodPoolEntries) {
5692 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
5693 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
5694 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
5695 * 100));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005696 }
Douglas Gregor95fb36e2013-01-28 17:54:36 +00005697 if (NumMethodPoolLookups) {
5698 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
5699 NumMethodPoolHits, NumMethodPoolLookups,
5700 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
5701 }
5702 if (NumMethodPoolTableLookups) {
5703 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
5704 NumMethodPoolTableHits, NumMethodPoolTableLookups,
5705 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
5706 * 100.0));
5707 }
5708
Douglas Gregore1698072013-01-25 00:38:33 +00005709 if (NumIdentifierLookupHits) {
5710 std::fprintf(stderr,
5711 " %u / %u identifier table lookups succeeded (%f%%)\n",
5712 NumIdentifierLookupHits, NumIdentifierLookups,
5713 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
5714 }
5715
Douglas Gregor1a49d972013-01-25 01:03:03 +00005716 if (GlobalIndex) {
5717 std::fprintf(stderr, "\n");
5718 GlobalIndex->printStats();
5719 }
5720
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005721 std::fprintf(stderr, "\n");
5722 dump();
5723 std::fprintf(stderr, "\n");
5724}
5725
5726template<typename Key, typename ModuleFile, unsigned InitialCapacity>
5727static void
5728dumpModuleIDMap(StringRef Name,
5729 const ContinuousRangeMap<Key, ModuleFile *,
5730 InitialCapacity> &Map) {
5731 if (Map.begin() == Map.end())
5732 return;
5733
5734 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
5735 llvm::errs() << Name << ":\n";
5736 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
5737 I != IEnd; ++I) {
5738 llvm::errs() << " " << I->first << " -> " << I->second->FileName
5739 << "\n";
5740 }
5741}
5742
5743void ASTReader::dump() {
5744 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
5745 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
5746 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
5747 dumpModuleIDMap("Global type map", GlobalTypeMap);
5748 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
5749 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
5750 dumpModuleIDMap("Global macro map", GlobalMacroMap);
5751 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
5752 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
5753 dumpModuleIDMap("Global preprocessed entity map",
5754 GlobalPreprocessedEntityMap);
5755
5756 llvm::errs() << "\n*** PCH/Modules Loaded:";
5757 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
5758 MEnd = ModuleMgr.end();
5759 M != MEnd; ++M)
5760 (*M)->dump();
5761}
5762
5763/// Return the amount of memory used by memory buffers, breaking down
5764/// by heap-backed versus mmap'ed memory.
5765void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
5766 for (ModuleConstIterator I = ModuleMgr.begin(),
5767 E = ModuleMgr.end(); I != E; ++I) {
5768 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
5769 size_t bytes = buf->getBufferSize();
5770 switch (buf->getBufferKind()) {
5771 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
5772 sizes.malloc_bytes += bytes;
5773 break;
5774 case llvm::MemoryBuffer::MemoryBuffer_MMap:
5775 sizes.mmap_bytes += bytes;
5776 break;
5777 }
5778 }
5779 }
5780}
5781
5782void ASTReader::InitializeSema(Sema &S) {
5783 SemaObj = &S;
5784 S.addExternalSource(this);
5785
5786 // Makes sure any declarations that were deserialized "too early"
5787 // still get added to the identifier's declaration chains.
5788 for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
Douglas Gregoraa945902013-02-18 15:53:43 +00005789 NamedDecl *ND = cast<NamedDecl>(PreloadedDecls[I]->getMostRecentDecl());
5790 SemaObj->pushExternalDeclIntoScope(ND, PreloadedDecls[I]->getDeclName());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005791 }
5792 PreloadedDecls.clear();
5793
5794 // Load the offsets of the declarations that Sema references.
5795 // They will be lazily deserialized when needed.
5796 if (!SemaDeclRefs.empty()) {
5797 assert(SemaDeclRefs.size() == 2 && "More decl refs than expected!");
5798 if (!SemaObj->StdNamespace)
5799 SemaObj->StdNamespace = SemaDeclRefs[0];
5800 if (!SemaObj->StdBadAlloc)
5801 SemaObj->StdBadAlloc = SemaDeclRefs[1];
5802 }
5803
5804 if (!FPPragmaOptions.empty()) {
5805 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
5806 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
5807 }
5808
5809 if (!OpenCLExtensions.empty()) {
5810 unsigned I = 0;
5811#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
5812#include "clang/Basic/OpenCLExtensions.def"
5813
5814 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
5815 }
5816}
5817
5818IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
5819 // Note that we are loading an identifier.
5820 Deserializing AnIdentifier(this);
Douglas Gregor1a49d972013-01-25 01:03:03 +00005821 StringRef Name(NameStart, NameEnd - NameStart);
5822
5823 // If there is a global index, look there first to determine which modules
5824 // provably do not have any results for this identifier.
Douglas Gregor188bdcd2013-01-25 23:32:03 +00005825 GlobalModuleIndex::HitSet Hits;
5826 GlobalModuleIndex::HitSet *HitsPtr = 0;
Douglas Gregor1a49d972013-01-25 01:03:03 +00005827 if (!loadGlobalIndex()) {
Douglas Gregor188bdcd2013-01-25 23:32:03 +00005828 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
5829 HitsPtr = &Hits;
Douglas Gregor1a49d972013-01-25 01:03:03 +00005830 }
5831 }
Douglas Gregor188bdcd2013-01-25 23:32:03 +00005832 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
Douglas Gregore1698072013-01-25 00:38:33 +00005833 NumIdentifierLookups,
5834 NumIdentifierLookupHits);
Douglas Gregor188bdcd2013-01-25 23:32:03 +00005835 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005836 IdentifierInfo *II = Visitor.getIdentifierInfo();
5837 markIdentifierUpToDate(II);
5838 return II;
5839}
5840
5841namespace clang {
5842 /// \brief An identifier-lookup iterator that enumerates all of the
5843 /// identifiers stored within a set of AST files.
5844 class ASTIdentifierIterator : public IdentifierIterator {
5845 /// \brief The AST reader whose identifiers are being enumerated.
5846 const ASTReader &Reader;
5847
5848 /// \brief The current index into the chain of AST files stored in
5849 /// the AST reader.
5850 unsigned Index;
5851
5852 /// \brief The current position within the identifier lookup table
5853 /// of the current AST file.
5854 ASTIdentifierLookupTable::key_iterator Current;
5855
5856 /// \brief The end position within the identifier lookup table of
5857 /// the current AST file.
5858 ASTIdentifierLookupTable::key_iterator End;
5859
5860 public:
5861 explicit ASTIdentifierIterator(const ASTReader &Reader);
5862
5863 virtual StringRef Next();
5864 };
5865}
5866
5867ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
5868 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
5869 ASTIdentifierLookupTable *IdTable
5870 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
5871 Current = IdTable->key_begin();
5872 End = IdTable->key_end();
5873}
5874
5875StringRef ASTIdentifierIterator::Next() {
5876 while (Current == End) {
5877 // If we have exhausted all of our AST files, we're done.
5878 if (Index == 0)
5879 return StringRef();
5880
5881 --Index;
5882 ASTIdentifierLookupTable *IdTable
5883 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
5884 IdentifierLookupTable;
5885 Current = IdTable->key_begin();
5886 End = IdTable->key_end();
5887 }
5888
5889 // We have any identifiers remaining in the current AST file; return
5890 // the next one.
Douglas Gregor479633c2013-01-23 18:53:14 +00005891 StringRef Result = *Current;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005892 ++Current;
Douglas Gregor479633c2013-01-23 18:53:14 +00005893 return Result;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005894}
5895
5896IdentifierIterator *ASTReader::getIdentifiers() const {
5897 return new ASTIdentifierIterator(*this);
5898}
5899
5900namespace clang { namespace serialization {
5901 class ReadMethodPoolVisitor {
5902 ASTReader &Reader;
5903 Selector Sel;
5904 unsigned PriorGeneration;
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00005905 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
5906 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005907
5908 public:
5909 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
5910 unsigned PriorGeneration)
5911 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) { }
5912
5913 static bool visit(ModuleFile &M, void *UserData) {
5914 ReadMethodPoolVisitor *This
5915 = static_cast<ReadMethodPoolVisitor *>(UserData);
5916
5917 if (!M.SelectorLookupTable)
5918 return false;
5919
5920 // If we've already searched this module file, skip it now.
5921 if (M.Generation <= This->PriorGeneration)
5922 return true;
5923
Douglas Gregor95fb36e2013-01-28 17:54:36 +00005924 ++This->Reader.NumMethodPoolTableLookups;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005925 ASTSelectorLookupTable *PoolTable
5926 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
5927 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
5928 if (Pos == PoolTable->end())
5929 return false;
Douglas Gregor95fb36e2013-01-28 17:54:36 +00005930
5931 ++This->Reader.NumMethodPoolTableHits;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005932 ++This->Reader.NumSelectorsRead;
5933 // FIXME: Not quite happy with the statistics here. We probably should
5934 // disable this tracking when called via LoadSelector.
5935 // Also, should entries without methods count as misses?
5936 ++This->Reader.NumMethodPoolEntriesRead;
5937 ASTSelectorLookupTrait::data_type Data = *Pos;
5938 if (This->Reader.DeserializationListener)
5939 This->Reader.DeserializationListener->SelectorRead(Data.ID,
5940 This->Sel);
5941
5942 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
5943 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
5944 return true;
5945 }
5946
5947 /// \brief Retrieve the instance methods found by this visitor.
5948 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
5949 return InstanceMethods;
5950 }
5951
5952 /// \brief Retrieve the instance methods found by this visitor.
5953 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
5954 return FactoryMethods;
5955 }
5956 };
5957} } // end namespace clang::serialization
5958
5959/// \brief Add the given set of methods to the method list.
5960static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
5961 ObjCMethodList &List) {
5962 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
5963 S.addMethodToGlobalList(&List, Methods[I]);
5964 }
5965}
5966
5967void ASTReader::ReadMethodPool(Selector Sel) {
5968 // Get the selector generation and update it to the current generation.
5969 unsigned &Generation = SelectorGeneration[Sel];
5970 unsigned PriorGeneration = Generation;
5971 Generation = CurrentGeneration;
5972
5973 // Search for methods defined with this selector.
Douglas Gregor95fb36e2013-01-28 17:54:36 +00005974 ++NumMethodPoolLookups;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005975 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
5976 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
5977
5978 if (Visitor.getInstanceMethods().empty() &&
Douglas Gregor95fb36e2013-01-28 17:54:36 +00005979 Visitor.getFactoryMethods().empty())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005980 return;
Douglas Gregor95fb36e2013-01-28 17:54:36 +00005981
5982 ++NumMethodPoolHits;
5983
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005984 if (!getSema())
5985 return;
5986
5987 Sema &S = *getSema();
5988 Sema::GlobalMethodPool::iterator Pos
5989 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
5990
5991 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
5992 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
5993}
5994
5995void ASTReader::ReadKnownNamespaces(
5996 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
5997 Namespaces.clear();
5998
5999 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
6000 if (NamespaceDecl *Namespace
6001 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
6002 Namespaces.push_back(Namespace);
6003 }
6004}
6005
Nick Lewyckycd0655b2013-02-01 08:13:20 +00006006void ASTReader::ReadUndefinedButUsed(
Nick Lewycky995e26b2013-01-31 03:23:57 +00006007 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
Nick Lewyckycd0655b2013-02-01 08:13:20 +00006008 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
6009 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
Nick Lewycky01a41142013-01-26 00:35:08 +00006010 SourceLocation Loc =
Nick Lewyckycd0655b2013-02-01 08:13:20 +00006011 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
Nick Lewycky01a41142013-01-26 00:35:08 +00006012 Undefined.insert(std::make_pair(D, Loc));
6013 }
6014}
Nick Lewycky01a41142013-01-26 00:35:08 +00006015
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006016void ASTReader::ReadTentativeDefinitions(
6017 SmallVectorImpl<VarDecl *> &TentativeDefs) {
6018 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
6019 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
6020 if (Var)
6021 TentativeDefs.push_back(Var);
6022 }
6023 TentativeDefinitions.clear();
6024}
6025
6026void ASTReader::ReadUnusedFileScopedDecls(
6027 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
6028 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
6029 DeclaratorDecl *D
6030 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
6031 if (D)
6032 Decls.push_back(D);
6033 }
6034 UnusedFileScopedDecls.clear();
6035}
6036
6037void ASTReader::ReadDelegatingConstructors(
6038 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
6039 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
6040 CXXConstructorDecl *D
6041 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
6042 if (D)
6043 Decls.push_back(D);
6044 }
6045 DelegatingCtorDecls.clear();
6046}
6047
6048void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
6049 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
6050 TypedefNameDecl *D
6051 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
6052 if (D)
6053 Decls.push_back(D);
6054 }
6055 ExtVectorDecls.clear();
6056}
6057
6058void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
6059 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
6060 CXXRecordDecl *D
6061 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
6062 if (D)
6063 Decls.push_back(D);
6064 }
6065 DynamicClasses.clear();
6066}
6067
6068void
Richard Smith5ea6ef42013-01-10 23:43:47 +00006069ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
6070 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
6071 NamedDecl *D
6072 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006073 if (D)
6074 Decls.push_back(D);
6075 }
Richard Smith5ea6ef42013-01-10 23:43:47 +00006076 LocallyScopedExternCDecls.clear();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006077}
6078
6079void ASTReader::ReadReferencedSelectors(
6080 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
6081 if (ReferencedSelectorsData.empty())
6082 return;
6083
6084 // If there are @selector references added them to its pool. This is for
6085 // implementation of -Wselector.
6086 unsigned int DataSize = ReferencedSelectorsData.size()-1;
6087 unsigned I = 0;
6088 while (I < DataSize) {
6089 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
6090 SourceLocation SelLoc
6091 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
6092 Sels.push_back(std::make_pair(Sel, SelLoc));
6093 }
6094 ReferencedSelectorsData.clear();
6095}
6096
6097void ASTReader::ReadWeakUndeclaredIdentifiers(
6098 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
6099 if (WeakUndeclaredIdentifiers.empty())
6100 return;
6101
6102 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
6103 IdentifierInfo *WeakId
6104 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
6105 IdentifierInfo *AliasId
6106 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
6107 SourceLocation Loc
6108 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
6109 bool Used = WeakUndeclaredIdentifiers[I++];
6110 WeakInfo WI(AliasId, Loc);
6111 WI.setUsed(Used);
6112 WeakIDs.push_back(std::make_pair(WeakId, WI));
6113 }
6114 WeakUndeclaredIdentifiers.clear();
6115}
6116
6117void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
6118 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
6119 ExternalVTableUse VT;
6120 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
6121 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
6122 VT.DefinitionRequired = VTableUses[Idx++];
6123 VTables.push_back(VT);
6124 }
6125
6126 VTableUses.clear();
6127}
6128
6129void ASTReader::ReadPendingInstantiations(
6130 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
6131 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
6132 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
6133 SourceLocation Loc
6134 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
6135
6136 Pending.push_back(std::make_pair(D, Loc));
6137 }
6138 PendingInstantiations.clear();
6139}
6140
6141void ASTReader::LoadSelector(Selector Sel) {
6142 // It would be complicated to avoid reading the methods anyway. So don't.
6143 ReadMethodPool(Sel);
6144}
6145
6146void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
6147 assert(ID && "Non-zero identifier ID required");
6148 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
6149 IdentifiersLoaded[ID - 1] = II;
6150 if (DeserializationListener)
6151 DeserializationListener->IdentifierRead(ID, II);
6152}
6153
6154/// \brief Set the globally-visible declarations associated with the given
6155/// identifier.
6156///
6157/// If the AST reader is currently in a state where the given declaration IDs
6158/// cannot safely be resolved, they are queued until it is safe to resolve
6159/// them.
6160///
6161/// \param II an IdentifierInfo that refers to one or more globally-visible
6162/// declarations.
6163///
6164/// \param DeclIDs the set of declaration IDs with the name @p II that are
6165/// visible at global scope.
6166///
Douglas Gregoraa945902013-02-18 15:53:43 +00006167/// \param Decls if non-null, this vector will be populated with the set of
6168/// deserialized declarations. These declarations will not be pushed into
6169/// scope.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006170void
6171ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
6172 const SmallVectorImpl<uint32_t> &DeclIDs,
Douglas Gregoraa945902013-02-18 15:53:43 +00006173 SmallVectorImpl<Decl *> *Decls) {
6174 if (NumCurrentElementsDeserializing && !Decls) {
6175 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006176 return;
6177 }
6178
6179 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
6180 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
6181 if (SemaObj) {
Douglas Gregoraa945902013-02-18 15:53:43 +00006182 // If we're simply supposed to record the declarations, do so now.
6183 if (Decls) {
6184 Decls->push_back(D);
6185 continue;
6186 }
6187
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006188 // Introduce this declaration into the translation-unit scope
6189 // and add it to the declaration chain for this identifier, so
6190 // that (unqualified) name lookup will find it.
Douglas Gregoraa945902013-02-18 15:53:43 +00006191 NamedDecl *ND = cast<NamedDecl>(D->getMostRecentDecl());
6192 SemaObj->pushExternalDeclIntoScope(ND, II);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006193 } else {
6194 // Queue this declaration so that it will be added to the
6195 // translation unit scope and identifier's declaration chain
6196 // once a Sema object is known.
6197 PreloadedDecls.push_back(D);
6198 }
6199 }
6200}
6201
Douglas Gregor8222b892013-01-21 16:52:34 +00006202IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006203 if (ID == 0)
6204 return 0;
6205
6206 if (IdentifiersLoaded.empty()) {
6207 Error("no identifier table in AST file");
6208 return 0;
6209 }
6210
6211 ID -= 1;
6212 if (!IdentifiersLoaded[ID]) {
6213 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
6214 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
6215 ModuleFile *M = I->second;
6216 unsigned Index = ID - M->BaseIdentifierID;
6217 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
6218
6219 // All of the strings in the AST file are preceded by a 16-bit length.
6220 // Extract that 16-bit length to avoid having to execute strlen().
6221 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
6222 // unsigned integers. This is important to avoid integer overflow when
6223 // we cast them to 'unsigned'.
6224 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
6225 unsigned StrLen = (((unsigned) StrLenPtr[0])
6226 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
Douglas Gregor8222b892013-01-21 16:52:34 +00006227 IdentifiersLoaded[ID]
6228 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006229 if (DeserializationListener)
6230 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
6231 }
6232
6233 return IdentifiersLoaded[ID];
6234}
6235
Douglas Gregor8222b892013-01-21 16:52:34 +00006236IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
6237 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006238}
6239
6240IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
6241 if (LocalID < NUM_PREDEF_IDENT_IDS)
6242 return LocalID;
6243
6244 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6245 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
6246 assert(I != M.IdentifierRemap.end()
6247 && "Invalid index into identifier index remap");
6248
6249 return LocalID + I->second;
6250}
6251
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00006252MacroDirective *ASTReader::getMacro(MacroID ID, MacroDirective *Hint) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006253 if (ID == 0)
6254 return 0;
6255
6256 if (MacrosLoaded.empty()) {
6257 Error("no macro table in AST file");
6258 return 0;
6259 }
6260
6261 ID -= NUM_PREDEF_MACRO_IDS;
6262 if (!MacrosLoaded[ID]) {
6263 GlobalMacroMapType::iterator I
6264 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
6265 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
6266 ModuleFile *M = I->second;
6267 unsigned Index = ID - M->BaseMacroID;
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00006268 ReadMacroRecord(*M, M->MacroOffsets[Index], Hint);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006269 }
6270
6271 return MacrosLoaded[ID];
6272}
6273
6274MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
6275 if (LocalID < NUM_PREDEF_MACRO_IDS)
6276 return LocalID;
6277
6278 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6279 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
6280 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
6281
6282 return LocalID + I->second;
6283}
6284
6285serialization::SubmoduleID
6286ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
6287 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
6288 return LocalID;
6289
6290 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6291 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
6292 assert(I != M.SubmoduleRemap.end()
6293 && "Invalid index into submodule index remap");
6294
6295 return LocalID + I->second;
6296}
6297
6298Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
6299 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
6300 assert(GlobalID == 0 && "Unhandled global submodule ID");
6301 return 0;
6302 }
6303
6304 if (GlobalID > SubmodulesLoaded.size()) {
6305 Error("submodule ID out of range in AST file");
6306 return 0;
6307 }
6308
6309 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
6310}
Douglas Gregorca2ab452013-01-12 01:29:50 +00006311
6312Module *ASTReader::getModule(unsigned ID) {
6313 return getSubmodule(ID);
6314}
6315
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006316Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
6317 return DecodeSelector(getGlobalSelectorID(M, LocalID));
6318}
6319
6320Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
6321 if (ID == 0)
6322 return Selector();
6323
6324 if (ID > SelectorsLoaded.size()) {
6325 Error("selector ID out of range in AST file");
6326 return Selector();
6327 }
6328
6329 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 0) {
6330 // Load this selector from the selector table.
6331 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
6332 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
6333 ModuleFile &M = *I->second;
6334 ASTSelectorLookupTrait Trait(*this, M);
6335 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
6336 SelectorsLoaded[ID - 1] =
6337 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
6338 if (DeserializationListener)
6339 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
6340 }
6341
6342 return SelectorsLoaded[ID - 1];
6343}
6344
6345Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
6346 return DecodeSelector(ID);
6347}
6348
6349uint32_t ASTReader::GetNumExternalSelectors() {
6350 // ID 0 (the null selector) is considered an external selector.
6351 return getTotalNumSelectors() + 1;
6352}
6353
6354serialization::SelectorID
6355ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
6356 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
6357 return LocalID;
6358
6359 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6360 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
6361 assert(I != M.SelectorRemap.end()
6362 && "Invalid index into selector index remap");
6363
6364 return LocalID + I->second;
6365}
6366
6367DeclarationName
6368ASTReader::ReadDeclarationName(ModuleFile &F,
6369 const RecordData &Record, unsigned &Idx) {
6370 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
6371 switch (Kind) {
6372 case DeclarationName::Identifier:
Douglas Gregor8222b892013-01-21 16:52:34 +00006373 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006374
6375 case DeclarationName::ObjCZeroArgSelector:
6376 case DeclarationName::ObjCOneArgSelector:
6377 case DeclarationName::ObjCMultiArgSelector:
6378 return DeclarationName(ReadSelector(F, Record, Idx));
6379
6380 case DeclarationName::CXXConstructorName:
6381 return Context.DeclarationNames.getCXXConstructorName(
6382 Context.getCanonicalType(readType(F, Record, Idx)));
6383
6384 case DeclarationName::CXXDestructorName:
6385 return Context.DeclarationNames.getCXXDestructorName(
6386 Context.getCanonicalType(readType(F, Record, Idx)));
6387
6388 case DeclarationName::CXXConversionFunctionName:
6389 return Context.DeclarationNames.getCXXConversionFunctionName(
6390 Context.getCanonicalType(readType(F, Record, Idx)));
6391
6392 case DeclarationName::CXXOperatorName:
6393 return Context.DeclarationNames.getCXXOperatorName(
6394 (OverloadedOperatorKind)Record[Idx++]);
6395
6396 case DeclarationName::CXXLiteralOperatorName:
6397 return Context.DeclarationNames.getCXXLiteralOperatorName(
6398 GetIdentifierInfo(F, Record, Idx));
6399
6400 case DeclarationName::CXXUsingDirective:
6401 return DeclarationName::getUsingDirectiveName();
6402 }
6403
6404 llvm_unreachable("Invalid NameKind!");
6405}
6406
6407void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
6408 DeclarationNameLoc &DNLoc,
6409 DeclarationName Name,
6410 const RecordData &Record, unsigned &Idx) {
6411 switch (Name.getNameKind()) {
6412 case DeclarationName::CXXConstructorName:
6413 case DeclarationName::CXXDestructorName:
6414 case DeclarationName::CXXConversionFunctionName:
6415 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
6416 break;
6417
6418 case DeclarationName::CXXOperatorName:
6419 DNLoc.CXXOperatorName.BeginOpNameLoc
6420 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
6421 DNLoc.CXXOperatorName.EndOpNameLoc
6422 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
6423 break;
6424
6425 case DeclarationName::CXXLiteralOperatorName:
6426 DNLoc.CXXLiteralOperatorName.OpNameLoc
6427 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
6428 break;
6429
6430 case DeclarationName::Identifier:
6431 case DeclarationName::ObjCZeroArgSelector:
6432 case DeclarationName::ObjCOneArgSelector:
6433 case DeclarationName::ObjCMultiArgSelector:
6434 case DeclarationName::CXXUsingDirective:
6435 break;
6436 }
6437}
6438
6439void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
6440 DeclarationNameInfo &NameInfo,
6441 const RecordData &Record, unsigned &Idx) {
6442 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
6443 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
6444 DeclarationNameLoc DNLoc;
6445 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
6446 NameInfo.setInfo(DNLoc);
6447}
6448
6449void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
6450 const RecordData &Record, unsigned &Idx) {
6451 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
6452 unsigned NumTPLists = Record[Idx++];
6453 Info.NumTemplParamLists = NumTPLists;
6454 if (NumTPLists) {
6455 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
6456 for (unsigned i=0; i != NumTPLists; ++i)
6457 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
6458 }
6459}
6460
6461TemplateName
6462ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
6463 unsigned &Idx) {
6464 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
6465 switch (Kind) {
6466 case TemplateName::Template:
6467 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
6468
6469 case TemplateName::OverloadedTemplate: {
6470 unsigned size = Record[Idx++];
6471 UnresolvedSet<8> Decls;
6472 while (size--)
6473 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
6474
6475 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
6476 }
6477
6478 case TemplateName::QualifiedTemplate: {
6479 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
6480 bool hasTemplKeyword = Record[Idx++];
6481 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
6482 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
6483 }
6484
6485 case TemplateName::DependentTemplate: {
6486 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
6487 if (Record[Idx++]) // isIdentifier
6488 return Context.getDependentTemplateName(NNS,
6489 GetIdentifierInfo(F, Record,
6490 Idx));
6491 return Context.getDependentTemplateName(NNS,
6492 (OverloadedOperatorKind)Record[Idx++]);
6493 }
6494
6495 case TemplateName::SubstTemplateTemplateParm: {
6496 TemplateTemplateParmDecl *param
6497 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
6498 if (!param) return TemplateName();
6499 TemplateName replacement = ReadTemplateName(F, Record, Idx);
6500 return Context.getSubstTemplateTemplateParm(param, replacement);
6501 }
6502
6503 case TemplateName::SubstTemplateTemplateParmPack: {
6504 TemplateTemplateParmDecl *Param
6505 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
6506 if (!Param)
6507 return TemplateName();
6508
6509 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
6510 if (ArgPack.getKind() != TemplateArgument::Pack)
6511 return TemplateName();
6512
6513 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
6514 }
6515 }
6516
6517 llvm_unreachable("Unhandled template name kind!");
6518}
6519
6520TemplateArgument
6521ASTReader::ReadTemplateArgument(ModuleFile &F,
6522 const RecordData &Record, unsigned &Idx) {
6523 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
6524 switch (Kind) {
6525 case TemplateArgument::Null:
6526 return TemplateArgument();
6527 case TemplateArgument::Type:
6528 return TemplateArgument(readType(F, Record, Idx));
6529 case TemplateArgument::Declaration: {
6530 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
6531 bool ForReferenceParam = Record[Idx++];
6532 return TemplateArgument(D, ForReferenceParam);
6533 }
6534 case TemplateArgument::NullPtr:
6535 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
6536 case TemplateArgument::Integral: {
6537 llvm::APSInt Value = ReadAPSInt(Record, Idx);
6538 QualType T = readType(F, Record, Idx);
6539 return TemplateArgument(Context, Value, T);
6540 }
6541 case TemplateArgument::Template:
6542 return TemplateArgument(ReadTemplateName(F, Record, Idx));
6543 case TemplateArgument::TemplateExpansion: {
6544 TemplateName Name = ReadTemplateName(F, Record, Idx);
David Blaikiedc84cd52013-02-20 22:23:23 +00006545 Optional<unsigned> NumTemplateExpansions;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006546 if (unsigned NumExpansions = Record[Idx++])
6547 NumTemplateExpansions = NumExpansions - 1;
6548 return TemplateArgument(Name, NumTemplateExpansions);
6549 }
6550 case TemplateArgument::Expression:
6551 return TemplateArgument(ReadExpr(F));
6552 case TemplateArgument::Pack: {
6553 unsigned NumArgs = Record[Idx++];
6554 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
6555 for (unsigned I = 0; I != NumArgs; ++I)
6556 Args[I] = ReadTemplateArgument(F, Record, Idx);
6557 return TemplateArgument(Args, NumArgs);
6558 }
6559 }
6560
6561 llvm_unreachable("Unhandled template argument kind!");
6562}
6563
6564TemplateParameterList *
6565ASTReader::ReadTemplateParameterList(ModuleFile &F,
6566 const RecordData &Record, unsigned &Idx) {
6567 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
6568 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
6569 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
6570
6571 unsigned NumParams = Record[Idx++];
6572 SmallVector<NamedDecl *, 16> Params;
6573 Params.reserve(NumParams);
6574 while (NumParams--)
6575 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
6576
6577 TemplateParameterList* TemplateParams =
6578 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
6579 Params.data(), Params.size(), RAngleLoc);
6580 return TemplateParams;
6581}
6582
6583void
6584ASTReader::
6585ReadTemplateArgumentList(SmallVector<TemplateArgument, 8> &TemplArgs,
6586 ModuleFile &F, const RecordData &Record,
6587 unsigned &Idx) {
6588 unsigned NumTemplateArgs = Record[Idx++];
6589 TemplArgs.reserve(NumTemplateArgs);
6590 while (NumTemplateArgs--)
6591 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
6592}
6593
6594/// \brief Read a UnresolvedSet structure.
6595void ASTReader::ReadUnresolvedSet(ModuleFile &F, ASTUnresolvedSet &Set,
6596 const RecordData &Record, unsigned &Idx) {
6597 unsigned NumDecls = Record[Idx++];
6598 Set.reserve(Context, NumDecls);
6599 while (NumDecls--) {
6600 NamedDecl *D = ReadDeclAs<NamedDecl>(F, Record, Idx);
6601 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
6602 Set.addDecl(Context, D, AS);
6603 }
6604}
6605
6606CXXBaseSpecifier
6607ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
6608 const RecordData &Record, unsigned &Idx) {
6609 bool isVirtual = static_cast<bool>(Record[Idx++]);
6610 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
6611 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
6612 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
6613 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
6614 SourceRange Range = ReadSourceRange(F, Record, Idx);
6615 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
6616 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
6617 EllipsisLoc);
6618 Result.setInheritConstructors(inheritConstructors);
6619 return Result;
6620}
6621
6622std::pair<CXXCtorInitializer **, unsigned>
6623ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
6624 unsigned &Idx) {
6625 CXXCtorInitializer **CtorInitializers = 0;
6626 unsigned NumInitializers = Record[Idx++];
6627 if (NumInitializers) {
6628 CtorInitializers
6629 = new (Context) CXXCtorInitializer*[NumInitializers];
6630 for (unsigned i=0; i != NumInitializers; ++i) {
6631 TypeSourceInfo *TInfo = 0;
6632 bool IsBaseVirtual = false;
6633 FieldDecl *Member = 0;
6634 IndirectFieldDecl *IndirectMember = 0;
6635
6636 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
6637 switch (Type) {
6638 case CTOR_INITIALIZER_BASE:
6639 TInfo = GetTypeSourceInfo(F, Record, Idx);
6640 IsBaseVirtual = Record[Idx++];
6641 break;
6642
6643 case CTOR_INITIALIZER_DELEGATING:
6644 TInfo = GetTypeSourceInfo(F, Record, Idx);
6645 break;
6646
6647 case CTOR_INITIALIZER_MEMBER:
6648 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
6649 break;
6650
6651 case CTOR_INITIALIZER_INDIRECT_MEMBER:
6652 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
6653 break;
6654 }
6655
6656 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
6657 Expr *Init = ReadExpr(F);
6658 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
6659 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
6660 bool IsWritten = Record[Idx++];
6661 unsigned SourceOrderOrNumArrayIndices;
6662 SmallVector<VarDecl *, 8> Indices;
6663 if (IsWritten) {
6664 SourceOrderOrNumArrayIndices = Record[Idx++];
6665 } else {
6666 SourceOrderOrNumArrayIndices = Record[Idx++];
6667 Indices.reserve(SourceOrderOrNumArrayIndices);
6668 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
6669 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
6670 }
6671
6672 CXXCtorInitializer *BOMInit;
6673 if (Type == CTOR_INITIALIZER_BASE) {
6674 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
6675 LParenLoc, Init, RParenLoc,
6676 MemberOrEllipsisLoc);
6677 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
6678 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
6679 Init, RParenLoc);
6680 } else if (IsWritten) {
6681 if (Member)
6682 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
6683 LParenLoc, Init, RParenLoc);
6684 else
6685 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
6686 MemberOrEllipsisLoc, LParenLoc,
6687 Init, RParenLoc);
6688 } else {
6689 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
6690 LParenLoc, Init, RParenLoc,
6691 Indices.data(), Indices.size());
6692 }
6693
6694 if (IsWritten)
6695 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
6696 CtorInitializers[i] = BOMInit;
6697 }
6698 }
6699
6700 return std::make_pair(CtorInitializers, NumInitializers);
6701}
6702
6703NestedNameSpecifier *
6704ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
6705 const RecordData &Record, unsigned &Idx) {
6706 unsigned N = Record[Idx++];
6707 NestedNameSpecifier *NNS = 0, *Prev = 0;
6708 for (unsigned I = 0; I != N; ++I) {
6709 NestedNameSpecifier::SpecifierKind Kind
6710 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
6711 switch (Kind) {
6712 case NestedNameSpecifier::Identifier: {
6713 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
6714 NNS = NestedNameSpecifier::Create(Context, Prev, II);
6715 break;
6716 }
6717
6718 case NestedNameSpecifier::Namespace: {
6719 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
6720 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
6721 break;
6722 }
6723
6724 case NestedNameSpecifier::NamespaceAlias: {
6725 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
6726 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
6727 break;
6728 }
6729
6730 case NestedNameSpecifier::TypeSpec:
6731 case NestedNameSpecifier::TypeSpecWithTemplate: {
6732 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
6733 if (!T)
6734 return 0;
6735
6736 bool Template = Record[Idx++];
6737 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
6738 break;
6739 }
6740
6741 case NestedNameSpecifier::Global: {
6742 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
6743 // No associated value, and there can't be a prefix.
6744 break;
6745 }
6746 }
6747 Prev = NNS;
6748 }
6749 return NNS;
6750}
6751
6752NestedNameSpecifierLoc
6753ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
6754 unsigned &Idx) {
6755 unsigned N = Record[Idx++];
6756 NestedNameSpecifierLocBuilder Builder;
6757 for (unsigned I = 0; I != N; ++I) {
6758 NestedNameSpecifier::SpecifierKind Kind
6759 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
6760 switch (Kind) {
6761 case NestedNameSpecifier::Identifier: {
6762 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
6763 SourceRange Range = ReadSourceRange(F, Record, Idx);
6764 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
6765 break;
6766 }
6767
6768 case NestedNameSpecifier::Namespace: {
6769 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
6770 SourceRange Range = ReadSourceRange(F, Record, Idx);
6771 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
6772 break;
6773 }
6774
6775 case NestedNameSpecifier::NamespaceAlias: {
6776 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
6777 SourceRange Range = ReadSourceRange(F, Record, Idx);
6778 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
6779 break;
6780 }
6781
6782 case NestedNameSpecifier::TypeSpec:
6783 case NestedNameSpecifier::TypeSpecWithTemplate: {
6784 bool Template = Record[Idx++];
6785 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
6786 if (!T)
6787 return NestedNameSpecifierLoc();
6788 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
6789
6790 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
6791 Builder.Extend(Context,
6792 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
6793 T->getTypeLoc(), ColonColonLoc);
6794 break;
6795 }
6796
6797 case NestedNameSpecifier::Global: {
6798 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
6799 Builder.MakeGlobal(Context, ColonColonLoc);
6800 break;
6801 }
6802 }
6803 }
6804
6805 return Builder.getWithLocInContext(Context);
6806}
6807
6808SourceRange
6809ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
6810 unsigned &Idx) {
6811 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
6812 SourceLocation end = ReadSourceLocation(F, Record, Idx);
6813 return SourceRange(beg, end);
6814}
6815
6816/// \brief Read an integral value
6817llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
6818 unsigned BitWidth = Record[Idx++];
6819 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
6820 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
6821 Idx += NumWords;
6822 return Result;
6823}
6824
6825/// \brief Read a signed integral value
6826llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
6827 bool isUnsigned = Record[Idx++];
6828 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
6829}
6830
6831/// \brief Read a floating-point value
Tim Northover9ec55f22013-01-22 09:46:51 +00006832llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
6833 const llvm::fltSemantics &Sem,
6834 unsigned &Idx) {
6835 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006836}
6837
6838// \brief Read a string
6839std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
6840 unsigned Len = Record[Idx++];
6841 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
6842 Idx += Len;
6843 return Result;
6844}
6845
6846VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
6847 unsigned &Idx) {
6848 unsigned Major = Record[Idx++];
6849 unsigned Minor = Record[Idx++];
6850 unsigned Subminor = Record[Idx++];
6851 if (Minor == 0)
6852 return VersionTuple(Major);
6853 if (Subminor == 0)
6854 return VersionTuple(Major, Minor - 1);
6855 return VersionTuple(Major, Minor - 1, Subminor - 1);
6856}
6857
6858CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
6859 const RecordData &Record,
6860 unsigned &Idx) {
6861 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
6862 return CXXTemporary::Create(Context, Decl);
6863}
6864
6865DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
6866 return Diag(SourceLocation(), DiagID);
6867}
6868
6869DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
6870 return Diags.Report(Loc, DiagID);
6871}
6872
6873/// \brief Retrieve the identifier table associated with the
6874/// preprocessor.
6875IdentifierTable &ASTReader::getIdentifierTable() {
6876 return PP.getIdentifierTable();
6877}
6878
6879/// \brief Record that the given ID maps to the given switch-case
6880/// statement.
6881void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
6882 assert((*CurrSwitchCaseStmts)[ID] == 0 &&
6883 "Already have a SwitchCase with this ID");
6884 (*CurrSwitchCaseStmts)[ID] = SC;
6885}
6886
6887/// \brief Retrieve the switch-case statement with the given ID.
6888SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
6889 assert((*CurrSwitchCaseStmts)[ID] != 0 && "No SwitchCase with this ID");
6890 return (*CurrSwitchCaseStmts)[ID];
6891}
6892
6893void ASTReader::ClearSwitchCaseIDs() {
6894 CurrSwitchCaseStmts->clear();
6895}
6896
6897void ASTReader::ReadComments() {
6898 std::vector<RawComment *> Comments;
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00006899 for (SmallVectorImpl<std::pair<BitstreamCursor,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006900 serialization::ModuleFile *> >::iterator
6901 I = CommentsCursors.begin(),
6902 E = CommentsCursors.end();
6903 I != E; ++I) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00006904 BitstreamCursor &Cursor = I->first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006905 serialization::ModuleFile &F = *I->second;
6906 SavedStreamPosition SavedPosition(Cursor);
6907
6908 RecordData Record;
6909 while (true) {
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00006910 llvm::BitstreamEntry Entry =
6911 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
6912
6913 switch (Entry.Kind) {
6914 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
6915 case llvm::BitstreamEntry::Error:
6916 Error("malformed block record in AST file");
6917 return;
6918 case llvm::BitstreamEntry::EndBlock:
6919 goto NextCursor;
6920 case llvm::BitstreamEntry::Record:
6921 // The interesting case.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006922 break;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006923 }
6924
6925 // Read a record.
6926 Record.clear();
Chris Lattnerb3ce3572013-01-20 02:38:54 +00006927 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006928 case COMMENTS_RAW_COMMENT: {
6929 unsigned Idx = 0;
6930 SourceRange SR = ReadSourceRange(F, Record, Idx);
6931 RawComment::CommentKind Kind =
6932 (RawComment::CommentKind) Record[Idx++];
6933 bool IsTrailingComment = Record[Idx++];
6934 bool IsAlmostTrailingComment = Record[Idx++];
6935 Comments.push_back(new (Context) RawComment(SR, Kind,
6936 IsTrailingComment,
6937 IsAlmostTrailingComment));
6938 break;
6939 }
6940 }
6941 }
Chris Lattner8f9a1eb2013-01-20 00:56:42 +00006942 NextCursor:;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006943 }
6944 Context.Comments.addCommentsToFront(Comments);
6945}
6946
6947void ASTReader::finishPendingActions() {
6948 while (!PendingIdentifierInfos.empty() || !PendingDeclChains.empty() ||
Argyrios Kyrtzidis7640b022013-02-16 00:48:59 +00006949 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty()) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006950 // If any identifiers with corresponding top-level declarations have
6951 // been loaded, load those declarations now.
Douglas Gregoraa945902013-02-18 15:53:43 +00006952 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > TopLevelDecls;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006953 while (!PendingIdentifierInfos.empty()) {
Douglas Gregoraa945902013-02-18 15:53:43 +00006954 // FIXME: std::move
6955 IdentifierInfo *II = PendingIdentifierInfos.back().first;
6956 SmallVector<uint32_t, 4> DeclIDs = PendingIdentifierInfos.back().second;
Douglas Gregorcc9bdcb2013-02-19 18:26:28 +00006957 PendingIdentifierInfos.pop_back();
Douglas Gregoraa945902013-02-18 15:53:43 +00006958
6959 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006960 }
6961
6962 // Load pending declaration chains.
6963 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
6964 loadPendingDeclChain(PendingDeclChains[I]);
6965 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
6966 }
6967 PendingDeclChains.clear();
6968
Douglas Gregoraa945902013-02-18 15:53:43 +00006969 // Make the most recent of the top-level declarations visible.
6970 for (llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >::iterator
6971 TLD = TopLevelDecls.begin(), TLDEnd = TopLevelDecls.end();
6972 TLD != TLDEnd; ++TLD) {
6973 IdentifierInfo *II = TLD->first;
6974 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
6975 NamedDecl *ND = cast<NamedDecl>(TLD->second[I]->getMostRecentDecl());
6976 SemaObj->pushExternalDeclIntoScope(ND, II);
6977 }
6978 }
6979
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006980 // Load any pending macro definitions.
6981 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00006982 // FIXME: std::move here
6983 SmallVector<MacroID, 2> GlobalIDs = PendingMacroIDs.begin()[I].second;
Argyrios Kyrtzidis9818a1d2013-02-20 00:54:57 +00006984 MacroDirective *Hint = 0;
Argyrios Kyrtzidisdc1088f2013-01-19 03:14:56 +00006985 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
6986 ++IDIdx) {
6987 Hint = getMacro(GlobalIDs[IDIdx], Hint);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006988 }
6989 }
6990 PendingMacroIDs.clear();
Argyrios Kyrtzidis7640b022013-02-16 00:48:59 +00006991
6992 // Wire up the DeclContexts for Decls that we delayed setting until
6993 // recursive loading is completed.
6994 while (!PendingDeclContextInfos.empty()) {
6995 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
6996 PendingDeclContextInfos.pop_front();
6997 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
6998 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
6999 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
7000 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007001 }
7002
7003 // If we deserialized any C++ or Objective-C class definitions, any
7004 // Objective-C protocol definitions, or any redeclarable templates, make sure
7005 // that all redeclarations point to the definitions. Note that this can only
7006 // happen now, after the redeclaration chains have been fully wired.
7007 for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(),
7008 DEnd = PendingDefinitions.end();
7009 D != DEnd; ++D) {
7010 if (TagDecl *TD = dyn_cast<TagDecl>(*D)) {
7011 if (const TagType *TagT = dyn_cast<TagType>(TD->TypeForDecl)) {
7012 // Make sure that the TagType points at the definition.
7013 const_cast<TagType*>(TagT)->decl = TD;
7014 }
7015
7016 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(*D)) {
7017 for (CXXRecordDecl::redecl_iterator R = RD->redecls_begin(),
7018 REnd = RD->redecls_end();
7019 R != REnd; ++R)
7020 cast<CXXRecordDecl>(*R)->DefinitionData = RD->DefinitionData;
7021
7022 }
7023
7024 continue;
7025 }
7026
7027 if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(*D)) {
7028 // Make sure that the ObjCInterfaceType points at the definition.
7029 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
7030 ->Decl = ID;
7031
7032 for (ObjCInterfaceDecl::redecl_iterator R = ID->redecls_begin(),
7033 REnd = ID->redecls_end();
7034 R != REnd; ++R)
7035 R->Data = ID->Data;
7036
7037 continue;
7038 }
7039
7040 if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(*D)) {
7041 for (ObjCProtocolDecl::redecl_iterator R = PD->redecls_begin(),
7042 REnd = PD->redecls_end();
7043 R != REnd; ++R)
7044 R->Data = PD->Data;
7045
7046 continue;
7047 }
7048
7049 RedeclarableTemplateDecl *RTD
7050 = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl();
7051 for (RedeclarableTemplateDecl::redecl_iterator R = RTD->redecls_begin(),
7052 REnd = RTD->redecls_end();
7053 R != REnd; ++R)
7054 R->Common = RTD->Common;
7055 }
7056 PendingDefinitions.clear();
7057
7058 // Load the bodies of any functions or methods we've encountered. We do
7059 // this now (delayed) so that we can be sure that the declaration chains
7060 // have been fully wired up.
7061 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
7062 PBEnd = PendingBodies.end();
7063 PB != PBEnd; ++PB) {
7064 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
7065 // FIXME: Check for =delete/=default?
7066 // FIXME: Complain about ODR violations here?
7067 if (!getContext().getLangOpts().Modules || !FD->hasBody())
7068 FD->setLazyBody(PB->second);
7069 continue;
7070 }
7071
7072 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
7073 if (!getContext().getLangOpts().Modules || !MD->hasBody())
7074 MD->setLazyBody(PB->second);
7075 }
7076 PendingBodies.clear();
7077}
7078
7079void ASTReader::FinishedDeserializing() {
7080 assert(NumCurrentElementsDeserializing &&
7081 "FinishedDeserializing not paired with StartedDeserializing");
7082 if (NumCurrentElementsDeserializing == 1) {
7083 // We decrease NumCurrentElementsDeserializing only after pending actions
7084 // are finished, to avoid recursively re-calling finishPendingActions().
7085 finishPendingActions();
7086 }
7087 --NumCurrentElementsDeserializing;
7088
7089 if (NumCurrentElementsDeserializing == 0 &&
7090 Consumer && !PassingDeclsToConsumer) {
7091 // Guard variable to avoid recursively redoing the process of passing
7092 // decls to consumer.
7093 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
7094 true);
7095
7096 while (!InterestingDecls.empty()) {
7097 // We are not in recursive loading, so it's safe to pass the "interesting"
7098 // decls to the consumer.
7099 Decl *D = InterestingDecls.front();
7100 InterestingDecls.pop_front();
7101 PassInterestingDeclToConsumer(D);
7102 }
7103 }
7104}
7105
7106ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context,
7107 StringRef isysroot, bool DisableValidation,
Douglas Gregorf575d6e2013-01-25 00:45:27 +00007108 bool AllowASTWithCompilerErrors, bool UseGlobalIndex)
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007109 : Listener(new PCHValidator(PP, *this)), DeserializationListener(0),
7110 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
7111 Diags(PP.getDiagnostics()), SemaObj(0), PP(PP), Context(Context),
7112 Consumer(0), ModuleMgr(PP.getFileManager()),
7113 isysroot(isysroot), DisableValidation(DisableValidation),
Douglas Gregore1698072013-01-25 00:38:33 +00007114 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
Douglas Gregorf575d6e2013-01-25 00:45:27 +00007115 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007116 CurrentGeneration(0), CurrSwitchCaseStmts(&SwitchCaseStmts),
7117 NumSLocEntriesRead(0), TotalNumSLocEntries(0),
Douglas Gregore1698072013-01-25 00:38:33 +00007118 NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0),
7119 TotalNumMacros(0), NumIdentifierLookups(0), NumIdentifierLookupHits(0),
7120 NumSelectorsRead(0), NumMethodPoolEntriesRead(0),
Douglas Gregor95fb36e2013-01-28 17:54:36 +00007121 NumMethodPoolLookups(0), NumMethodPoolHits(0),
7122 NumMethodPoolTableLookups(0), NumMethodPoolTableHits(0),
7123 TotalNumMethodPoolEntries(0),
Guy Benyei7f92f2d2012-12-18 14:30:41 +00007124 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
7125 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
7126 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
7127 PassingDeclsToConsumer(false),
7128 NumCXXBaseSpecifiersLoaded(0)
7129{
7130 SourceMgr.setExternalSLocEntrySource(this);
7131}
7132
7133ASTReader::~ASTReader() {
7134 for (DeclContextVisibleUpdatesPending::iterator
7135 I = PendingVisibleUpdates.begin(),
7136 E = PendingVisibleUpdates.end();
7137 I != E; ++I) {
7138 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
7139 F = I->second.end();
7140 J != F; ++J)
7141 delete J->first;
7142 }
7143}