1904c9c8389b65ee93a706ede911accd11e0b9d8eSebastian Redl//===--- ASTReader.cpp - AST File Reader ------------------------*- C++ -*-===//
22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//
32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//                     The LLVM Compiler Infrastructure
42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//
52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// This file is distributed under the University of Illinois Open Source
62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// License. See LICENSE.TXT for details.
72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//
82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//===----------------------------------------------------------------------===//
92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//
10c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl//  This file defines the ASTReader class, which reads AST files.
112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//
122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//===----------------------------------------------------------------------===//
134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
146ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "clang/Serialization/ASTReader.h"
156ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "clang/Serialization/ASTDeserializationListener.h"
1698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor#include "clang/Serialization/ModuleManager.h"
17a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth#include "clang/Serialization/SerializationDiagnostic.h"
180eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis#include "ASTCommon.h"
1998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor#include "ASTReaderInternals.h"
20e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Sema.h"
215f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/Scope.h"
22fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor#include "clang/AST/ASTConsumer.h"
232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/ASTContext.h"
242a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall#include "clang/AST/DeclTemplate.h"
250b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor#include "clang/AST/Expr.h"
267a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall#include "clang/AST/ExprCXX.h"
275f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor#include "clang/AST/NestedNameSpecifier.h"
282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/Type.h"
29a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#include "clang/AST/TypeLocVisitor.h"
3042d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner#include "clang/Lex/MacroInfo.h"
316a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#include "clang/Lex/PreprocessingRecord.h"
3214f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "clang/Lex/Preprocessor.h"
3383d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff#include "clang/Lex/HeaderSearch.h"
34668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor#include "clang/Basic/OnDiskHashTable.h"
3514f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "clang/Basic/SourceManager.h"
36bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor#include "clang/Basic/SourceManagerInternals.h"
3714f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "clang/Basic/FileManager.h"
3810e286aa8d39fb51a21412850265d9dae74613eeChris Lattner#include "clang/Basic/FileSystemStatCache.h"
392bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor#include "clang/Basic/TargetInfo.h"
40445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor#include "clang/Basic/Version.h"
410a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor#include "clang/Basic/VersionTuple.h"
422596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar#include "llvm/ADT/StringExtras.h"
432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "llvm/Bitcode/BitstreamReader.h"
442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "llvm/Support/MemoryBuffer.h"
45833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "llvm/Support/ErrorHandling.h"
46cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#include "llvm/Support/FileSystem.h"
4703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h"
48b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky#include "llvm/Support/SaveAndRestore.h"
493a321e23f66128dbb986343927456ff6702af617Michael J. Spencer#include "llvm/Support/system_error.h"
502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <algorithm>
51e721f95069d42b899c20c1caabdc6184dd42b820Douglas Gregor#include <iterator>
522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <cstdio>
534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#include <sys/stat.h>
54cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorusing namespace clang;
568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlusing namespace clang::serialization;
5798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorusing namespace clang::serialization::reader;
582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//===----------------------------------------------------------------------===//
603c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl// PCH validator implementation
6111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
6211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
63571db7f0cb31789737be92fce1c1b738e6dbe795Sebastian RedlASTReaderListener::~ASTReaderListener() {}
6411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
6511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidisbool
6611e51106329c550d008fad2c657c053d81611ea8Argyrios KyrtzidisPCHValidator::ReadLanguageOptions(const LangOptions &LangOpts) {
674e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &PPLangOpts = PP.getLangOpts();
687d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor
697d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor#define LANGOPT(Name, Bits, Default, Description)         \
707d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor  if (PPLangOpts.Name != LangOpts.Name) {                 \
717d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor    Reader.Diag(diag::err_pch_langopt_mismatch)           \
727d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor      << Description << LangOpts.Name << PPLangOpts.Name; \
737d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor    return true;                                          \
747d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor  }
757d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor
767d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor#define VALUE_LANGOPT(Name, Bits, Default, Description) \
777d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor  if (PPLangOpts.Name != LangOpts.Name) {               \
787d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor    Reader.Diag(diag::err_pch_langopt_value_mismatch)   \
797d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor      << Description;                                   \
807d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor  return true;                                          \
817d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor}
827d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor
837d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
847d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor  if (PPLangOpts.get##Name() != LangOpts.get##Name()) {      \
857d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor    Reader.Diag(diag::err_pch_langopt_value_mismatch)        \
867d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor      << Description;                                        \
877d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor    return true;                                             \
8811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  }
8911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
907d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor#define BENIGN_LANGOPT(Name, Bits, Default, Description)
917d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
927d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor#include "clang/Basic/LangOptions.def"
93260611a32535c851237926bfcf78869b13c07d5bJohn McCall
94260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (PPLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
95260611a32535c851237926bfcf78869b13c07d5bJohn McCall    Reader.Diag(diag::err_pch_langopt_value_mismatch)
96260611a32535c851237926bfcf78869b13c07d5bJohn McCall      << "target Objective-C runtime";
97260611a32535c851237926bfcf78869b13c07d5bJohn McCall    return true;
98260611a32535c851237926bfcf78869b13c07d5bJohn McCall  }
997d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor
10011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  return false;
10111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis}
10211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
1035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerbool PCHValidator::ReadTargetTriple(StringRef Triple) {
104dc3c0d20375bda7775b2fade05b20e315798b9feDaniel Dunbar  if (Triple == PP.getTargetInfo().getTriple().str())
105dc3c0d20375bda7775b2fade05b20e315798b9feDaniel Dunbar    return false;
106dc3c0d20375bda7775b2fade05b20e315798b9feDaniel Dunbar
107dc3c0d20375bda7775b2fade05b20e315798b9feDaniel Dunbar  Reader.Diag(diag::warn_pch_target_triple)
108dc3c0d20375bda7775b2fade05b20e315798b9feDaniel Dunbar    << Triple << PP.getTargetInfo().getTriple().str();
109dc3c0d20375bda7775b2fade05b20e315798b9feDaniel Dunbar  return true;
11011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis}
11111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
11254353f48939327a4aa41ea3f3ec07b936bd02ef5Benjamin Kramernamespace {
11354353f48939327a4aa41ea3f3ec07b936bd02ef5Benjamin Kramer  struct EmptyStringRef {
1145f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    bool operator ()(StringRef r) const { return r.empty(); }
11554353f48939327a4aa41ea3f3ec07b936bd02ef5Benjamin Kramer  };
11654353f48939327a4aa41ea3f3ec07b936bd02ef5Benjamin Kramer  struct EmptyBlock {
11754353f48939327a4aa41ea3f3ec07b936bd02ef5Benjamin Kramer    bool operator ()(const PCHPredefinesBlock &r) const {return r.Data.empty();}
11854353f48939327a4aa41ea3f3ec07b936bd02ef5Benjamin Kramer  };
11954353f48939327a4aa41ea3f3ec07b936bd02ef5Benjamin Kramer}
1207e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl
1215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic bool EqualConcatenations(SmallVector<StringRef, 2> L,
1227e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl                                PCHPredefinesBlocks R) {
1237e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  // First, sum up the lengths.
1247e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  unsigned LL = 0, RL = 0;
1257e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  for (unsigned I = 0, N = L.size(); I != N; ++I) {
1267e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    LL += L[I].size();
1277e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  }
1287e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  for (unsigned I = 0, N = R.size(); I != N; ++I) {
1297e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    RL += R[I].Data.size();
1307e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  }
1317e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  if (LL != RL)
1327e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    return false;
1337e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  if (LL == 0 && RL == 0)
1347e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    return true;
1357e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl
1367e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  // Kick out empty parts, they confuse the algorithm below.
1377e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  L.erase(std::remove_if(L.begin(), L.end(), EmptyStringRef()), L.end());
1387e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  R.erase(std::remove_if(R.begin(), R.end(), EmptyBlock()), R.end());
1397e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl
1407e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  // Do it the hard way. At this point, both vectors must be non-empty.
1415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef LR = L[0], RR = R[0].Data;
1427e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  unsigned LI = 0, RI = 0, LN = L.size(), RN = R.size();
143c76c9e0856ff3aa47590474c9404dfb598c0564cDaniel Dunbar  (void) RN;
1447e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  for (;;) {
1457e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    // Compare the current pieces.
1467e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    if (LR.size() == RR.size()) {
1477e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      // If they're the same length, it's pretty easy.
1487e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      if (LR != RR)
1497e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl        return false;
1507e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      // Both pieces are done, advance.
1517e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      ++LI;
1527e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      ++RI;
1537e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      // If either string is done, they're both done, since they're the same
1547e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      // length.
1557e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      if (LI == LN) {
1567e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl        assert(RI == RN && "Strings not the same length after all?");
1577e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl        return true;
1587e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      }
1597e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      LR = L[LI];
1607e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      RR = R[RI].Data;
1617e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    } else if (LR.size() < RR.size()) {
1627e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      // Right piece is longer.
1637e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      if (!RR.startswith(LR))
1647e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl        return false;
1657e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      ++LI;
1667e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      assert(LI != LN && "Strings not the same length after all?");
1677e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      RR = RR.substr(LR.size());
1687e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      LR = L[LI];
1697e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    } else {
1707e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      // Left piece is longer.
1717e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      if (!LR.startswith(RR))
1727e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl        return false;
1737e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      ++RI;
1747e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      assert(RI != RN && "Strings not the same length after all?");
1757e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      LR = LR.substr(RR.size());
1767e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      RR = R[RI].Data;
1777e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    }
1787e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  }
1797e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl}
1807e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl
1815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic std::pair<FileID, StringRef::size_type>
1825f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerFindMacro(const PCHPredefinesBlocks &Buffers, StringRef MacroDef) {
1835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  std::pair<FileID, StringRef::size_type> Res;
1847e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  for (unsigned I = 0, N = Buffers.size(); I != N; ++I) {
1857e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    Res.second = Buffers[I].Data.find(MacroDef);
1865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    if (Res.second != StringRef::npos) {
1877e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      Res.first = Buffers[I].BufferID;
1887e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      break;
1897e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    }
1907e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  }
1917e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  return Res;
1927e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl}
1937e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl
1947e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redlbool PCHValidator::ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers,
1955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                        StringRef OriginalFileName,
196277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky                                        std::string &SuggestedPredefines,
197277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky                                        FileManager &FileMgr) {
198c7162937a4ccd044a0df67eed4a73ee828c49162Daniel Dunbar  // We are in the context of an implicit include, so the predefines buffer will
199c7162937a4ccd044a0df67eed4a73ee828c49162Daniel Dunbar  // have a #include entry for the PCH file itself (as normalized by the
200c7162937a4ccd044a0df67eed4a73ee828c49162Daniel Dunbar  // preprocessor initialization). Find it and skip over it in the checking
201c7162937a4ccd044a0df67eed4a73ee828c49162Daniel Dunbar  // below.
202f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<256> PCHInclude;
2037b5a1210d93ca62ecd61800f245c87259b1f8f79Daniel Dunbar  PCHInclude += "#include \"";
204cb381eac84e5a14a8c7e7654eadbe1d3d54d795cChandler Carruth  PCHInclude += HeaderSearch::NormalizeDashIncludePath(OriginalFileName,
205cb381eac84e5a14a8c7e7654eadbe1d3d54d795cChandler Carruth                                                       FileMgr);
2067b5a1210d93ca62ecd61800f245c87259b1f8f79Daniel Dunbar  PCHInclude += "\"\n";
2075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  std::pair<StringRef,StringRef> Split =
2085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef(PP.getPredefines()).split(PCHInclude.str());
2095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef Left =  Split.first, Right = Split.second;
210d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek  if (Left == PP.getPredefines()) {
211d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    Error("Missing PCH include entry!");
212d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    return true;
213d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek  }
2147b5a1210d93ca62ecd61800f245c87259b1f8f79Daniel Dunbar
2157e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  // If the concatenation of all the PCH buffers is equal to the adjusted
2167e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  // command line, we're done.
2175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<StringRef, 2> CommandLine;
2187e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  CommandLine.push_back(Left);
2197e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  CommandLine.push_back(Right);
2207e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  if (EqualConcatenations(CommandLine, Buffers))
22111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    return false;
22211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
22311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  SourceManager &SourceMgr = PP.getSourceManager();
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22510014aa55cf58b971dd6f33767322549551ee07aDaniel Dunbar  // The predefines buffers are different. Determine what the differences are,
22610014aa55cf58b971dd6f33767322549551ee07aDaniel Dunbar  // and whether they require us to reject the PCH file.
2275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<StringRef, 8> PCHLines;
2287e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl  for (unsigned I = 0, N = Buffers.size(); I != N; ++I)
2297e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    Buffers[I].Data.split(PCHLines, "\n", /*MaxSplit=*/-1, /*KeepEmpty=*/false);
230e675049aa302bf07472ae6e76ff66e6f5427eff9Daniel Dunbar
2315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<StringRef, 8> CmdLineLines;
232e675049aa302bf07472ae6e76ff66e6f5427eff9Daniel Dunbar  Left.split(CmdLineLines, "\n", /*MaxSplit=*/-1, /*KeepEmpty=*/false);
233297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis
234297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  // Pick out implicit #includes after the PCH and don't consider them for
235297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  // validation; we will insert them into SuggestedPredefines so that the
236297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  // preprocessor includes them.
237297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  std::string IncludesAfterPCH;
2385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<StringRef, 8> AfterPCHLines;
239297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  Right.split(AfterPCHLines, "\n", /*MaxSplit=*/-1, /*KeepEmpty=*/false);
240297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  for (unsigned i = 0, e = AfterPCHLines.size(); i != e; ++i) {
241297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    if (AfterPCHLines[i].startswith("#include ")) {
242297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis      IncludesAfterPCH += AfterPCHLines[i];
243297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis      IncludesAfterPCH += '\n';
244297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    } else {
245297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis      CmdLineLines.push_back(AfterPCHLines[i]);
246297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    }
247297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  }
248297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis
249297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  // Make sure we add the includes last into SuggestedPredefines before we
250297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  // exit this function.
251297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  struct AddIncludesRAII {
252297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    std::string &SuggestedPredefines;
253297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    std::string &IncludesAfterPCH;
254297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis
255297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    AddIncludesRAII(std::string &SuggestedPredefines,
256297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis                    std::string &IncludesAfterPCH)
257297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis      : SuggestedPredefines(SuggestedPredefines),
258297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis        IncludesAfterPCH(IncludesAfterPCH) { }
259297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    ~AddIncludesRAII() {
260297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis      SuggestedPredefines += IncludesAfterPCH;
261297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    }
262297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis  } AddIncludes(SuggestedPredefines, IncludesAfterPCH);
26311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
2644d5936aaa4e4e2d41fe79101ac9c09444951448fDaniel Dunbar  // Sort both sets of predefined buffer lines, since we allow some extra
2654d5936aaa4e4e2d41fe79101ac9c09444951448fDaniel Dunbar  // definitions and they may appear at any point in the output.
26611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  std::sort(CmdLineLines.begin(), CmdLineLines.end());
26711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  std::sort(PCHLines.begin(), PCHLines.end());
26811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
2694d5936aaa4e4e2d41fe79101ac9c09444951448fDaniel Dunbar  // Determine which predefines that were used to build the PCH file are missing
2704d5936aaa4e4e2d41fe79101ac9c09444951448fDaniel Dunbar  // from the command line.
2715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  std::vector<StringRef> MissingPredefines;
27211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  std::set_difference(PCHLines.begin(), PCHLines.end(),
27311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis                      CmdLineLines.begin(), CmdLineLines.end(),
27411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis                      std::back_inserter(MissingPredefines));
27511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
27611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  bool MissingDefines = false;
27711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  bool ConflictingDefines = false;
27811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  for (unsigned I = 0, N = MissingPredefines.size(); I != N; ++I) {
2795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Missing = MissingPredefines[I];
280297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    if (Missing.startswith("#include ")) {
281297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis      // An -include was specified when generating the PCH; it is included in
282297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis      // the PCH, just ignore it.
283297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis      continue;
284297c706f219701b4c9464cccf527f3fe833afc95Argyrios Kyrtzidis    }
2854d5936aaa4e4e2d41fe79101ac9c09444951448fDaniel Dunbar    if (!Missing.startswith("#define ")) {
28611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      Reader.Diag(diag::warn_pch_compiler_options_mismatch);
28711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      return true;
28811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    }
2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29010014aa55cf58b971dd6f33767322549551ee07aDaniel Dunbar    // This is a macro definition. Determine the name of the macro we're
29110014aa55cf58b971dd6f33767322549551ee07aDaniel Dunbar    // defining.
29211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    std::string::size_type StartOfMacroName = strlen("#define ");
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    std::string::size_type EndOfMacroName
29411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      = Missing.find_first_of("( \n\r", StartOfMacroName);
29511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    assert(EndOfMacroName != std::string::npos &&
29611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis           "Couldn't find the end of the macro name");
2975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef MacroName = Missing.slice(StartOfMacroName, EndOfMacroName);
29811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
29910014aa55cf58b971dd6f33767322549551ee07aDaniel Dunbar    // Determine whether this macro was given a different definition on the
30010014aa55cf58b971dd6f33767322549551ee07aDaniel Dunbar    // command line.
3014d5936aaa4e4e2d41fe79101ac9c09444951448fDaniel Dunbar    std::string MacroDefStart = "#define " + MacroName.str();
30211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    std::string::size_type MacroDefLen = MacroDefStart.size();
3035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<StringRef, 8>::iterator ConflictPos
30411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      = std::lower_bound(CmdLineLines.begin(), CmdLineLines.end(),
30511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis                         MacroDefStart);
30611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    for (; ConflictPos != CmdLineLines.end(); ++ConflictPos) {
30710014aa55cf58b971dd6f33767322549551ee07aDaniel Dunbar      if (!ConflictPos->startswith(MacroDefStart)) {
30811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis        // Different macro; we're done.
30911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis        ConflictPos = CmdLineLines.end();
3101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        break;
31111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      }
3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      assert(ConflictPos->size() > MacroDefLen &&
31411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis             "Invalid #define in predefines buffer?");
3151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if ((*ConflictPos)[MacroDefLen] != ' ' &&
31611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis          (*ConflictPos)[MacroDefLen] != '(')
31711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis        continue; // Longer macro name; keep trying.
3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      // We found a conflicting macro definition.
32011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      break;
32111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    }
3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    if (ConflictPos != CmdLineLines.end()) {
32411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      Reader.Diag(diag::warn_cmdline_conflicting_macro_def)
32511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis          << MacroName;
32611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
32711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      // Show the definition of this macro within the PCH file.
3285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      std::pair<FileID, StringRef::size_type> MacroLoc =
3297e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl          FindMacro(Buffers, Missing);
3305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      assert(MacroLoc.second!=StringRef::npos && "Unable to find macro!");
3317e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      SourceLocation PCHMissingLoc =
3327e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl          SourceMgr.getLocForStartOfFile(MacroLoc.first)
333a64ccefdf0ea4e03ec88805d71b0af74950c7472Argyrios Kyrtzidis            .getLocWithOffset(MacroLoc.second);
3344d5936aaa4e4e2d41fe79101ac9c09444951448fDaniel Dunbar      Reader.Diag(PCHMissingLoc, diag::note_pch_macro_defined_as) << MacroName;
33511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
33611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      ConflictingDefines = true;
33711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      continue;
33811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    }
3391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34010014aa55cf58b971dd6f33767322549551ee07aDaniel Dunbar    // If the macro doesn't conflict, then we'll just pick up the macro
34110014aa55cf58b971dd6f33767322549551ee07aDaniel Dunbar    // definition from the PCH file. Warn the user that they made a mistake.
34211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    if (ConflictingDefines)
34311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      continue; // Don't complain if there are already conflicting defs
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    if (!MissingDefines) {
34611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      Reader.Diag(diag::warn_cmdline_missing_macro_defs);
34711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      MissingDefines = true;
34811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    }
34911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
35011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    // Show the definition of this macro within the PCH file.
3515f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    std::pair<FileID, StringRef::size_type> MacroLoc =
3527e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl        FindMacro(Buffers, Missing);
3535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    assert(MacroLoc.second!=StringRef::npos && "Unable to find macro!");
3547e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    SourceLocation PCHMissingLoc =
3557e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl        SourceMgr.getLocForStartOfFile(MacroLoc.first)
356a64ccefdf0ea4e03ec88805d71b0af74950c7472Argyrios Kyrtzidis          .getLocWithOffset(MacroLoc.second);
35711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    Reader.Diag(PCHMissingLoc, diag::note_using_macro_def_from_pch);
35811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  }
3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  if (ConflictingDefines)
36111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    return true;
3621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  // Determine what predefines were introduced based on command-line
36411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  // parameters that were not present when building the PCH
36511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  // file. Extra #defines are okay, so long as the identifiers being
36611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  // defined were not used within the precompiled header.
3675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  std::vector<StringRef> ExtraPredefines;
36811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  std::set_difference(CmdLineLines.begin(), CmdLineLines.end(),
36911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis                      PCHLines.begin(), PCHLines.end(),
3701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                      std::back_inserter(ExtraPredefines));
37111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  for (unsigned I = 0, N = ExtraPredefines.size(); I != N; ++I) {
3725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef &Extra = ExtraPredefines[I];
3734d5936aaa4e4e2d41fe79101ac9c09444951448fDaniel Dunbar    if (!Extra.startswith("#define ")) {
37411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      Reader.Diag(diag::warn_pch_compiler_options_mismatch);
37511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      return true;
37611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    }
37711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
37811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    // This is an extra macro definition. Determine the name of the
37911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    // macro we're defining.
38011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    std::string::size_type StartOfMacroName = strlen("#define ");
3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    std::string::size_type EndOfMacroName
38211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      = Extra.find_first_of("( \n\r", StartOfMacroName);
38311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    assert(EndOfMacroName != std::string::npos &&
38411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis           "Couldn't find the end of the macro name");
3855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef MacroName = Extra.slice(StartOfMacroName, EndOfMacroName);
38611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
38711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    // Check whether this name was used somewhere in the PCH file. If
38811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    // so, defining it as a macro could change behavior, so we reject
38911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    // the PCH file.
3904d5936aaa4e4e2d41fe79101ac9c09444951448fDaniel Dunbar    if (IdentifierInfo *II = Reader.get(MacroName)) {
3914fda42eb963ad93f57fa18a511004b4bfc7332deDaniel Dunbar      Reader.Diag(diag::warn_macro_name_used_in_pch) << II;
39211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      return true;
39311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    }
39411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
39511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    // Add this definition to the suggested predefines buffer.
39611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    SuggestedPredefines += Extra;
39711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    SuggestedPredefines += '\n';
39811e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  }
39911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
40011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  // If we get here, it's because the predefines buffer had compatible
40111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  // contents. Accept the PCH file.
40211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  return false;
40311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis}
40411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
40512fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregorvoid PCHValidator::ReadHeaderFileInfo(const HeaderFileInfo &HFI,
40612fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor                                      unsigned ID) {
40712fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor  PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, ID);
40812fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor  ++NumHeaderInfos;
40911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis}
41011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
41111e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidisvoid PCHValidator::ReadCounter(unsigned Value) {
41211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  PP.setCounterValue(Value);
41311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis}
41411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
41511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
416c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl// AST reader implementation
4174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//===----------------------------------------------------------------------===//
4181eb5540760dc79502e32d4fe9c28217476ea14b9Steve Naroff
419ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redlvoid
420571db7f0cb31789737be92fce1c1b738e6dbe795Sebastian RedlASTReader::setDeserializationListener(ASTDeserializationListener *Listener) {
421ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl  DeserializationListener = Listener;
422ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl}
423ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl
424668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorunsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
42798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return serialization::ComputeHash(Sel);
42898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
430f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
43198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorstd::pair<unsigned, unsigned>
43298339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
43398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  using namespace clang::io;
43498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned KeyLen = ReadUnalignedLE16(d);
43598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned DataLen = ReadUnalignedLE16(d);
43698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return std::make_pair(KeyLen, DataLen);
43798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
438f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
43998339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTSelectorLookupTrait::internal_key_type
44098339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
44198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  using namespace clang::io;
442359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  SelectorTable &SelTable = Reader.getContext().Selectors;
44398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned N = ReadUnalignedLE16(d);
44498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  IdentifierInfo *FirstII
44598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    = Reader.getLocalIdentifier(F, ReadUnalignedLE32(d));
44698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  if (N == 0)
44798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    return SelTable.getNullarySelector(FirstII);
44898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  else if (N == 1)
44998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    return SelTable.getUnarySelector(FirstII);
4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  SmallVector<IdentifierInfo *, 16> Args;
45298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  Args.push_back(FirstII);
45398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  for (unsigned I = 1; I != N; ++I)
45498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Args.push_back(Reader.getLocalIdentifier(F, ReadUnalignedLE32(d)));
455f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
45698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return SelTable.getSelector(N, Args.data());
45798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
458f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
45998339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTSelectorLookupTrait::data_type
46098339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
46198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor                                 unsigned DataLen) {
46298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  using namespace clang::io;
4635d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl
46498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  data_type Result;
465f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
46698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  Result.ID = Reader.getGlobalSelectorID(F, ReadUnalignedLE32(d));
46798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned NumInstanceMethods = ReadUnalignedLE16(d);
46898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned NumFactoryMethods = ReadUnalignedLE16(d);
469f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
47098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // Load instance methods
47198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  for (unsigned I = 0; I != NumInstanceMethods; ++I) {
47298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    if (ObjCMethodDecl *Method
47398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor          = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d)))
47498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor      Result.Instance.push_back(Method);
475f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor  }
476668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
47798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // Load factory methods
47898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  for (unsigned I = 0; I != NumFactoryMethods; ++I) {
47998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    if (ObjCMethodDecl *Method
48098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor          = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d)))
48198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor      Result.Factory.push_back(Method);
482668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  }
4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return Result;
48598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
4861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorunsigned ASTIdentifierLookupTrait::ComputeHash(const internal_key_type& a) {
48898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return llvm::HashString(StringRef(a.first, a.second));
48998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorstd::pair<unsigned, unsigned>
49298339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTIdentifierLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
49398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  using namespace clang::io;
49498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned DataLen = ReadUnalignedLE16(d);
49598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned KeyLen = ReadUnalignedLE16(d);
49698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return std::make_pair(KeyLen, DataLen);
49798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
49895f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
49998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorstd::pair<const char*, unsigned>
50098339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTIdentifierLookupTrait::ReadKey(const unsigned char* d, unsigned n) {
50198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  assert(n >= 2 && d[n-1] == '\0');
50298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return std::make_pair((const char*) d, n-1);
50398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
5041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50598339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorIdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
50698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor                                                   const unsigned char* d,
50798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor                                                   unsigned DataLen) {
50898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  using namespace clang::io;
50998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned RawID = ReadUnalignedLE32(d);
51098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  bool IsInteresting = RawID & 0x01;
5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // Wipe out the "is interesting" bit.
51398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  RawID = RawID >> 1;
514a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor
51598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
51698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  if (!IsInteresting) {
51798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    // For uninteresting identifiers, just build the IdentifierInfo
51898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    // and associate it with the persistent ID.
519668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    IdentifierInfo *II = KnownII;
5205d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor    if (!II) {
5216ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor      II = &Reader.getIdentifierTable().getOwn(StringRef(k.first, k.second));
5225d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor      KnownII = II;
5235d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor    }
524668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    Reader.SetIdentifierInfo(ID, II);
5253c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    II->setIsFromAST();
526057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor    Reader.markIdentifierUpToDate(II);
52711e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    return II;
528e721f95069d42b899c20c1caabdc6184dd42b820Douglas Gregor  }
5295d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
53098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned Bits = ReadUnalignedLE16(d);
53198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  bool CPlusPlusOperatorKeyword = Bits & 0x01;
53298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  Bits >>= 1;
53398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
53498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  Bits >>= 1;
53598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  bool Poisoned = Bits & 0x01;
53698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  Bits >>= 1;
53798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  bool ExtensionToken = Bits & 0x01;
53898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  Bits >>= 1;
53998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  bool hasMacroDefinition = Bits & 0x01;
54098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  Bits >>= 1;
541925be547b163675b312e3cac0cc7f37f31d787c1Craig Topper  unsigned ObjCOrBuiltinID = Bits & 0x7FF;
542925be547b163675b312e3cac0cc7f37f31d787c1Craig Topper  Bits >>= 11;
54398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
54498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  assert(Bits == 0 && "Extra bits in the identifier?");
54598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  DataLen -= 6;
54698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
54798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // Build the IdentifierInfo itself and link the identifier ID with
54898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // the new IdentifierInfo.
54998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  IdentifierInfo *II = KnownII;
5505d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor  if (!II) {
55198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    II = &Reader.getIdentifierTable().getOwn(StringRef(k.first, k.second));
5525d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor    KnownII = II;
5535d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor  }
554057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  Reader.markIdentifierUpToDate(II);
555eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  II->setIsFromAST();
55698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
55798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // Set or check the various bits in the IdentifierInfo structure.
55898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // Token IDs are read-only.
55998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  if (HasRevertedTokenIDToIdentifier)
56098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    II->RevertTokenIDToIdentifier();
56198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  II->setObjCOrBuiltinID(ObjCOrBuiltinID);
56298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  assert(II->isExtensionToken() == ExtensionToken &&
56398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor         "Incorrect extension token flag");
56498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  (void)ExtensionToken;
56598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  if (Poisoned)
56698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    II->setIsPoisoned(true);
56798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
56898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor         "Incorrect C++ operator keyword flag");
56998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  (void)CPlusPlusOperatorKeyword;
57098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
57198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // If this identifier is a macro, deserialize the macro
57298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // definition.
57398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  if (hasMacroDefinition) {
57498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    // FIXME: Check for conflicts?
57598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    uint32_t Offset = ReadUnalignedLE32(d);
5761329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    unsigned LocalSubmoduleID = ReadUnalignedLE32(d);
5771329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor
5781329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    // Determine whether this macro definition should be visible now, or
5791329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    // whether it is in a hidden submodule.
5801329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    bool Visible = true;
5811329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    if (SubmoduleID GlobalSubmoduleID
5821329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor          = Reader.getGlobalSubmoduleID(F, LocalSubmoduleID)) {
5831329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor      if (Module *Owner = Reader.getSubmodule(GlobalSubmoduleID)) {
5841329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor        if (Owner->NameVisibility == Module::Hidden) {
5851329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor          // The owning module is not visible, and this macro definition should
5861329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor          // not be, either.
5871329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor          Visible = false;
5881329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor
5891329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor          // Note that this macro definition was hidden because its owning
5901329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor          // module is not yet visible.
5911329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor          Reader.HiddenNamesMap[Owner].push_back(II);
5921329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor        }
5931329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor      }
5941329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    }
5951329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor
5961329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    Reader.setIdentifierIsMacro(II, F, Offset, Visible);
5971329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    DataLen -= 8;
59898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  }
59998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
600eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  Reader.SetIdentifierInfo(ID, II);
601eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
60298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // Read all of the declarations visible at global scope with this
60398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // name.
60498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  if (DataLen > 0) {
60598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    SmallVector<uint32_t, 4> DeclIDs;
60698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    for (; DataLen > 0; DataLen -= 4)
60798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor      DeclIDs.push_back(Reader.getGlobalDeclID(F, ReadUnalignedLE32(d)));
60898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Reader.SetGloballyVisibleDecls(II, DeclIDs);
60998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  }
61098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
61198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return II;
61298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
61398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
61498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorunsigned
61598339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
61698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  llvm::FoldingSetNodeID ID;
61798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  ID.AddInteger(Key.Kind);
61898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
61998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  switch (Key.Kind) {
62098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::Identifier:
62198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXLiteralOperatorName:
62298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    ID.AddString(((IdentifierInfo*)Key.Data)->getName());
62398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
62498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
62598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
62698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
62798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
62898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
62998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXOperatorName:
63098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    ID.AddInteger((OverloadedOperatorKind)Key.Data);
63198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
63298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXConstructorName:
63398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXDestructorName:
63498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
63598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
63698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
6375d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis  }
6385d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
63998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return ID.ComputeHash();
64098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
64120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
64298339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTDeclContextNameLookupTrait::internal_key_type
64398339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTDeclContextNameLookupTrait::GetInternalKey(
64498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor                                          const external_key_type& Name) const {
64598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  DeclNameKey Key;
64698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  Key.Kind = Name.getNameKind();
64798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  switch (Name.getNameKind()) {
64898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::Identifier:
64998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data = (uint64_t)Name.getAsIdentifierInfo();
65098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
65198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
65298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
65398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
65498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
65598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
65698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXOperatorName:
65798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data = Name.getCXXOverloadedOperator();
65898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
65998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXLiteralOperatorName:
66098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
66198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
66298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXConstructorName:
66398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXDestructorName:
66498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
66598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
66698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data = 0;
66798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
6685d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis  }
6695d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
67098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return Key;
67198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
672a60786b46eaa4766bb57fb3ca4e0191b3f73e42aArgyrios Kyrtzidis
67398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorstd::pair<unsigned, unsigned>
67498339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
67598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  using namespace clang::io;
67698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned KeyLen = ReadUnalignedLE16(d);
67798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned DataLen = ReadUnalignedLE16(d);
67898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return std::make_pair(KeyLen, DataLen);
67998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
68020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
68198339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTDeclContextNameLookupTrait::internal_key_type
68298339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
68398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  using namespace clang::io;
6845d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
68598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  DeclNameKey Key;
68698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  Key.Kind = (DeclarationName::NameKind)*d++;
68798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  switch (Key.Kind) {
68898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::Identifier:
68998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d));
69098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
69198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
69298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
69398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
69498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data =
69598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor       (uint64_t)Reader.getLocalSelector(F, ReadUnalignedLE32(d))
69698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor                   .getAsOpaquePtr();
69798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
69898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXOperatorName:
69998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data = *d++; // OverloadedOperatorKind
70098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
70198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXLiteralOperatorName:
70298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d));
70398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
70498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXConstructorName:
70598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXDestructorName:
70698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
70798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
70898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    Key.Data = 0;
70998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    break;
7105d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis  }
7115d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
71298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return Key;
71398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
7145d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
71598339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTDeclContextNameLookupTrait::data_type
71698339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorASTDeclContextNameLookupTrait::ReadData(internal_key_type,
71798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor                                        const unsigned char* d,
718b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky                                        unsigned DataLen) {
71998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  using namespace clang::io;
72098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned NumDecls = ReadUnalignedLE16(d);
7219b8b20f7a4e2d2557fc49149ebd0df7a7b2c57ddDouglas Gregor  LE32DeclID *Start = (LE32DeclID *)d;
72298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return std::make_pair(Start, Start + NumDecls);
72398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
7245d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
7251a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorbool ASTReader::ReadDeclContextStorage(ModuleFile &M,
7260d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor                                       llvm::BitstreamCursor &Cursor,
727074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis                                   const std::pair<uint64_t, uint64_t> &Offsets,
728074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis                                       DeclContextInfo &Info) {
729074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  SavedStreamPosition SavedPosition(Cursor);
730074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  // First the lexical decls.
731074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  if (Offsets.first != 0) {
732074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    Cursor.JumpToBit(Offsets.first);
733074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
734074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    RecordData Record;
735074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    const char *Blob;
736074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    unsigned BlobLen;
737074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    unsigned Code = Cursor.ReadCode();
738074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    unsigned RecCode = Cursor.ReadRecord(Code, Record, &Blob, &BlobLen);
739074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    if (RecCode != DECL_CONTEXT_LEXICAL) {
740074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      Error("Expected lexical block");
741074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      return true;
742074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    }
743074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
744eb5e9986e577b1e2bff3cca5973a2494fb593fbbArgyrios Kyrtzidis    Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob);
745eb5e9986e577b1e2bff3cca5973a2494fb593fbbArgyrios Kyrtzidis    Info.NumLexicalDecls = BlobLen / sizeof(KindDeclIDPair);
746074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  }
747074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
748074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  // Now the lookup table.
749074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  if (Offsets.second != 0) {
750074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    Cursor.JumpToBit(Offsets.second);
751074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
752074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    RecordData Record;
753074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    const char *Blob;
754074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    unsigned BlobLen;
755074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    unsigned Code = Cursor.ReadCode();
756074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    unsigned RecCode = Cursor.ReadRecord(Code, Record, &Blob, &BlobLen);
757074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    if (RecCode != DECL_CONTEXT_VISIBLE) {
758074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      Error("Expected visible lookup table block");
759074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      return true;
760074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    }
761074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    Info.NameLookupTableData
762074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      = ASTDeclContextNameLookupTable::Create(
763074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis                    (const unsigned char *)Blob + Record[0],
764074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis                    (const unsigned char *)Blob,
7650d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor                    ASTDeclContextNameLookupTrait(*this, M));
766074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  }
767074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
768074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  return false;
769074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis}
770074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
7715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid ASTReader::Error(StringRef Msg) {
7728d8f2c20f3e21c7516e5d27293f08283913904d1Argyrios Kyrtzidis  Error(diag::err_fe_pch_malformed, Msg);
7738d8f2c20f3e21c7516e5d27293f08283913904d1Argyrios Kyrtzidis}
7748d8f2c20f3e21c7516e5d27293f08283913904d1Argyrios Kyrtzidis
7758d8f2c20f3e21c7516e5d27293f08283913904d1Argyrios Kyrtzidisvoid ASTReader::Error(unsigned DiagID,
7765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                      StringRef Arg1, StringRef Arg2) {
7778d8f2c20f3e21c7516e5d27293f08283913904d1Argyrios Kyrtzidis  if (Diags.isDiagnosticInFlight())
7788d8f2c20f3e21c7516e5d27293f08283913904d1Argyrios Kyrtzidis    Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
7798d8f2c20f3e21c7516e5d27293f08283913904d1Argyrios Kyrtzidis  else
7808d8f2c20f3e21c7516e5d27293f08283913904d1Argyrios Kyrtzidis    Diag(DiagID) << Arg1 << Arg2;
781e721f95069d42b899c20c1caabdc6184dd42b820Douglas Gregor}
782e721f95069d42b899c20c1caabdc6184dd42b820Douglas Gregor
7833c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl/// \brief Tell the AST listener about the predefines buffers in the chain.
784c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlbool ASTReader::CheckPredefinesBuffers() {
78511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  if (Listener)
7867e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl    return Listener->ReadPredefinesBuffer(PCHPredefinesBuffers,
7877b5a1210d93ca62ecd61800f245c87259b1f8f79Daniel Dunbar                                          ActualOriginalFileName,
788277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky                                          SuggestedPredefines,
789277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky                                          FileMgr);
790e721f95069d42b899c20c1caabdc6184dd42b820Douglas Gregor  return false;
791e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor}
792e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor
7934fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===//
7944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor// Source Manager Deserialization
7954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===//
7964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
797bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor/// \brief Read the line table in the source manager block.
798c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl/// \returns true if there was an error.
7991a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorbool ASTReader::ParseLineTable(ModuleFile &F,
8005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                               SmallVectorImpl<uint64_t> &Record) {
801bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  unsigned Idx = 0;
802bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  LineTableInfo &LineTable = SourceMgr.getLineTable();
803bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor
804bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  // Parse the file names
805ff0a9872aafbe9c0c37b06f33ed013471fc361f8Douglas Gregor  std::map<int, int> FileIDs;
806ff0a9872aafbe9c0c37b06f33ed013471fc361f8Douglas Gregor  for (int I = 0, N = Record[Idx++]; I != N; ++I) {
807bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    // Extract the file name
808bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    unsigned FilenameLen = Record[Idx++];
809bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
810bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    Idx += FilenameLen;
811e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    MaybeAddSystemRootToFilename(Filename);
81265aa6885818d4b4eea2e5a9d12085b2398148662Jay Foad    FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
813bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  }
814bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor
815bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  // Parse the line entries
816bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  std::vector<LineEntry> Entries;
817bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  while (Idx < Record.size()) {
818f52a5d23965abe1a11ca7f283fec1adc1a339516Argyrios Kyrtzidis    int FID = Record[Idx++];
819f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    assert(FID >= 0 && "Serialized line entries for non-local file.");
820f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    // Remap FileID from 1-based old view.
821f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    FID += F.SLocEntryBaseID - 1;
822bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor
823bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    // Extract the line entries
824bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    unsigned NumEntries = Record[Idx++];
825f52a5d23965abe1a11ca7f283fec1adc1a339516Argyrios Kyrtzidis    assert(NumEntries && "Numentries is 00000");
826bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    Entries.clear();
827bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    Entries.reserve(NumEntries);
828bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    for (unsigned I = 0; I != NumEntries; ++I) {
829bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor      unsigned FileOffset = Record[Idx++];
830bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor      unsigned LineNo = Record[Idx++];
831f52a5d23965abe1a11ca7f283fec1adc1a339516Argyrios Kyrtzidis      int FilenameID = FileIDs[Record[Idx++]];
8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SrcMgr::CharacteristicKind FileKind
833bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor        = (SrcMgr::CharacteristicKind)Record[Idx++];
834bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor      unsigned IncludeOffset = Record[Idx++];
835bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor      Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
836bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor                                       FileKind, IncludeOffset));
837bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    }
83847d9de678162202786aa5f8aa153a7c58a4cebd4Douglas Gregor    LineTable.AddEntry(FileID::get(FID), Entries);
839bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  }
840bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor
841bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  return false;
842bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor}
843bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor
8444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregornamespace {
8454fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8463c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redlclass ASTStatData {
8474fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorpublic:
8484fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  const ino_t ino;
8494fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  const dev_t dev;
8504fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  const mode_t mode;
8514fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  const time_t mtime;
8524fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  const off_t size;
8531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8543c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  ASTStatData(ino_t i, dev_t d, mode_t mo, time_t m, off_t s)
85574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner    : ino(i), dev(d), mode(mo), mtime(m), size(s) {}
8564fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor};
8574fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8583c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redlclass ASTStatLookupTrait {
8594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor public:
8604fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  typedef const char *external_key_type;
8614fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  typedef const char *internal_key_type;
8624fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8633c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  typedef ASTStatData data_type;
8644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8654fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  static unsigned ComputeHash(const char *path) {
8662596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar    return llvm::HashString(path);
8674fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
8684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8694fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  static internal_key_type GetInternalKey(const char *path) { return path; }
8704fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  static bool EqualKey(internal_key_type a, internal_key_type b) {
8724fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    return strcmp(a, b) == 0;
8734fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
8744fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8754fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  static std::pair<unsigned, unsigned>
8764fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  ReadKeyDataLength(const unsigned char*& d) {
8774fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    unsigned KeyLen = (unsigned) clang::io::ReadUnalignedLE16(d);
8784fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    unsigned DataLen = (unsigned) *d++;
8794fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    return std::make_pair(KeyLen + 1, DataLen);
8804fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
8814fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8824fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  static internal_key_type ReadKey(const unsigned char *d, unsigned) {
8834fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    return (const char *)d;
8844fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
8854fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8864fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  static data_type ReadData(const internal_key_type, const unsigned char *d,
8874fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                            unsigned /*DataLen*/) {
8884fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    using namespace clang::io;
8894fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8904fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    ino_t ino = (ino_t) ReadUnalignedLE32(d);
8914fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    dev_t dev = (dev_t) ReadUnalignedLE32(d);
8924fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    mode_t mode = (mode_t) ReadUnalignedLE16(d);
8931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    time_t mtime = (time_t) ReadUnalignedLE64(d);
8944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    off_t size = (off_t) ReadUnalignedLE64(d);
8954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    return data_type(ino, dev, mode, mtime, size);
8964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
8974fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor};
8984fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
8994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor/// \brief stat() cache for precompiled headers.
9004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor///
9014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor/// This cache is very similar to the stat cache used by pretokenized
9024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor/// headers.
90310e286aa8d39fb51a21412850265d9dae74613eeChris Lattnerclass ASTStatCache : public FileSystemStatCache {
9043c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  typedef OnDiskChainedHashTable<ASTStatLookupTrait> CacheTy;
9054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  CacheTy *Cache;
9064fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  unsigned &NumStatHits, &NumStatMisses;
9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
90974e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner  ASTStatCache(const unsigned char *Buckets, const unsigned char *Base,
91074e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner               unsigned &NumStatHits, unsigned &NumStatMisses)
9114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    : Cache(0), NumStatHits(NumStatHits), NumStatMisses(NumStatMisses) {
9124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    Cache = CacheTy::Create(Buckets, Base);
9134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
9144fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9153c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  ~ASTStatCache() { delete Cache; }
9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
917898a061f69e1145bf89a987c08203132b9922a3cChris Lattner  LookupResult getStat(const char *Path, struct stat &StatBuf,
918898a061f69e1145bf89a987c08203132b9922a3cChris Lattner                       int *FileDescriptor) {
9193c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // Do the lookup for the file's data in the AST file.
92010e286aa8d39fb51a21412850265d9dae74613eeChris Lattner    CacheTy::iterator I = Cache->find(Path);
9214fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9223c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // If we don't get a hit in the AST file just forward to 'stat'.
9234fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    if (I == Cache->end()) {
9244fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      ++NumStatMisses;
925898a061f69e1145bf89a987c08203132b9922a3cChris Lattner      return statChained(Path, StatBuf, FileDescriptor);
9264fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    }
9271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    ++NumStatHits;
9293c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    ASTStatData Data = *I;
9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
93110e286aa8d39fb51a21412850265d9dae74613eeChris Lattner    StatBuf.st_ino = Data.ino;
93210e286aa8d39fb51a21412850265d9dae74613eeChris Lattner    StatBuf.st_dev = Data.dev;
93310e286aa8d39fb51a21412850265d9dae74613eeChris Lattner    StatBuf.st_mtime = Data.mtime;
93410e286aa8d39fb51a21412850265d9dae74613eeChris Lattner    StatBuf.st_mode = Data.mode;
93510e286aa8d39fb51a21412850265d9dae74613eeChris Lattner    StatBuf.st_size = Data.size;
936d6f611198089b78e32d3a15fe8bc986204aee1aaChris Lattner    return CacheExists;
9374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
9384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor};
9394fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor} // end anonymous namespace
9404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
94293fb9ed05655512cb14022c667058c078ca90b3cSebastian Redl/// \brief Read a source manager block
9431a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ASTReadResult ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
94414f79002e58556798e86168c63e48d533287eda5Douglas Gregor  using namespace SrcMgr;
9457f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
94693fb9ed05655512cb14022c667058c078ca90b3cSebastian Redl  llvm::BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
9479137a5230d3164b96beb14ffb87863234b7d240fSebastian Redl
9487f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  // Set the source-location entry cursor to the current position in
9497f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  // the stream. This cursor will be used to read the contents of the
9507f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  // source manager block initially, and then lazily read
9517f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  // source-location entries as needed.
95293fb9ed05655512cb14022c667058c078ca90b3cSebastian Redl  SLocEntryCursor = F.Stream;
9537f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
9547f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  // The stream itself is going to skip over the source manager block.
95593fb9ed05655512cb14022c667058c078ca90b3cSebastian Redl  if (F.Stream.SkipBlock()) {
9563c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("malformed block record in AST file");
9577f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    return Failure;
9587f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  }
9597f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
9607f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  // Enter the source manager block.
9618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
9623c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("malformed source manager block record in AST file");
963e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor    return Failure;
964e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor  }
96514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
96614f79002e58556798e86168c63e48d533287eda5Douglas Gregor  RecordData Record;
96714f79002e58556798e86168c63e48d533287eda5Douglas Gregor  while (true) {
9687f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    unsigned Code = SLocEntryCursor.ReadCode();
96914f79002e58556798e86168c63e48d533287eda5Douglas Gregor    if (Code == llvm::bitc::END_BLOCK) {
9707f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      if (SLocEntryCursor.ReadBlockEnd()) {
9713c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("error at end of Source Manager block in AST file");
972e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor        return Failure;
973e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor      }
974e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor      return Success;
97514f79002e58556798e86168c63e48d533287eda5Douglas Gregor    }
9761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
97714f79002e58556798e86168c63e48d533287eda5Douglas Gregor    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
97814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      // No known subblocks, always skip them.
9797f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      SLocEntryCursor.ReadSubBlockID();
9807f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      if (SLocEntryCursor.SkipBlock()) {
9813c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("malformed block record in AST file");
982e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor        return Failure;
983e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor      }
98414f79002e58556798e86168c63e48d533287eda5Douglas Gregor      continue;
98514f79002e58556798e86168c63e48d533287eda5Douglas Gregor    }
9861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
98714f79002e58556798e86168c63e48d533287eda5Douglas Gregor    if (Code == llvm::bitc::DEFINE_ABBREV) {
9887f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      SLocEntryCursor.ReadAbbrevRecord();
98914f79002e58556798e86168c63e48d533287eda5Douglas Gregor      continue;
99014f79002e58556798e86168c63e48d533287eda5Douglas Gregor    }
9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
99214f79002e58556798e86168c63e48d533287eda5Douglas Gregor    // Read a record.
99314f79002e58556798e86168c63e48d533287eda5Douglas Gregor    const char *BlobStart;
99414f79002e58556798e86168c63e48d533287eda5Douglas Gregor    unsigned BlobLen;
99514f79002e58556798e86168c63e48d533287eda5Douglas Gregor    Record.clear();
9967f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    switch (SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen)) {
99714f79002e58556798e86168c63e48d533287eda5Douglas Gregor    default:  // Default behavior: ignore.
99814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      break;
99914f79002e58556798e86168c63e48d533287eda5Douglas Gregor
10008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case SM_SLOC_FILE_ENTRY:
10018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case SM_SLOC_BUFFER_ENTRY:
1002f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth    case SM_SLOC_EXPANSION_ENTRY:
10037f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      // Once we hit one of the source location entries, we're done.
10047f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      return Success;
100514f79002e58556798e86168c63e48d533287eda5Douglas Gregor    }
100614f79002e58556798e86168c63e48d533287eda5Douglas Gregor  }
100714f79002e58556798e86168c63e48d533287eda5Douglas Gregor}
100814f79002e58556798e86168c63e48d533287eda5Douglas Gregor
10098e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis/// \brief If a header file is not found at the path that we expect it to be
10108e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis/// and the PCH file was moved from its original location, try to resolve the
10118e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis/// file by assuming that header+PCH were moved together and the header is in
10128e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis/// the same place relative to the PCH.
10138e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidisstatic std::string
10148e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios KyrtzidisresolveFileRelativeToOriginalDir(const std::string &Filename,
10158e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                                 const std::string &OriginalDir,
10168e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                                 const std::string &CurrDir) {
10178e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  assert(OriginalDir != CurrDir &&
10188e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis         "No point trying to resolve the file if the PCH dir didn't change");
10198e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  using namespace llvm::sys;
1020f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<128> filePath(Filename);
10218e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  fs::make_absolute(filePath);
10228e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  assert(path::is_absolute(OriginalDir));
1023f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<128> currPCHPath(CurrDir);
10248e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10258e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
10268e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                       fileDirE = path::end(path::parent_path(filePath));
10278e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  path::const_iterator origDirI = path::begin(OriginalDir),
10288e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                       origDirE = path::end(OriginalDir);
10298e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  // Skip the common path components from filePath and OriginalDir.
10308e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  while (fileDirI != fileDirE && origDirI != origDirE &&
10318e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis         *fileDirI == *origDirI) {
10328e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    ++fileDirI;
10338e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    ++origDirI;
10348e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  }
10358e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  for (; origDirI != origDirE; ++origDirI)
10368e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    path::append(currPCHPath, "..");
10378e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  path::append(currPCHPath, fileDirI, fileDirE);
10388e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  path::append(currPCHPath, path::filename(Filename));
10398e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  return currPCHPath.str();
10408e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis}
10418e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10427f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor/// \brief Read in the source location entry with the given ID.
1043f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas GregorASTReader::ASTReadResult ASTReader::ReadSLocEntryRecord(int ID) {
10447f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  if (ID == 0)
10457f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    return Success;
10467f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
10470cdd798dbaadd959d3e97ea16993efbdccbbe642Douglas Gregor  if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
10483c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("source location entry ID out-of-range for AST file");
10497f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    return Failure;
10507f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  }
10517f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
10521a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1053f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
1054c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  llvm::BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1055f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  unsigned BaseOffset = F->SLocEntryBaseOffset;
10569137a5230d3164b96beb14ffb87863234b7d240fSebastian Redl
10577f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  ++NumSLocEntriesRead;
10587f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  unsigned Code = SLocEntryCursor.ReadCode();
10597f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  if (Code == llvm::bitc::END_BLOCK ||
10607f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      Code == llvm::bitc::ENTER_SUBBLOCK ||
10617f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      Code == llvm::bitc::DEFINE_ABBREV) {
10623c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("incorrectly-formatted source location entry in AST file");
10637f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    return Failure;
10647f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  }
10657f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
10667f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  RecordData Record;
10677f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  const char *BlobStart;
10687f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  unsigned BlobLen;
10697f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  switch (SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen)) {
10707f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  default:
10713c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("incorrectly-formatted source location entry in AST file");
10727f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    return Failure;
10737f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
10748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case SM_SLOC_FILE_ENTRY: {
1075a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor    if (Record.size() < 7) {
1076a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      Error("source location entry is incorrect");
1077a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      return Failure;
1078a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor    }
1079a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor
1080a4c29b6e55c9d4ef44a51c45c6785e8b4fe9deedArgyrios Kyrtzidis    // We will detect whether a file changed and return 'Failure' for it, but
1081a4c29b6e55c9d4ef44a51c45c6785e8b4fe9deedArgyrios Kyrtzidis    // we will also try to fail gracefully by setting up the SLocEntry.
1082a4c29b6e55c9d4ef44a51c45c6785e8b4fe9deedArgyrios Kyrtzidis    ASTReader::ASTReadResult Result = Success;
1083a4c29b6e55c9d4ef44a51c45c6785e8b4fe9deedArgyrios Kyrtzidis
1084a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor    bool OverriddenBuffer = Record[6];
1085a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor
1086a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor    std::string OrigFilename(BlobStart, BlobStart + BlobLen);
1087a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor    std::string Filename = OrigFilename;
1088e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    MaybeAddSystemRootToFilename(Filename);
1089a4581a120cbcc373b02f13ef744591679f0c2d8cDouglas Gregor    const FileEntry *File =
1090a4581a120cbcc373b02f13ef744591679f0c2d8cDouglas Gregor      OverriddenBuffer? FileMgr.getVirtualFile(Filename, (off_t)Record[4],
1091a4581a120cbcc373b02f13ef744591679f0c2d8cDouglas Gregor                                               (time_t)Record[5])
1092a4581a120cbcc373b02f13ef744591679f0c2d8cDouglas Gregor                      : FileMgr.getFile(Filename, /*OpenFile=*/false);
10938e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    if (File == 0 && !OriginalDir.empty() && !CurrentDir.empty() &&
10948e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis        OriginalDir != CurrentDir) {
10958e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis      std::string resolved = resolveFileRelativeToOriginalDir(Filename,
10968e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                                                              OriginalDir,
10978e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                                                              CurrentDir);
10988e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis      if (!resolved.empty())
10998e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis        File = FileMgr.getFile(resolved);
11008e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    }
110104331169f04198eb769925fa17696a21989c9d8bAxel Naumann    if (File == 0)
110204331169f04198eb769925fa17696a21989c9d8bAxel Naumann      File = FileMgr.getVirtualFile(Filename, (off_t)Record[4],
110304331169f04198eb769925fa17696a21989c9d8bAxel Naumann                                    (time_t)Record[5]);
1104d3555ae09f3d31f7cac84a85d3915459fd34c657Chris Lattner    if (File == 0) {
1105d3555ae09f3d31f7cac84a85d3915459fd34c657Chris Lattner      std::string ErrorStr = "could not find file '";
1106e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      ErrorStr += Filename;
11073c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      ErrorStr += "' referenced by AST file";
1108d3555ae09f3d31f7cac84a85d3915459fd34c657Chris Lattner      Error(ErrorStr.c_str());
1109d3555ae09f3d31f7cac84a85d3915459fd34c657Chris Lattner      return Failure;
1110d3555ae09f3d31f7cac84a85d3915459fd34c657Chris Lattner    }
11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1112fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor    if (!DisableValidation &&
1113fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor        ((off_t)Record[4] != File->getSize()
11149f692a0308975cf24ef117c05e31284a1a944e86Douglas Gregor#if !defined(LLVM_ON_WIN32)
11159f692a0308975cf24ef117c05e31284a1a944e86Douglas Gregor        // In our regression testing, the Windows file system seems to
11169f692a0308975cf24ef117c05e31284a1a944e86Douglas Gregor        // have inconsistent modification times that sometimes
11179f692a0308975cf24ef117c05e31284a1a944e86Douglas Gregor        // erroneously trigger this error-handling path.
1118fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor         || (time_t)Record[5] != File->getModificationTime()
11199f692a0308975cf24ef117c05e31284a1a944e86Douglas Gregor#endif
1120fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor        )) {
11218d8f2c20f3e21c7516e5d27293f08283913904d1Argyrios Kyrtzidis      Error(diag::err_fe_pch_file_modified, Filename);
1122a4c29b6e55c9d4ef44a51c45c6785e8b4fe9deedArgyrios Kyrtzidis      Result = Failure;
11232d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor    }
11242d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor
1125f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
112672a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas Gregor    if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1127f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // This is the module's main file.
1128f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      IncludeLoc = getImportLocation(F);
1129f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    }
1130ff398965a5abfaf5bc47bc022876f56a28e5b9a7Argyrios Kyrtzidis    SrcMgr::CharacteristicKind
1131ff398965a5abfaf5bc47bc022876f56a28e5b9a7Argyrios Kyrtzidis      FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1132ff398965a5abfaf5bc47bc022876f56a28e5b9a7Argyrios Kyrtzidis    FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1133f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                                        ID, BaseOffset + Record[0]);
1134d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis    SrcMgr::FileInfo &FileInfo =
1135d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis          const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1136a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor    FileInfo.NumCreatedFIDs = Record[7];
11377f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    if (Record[3])
1138d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis      FileInfo.setHasLineDirectives();
113910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis
1140a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor    const DeclID *FirstDecl = F->FileSortedDecls + Record[8];
1141a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor    unsigned NumFileDecls = Record[9];
114210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis    if (NumFileDecls) {
114310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis      assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
11449d128d04578c62675eeb0cce83066052f9c19c9aArgyrios Kyrtzidis      FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
11459d128d04578c62675eeb0cce83066052f9c19c9aArgyrios Kyrtzidis                                                             NumFileDecls));
114610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis    }
1147cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
114835f9ae6dd221bd403299a895e97aaaf63507287aDouglas Gregor    const SrcMgr::ContentCache *ContentCache
1149ff398965a5abfaf5bc47bc022876f56a28e5b9a7Argyrios Kyrtzidis      = SourceMgr.getOrCreateContentCache(File,
1150ff398965a5abfaf5bc47bc022876f56a28e5b9a7Argyrios Kyrtzidis                              /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
115135f9ae6dd221bd403299a895e97aaaf63507287aDouglas Gregor    if (OverriddenBuffer && !ContentCache->BufferOverridden &&
115235f9ae6dd221bd403299a895e97aaaf63507287aDouglas Gregor        ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1153a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      unsigned Code = SLocEntryCursor.ReadCode();
1154a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      Record.clear();
1155a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      unsigned RecCode
1156a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor        = SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen);
1157a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor
1158a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      if (RecCode != SM_SLOC_BUFFER_BLOB) {
1159a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor        Error("AST record has invalid code");
1160a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor        return Failure;
1161a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      }
1162a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor
1163a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      llvm::MemoryBuffer *Buffer
1164a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor        = llvm::MemoryBuffer::getMemBuffer(StringRef(BlobStart, BlobLen - 1),
1165a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor                                           Filename);
1166a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      SourceMgr.overrideFileContents(File, Buffer);
1167a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor    }
1168a4c29b6e55c9d4ef44a51c45c6785e8b4fe9deedArgyrios Kyrtzidis
1169a4c29b6e55c9d4ef44a51c45c6785e8b4fe9deedArgyrios Kyrtzidis    if (Result == Failure)
1170a4c29b6e55c9d4ef44a51c45c6785e8b4fe9deedArgyrios Kyrtzidis      return Failure;
11717f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    break;
11727f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  }
11737f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
11748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case SM_SLOC_BUFFER_ENTRY: {
11757f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    const char *Name = BlobStart;
11767f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    unsigned Offset = Record[0];
11777f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    unsigned Code = SLocEntryCursor.ReadCode();
11787f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    Record.clear();
11791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unsigned RecCode
11807f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      = SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen);
1181d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek
11828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    if (RecCode != SM_SLOC_BUFFER_BLOB) {
11833c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      Error("AST record has invalid code");
1184d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return Failure;
1185d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
1186d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek
11877f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    llvm::MemoryBuffer *Buffer
1188a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      = llvm::MemoryBuffer::getMemBuffer(StringRef(BlobStart, BlobLen - 1),
1189a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor                                         Name);
1190f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    FileID BufferID = SourceMgr.createFileIDForMemBuffer(Buffer, ID,
1191f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                                                         BaseOffset + Offset);
11921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11936236a29f5082d4736c4593ca1a04595037db1685Douglas Gregor    if (strcmp(Name, "<built-in>") == 0 && F->Kind == MK_PCH) {
11947e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      PCHPredefinesBlock Block = {
11957e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl        BufferID,
11965f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        StringRef(BlobStart, BlobLen - 1)
11977e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      };
11987e9ad8b4fd446ca7cc0e630edee56d8fcc4553deSebastian Redl      PCHPredefinesBuffers.push_back(Block);
119992b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor    }
12007f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
12017f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    break;
12027f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  }
12037f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
1204f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth  case SM_SLOC_EXPANSION_ENTRY: {
1205c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1206bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth    SourceMgr.createExpansionLoc(SpellingLoc,
1207c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                     ReadSourceLocation(*F, Record[2]),
1208c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                     ReadSourceLocation(*F, Record[3]),
12097f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                                     Record[4],
12107f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                                     ID,
1211f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                                     BaseOffset + Record[0]);
12127f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    break;
12131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
12147f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  }
12157f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
12167f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  return Success;
12177f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor}
12187f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
1219f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor/// \brief Find the location where the module F is imported.
12201a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorSourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1221f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  if (F->ImportLoc.isValid())
1222f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    return F->ImportLoc;
12232e09163890b51aa8766564780154531451a3cf0bJonathan D. Turner
1224f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  // Otherwise we have a PCH. It's considered to be "imported" at the first
1225f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  // location of its includer.
12262e09163890b51aa8766564780154531451a3cf0bJonathan D. Turner  if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1227f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    // Main file is the importer. We assume that it is the first entry in the
1228f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    // entry table. We can't ask the manager, because at the time of PCH loading
1229f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    // the main file entry doesn't exist yet.
1230f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    // The very first entry is the invalid instantiation loc, which takes up
1231f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    // offsets 0 and 1.
1232f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    return SourceLocation::getFromRawEncoding(2U);
1233f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  }
12342e09163890b51aa8766564780154531451a3cf0bJonathan D. Turner  //return F->Loaders[0]->FirstLoc;
12352e09163890b51aa8766564780154531451a3cf0bJonathan D. Turner  return F->ImportedBy[0]->FirstLoc;
1236f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor}
1237f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
12386367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
12396367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner/// specified cursor.  Read the abbreviations that are at the top of the block
12406367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner/// and then leave the cursor pointing into the block.
1241c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlbool ASTReader::ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor,
12426367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner                                 unsigned BlockID) {
12436367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner  if (Cursor.EnterSubBlock(BlockID)) {
12443c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("malformed block record in AST file");
12456367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner    return Failure;
12466367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner  }
12471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12486367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner  while (true) {
1249ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    uint64_t Offset = Cursor.GetCurrentBitNo();
12506367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner    unsigned Code = Cursor.ReadCode();
125120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
12526367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner    // We expect all abbrevs to be at the start of the block.
1253ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    if (Code != llvm::bitc::DEFINE_ABBREV) {
1254ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor      Cursor.JumpToBit(Offset);
12556367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner      return false;
1256ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    }
12576367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner    Cursor.ReadAbbrevRecord();
12586367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner  }
12596367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner}
12606367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner
12611a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorvoid ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1262ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  llvm::BitstreamCursor &Stream = F.MacroCursor;
12631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
126437e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor  // Keep track of where we are in the stream, then jump back there
126537e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor  // after reading this macro.
126637e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor  SavedStreamPosition SavedPosition(Stream);
126737e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor
126837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor  Stream.JumpToBit(Offset);
126942d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner  RecordData Record;
12705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<IdentifierInfo*, 16> MacroArgs;
127137e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor  MacroInfo *Macro = 0;
12721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
127342d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner  while (true) {
127442d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    unsigned Code = Stream.ReadCode();
127542d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    switch (Code) {
127642d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    case llvm::bitc::END_BLOCK:
12773b2257ca054aa0b7d0150a294f184e9349cda433Douglas Gregor      return;
127837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor
127942d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    case llvm::bitc::ENTER_SUBBLOCK:
128042d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      // No known subblocks, always skip them.
128142d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      Stream.ReadSubBlockID();
128237e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      if (Stream.SkipBlock()) {
12833c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("malformed block record in AST file");
12843b2257ca054aa0b7d0150a294f184e9349cda433Douglas Gregor        return;
128537e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      }
128642d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      continue;
12871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
128842d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    case llvm::bitc::DEFINE_ABBREV:
128942d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      Stream.ReadAbbrevRecord();
129042d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      continue;
129142d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    default: break;
129242d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    }
129337e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor
129442d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    // Read a record.
1295ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    const char *BlobStart = 0;
1296ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    unsigned BlobLen = 0;
129742d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    Record.clear();
12988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    PreprocessorRecordTypes RecType =
129920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer      (PreprocessorRecordTypes)Stream.ReadRecord(Code, Record, BlobStart,
1300ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor                                                 BlobLen);
130142d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    switch (RecType) {
13028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case PP_MACRO_OBJECT_LIKE:
13038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case PP_MACRO_FUNCTION_LIKE: {
130437e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      // If we already have a macro, that means that we've hit the end
130537e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      // of the definition of the macro we were looking for. We're
130637e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      // done.
130737e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      if (Macro)
13083b2257ca054aa0b7d0150a294f184e9349cda433Douglas Gregor        return;
130937e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor
131095eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor      IdentifierInfo *II = getLocalIdentifier(F, Record[0]);
131137e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      if (II == 0) {
13123c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("macro must have a name in AST file");
13133b2257ca054aa0b7d0150a294f184e9349cda433Douglas Gregor        return;
131437e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      }
1315eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
1316c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      SourceLocation Loc = ReadSourceLocation(F, Record[1]);
131742d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      bool isUsed = Record[2];
13181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1319712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor      MacroInfo *MI = PP.AllocateMacroInfo(Loc);
132042d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      MI->setIsUsed(isUsed);
13213c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      MI->setIsFromAST();
13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1323aa93a875605536d72a10359a0098396192b7d4ecDouglas Gregor      bool IsPublic = Record[3];
1324aa93a875605536d72a10359a0098396192b7d4ecDouglas Gregor      unsigned NextIndex = 4;
1325aa93a875605536d72a10359a0098396192b7d4ecDouglas Gregor      MI->setVisibility(IsPublic, ReadSourceLocation(F, Record, NextIndex));
13267143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor
13278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      if (RecType == PP_MACRO_FUNCTION_LIKE) {
132842d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner        // Decode function-like macro info.
13297143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor        bool isC99VarArgs = Record[NextIndex++];
13307143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor        bool isGNUVarArgs = Record[NextIndex++];
133142d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner        MacroArgs.clear();
13327143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor        unsigned NumArgs = Record[NextIndex++];
133342d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner        for (unsigned i = 0; i != NumArgs; ++i)
13347143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor          MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
133542d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner
133642d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner        // Install function-like macro info.
133742d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner        MI->setIsFunctionLike();
133842d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner        if (isC99VarArgs) MI->setIsC99Varargs();
133942d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner        if (isGNUVarArgs) MI->setIsGNUVarargs();
134075fdb2377604e53678102076991bea345ace4692Douglas Gregor        MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1341712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor                            PP.getPreprocessorAllocator());
134242d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      }
134342d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner
134442d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      // Finally, install the macro.
13455d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor      PP.setMacroInfo(II, MI, /*LoadedFromAST=*/true);
134642d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner
134742d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      // Remember that we saw this macro last so that we add the tokens that
134842d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      // form its body to it.
134937e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      Macro = MI;
135020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
1351e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1352e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis          Record[NextIndex]) {
1353e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis        // We have a macro definition. Register the association
1354e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis        PreprocessedEntityID
1355e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis            GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1356e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis        PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1357e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis        PPRec.RegisterMacroDefinition(Macro,
1358e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis                            PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true));
13596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      }
136020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
136137e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      ++NumMacrosRead;
136242d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      break;
136342d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    }
13641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case PP_TOKEN: {
136637e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      // If we see a TOKEN before a PP_MACRO_*, then the file is
136737e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      // erroneous, just pretend we didn't see this.
136837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      if (Macro == 0) break;
13691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
137042d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      Token Tok;
137142d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      Tok.startToken();
1372c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Tok.setLocation(ReadSourceLocation(F, Record[0]));
137342d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      Tok.setLength(Record[1]);
137495eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor      if (IdentifierInfo *II = getLocalIdentifier(F, Record[2]))
13757356a31327be9b3c3434a0c88746028980da5684Chris Lattner        Tok.setIdentifierInfo(II);
137642d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      Tok.setKind((tok::TokenKind)Record[3]);
137742d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      Tok.setFlag((Token::TokenFlags)Record[4]);
137837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      Macro->AddTokenToBody(Tok);
137942d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner      break;
138042d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner    }
13817530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie    }
13824800a5c79023271408af49797e09be32aca93232Douglas Gregor  }
13834800a5c79023271408af49797e09be32aca93232Douglas Gregor}
138420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
138586c67d8802a9e0887c31c850188991465ac3c1bdDouglas GregorPreprocessedEntityID
13861a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
13871f6d22550161fffbe82ea9a8a143b2c1247f5f3cArgyrios Kyrtzidis  ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1388272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor    I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1389272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor  assert(I != M.PreprocessedEntityRemap.end()
1390272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor         && "Invalid index into preprocessed entity index remap");
1391272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor
1392272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor  return LocalID + I->second;
139386c67d8802a9e0887c31c850188991465ac3c1bdDouglas Gregor}
139486c67d8802a9e0887c31c850188991465ac3c1bdDouglas Gregor
139598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorunsigned HeaderFileInfoTrait::ComputeHash(const char *path) {
139698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return llvm::HashString(llvm::sys::path::filename(path));
139798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
1398cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
139998339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorHeaderFileInfoTrait::internal_key_type
140098339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorHeaderFileInfoTrait::GetInternalKey(const char *path) { return path; }
1401cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
140298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorbool HeaderFileInfoTrait::EqualKey(internal_key_type a, internal_key_type b) {
140398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  if (strcmp(a, b) == 0)
140498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    return true;
140598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
140698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  if (llvm::sys::path::filename(a) != llvm::sys::path::filename(b))
140798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    return false;
140899a922b6da21a474f8ed35f2b1a3bfd627900d1aDouglas Gregor
140999a922b6da21a474f8ed35f2b1a3bfd627900d1aDouglas Gregor  // Determine whether the actual files are equivalent.
141099a922b6da21a474f8ed35f2b1a3bfd627900d1aDouglas Gregor  bool Result = false;
141199a922b6da21a474f8ed35f2b1a3bfd627900d1aDouglas Gregor  if (llvm::sys::fs::equivalent(a, b, Result))
141298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    return false;
141398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
141499a922b6da21a474f8ed35f2b1a3bfd627900d1aDouglas Gregor  return Result;
141598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
1416cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
141798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregorstd::pair<unsigned, unsigned>
141898339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorHeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
141998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned KeyLen = (unsigned) clang::io::ReadUnalignedLE16(d);
142098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned DataLen = (unsigned) *d++;
142198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return std::make_pair(KeyLen + 1, DataLen);
142298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor}
1423cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
142498339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorHeaderFileInfoTrait::data_type
142598339b96a8089a6da715487e432c5abfca0ca0dfDouglas GregorHeaderFileInfoTrait::ReadData(const internal_key_type, const unsigned char *d,
142698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor                              unsigned DataLen) {
142798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  const unsigned char *End = d + DataLen;
142898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  using namespace clang::io;
142998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  HeaderFileInfo HFI;
143098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  unsigned Flags = *d++;
143198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  HFI.isImport = (Flags >> 5) & 0x01;
143298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  HFI.isPragmaOnce = (Flags >> 4) & 0x01;
143398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  HFI.DirInfo = (Flags >> 2) & 0x03;
143498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  HFI.Resolved = (Flags >> 1) & 0x01;
143598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  HFI.IndexHeaderMapHeader = Flags & 0x01;
143698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  HFI.NumIncludes = ReadUnalignedLE16(d);
1437541ba16defc1b89630cbdecdf1c09487bafd969fDouglas Gregor  HFI.ControllingMacroID = Reader.getGlobalIdentifierID(M,
1438541ba16defc1b89630cbdecdf1c09487bafd969fDouglas Gregor                                                        ReadUnalignedLE32(d));
143998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  if (unsigned FrameworkOffset = ReadUnalignedLE32(d)) {
144098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    // The framework offset is 1 greater than the actual offset,
144198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    // since 0 is used as an indicator for "no framework name".
144298339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
144398339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor    HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
144498339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  }
144598339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
144698339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
144798339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  (void)End;
144898339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor
144998339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  // This HeaderFileInfo was externally loaded.
145098339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  HFI.External = true;
145198339b96a8089a6da715487e432c5abfca0ca0dfDouglas Gregor  return HFI;
1452cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1453cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
14541329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregorvoid ASTReader::setIdentifierIsMacro(IdentifierInfo *II, ModuleFile &F,
14551329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor                                     uint64_t LocalOffset, bool Visible) {
14561329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor  if (Visible) {
14571329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    // Note that this identifier has a macro definition.
14581329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    II->setHasMacroDefinition(true);
14591329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor  }
1460295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
14618f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  // Adjust the offset to a global offset.
14622d2689ab787c6d54cb985c28ff3f16370bc01b0fDouglas Gregor  UnreadMacroRecordOffsets[II] = F.GlobalBitOffset + LocalOffset;
1463295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor}
1464295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
1465c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlvoid ASTReader::ReadDefinedMacros() {
14665d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner  for (ModuleReverseIterator I = ModuleMgr.rbegin(),
14675d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner      E = ModuleMgr.rend(); I != E; ++I) {
14685d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner    llvm::BitstreamCursor &MacroCursor = (*I)->MacroCursor;
14696b82f642ba3530b6201a6632ae8d317f836af7e2Kovarththanan Rajaratnam
1470d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl    // If there was no preprocessor block, skip this file.
1471d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl    if (!MacroCursor.getBitStreamReader())
1472d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      continue;
14736b82f642ba3530b6201a6632ae8d317f836af7e2Kovarththanan Rajaratnam
1474d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl    llvm::BitstreamCursor Cursor = MacroCursor;
14755d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner    Cursor.JumpToBit((*I)->MacroStartOffset);
147620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
1477d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl    RecordData Record;
1478d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl    while (true) {
1479d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      unsigned Code = Cursor.ReadCode();
1480ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor      if (Code == llvm::bitc::END_BLOCK)
1481d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        break;
14826b82f642ba3530b6201a6632ae8d317f836af7e2Kovarththanan Rajaratnam
1483d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      if (Code == llvm::bitc::ENTER_SUBBLOCK) {
1484d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        // No known subblocks, always skip them.
1485d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        Cursor.ReadSubBlockID();
1486d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        if (Cursor.SkipBlock()) {
14873c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl          Error("malformed block record in AST file");
1488d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl          return;
1489d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        }
1490d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        continue;
1491d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      }
14926b82f642ba3530b6201a6632ae8d317f836af7e2Kovarththanan Rajaratnam
1493d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      if (Code == llvm::bitc::DEFINE_ABBREV) {
1494d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        Cursor.ReadAbbrevRecord();
1495d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        continue;
1496d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      }
14976b82f642ba3530b6201a6632ae8d317f836af7e2Kovarththanan Rajaratnam
1498d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      // Read a record.
1499d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      const char *BlobStart;
1500d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      unsigned BlobLen;
1501d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      Record.clear();
1502d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      switch (Cursor.ReadRecord(Code, Record, &BlobStart, &BlobLen)) {
1503d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      default:  // Default behavior: ignore.
1504d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        break;
150588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
15068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case PP_MACRO_OBJECT_LIKE:
15078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case PP_MACRO_FUNCTION_LIKE:
150895eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor        getLocalIdentifier(**I, Record[0]);
1509d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        break;
1510d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl
15118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case PP_TOKEN:
1512d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        // Ignore tokens.
1513d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl        break;
1514d27d3fc2f1c02e77f43e1af43ed5386474e3d56eSebastian Redl      }
151588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    }
151688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  }
1517295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
1518295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  // Drain the unread macro-record offsets map.
1519295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  while (!UnreadMacroRecordOffsets.empty())
1520295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    LoadMacroDefinition(UnreadMacroRecordOffsets.begin());
1521295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor}
1522295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
1523295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregorvoid ASTReader::LoadMacroDefinition(
15245d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor                    llvm::DenseMap<IdentifierInfo *, uint64_t>::iterator Pos) {
1525295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  assert(Pos != UnreadMacroRecordOffsets.end() && "Unknown macro definition");
1526295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  uint64_t Offset = Pos->second;
1527295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  UnreadMacroRecordOffsets.erase(Pos);
1528295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
15298f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  RecordLocation Loc = getLocalBitOffset(Offset);
15308f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  ReadMacroRecord(*Loc.F, Loc.Offset);
1531295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor}
1532295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor
1533295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregorvoid ASTReader::LoadMacroDefinition(IdentifierInfo *II) {
1534295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  llvm::DenseMap<IdentifierInfo *, uint64_t>::iterator Pos
1535295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor    = UnreadMacroRecordOffsets.find(II);
1536295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor  LoadMacroDefinition(Pos);
153788a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor}
153888a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
1539eee242ff426bf79149f221798966e58688383c1eDouglas Gregornamespace {
1540eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  /// \brief Visitor class used to look up identifirs in an AST file.
1541eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  class IdentifierLookupVisitor {
1542eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    StringRef Name;
1543057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor    unsigned PriorGeneration;
1544eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    IdentifierInfo *Found;
1545eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  public:
1546057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor    IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration)
1547057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor      : Name(Name), PriorGeneration(PriorGeneration), Found() { }
1548eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
15491a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    static bool visit(ModuleFile &M, void *UserData) {
1550eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      IdentifierLookupVisitor *This
1551eee242ff426bf79149f221798966e58688383c1eDouglas Gregor        = static_cast<IdentifierLookupVisitor *>(UserData);
1552eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
1553057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor      // If we've already searched this module file, skip it now.
1554057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor      if (M.Generation <= This->PriorGeneration)
1555057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor        return true;
1556057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor
1557eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      ASTIdentifierLookupTable *IdTable
1558eee242ff426bf79149f221798966e58688383c1eDouglas Gregor        = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1559eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      if (!IdTable)
1560eee242ff426bf79149f221798966e58688383c1eDouglas Gregor        return false;
1561eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
15625d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor      ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
15635d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor                                     M, This->Found);
15645d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor
1565eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      std::pair<const char*, unsigned> Key(This->Name.begin(),
1566eee242ff426bf79149f221798966e58688383c1eDouglas Gregor                                           This->Name.size());
15675d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor      ASTIdentifierLookupTable::iterator Pos = IdTable->find(Key, &Trait);
1568eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      if (Pos == IdTable->end())
1569eee242ff426bf79149f221798966e58688383c1eDouglas Gregor        return false;
1570eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
1571eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      // Dereferencing the iterator has the effect of building the
1572eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      // IdentifierInfo node and populating it with the various
1573eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      // declarations it needs.
1574eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      This->Found = *Pos;
1575eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      return true;
1576eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    }
1577eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
1578eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    // \brief Retrieve the identifier info found within the module
1579eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    // files.
1580eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    IdentifierInfo *getIdentifierInfo() const { return Found; }
1581eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  };
1582eee242ff426bf79149f221798966e58688383c1eDouglas Gregor}
1583eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
1584eee242ff426bf79149f221798966e58688383c1eDouglas Gregorvoid ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1585057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  unsigned PriorGeneration = 0;
15864e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getContext().getLangOpts().Modules)
1587057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor    PriorGeneration = IdentifierGeneration[&II];
1588057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor
1589057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration);
1590057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor);
1591057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  markIdentifierUpToDate(&II);
1592057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor}
1593057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor
1594057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregorvoid ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1595057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  if (!II)
1596057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor    return;
1597057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor
1598057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  II->setOutOfDate(false);
1599057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor
1600057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  // Update the generation for this identifier.
16014e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getContext().getLangOpts().Modules)
1602057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor    IdentifierGeneration[II] = CurrentGeneration;
1603eee242ff426bf79149f221798966e58688383c1eDouglas Gregor}
1604eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
16055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) {
1606b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis  std::string Filename = filenameStrRef;
1607b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis  MaybeAddSystemRootToFilename(Filename);
1608b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis  const FileEntry *File = FileMgr.getFile(Filename);
1609b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis  if (File == 0 && !OriginalDir.empty() && !CurrentDir.empty() &&
1610b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis      OriginalDir != CurrentDir) {
1611b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis    std::string resolved = resolveFileRelativeToOriginalDir(Filename,
1612b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis                                                            OriginalDir,
1613b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis                                                            CurrentDir);
1614b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis    if (!resolved.empty())
1615b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis      File = FileMgr.getFile(resolved);
1616b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis  }
1617b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis
1618b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis  return File;
1619b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis}
1620b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis
1621e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// \brief If we are loading a relocatable PCH file, and the filename is
1622e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// not an absolute path, add the system root to the beginning of the file
1623e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// name.
1624c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlvoid ASTReader::MaybeAddSystemRootToFilename(std::string &Filename) {
1625e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  // If this is not a relocatable PCH file, there's nothing to do.
1626e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  if (!RelocatablePCH)
1627e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    return;
16281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1629256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer  if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
1630e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    return;
1631e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
1632832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor  if (isysroot.empty()) {
1633e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    // If no system root was given, default to '/'
1634e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    Filename.insert(Filename.begin(), '/');
1635e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    return;
1636e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  }
16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1638832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor  unsigned Length = isysroot.size();
1639e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  if (isysroot[Length - 1] != '/')
1640e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    Filename.insert(Filename.begin(), '/');
16411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1642832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor  Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end());
1643e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor}
1644e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
1645c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::ASTReadResult
16461a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadASTBlock(ModuleFile &F) {
16479137a5230d3164b96beb14ffb87863234b7d240fSebastian Redl  llvm::BitstreamCursor &Stream = F.Stream;
16489137a5230d3164b96beb14ffb87863234b7d240fSebastian Redl
16498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
16503c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("malformed block record in AST file");
16510a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    return Failure;
16520a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  }
16532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
16543c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  // Read all of the records and blocks for the ASt file.
16552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  RecordData Record;
16568038d5182b72dcdef292f6fb8539ad77f338855aDouglas Gregor  while (!Stream.AtEndOfStream()) {
16572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    unsigned Code = Stream.ReadCode();
16582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    if (Code == llvm::bitc::END_BLOCK) {
16590a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      if (Stream.ReadBlockEnd()) {
16603c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("error at end of module block in AST file");
16610a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor        return Failure;
16620a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      }
16637356a31327be9b3c3434a0c88746028980da5684Chris Lattner
16640a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      return Success;
16652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    }
16668038d5182b72dcdef292f6fb8539ad77f338855aDouglas Gregor
16672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
16688038d5182b72dcdef292f6fb8539ad77f338855aDouglas Gregor      switch (Stream.ReadSubBlockID()) {
16698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case DECLTYPES_BLOCK_ID:
16706367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner        // We lazily load the decls block, but we want to set up the
16716367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner        // DeclsCursor cursor to point into it.  Clone our current bitcode
16726367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner        // cursor to it, enter the block and read the abbrevs in that block.
16736367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner        // With the main cursor, we just skip over it.
16749137a5230d3164b96beb14ffb87863234b7d240fSebastian Redl        F.DeclsCursor = Stream;
16756367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner        if (Stream.SkipBlock() ||  // Skip with the main cursor.
16766367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner            // Read the abbrevs.
16778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
16783c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl          Error("malformed block record in AST file");
16796367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner          return Failure;
16806367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner        }
16816367f6d06308ef29c28d2c1604ded45625caeec9Chris Lattner        break;
16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16837b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      case DECL_UPDATES_BLOCK_ID:
16847b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis        if (Stream.SkipBlock()) {
16857b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis          Error("malformed block record in AST file");
16867b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis          return Failure;
16877b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis        }
16887b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis        break;
16897b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis
16908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case PREPROCESSOR_BLOCK_ID:
16919137a5230d3164b96beb14ffb87863234b7d240fSebastian Redl        F.MacroCursor = Stream;
1692712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor        if (!PP.getExternalSource())
1693712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor          PP.setExternalSource(this);
169488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
1695ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor        if (Stream.SkipBlock() ||
1696ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor            ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
16973c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl          Error("malformed block record in AST file");
16987356a31327be9b3c3434a0c88746028980da5684Chris Lattner          return Failure;
16997356a31327be9b3c3434a0c88746028980da5684Chris Lattner        }
1700ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor        F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
17017356a31327be9b3c3434a0c88746028980da5684Chris Lattner        break;
170290cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff
17034800a5c79023271408af49797e09be32aca93232Douglas Gregor      case PREPROCESSOR_DETAIL_BLOCK_ID:
17044800a5c79023271408af49797e09be32aca93232Douglas Gregor        F.PreprocessorDetailCursor = Stream;
17054800a5c79023271408af49797e09be32aca93232Douglas Gregor        if (Stream.SkipBlock() ||
17064800a5c79023271408af49797e09be32aca93232Douglas Gregor            ReadBlockAbbrevs(F.PreprocessorDetailCursor,
17074800a5c79023271408af49797e09be32aca93232Douglas Gregor                             PREPROCESSOR_DETAIL_BLOCK_ID)) {
17084800a5c79023271408af49797e09be32aca93232Douglas Gregor          Error("malformed preprocessor detail record in AST file");
17094800a5c79023271408af49797e09be32aca93232Douglas Gregor          return Failure;
17104800a5c79023271408af49797e09be32aca93232Douglas Gregor        }
17114800a5c79023271408af49797e09be32aca93232Douglas Gregor        F.PreprocessorDetailStartOffset
17124800a5c79023271408af49797e09be32aca93232Douglas Gregor          = F.PreprocessorDetailCursor.GetCurrentBitNo();
1713712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor
1714712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor        if (!PP.getPreprocessingRecord())
1715c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis          PP.createPreprocessingRecord(/*RecordConditionalDirectives=*/false);
1716712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor        if (!PP.getPreprocessingRecord()->getExternalSource())
1717712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor          PP.getPreprocessingRecord()->SetExternalSource(*this);
17184800a5c79023271408af49797e09be32aca93232Douglas Gregor        break;
17194800a5c79023271408af49797e09be32aca93232Douglas Gregor
17208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case SOURCE_MANAGER_BLOCK_ID:
172193fb9ed05655512cb14022c667058c078ca90b3cSebastian Redl        switch (ReadSourceManagerBlock(F)) {
1722e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor        case Success:
1723e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor          break;
1724e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor
1725e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor        case Failure:
17263c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl          Error("malformed source manager block in AST file");
17270a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor          return Failure;
1728e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor
1729e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor        case IgnorePCH:
1730e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor          return IgnorePCH;
17310a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor        }
17328038d5182b72dcdef292f6fb8539ad77f338855aDouglas Gregor        break;
1733392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1734392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      case SUBMODULE_BLOCK_ID:
1735392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        switch (ReadSubmoduleBlock(F)) {
1736392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        case Success:
1737392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor          break;
1738392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1739392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        case Failure:
1740392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor          Error("malformed submodule block in AST file");
1741392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor          return Failure;
1742392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1743392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        case IgnorePCH:
1744392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor          return IgnorePCH;
1745392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        }
1746392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        break;
1747392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1748aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      case COMMENTS_BLOCK_ID: {
1749aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        llvm::BitstreamCursor C = Stream;
1750aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        if (Stream.SkipBlock() ||
1751aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko            ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
1752aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko          Error("malformed comments block in AST file");
1753aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko          return Failure;
1754aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        }
1755aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        CommentsCursors.push_back(std::make_pair(C, &F));
1756aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        break;
1757aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      }
1758aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
1759392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      default:
1760392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        if (!Stream.SkipBlock())
1761392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor          break;
1762392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        Error("malformed block record in AST file");
1763392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        return Failure;
17648038d5182b72dcdef292f6fb8539ad77f338855aDouglas Gregor      }
17652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      continue;
17662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    }
17678038d5182b72dcdef292f6fb8539ad77f338855aDouglas Gregor
17682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    if (Code == llvm::bitc::DEFINE_ABBREV) {
17692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      Stream.ReadAbbrevRecord();
17702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      continue;
17712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    }
17728038d5182b72dcdef292f6fb8539ad77f338855aDouglas Gregor
17738038d5182b72dcdef292f6fb8539ad77f338855aDouglas Gregor    // Read and process a record.
17742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    Record.clear();
17752bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor    const char *BlobStart = 0;
17762bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor    unsigned BlobLen = 0;
17778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((ASTRecordTypes)Stream.ReadRecord(Code, Record,
1778c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                              &BlobStart, &BlobLen)) {
17792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    default:  // Default behavior: ignore.
17802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      break;
17818038d5182b72dcdef292f6fb8539ad77f338855aDouglas Gregor
17828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case METADATA: {
17838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      if (Record[0] != VERSION_MAJOR && !DisableValidation) {
17848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl        Diag(Record[0] < VERSION_MAJOR? diag::warn_pch_version_too_old
1785fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl                                           : diag::warn_pch_version_too_new);
1786fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        return IgnorePCH;
1787fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      }
1788fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
1789bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis      bool hasErrors = Record[5];
1790bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis      if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
1791bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis        Diag(diag::err_pch_with_compiler_errors);
1792bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis        return IgnorePCH;
1793bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis      }
1794bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis
1795fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      RelocatablePCH = Record[4];
1796fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      if (Listener) {
1797fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        std::string TargetTriple(BlobStart, BlobLen);
1798fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        if (Listener->ReadTargetTriple(TargetTriple))
1799fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl          return IgnorePCH;
1800fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      }
1801fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      break;
1802fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    }
1803fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
1804e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor    case IMPORTS: {
1805e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor      // Load each of the imported PCH files.
1806e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor      unsigned Idx = 0, N = Record.size();
1807e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor      while (Idx < N) {
1808e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor        // Read information about the AST file.
1809e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor        ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
1810e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor        unsigned Length = Record[Idx++];
1811f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith        SmallString<128> ImportedFile(Record.begin() + Idx,
1812e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor                                            Record.begin() + Idx + Length);
1813e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor        Idx += Length;
1814e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor
1815e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor        // Load the AST file.
181610bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor        switch(ReadASTCore(ImportedFile, ImportedKind, &F)) {
1817e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor        case Failure: return Failure;
1818e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor          // If we have to ignore the dependency, we'll have to ignore this too.
1819e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor        case IgnorePCH: return IgnorePCH;
1820e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor        case Success: break;
1821e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor        }
1822fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      }
1823fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      break;
1824fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    }
1825fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
1826a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor    case TYPE_OFFSET: {
182712d6da0675fa7df09e3f078995774b350e3a4652Sebastian Redl      if (F.LocalNumTypes != 0) {
18283c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("duplicate TYPE_OFFSET record in AST file");
18290a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor        return Failure;
18300a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      }
183112d6da0675fa7df09e3f078995774b350e3a4652Sebastian Redl      F.TypeOffsets = (const uint32_t *)BlobStart;
183212d6da0675fa7df09e3f078995774b350e3a4652Sebastian Redl      F.LocalNumTypes = Record[0];
1833e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor      unsigned LocalBaseTypeIndex = Record[1];
1834e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor      F.BaseTypeIndex = getTotalNumTypes();
18351e849b6f43a6aded51466978d826e938859130dbDouglas Gregor
1836a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor      if (F.LocalNumTypes > 0) {
1837a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor        // Introduce the global -> local mapping for types within this module.
1838a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor        GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
1839a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor
1840a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor        // Introduce the local -> global mapping for types within this module.
1841adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor        F.TypeRemap.insertOrReplace(
1842adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor          std::make_pair(LocalBaseTypeIndex,
1843adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor                         F.BaseTypeIndex - LocalBaseTypeIndex));
1844a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor
1845a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor        TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
1846a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor      }
18472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      break;
1848a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor    }
1849a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor
1850496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor    case DECL_OFFSET: {
185112d6da0675fa7df09e3f078995774b350e3a4652Sebastian Redl      if (F.LocalNumDecls != 0) {
18523c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("duplicate DECL_OFFSET record in AST file");
18530a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor        return Failure;
18540a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      }
18559d31fa75bc05fe4cb903a7701550f22cfb73ea8bArgyrios Kyrtzidis      F.DeclOffsets = (const DeclOffset *)BlobStart;
185612d6da0675fa7df09e3f078995774b350e3a4652Sebastian Redl      F.LocalNumDecls = Record[0];
1857496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor      unsigned LocalBaseDeclID = Record[1];
18589827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor      F.BaseDeclID = getTotalNumDecls();
185996e973f2be14c9b82136f74b4108465d24894feaDouglas Gregor
1860496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor      if (F.LocalNumDecls > 0) {
1861496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor        // Introduce the global -> local mapping for declarations within this
1862496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor        // module.
18636bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor        GlobalDeclMap.insert(
18646bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor          std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
1865496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor
1866496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor        // Introduce the local -> global mapping for declarations within this
1867496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor        // module.
1868adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor        F.DeclRemap.insertOrReplace(
1869adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor          std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
1870496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor
1871a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor        // Introduce the global -> local mapping for declarations within this
1872a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor        // module.
1873a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor        F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
1874a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor
1875496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor        DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
1876496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor      }
18772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      break;
1878496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor    }
1879496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor
18808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case TU_UPDATE_LEXICAL: {
1881359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      DeclContext *TU = Context.getTranslationUnitDecl();
18820d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      DeclContextInfo &Info = F.DeclContextInfos[TU];
18830d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(BlobStart);
18840d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      Info.NumLexicalDecls
18850d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        = static_cast<unsigned int>(BlobLen / sizeof(KindDeclIDPair));
1886359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      TU->setHasExternalLexicalStorage(true);
1887d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl      break;
1888d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl    }
1889d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl
1890e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl    case UPDATE_VISIBLE: {
1891496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor      unsigned Idx = 0;
1892496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor      serialization::DeclID ID = ReadDeclID(F, Record, Idx);
1893b1758c662524e18d65d260188fdcbbdee6a9316bBenjamin Kramer      ASTDeclContextNameLookupTable *Table =
1894b1758c662524e18d65d260188fdcbbdee6a9316bBenjamin Kramer        ASTDeclContextNameLookupTable::Create(
1895496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor                        (const unsigned char *)BlobStart + Record[Idx++],
1896e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl                        (const unsigned char *)BlobStart,
1897393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor                        ASTDeclContextNameLookupTrait(*this, F));
1898359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      if (ID == PREDEF_DECL_TRANSLATION_UNIT_ID) { // Is it the TU?
1899359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor        DeclContext *TU = Context.getTranslationUnitDecl();
19000d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        F.DeclContextInfos[TU].NameLookupTableData = Table;
19016bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor        TU->setHasExternalVisibleStorage(true);
1902e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      } else
1903496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor        PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
1904e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      break;
1905e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl    }
1906e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl
19078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case LANGUAGE_OPTIONS:
1908fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor      if (ParseLanguageOptions(Record) && !DisableValidation)
19090a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor        return IgnorePCH;
19100a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      break;
19112bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor
19128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case IDENTIFIER_TABLE:
191393fb9ed05655512cb14022c667058c078ca90b3cSebastian Redl      F.IdentifierTableData = BlobStart;
19142b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor      if (Record[0]) {
191593fb9ed05655512cb14022c667058c078ca90b3cSebastian Redl        F.IdentifierLookupTable
19163c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl          = ASTIdentifierLookupTable::Create(
191793fb9ed05655512cb14022c667058c078ca90b3cSebastian Redl                       (const unsigned char *)F.IdentifierTableData + Record[0],
191893fb9ed05655512cb14022c667058c078ca90b3cSebastian Redl                       (const unsigned char *)F.IdentifierTableData,
1919c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                       ASTIdentifierLookupTrait(*this, F));
1920712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor
1921712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor        PP.getIdentifierTable().setExternalIdentifierLookup(this);
19222b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor      }
1923afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor      break;
1924afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor
19256ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor    case IDENTIFIER_OFFSET: {
19262da08f9d8dff5f2a0ffb0cef72db80f03900a2cfSebastian Redl      if (F.LocalNumIdentifiers != 0) {
19273c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("duplicate IDENTIFIER_OFFSET record in AST file");
1928afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor        return Failure;
1929afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor      }
19302da08f9d8dff5f2a0ffb0cef72db80f03900a2cfSebastian Redl      F.IdentifierOffsets = (const uint32_t *)BlobStart;
19312da08f9d8dff5f2a0ffb0cef72db80f03900a2cfSebastian Redl      F.LocalNumIdentifiers = Record[0];
19326ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor      unsigned LocalBaseIdentifierID = Record[1];
19339827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor      F.BaseIdentifierID = getTotalNumIdentifiers();
193467268d02388d3d25107fa9cf4998c35246255a65Douglas Gregor
19356ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor      if (F.LocalNumIdentifiers > 0) {
19366ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor        // Introduce the global -> local mapping for identifiers within this
19376ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor        // module.
19386ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor        GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
19396ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor                                                  &F));
19406ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor
19416ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor        // Introduce the local -> global mapping for identifiers within this
19426ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor        // module.
1943adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor        F.IdentifierRemap.insertOrReplace(
1944adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor          std::make_pair(LocalBaseIdentifierID,
1945adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor                         F.BaseIdentifierID - LocalBaseIdentifierID));
19466ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor
19476ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor        IdentifiersLoaded.resize(IdentifiersLoaded.size()
19486ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor                                 + F.LocalNumIdentifiers);
19496ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor      }
1950afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor      break;
19516ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor    }
19526ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor
19538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXTERNAL_DEFINITIONS:
1954409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
1955409448c832d27703146b70a1137d86b020f29863Douglas Gregor        ExternalDefinitions.push_back(getGlobalDeclID(F, Record[I]));
1956fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor      break;
19573e1af84bb0092a1aafb49deaa4ab6664c9a9071bDouglas Gregor
19588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case SPECIAL_TYPES:
1959393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
1960393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor        SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
1961ad1de006ea080b540e480efc6b86c2e201dbf1ecDouglas Gregor      break;
1962ad1de006ea080b540e480efc6b86c2e201dbf1ecDouglas Gregor
19638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STATISTICS:
1964518d8cb31d26ea098eba79274abbfae1b4976853Sebastian Redl      TotalNumStatements += Record[0];
1965518d8cb31d26ea098eba79274abbfae1b4976853Sebastian Redl      TotalNumMacros += Record[1];
1966518d8cb31d26ea098eba79274abbfae1b4976853Sebastian Redl      TotalLexicalDeclContexts += Record[2];
1967518d8cb31d26ea098eba79274abbfae1b4976853Sebastian Redl      TotalVisibleDeclContexts += Record[3];
19683e1af84bb0092a1aafb49deaa4ab6664c9a9071bDouglas Gregor      break;
19697f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
19708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case UNUSED_FILESCOPED_DECLS:
1971409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
1972409448c832d27703146b70a1137d86b020f29863Douglas Gregor        UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
1973e6bbc01d1c4ec5241df36042e0a4a12a6711934bTanya Lattner      break;
19746b82f642ba3530b6201a6632ae8d317f836af7e2Kovarththanan Rajaratnam
1975ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt    case DELEGATING_CTORS:
1976409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
1977409448c832d27703146b70a1137d86b020f29863Douglas Gregor        DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
1978ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt      break;
1979ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt
19808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case WEAK_UNDECLARED_IDENTIFIERS:
198131e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      if (Record.size() % 4 != 0) {
198231e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor        Error("invalid weak identifiers record");
198331e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor        return Failure;
198431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      }
198531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
198631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      // FIXME: Ignore weak undeclared identifiers from non-original PCH
198731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      // files. This isn't the way to do it :)
198831e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      WeakUndeclaredIdentifiers.clear();
198931e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
199031e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      // Translate the weak, undeclared identifiers into global IDs.
199131e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
199231e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor        WeakUndeclaredIdentifiers.push_back(
199331e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor          getGlobalIdentifierID(F, Record[I++]));
199431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor        WeakUndeclaredIdentifiers.push_back(
199531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor          getGlobalIdentifierID(F, Record[I++]));
199631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor        WeakUndeclaredIdentifiers.push_back(
199731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor          ReadSourceLocation(F, Record, I).getRawEncoding());
199831e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor        WeakUndeclaredIdentifiers.push_back(Record[I++]);
199931e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      }
200072b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis      break;
200172b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis
20028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case LOCALLY_SCOPED_EXTERNAL_DECLS:
2003409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2004409448c832d27703146b70a1137d86b020f29863Douglas Gregor        LocallyScopedExternalDecls.push_back(getGlobalDeclID(F, Record[I]));
200514c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor      break;
2006f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2007b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor    case SELECTOR_OFFSETS: {
2008059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl      F.SelectorOffsets = (const uint32_t *)BlobStart;
2009725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl      F.LocalNumSelectors = Record[0];
2010b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor      unsigned LocalBaseSelectorID = Record[1];
20119827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor      F.BaseSelectorID = getTotalNumSelectors();
201296958cbe6fb423ab2446629ead5f1b138398433cDouglas Gregor
2013b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor      if (F.LocalNumSelectors > 0) {
2014b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor        // Introduce the global -> local mapping for selectors within this
2015b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor        // module.
2016b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor        GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2017b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor
2018b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor        // Introduce the local -> global mapping for selectors within this
2019b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor        // module.
2020adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor        F.SelectorRemap.insertOrReplace(
2021adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor          std::make_pair(LocalBaseSelectorID,
2022adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor                         F.BaseSelectorID - LocalBaseSelectorID));
202383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
2024b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor        SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2025b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor      }
2026b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor      break;
2027b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor    }
2028b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor
20298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case METHOD_POOL:
2030725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl      F.SelectorLookupTableData = (const unsigned char *)BlobStart;
203183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      if (Record[0])
2032725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl        F.SelectorLookupTable
20333c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl          = ASTSelectorLookupTable::Create(
2034725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl                        F.SelectorLookupTableData + Record[0],
2035725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl                        F.SelectorLookupTableData,
2036409448c832d27703146b70a1137d86b020f29863Douglas Gregor                        ASTSelectorLookupTrait(*this, F));
2037fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl      TotalNumMethodPoolEntries += Record[1];
2038f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      break;
20392eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor
20404ee5a6f9bd82ab3c1a4bdacc0caefe7d5f8bd37aSebastian Redl    case REFERENCED_SELECTOR_POOL:
20418451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor      if (!Record.empty()) {
20428451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor        for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
20438451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor          ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
20448451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor                                                                Record[Idx++]));
20458451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor          ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
20468451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor                                              getRawEncoding());
20478451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor        }
20488451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor      }
2049320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      break;
2050320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian
20518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case PP_COUNTER_VALUE:
205211e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis      if (!Record.empty() && Listener)
205311e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis        Listener->ReadCounter(Record[0]);
20542eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor      break;
205510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis
205610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis    case FILE_SORTED_DECLS:
205710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis      F.FileSortedDecls = (const DeclID *)BlobStart;
205810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis      break;
20597f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
2060f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    case SOURCE_LOCATION_OFFSETS: {
2061f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      F.SLocEntryOffsets = (const uint32_t *)BlobStart;
2062518d8cb31d26ea098eba79274abbfae1b4976853Sebastian Redl      F.LocalNumSLocEntries = Record[0];
20632dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      unsigned SLocSpaceSize = Record[1];
2064f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      llvm::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
20652dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis          SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
20662dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                                              SLocSpaceSize);
2067f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // Make our entry in the range map. BaseID is negative and growing, so
2068f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // we invert it. Because we invert it, though, we need the other end of
2069f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // the range.
2070f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      unsigned RangeStart =
2071f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor          unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2072f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2073f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2074f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
20752dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
20762dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
20772dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      GlobalSLocOffsetMap.insert(
20782dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis          std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
20792dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                           - SLocSpaceSize,&F));
20802dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
2081f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // Initialize the remapping table.
2082f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // Invalid stays invalid.
2083f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      F.SLocRemap.insert(std::make_pair(0U, 0));
2084f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // This module. Base was 2 when being compiled.
2085f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      F.SLocRemap.insert(std::make_pair(2U,
2086f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                                  static_cast<int>(F.SLocEntryBaseOffset - 2)));
20870cdd798dbaadd959d3e97ea16993efbdccbbe642Douglas Gregor
20880cdd798dbaadd959d3e97ea16993efbdccbbe642Douglas Gregor      TotalNumSLocEntries += F.LocalNumSLocEntries;
2089f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      break;
2090f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    }
2091f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
20925d51a1d22d862dfae44eaa098af4e09bbfebae72Douglas Gregor    case MODULE_OFFSET_MAP: {
2093f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // Additional remapping information.
2094f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      const unsigned char *Data = (const unsigned char*)BlobStart;
2095f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      const unsigned char *DataEnd = Data + BlobLen;
2096f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor
2097f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor      // Continuous range maps we may be updating in our module.
2098f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor      ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap);
20996ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor      ContinuousRangeMap<uint32_t, int, 2>::Builder
21006ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor        IdentifierRemap(F.IdentifierRemap);
2101b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor      ContinuousRangeMap<uint32_t, int, 2>::Builder
2102272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor        PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2103272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor      ContinuousRangeMap<uint32_t, int, 2>::Builder
210426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        SubmoduleRemap(F.SubmoduleRemap);
210526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      ContinuousRangeMap<uint32_t, int, 2>::Builder
2106b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor        SelectorRemap(F.SelectorRemap);
2107496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor      ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap);
2108a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor      ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap);
2109a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor
2110f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      while(Data < DataEnd) {
2111f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        uint16_t Len = io::ReadUnalignedLE16(Data);
21125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        StringRef Name = StringRef((const char*)Data, Len);
2113f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor        Data += Len;
21141a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor        ModuleFile *OM = ModuleMgr.lookup(Name);
2115f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        if (!OM) {
2116f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor          Error("SourceLocation remap refers to unknown module");
2117f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor          return Failure;
2118f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        }
2119f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor
2120f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor        uint32_t SLocOffset = io::ReadUnalignedLE32(Data);
2121f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor        uint32_t IdentifierIDOffset = io::ReadUnalignedLE32(Data);
2122f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor        uint32_t PreprocessedEntityIDOffset = io::ReadUnalignedLE32(Data);
212326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        uint32_t SubmoduleIDOffset = io::ReadUnalignedLE32(Data);
2124f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor        uint32_t SelectorIDOffset = io::ReadUnalignedLE32(Data);
2125f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor        uint32_t DeclIDOffset = io::ReadUnalignedLE32(Data);
2126a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor        uint32_t TypeIndexOffset = io::ReadUnalignedLE32(Data);
2127f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor
2128f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor        // Source location offset is mapped to OM->SLocEntryBaseOffset.
2129f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor        SLocRemap.insert(std::make_pair(SLocOffset,
2130f33740efdb2d836a96ba97ca3004d46404401439Douglas Gregor          static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset)));
21316ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor        IdentifierRemap.insert(
21326ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor          std::make_pair(IdentifierIDOffset,
21336ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor                         OM->BaseIdentifierID - IdentifierIDOffset));
2134272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor        PreprocessedEntityRemap.insert(
2135272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor          std::make_pair(PreprocessedEntityIDOffset,
2136272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor            OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset));
213726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset,
213826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor                                      OM->BaseSubmoduleID - SubmoduleIDOffset));
2139b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor        SelectorRemap.insert(std::make_pair(SelectorIDOffset,
2140b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor                               OM->BaseSelectorID - SelectorIDOffset));
2141496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor        DeclRemap.insert(std::make_pair(DeclIDOffset,
2142496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor                                        OM->BaseDeclID - DeclIDOffset));
2143496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor
2144a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor        TypeRemap.insert(std::make_pair(TypeIndexOffset,
2145e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor                                    OM->BaseTypeIndex - TypeIndexOffset));
2146a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor
2147a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor        // Global -> local mappings.
2148a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor        F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2149f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      }
2150f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      break;
2151f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    }
2152f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
2153f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    case SOURCE_MANAGER_LINE_TABLE:
2154f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      if (ParseLineTable(F, Record))
2155f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        return Failure;
21567f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      break;
21577f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
21584cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis    case FILE_SOURCE_LOCATION_OFFSETS:
21594cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis      F.SLocFileOffsets = (const uint32_t *)BlobStart;
21604cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis      F.LocalNumSLocFileEntries = Record[0];
21614cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis      break;
21624cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
2163f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    case SOURCE_LOCATION_PRELOADS: {
2164f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // Need to transform from the local view (1-based IDs) to the global view,
2165f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      // which is based off F.SLocEntryBaseID.
2166f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor      if (!F.PreloadSLocEntries.empty()) {
2167f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor        Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
2168f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor        return Failure;
2169f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor      }
2170f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor
2171f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor      F.PreloadSLocEntries.swap(Record);
21727f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      break;
2173f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    }
21744fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
21758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STAT_CACHE: {
21768ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor      if (!DisableStatCache) {
21778ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor        ASTStatCache *MyStatCache =
21788ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor          new ASTStatCache((const unsigned char *)BlobStart + Record[0],
21798ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor                           (const unsigned char *)BlobStart,
21808ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor                           NumStatHits, NumStatMisses);
21818ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor        FileMgr.addStatCache(MyStatCache);
21828ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor        F.StatCache = MyStatCache;
21838ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor      }
21844fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      break;
218552e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor    }
21866b82f642ba3530b6201a6632ae8d317f836af7e2Kovarththanan Rajaratnam
21878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXT_VECTOR_DECLS:
2188409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2189409448c832d27703146b70a1137d86b020f29863Douglas Gregor        ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2190b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor      break;
2191b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor
21928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case VTABLE_USES:
2193dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor      if (Record.size() % 3 != 0) {
2194dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor        Error("Invalid VTABLE_USES record");
2195dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor        return Failure;
2196dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor      }
2197dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor
21984056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      // Later tables overwrite earlier ones.
2199dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor      // FIXME: Modules will have some trouble with this. This is clearly not
2200dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor      // the right way to do this.
2201409448c832d27703146b70a1137d86b020f29863Douglas Gregor      VTableUses.clear();
2202dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor
2203dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor      for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
2204dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor        VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
2205dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor        VTableUses.push_back(
2206dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor          ReadSourceLocation(F, Record, Idx).getRawEncoding());
2207dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor        VTableUses.push_back(Record[Idx++]);
2208dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor      }
2209d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis      break;
2210d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis
22118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DYNAMIC_CLASSES:
2212409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2213409448c832d27703146b70a1137d86b020f29863Douglas Gregor        DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
2214d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis      break;
2215d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis
22168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case PENDING_IMPLICIT_INSTANTIATIONS:
2217f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor      if (PendingInstantiations.size() % 2 != 0) {
2218f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor        Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
2219f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor        return Failure;
2220f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor      }
2221f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor
2222f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor      // Later lists of pending instantiations overwrite earlier ones.
2223f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor      // FIXME: This is most certainly wrong for modules.
2224f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor      PendingInstantiations.clear();
2225f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
2226f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor        PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
2227f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor        PendingInstantiations.push_back(
2228f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor          ReadSourceLocation(F, Record, I).getRawEncoding());
2229f2abb52acbba25ad93a1ecdc24d994b9694803a1Douglas Gregor      }
22300e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis      break;
22310e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis
22328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case SEMA_DECL_REFS:
22334056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      // Later tables overwrite earlier ones.
2234409448c832d27703146b70a1137d86b020f29863Douglas Gregor      // FIXME: Modules will have some trouble with this.
2235409448c832d27703146b70a1137d86b020f29863Douglas Gregor      SemaDeclRefs.clear();
2236409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2237409448c832d27703146b70a1137d86b020f29863Douglas Gregor        SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
223876c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis      break;
223976c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis
22408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case ORIGINAL_FILE_NAME:
22413c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      // The primary AST will be the last to get here, so it will be the one
2242518d8cb31d26ea098eba79274abbfae1b4976853Sebastian Redl      // that's used.
22437b5a1210d93ca62ecd61800f245c87259b1f8f79Daniel Dunbar      ActualOriginalFileName.assign(BlobStart, BlobLen);
22447b5a1210d93ca62ecd61800f245c87259b1f8f79Daniel Dunbar      OriginalFileName = ActualOriginalFileName;
2245e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      MaybeAddSystemRootToFilename(OriginalFileName);
2246b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      break;
22471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
224831d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor    case ORIGINAL_FILE_ID:
224931d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor      OriginalFileID = FileID::get(Record[0]);
225031d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor      break;
225131d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor
22528e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    case ORIGINAL_PCH_DIR:
22538e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis      // The primary AST will be the last to get here, so it will be the one
22548e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis      // that's used.
22558e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis      OriginalDir.assign(BlobStart, BlobLen);
22568e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis      break;
22578e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
22588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case VERSION_CONTROL_BRANCH_REVISION: {
2259974be4d50a95317a85b111855946f5aa4bd15887Ted Kremenek      const std::string &CurBranch = getClangFullRepositoryVersion();
22605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      StringRef ASTBranch(BlobStart, BlobLen);
22615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
22623c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Diag(diag::warn_pch_different_branch) << ASTBranch << CurBranch;
2263445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor        return IgnorePCH;
2264445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor      }
2265445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor      break;
2266445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor    }
226704e6fd4a5ceded0a442a6b3e6b87057b9d643fe3Sebastian Redl
2268e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis    case PPD_ENTITIES_OFFSETS: {
22692dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      F.PreprocessedEntityOffsets = (const PPEntityOffset *)BlobStart;
22702dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      assert(BlobLen % sizeof(PPEntityOffset) == 0);
22712dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      F.NumPreprocessedEntities = BlobLen / sizeof(PPEntityOffset);
2272e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis
2273e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      unsigned LocalBasePreprocessedEntityID = Record[0];
2274fb2d9e092f19cfcdd11ebd5ceac40456c090c7dbDouglas Gregor
22754c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor      unsigned StartingID;
2276712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor      if (!PP.getPreprocessingRecord())
2277c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis        PP.createPreprocessingRecord(/*RecordConditionalDirectives=*/false);
2278712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor      if (!PP.getPreprocessingRecord()->getExternalSource())
2279712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor        PP.getPreprocessingRecord()->SetExternalSource(*this);
2280712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor      StartingID
2281712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor        = PP.getPreprocessingRecord()
2282e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis            ->allocateLoadedEntities(F.NumPreprocessedEntities);
22839827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor      F.BasePreprocessedEntityID = StartingID;
22844c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor
2285e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      if (F.NumPreprocessedEntities > 0) {
2286272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor        // Introduce the global -> local mapping for preprocessed entities in
2287272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor        // this module.
2288272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor        GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
2289272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor
2290272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor        // Introduce the local -> global mapping for preprocessed entities in
2291272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor        // this module.
2292adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor        F.PreprocessedEntityRemap.insertOrReplace(
2293272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor          std::make_pair(LocalBasePreprocessedEntityID,
2294272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor            F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
2295272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor      }
2296272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor
22976a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      break;
22984c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor    }
22994c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor
23007b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis    case DECL_UPDATE_OFFSETS: {
23017b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      if (Record.size() % 2 != 0) {
23027b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis        Error("invalid DECL_UPDATE_OFFSETS block in AST file");
23037b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis        return Failure;
23047b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      }
23057b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      for (unsigned I = 0, N = Record.size(); I != N; I += 2)
2306496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor        DeclUpdateOffsets[getGlobalDeclID(F, Record[I])]
2307496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor          .push_back(std::make_pair(&F, Record[I+1]));
23087b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      break;
23097b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis    }
23107b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis
23118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DECL_REPLACEMENTS: {
2312ef23b6001e8d9715246ca23bd8c3a6887d7844cbArgyrios Kyrtzidis      if (Record.size() % 3 != 0) {
23133c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("invalid DECL_REPLACEMENTS block in AST file");
23140b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl        return Failure;
23150b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl      }
2316ef23b6001e8d9715246ca23bd8c3a6887d7844cbArgyrios Kyrtzidis      for (unsigned I = 0, N = Record.size(); I != N; I += 3)
2317496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor        ReplacedDecls[getGlobalDeclID(F, Record[I])]
2318ef23b6001e8d9715246ca23bd8c3a6887d7844cbArgyrios Kyrtzidis          = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
23190b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl      break;
23200b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl    }
2321e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis
2322cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor    case OBJC_CATEGORIES_MAP: {
2323cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor      if (F.LocalNumObjCCategoriesInMap != 0) {
2324cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor        Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
2325e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis        return Failure;
2326e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis      }
2327cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor
2328cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor      F.LocalNumObjCCategoriesInMap = Record[0];
2329cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor      F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)BlobStart;
2330e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis      break;
2331e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis    }
23327c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor
2333cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor    case OBJC_CATEGORIES:
2334cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor      F.ObjCCategories.swap(Record);
2335cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor      break;
2336cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor
23377c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor    case CXX_BASE_SPECIFIER_OFFSETS: {
23387c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor      if (F.LocalNumCXXBaseSpecifiers != 0) {
23397c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor        Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
23407c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor        return Failure;
23417c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor      }
23427c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor
23437c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor      F.LocalNumCXXBaseSpecifiers = Record[0];
23447c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor      F.CXXBaseSpecifiersOffsets = (const uint32_t *)BlobStart;
23451da901467f72d1733704b068e22089813a1962fdJonathan D. Turner      NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
23467c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor      break;
23477c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor    }
2348f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis
23493efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis    case DIAG_PRAGMA_MAPPINGS:
2350f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis      if (Record.size() % 2 != 0) {
2351f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis        Error("invalid DIAG_USER_MAPPINGS block in AST file");
2352f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis        return Failure;
2353f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis      }
2354f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
2355f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      if (F.PragmaDiagMappings.empty())
2356f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        F.PragmaDiagMappings.swap(Record);
2357f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis      else
2358f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
2359f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                                    Record.begin(), Record.end());
2360f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis      break;
2361cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
236214b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne    case CUDA_SPECIAL_DECL_REFS:
236314b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne      // Later tables overwrite earlier ones.
2364409448c832d27703146b70a1137d86b020f29863Douglas Gregor      // FIXME: Modules will have trouble with this.
2365409448c832d27703146b70a1137d86b020f29863Douglas Gregor      CUDASpecialDeclRefs.clear();
2366409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2367409448c832d27703146b70a1137d86b020f29863Douglas Gregor        CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
236814b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne      break;
2369cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
2370b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor    case HEADER_SEARCH_TABLE: {
2371cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      F.HeaderFileInfoTableData = BlobStart;
2372cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      F.LocalNumHeaderFileInfos = Record[1];
2373b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor      F.HeaderFileFrameworkStrings = BlobStart + Record[2];
2374cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      if (Record[0]) {
2375cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor        F.HeaderFileInfoTable
2376cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor          = HeaderFileInfoLookupTable::Create(
2377cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                   (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
2378b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                   (const unsigned char *)F.HeaderFileInfoTableData,
237995eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor                   HeaderFileInfoTrait(*this, F,
2380712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor                                       &PP.getHeaderSearchInfo(),
2381b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                                       BlobStart + Record[2]));
2382712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor
2383712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor        PP.getHeaderSearchInfo().SetExternalSource(this);
2384712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor        if (!PP.getHeaderSearchInfo().getExternalLookup())
2385712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor          PP.getHeaderSearchInfo().SetExternalLookup(this);
2386cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      }
2387cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      break;
2388b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor    }
2389b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
239084bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne    case FP_PRAGMA_OPTIONS:
239184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne      // Later tables overwrite earlier ones.
239284bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne      FPPragmaOptions.swap(Record);
239384bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne      break;
239484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne
239584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne    case OPENCL_EXTENSIONS:
239684bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne      // Later tables overwrite earlier ones.
239784bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne      OpenCLExtensions.swap(Record);
239884bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne      break;
2399ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt
2400ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt    case TENTATIVE_DEFINITIONS:
2401409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2402409448c832d27703146b70a1137d86b020f29863Douglas Gregor        TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
2403ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt      break;
2404d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor
2405d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor    case KNOWN_NAMESPACES:
2406409448c832d27703146b70a1137d86b020f29863Douglas Gregor      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2407409448c832d27703146b70a1137d86b020f29863Douglas Gregor        KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
2408d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor      break;
2409f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor
2410f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor    case IMPORTED_MODULES: {
2411f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor      if (F.Kind != MK_Module) {
2412f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor        // If we aren't loading a module (which has its own exports), make
2413f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor        // all of the imported modules visible.
2414f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor        // FIXME: Deal with macros-only imports.
2415f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor        for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2416f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor          if (unsigned GlobalID = getGlobalSubmoduleID(F, Record[I]))
2417f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor            ImportedModules.push_back(GlobalID);
2418f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor        }
2419f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor      }
2420f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor      break;
2421a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor    }
24222171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor
2423a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor    case LOCAL_REDECLARATIONS: {
24242171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor      F.RedeclarationChains.swap(Record);
24252171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor      break;
24262171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor    }
24272171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor
24282171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor    case LOCAL_REDECLARATIONS_MAP: {
24292171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor      if (F.LocalNumRedeclarationsInMap != 0) {
24302171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor        Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
2431a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor        return Failure;
2432a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor      }
2433f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor
24342171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor      F.LocalNumRedeclarationsInMap = Record[0];
24352171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor      F.RedeclarationsMap = (const LocalRedeclarationsInfo *)BlobStart;
2436a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor      break;
2437f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor    }
2438c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor
2439c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor    case MERGED_DECLARATIONS: {
2440c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor      for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
2441c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor        GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
2442c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor        SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
2443c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor        for (unsigned N = Record[Idx++]; N > 0; --N)
2444c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor          Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
2445c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor      }
2446c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor      break;
2447c3cfd2ab3338d47861ece597212f21b972ebe727Douglas Gregor    }
2448afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor    }
24492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
24503c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  Error("premature end of bitstream in AST file");
24510a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  return Failure;
24522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
24532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
24541a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ASTReadResult ASTReader::validateFileEntries(ModuleFile &M) {
2455c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor  llvm::BitstreamCursor &SLocEntryCursor = M.SLocEntryCursor;
2456c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor
2457c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor  for (unsigned i = 0, e = M.LocalNumSLocFileEntries; i != e; ++i) {
2458c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    SLocEntryCursor.JumpToBit(M.SLocFileOffsets[i]);
2459c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    unsigned Code = SLocEntryCursor.ReadCode();
2460c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    if (Code == llvm::bitc::END_BLOCK ||
2461c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        Code == llvm::bitc::ENTER_SUBBLOCK ||
2462c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        Code == llvm::bitc::DEFINE_ABBREV) {
2463c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      Error("incorrectly-formatted source location entry in AST file");
2464c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      return Failure;
2465c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    }
2466c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor
2467c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    RecordData Record;
2468c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    const char *BlobStart;
2469c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    unsigned BlobLen;
2470c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    switch (SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen)) {
2471c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    default:
2472c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      Error("incorrectly-formatted source location entry in AST file");
2473c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      return Failure;
2474c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor
2475c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    case SM_SLOC_FILE_ENTRY: {
2476a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      // If the buffer was overridden, the file need not exist.
2477a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      if (Record[6])
2478a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor        break;
2479a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor
2480c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      StringRef Filename(BlobStart, BlobLen);
2481c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      const FileEntry *File = getFileEntry(Filename);
2482c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor
2483c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      if (File == 0) {
2484c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        std::string ErrorStr = "could not find file '";
2485c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        ErrorStr += Filename;
2486c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        ErrorStr += "' referenced by AST file";
2487c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        Error(ErrorStr.c_str());
2488c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        return IgnorePCH;
2489b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis      }
2490c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor
2491a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      if (Record.size() < 7) {
2492c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        Error("source location entry is incorrect");
2493b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis        return Failure;
2494c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      }
2495d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis
2496d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      off_t StoredSize = (off_t)Record[4];
2497d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      time_t StoredTime = (time_t)Record[5];
2498d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis
2499d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      // Check if there was a request to override the contents of the file
2500d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      // that was part of the precompiled header. Overridding such a file
2501d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      // can lead to problems when lexing using the source locations from the
2502d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      // PCH.
2503d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      SourceManager &SM = getSourceManager();
2504d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      if (SM.isFileOverridden(File)) {
2505d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis        Error(diag::err_fe_pch_file_overridden, Filename);
2506d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis        // After emitting the diagnostic, recover by disabling the override so
2507d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis        // that the original file will be used.
2508d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis        SM.disableFileContentsOverride(File);
2509d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis        // The FileEntry is a virtual file entry with the size of the contents
2510d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis        // that would override the original contents. Set it to the original's
2511d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis        // size/time.
2512d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis        FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2513d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis                                StoredSize, StoredTime);
2514d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      }
2515b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis
2516c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      // The stat info from the FileEntry came from the cached stat
2517c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      // info of the PCH, so we cannot trust it.
2518c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      struct stat StatBuf;
2519c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      if (::stat(File->getName(), &StatBuf) != 0) {
2520c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        StatBuf.st_size = File->getSize();
2521c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        StatBuf.st_mtime = File->getModificationTime();
2522c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      }
2523b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis
2524d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis      if ((StoredSize != StatBuf.st_size
2525b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis#if !defined(LLVM_ON_WIN32)
2526c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor          // In our regression testing, the Windows file system seems to
2527c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor          // have inconsistent modification times that sometimes
2528c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor          // erroneously trigger this error-handling path.
2529d54dff026b02303a35147224de72bb44cbb53c79Argyrios Kyrtzidis           || StoredTime != StatBuf.st_mtime
2530b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis#endif
2531c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor          )) {
2532c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        Error(diag::err_fe_pch_file_modified, Filename);
2533c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor        return IgnorePCH;
2534b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis      }
2535c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor
2536c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor      break;
2537c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    }
2538b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis    }
2539b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis  }
2540b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis
2541b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis  return Success;
2542b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis}
2543b68ffb107a86f5e3851e8108c712b64dd16ba258Argyrios Kyrtzidis
2544ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregorvoid ASTReader::makeNamesVisible(const HiddenNames &Names) {
25451329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor  for (unsigned I = 0, N = Names.size(); I != N; ++I) {
25461329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor    if (Decl *D = Names[I].dyn_cast<Decl *>())
2547f143ffc4a9af79ac1d822fea6995af4bf45d17dcDouglas Gregor      D->Hidden = false;
25481d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor    else {
25491d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor      IdentifierInfo *II = Names[I].get<IdentifierInfo *>();
25501d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor      if (!II->hasMacroDefinition()) {
25511d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor        II->setHasMacroDefinition(true);
25521d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor        if (DeserializationListener)
25531d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor          DeserializationListener->MacroVisible(II);
25541d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor      }
25551d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor    }
25561329264ce0922b3cec8c8c599108f082105fa0e1Douglas Gregor  }
2557ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor}
2558ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor
25595e35693721364673f8196e4f5a370f56b92e6053Douglas Gregorvoid ASTReader::makeModuleVisible(Module *Mod,
25605e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor                                  Module::NameVisibilityKind NameVisibility) {
25615e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor  llvm::SmallPtrSet<Module *, 4> Visited;
25625e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor  llvm::SmallVector<Module *, 4> Stack;
25635e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor  Stack.push_back(Mod);
25645e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor  while (!Stack.empty()) {
25655e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    Mod = Stack.back();
25665e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    Stack.pop_back();
25675e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor
25685e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    if (NameVisibility <= Mod->NameVisibility) {
25695e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor      // This module already has this level of visibility (or greater), so
25705e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor      // there is nothing more to do.
25715e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor      continue;
25725e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    }
25735e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor
257451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    if (!Mod->isAvailable()) {
257551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      // Modules that aren't available cannot be made visible.
257651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      continue;
257751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    }
257851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
25795e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    // Update the module's name visibility.
25805e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    Mod->NameVisibility = NameVisibility;
25815e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor
2582ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor    // If we've already deserialized any names from this module,
25835e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    // mark them as visible.
2584ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor    HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
2585ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor    if (Hidden != HiddenNamesMap.end()) {
2586ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor      makeNamesVisible(Hidden->second);
2587ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor      HiddenNamesMap.erase(Hidden);
2588ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor    }
25895e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor
25905e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    // Push any non-explicit submodules onto the stack to be marked as
25915e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    // visible.
2592b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor    for (Module::submodule_iterator Sub = Mod->submodule_begin(),
2593b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor                                 SubEnd = Mod->submodule_end();
25945e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor         Sub != SubEnd; ++Sub) {
2595b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor      if (!(*Sub)->IsExplicit && Visited.insert(*Sub))
2596b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor        Stack.push_back(*Sub);
25975e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    }
259807165b9e3b78ed76a7db561f392335e4a54c9e51Douglas Gregor
259907165b9e3b78ed76a7db561f392335e4a54c9e51Douglas Gregor    // Push any exported modules onto the stack to be marked as visible.
26000adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    bool AnyWildcard = false;
26010adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    bool UnrestrictedWildcard = false;
26020adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    llvm::SmallVector<Module *, 4> WildcardRestrictions;
260307165b9e3b78ed76a7db561f392335e4a54c9e51Douglas Gregor    for (unsigned I = 0, N = Mod->Exports.size(); I != N; ++I) {
260407165b9e3b78ed76a7db561f392335e4a54c9e51Douglas Gregor      Module *Exported = Mod->Exports[I].getPointer();
26050adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      if (!Mod->Exports[I].getInt()) {
26060adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        // Export a named module directly; no wildcards involved.
26070adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        if (Visited.insert(Exported))
260807165b9e3b78ed76a7db561f392335e4a54c9e51Douglas Gregor          Stack.push_back(Exported);
26090adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26100adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        continue;
26110adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      }
26120adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26130adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      // Wildcard export: export all of the imported modules that match
26140adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      // the given pattern.
26150adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      AnyWildcard = true;
26160adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      if (UnrestrictedWildcard)
26170adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        continue;
26180adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26190adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      if (Module *Restriction = Mod->Exports[I].getPointer())
26200adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        WildcardRestrictions.push_back(Restriction);
26210adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      else {
26220adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        WildcardRestrictions.clear();
26230adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        UnrestrictedWildcard = true;
262407165b9e3b78ed76a7db561f392335e4a54c9e51Douglas Gregor      }
262507165b9e3b78ed76a7db561f392335e4a54c9e51Douglas Gregor    }
26260adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26270adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    // If there were any wildcards, push any imported modules that were
26280adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    // re-exported by the wildcard restriction.
26290adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    if (!AnyWildcard)
26300adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      continue;
26310adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26320adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    for (unsigned I = 0, N = Mod->Imports.size(); I != N; ++I) {
26330adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      Module *Imported = Mod->Imports[I];
2634d48bcb2f4dedf8e7b654cb017968b3d7b6663a57Benjamin Kramer      if (!Visited.insert(Imported))
26350adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        continue;
26360adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26370adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      bool Acceptable = UnrestrictedWildcard;
26380adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      if (!Acceptable) {
26390adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        // Check whether this module meets one of the restrictions.
26400adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) {
26410adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor          Module *Restriction = WildcardRestrictions[R];
26420adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor          if (Imported == Restriction || Imported->isSubModuleOf(Restriction)) {
26430adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor            Acceptable = true;
26440adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor            break;
26450adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor          }
26460adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        }
26470adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      }
26480adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26490adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      if (!Acceptable)
26500adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        continue;
26510adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26520adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      Stack.push_back(Imported);
26530adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    }
26545e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor  }
26555e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor}
26565e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor
26571d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian RedlASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
265872a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas Gregor                                            ModuleKind Type) {
2659057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  // Bump the generation number.
2660cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  unsigned PreviousGeneration = CurrentGeneration++;
2661057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor
266210bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  switch(ReadASTCore(FileName, Type, /*ImportedBy=*/0)) {
2663cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  case Failure: return Failure;
2664cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  case IgnorePCH: return IgnorePCH;
2665cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  case Success: break;
2666e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor  }
26672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2668fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl  // Here comes stuff that we only do once the entire chain is loaded.
2669057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor
2670cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  // Check the predefines buffers.
26716236a29f5082d4736c4593ca1a04595037db1685Douglas Gregor  if (!DisableValidation && Type == MK_PCH &&
267226d43cd3a088d4f1f1645328db3b73afbc7eaa61Argyrios Kyrtzidis      // FIXME: CheckPredefinesBuffers also sets the SuggestedPredefines;
267326d43cd3a088d4f1f1645328db3b73afbc7eaa61Argyrios Kyrtzidis      // if DisableValidation is true, defines that were set on command-line
267426d43cd3a088d4f1f1645328db3b73afbc7eaa61Argyrios Kyrtzidis      // but not in the PCH file will not be added to SuggestedPredefines.
267526d43cd3a088d4f1f1645328db3b73afbc7eaa61Argyrios Kyrtzidis      CheckPredefinesBuffers())
267692b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor    return IgnorePCH;
26771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2678eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // Mark all of the identifiers in the identifier table as being out of date,
2679eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // so that various accessors know to check the loaded modules when the
2680eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // identifier is used.
2681712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor  for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
2682712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor                              IdEnd = PP.getIdentifierTable().end();
2683712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor       Id != IdEnd; ++Id)
2684eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    Id->second->setOutOfDate(true);
2685057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor
2686af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor  // Resolve any unresolved module exports.
268755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  for (unsigned I = 0, N = UnresolvedModuleImportExports.size(); I != N; ++I) {
268855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    UnresolvedModuleImportExport &Unresolved = UnresolvedModuleImportExports[I];
268955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
26900adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    Module *ResolvedMod = getSubmodule(GlobalID);
26910adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26920adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    if (Unresolved.IsImport) {
26930adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      if (ResolvedMod)
269455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.Mod->Imports.push_back(ResolvedMod);
26950adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      continue;
2696af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor    }
26970adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
26980adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    if (ResolvedMod || Unresolved.IsWildcard)
26990adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      Unresolved.Mod->Exports.push_back(
27000adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor        Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
2701af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor  }
270255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  UnresolvedModuleImportExports.clear();
2703af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor
2704359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  InitializeContext();
27050b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
27067b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis  if (DeserializationListener)
27077b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis    DeserializationListener->ReaderInitialized(this);
27087b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis
2709b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  if (!OriginalFileID.isInvalid()) {
2710b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    OriginalFileID = FileID::get(ModuleMgr.getPrimaryModule().SLocEntryBaseID
2711b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis                                      + OriginalFileID.getOpaqueValue() - 1);
2712b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis
2713b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // If this AST file is a precompiled preamble, then set the preamble file ID
2714b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // of the source manager to the file source file from which the preamble was
2715b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // built.
2716b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    if (Type == MK_Preamble) {
2717507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis      SourceMgr.setPreambleFileID(OriginalFileID);
2718b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    } else if (Type == MK_MainFile) {
2719b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis      SourceMgr.setMainFileID(OriginalFileID);
2720f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    }
2721414cb64f09ce48a36377458ce5e5a90c3ad41d00Douglas Gregor  }
2722414cb64f09ce48a36377458ce5e5a90c3ad41d00Douglas Gregor
2723cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  // For any Objective-C class definitions we have already loaded, make sure
2724cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  // that we load any additional categories.
2725cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
2726cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor    loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
2727cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor                       ObjCClassesLoaded[I],
2728cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor                       PreviousGeneration);
2729cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  }
2730cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor
2731668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  return Success;
27320b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor}
27330b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
27345f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerASTReader::ASTReadResult ASTReader::ReadASTCore(StringRef FileName,
273510bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor                                                ModuleKind Type,
27361a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor                                                ModuleFile *ImportedBy) {
27371a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile *M;
2738fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor  bool NewModule;
2739fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor  std::string ErrorStr;
2740fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor  llvm::tie(M, NewModule) = ModuleMgr.addModule(FileName, Type, ImportedBy,
2741057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor                                                CurrentGeneration, ErrorStr);
2742fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor
2743fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor  if (!M) {
2744fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor    // We couldn't load the module.
2745fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor    std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
2746fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor      + ErrorStr;
2747fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor    Error(Msg);
2748fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor    return Failure;
2749fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor  }
2750fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor
2751fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor  if (!NewModule) {
2752fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor    // We've already loaded this module.
2753fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor    return Success;
2754fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor  }
2755cdf3b83617a3e2471d592795622561506af9109eSebastian Redl
2756fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor  // FIXME: This seems rather a hack. Should CurrentDir be part of the
2757fac4ece118d43e43e625c6d2b9a98905b1372d51Douglas Gregor  // module?
27588e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  if (FileName != "-") {
27598e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    CurrentDir = llvm::sys::path::parent_path(FileName);
27608e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    if (CurrentDir.empty()) CurrentDir = ".";
27618e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  }
27628e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
27631a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile &F = *M;
2764cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  llvm::BitstreamCursor &Stream = F.Stream;
2765cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  Stream.init(F.StreamFile);
276604e6fd4a5ceded0a442a6b3e6b87057b9d643fe3Sebastian Redl  F.SizeInBits = F.Buffer->getBufferSize() * 8;
27678f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor
2768cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  // Sniff for the signature.
2769cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  if (Stream.Read(8) != 'C' ||
2770cdf3b83617a3e2471d592795622561506af9109eSebastian Redl      Stream.Read(8) != 'P' ||
2771cdf3b83617a3e2471d592795622561506af9109eSebastian Redl      Stream.Read(8) != 'C' ||
2772cdf3b83617a3e2471d592795622561506af9109eSebastian Redl      Stream.Read(8) != 'H') {
2773cdf3b83617a3e2471d592795622561506af9109eSebastian Redl    Diag(diag::err_not_a_pch_file) << FileName;
2774cdf3b83617a3e2471d592795622561506af9109eSebastian Redl    return Failure;
2775cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  }
2776cdf3b83617a3e2471d592795622561506af9109eSebastian Redl
2777fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl  while (!Stream.AtEndOfStream()) {
2778fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    unsigned Code = Stream.ReadCode();
2779fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
2780fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    if (Code != llvm::bitc::ENTER_SUBBLOCK) {
27813c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      Error("invalid record at top-level of AST file");
2782fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      return Failure;
2783fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    }
2784fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
2785fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    unsigned BlockID = Stream.ReadSubBlockID();
2786fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
27873c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // We only know the AST subblock ID.
2788fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    switch (BlockID) {
2789fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    case llvm::bitc::BLOCKINFO_BLOCK_ID:
2790fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      if (Stream.ReadBlockInfoBlock()) {
27913c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("malformed BlockInfoBlock in AST file");
2792fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        return Failure;
2793fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      }
2794fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      break;
27958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case AST_BLOCK_ID:
2796571db7f0cb31789737be92fce1c1b738e6dbe795Sebastian Redl      switch (ReadASTBlock(F)) {
2797fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      case Success:
2798fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        break;
2799fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
2800fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      case Failure:
2801fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        return Failure;
2802fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
2803fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      case IgnorePCH:
2804fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        // FIXME: We could consider reading through to the end of this
28053c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        // AST block, skipping subblocks, to see if there are other
28063c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        // AST blocks elsewhere.
2807fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
2808f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        // FIXME: We can't clear loaded slocentries anymore.
2809f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        //SourceMgr.ClearPreallocatedSLocEntries();
2810fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
2811fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        // Remove the stat cache.
2812fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        if (F.StatCache)
28133c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl          FileMgr.removeStatCache((ASTStatCache*)F.StatCache);
2814fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl
2815fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        return IgnorePCH;
2816fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      }
2817fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      break;
2818fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    default:
2819fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      if (Stream.SkipBlock()) {
28203c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("malformed block record in AST file");
2821fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl        return Failure;
2822fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      }
2823fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl      break;
2824fbd4bf16341c1b23181c829ef2630d9a643e793cSebastian Redl    }
2825cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  }
28268f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor
28271a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  // Once read, set the ModuleFile bit base offset and update the size in
28288f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  // bits of all files we've seen.
28298f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  F.GlobalBitOffset = TotalModulesSizeInBits;
28308f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  TotalModulesSizeInBits += F.SizeInBits;
28318f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
2832c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor
2833c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor  // Make sure that the files this module was built against are still available.
2834c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor  if (!DisableValidation) {
2835c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    switch(validateFileEntries(*M)) {
2836c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    case Failure: return Failure;
2837c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    case IgnorePCH: return IgnorePCH;
2838c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    case Success: break;
2839c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor    }
2840c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor  }
2841f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor
2842f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor  // Preload SLocEntries.
2843f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor  for (unsigned I = 0, N = M->PreloadSLocEntries.size(); I != N; ++I) {
2844f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor    int Index = int(M->PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
2845ac1ffcc55b861737ba2466cd1ca1accd8eafceaaArgyrios Kyrtzidis    // Load it through the SourceManager and don't call ReadSLocEntryRecord()
2846ac1ffcc55b861737ba2466cd1ca1accd8eafceaaArgyrios Kyrtzidis    // directly because the entry may have already been loaded in which case
2847ac1ffcc55b861737ba2466cd1ca1accd8eafceaaArgyrios Kyrtzidis    // calling ReadSLocEntryRecord() directly would trigger an assertion in
2848ac1ffcc55b861737ba2466cd1ca1accd8eafceaaArgyrios Kyrtzidis    // SourceManager.
2849ac1ffcc55b861737ba2466cd1ca1accd8eafceaaArgyrios Kyrtzidis    SourceMgr.getLoadedSLocEntryByID(Index);
2850f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor  }
2851f249bf3b9f8bd3af711ffe9de411fc435871a4f6Douglas Gregor
2852c69a292f9f7bee2a7359df18d1db501d8717f0b2Douglas Gregor
2853cdf3b83617a3e2471d592795622561506af9109eSebastian Redl  return Success;
2854cdf3b83617a3e2471d592795622561506af9109eSebastian Redl}
2855cdf3b83617a3e2471d592795622561506af9109eSebastian Redl
2856712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregorvoid ASTReader::InitializeContext() {
28576bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor  // If there's a listener, notify them that we "read" the translation unit.
28586bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor  if (DeserializationListener)
2859359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
2860359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor                                      Context.getTranslationUnitDecl());
28613747ee72e1751a4996711b9ae5e14f2ca5d4516fDouglas Gregor
28626bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor  // Make sure we load the declaration update records for the translation unit,
28636bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor  // if there are any.
2864359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  loadDeclUpdateRecords(PREDEF_DECL_TRANSLATION_UNIT_ID,
2865359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor                        Context.getTranslationUnitDecl());
28666bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor
28675f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor  // FIXME: Find a better way to deal with collisions between these
28685f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor  // built-in types. Right now, we just ignore the problem.
28695f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor
28705f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor  // Load the special types.
2871a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor  if (SpecialTypes.size() >= NumSpecialTypeIDs) {
287202a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor    if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
287302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (!Context.CFConstantStringTypeDecl)
287402a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        Context.setCFConstantStringType(GetType(String));
28755f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor    }
28765f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor
287702a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor    if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
287802a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      QualType FileType = GetType(File);
287902a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (FileType.isNull()) {
288002a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        Error("FILE type is NULL");
288102a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        return;
288202a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      }
288302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor
288402a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (!Context.FILEDecl) {
288502a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
288602a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          Context.setFILEDecl(Typedef->getDecl());
288702a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        else {
288802a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          const TagType *Tag = FileType->getAs<TagType>();
288902a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          if (!Tag) {
289002a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor            Error("Invalid FILE type in AST file");
289102a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor            return;
289202a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          }
289302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          Context.setFILEDecl(Tag->getDecl());
2894de91db51c1488b14a7a23b24d8a81dce1ec63f4fJonathan D. Turner        }
2895de91db51c1488b14a7a23b24d8a81dce1ec63f4fJonathan D. Turner      }
2896d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
289702a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor
289872cd7a0e94629dc200aa97f88c4788ac2e923b48Douglas Gregor    if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
289902a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      QualType Jmp_bufType = GetType(Jmp_buf);
290002a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (Jmp_bufType.isNull()) {
290102a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        Error("jmp_buf type is NULL");
290202a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        return;
290302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      }
290402a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor
290502a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (!Context.jmp_bufDecl) {
290602a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
290702a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          Context.setjmp_bufDecl(Typedef->getDecl());
290802a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        else {
290902a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          const TagType *Tag = Jmp_bufType->getAs<TagType>();
291002a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          if (!Tag) {
291102a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor            Error("Invalid jmp_buf type in AST file");
291202a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor            return;
291302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          }
291402a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          Context.setjmp_bufDecl(Tag->getDecl());
291502a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        }
291602a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      }
29175f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor    }
29185f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor
291972cd7a0e94629dc200aa97f88c4788ac2e923b48Douglas Gregor    if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
292002a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      QualType Sigjmp_bufType = GetType(Sigjmp_buf);
292102a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (Sigjmp_bufType.isNull()) {
292202a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        Error("sigjmp_buf type is NULL");
292302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        return;
292402a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      }
292502a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor
292602a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (!Context.sigjmp_bufDecl) {
292702a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
292802a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          Context.setsigjmp_bufDecl(Typedef->getDecl());
292902a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        else {
293002a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
293102a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          assert(Tag && "Invalid sigjmp_buf type in AST file");
293202a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          Context.setsigjmp_bufDecl(Tag->getDecl());
293302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        }
2934de91db51c1488b14a7a23b24d8a81dce1ec63f4fJonathan D. Turner      }
2935782fa308a765aeac2acb39c4e697c937ec21185bMike Stump    }
29365f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor
293702a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor    if (unsigned ObjCIdRedef
293802a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
293902a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (Context.ObjCIdRedefinitionType.isNull())
294002a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
294102a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor    }
29425f95728e0d37709402ab83abe085f40686a4007bDouglas Gregor
294302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor    if (unsigned ObjCClassRedef
294402a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
294502a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (Context.ObjCClassRedefinitionType.isNull())
294602a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
294702a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor    }
2948de91db51c1488b14a7a23b24d8a81dce1ec63f4fJonathan D. Turner
294902a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor    if (unsigned ObjCSelRedef
295002a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor          = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
295102a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor      if (Context.ObjCSelRedefinitionType.isNull())
295202a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor        Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
295302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor    }
2954e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola
2955e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
2956e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      QualType Ucontext_tType = GetType(Ucontext_t);
2957e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      if (Ucontext_tType.isNull()) {
2958e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola        Error("ucontext_t type is NULL");
2959e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola        return;
2960e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      }
2961e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola
2962e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      if (!Context.ucontext_tDecl) {
2963e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola        if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
2964e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola          Context.setucontext_tDecl(Typedef->getDecl());
2965e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola        else {
2966e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola          const TagType *Tag = Ucontext_tType->getAs<TagType>();
2967e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola          assert(Tag && "Invalid ucontext_t type in AST file");
2968e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola          Context.setucontext_tDecl(Tag->getDecl());
2969e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola        }
2970e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola      }
2971e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    }
2972782fa308a765aeac2acb39c4e697c937ec21185bMike Stump  }
297302a5e875cca1ce2f471dad06fb5557346d99c164Douglas Gregor
2974359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  ReadPragmaDiagnosticMappings(Context.getDiagnostics());
297514b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne
297614b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne  // If there were any CUDA special declarations, deserialize them.
297714b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne  if (!CUDASpecialDeclRefs.empty()) {
297814b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne    assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
2979359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    Context.setcudaConfigureCallDecl(
298014b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne                           cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
298114b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne  }
2982f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor
2983f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor  // Re-export any modules that were imported by a non-module AST file.
2984f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor  for (unsigned I = 0, N = ImportedModules.size(); I != N; ++I) {
2985f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor    if (Module *Imported = getSubmodule(ImportedModules[I]))
2986f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor      makeModuleVisible(Imported, Module::AllVisible);
2987f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor  }
2988f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor  ImportedModules.clear();
298911e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis}
299011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis
2991ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregorvoid ASTReader::finalizeForWriting() {
2992ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor  for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(),
2993ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor                                 HiddenEnd = HiddenNamesMap.end();
2994ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor       Hidden != HiddenEnd; ++Hidden) {
2995ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor    makeNamesVisible(Hidden->second);
2996ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor  }
2997ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor  HiddenNamesMap.clear();
2998ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor}
2999ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor
3000b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor/// \brief Retrieve the name of the original source file name
30013c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl/// directly from the AST file, without actually loading the AST
3002b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor/// file.
30033c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redlstd::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
3004389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis                                             FileManager &FileMgr,
3005d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                                             DiagnosticsEngine &Diags) {
30063c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  // Open the AST file.
3007b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  std::string ErrStr;
30086f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith  OwningPtr<llvm::MemoryBuffer> Buffer;
300939b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner  Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
3010b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  if (!Buffer) {
3011da01f62cdfb0995db355c61d96d45b0f1d790b3dKaelyn Uhrain    Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
3012b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    return std::string();
3013b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  }
3014b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
3015b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  // Initialize the stream
3016b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  llvm::BitstreamReader StreamFile;
3017b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  llvm::BitstreamCursor Stream;
30181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3019b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor                  (const unsigned char *)Buffer->getBufferEnd());
3020b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  Stream.init(StreamFile);
3021b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
3022b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  // Sniff for the signature.
3023b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  if (Stream.Read(8) != 'C' ||
3024b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      Stream.Read(8) != 'P' ||
3025b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      Stream.Read(8) != 'C' ||
3026b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      Stream.Read(8) != 'H') {
30273c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
3028b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    return std::string();
3029b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  }
3030b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
3031b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  RecordData Record;
3032b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  while (!Stream.AtEndOfStream()) {
3033b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    unsigned Code = Stream.ReadCode();
30341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3035b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
3036b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      unsigned BlockID = Stream.ReadSubBlockID();
30371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30383c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      // We only know the AST subblock ID.
3039b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      switch (BlockID) {
30408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case AST_BLOCK_ID:
30418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl        if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
30423c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl          Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3043b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor          return std::string();
3044b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor        }
3045b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor        break;
30461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3047b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      default:
3048b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor        if (Stream.SkipBlock()) {
30493c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl          Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3050b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor          return std::string();
3051b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor        }
3052b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor        break;
3053b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      }
3054b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      continue;
3055b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    }
3056b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
3057b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    if (Code == llvm::bitc::END_BLOCK) {
3058b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      if (Stream.ReadBlockEnd()) {
30593c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Diags.Report(diag::err_fe_pch_error_at_end_block) << ASTFileName;
3060b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor        return std::string();
3061b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      }
3062b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      continue;
3063b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    }
3064b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
3065b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    if (Code == llvm::bitc::DEFINE_ABBREV) {
3066b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      Stream.ReadAbbrevRecord();
3067b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      continue;
3068b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    }
3069b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
3070b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    Record.clear();
3071b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    const char *BlobStart = 0;
3072b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    unsigned BlobLen = 0;
30731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (Stream.ReadRecord(Code, Record, &BlobStart, &BlobLen)
30748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl          == ORIGINAL_FILE_NAME)
3075b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      return std::string(BlobStart, BlobLen);
30761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
3077b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
3078b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  return std::string();
3079b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor}
3080b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
30811a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ASTReadResult ASTReader::ReadSubmoduleBlock(ModuleFile &F) {
3082392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  // Enter the submodule block.
3083392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
3084392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    Error("malformed submodule block record in AST file");
3085392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    return Failure;
3086392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  }
3087392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
3088392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
308926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  bool First = true;
30901a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  Module *CurrentModule = 0;
3091392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  RecordData Record;
3092392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  while (true) {
3093392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    unsigned Code = F.Stream.ReadCode();
3094392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    if (Code == llvm::bitc::END_BLOCK) {
3095392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      if (F.Stream.ReadBlockEnd()) {
3096392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        Error("error at end of submodule block in AST file");
3097392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        return Failure;
3098392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      }
3099392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      return Success;
3100392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    }
3101392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
3102392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
3103392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      // No known subblocks, always skip them.
3104392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      F.Stream.ReadSubBlockID();
3105392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      if (F.Stream.SkipBlock()) {
3106392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        Error("malformed block record in AST file");
3107392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        return Failure;
3108392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      }
3109392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      continue;
3110392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    }
3111392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
3112392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    if (Code == llvm::bitc::DEFINE_ABBREV) {
3113392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      F.Stream.ReadAbbrevRecord();
3114392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      continue;
3115392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    }
3116392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
3117392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    // Read a record.
3118392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    const char *BlobStart;
3119392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    unsigned BlobLen;
3120392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    Record.clear();
3121392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    switch (F.Stream.ReadRecord(Code, Record, &BlobStart, &BlobLen)) {
3122392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    default:  // Default behavior: ignore.
3123392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      break;
3124392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
3125392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    case SUBMODULE_DEFINITION: {
312626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      if (First) {
312726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        Error("missing submodule metadata record at beginning of block");
312826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        return Failure;
312926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      }
313026ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
3131e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      if (Record.size() < 7) {
31321e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor        Error("malformed module definition");
31331e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor        return Failure;
31341e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      }
31351e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
3136392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      StringRef Name(BlobStart, BlobLen);
3137e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
3138e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      SubmoduleID Parent = getGlobalSubmoduleID(F, Record[1]);
3139e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      bool IsFramework = Record[2];
3140e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      bool IsExplicit = Record[3];
3141a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      bool IsSystem = Record[4];
3142a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      bool InferSubmodules = Record[5];
3143a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      bool InferExplicitSubmodules = Record[6];
3144a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      bool InferExportWildcard = Record[7];
31451e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
31461a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor      Module *ParentModule = 0;
314726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      if (Parent)
314826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        ParentModule = getSubmodule(Parent);
3149392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
3150392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      // Retrieve this (sub)module from the module map, creating it if
3151392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      // necessary.
3152392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      CurrentModule = ModMap.findOrCreateModule(Name, ParentModule,
3153392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                                                IsFramework,
3154392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                                                IsExplicit).first;
3155e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
3156e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      if (GlobalIndex >= SubmodulesLoaded.size() ||
3157e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          SubmodulesLoaded[GlobalIndex]) {
315826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        Error("too many submodules");
315926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        return Failure;
316026ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      }
3161a015cab273705d1198d13e8389c2f4775f539a8bDouglas Gregor
3162305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor      CurrentModule->IsFromModuleFile = true;
3163a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
31641e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      CurrentModule->InferSubmodules = InferSubmodules;
31651e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
31661e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      CurrentModule->InferExportWildcard = InferExportWildcard;
3167a015cab273705d1198d13e8389c2f4775f539a8bDouglas Gregor      if (DeserializationListener)
3168e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        DeserializationListener->ModuleRead(GlobalID, CurrentModule);
3169a015cab273705d1198d13e8389c2f4775f539a8bDouglas Gregor
3170e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      SubmodulesLoaded[GlobalIndex] = CurrentModule;
3171392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      break;
3172392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    }
3173392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
317477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    case SUBMODULE_UMBRELLA_HEADER: {
317526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      if (First) {
317626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        Error("missing submodule metadata record at beginning of block");
317726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        return Failure;
317826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      }
317926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
3180392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      if (!CurrentModule)
3181392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        break;
3182392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
3183392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      StringRef FileName(BlobStart, BlobLen);
3184392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      if (const FileEntry *Umbrella = PP.getFileManager().getFile(FileName)) {
318510694cee2588442bee1e717f5042c58ffee25279Douglas Gregor        if (!CurrentModule->getUmbrellaHeader())
3186e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
318710694cee2588442bee1e717f5042c58ffee25279Douglas Gregor        else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
3188392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor          Error("mismatched umbrella headers in submodule");
3189392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor          return Failure;
3190392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        }
3191392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      }
3192392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      break;
3193392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    }
3194392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
3195392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    case SUBMODULE_HEADER: {
319626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      if (First) {
319726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        Error("missing submodule metadata record at beginning of block");
319826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        return Failure;
319926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      }
320026ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
3201392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      if (!CurrentModule)
3202392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        break;
3203392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
3204392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      // FIXME: Be more lazy about this!
3205392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      StringRef FileName(BlobStart, BlobLen);
3206392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      if (const FileEntry *File = PP.getFileManager().getFile(FileName)) {
3207392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor        if (std::find(CurrentModule->Headers.begin(),
3208392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                      CurrentModule->Headers.end(),
3209392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                      File) == CurrentModule->Headers.end())
3210e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          ModMap.addHeader(CurrentModule, File);
3211392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      }
3212392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      break;
3213392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    }
321426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
321577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    case SUBMODULE_UMBRELLA_DIR: {
321677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      if (First) {
321777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor        Error("missing submodule metadata record at beginning of block");
321877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor        return Failure;
321977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      }
322077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
322177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      if (!CurrentModule)
322277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor        break;
322377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
322477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      StringRef DirName(BlobStart, BlobLen);
322577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      if (const DirectoryEntry *Umbrella
322677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor                                  = PP.getFileManager().getDirectory(DirName)) {
322777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor        if (!CurrentModule->getUmbrellaDir())
322877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor          ModMap.setUmbrellaDir(CurrentModule, Umbrella);
322977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor        else if (CurrentModule->getUmbrellaDir() != Umbrella) {
323077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor          Error("mismatched umbrella directories in submodule");
323177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor          return Failure;
323277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor        }
323377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      }
323477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      break;
323577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    }
323677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
323726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor    case SUBMODULE_METADATA: {
323826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      if (!First) {
323926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        Error("submodule metadata record not at beginning of block");
324026ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        return Failure;
324126ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      }
324226ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      First = false;
324326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
324426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      F.BaseSubmoduleID = getTotalNumSubmodules();
324526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      F.LocalNumSubmodules = Record[0];
324626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      unsigned LocalBaseSubmoduleID = Record[1];
324726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      if (F.LocalNumSubmodules > 0) {
324826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        // Introduce the global -> local mapping for submodules within this
324926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        // module.
325026ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
325126ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
325226ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        // Introduce the local -> global mapping for submodules within this
325326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        // module.
3254adafc2edc0dc4fa25ea6f0a136f599a6ac279081Douglas Gregor        F.SubmoduleRemap.insertOrReplace(
325526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor          std::make_pair(LocalBaseSubmoduleID,
325626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor                         F.BaseSubmoduleID - LocalBaseSubmoduleID));
325726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
325826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor        SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
325926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      }
326026ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      break;
326126ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor    }
3262af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor
326355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    case SUBMODULE_IMPORTS: {
326455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      if (First) {
326555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Error("missing submodule metadata record at beginning of block");
326655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        return Failure;
326755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      }
326855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
326955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      if (!CurrentModule)
327055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        break;
327155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
327255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
327355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        UnresolvedModuleImportExport Unresolved;
327455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.File = &F;
327555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.Mod = CurrentModule;
327655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.ID = Record[Idx];
327755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.IsImport = true;
327855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.IsWildcard = false;
327955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        UnresolvedModuleImportExports.push_back(Unresolved);
328055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      }
328155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      break;
328255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    }
328355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
3284af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor    case SUBMODULE_EXPORTS: {
3285af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      if (First) {
3286af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor        Error("missing submodule metadata record at beginning of block");
3287af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor        return Failure;
3288af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      }
3289af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor
3290af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      if (!CurrentModule)
3291af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor        break;
3292af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor
3293af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
329455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        UnresolvedModuleImportExport Unresolved;
3295af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor        Unresolved.File = &F;
329655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.Mod = CurrentModule;
329755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.ID = Record[Idx];
329855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.IsImport = false;
329955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        Unresolved.IsWildcard = Record[Idx + 1];
330055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor        UnresolvedModuleImportExports.push_back(Unresolved);
3301af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      }
3302af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor
3303af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      // Once we've loaded the set of exports, there's no reason to keep
3304af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      // the parsed, unresolved exports around.
3305af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      CurrentModule->UnresolvedExports.clear();
3306af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      break;
3307af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor    }
330851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    case SUBMODULE_REQUIRES: {
330951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      if (First) {
331051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        Error("missing submodule metadata record at beginning of block");
331151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        return Failure;
331251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      }
331351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
331451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      if (!CurrentModule)
331551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        break;
331651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
331751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      CurrentModule->addRequirement(StringRef(BlobStart, BlobLen),
33184e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie                                    Context.getLangOpts(),
3319dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor                                    Context.getTargetInfo());
332051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      break;
332151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    }
3322392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    }
3323392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  }
3324392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor}
3325392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
33260a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor/// \brief Parse the record that corresponds to a LangOptions data
33270a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor/// structure.
33280a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor///
33293c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl/// This routine parses the language options from the AST file and then gives
33303c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl/// them to the AST listener if one is set.
33310a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor///
33323c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl/// \returns true if the listener deems the file unacceptable, false otherwise.
3333260611a32535c851237926bfcf78869b13c07d5bJohn McCallbool ASTReader::ParseLanguageOptions(const RecordData &Record) {
333411e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis  if (Listener) {
333511e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    LangOptions LangOpts;
333611e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    unsigned Idx = 0;
33377d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor#define LANGOPT(Name, Bits, Default, Description) \
33387d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor  LangOpts.Name = Record[Idx++];
33397d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
33407d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor  LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
33417d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor#include "clang/Basic/LangOptions.def"
3342260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3343260611a32535c851237926bfcf78869b13c07d5bJohn McCall    ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
3344260611a32535c851237926bfcf78869b13c07d5bJohn McCall    VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
3345260611a32535c851237926bfcf78869b13c07d5bJohn McCall    LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
33467d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor
3347b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor    unsigned Length = Record[Idx++];
3348b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor    LangOpts.CurrentModule.assign(Record.begin() + Idx,
3349b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor                                  Record.begin() + Idx + Length);
335011e51106329c550d008fad2c657c053d81611ea8Argyrios Kyrtzidis    return Listener->ReadLanguageOptions(LangOpts);
33510a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  }
33520a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
33530a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  return false;
33540a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor}
33550a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
33561a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorstd::pair<ModuleFile *, unsigned>
3357f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios KyrtzidisASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
3358e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  GlobalPreprocessedEntityMapType::iterator
3359f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  I = GlobalPreprocessedEntityMap.find(GlobalIndex);
3360e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  assert(I != GlobalPreprocessedEntityMap.end() &&
3361e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis         "Corrupted global preprocessed entity map");
33621a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile *M = I->second;
3363f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
3364f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  return std::make_pair(M, LocalIndex);
3365f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis}
3366f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
3367f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios KyrtzidisPreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
3368f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  PreprocessedEntityID PPID = Index+1;
33691a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
33701a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile &M = *PPInfo.first;
3371f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  unsigned LocalIndex = PPInfo.second;
33728f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis  const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
33734800a5c79023271408af49797e09be32aca93232Douglas Gregor
3374e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
33758f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis  M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
3376290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3377290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  unsigned Code = M.PreprocessorDetailCursor.ReadCode();
3378290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  switch (Code) {
3379290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  case llvm::bitc::END_BLOCK:
3380290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    return 0;
3381290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3382290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  case llvm::bitc::ENTER_SUBBLOCK:
3383290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    Error("unexpected subblock record in preprocessor detail block");
3384290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    return 0;
3385290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3386290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  case llvm::bitc::DEFINE_ABBREV:
3387290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    Error("unexpected abbrevation record in preprocessor detail block");
3388290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    return 0;
3389290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3390290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  default:
3391290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    break;
3392290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  }
3393290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3394290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  if (!PP.getPreprocessingRecord()) {
3395290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    Error("no preprocessing record");
3396290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    return 0;
3397290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  }
3398290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3399290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  // Read the record.
34008f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis  SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
34018f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis                    ReadSourceLocation(M, PPOffs.End));
3402290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
3403290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  const char *BlobStart = 0;
3404290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  unsigned BlobLen = 0;
3405290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  RecordData Record;
3406290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  PreprocessorDetailRecordTypes RecType =
3407290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.ReadRecord(
3408290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis                                             Code, Record, BlobStart, BlobLen);
3409290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  switch (RecType) {
3410290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  case PPD_MACRO_EXPANSION: {
34118f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis    bool isBuiltin = Record[0];
3412290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    IdentifierInfo *Name = 0;
3413290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    MacroDefinition *Def = 0;
3414290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    if (isBuiltin)
34158f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis      Name = getLocalIdentifier(M, Record[1]);
3416290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    else {
3417290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis      PreprocessedEntityID
34188f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis          GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
3419290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis      Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
3420290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    }
3421290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3422290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    MacroExpansion *ME;
3423290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    if (isBuiltin)
3424290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis      ME = new (PPRec) MacroExpansion(Name, Range);
3425290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    else
3426290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis      ME = new (PPRec) MacroExpansion(Def, Range);
3427290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3428290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    return ME;
3429290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  }
3430290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3431290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  case PPD_MACRO_DEFINITION: {
3432290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    // Decode the identifier info and then check again; if the macro is
3433290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    // still defined and associated with the identifier,
34348f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis    IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
3435290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    MacroDefinition *MD
34368f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis      = new (PPRec) MacroDefinition(II, Range);
3437290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3438290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    if (DeserializationListener)
3439290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis      DeserializationListener->MacroDefinitionRead(PPID, MD);
3440290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3441290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    return MD;
3442290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  }
3443290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3444290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  case PPD_INCLUSION_DIRECTIVE: {
34458f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis    const char *FullFileNameStart = BlobStart + Record[0];
344629f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis    StringRef FullFileName(FullFileNameStart, BlobLen - Record[0]);
344729f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis    const FileEntry *File = 0;
344829f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis    if (!FullFileName.empty())
344929f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis      File = PP.getFileManager().getFile(FullFileName);
3450290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis
3451290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    // FIXME: Stable encoding
3452290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    InclusionDirective::InclusionKind Kind
34538f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis      = static_cast<InclusionDirective::InclusionKind>(Record[2]);
3454290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    InclusionDirective *ID
3455290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis      = new (PPRec) InclusionDirective(PPRec, Kind,
34568f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis                                       StringRef(BlobStart, Record[0]),
34578f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis                                       Record[1],
3458290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis                                       File,
34598f958f14eadb9ae2019bcca6ecd6ad7520cde5eaArgyrios Kyrtzidis                                       Range);
3460290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis    return ID;
3461290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  }
3462290ad8c8eb1546692b20c4095ee441023f2f1005Argyrios Kyrtzidis  }
34637530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie
34647530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
34656a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor}
34666a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
34672dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis/// \brief \arg SLocMapI points at a chunk of a module that contains no
34682dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis/// preprocessed entities or the entities it contains are not the ones we are
34692dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis/// looking for. Find the next module that contains entities and return the ID
34702dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis/// of the first entry.
34712dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios KyrtzidisPreprocessedEntityID ASTReader::findNextPreprocessedEntity(
34722dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                       GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
34732dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  ++SLocMapI;
34742dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  for (GlobalSLocOffsetMapType::const_iterator
34752dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis         EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
34761a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    ModuleFile &M = *SLocMapI->second;
34772dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    if (M.NumPreprocessedEntities)
34782dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      return getGlobalPreprocessedEntityID(M, M.BasePreprocessedEntityID);
34792dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  }
34802dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
34812dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  return getTotalNumPreprocessedEntities();
34822dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
34832dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
34842dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidisnamespace {
34852dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
34862dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidistemplate <unsigned PPEntityOffset::*PPLoc>
34872dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidisstruct PPEntityComp {
34882dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  const ASTReader &Reader;
34891a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile &M;
34902dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
34911a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
34922dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
349388df12521ed20adce83652ba207d39475b7ece71Benjamin Kramer  bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
349488df12521ed20adce83652ba207d39475b7ece71Benjamin Kramer    SourceLocation LHS = getLoc(L);
349588df12521ed20adce83652ba207d39475b7ece71Benjamin Kramer    SourceLocation RHS = getLoc(R);
349688df12521ed20adce83652ba207d39475b7ece71Benjamin Kramer    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
349788df12521ed20adce83652ba207d39475b7ece71Benjamin Kramer  }
349888df12521ed20adce83652ba207d39475b7ece71Benjamin Kramer
349988df12521ed20adce83652ba207d39475b7ece71Benjamin Kramer  bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
35002dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    SourceLocation LHS = getLoc(L);
35012dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
35022dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  }
35032dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
350488df12521ed20adce83652ba207d39475b7ece71Benjamin Kramer  bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
35052dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    SourceLocation RHS = getLoc(R);
35062dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
35072dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  }
35082dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35092dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  SourceLocation getLoc(const PPEntityOffset &PPE) const {
35102dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return Reader.ReadSourceLocation(M, PPE.*PPLoc);
35112dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  }
35122dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis};
35132dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35142dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
35152dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35162dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis/// \brief Returns the first preprocessed entity ID that ends after \arg BLoc.
35172dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios KyrtzidisPreprocessedEntityID
35182dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios KyrtzidisASTReader::findBeginPreprocessedEntity(SourceLocation BLoc) const {
35192dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (SourceMgr.isLocalSourceLocation(BLoc))
35202dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return getTotalNumPreprocessedEntities();
35212dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35222dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  GlobalSLocOffsetMapType::const_iterator
35232dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset -
35242dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                                        BLoc.getOffset());
35252dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  assert(SLocMapI != GlobalSLocOffsetMap.end() &&
35262dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis         "Corrupted global sloc offset map");
35272dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35282dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (SLocMapI->second->NumPreprocessedEntities == 0)
35292dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return findNextPreprocessedEntity(SLocMapI);
35302dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35311a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile &M = *SLocMapI->second;
35322dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  typedef const PPEntityOffset *pp_iterator;
35332dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  pp_iterator pp_begin = M.PreprocessedEntityOffsets;
35342dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
35354cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis
35364cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  size_t Count = M.NumPreprocessedEntities;
35374cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  size_t Half;
35384cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  pp_iterator First = pp_begin;
35394cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  pp_iterator PPI;
35404cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis
35414cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  // Do a binary search manually instead of using std::lower_bound because
35424cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  // The end locations of entities may be unordered (when a macro expansion
35434cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  // is inside another macro argument), but for this case it is not important
35444cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  // whether we get the first macro expansion or its containing macro.
35454cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  while (Count > 0) {
35464cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    Half = Count/2;
35474cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    PPI = First;
35484cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    std::advance(PPI, Half);
35494cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
35504cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis                                            BLoc)){
35514cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis      First = PPI;
35524cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis      ++First;
35534cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis      Count = Count - Half - 1;
35544cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    } else
35554cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis      Count = Half;
35564cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  }
35572dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35582dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (PPI == pp_end)
35592dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return findNextPreprocessedEntity(SLocMapI);
35602dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35612dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  return getGlobalPreprocessedEntityID(M,
35622dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                                 M.BasePreprocessedEntityID + (PPI - pp_begin));
35632dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
35642dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35652dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis/// \brief Returns the first preprocessed entity ID that begins after \arg ELoc.
35662dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios KyrtzidisPreprocessedEntityID
35672dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios KyrtzidisASTReader::findEndPreprocessedEntity(SourceLocation ELoc) const {
35682dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (SourceMgr.isLocalSourceLocation(ELoc))
35692dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return getTotalNumPreprocessedEntities();
35702dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35712dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  GlobalSLocOffsetMapType::const_iterator
35722dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset -
35732dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                                        ELoc.getOffset());
35742dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  assert(SLocMapI != GlobalSLocOffsetMap.end() &&
35752dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis         "Corrupted global sloc offset map");
35762dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35772dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (SLocMapI->second->NumPreprocessedEntities == 0)
35782dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return findNextPreprocessedEntity(SLocMapI);
35792dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35801a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile &M = *SLocMapI->second;
35812dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  typedef const PPEntityOffset *pp_iterator;
35822dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  pp_iterator pp_begin = M.PreprocessedEntityOffsets;
35832dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
35842dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  pp_iterator PPI =
35852dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      std::upper_bound(pp_begin, pp_end, ELoc,
35862dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                       PPEntityComp<&PPEntityOffset::Begin>(*this, M));
35872dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35882dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (PPI == pp_end)
35892dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return findNextPreprocessedEntity(SLocMapI);
35902dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35912dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  return getGlobalPreprocessedEntityID(M,
35922dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                                 M.BasePreprocessedEntityID + (PPI - pp_begin));
35932dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
35942dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
35952dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis/// \brief Returns a pair of [Begin, End) indices of preallocated
35962dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis/// preprocessed entities that \arg Range encompasses.
35972dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidisstd::pair<unsigned, unsigned>
35982dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
35992dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (Range.isInvalid())
36002dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return std::make_pair(0,0);
36012dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
36022dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
36032dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  PreprocessedEntityID BeginID = findBeginPreprocessedEntity(Range.getBegin());
36042dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  PreprocessedEntityID EndID = findEndPreprocessedEntity(Range.getEnd());
36052dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  return std::make_pair(BeginID, EndID);
36062dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
36072dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
3608f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis/// \brief Optionally returns true or false if the preallocated preprocessed
3609f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis/// entity with index \arg Index came from file \arg FID.
3610f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidisllvm::Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
3611f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis                                                             FileID FID) {
3612f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  if (FID.isInvalid())
3613f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return false;
3614f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
36151a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
36161a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile &M = *PPInfo.first;
3617f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  unsigned LocalIndex = PPInfo.second;
3618f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
3619f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
3620f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
3621f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  if (Loc.isInvalid())
3622f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return false;
3623f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
3624f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
3625f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return true;
3626f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  else
3627f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return false;
3628f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis}
3629f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
3630d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregornamespace {
3631d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor  /// \brief Visitor used to search for information about a header file.
3632d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor  class HeaderFileInfoVisitor {
3633d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor    ASTReader &Reader;
3634d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor    const FileEntry *FE;
3635b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
3636d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor    llvm::Optional<HeaderFileInfo> HFI;
3637cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
3638d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor  public:
3639d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor    HeaderFileInfoVisitor(ASTReader &Reader, const FileEntry *FE)
3640d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      : Reader(Reader), FE(FE) { }
3641d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor
36421a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    static bool visit(ModuleFile &M, void *UserData) {
3643d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      HeaderFileInfoVisitor *This
3644d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor        = static_cast<HeaderFileInfoVisitor *>(UserData);
3645d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor
3646d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      HeaderFileInfoTrait Trait(This->Reader, M,
3647d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor                                &This->Reader.getPreprocessor().getHeaderSearchInfo(),
3648d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor                                M.HeaderFileFrameworkStrings,
3649d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor                                This->FE->getName());
3650d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor
3651d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      HeaderFileInfoLookupTable *Table
3652d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor        = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
3653d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      if (!Table)
3654d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor        return false;
3655cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
3656d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      // Look in the on-disk hash table for an entry for this file name.
3657d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE->getName(),
3658d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor                                                            &Trait);
3659d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      if (Pos == Table->end())
3660d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor        return false;
3661cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
3662d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      This->HFI = *Pos;
3663d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      return true;
3664d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor    }
3665d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor
3666d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor    llvm::Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
3667d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor  };
3668d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor}
3669d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor
3670d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas GregorHeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
3671d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor  HeaderFileInfoVisitor Visitor(*this, FE);
3672d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor  ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
3673d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor  if (llvm::Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) {
3674d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor    if (Listener)
3675d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor      Listener->ReadHeaderFileInfo(*HFI, FE->getUID());
3676d10a381d92a60d4f4c126c4e81045c8ad4636a0bDouglas Gregor    return *HFI;
3677cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  }
3678cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
3679cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  return HeaderFileInfo();
3680cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
3681cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
3682d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikievoid ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
36835d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner  for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
36841a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    ModuleFile &F = *(*I);
3685f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    unsigned Idx = 0;
3686f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    while (Idx < F.PragmaDiagMappings.size()) {
3687f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
368887429a05ff66fe6460eaa4855fd0da574e26bf7bArgyrios Kyrtzidis      Diag.DiagStates.push_back(*Diag.GetCurDiagState());
368987429a05ff66fe6460eaa4855fd0da574e26bf7bArgyrios Kyrtzidis      Diag.DiagStatePoints.push_back(
369087429a05ff66fe6460eaa4855fd0da574e26bf7bArgyrios Kyrtzidis          DiagnosticsEngine::DiagStatePoint(&Diag.DiagStates.back(),
369187429a05ff66fe6460eaa4855fd0da574e26bf7bArgyrios Kyrtzidis                                            FullSourceLoc(Loc, SourceMgr)));
3692f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      while (1) {
3693f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        assert(Idx < F.PragmaDiagMappings.size() &&
3694f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor               "Invalid data, didn't find '-1' marking end of diag/map pairs");
3695f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        if (Idx >= F.PragmaDiagMappings.size()) {
3696f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor          break; // Something is messed up but at least avoid infinite loop in
3697f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                 // release build.
3698f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        }
3699f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        unsigned DiagID = F.PragmaDiagMappings[Idx++];
3700f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        if (DiagID == (unsigned)-1) {
3701f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor          break; // no more diag/map pairs for this location.
3702f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        }
3703f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor        diag::Mapping Map = (diag::Mapping)F.PragmaDiagMappings[Idx++];
370487429a05ff66fe6460eaa4855fd0da574e26bf7bArgyrios Kyrtzidis        DiagnosticMappingInfo MappingInfo = Diag.makeMappingInfo(Map, Loc);
370587429a05ff66fe6460eaa4855fd0da574e26bf7bArgyrios Kyrtzidis        Diag.GetCurDiagState()->setMappingInfo(DiagID, MappingInfo);
3706f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      }
37073efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis    }
3708f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis  }
3709f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis}
3710f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis
3711aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl/// \brief Get the correct cursor and offset for loading a type.
3712c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
3713a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor  GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
3714e9b76c11a88d0af98f32d11a6668d03d45be3123Jonathan D. Turner  assert(I != GlobalTypeMap.end() && "Corrupted global type map");
37151a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile *M = I->second;
3716e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor  return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
3717aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl}
3718aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl
3719aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl/// \brief Read and return the type with the given index..
37202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor///
3721aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl/// The index is the type ID, shifted and minus the number of predefs. This
3722aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl/// routine actually reads the record corresponding to the type at the given
3723aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl/// location. It is a helper routine for GetType, which deals with reading type
3724aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl/// IDs.
3725393f249399fe30e9580e1529a7479489e90f3a57Douglas GregorQualType ASTReader::readTypeRecord(unsigned Index) {
3726aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl  RecordLocation Loc = TypeCursorForIndex(Index);
3727c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
37289137a5230d3164b96beb14ffb87863234b7d240fSebastian Redl
37290b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  // Keep track of where we are in the stream, then jump back there
37300b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  // after reading this type.
373161d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor  SavedStreamPosition SavedPosition(DeclsCursor);
37320b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
3733919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  ReadingKindTracker ReadingKind(Read_Type, *this);
373427372b4f1f402e95dd479ecf40c39ca71c15619fSebastian Redl
3735d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor  // Note that we are loading a type record.
373629ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis  Deserializing AType(this);
37371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3738393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  unsigned Idx = 0;
3739c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  DeclsCursor.JumpToBit(Loc.Offset);
37402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  RecordData Record;
374161d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor  unsigned Code = DeclsCursor.ReadCode();
37428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  switch ((TypeCode)DeclsCursor.ReadRecord(Code, Record)) {
37438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_EXT_QUAL: {
3744d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    if (Record.size() != 2) {
3745d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("Incorrect encoding of extended qualifier type");
3746d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3747d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3748393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Base = readType(*Loc.F, Record, Idx);
3749393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
3750359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getQualifiedType(Base, Quals);
37516d473967121ac70ecede83bb2b47247e9a3766f3Douglas Gregor  }
3752b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
37538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_COMPLEX: {
3754d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    if (Record.size() != 1) {
3755d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("Incorrect encoding of complex type");
3756d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3757d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3758393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ElemType = readType(*Loc.F, Record, Idx);
3759359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getComplexType(ElemType);
37602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
37612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
37628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_POINTER: {
3763d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    if (Record.size() != 1) {
3764d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("Incorrect encoding of pointer type");
3765d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3766d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3767393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType PointeeType = readType(*Loc.F, Record, Idx);
3768359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getPointerType(PointeeType);
37692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
37702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
37718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_BLOCK_POINTER: {
3772d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    if (Record.size() != 1) {
3773d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("Incorrect encoding of block pointer type");
3774d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3775d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3776393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType PointeeType = readType(*Loc.F, Record, Idx);
3777359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getBlockPointerType(PointeeType);
37782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
37792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
37808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_LVALUE_REFERENCE: {
3781df1550fc59b51681d37225934fe4e3acac321621Richard Smith    if (Record.size() != 2) {
3782d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("Incorrect encoding of lvalue reference type");
3783d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3784d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3785393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType PointeeType = readType(*Loc.F, Record, Idx);
3786359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getLValueReferenceType(PointeeType, Record[1]);
37872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
37882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
37898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_RVALUE_REFERENCE: {
3790d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    if (Record.size() != 1) {
3791d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("Incorrect encoding of rvalue reference type");
3792d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3793d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3794393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType PointeeType = readType(*Loc.F, Record, Idx);
3795359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getRValueReferenceType(PointeeType);
37962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
37972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
37988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_MEMBER_POINTER: {
3799240437bbb96898e2cd019ffbc5303cd42e3d4f5fArgyrios Kyrtzidis    if (Record.size() != 2) {
3800d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("Incorrect encoding of member pointer type");
3801d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3802d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3803393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType PointeeType = readType(*Loc.F, Record, Idx);
3804393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ClassType = readType(*Loc.F, Record, Idx);
38051ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor    if (PointeeType.isNull() || ClassType.isNull())
38061ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor      return QualType();
38071ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor
3808359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
38092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
38102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
38118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_CONSTANT_ARRAY: {
3812393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ElementType = readType(*Loc.F, Record, Idx);
3813b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
3814b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    unsigned IndexTypeQuals = Record[2];
3815b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    unsigned Idx = 3;
3816b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    llvm::APInt Size = ReadAPInt(Record, Idx);
3817359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getConstantArrayType(ElementType, Size,
38187e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                         ASM, IndexTypeQuals);
38197e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  }
38207e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor
38218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_INCOMPLETE_ARRAY: {
3822393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ElementType = readType(*Loc.F, Record, Idx);
3823b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
3824b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    unsigned IndexTypeQuals = Record[2];
3825359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
3826b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  }
3827b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
38288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_VARIABLE_ARRAY: {
3829393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ElementType = readType(*Loc.F, Record, Idx);
38300b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
38310b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor    unsigned IndexTypeQuals = Record[2];
3832c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
3833c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
3834359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
38357e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                         ASM, IndexTypeQuals,
38367e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor                                         SourceRange(LBLoc, RBLoc));
3837b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  }
3838b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
38398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_VECTOR: {
3840788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    if (Record.size() != 3) {
38413c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      Error("incorrect encoding of vector type in AST file");
3842b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor      return QualType();
3843b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    }
3844b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
3845393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ElementType = readType(*Loc.F, Record, Idx);
3846b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    unsigned NumElements = Record[1];
3847e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson    unsigned VecKind = Record[2];
3848359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getVectorType(ElementType, NumElements,
3849e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                  (VectorType::VectorKind)VecKind);
3850b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  }
3851b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
38528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_EXT_VECTOR: {
3853788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    if (Record.size() != 3) {
38543c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      Error("incorrect encoding of extended vector type in AST file");
3855b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor      return QualType();
3856b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    }
3857b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
3858393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ElementType = readType(*Loc.F, Record, Idx);
3859b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    unsigned NumElements = Record[1];
3860359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getExtVectorType(ElementType, NumElements);
3861b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  }
3862b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
38638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_FUNCTION_NO_PROTO: {
3864f85e193739c953358c865005855253af4f68a497John McCall    if (Record.size() != 6) {
3865a02b147b66ff9f1a22bac4ec7fd1b0d54a40e5bfDouglas Gregor      Error("incorrect encoding of no-proto function type");
3866b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor      return QualType();
3867b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    }
3868393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ResultType = readType(*Loc.F, Record, Idx);
3869f85e193739c953358c865005855253af4f68a497John McCall    FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
3870f85e193739c953358c865005855253af4f68a497John McCall                               (CallingConv)Record[4], Record[5]);
3871359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getFunctionNoProtoType(ResultType, Info);
3872b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  }
3873b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
38748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_FUNCTION_PROTO: {
3875393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ResultType = readType(*Loc.F, Record, Idx);
3876e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
3877e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    FunctionProtoType::ExtProtoInfo EPI;
3878e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
3879a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman                                        /*hasregparm*/ Record[2],
3880a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman                                        /*regparm*/ Record[3],
3881f85e193739c953358c865005855253af4f68a497John McCall                                        static_cast<CallingConv>(Record[4]),
3882f85e193739c953358c865005855253af4f68a497John McCall                                        /*produces*/ Record[5]);
3883e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
3884f85e193739c953358c865005855253af4f68a497John McCall    unsigned Idx = 6;
3885b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    unsigned NumParams = Record[Idx++];
38865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<QualType, 16> ParamTypes;
3887b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    for (unsigned I = 0; I != NumParams; ++I)
3888393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor      ParamTypes.push_back(readType(*Loc.F, Record, Idx));
3889e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
3890e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    EPI.Variadic = Record[Idx++];
3891eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith    EPI.HasTrailingReturn = Record[Idx++];
3892e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    EPI.TypeQuals = Record[Idx++];
3893c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor    EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
389460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    ExceptionSpecificationType EST =
389560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl        static_cast<ExceptionSpecificationType>(Record[Idx++]);
389660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    EPI.ExceptionSpecType = EST;
3897b0d06e2e6b340c198892fa0389fde906903a47ecDouglas Gregor    SmallVector<QualType, 2> Exceptions;
389860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    if (EST == EST_Dynamic) {
389960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      EPI.NumExceptions = Record[Idx++];
390060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      for (unsigned I = 0; I != EPI.NumExceptions; ++I)
3901393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor        Exceptions.push_back(readType(*Loc.F, Record, Idx));
390260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      EPI.Exceptions = Exceptions.data();
390360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    } else if (EST == EST_ComputedNoexcept) {
390460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      EPI.NoexceptExpr = ReadExpr(*Loc.F);
39057bb698aa054de4c0e0aa23973b2c62dac9611262Richard Smith    } else if (EST == EST_Uninstantiated) {
39067bb698aa054de4c0e0aa23973b2c62dac9611262Richard Smith      EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
39077bb698aa054de4c0e0aa23973b2c62dac9611262Richard Smith      EPI.ExceptionSpecTemplate = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
3908b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith    } else if (EST == EST_Unevaluated) {
3909b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith      EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
391060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    }
3911359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getFunctionType(ResultType, ParamTypes.data(), NumParams,
3912e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                                    EPI);
3913b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  }
3914b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
3915409448c832d27703146b70a1137d86b020f29863Douglas Gregor  case TYPE_UNRESOLVED_USING: {
3916409448c832d27703146b70a1137d86b020f29863Douglas Gregor    unsigned Idx = 0;
3917359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getTypeDeclType(
3918409448c832d27703146b70a1137d86b020f29863Douglas Gregor                  ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
3919409448c832d27703146b70a1137d86b020f29863Douglas Gregor  }
3920409448c832d27703146b70a1137d86b020f29863Douglas Gregor
39218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_TYPEDEF: {
39229763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    if (Record.size() != 2) {
3923d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("incorrect encoding of typedef type");
3924d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3925d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3926409448c832d27703146b70a1137d86b020f29863Douglas Gregor    unsigned Idx = 0;
3927409448c832d27703146b70a1137d86b020f29863Douglas Gregor    TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
3928393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Canonical = readType(*Loc.F, Record, Idx);
392932adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor    if (!Canonical.isNull())
3930359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      Canonical = Context.getCanonicalType(Canonical);
3931359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getTypedefType(Decl, Canonical);
39329763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  }
3933b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
39348538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_TYPEOF_EXPR:
3935359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getTypeOfExprType(ReadExpr(*Loc.F));
3936b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
39378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_TYPEOF: {
3938b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    if (Record.size() != 1) {
39393c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      Error("incorrect encoding of typeof(type) in AST file");
3940b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor      return QualType();
3941b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor    }
3942393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType UnderlyingType = readType(*Loc.F, Record, Idx);
3943359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getTypeOfType(UnderlyingType);
3944b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  }
39451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3946f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor  case TYPE_DECLTYPE: {
3947f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor    QualType UnderlyingType = readType(*Loc.F, Record, Idx);
3948f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor    return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
3949f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor  }
3950395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
3951ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  case TYPE_UNARY_TRANSFORM: {
3952393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType BaseType = readType(*Loc.F, Record, Idx);
3953393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType UnderlyingType = readType(*Loc.F, Record, Idx);
3954ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
3955359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
3956ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  }
3957ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
395834b41d939a1328f484511c6002ba2456db879a29Richard Smith  case TYPE_AUTO:
3959359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getAutoType(readType(*Loc.F, Record, Idx));
396034b41d939a1328f484511c6002ba2456db879a29Richard Smith
39618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_RECORD: {
3962be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis    if (Record.size() != 2) {
3963d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("incorrect encoding of record type");
3964d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3965d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3966409448c832d27703146b70a1137d86b020f29863Douglas Gregor    unsigned Idx = 0;
3967409448c832d27703146b70a1137d86b020f29863Douglas Gregor    bool IsDependent = Record[Idx++];
396856ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor    RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
396956ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor    RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
397056ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor    QualType T = Context.getRecordType(RD);
3971f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
3972be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis    return T;
3973be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis  }
3974b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
39758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_ENUM: {
3976be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis    if (Record.size() != 2) {
3977d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      Error("incorrect encoding of enum type");
3978d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek      return QualType();
3979d5d7b3f61f82b0fed9d6f02839bc72e528332911Ted Kremenek    }
3980409448c832d27703146b70a1137d86b020f29863Douglas Gregor    unsigned Idx = 0;
3981409448c832d27703146b70a1137d86b020f29863Douglas Gregor    bool IsDependent = Record[Idx++];
3982409448c832d27703146b70a1137d86b020f29863Douglas Gregor    QualType T
3983359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
3984f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
3985be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis    return T;
3986be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis  }
39870a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor
39889d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  case TYPE_ATTRIBUTED: {
39899d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    if (Record.size() != 3) {
39909d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      Error("incorrect encoding of attributed type");
39919d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      return QualType();
39929d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    }
3993393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType modifiedType = readType(*Loc.F, Record, Idx);
3994393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType equivalentType = readType(*Loc.F, Record, Idx);
39959d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
3996359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getAttributedType(kind, modifiedType, equivalentType);
39979d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  }
39989d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
3999075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  case TYPE_PAREN: {
4000075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    if (Record.size() != 1) {
4001075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      Error("incorrect encoding of paren type");
4002075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      return QualType();
4003075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    }
4004393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType InnerType = readType(*Loc.F, Record, Idx);
4005359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getParenType(InnerType);
4006075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
4007075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
40087536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  case TYPE_PACK_EXPANSION: {
4009f9997a0834e0e0298b04ef044ad2699c727a7979Douglas Gregor    if (Record.size() != 2) {
40107536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor      Error("incorrect encoding of pack expansion type");
40117536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor      return QualType();
40127536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    }
4013393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Pattern = readType(*Loc.F, Record, Idx);
40147536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    if (Pattern.isNull())
40157536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor      return QualType();
4016cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    llvm::Optional<unsigned> NumExpansions;
4017cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    if (Record[1])
4018cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      NumExpansions = Record[1] - 1;
4019359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getPackExpansionType(Pattern, NumExpansions);
40207536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  }
40217536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
40228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_ELABORATED: {
40233acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    unsigned Idx = 0;
40243acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4025409448c832d27703146b70a1137d86b020f29863Douglas Gregor    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4026393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType NamedType = readType(*Loc.F, Record, Idx);
4027359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getElaboratedType(Keyword, NNS, NamedType);
40287da2431c23ef1ee8acb114e39692246e1801afc2John McCall  }
40297da2431c23ef1ee8acb114e39692246e1801afc2John McCall
40308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_OBJC_INTERFACE: {
4031c6fa4450b827d1e3674494fc9659eae006a86b49Chris Lattner    unsigned Idx = 0;
4032409448c832d27703146b70a1137d86b020f29863Douglas Gregor    ObjCInterfaceDecl *ItfD
4033409448c832d27703146b70a1137d86b020f29863Douglas Gregor      = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
403456ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor    return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
4035c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  }
4036c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
40378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_OBJC_OBJECT: {
4038c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    unsigned Idx = 0;
4039393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Base = readType(*Loc.F, Record, Idx);
4040c6fa4450b827d1e3674494fc9659eae006a86b49Chris Lattner    unsigned NumProtos = Record[Idx++];
40415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<ObjCProtocolDecl*, 4> Protos;
4042c6fa4450b827d1e3674494fc9659eae006a86b49Chris Lattner    for (unsigned I = 0; I != NumProtos; ++I)
4043409448c832d27703146b70a1137d86b020f29863Douglas Gregor      Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
4044359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
4045c6fa4450b827d1e3674494fc9659eae006a86b49Chris Lattner  }
4046b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
40478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_OBJC_OBJECT_POINTER: {
4048d7a3fcd48cb308074cc95031252bc64966f0703dChris Lattner    unsigned Idx = 0;
4049393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Pointee = readType(*Loc.F, Record, Idx);
4050359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getObjCObjectPointerType(Pointee);
4051d7a3fcd48cb308074cc95031252bc64966f0703dChris Lattner  }
405224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
40538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
405449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    unsigned Idx = 0;
4055393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Parm = readType(*Loc.F, Record, Idx);
4056393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Replacement = readType(*Loc.F, Record, Idx);
405749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    return
4058359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      Context.getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm),
405949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                                            Replacement);
406049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  }
40613cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
4062c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
4063c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    unsigned Idx = 0;
4064393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Parm = readType(*Loc.F, Record, Idx);
4065c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
4066359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getSubstTemplateTypeParmPackType(
4067c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                               cast<TemplateTypeParmType>(Parm),
4068c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                                     ArgPack);
4069c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  }
4070c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
40718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_INJECTED_CLASS_NAME: {
4072409448c832d27703146b70a1137d86b020f29863Douglas Gregor    CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
4073393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
407443921b53b582145f0d1b7c48223bd4d9f0a9d1beArgyrios Kyrtzidis    // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
40753c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // for AST reading, too much interdependencies.
407643921b53b582145f0d1b7c48223bd4d9f0a9d1beArgyrios Kyrtzidis    return
4077359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      QualType(new (Context, TypeAlignment) InjectedClassNameType(D, TST), 0);
40783cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  }
407920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
40808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_TEMPLATE_TYPE_PARM: {
40818731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    unsigned Idx = 0;
40828731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    unsigned Depth = Record[Idx++];
40838731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    unsigned Index = Record[Idx++];
40848731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    bool Pack = Record[Idx++];
4085409448c832d27703146b70a1137d86b020f29863Douglas Gregor    TemplateTypeParmDecl *D
4086409448c832d27703146b70a1137d86b020f29863Douglas Gregor      = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
4087359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
40888731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
408920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
40908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_DEPENDENT_NAME: {
40918dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    unsigned Idx = 0;
40928dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4093409448c832d27703146b70a1137d86b020f29863Douglas Gregor    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
409495eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor    const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
4095393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Canon = readType(*Loc.F, Record, Idx);
409632adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor    if (!Canon.isNull())
4097359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      Canon = Context.getCanonicalType(Canon);
4098359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getDependentNameType(Keyword, NNS, Name, Canon);
40998dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  }
410020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
41018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
41023acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    unsigned Idx = 0;
41033acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4104409448c832d27703146b70a1137d86b020f29863Douglas Gregor    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
410595eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor    const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
41063acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    unsigned NumArgs = Record[Idx++];
41075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<TemplateArgument, 8> Args;
41083acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    Args.reserve(NumArgs);
41093acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    while (NumArgs--)
4110c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
4111359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
41123acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis                                                      Args.size(), Args.data());
41133acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis  }
411420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
41158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_DEPENDENT_SIZED_ARRAY: {
4116ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis    unsigned Idx = 0;
4117ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis
4118ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis    // ArrayType
4119393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType ElementType = readType(*Loc.F, Record, Idx);
4120ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis    ArrayType::ArraySizeModifier ASM
4121ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis      = (ArrayType::ArraySizeModifier)Record[Idx++];
4122ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis    unsigned IndexTypeQuals = Record[Idx++];
4123ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis
4124ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis    // DependentSizedArrayType
4125c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    Expr *NumElts = ReadExpr(*Loc.F);
4126c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
4127ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis
4128359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
4129ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis                                               IndexTypeQuals, Brackets);
4130ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis  }
413190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
41328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case TYPE_TEMPLATE_SPECIALIZATION: {
41338731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    unsigned Idx = 0;
4134be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis    bool IsDependent = Record[Idx++];
41351aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
41365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<TemplateArgument, 8> Args;
4137c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
4138393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType Underlying = readType(*Loc.F, Record, Idx);
4139be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis    QualType T;
41403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    if (Underlying.isNull())
4141359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
4142be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis                                                          Args.size());
41439763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    else
4144359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      T = Context.getTemplateSpecializationType(Name, Args.data(),
41453e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                 Args.size(), Underlying);
4146f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4147be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis    return T;
41488731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
4149b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
4150b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case TYPE_ATOMIC: {
4151b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    if (Record.size() != 1) {
4152b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      Error("Incorrect encoding of atomic type");
4153b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      return QualType();
4154b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    }
4155b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    QualType ValueType = readType(*Loc.F, Record, Idx);
4156b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    return Context.getAtomicType(ValueType);
4157b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  }
41582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
41597530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid TypeCode!");
41602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
41612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
4162c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redlclass clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
4163c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl  ASTReader &Reader;
41641a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile &F;
4165c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl  const ASTReader::RecordData &Record;
4166a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  unsigned &Idx;
4167a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
4168c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
4169c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                    unsigned &I) {
4170c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    return Reader.ReadSourceLocation(F, R, I);
4171c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  }
4172c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl
4173409448c832d27703146b70a1137d86b020f29863Douglas Gregor  template<typename T>
4174409448c832d27703146b70a1137d86b020f29863Douglas Gregor  T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
4175409448c832d27703146b70a1137d86b020f29863Douglas Gregor    return Reader.ReadDeclAs<T>(F, Record, Idx);
4176409448c832d27703146b70a1137d86b020f29863Douglas Gregor  }
4177409448c832d27703146b70a1137d86b020f29863Douglas Gregor
4178a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallpublic:
41791a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  TypeLocReader(ASTReader &Reader, ModuleFile &F,
4180c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl                const ASTReader::RecordData &Record, unsigned &Idx)
4181facde171ae4b8926622a1bffa833732a06f1875bBenjamin Kramer    : Reader(Reader), F(F), Record(Record), Idx(Idx)
4182c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  { }
4183a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
418451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  // We want compile-time assurance that we've enumerated all of
418551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  // these, so unfortunately we have to declare them first, then
418651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  // define them out-of-line.
418751bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
4188a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#define TYPELOC(CLASS, PARENT) \
418951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
4190a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#include "clang/AST/TypeLocNodes.def"
4191a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
419251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  void VisitFunctionTypeLoc(FunctionTypeLoc);
419351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  void VisitArrayTypeLoc(ArrayTypeLoc);
4194a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall};
4195a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
419651bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
4197a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  // nothing to do
4198a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
419951bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
4200c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
4201ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (TL.needsExtraLocalData()) {
4202ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
4203ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
4204ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
4205ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    TL.setModeAttr(Record[Idx++]);
4206ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  }
4207a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
420851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
4209c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4210a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
421151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
4212c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setStarLoc(ReadSourceLocation(Record, Idx));
4213a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
421451bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
4215c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setCaretLoc(ReadSourceLocation(Record, Idx));
4216a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
421751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
4218c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setAmpLoc(ReadSourceLocation(Record, Idx));
4219a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
422051bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
4221c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
4222a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
422351bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
4224c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setStarLoc(ReadSourceLocation(Record, Idx));
4225b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4226a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
422751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
4228c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
4229c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
4230a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  if (Record[Idx++])
4231c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TL.setSizeExpr(Reader.ReadExpr(F));
423261d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor  else
423351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    TL.setSizeExpr(0);
423451bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
423551bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
423651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  VisitArrayTypeLoc(TL);
423751bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
423851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
423951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  VisitArrayTypeLoc(TL);
424051bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
424151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
424251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  VisitArrayTypeLoc(TL);
424351bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
424451bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitDependentSizedArrayTypeLoc(
424551bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                            DependentSizedArrayTypeLoc TL) {
424651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  VisitArrayTypeLoc(TL);
424751bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
424851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
424951bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                        DependentSizedExtVectorTypeLoc TL) {
4250c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
425151bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
425251bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
4253c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
425451bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
425551bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
4256c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
425751bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
425851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
4259796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara  TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
4260796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara  TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
426151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
4262409448c832d27703146b70a1137d86b020f29863Douglas Gregor    TL.setArg(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
426351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  }
426451bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
426551bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
426651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  VisitFunctionTypeLoc(TL);
426751bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
426851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
426951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  VisitFunctionTypeLoc(TL);
427051bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
4271ed97649e9574b9d854fa4d6109c9333ae0993554John McCallvoid TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
4272c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4273ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
427451bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
4275c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
427651bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
427751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
4278c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
4279c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4280c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
428151bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
428251bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
4283c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
4284c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4285c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4286c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
428751bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
428851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
4289c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
429051bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
4291ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Huntvoid TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
4292ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  TL.setKWLoc(ReadSourceLocation(Record, Idx));
4293ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4294ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4295ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4296ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt}
429734b41d939a1328f484511c6002ba2456db879a29Richard Smithvoid TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
429834b41d939a1328f484511c6002ba2456db879a29Richard Smith  TL.setNameLoc(ReadSourceLocation(Record, Idx));
429934b41d939a1328f484511c6002ba2456db879a29Richard Smith}
430051bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
4301c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
430251bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
430351bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
4304c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
430551bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
43069d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallvoid TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
43079d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
43089d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (TL.hasAttrOperand()) {
43099d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    SourceRange range;
43109d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    range.setBegin(ReadSourceLocation(Record, Idx));
43119d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    range.setEnd(ReadSourceLocation(Record, Idx));
43129d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    TL.setAttrOperandParensRange(range);
43139d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  }
43149d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (TL.hasAttrExprOperand()) {
43159d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    if (Record[Idx++])
43169d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      TL.setAttrExprOperand(Reader.ReadExpr(F));
43179d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    else
43189d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      TL.setAttrExprOperand(0);
43199d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  } else if (TL.hasAttrEnumOperand())
43209d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
43219d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
432251bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
4323c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
432451bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
432549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallvoid TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
432649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                                            SubstTemplateTypeParmTypeLoc TL) {
4327c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
432849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
4329c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorvoid TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
4330c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                          SubstTemplateTypeParmPackTypeLoc TL) {
4331c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4332c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
433351bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitTemplateSpecializationTypeLoc(
433451bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                           TemplateSpecializationTypeLoc TL) {
433555d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
4336c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
4337c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4338c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4339833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
4340833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i,
4341c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        Reader.GetTemplateArgumentLocInfo(F,
4342c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                          TL.getTypePtr()->getArg(i).getKind(),
4343c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                          Record, Idx));
434451bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
4345075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaravoid TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
4346075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4347075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4348075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara}
4349465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnaravoid TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
435038a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara  TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
43519e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
435251bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
43533cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallvoid TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
4354c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
43553cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
43564714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregorvoid TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
435738a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara  TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
43582494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4359c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
436051bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
436133500955d731c73717af52088b7fc0e7a85681e7John McCallvoid TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
436233500955d731c73717af52088b7fc0e7a85681e7John McCall       DependentTemplateSpecializationTypeLoc TL) {
436355d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
436494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
436566581d41527628d4b37f7b05c288f77be7415d7dAbramo Bagnara  TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
436655d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
4367c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4368c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
436933500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
437033500955d731c73717af52088b7fc0e7a85681e7John McCall    TL.setArgLocInfo(I,
4371c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        Reader.GetTemplateArgumentLocInfo(F,
4372c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                          TL.getTypePtr()->getArg(I).getKind(),
4373c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                          Record, Idx));
437433500955d731c73717af52088b7fc0e7a85681e7John McCall}
43757536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregorvoid TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
43767536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
43777536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor}
437851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
4379c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4380c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
4381c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallvoid TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
4382c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TL.setHasBaseTypeAsWritten(Record[Idx++]);
4383c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4384c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
438554e14c4db764c0636160d26c5bbf491637c83a76John McCall  for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
4386c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
438751bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
438851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
4389c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TL.setStarLoc(ReadSourceLocation(Record, Idx));
4390a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
4391b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedmanvoid TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
4392b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  TL.setKWLoc(ReadSourceLocation(Record, Idx));
4393b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4394b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4395b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman}
4396a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
43971a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorTypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
4398577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl                                             const RecordData &Record,
4399a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall                                             unsigned &Idx) {
4400393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  QualType InfoTy = readType(F, Record, Idx);
4401a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  if (InfoTy.isNull())
4402a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    return 0;
4403a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
4404359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
4405c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeLocReader TLR(*this, F, Record, Idx);
4406a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
4407a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    TLR.Visit(TL);
4408a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TInfo;
4409a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
44102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
44118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlQualType ASTReader::GetType(TypeID ID) {
44120953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  unsigned FastQuals = ID & Qualifiers::FastMask;
44130953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  unsigned Index = ID >> Qualifiers::FastWidth;
44142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
44158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  if (Index < NUM_PREDEF_TYPE_IDS) {
44162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    QualType T;
44178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((PredefinedTypeIDs)Index) {
44188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case PREDEF_TYPE_NULL_ID: return QualType();
4419359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
4420359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
44212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
44228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case PREDEF_TYPE_CHAR_U_ID:
44238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case PREDEF_TYPE_CHAR_S_ID:
44242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      // FIXME: Check that the signedness of CharTy is correct!
4425359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      T = Context.CharTy;
44262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      break;
44272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
4428359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_UCHAR_ID:      T = Context.UnsignedCharTy;     break;
4429359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_USHORT_ID:     T = Context.UnsignedShortTy;    break;
4430359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_UINT_ID:       T = Context.UnsignedIntTy;      break;
4431359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_ULONG_ID:      T = Context.UnsignedLongTy;     break;
4432359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_ULONGLONG_ID:  T = Context.UnsignedLongLongTy; break;
4433359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_UINT128_ID:    T = Context.UnsignedInt128Ty;   break;
4434359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_SCHAR_ID:      T = Context.SignedCharTy;       break;
4435359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_WCHAR_ID:      T = Context.WCharTy;            break;
4436359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_SHORT_ID:      T = Context.ShortTy;            break;
4437359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_INT_ID:        T = Context.IntTy;              break;
4438359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_LONG_ID:       T = Context.LongTy;             break;
4439359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_LONGLONG_ID:   T = Context.LongLongTy;         break;
4440359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_INT128_ID:     T = Context.Int128Ty;           break;
4441aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov    case PREDEF_TYPE_HALF_ID:       T = Context.HalfTy;             break;
4442359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_FLOAT_ID:      T = Context.FloatTy;            break;
4443359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_DOUBLE_ID:     T = Context.DoubleTy;           break;
4444359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy;       break;
4445359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_OVERLOAD_ID:   T = Context.OverloadTy;         break;
4446359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_BOUND_MEMBER:  T = Context.BoundMemberTy;      break;
44473c3b7f90a863af43fa63043d396553ecf205351cJohn McCall    case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy;     break;
4448359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_DEPENDENT_ID:  T = Context.DependentTy;        break;
4449359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_UNKNOWN_ANY:   T = Context.UnknownAnyTy;       break;
4450359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_NULLPTR_ID:    T = Context.NullPtrTy;          break;
4451359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_CHAR16_ID:     T = Context.Char16Ty;           break;
4452359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_CHAR32_ID:     T = Context.Char32Ty;           break;
4453359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_OBJC_ID:       T = Context.ObjCBuiltinIdTy;    break;
4454359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_OBJC_CLASS:    T = Context.ObjCBuiltinClassTy; break;
4455359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_OBJC_SEL:      T = Context.ObjCBuiltinSelTy;   break;
4456359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    case PREDEF_TYPE_AUTO_DEDUCT:   T = Context.getAutoDeductType(); break;
44573b8043b49aff6e5d70f29ef5684214ce2473763cDouglas Gregor
44583b8043b49aff6e5d70f29ef5684214ce2473763cDouglas Gregor    case PREDEF_TYPE_AUTO_RREF_DEDUCT:
4459359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      T = Context.getAutoRRefDeductType();
44603b8043b49aff6e5d70f29ef5684214ce2473763cDouglas Gregor      break;
44610ddaeb9b031070ec64afe92d9892875ac44df427John McCall
44620ddaeb9b031070ec64afe92d9892875ac44df427John McCall    case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
44630ddaeb9b031070ec64afe92d9892875ac44df427John McCall      T = Context.ARCUnbridgedCastTy;
44640ddaeb9b031070ec64afe92d9892875ac44df427John McCall      break;
44650ddaeb9b031070ec64afe92d9892875ac44df427John McCall
4466fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge    case PREDEF_TYPE_VA_LIST_TAG:
4467fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge      T = Context.getVaListTagType();
4468fb40e3f10ccef93c4f8fb6bd4fe5a108fa6cd369Meador Inge      break;
4469a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman
4470a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman    case PREDEF_TYPE_BUILTIN_FN:
4471a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman      T = Context.BuiltinFnTy;
4472a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman      break;
44732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    }
44742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
44752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    assert(!T.isNull() && "Unknown predefined type");
44760953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    return T.withFastQualifiers(FastQuals);
44772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
44782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
44798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  Index -= NUM_PREDEF_TYPE_IDS;
4480aaec0aa844781dc7c3462ba140e004e589ccd355Sebastian Redl  assert(Index < TypesLoaded.size() && "Type index out-of-range");
448107a353c2af3a3c557205466d4f4ed2513462ebfeSebastian Redl  if (TypesLoaded[Index].isNull()) {
4482393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    TypesLoaded[Index] = readTypeRecord(Index);
448397475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor    if (TypesLoaded[Index].isNull())
448497475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor      return QualType();
448597475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor
44863c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    TypesLoaded[Index]->setFromAST();
448730c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl    if (DeserializationListener)
4488c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis      DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
44891476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl                                        TypesLoaded[Index]);
449007a353c2af3a3c557205466d4f4ed2513462ebfeSebastian Redl  }
44911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return TypesLoaded[Index].withFastQualifiers(FastQuals);
44932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
44942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
44951a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorQualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
4496393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  return GetType(getGlobalTypeID(F, LocalID));
4497393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor}
4498393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor
4499393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregorserialization::TypeID
45001a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
4501a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor  unsigned FastQuals = LocalID & Qualifiers::FastMask;
4502a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor  unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
4503a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor
4504a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor  if (LocalIndex < NUM_PREDEF_TYPE_IDS)
4505a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor    return LocalID;
4506a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor
4507a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor  ContinuousRangeMap<uint32_t, int, 2>::iterator I
4508a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor    = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
4509a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor  assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
4510a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor
4511a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor  unsigned GlobalIndex = LocalIndex + I->second;
4512a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor  return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
4513a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor}
4514a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor
4515833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallTemplateArgumentLocInfo
45161a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
4517c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                      TemplateArgument::ArgKind Kind,
4518833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const RecordData &Record,
4519919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                      unsigned &Index) {
4520833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Kind) {
4521833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
4522c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    return ReadExpr(F);
4523833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
4524c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    return GetTypeSourceInfo(F, Record, Index);
4525788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
4526b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
4527b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                                                     Index);
4528c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
4529b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
4530a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                   SourceLocation());
4531a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  }
4532a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion: {
4533b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
4534b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                                                     Index);
4535a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
4536ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
4537b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
4538ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor                                   EllipsisLoc);
4539788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
4540833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
4541833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
4542833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
4543833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
4544833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return TemplateArgumentLocInfo();
4545833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
45469f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unexpected template argument loc");
4547833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
4548833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
454944f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios KyrtzidisTemplateArgumentLoc
45501a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
4551577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl                                   const RecordData &Record, unsigned &Index) {
4552c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
455317cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis
455417cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis  if (Arg.getKind() == TemplateArgument::Expression) {
455517cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis    if (Record[Index++]) // bool InfoHasSameExpr.
455617cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis      return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
455717cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis  }
4558c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
4559919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                                             Record, Index));
456044f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis}
456144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis
4562c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlDecl *ASTReader::GetExternalDecl(uint32_t ID) {
456376bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall  return GetDecl(ID);
456476bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall}
456576bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall
45661a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregoruint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, const RecordData &Record,
4567e92b8a1dbba150e213c4980710fcb59ec5c5c570Douglas Gregor                                          unsigned &Idx){
4568e92b8a1dbba150e213c4980710fcb59ec5c5c570Douglas Gregor  if (Idx >= Record.size())
45697c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor    return 0;
45707c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor
4571e92b8a1dbba150e213c4980710fcb59ec5c5c570Douglas Gregor  unsigned LocalID = Record[Idx++];
4572e92b8a1dbba150e213c4980710fcb59ec5c5c570Douglas Gregor  return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
45737c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor}
45747c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor
45757c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas GregorCXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
45768f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  RecordLocation Loc = getLocalBitOffset(Offset);
45778f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  llvm::BitstreamCursor &Cursor = Loc.F->DeclsCursor;
45787c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  SavedStreamPosition SavedPosition(Cursor);
45798f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  Cursor.JumpToBit(Loc.Offset);
45807c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  ReadingKindTracker ReadingKind(Read_Decl, *this);
45817c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  RecordData Record;
45827c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  unsigned Code = Cursor.ReadCode();
45837c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  unsigned RecCode = Cursor.ReadRecord(Code, Record);
45847c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
45857c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor    Error("Malformed AST file: missing C++ base specifiers");
45867c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor    return 0;
45877c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  }
45887c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor
45897c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  unsigned Idx = 0;
45907c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  unsigned NumBases = Record[Idx++];
4591359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
45927c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
45937c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  for (unsigned I = 0; I != NumBases; ++I)
45948f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor    Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
45957c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  return Bases;
45967c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor}
45977c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor
4598409448c832d27703146b70a1137d86b020f29863Douglas Gregorserialization::DeclID
45991a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::getGlobalDeclID(ModuleFile &F, unsigned LocalID) const {
46000a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor  if (LocalID < NUM_PREDEF_DECL_IDS)
4601496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor    return LocalID;
4602496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor
4603496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor  ContinuousRangeMap<uint32_t, int, 2>::iterator I
46040a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor    = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
4605496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor  assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
4606496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor
4607496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor  return LocalID + I->second;
4608409448c832d27703146b70a1137d86b020f29863Douglas Gregor}
4609409448c832d27703146b70a1137d86b020f29863Douglas Gregor
4610e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidisbool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
46111a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor                                   ModuleFile &M) const {
4612e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis  GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
4613e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis  assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
4614e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis  return &M == I->second;
4615e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis}
4616e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis
4617cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas GregorModuleFile *ASTReader::getOwningModuleFile(Decl *D) {
4618cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  if (!D->isFromASTFile())
4619cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor    return 0;
4620cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
4621cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
4622cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  return I->second;
4623cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor}
4624cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor
4625dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios KyrtzidisSourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
4626dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  if (ID < NUM_PREDEF_DECL_IDS)
4627dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    return SourceLocation();
4628dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4629dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  unsigned Index = ID - NUM_PREDEF_DECL_IDS;
4630dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4631dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  if (Index > DeclsLoaded.size()) {
4632dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    Error("declaration ID out-of-range for AST file");
4633dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    return SourceLocation();
4634dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  }
4635dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4636dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  if (Decl *D = DeclsLoaded[Index])
4637dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    return D->getLocation();
4638dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4639dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  unsigned RawLocation = 0;
4640dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  RecordLocation Rec = DeclCursorForID(ID, RawLocation);
4641dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  return ReadSourceLocation(*Rec.F, RawLocation);
4642dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis}
4643dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
46448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlDecl *ASTReader::GetDecl(DeclID ID) {
46450a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor  if (ID < NUM_PREDEF_DECL_IDS) {
46460a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor    switch ((PredefinedDeclIDs)ID) {
46476bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor    case PREDEF_DECL_NULL_ID:
46480a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor      return 0;
46496bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor
46506bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor    case PREDEF_DECL_TRANSLATION_UNIT_ID:
4651359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      return Context.getTranslationUnitDecl();
46524dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor
46534dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    case PREDEF_DECL_OBJC_ID_ID:
4654359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      return Context.getObjCIdDecl();
465579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor
46567a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    case PREDEF_DECL_OBJC_SEL_ID:
4657359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      return Context.getObjCSelDecl();
46587a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor
465979d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    case PREDEF_DECL_OBJC_CLASS_ID:
4660359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      return Context.getObjCClassDecl();
4661772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
4662a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    case PREDEF_DECL_OBJC_PROTOCOL_ID:
4663a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor      return Context.getObjCProtocolDecl();
4664a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor
4665772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    case PREDEF_DECL_INT_128_ID:
4666359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      return Context.getInt128Decl();
4667772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
4668772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    case PREDEF_DECL_UNSIGNED_INT_128_ID:
4669359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      return Context.getUInt128Decl();
4670e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor
4671e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor    case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
4672359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      return Context.getObjCInstanceTypeDecl();
4673c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
4674c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    case PREDEF_DECL_BUILTIN_VA_LIST_ID:
4675c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge      return Context.getBuiltinVaListDecl();
46760a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor    }
46770a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor  }
46780a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor
46796bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor  unsigned Index = ID - NUM_PREDEF_DECL_IDS;
46806bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor
46812fbf373a56b762e274af187bcb193634815ba1d2Richard Smith  if (Index >= DeclsLoaded.size()) {
46827518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis    assert(0 && "declaration ID out-of-range for AST file");
46833c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("declaration ID out-of-range for AST file");
46847518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis    return 0;
46858f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor  }
46866bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor
4687fd002a7027e47ddd4bc9f32b158b18ab0ebd29c7Douglas Gregor  if (!DeclsLoaded[Index]) {
4688496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor    ReadDeclRecord(ID);
468930c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl    if (DeserializationListener)
469030c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl      DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
469130c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl  }
46922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
46938f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor  return DeclsLoaded[Index];
46942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
46952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
4696a1be278c4f3a234ff61f04018d26c6beecde1654Douglas GregorDeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
4697a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor                                                  DeclID GlobalID) {
4698a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor  if (GlobalID < NUM_PREDEF_DECL_IDS)
4699a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor    return GlobalID;
4700a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor
4701a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor  GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
4702a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor  assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
4703a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor  ModuleFile *Owner = I->second;
4704a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor
4705a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor  llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
4706a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor    = M.GlobalToLocalDeclIDs.find(Owner);
4707a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor  if (Pos == M.GlobalToLocalDeclIDs.end())
4708a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor    return 0;
4709a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor
4710a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor  return GlobalID - Owner->BaseDeclID + Pos->second;
4711a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor}
4712a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor
47131a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorserialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
4714409448c832d27703146b70a1137d86b020f29863Douglas Gregor                                            const RecordData &Record,
4715409448c832d27703146b70a1137d86b020f29863Douglas Gregor                                            unsigned &Idx) {
4716409448c832d27703146b70a1137d86b020f29863Douglas Gregor  if (Idx >= Record.size()) {
4717409448c832d27703146b70a1137d86b020f29863Douglas Gregor    Error("Corrupted AST file");
4718409448c832d27703146b70a1137d86b020f29863Douglas Gregor    return 0;
4719409448c832d27703146b70a1137d86b020f29863Douglas Gregor  }
4720409448c832d27703146b70a1137d86b020f29863Douglas Gregor
4721409448c832d27703146b70a1137d86b020f29863Douglas Gregor  return getGlobalDeclID(F, Record[Idx++]);
4722409448c832d27703146b70a1137d86b020f29863Douglas Gregor}
4723409448c832d27703146b70a1137d86b020f29863Douglas Gregor
4724887e2b375fc5e00084ec7bf3dd050c2ca399a6d2Chris Lattner/// \brief Resolve the offset of a statement into a statement.
4725887e2b375fc5e00084ec7bf3dd050c2ca399a6d2Chris Lattner///
4726887e2b375fc5e00084ec7bf3dd050c2ca399a6d2Chris Lattner/// This operation will read a new statement from the external
4727887e2b375fc5e00084ec7bf3dd050c2ca399a6d2Chris Lattner/// source each time it is called, and is meant to be used via a
4728887e2b375fc5e00084ec7bf3dd050c2ca399a6d2Chris Lattner/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
4729c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlStmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
4730e09a275444576deb2c8d9e2255554242f65d7c00Argyrios Kyrtzidis  // Switch case IDs are per Decl.
4731e09a275444576deb2c8d9e2255554242f65d7c00Argyrios Kyrtzidis  ClearSwitchCaseIDs();
4732e09a275444576deb2c8d9e2255554242f65d7c00Argyrios Kyrtzidis
47330fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl  // Offset here is a global offset across the entire chain.
47348f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  RecordLocation Loc = getLocalBitOffset(Offset);
47358f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
47368f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  return ReadStmtFromStream(*Loc.F);
4737250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor}
4738250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor
4739851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregornamespace {
4740851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor  class FindExternalLexicalDeclsVisitor {
4741851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor    ASTReader &Reader;
4742851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor    const DeclContext *DC;
4743851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor    bool (*isKindWeWant)(Decl::Kind);
47442ea054fbc59ed19b8e3304e7e7cbdd56a5a5120fDouglas Gregor
4745851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor    SmallVectorImpl<Decl*> &Decls;
4746851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor    bool PredefsVisited[NUM_PREDEF_DECL_IDS];
4747851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
4748851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor  public:
4749851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor    FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
4750851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor                                    bool (*isKindWeWant)(Decl::Kind),
4751851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor                                    SmallVectorImpl<Decl*> &Decls)
4752851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor      : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
4753851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor    {
4754851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor      for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
4755851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        PredefsVisited[I] = false;
4756851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor    }
4757851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
47581a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
4759851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor      if (Preorder)
4760851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        return false;
4761851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
4762851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor      FindExternalLexicalDeclsVisitor *This
4763851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
4764851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
47651a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor      ModuleFile::DeclContextInfosMap::iterator Info
4766851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        = M.DeclContextInfos.find(This->DC);
4767851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor      if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
4768851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        return false;
4769851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
4770851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor      // Load all of the declaration IDs
4771851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor      for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
4772851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor                               *IDE = ID + Info->second.NumLexicalDecls;
4773851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor           ID != IDE; ++ID) {
4774851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
4775851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor          continue;
4776851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
4777851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        // Don't add predefined declarations to the lexical context more
4778851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        // than once.
4779851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        if (ID->second < NUM_PREDEF_DECL_IDS) {
4780851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor          if (This->PredefsVisited[ID->second])
4781851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor            continue;
4782851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
4783851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor          This->PredefsVisited[ID->second] = true;
4784851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor        }
4785851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
47862ea054fbc59ed19b8e3304e7e7cbdd56a5a5120fDouglas Gregor        if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
47872ea054fbc59ed19b8e3304e7e7cbdd56a5a5120fDouglas Gregor          if (!This->DC->isDeclInLexicalTraversal(D))
47882ea054fbc59ed19b8e3304e7e7cbdd56a5a5120fDouglas Gregor            This->Decls.push_back(D);
47892ea054fbc59ed19b8e3304e7e7cbdd56a5a5120fDouglas Gregor        }
4790851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor      }
4791851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
4792851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor      return false;
4793851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor    }
4794851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor  };
4795851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor}
4796851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor
4797ba6ffaf21e465c0926d7fc5fa294ea52f8d45fafDouglas GregorExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
4798eb5e9986e577b1e2bff3cca5973a2494fb593fbbArgyrios Kyrtzidis                                         bool (*isKindWeWant)(Decl::Kind),
47995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                         SmallVectorImpl<Decl*> &Decls) {
48000d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor  // There might be lexical decls in multiple modules, for the TU at
4801851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor  // least. Walk all of the modules in the order they were loaded.
4802851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor  FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
4803851c75a279bb4441bc6802d0258ceb4ab64738d4Douglas Gregor  ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
48042512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor  ++NumLexicalDeclContextsRead;
4805ba6ffaf21e465c0926d7fc5fa294ea52f8d45fafDouglas Gregor  return ELR_Success;
48062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
48072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
48080d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregornamespace {
4809dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4810dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidisclass DeclIDComp {
4811dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  ASTReader &Reader;
48121a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  ModuleFile &Mod;
4813dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4814dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidispublic:
48151a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
4816dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4817dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  bool operator()(LocalDeclID L, LocalDeclID R) const {
4818dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    SourceLocation LHS = getLocation(L);
4819dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    SourceLocation RHS = getLocation(R);
4820dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4821dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  }
4822dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4823dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  bool operator()(SourceLocation LHS, LocalDeclID R) const {
4824dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    SourceLocation RHS = getLocation(R);
4825dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4826dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  }
4827dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4828dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  bool operator()(LocalDeclID L, SourceLocation RHS) const {
4829dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    SourceLocation LHS = getLocation(L);
4830dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4831dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  }
4832dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4833dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  SourceLocation getLocation(LocalDeclID ID) const {
4834dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    return Reader.getSourceManager().getFileLoc(
4835dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis            Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
4836dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  }
4837dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis};
4838dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4839dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis}
4840dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4841dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidisvoid ASTReader::FindFileRegionDecls(FileID File,
4842dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis                                    unsigned Offset, unsigned Length,
4843dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis                                    SmallVectorImpl<Decl *> &Decls) {
4844dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  SourceManager &SM = getSourceManager();
4845dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4846dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
4847dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  if (I == FileDeclIDs.end())
4848dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    return;
4849dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4850dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  FileDeclsInfo &DInfo = I->second;
4851dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  if (DInfo.Decls.empty())
4852dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    return;
4853dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4854dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  SourceLocation
4855dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
4856dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
4857dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4858dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  DeclIDComp DIDComp(*this, *DInfo.Mod);
4859dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  ArrayRef<serialization::LocalDeclID>::iterator
4860dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
4861dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis                               BeginLoc, DIDComp);
4862dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  if (BeginIt != DInfo.Decls.begin())
4863dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    --BeginIt;
4864dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4865c14a03dffff69b5e1c55cc118fc52d8fd9f3a28dArgyrios Kyrtzidis  // If we are pointing at a top-level decl inside an objc container, we need
4866c14a03dffff69b5e1c55cc118fc52d8fd9f3a28dArgyrios Kyrtzidis  // to backtrack until we find it otherwise we will fail to report that the
4867c14a03dffff69b5e1c55cc118fc52d8fd9f3a28dArgyrios Kyrtzidis  // region overlaps with an objc container.
4868c14a03dffff69b5e1c55cc118fc52d8fd9f3a28dArgyrios Kyrtzidis  while (BeginIt != DInfo.Decls.begin() &&
4869c14a03dffff69b5e1c55cc118fc52d8fd9f3a28dArgyrios Kyrtzidis         GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
4870c14a03dffff69b5e1c55cc118fc52d8fd9f3a28dArgyrios Kyrtzidis             ->isTopLevelDeclInObjCContainer())
4871c14a03dffff69b5e1c55cc118fc52d8fd9f3a28dArgyrios Kyrtzidis    --BeginIt;
4872c14a03dffff69b5e1c55cc118fc52d8fd9f3a28dArgyrios Kyrtzidis
4873dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  ArrayRef<serialization::LocalDeclID>::iterator
4874dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
4875dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis                             EndLoc, DIDComp);
4876dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  if (EndIt != DInfo.Decls.end())
4877dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    ++EndIt;
4878dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4879dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis  for (ArrayRef<serialization::LocalDeclID>::iterator
4880dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis         DIt = BeginIt; DIt != EndIt; ++DIt)
4881dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis    Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
4882dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis}
4883dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidis
4884dfb332d0081c6641d1dbae6a2aeff757c99cc740Argyrios Kyrtzidisnamespace {
48851a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  /// \brief ModuleFile visitor used to perform name lookup into a
48860d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor  /// declaration context.
48870d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor  class DeclContextNameLookupVisitor {
48880d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor    ASTReader &Reader;
4889c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor    llvm::SmallVectorImpl<const DeclContext *> &Contexts;
48900d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor    DeclarationName Name;
48910d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor    SmallVectorImpl<NamedDecl *> &Decls;
48920d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor
48930d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor  public:
48940d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor    DeclContextNameLookupVisitor(ASTReader &Reader,
4895c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor                                 SmallVectorImpl<const DeclContext *> &Contexts,
4896c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor                                 DeclarationName Name,
48970d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor                                 SmallVectorImpl<NamedDecl *> &Decls)
4898c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor      : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
48990d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor
49001a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    static bool visit(ModuleFile &M, void *UserData) {
49010d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      DeclContextNameLookupVisitor *This
49020d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        = static_cast<DeclContextNameLookupVisitor *>(UserData);
49030d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor
49040d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      // Check whether we have any visible declaration information for
49050d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      // this context in this module.
4906c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor      ModuleFile::DeclContextInfosMap::iterator Info;
4907c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor      bool FoundInfo = false;
4908c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor      for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
4909c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor        Info = M.DeclContextInfos.find(This->Contexts[I]);
4910c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor        if (Info != M.DeclContextInfos.end() &&
4911c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor            Info->second.NameLookupTableData) {
4912c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor          FoundInfo = true;
4913c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor          break;
4914c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor        }
4915c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor      }
49160d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor
4917c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor      if (!FoundInfo)
4918c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor        return false;
4919c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor
49200d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      // Look for this name within this module.
49210d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      ASTDeclContextNameLookupTable *LookupTable =
4922b1758c662524e18d65d260188fdcbbdee6a9316bBenjamin Kramer        Info->second.NameLookupTableData;
49230d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      ASTDeclContextNameLookupTable::iterator Pos
49240d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        = LookupTable->find(This->Name);
49250d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      if (Pos == LookupTable->end())
49260d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        return false;
49270d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor
49280d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      bool FoundAnything = false;
49290d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      ASTDeclContextNameLookupTrait::data_type Data = *Pos;
49300d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      for (; Data.first != Data.second; ++Data.first) {
49310d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
49320d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        if (!ND)
49330d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor          continue;
49340d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor
49350d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        if (ND->getDeclName() != This->Name) {
49360d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor          assert(!This->Name.getCXXNameType().isNull() &&
49370d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor                 "Name mismatch without a type");
49380d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor          continue;
49390d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        }
49400d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor
49410d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        // Record this declaration.
49420d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        FoundAnything = true;
49430d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor        This->Decls.push_back(ND);
49440d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      }
49450d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor
49460d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor      return FoundAnything;
49470d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor    }
49480d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor  };
49490d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor}
49500d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor
495176bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCallDeclContext::lookup_result
4952c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
495376bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall                                          DeclarationName Name) {
49541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(DC->hasExternalVisibleStorage() &&
49552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor         "DeclContext has no visible decls in storage");
4956074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  if (!Name)
4957074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis    return DeclContext::lookup_result(DeclContext::lookup_iterator(0),
4958074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis                                      DeclContext::lookup_iterator(0));
49592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
49605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<NamedDecl *, 64> Decls;
4961c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor
4962c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor  // Compute the declaration contexts we need to look into. Multiple such
4963c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor  // declaration contexts occur when two declaration contexts from disjoint
4964c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor  // modules get merged, e.g., when two namespaces with the same name are
4965c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor  // independently defined in separate modules.
4966c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor  SmallVector<const DeclContext *, 2> Contexts;
4967c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor  Contexts.push_back(DC);
4968c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor
4969c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor  if (DC->isNamespace()) {
4970c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor    MergedDeclsMap::iterator Merged
4971c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor      = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
4972c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor    if (Merged != MergedDecls.end()) {
4973c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor      for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
4974c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor        Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
4975c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor    }
4976c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor  }
4977c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor
4978c6c8e0ec96bb64f1b9f543d7c8317c6090f80a30Douglas Gregor  DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
49790d95f77ba180aee35b74f3bf9f8543477f3af543Douglas Gregor  ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
49802512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor  ++NumVisibleDeclContextsRead;
4981074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis  SetExternalVisibleDeclsForName(DC, Name, Decls);
498276bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall  return const_cast<DeclContext*>(DC)->lookup(Name);
49832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
49842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
4985643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidisnamespace {
4986b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  /// \brief ModuleFile visitor used to retrieve all visible names in a
4987643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis  /// declaration context.
4988b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  class DeclContextAllNamesVisitor {
4989643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis    ASTReader &Reader;
4990b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky    llvm::SmallVectorImpl<const DeclContext *> &Contexts;
4991b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky    llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > &Decls;
4992643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis
4993643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis  public:
4994b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky    DeclContextAllNamesVisitor(ASTReader &Reader,
4995b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky                               SmallVectorImpl<const DeclContext *> &Contexts,
4996b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky                               llvm::DenseMap<DeclarationName,
4997b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky                                           SmallVector<NamedDecl *, 8> > &Decls)
4998b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      : Reader(Reader), Contexts(Contexts), Decls(Decls) { }
4999643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis
5000643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis    static bool visit(ModuleFile &M, void *UserData) {
5001b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      DeclContextAllNamesVisitor *This
5002b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky        = static_cast<DeclContextAllNamesVisitor *>(UserData);
5003643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis
5004643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis      // Check whether we have any visible declaration information for
5005643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis      // this context in this module.
5006b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      ModuleFile::DeclContextInfosMap::iterator Info;
5007b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      bool FoundInfo = false;
5008b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
5009b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky        Info = M.DeclContextInfos.find(This->Contexts[I]);
5010b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky        if (Info != M.DeclContextInfos.end() &&
5011b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky            Info->second.NameLookupTableData) {
5012b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky          FoundInfo = true;
5013b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky          break;
5014b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky        }
5015b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      }
5016b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky
5017b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      if (!FoundInfo)
5018643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis        return false;
5019b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky
5020643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis      ASTDeclContextNameLookupTable *LookupTable =
5021b1758c662524e18d65d260188fdcbbdee6a9316bBenjamin Kramer        Info->second.NameLookupTableData;
5022b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      bool FoundAnything = false;
5023b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      for (ASTDeclContextNameLookupTable::data_iterator
5024b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky	     I = LookupTable->data_begin(), E = LookupTable->data_end();
5025b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky	   I != E; ++I) {
5026b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky        ASTDeclContextNameLookupTrait::data_type Data = *I;
5027b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky        for (; Data.first != Data.second; ++Data.first) {
5028b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky          NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
5029b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky                                                                 *Data.first);
5030b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky          if (!ND)
5031b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky            continue;
5032b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky
5033b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky          // Record this declaration.
5034b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky          FoundAnything = true;
5035b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky          This->Decls[ND->getDeclName()].push_back(ND);
5036b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky        }
5037643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis      }
5038643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis
5039b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      return FoundAnything;
5040643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis    }
5041643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis  };
5042643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis}
5043643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis
5044b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewyckyvoid ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
5045643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis  if (!DC->hasExternalVisibleStorage())
5046643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis    return;
5047b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  llvm::DenseMap<DeclarationName, llvm::SmallVector<NamedDecl*, 8> > Decls;
5048b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky
5049b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  // Compute the declaration contexts we need to look into. Multiple such
5050b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  // declaration contexts occur when two declaration contexts from disjoint
5051b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  // modules get merged, e.g., when two namespaces with the same name are
5052b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  // independently defined in separate modules.
5053b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  SmallVector<const DeclContext *, 2> Contexts;
5054b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  Contexts.push_back(DC);
5055b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky
5056b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  if (DC->isNamespace()) {
5057b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky    MergedDeclsMap::iterator Merged
5058b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
5059b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky    if (Merged != MergedDecls.end()) {
5060b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky      for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
5061b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky        Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
5062b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky    }
5063b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  }
5064b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky
5065b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls);
5066b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
5067b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  ++NumVisibleDeclContextsRead;
5068b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky
5069b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  for (llvm::DenseMap<DeclarationName,
5070b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky                      llvm::SmallVector<NamedDecl*, 8> >::iterator
5071b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky         I = Decls.begin(), E = Decls.end(); I != E; ++I) {
5072b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky    SetExternalVisibleDeclsForName(DC, I->first, I->second);
5073b346d2f419ec7d7ce6b20780d518490338efa7deNick Lewycky  }
5074394e5392febc66a5511003fd24d540c51beffdd9Argyrios Kyrtzidis  const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
5075643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis}
5076643586fe4fcd42b0978efd3566832ab4dce50367Argyrios Kyrtzidis
5077144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis/// \brief Under non-PCH compilation the consumer receives the objc methods
5078144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis/// before receiving the implementation, and codegen depends on this.
5079144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis/// We simulate this by deserializing and passing to consumer the methods of the
5080144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis/// implementation before passing the deserialized implementation decl.
5081144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidisstatic void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
5082144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis                                       ASTConsumer *Consumer) {
5083144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis  assert(ImplD && Consumer);
5084144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis
5085144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis  for (ObjCImplDecl::method_iterator
5086144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis         I = ImplD->meth_begin(), E = ImplD->meth_end(); I != E; ++I)
5087581deb3da481053c4993c7600f97acf7768caac5David Blaikie    Consumer->HandleInterestingDecl(DeclGroupRef(*I));
5088144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis
5089144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis  Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
5090144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis}
5091144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis
5092c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlvoid ASTReader::PassInterestingDeclsToConsumer() {
5093bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  assert(Consumer);
5094bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  while (!InterestingDecls.empty()) {
5095144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis    Decl *D = InterestingDecls.front();
5096bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis    InterestingDecls.pop_front();
5097144b38a7995cbe0928e34fbcc865bb2d2be4f7a3Argyrios Kyrtzidis
50988d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidis    PassInterestingDeclToConsumer(D);
5099bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  }
5100bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis}
5101bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis
51028d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidisvoid ASTReader::PassInterestingDeclToConsumer(Decl *D) {
51038d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidis  if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
51048d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidis    PassObjCImplDeclToConsumer(ImplD, Consumer);
51058d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidis  else
51068d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidis    Consumer->HandleInterestingDecl(DeclGroupRef(D));
51078d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidis}
51088d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidis
5109c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlvoid ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
51100af2ca4b6ddc788658069a0994941268ce250fc7Douglas Gregor  this->Consumer = Consumer;
51110af2ca4b6ddc788658069a0994941268ce250fc7Douglas Gregor
5112fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor  if (!Consumer)
5113fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor    return;
5114fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor
5115fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor  for (unsigned I = 0, N = ExternalDefinitions.size(); I != N; ++I) {
5116bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis    // Force deserialization of this decl, which will cause it to be queued for
5117bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis    // passing to the consumer.
511804a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar    GetDecl(ExternalDefinitions[I]);
5119fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor  }
51201a995ddaa53a20dcd063ea47eb1f533ecb0d243aDouglas Gregor  ExternalDefinitions.clear();
5121c62a2fe1957626bc4b29402b2d0a3694dfaa3280Douglas Gregor
5122bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  PassInterestingDeclsToConsumer();
5123fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor}
5124fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregor
5125c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlvoid ASTReader::PrintStats() {
51263c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  std::fprintf(stderr, "*** AST File Statistics:\n");
51272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
51281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  unsigned NumTypesLoaded
51292b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor    = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
51300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                      QualType());
51312b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor  unsigned NumDeclsLoaded
51322b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor    = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
51332b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor                                      (Decl *)0);
51342b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor  unsigned NumIdentifiersLoaded
51352b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor    = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
51362b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor                                            IdentifiersLoaded.end(),
51372b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor                                            (IdentifierInfo *)0);
51381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  unsigned NumSelectorsLoaded
51392b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor    = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
51402b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor                                          SelectorsLoaded.end(),
51412b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor                                          Selector());
514283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
51434fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  std::fprintf(stderr, "  %u stat cache hits\n", NumStatHits);
51444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  std::fprintf(stderr, "  %u stat cache misses\n", NumStatMisses);
51450cdd798dbaadd959d3e97ea16993efbdccbbe642Douglas Gregor  if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
51467f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    std::fprintf(stderr, "  %u/%u source location entries read (%f%%)\n",
51477f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                 NumSLocEntriesRead, TotalNumSLocEntries,
51487f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
51498f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor  if (!TypesLoaded.empty())
515083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    std::fprintf(stderr, "  %u/%u types read (%f%%)\n",
51518f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor                 NumTypesLoaded, (unsigned)TypesLoaded.size(),
51528f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor                 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
51538f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor  if (!DeclsLoaded.empty())
515483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    std::fprintf(stderr, "  %u/%u declarations read (%f%%)\n",
51558f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor                 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
51568f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor                 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
51572b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor  if (!IdentifiersLoaded.empty())
515883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    std::fprintf(stderr, "  %u/%u identifiers read (%f%%)\n",
51592b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor                 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
51602b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor                 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
5161725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl  if (!SelectorsLoaded.empty())
516283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    std::fprintf(stderr, "  %u/%u selectors read (%f%%)\n",
5163725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl                 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
5164725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl                 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
516583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor  if (TotalNumStatements)
516683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    std::fprintf(stderr, "  %u/%u statements read (%f%%)\n",
516783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                 NumStatementsRead, TotalNumStatements,
516883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                 ((float)NumStatementsRead/TotalNumStatements * 100));
516983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor  if (TotalNumMacros)
517083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
517183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                 NumMacrosRead, TotalNumMacros,
517283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                 ((float)NumMacrosRead/TotalNumMacros * 100));
517383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor  if (TotalLexicalDeclContexts)
517483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    std::fprintf(stderr, "  %u/%u lexical declcontexts read (%f%%)\n",
517583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
517683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
517783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                  * 100));
517883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor  if (TotalVisibleDeclContexts)
517983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    std::fprintf(stderr, "  %u/%u visible declcontexts read (%f%%)\n",
518083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
518183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
518283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                  * 100));
5183fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl  if (TotalNumMethodPoolEntries) {
518483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    std::fprintf(stderr, "  %u/%u method pool entries read (%f%%)\n",
5185fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl                 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
5186fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl                 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
518783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor                  * 100));
5188fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl    std::fprintf(stderr, "  %u method pool misses\n", NumMethodPoolMisses);
518983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor  }
51902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::fprintf(stderr, "\n");
519123d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor  dump();
519223d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor  std::fprintf(stderr, "\n");
519323d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor}
519423d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor
51951a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregortemplate<typename Key, typename ModuleFile, unsigned InitialCapacity>
519623d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregorstatic void
51975f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerdumpModuleIDMap(StringRef Name,
51981a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor                const ContinuousRangeMap<Key, ModuleFile *,
519923d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor                                         InitialCapacity> &Map) {
520023d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor  if (Map.begin() == Map.end())
520123d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor    return;
520223d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor
52031a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
520423d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor  llvm::errs() << Name << ":\n";
520523d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor  for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
520623d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor       I != IEnd; ++I) {
520723d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor    llvm::errs() << "  " << I->first << " -> " << I->second->FileName
520823d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor      << "\n";
520923d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor  }
521023d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor}
521123d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor
521223d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregorvoid ASTReader::dump() {
52131a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor  llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
52148f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor  dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
521523d7df5ce30f4a068e13ad6cb81d473365d260dbDouglas Gregor  dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
52161e849b6f43a6aded51466978d826e938859130dbDouglas Gregor  dumpModuleIDMap("Global type map", GlobalTypeMap);
52179827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor  dumpModuleIDMap("Global declaration map", GlobalDeclMap);
52189827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor  dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
521926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
52209827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor  dumpModuleIDMap("Global selector map", GlobalSelectorMap);
52219827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor  dumpModuleIDMap("Global preprocessed entity map",
52229827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor                  GlobalPreprocessedEntityMap);
52238df5c9b5d65beec807e4e77dae2813dd193f77ddDouglas Gregor
52248df5c9b5d65beec807e4e77dae2813dd193f77ddDouglas Gregor  llvm::errs() << "\n*** PCH/Modules Loaded:";
52258df5c9b5d65beec807e4e77dae2813dd193f77ddDouglas Gregor  for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
52268df5c9b5d65beec807e4e77dae2813dd193f77ddDouglas Gregor                                       MEnd = ModuleMgr.end();
52278df5c9b5d65beec807e4e77dae2813dd193f77ddDouglas Gregor       M != MEnd; ++M)
52288df5c9b5d65beec807e4e77dae2813dd193f77ddDouglas Gregor    (*M)->dump();
52292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
52302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
5231e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek/// Return the amount of memory used by memory buffers, breaking down
5232e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek/// by heap-backed versus mmap'ed memory.
5233e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenekvoid ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
52345d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner  for (ModuleConstIterator I = ModuleMgr.begin(),
52355d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner      E = ModuleMgr.end(); I != E; ++I) {
52365d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner    if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
5237e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek      size_t bytes = buf->getBufferSize();
5238e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek      switch (buf->getBufferKind()) {
5239e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek        case llvm::MemoryBuffer::MemoryBuffer_Malloc:
5240e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek          sizes.malloc_bytes += bytes;
5241e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek          break;
5242e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek        case llvm::MemoryBuffer::MemoryBuffer_MMap:
5243e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek          sizes.mmap_bytes += bytes;
5244e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek          break;
5245e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek      }
5246e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek    }
52475d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner  }
5248e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek}
5249e9b5f3d4acfc2ad6e8b65a4072464e997dea9ed3Ted Kremenek
5250c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlvoid ASTReader::InitializeSema(Sema &S) {
5251668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  SemaObj = &S;
5252f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor  S.ExternalSource = this;
5253f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
52546cfc1a8b7582b8433b61222502effb018c534393Douglas Gregor  // Makes sure any declarations that were deserialized "too early"
52556cfc1a8b7582b8433b61222502effb018c534393Douglas Gregor  // still get added to the identifier's declaration chains.
525676dc8890b6c5223de80be8284adbfc63ceeb3a55Douglas Gregor  for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
5257eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    SemaObj->pushExternalDeclIntoScope(PreloadedDecls[I],
5258eee242ff426bf79149f221798966e58688383c1eDouglas Gregor                                       PreloadedDecls[I]->getDeclName());
52596cfc1a8b7582b8433b61222502effb018c534393Douglas Gregor  }
52606cfc1a8b7582b8433b61222502effb018c534393Douglas Gregor  PreloadedDecls.clear();
52614c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor
526276c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis  // Load the offsets of the declarations that Sema references.
526376c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis  // They will be lazily deserialized when needed.
526476c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis  if (!SemaDeclRefs.empty()) {
526576c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis    assert(SemaDeclRefs.size() == 2 && "More decl refs than expected!");
52661e5b6f60e2e09addd2f2e915c87d8bd74d40c369Douglas Gregor    if (!SemaObj->StdNamespace)
52671e5b6f60e2e09addd2f2e915c87d8bd74d40c369Douglas Gregor      SemaObj->StdNamespace = SemaDeclRefs[0];
52681e5b6f60e2e09addd2f2e915c87d8bd74d40c369Douglas Gregor    if (!SemaObj->StdBadAlloc)
52691e5b6f60e2e09addd2f2e915c87d8bd74d40c369Douglas Gregor      SemaObj->StdBadAlloc = SemaDeclRefs[1];
527076c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis  }
527176c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis
527284bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne  if (!FPPragmaOptions.empty()) {
527384bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne    assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
527484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne    SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
527584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne  }
527684bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne
527784bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne  if (!OpenCLExtensions.empty()) {
527884bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne    unsigned I = 0;
527984bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne#define OPENCLEXT(nm)  SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
528084bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne#include "clang/Basic/OpenCLExtensions.def"
528184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne
528284bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne    assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
528384bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne  }
5284668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor}
5285668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
5286211f6e894895f552e0a98421b2f6e931ca4a8c11Douglas GregorIdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
5287057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  IdentifierLookupVisitor Visitor(StringRef(NameStart, NameEnd - NameStart),
5288057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor                                  /*PriorGeneration=*/0);
5289211f6e894895f552e0a98421b2f6e931ca4a8c11Douglas Gregor  ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor);
5290eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  IdentifierInfo *II = Visitor.getIdentifierInfo();
5291057df20b3107cef764052d271c89b8591b98b3ceDouglas Gregor  markIdentifierUpToDate(II);
5292eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  return II;
5293668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor}
5294668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
529595f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregornamespace clang {
529695f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  /// \brief An identifier-lookup iterator that enumerates all of the
529795f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  /// identifiers stored within a set of AST files.
529895f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  class ASTIdentifierIterator : public IdentifierIterator {
529995f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    /// \brief The AST reader whose identifiers are being enumerated.
530095f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    const ASTReader &Reader;
530195f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
530295f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    /// \brief The current index into the chain of AST files stored in
530395f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    /// the AST reader.
530495f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    unsigned Index;
530595f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
530695f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    /// \brief The current position within the identifier lookup table
530795f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    /// of the current AST file.
530895f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    ASTIdentifierLookupTable::key_iterator Current;
530995f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
531095f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    /// \brief The end position within the identifier lookup table of
531195f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    /// the current AST file.
531295f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    ASTIdentifierLookupTable::key_iterator End;
531395f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
531495f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  public:
531595f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    explicit ASTIdentifierIterator(const ASTReader &Reader);
531695f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
53175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    virtual StringRef Next();
531895f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  };
531995f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor}
532095f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
532195f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas GregorASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
53225d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner  : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
532395f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  ASTIdentifierLookupTable *IdTable
53245d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner    = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
532595f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  Current = IdTable->key_begin();
532695f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  End = IdTable->key_end();
532795f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor}
532895f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
53295f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef ASTIdentifierIterator::Next() {
533095f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  while (Current == End) {
533195f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    // If we have exhausted all of our AST files, we're done.
533295f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    if (Index == 0)
53335f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      return StringRef();
533495f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
533595f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    --Index;
533695f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    ASTIdentifierLookupTable *IdTable
53375d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner      = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
53385d6d89fef8c7fff8b1a67c943fb5557a2a803468Jonathan D. Turner        IdentifierLookupTable;
533995f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    Current = IdTable->key_begin();
534095f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor    End = IdTable->key_end();
534195f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  }
534295f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
534395f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  // We have any identifiers remaining in the current AST file; return
534495f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  // the next one.
534595f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  std::pair<const char*, unsigned> Key = *Current;
534695f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  ++Current;
53475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  return StringRef(Key.first, Key.second);
534895f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor}
534995f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
535095f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas GregorIdentifierIterator *ASTReader::getIdentifiers() const {
535195f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor  return new ASTIdentifierIterator(*this);
535295f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor}
535395f4292cc526c629fead321c7fcfd4fe0f3bc66eDouglas Gregor
53543d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregornamespace clang { namespace serialization {
53553d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor  class ReadMethodPoolVisitor {
53563d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor    ASTReader &Reader;
53578efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor    Selector Sel;
53588efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor    unsigned PriorGeneration;
53593d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor    llvm::SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
53603d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor    llvm::SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
53613d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor
53623d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor  public:
53638efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor    ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
53648efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor                          unsigned PriorGeneration)
53658efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor      : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) { }
53663d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor
53671a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    static bool visit(ModuleFile &M, void *UserData) {
53683d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      ReadMethodPoolVisitor *This
53693d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor        = static_cast<ReadMethodPoolVisitor *>(UserData);
53703d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor
53713d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      if (!M.SelectorLookupTable)
53723d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor        return false;
53733d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor
53748efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor      // If we've already searched this module file, skip it now.
53758efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor      if (M.Generation <= This->PriorGeneration)
53768efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor        return true;
53778efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor
53783d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      ASTSelectorLookupTable *PoolTable
53793d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor        = (ASTSelectorLookupTable*)M.SelectorLookupTable;
53803d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
53813d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      if (Pos == PoolTable->end())
53823d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor        return false;
53833d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor
53843d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      ++This->Reader.NumSelectorsRead;
5385fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl      // FIXME: Not quite happy with the statistics here. We probably should
5386fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl      // disable this tracking when called via LoadSelector.
5387fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl      // Also, should entries without methods count as misses?
53883d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      ++This->Reader.NumMethodPoolEntriesRead;
53893c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      ASTSelectorLookupTrait::data_type Data = *Pos;
53903d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      if (This->Reader.DeserializationListener)
53913d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor        This->Reader.DeserializationListener->SelectorRead(Data.ID,
53923d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor                                                           This->Sel);
53933d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor
53943d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
53953d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
53963d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor      return true;
5397725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl    }
53983d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor
53993d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor    /// \brief Retrieve the instance methods found by this visitor.
54005ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor    ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
54015ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor      return InstanceMethods;
54023d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor    }
54033d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor
54043d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor    /// \brief Retrieve the instance methods found by this visitor.
54055ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor    ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
54065ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor      return FactoryMethods;
54073d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor    }
54083d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor  };
54093d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor} } // end namespace clang::serialization
5410f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
54115ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor/// \brief Add the given set of methods to the method list.
54125ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregorstatic void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
54135ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor                             ObjCMethodList &List) {
54145ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor  for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
54155ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor    S.addMethodToGlobalList(&List, Methods[I]);
54165ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor  }
54175ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor}
54185ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor
54195ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregorvoid ASTReader::ReadMethodPool(Selector Sel) {
54208efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor  // Get the selector generation and update it to the current generation.
54218efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor  unsigned &Generation = SelectorGeneration[Sel];
54228efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor  unsigned PriorGeneration = Generation;
54238efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor  Generation = CurrentGeneration;
54248efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor
54258efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor  // Search for methods defined with this selector.
54268efca6bb688d32fd7c0d91b504ef3307f97ee66aDouglas Gregor  ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
54273d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor  ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
54283d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor
54295ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor  if (Visitor.getInstanceMethods().empty() &&
54305ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor      Visitor.getFactoryMethods().empty()) {
54313d15ab8d0822637ff5e39594c4f34172241cad2eDouglas Gregor    ++NumMethodPoolMisses;
54325ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor    return;
54335ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor  }
54345ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor
54355ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor  if (!getSema())
54365ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor    return;
54375ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor
54385ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor  Sema &S = *getSema();
54395ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor  Sema::GlobalMethodPool::iterator Pos
54405ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor    = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
54415ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor
54425ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor  addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
54435ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregor  addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
5444f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor}
5445f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
5446d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregorvoid ASTReader::ReadKnownNamespaces(
54475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                          SmallVectorImpl<NamespaceDecl *> &Namespaces) {
5448d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor  Namespaces.clear();
5449d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor
5450d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor  for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
5451d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor    if (NamespaceDecl *Namespace
5452d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor                = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
5453d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor      Namespaces.push_back(Namespace);
5454d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor  }
5455d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor}
5456d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor
5457a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregorvoid ASTReader::ReadTentativeDefinitions(
5458a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor                  SmallVectorImpl<VarDecl *> &TentativeDefs) {
5459a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor  for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
5460a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor    VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
5461a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor    if (Var)
5462a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor      TentativeDefs.push_back(Var);
5463a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor  }
5464a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor  TentativeDefinitions.clear();
5465a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor}
5466a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor
5467a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregorvoid ASTReader::ReadUnusedFileScopedDecls(
5468a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor                               SmallVectorImpl<const DeclaratorDecl *> &Decls) {
5469a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor  for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
5470a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor    DeclaratorDecl *D
5471a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor      = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
5472a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor    if (D)
5473a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor      Decls.push_back(D);
5474a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor  }
5475a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor  UnusedFileScopedDecls.clear();
5476a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor}
5477a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor
54780129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregorvoid ASTReader::ReadDelegatingConstructors(
54790129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor                                 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
54800129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor  for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
54810129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor    CXXConstructorDecl *D
54820129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor      = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
54830129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor    if (D)
54840129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor      Decls.push_back(D);
54850129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor  }
54860129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor  DelegatingCtorDecls.clear();
54870129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor}
54880129b561a1452bf057f6b18b6a1de815d487ab81Douglas Gregor
5489d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregorvoid ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
5490d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor  for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
5491d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor    TypedefNameDecl *D
5492d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor      = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
5493d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor    if (D)
5494d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor      Decls.push_back(D);
5495d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor  }
5496d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor  ExtVectorDecls.clear();
5497d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor}
5498d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor
5499a126f17ca83b985300c1f65cee647bea108db657Douglas Gregorvoid ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
5500a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor  for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
5501a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor    CXXRecordDecl *D
5502a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor      = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
5503a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor    if (D)
5504a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor      Decls.push_back(D);
5505a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor  }
5506a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor  DynamicClasses.clear();
5507a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor}
5508a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor
5509ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregorvoid
5510ec12ce2f6da44bfc9048772327a3924498099d60Douglas GregorASTReader::ReadLocallyScopedExternalDecls(SmallVectorImpl<NamedDecl *> &Decls) {
5511ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregor  for (unsigned I = 0, N = LocallyScopedExternalDecls.size(); I != N; ++I) {
5512ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregor    NamedDecl *D
5513ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregor      = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternalDecls[I]));
5514ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregor    if (D)
5515ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregor      Decls.push_back(D);
5516ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregor  }
5517ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregor  LocallyScopedExternalDecls.clear();
5518ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregor}
5519ec12ce2f6da44bfc9048772327a3924498099d60Douglas Gregor
55205b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregorvoid ASTReader::ReadReferencedSelectors(
55215b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor       SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
55225b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor  if (ReferencedSelectorsData.empty())
55235b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor    return;
55245b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor
55255b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor  // If there are @selector references added them to its pool. This is for
55265b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor  // implementation of -Wselector.
55275b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor  unsigned int DataSize = ReferencedSelectorsData.size()-1;
55285b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor  unsigned I = 0;
55295b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor  while (I < DataSize) {
55305b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor    Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
55315b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor    SourceLocation SelLoc
55325b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor      = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
55335b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor    Sels.push_back(std::make_pair(Sel, SelLoc));
55345b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor  }
55355b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor  ReferencedSelectorsData.clear();
55365b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor}
55375b9dc7caaef0469babc45dd8e713727a136ce517Douglas Gregor
553831e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregorvoid ASTReader::ReadWeakUndeclaredIdentifiers(
553931e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor       SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
554031e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  if (WeakUndeclaredIdentifiers.empty())
554131e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    return;
554231e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
554331e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
554431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    IdentifierInfo *WeakId
554531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
554631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    IdentifierInfo *AliasId
554731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
554831e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    SourceLocation Loc
554931e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
555031e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    bool Used = WeakUndeclaredIdentifiers[I++];
555131e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    WeakInfo WI(AliasId, Loc);
555231e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    WI.setUsed(Used);
555331e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    WeakIDs.push_back(std::make_pair(WeakId, WI));
555431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  }
555531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  WeakUndeclaredIdentifiers.clear();
555631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor}
555731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
5558dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregorvoid ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
5559dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor  for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
5560dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor    ExternalVTableUse VT;
5561dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor    VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
5562dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor    VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
5563dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor    VT.DefinitionRequired = VTableUses[Idx++];
5564dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor    VTables.push_back(VT);
5565dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor  }
5566dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor
5567dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor  VTableUses.clear();
5568dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor}
5569dfe6543e12eca5c79421378b7fa6b3e8fc403e63Douglas Gregor
55706e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregorvoid ASTReader::ReadPendingInstantiations(
55716e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor       SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
55726e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor  for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
55736e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor    ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
55746e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor    SourceLocation Loc
55756e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor      = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
55766e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor    Pending.push_back(std::make_pair(D, Loc));
55776e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor  }
55786e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor  PendingInstantiations.clear();
55796e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor}
55806e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor
5581c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlvoid ASTReader::LoadSelector(Selector Sel) {
5582e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl  // It would be complicated to avoid reading the methods anyway. So don't.
5583e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl  ReadMethodPool(Sel);
5584e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl}
5585e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
558695eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregorvoid ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
5587668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  assert(ID && "Non-zero identifier ID required");
5588a02b147b66ff9f1a22bac4ec7fd1b0d54a40e5bfDouglas Gregor  assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
55892b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor  IdentifiersLoaded[ID - 1] = II;
5590f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl  if (DeserializationListener)
5591f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl    DeserializationListener->IdentifierRead(ID, II);
5592668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor}
5593668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
5594d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// \brief Set the globally-visible declarations associated with the given
5595d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// identifier.
5596d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor///
55973c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl/// If the AST reader is currently in a state where the given declaration IDs
55981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// cannot safely be resolved, they are queued until it is safe to resolve
5599d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// them.
5600d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor///
5601d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// \param II an IdentifierInfo that refers to one or more globally-visible
5602d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// declarations.
5603d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor///
5604d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// \param DeclIDs the set of declaration IDs with the name @p II that are
5605d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// visible at global scope.
5606d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor///
5607d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// \param Nonrecursive should be true to indicate that the caller knows that
5608d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// this call is non-recursive, and therefore the globally-visible declarations
5609d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor/// will not be placed onto the pending queue.
56101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
5611c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
56125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                              const SmallVectorImpl<uint32_t> &DeclIDs,
5613d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor                                   bool Nonrecursive) {
561429ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis  if (NumCurrentElementsDeserializing && !Nonrecursive) {
5615d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor    PendingIdentifierInfos.push_back(PendingIdentifierInfo());
5616d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor    PendingIdentifierInfo &PII = PendingIdentifierInfos.back();
5617d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor    PII.II = II;
56184ea884b429445aa6f1af5bc6e51d0b65a4043e24Benjamin Kramer    PII.DeclIDs.append(DeclIDs.begin(), DeclIDs.end());
5619d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor    return;
5620d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor  }
56211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5622d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor  for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
5623d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor    NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
5624d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor    if (SemaObj) {
5625eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      // Introduce this declaration into the translation-unit scope
5626eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      // and add it to the declaration chain for this identifier, so
5627eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      // that (unqualified) name lookup will find it.
5628eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      SemaObj->pushExternalDeclIntoScope(D, II);
5629d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor    } else {
5630d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor      // Queue this declaration so that it will be added to the
5631d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor      // translation unit scope and identifier's declaration chain
5632d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor      // once a Sema object is known.
5633d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor      PreloadedDecls.push_back(D);
5634d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor    }
5635d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor  }
5636d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor}
5637d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor
563895eab176f51beed44a9bc14c0dcdd37844b23740Douglas GregorIdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
5639afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor  if (ID == 0)
5640afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor    return 0;
56411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
564211f5ccf2d88c2ea600ed950831f100ed96d89fedSebastian Redl  if (IdentifiersLoaded.empty()) {
56433c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("no identifier table in AST file");
5644afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor    return 0;
5645afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor  }
56461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
564711f5ccf2d88c2ea600ed950831f100ed96d89fedSebastian Redl  ID -= 1;
564811f5ccf2d88c2ea600ed950831f100ed96d89fedSebastian Redl  if (!IdentifiersLoaded[ID]) {
564967268d02388d3d25107fa9cf4998c35246255a65Douglas Gregor    GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
565067268d02388d3d25107fa9cf4998c35246255a65Douglas Gregor    assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
56511a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    ModuleFile *M = I->second;
56529827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor    unsigned Index = ID - M->BaseIdentifierID;
56539827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor    const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
5654d6595a40fe12e3d5ffe5ce48987b379d547439a4Douglas Gregor
56553c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // All of the strings in the AST file are preceded by a 16-bit length.
56563c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // Extract that 16-bit length to avoid having to execute strlen().
5657231bc0b7a7f53ce0d1af85602232486bc92c5a34Ted Kremenek    // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
5658231bc0b7a7f53ce0d1af85602232486bc92c5a34Ted Kremenek    //  unsigned integers.  This is important to avoid integer overflow when
5659231bc0b7a7f53ce0d1af85602232486bc92c5a34Ted Kremenek    //  we cast them to 'unsigned'.
5660ff1ea462bf6f079a786c600d5fc3716235ad9f22Ted Kremenek    const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
566102fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor    unsigned StrLen = (((unsigned) StrLenPtr[0])
566202fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor                       | (((unsigned) StrLenPtr[1]) << 8)) - 1;
566311f5ccf2d88c2ea600ed950831f100ed96d89fedSebastian Redl    IdentifiersLoaded[ID]
5664712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor      = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
5665f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl    if (DeserializationListener)
5666f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl      DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
5667afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor  }
56681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
566911f5ccf2d88c2ea600ed950831f100ed96d89fedSebastian Redl  return IdentifiersLoaded[ID];
56702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
56712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
56721a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorIdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
567395eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor  return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
567495eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor}
567595eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor
56761a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorIdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
56776ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor  if (LocalID < NUM_PREDEF_IDENT_IDS)
56786ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor    return LocalID;
56796ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor
56806ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor  ContinuousRangeMap<uint32_t, int, 2>::iterator I
56816ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor    = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
56826ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor  assert(I != M.IdentifierRemap.end()
56836ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor         && "Invalid index into identifier index remap");
56846ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor
56856ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor  return LocalID + I->second;
568695eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor}
568795eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor
5688f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregorbool ASTReader::ReadSLocEntry(int ID) {
5689e23ac65af568ffe611b0990818ac3a57c856a4d8Douglas Gregor  return ReadSLocEntryRecord(ID) != Success;
56907f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor}
56917f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
569226ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregorserialization::SubmoduleID
569326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas GregorASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
569426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
569526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor    return LocalID;
569626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
569726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  ContinuousRangeMap<uint32_t, int, 2>::iterator I
569826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor    = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
569926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  assert(I != M.SubmoduleRemap.end()
570026ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor         && "Invalid index into identifier index remap");
570126ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
570226ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  return LocalID + I->second;
570326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor}
570426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
570526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas GregorModule *ASTReader::getSubmodule(SubmoduleID GlobalID) {
570626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
570726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor    assert(GlobalID == 0 && "Unhandled global submodule ID");
570826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor    return 0;
570926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  }
571026ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
571126ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  if (GlobalID > SubmodulesLoaded.size()) {
571226ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor    Error("submodule ID out of range in AST file");
571326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor    return 0;
571426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  }
571526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
571626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor  return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
571726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor}
571826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
57191a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorSelector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
57202d2689ab787c6d54cb985c28ff3f16370bc01b0fDouglas Gregor  return DecodeSelector(getGlobalSelectorID(M, LocalID));
57212d2689ab787c6d54cb985c28ff3f16370bc01b0fDouglas Gregor}
57222d2689ab787c6d54cb985c28ff3f16370bc01b0fDouglas Gregor
57232d2689ab787c6d54cb985c28ff3f16370bc01b0fDouglas GregorSelector ASTReader::DecodeSelector(serialization::SelectorID ID) {
572490cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff  if (ID == 0)
572590cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff    return Selector();
57261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5727725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl  if (ID > SelectorsLoaded.size()) {
57283c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    Error("selector ID out of range in AST file");
572990cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff    return Selector();
573090cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff  }
573183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
5732725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl  if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 0) {
573383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    // Load this selector from the selector table.
573496958cbe6fb423ab2446629ead5f1b138398433cDouglas Gregor    GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
573596958cbe6fb423ab2446629ead5f1b138398433cDouglas Gregor    assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
57361a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    ModuleFile &M = *I->second;
57379827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor    ASTSelectorLookupTrait Trait(*this, M);
5738b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor    unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
573996958cbe6fb423ab2446629ead5f1b138398433cDouglas Gregor    SelectorsLoaded[ID - 1] =
57409827a8049a793f23c62ade8f24f0c66c2dbf6741Douglas Gregor      Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
574196958cbe6fb423ab2446629ead5f1b138398433cDouglas Gregor    if (DeserializationListener)
574296958cbe6fb423ab2446629ead5f1b138398433cDouglas Gregor      DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
574383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor  }
574483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
5745725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl  return SelectorsLoaded[ID - 1];
574690cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff}
574790cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff
57488451ec7e709baf777bec07dc70653e0c523dd120Douglas GregorSelector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
5749719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor  return DecodeSelector(ID);
5750719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor}
5751719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor
5752c43b54cbc10654ed59de797898042e1a05265246Sebastian Redluint32_t ASTReader::GetNumExternalSelectors() {
5753725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl  // ID 0 (the null selector) is considered an external selector.
5754725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl  return getTotalNumSelectors() + 1;
5755719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor}
5756719770dcfcb3987e8a2377dcca97955301445eb5Douglas Gregor
5757b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregorserialization::SelectorID
57581a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
5759b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor  if (LocalID < NUM_PREDEF_SELECTOR_IDS)
5760b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor    return LocalID;
5761b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor
5762b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor  ContinuousRangeMap<uint32_t, int, 2>::iterator I
5763b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor    = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
5764b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor  assert(I != M.SelectorRemap.end()
5765b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor         && "Invalid index into identifier index remap");
5766b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor
5767b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor  return LocalID + I->second;
57688451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor}
57698451ec7e709baf777bec07dc70653e0c523dd120Douglas Gregor
57701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
57711a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadDeclarationName(ModuleFile &F,
5772393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor                               const RecordData &Record, unsigned &Idx) {
57732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
57742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  switch (Kind) {
57752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  case DeclarationName::Identifier:
577695eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor    return DeclarationName(GetIdentifierInfo(F, Record, Idx));
57772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
57782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
57792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
57802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
57812d2689ab787c6d54cb985c28ff3f16370bc01b0fDouglas Gregor    return DeclarationName(ReadSelector(F, Record, Idx));
57822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
57832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  case DeclarationName::CXXConstructorName:
5784359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.DeclarationNames.getCXXConstructorName(
5785359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor                          Context.getCanonicalType(readType(F, Record, Idx)));
57862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
57872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  case DeclarationName::CXXDestructorName:
5788359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.DeclarationNames.getCXXDestructorName(
5789359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor                          Context.getCanonicalType(readType(F, Record, Idx)));
57902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
57912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
5792359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.DeclarationNames.getCXXConversionFunctionName(
5793359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor                          Context.getCanonicalType(readType(F, Record, Idx)));
57942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
57952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  case DeclarationName::CXXOperatorName:
5796359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.DeclarationNames.getCXXOperatorName(
57972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                       (OverloadedOperatorKind)Record[Idx++]);
57982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
57993e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
5800359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.DeclarationNames.getCXXLiteralOperatorName(
580195eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor                                       GetIdentifierInfo(F, Record, Idx));
58023e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
58032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  case DeclarationName::CXXUsingDirective:
58042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    return DeclarationName::getUsingDirectiveName();
58052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
58062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
58077530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid NameKind!");
58082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
58090a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
58101a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorvoid ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
58114045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                       DeclarationNameLoc &DNLoc,
58124045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                       DeclarationName Name,
58134045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                      const RecordData &Record, unsigned &Idx) {
58144045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  switch (Name.getNameKind()) {
58154045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::CXXConstructorName:
58164045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::CXXDestructorName:
58174045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::CXXConversionFunctionName:
58184045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
58194045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    break;
58204045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis
58214045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::CXXOperatorName:
58224045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DNLoc.CXXOperatorName.BeginOpNameLoc
58234045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
58244045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DNLoc.CXXOperatorName.EndOpNameLoc
58254045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
58264045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    break;
58274045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis
58284045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::CXXLiteralOperatorName:
58294045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DNLoc.CXXLiteralOperatorName.OpNameLoc
58304045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
58314045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    break;
58324045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis
58334045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::Identifier:
58344045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::ObjCZeroArgSelector:
58354045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::ObjCOneArgSelector:
58364045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::ObjCMultiArgSelector:
58374045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  case DeclarationName::CXXUsingDirective:
58384045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    break;
58394045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  }
58404045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis}
58414045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis
58421a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorvoid ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
58434045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                        DeclarationNameInfo &NameInfo,
58444045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                      const RecordData &Record, unsigned &Idx) {
5845393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  NameInfo.setName(ReadDeclarationName(F, Record, Idx));
58464045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
58474045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  DeclarationNameLoc DNLoc;
58484045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
58494045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  NameInfo.setInfo(DNLoc);
58504045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis}
58514045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis
58521a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorvoid ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
58534045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                  const RecordData &Record, unsigned &Idx) {
5854c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
58554045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  unsigned NumTPLists = Record[Idx++];
58564045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  Info.NumTemplParamLists = NumTPLists;
58574045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  if (NumTPLists) {
5858359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
58594045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    for (unsigned i=0; i != NumTPLists; ++i)
58604045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
58614045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  }
58624045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis}
58634045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis
58648731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisTemplateName
58651a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
58661aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                            unsigned &Idx) {
586720249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer  TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
58688731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  switch (Kind) {
58698731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case TemplateName::Template:
5870409448c832d27703146b70a1137d86b020f29863Douglas Gregor      return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
58718731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
58728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case TemplateName::OverloadedTemplate: {
58738731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    unsigned size = Record[Idx++];
58748731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    UnresolvedSet<8> Decls;
58758731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    while (size--)
5876409448c832d27703146b70a1137d86b020f29863Douglas Gregor      Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
58778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
5878359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
58798731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
588020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
58818731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case TemplateName::QualifiedTemplate: {
5882409448c832d27703146b70a1137d86b020f29863Douglas Gregor    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
58838731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    bool hasTemplKeyword = Record[Idx++];
5884409448c832d27703146b70a1137d86b020f29863Douglas Gregor    TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
5885359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
58868731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
588720249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
58888731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case TemplateName::DependentTemplate: {
5889409448c832d27703146b70a1137d86b020f29863Douglas Gregor    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
58908731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    if (Record[Idx++])  // isIdentifier
5891359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      return Context.getDependentTemplateName(NNS,
589295eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor                                               GetIdentifierInfo(F, Record,
589395eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor                                                                 Idx));
5894359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getDependentTemplateName(NNS,
589517cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis                                         (OverloadedOperatorKind)Record[Idx++]);
58968731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
5897146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
5898146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  case TemplateName::SubstTemplateTemplateParm: {
5899146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateTemplateParmDecl *param
5900409448c832d27703146b70a1137d86b020f29863Douglas Gregor      = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
5901146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    if (!param) return TemplateName();
5902146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    TemplateName replacement = ReadTemplateName(F, Record, Idx);
5903359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getSubstTemplateTemplateParm(param, replacement);
5904146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
59051aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
59061aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  case TemplateName::SubstTemplateTemplateParmPack: {
59071aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    TemplateTemplateParmDecl *Param
5908409448c832d27703146b70a1137d86b020f29863Douglas Gregor      = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
59091aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    if (!Param)
59101aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      return TemplateName();
59111aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
59121aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
59131aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    if (ArgPack.getKind() != TemplateArgument::Pack)
59141aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      return TemplateName();
59151aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
5916359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
59171aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
59188731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
591920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
5920b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unhandled template name kind!");
59218731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis}
59228731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
59238731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisTemplateArgument
59241a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadTemplateArgument(ModuleFile &F,
5925577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl                                const RecordData &Record, unsigned &Idx) {
5926a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
5927a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  switch (Kind) {
59288731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case TemplateArgument::Null:
59298731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    return TemplateArgument();
59308731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case TemplateArgument::Type:
5931393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    return TemplateArgument(readType(F, Record, Idx));
59328731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case TemplateArgument::Declaration:
5933409448c832d27703146b70a1137d86b020f29863Douglas Gregor    return TemplateArgument(ReadDecl(F, Record, Idx));
5934dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis  case TemplateArgument::Integral: {
5935dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    llvm::APSInt Value = ReadAPSInt(Record, Idx);
5936393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType T = readType(F, Record, Idx);
5937855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    return TemplateArgument(Context, Value, T);
5938dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis  }
5939a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::Template:
59401aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    return TemplateArgument(ReadTemplateName(F, Record, Idx));
5941a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion: {
59421aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    TemplateName Name = ReadTemplateName(F, Record, Idx);
59432be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    llvm::Optional<unsigned> NumTemplateExpansions;
59442be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    if (unsigned NumExpansions = Record[Idx++])
59452be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor      NumTemplateExpansions = NumExpansions - 1;
59462be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    return TemplateArgument(Name, NumTemplateExpansions);
5947ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  }
59488731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case TemplateArgument::Expression:
5949c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    return TemplateArgument(ReadExpr(F));
59508731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case TemplateArgument::Pack: {
59518731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    unsigned NumArgs = Record[Idx++];
5952359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
5953910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    for (unsigned I = 0; I != NumArgs; ++I)
5954910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor      Args[I] = ReadTemplateArgument(F, Record, Idx);
5955910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    return TemplateArgument(Args, NumArgs);
59568731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
59578731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
595820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
5959b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unhandled template argument kind!");
59608731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis}
59618731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
5962dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios KyrtzidisTemplateParameterList *
59631a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadTemplateParameterList(ModuleFile &F,
5964c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                     const RecordData &Record, unsigned &Idx) {
5965c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
5966c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
5967c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
5968dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
5969dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  unsigned NumParams = Record[Idx++];
59705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<NamedDecl *, 16> Params;
5971dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  Params.reserve(NumParams);
5972dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  while (NumParams--)
5973409448c832d27703146b70a1137d86b020f29863Douglas Gregor    Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
597420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
597520249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer  TemplateParameterList* TemplateParams =
5976359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
5977dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis                                  Params.data(), Params.size(), RAngleLoc);
5978dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  return TemplateParams;
5979dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis}
5980dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
5981dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidisvoid
5982c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::
59835f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerReadTemplateArgumentList(SmallVector<TemplateArgument, 8> &TemplArgs,
59841a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor                         ModuleFile &F, const RecordData &Record,
5985c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                         unsigned &Idx) {
5986dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
5987dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  TemplArgs.reserve(NumTemplateArgs);
5988dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  while (NumTemplateArgs--)
5989c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
5990dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis}
5991dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
599237ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis/// \brief Read a UnresolvedSet structure.
59931a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorvoid ASTReader::ReadUnresolvedSet(ModuleFile &F, UnresolvedSetImpl &Set,
599437ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis                                  const RecordData &Record, unsigned &Idx) {
599537ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis  unsigned NumDecls = Record[Idx++];
599637ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis  while (NumDecls--) {
5997409448c832d27703146b70a1137d86b020f29863Douglas Gregor    NamedDecl *D = ReadDeclAs<NamedDecl>(F, Record, Idx);
599837ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
599937ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis    Set.addDecl(D, AS);
600037ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis  }
600137ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis}
600237ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis
60030745d0a648b75bd304045309276c70a755adaafbArgyrios KyrtzidisCXXBaseSpecifier
60041a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
60055606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky                                const RecordData &Record, unsigned &Idx) {
60060745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  bool isVirtual = static_cast<bool>(Record[Idx++]);
60070745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
60080745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
6009f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl  bool inheritConstructors = static_cast<bool>(Record[Idx++]);
6010c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
6011c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceRange Range = ReadSourceRange(F, Record, Idx);
6012f90b27ad077c3339b62befc892382845339f9490Douglas Gregor  SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
6013f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl  CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
6014f90b27ad077c3339b62befc892382845339f9490Douglas Gregor                          EllipsisLoc);
6015f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl  Result.setInheritConstructors(inheritConstructors);
6016f677ea3cc9598d9952ad7ffab5fb322ba4c5be31Sebastian Redl  return Result;
60170745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis}
60180745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis
6019cbb67480094b3bcb5b715acd827cbad55e2a204cSean Huntstd::pair<CXXCtorInitializer **, unsigned>
60201a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
6021cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                   unsigned &Idx) {
6022cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt  CXXCtorInitializer **CtorInitializers = 0;
60238e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis  unsigned NumInitializers = Record[Idx++];
60248e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis  if (NumInitializers) {
6025cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt    CtorInitializers
6026359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor        = new (Context) CXXCtorInitializer*[NumInitializers];
60278e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis    for (unsigned i=0; i != NumInitializers; ++i) {
602876852c218a207ef43583515cb835b6e855353a0fDouglas Gregor      TypeSourceInfo *TInfo = 0;
60298e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      bool IsBaseVirtual = false;
60308e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      FieldDecl *Member = 0;
603100eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet      IndirectFieldDecl *IndirectMember = 0;
603220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
6033156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt      CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
6034156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt      switch (Type) {
603576852c218a207ef43583515cb835b6e855353a0fDouglas Gregor      case CTOR_INITIALIZER_BASE:
603676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor        TInfo = GetTypeSourceInfo(F, Record, Idx);
60378e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis        IsBaseVirtual = Record[Idx++];
6038156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt        break;
603976852c218a207ef43583515cb835b6e855353a0fDouglas Gregor
604076852c218a207ef43583515cb835b6e855353a0fDouglas Gregor      case CTOR_INITIALIZER_DELEGATING:
604176852c218a207ef43583515cb835b6e855353a0fDouglas Gregor        TInfo = GetTypeSourceInfo(F, Record, Idx);
6042156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt        break;
6043156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt
6044156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt       case CTOR_INITIALIZER_MEMBER:
6045409448c832d27703146b70a1137d86b020f29863Douglas Gregor        Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
6046156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt        break;
6047156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt
6048156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt       case CTOR_INITIALIZER_INDIRECT_MEMBER:
6049409448c832d27703146b70a1137d86b020f29863Douglas Gregor        IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
6050156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt        break;
60518e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      }
6052156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt
60533fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor      SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
6054c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Expr *Init = ReadExpr(F);
6055c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
6056c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
60578e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      bool IsWritten = Record[Idx++];
60588e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      unsigned SourceOrderOrNumArrayIndices;
60595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      SmallVector<VarDecl *, 8> Indices;
60608e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      if (IsWritten) {
60618e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis        SourceOrderOrNumArrayIndices = Record[Idx++];
60628e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      } else {
60638e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis        SourceOrderOrNumArrayIndices = Record[Idx++];
60648e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis        Indices.reserve(SourceOrderOrNumArrayIndices);
60658e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis        for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
6066409448c832d27703146b70a1137d86b020f29863Douglas Gregor          Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
60678e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      }
606820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
6069cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt      CXXCtorInitializer *BOMInit;
6070156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt      if (Type == CTOR_INITIALIZER_BASE) {
607176852c218a207ef43583515cb835b6e855353a0fDouglas Gregor        BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
6072cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                             LParenLoc, Init, RParenLoc,
6073cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                             MemberOrEllipsisLoc);
6074156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt      } else if (Type == CTOR_INITIALIZER_DELEGATING) {
607576852c218a207ef43583515cb835b6e855353a0fDouglas Gregor        BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
607676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor                                                   Init, RParenLoc);
60778e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      } else if (IsWritten) {
607800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet        if (Member)
6079359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor          BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
6080cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                               LParenLoc, Init, RParenLoc);
608100eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet        else
6082359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor          BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
6083cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                               MemberOrEllipsisLoc, LParenLoc,
6084cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                               Init, RParenLoc);
60858e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      } else {
6086359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor        BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
6087cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                             LParenLoc, Init, RParenLoc,
6088cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt                                             Indices.data(), Indices.size());
60898e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis      }
60908e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis
6091f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis      if (IsWritten)
6092f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis        BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
6093cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt      CtorInitializers[i] = BOMInit;
60948e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis    }
60958e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis  }
60968e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis
6097cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt  return std::make_pair(CtorInitializers, NumInitializers);
60988e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis}
60998e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis
61006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerNestedNameSpecifier *
61011a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadNestedNameSpecifier(ModuleFile &F,
6102409448c832d27703146b70a1137d86b020f29863Douglas Gregor                                   const RecordData &Record, unsigned &Idx) {
61036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  unsigned N = Record[Idx++];
61046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  NestedNameSpecifier *NNS = 0, *Prev = 0;
61056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  for (unsigned I = 0; I != N; ++I) {
61066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    NestedNameSpecifier::SpecifierKind Kind
61076ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
61086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    switch (Kind) {
61096ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    case NestedNameSpecifier::Identifier: {
611095eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor      IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
6111359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      NNS = NestedNameSpecifier::Create(Context, Prev, II);
61126ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner      break;
61136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    }
61146ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
61156ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    case NestedNameSpecifier::Namespace: {
6116409448c832d27703146b70a1137d86b020f29863Douglas Gregor      NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
6117359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      NNS = NestedNameSpecifier::Create(Context, Prev, NS);
61186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner      break;
61196ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    }
61206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
612114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    case NestedNameSpecifier::NamespaceAlias: {
6122409448c832d27703146b70a1137d86b020f29863Douglas Gregor      NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
6123359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
612414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor      break;
612514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    }
612614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
61276ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    case NestedNameSpecifier::TypeSpec:
61286ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    case NestedNameSpecifier::TypeSpecWithTemplate: {
6129393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor      const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
61301ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor      if (!T)
61311ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor        return 0;
61321ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor
61336ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner      bool Template = Record[Idx++];
6134359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
61356ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner      break;
61366ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    }
61376ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
61386ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    case NestedNameSpecifier::Global: {
6139359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      NNS = NestedNameSpecifier::GlobalSpecifier(Context);
61406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner      // No associated value, and there can't be a prefix.
61416ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner      break;
61426ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    }
61436ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    }
6144d2bb2c0942d7db565b0f29a8d1640bb97d781caeArgyrios Kyrtzidis    Prev = NNS;
61456ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  }
61466ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  return NNS;
61476ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
61486ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
6149dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas GregorNestedNameSpecifierLoc
61501a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
6151dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor                                      unsigned &Idx) {
6152dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  unsigned N = Record[Idx++];
61535f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  NestedNameSpecifierLocBuilder Builder;
6154dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  for (unsigned I = 0; I != N; ++I) {
6155dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    NestedNameSpecifier::SpecifierKind Kind
6156dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
6157dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    switch (Kind) {
6158dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    case NestedNameSpecifier::Identifier: {
615995eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor      IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
6160dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      SourceRange Range = ReadSourceRange(F, Record, Idx);
6161359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
6162dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      break;
6163dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    }
6164dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
6165dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    case NestedNameSpecifier::Namespace: {
6166409448c832d27703146b70a1137d86b020f29863Douglas Gregor      NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
6167dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      SourceRange Range = ReadSourceRange(F, Record, Idx);
6168359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
6169dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      break;
6170dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    }
6171dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
6172dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    case NestedNameSpecifier::NamespaceAlias: {
6173409448c832d27703146b70a1137d86b020f29863Douglas Gregor      NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
6174dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      SourceRange Range = ReadSourceRange(F, Record, Idx);
6175359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
6176dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      break;
6177dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    }
6178dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
6179dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    case NestedNameSpecifier::TypeSpec:
6180dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    case NestedNameSpecifier::TypeSpecWithTemplate: {
6181dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      bool Template = Record[Idx++];
6182dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
6183dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      if (!T)
6184dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor        return NestedNameSpecifierLoc();
6185dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
61865f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
61875f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      // FIXME: 'template' keyword location not saved anywhere, so we fake it.
6188359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      Builder.Extend(Context,
61895f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                     Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
61905f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                     T->getTypeLoc(), ColonColonLoc);
6191dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      break;
6192dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    }
6193dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
6194dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    case NestedNameSpecifier::Global: {
6195dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
6196359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      Builder.MakeGlobal(Context, ColonColonLoc);
6197dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor      break;
6198dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    }
6199dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    }
6200dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  }
6201dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
6202359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  return Builder.getWithLocInContext(Context);
6203dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor}
6204dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
62056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris LattnerSourceRange
62061a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
6207c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                           unsigned &Idx) {
6208c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation beg = ReadSourceLocation(F, Record, Idx);
6209c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation end = ReadSourceLocation(F, Record, Idx);
62108ee59398df0e6df2e32109d078235a33b005840cDaniel Dunbar  return SourceRange(beg, end);
62116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
62126ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
62130a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor/// \brief Read an integral value
6214c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlllvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
62150a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor  unsigned BitWidth = Record[Idx++];
62160a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor  unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
62170a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor  llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
62180a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor  Idx += NumWords;
62190a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor  return Result;
62200a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor}
62210a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor
62220a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor/// \brief Read a signed integral value
6223c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlllvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
62240a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor  bool isUnsigned = Record[Idx++];
62250a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor  return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
62260a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor}
62270a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor
622817fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor/// \brief Read a floating-point value
6229c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlllvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, unsigned &Idx) {
623017fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  return llvm::APFloat(ReadAPInt(Record, Idx));
623117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor}
623217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
623368a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor// \brief Read a string
6234c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlstd::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
623568a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  unsigned Len = Record[Idx++];
6236beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad  std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
623768a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  Idx += Len;
623868a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  return Result;
623968a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor}
624068a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
62410a0d2b179085a52c10402feebeb6db8b4d96a140Douglas GregorVersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
62420a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor                                         unsigned &Idx) {
62430a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor  unsigned Major = Record[Idx++];
62440a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor  unsigned Minor = Record[Idx++];
62450a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor  unsigned Subminor = Record[Idx++];
62460a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor  if (Minor == 0)
62470a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    return VersionTuple(Major);
62480a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor  if (Subminor == 0)
62490a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor    return VersionTuple(Major, Minor - 1);
62500a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor  return VersionTuple(Major, Minor - 1, Subminor - 1);
62510a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor}
62520a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor
62531a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorCXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
6254409448c832d27703146b70a1137d86b020f29863Douglas Gregor                                          const RecordData &Record,
6255d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner                                          unsigned &Idx) {
6256409448c832d27703146b70a1137d86b020f29863Douglas Gregor  CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
6257359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  return CXXTemporary::Create(Context, Decl);
6258d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
6259d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
6260c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlDiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
6261e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor  return Diag(SourceLocation(), DiagID);
6262e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor}
6263e1d918e9fe55e3b34401fd5d420c47ea0f9572c9Douglas Gregor
6264c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlDiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
626533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  return Diags.Report(Loc, DiagID);
62660a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor}
6267025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor
6268668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor/// \brief Retrieve the identifier table associated with the
6269668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor/// preprocessor.
6270c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlIdentifierTable &ASTReader::getIdentifierTable() {
6271712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor  return PP.getIdentifierTable();
6272668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor}
6273668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
6274025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor/// \brief Record that the given ID maps to the given switch-case
6275025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor/// statement.
6276c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlvoid ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
6277b88acb018a0d5e897ce291da2664edfd7bd58f5cArgyrios Kyrtzidis  assert((*CurrSwitchCaseStmts)[ID] == 0 &&
6278b88acb018a0d5e897ce291da2664edfd7bd58f5cArgyrios Kyrtzidis         "Already have a SwitchCase with this ID");
6279b88acb018a0d5e897ce291da2664edfd7bd58f5cArgyrios Kyrtzidis  (*CurrSwitchCaseStmts)[ID] = SC;
6280025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor}
6281025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor
6282025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor/// \brief Retrieve the switch-case statement with the given ID.
6283c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlSwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
6284b88acb018a0d5e897ce291da2664edfd7bd58f5cArgyrios Kyrtzidis  assert((*CurrSwitchCaseStmts)[ID] != 0 && "No SwitchCase with this ID");
6285b88acb018a0d5e897ce291da2664edfd7bd58f5cArgyrios Kyrtzidis  return (*CurrSwitchCaseStmts)[ID];
6286025452fa0eda63e150cfaeebe64f0a19c96b3a06Douglas Gregor}
62871de05feeeafe5b215fe7617594a7076a5192a6e2Douglas Gregor
6288e09a275444576deb2c8d9e2255554242f65d7c00Argyrios Kyrtzidisvoid ASTReader::ClearSwitchCaseIDs() {
6289b88acb018a0d5e897ce291da2664edfd7bd58f5cArgyrios Kyrtzidis  CurrSwitchCaseStmts->clear();
6290e09a275444576deb2c8d9e2255554242f65d7c00Argyrios Kyrtzidis}
6291e09a275444576deb2c8d9e2255554242f65d7c00Argyrios Kyrtzidis
6292aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkovoid ASTReader::ReadComments() {
6293811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko  std::vector<RawComment *> Comments;
6294aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  for (SmallVectorImpl<std::pair<llvm::BitstreamCursor,
6295aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                 serialization::ModuleFile *> >::iterator
6296aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko       I = CommentsCursors.begin(),
6297aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko       E = CommentsCursors.end();
6298aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko       I != E; ++I) {
6299aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    llvm::BitstreamCursor &Cursor = I->first;
6300aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    serialization::ModuleFile &F = *I->second;
6301aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    SavedStreamPosition SavedPosition(Cursor);
6302aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
6303aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    RecordData Record;
6304aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    while (true) {
6305aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      unsigned Code = Cursor.ReadCode();
6306aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      if (Code == llvm::bitc::END_BLOCK)
6307aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        break;
6308aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
6309aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      if (Code == llvm::bitc::ENTER_SUBBLOCK) {
6310aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        // No known subblocks, always skip them.
6311aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        Cursor.ReadSubBlockID();
6312aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        if (Cursor.SkipBlock()) {
6313aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko          Error("malformed block record in AST file");
6314aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko          return;
6315aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        }
6316aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        continue;
6317aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      }
6318aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
6319aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      if (Code == llvm::bitc::DEFINE_ABBREV) {
6320aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        Cursor.ReadAbbrevRecord();
6321aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        continue;
6322aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      }
6323aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
6324aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      // Read a record.
6325aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      Record.clear();
6326aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      switch ((CommentRecordTypes) Cursor.ReadRecord(Code, Record)) {
632713691bba2423e404b3efc0dfc5206d04ef33dcc6Chandler Carruth      case COMMENTS_RAW_COMMENT: {
632813691bba2423e404b3efc0dfc5206d04ef33dcc6Chandler Carruth        unsigned Idx = 0;
632913691bba2423e404b3efc0dfc5206d04ef33dcc6Chandler Carruth        SourceRange SR = ReadSourceRange(F, Record, Idx);
633013691bba2423e404b3efc0dfc5206d04ef33dcc6Chandler Carruth        RawComment::CommentKind Kind =
633113691bba2423e404b3efc0dfc5206d04ef33dcc6Chandler Carruth            (RawComment::CommentKind) Record[Idx++];
633213691bba2423e404b3efc0dfc5206d04ef33dcc6Chandler Carruth        bool IsTrailingComment = Record[Idx++];
633313691bba2423e404b3efc0dfc5206d04ef33dcc6Chandler Carruth        bool IsAlmostTrailingComment = Record[Idx++];
6334811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko        Comments.push_back(new (Context) RawComment(SR, Kind,
6335811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko                                                    IsTrailingComment,
6336811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko                                                    IsAlmostTrailingComment));
633713691bba2423e404b3efc0dfc5206d04ef33dcc6Chandler Carruth        break;
6338aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      }
6339aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      }
6340aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    }
6341aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  }
6342aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  Context.Comments.addCommentsToFront(Comments);
6343aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}
6344aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
6345917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidisvoid ASTReader::finishPendingActions() {
6346cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor  while (!PendingIdentifierInfos.empty() || !PendingDeclChains.empty()) {
6347917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis    // If any identifiers with corresponding top-level declarations have
6348917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis    // been loaded, load those declarations now.
6349917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis    while (!PendingIdentifierInfos.empty()) {
6350917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis      SetGloballyVisibleDecls(PendingIdentifierInfos.front().II,
6351917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis                              PendingIdentifierInfos.front().DeclIDs, true);
6352917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis      PendingIdentifierInfos.pop_front();
6353917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis    }
6354917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis
6355a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor    // Load pending declaration chains.
6356a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor    for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
6357a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor      loadPendingDeclChain(PendingDeclChains[I]);
635856ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor      PendingDeclChainsKnown.erase(PendingDeclChains[I]);
6359a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor    }
6360a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor    PendingDeclChains.clear();
6361917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis  }
6362fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor
63637c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  // If we deserialized any C++ or Objective-C class definitions, any
63647c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  // Objective-C protocol definitions, or any redeclarable templates, make sure
63657c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  // that all redeclarations point to the definitions. Note that this can only
63667c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  // happen now, after the redeclaration chains have been fully wired.
6367fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor  for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(),
6368fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor                                           DEnd = PendingDefinitions.end();
6369fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor       D != DEnd; ++D) {
637056ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor    if (TagDecl *TD = dyn_cast<TagDecl>(*D)) {
637156ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor      if (const TagType *TagT = dyn_cast<TagType>(TD->TypeForDecl)) {
637256ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor        // Make sure that the TagType points at the definition.
637356ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor        const_cast<TagType*>(TagT)->decl = TD;
637456ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor      }
6375fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor
637656ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor      if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(*D)) {
637756ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor        for (CXXRecordDecl::redecl_iterator R = RD->redecls_begin(),
637856ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor                                         REnd = RD->redecls_end();
637956ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor             R != REnd; ++R)
638056ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor          cast<CXXRecordDecl>(*R)->DefinitionData = RD->DefinitionData;
638156ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor
638256ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor      }
638356ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor
6384fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor      continue;
6385fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor    }
6386fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor
63871d784b277cdfd4eba03680715d2a082b3f28d295Douglas Gregor    if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(*D)) {
638856ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor      // Make sure that the ObjCInterfaceType points at the definition.
638956ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor      const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
639056ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor        ->Decl = ID;
639156ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor
63921d784b277cdfd4eba03680715d2a082b3f28d295Douglas Gregor      for (ObjCInterfaceDecl::redecl_iterator R = ID->redecls_begin(),
63931d784b277cdfd4eba03680715d2a082b3f28d295Douglas Gregor                                           REnd = ID->redecls_end();
63941d784b277cdfd4eba03680715d2a082b3f28d295Douglas Gregor           R != REnd; ++R)
63951d784b277cdfd4eba03680715d2a082b3f28d295Douglas Gregor        R->Data = ID->Data;
63961d784b277cdfd4eba03680715d2a082b3f28d295Douglas Gregor
63971d784b277cdfd4eba03680715d2a082b3f28d295Douglas Gregor      continue;
63981d784b277cdfd4eba03680715d2a082b3f28d295Douglas Gregor    }
63991d784b277cdfd4eba03680715d2a082b3f28d295Douglas Gregor
64007c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(*D)) {
64017c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      for (ObjCProtocolDecl::redecl_iterator R = PD->redecls_begin(),
64027c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor                                          REnd = PD->redecls_end();
64037c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor           R != REnd; ++R)
64047c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor        R->Data = PD->Data;
64057c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor
64067c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      continue;
64077c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    }
64087c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor
64097c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    RedeclarableTemplateDecl *RTD
64107c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl();
64117c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    for (RedeclarableTemplateDecl::redecl_iterator R = RTD->redecls_begin(),
64127c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor                                                REnd = RTD->redecls_end();
6413fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor         R != REnd; ++R)
64147c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      R->Common = RTD->Common;
6415fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor  }
6416fc529f7fcafe7da0b8a32621e13685891e8ce52aDouglas Gregor  PendingDefinitions.clear();
6417917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis}
6418917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis
6419c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlvoid ASTReader::FinishedDeserializing() {
642029ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis  assert(NumCurrentElementsDeserializing &&
642129ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis         "FinishedDeserializing not paired with StartedDeserializing");
642229ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis  if (NumCurrentElementsDeserializing == 1) {
642344d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis    // We decrease NumCurrentElementsDeserializing only after pending actions
642444d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis    // are finished, to avoid recursively re-calling finishPendingActions().
642544d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis    finishPendingActions();
642644d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis  }
642744d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis  --NumCurrentElementsDeserializing;
642871168330e25fdce4c1a3bf46484a2d81e2e21011Argyrios Kyrtzidis
642944d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis  if (NumCurrentElementsDeserializing == 0 &&
643044d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis      Consumer && !PassingDeclsToConsumer) {
643144d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis    // Guard variable to avoid recursively redoing the process of passing
643244d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis    // decls to consumer.
643344d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis    SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
643444d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis                                                     true);
6435917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis
643644d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis    while (!InterestingDecls.empty()) {
64378d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidis      // We are not in recursive loading, so it's safe to pass the "interesting"
64388d39c3ddfc17d9e768a17eb0ce9f11c33bf9d50aArgyrios Kyrtzidis      // decls to the consumer.
6439917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis      Decl *D = InterestingDecls.front();
6440917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis      InterestingDecls.pop_front();
6441917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis      PassInterestingDeclToConsumer(D);
6442917078386b9b5113f33c093e296e10927b00b37eArgyrios Kyrtzidis    }
6443d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor  }
6444d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor}
6445501c1036560bb407f9be6834931253f0929cca86Douglas Gregor
6446f8a1e51c48761ee1d7803c3fa35ac94f42ebb55eDouglas GregorASTReader::ASTReader(Preprocessor &PP, ASTContext &Context,
6447832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor                     StringRef isysroot, bool DisableValidation,
6448bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis                     bool DisableStatCache, bool AllowASTWithCompilerErrors)
6449e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl  : Listener(new PCHValidator(PP, *this)), DeserializationListener(0),
6450e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl    SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
6451712f2fcb70ae2eb0cb684d565e7d2cb76881006bDouglas Gregor    Diags(PP.getDiagnostics()), SemaObj(0), PP(PP), Context(Context),
64521afb661bc5444462a246cefa0effa61ef25fab29Jonathan D. Turner    Consumer(0), ModuleMgr(FileMgr.getFileSystemOptions()),
64531afb661bc5444462a246cefa0effa61ef25fab29Jonathan D. Turner    RelocatablePCH(false), isysroot(isysroot),
6454f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    DisableValidation(DisableValidation),
6455bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis    DisableStatCache(DisableStatCache),
6456bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis    AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
6457b88acb018a0d5e897ce291da2664edfd7bd58f5cArgyrios Kyrtzidis    CurrentGeneration(0), CurrSwitchCaseStmts(&SwitchCaseStmts),
6458b88acb018a0d5e897ce291da2664edfd7bd58f5cArgyrios Kyrtzidis    NumStatHits(0), NumStatMisses(0),
6459f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    NumSLocEntriesRead(0), TotalNumSLocEntries(0),
64608ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor    NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0),
64618ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor    TotalNumMacros(0), NumSelectorsRead(0), NumMethodPoolEntriesRead(0),
64628ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor    NumMethodPoolMisses(0), TotalNumMethodPoolEntries(0),
64638ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor    NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
64641da901467f72d1733704b068e22089813a1962fdJonathan D. Turner    NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
64651da901467f72d1733704b068e22089813a1962fdJonathan D. Turner    TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
646644d2dbdce49d1fca3826d543ba875bb82f759091Argyrios Kyrtzidis    PassingDeclsToConsumer(false),
64671da901467f72d1733704b068e22089813a1962fdJonathan D. Turner    NumCXXBaseSpecifiersLoaded(0)
64688ef6c8cb6c5627240e2339fd7062c9873f821d7eDouglas Gregor{
6469f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  SourceMgr.setExternalSLocEntrySource(this);
6470e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl}
6471e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl
6472e1dde811b38e779894150cb1093d57f8411a84f7Sebastian RedlASTReader::~ASTReader() {
6473e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl  for (DeclContextVisibleUpdatesPending::iterator
6474e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl           I = PendingVisibleUpdates.begin(),
6475e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl           E = PendingVisibleUpdates.end();
6476e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl       I != E; ++I) {
6477e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl    for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
6478e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl                                             F = I->second.end();
6479e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl         J != F; ++J)
6480b1758c662524e18d65d260188fdcbbdee6a9316bBenjamin Kramer      delete J->first;
6481e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl  }
6482e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl}
6483