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