187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===--- ASTWriter.cpp - AST File Writer ------------------------*- 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// 10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl// This file defines the ASTWriter class, which writes AST files. 112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// 122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//===----------------------------------------------------------------------===// 132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl#include "clang/Serialization/ASTWriter.h" 1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Serialization/ModuleFileExtension.h" 160eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis#include "ASTCommon.h" 1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "ASTReaderInternals.h" 1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "MultiOnDiskHashTable.h" 192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/ASTContext.h" 202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/Decl.h" 212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/DeclContextInternals.h" 2289eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "clang/AST/DeclFriend.h" 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/DeclLookups.h" 2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/DeclTemplate.h" 250b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor#include "clang/AST/Expr.h" 267a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall#include "clang/AST/ExprCXX.h" 272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/Type.h" 28a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#include "clang/AST/TypeLocVisitor.h" 296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/Basic/DiagnosticOptions.h" 3014f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "clang/Basic/FileManager.h" 3110e286aa8d39fb51a21412850265d9dae74613eeChris Lattner#include "clang/Basic/FileSystemStatCache.h" 3214f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "clang/Basic/SourceManager.h" 33bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor#include "clang/Basic/SourceManagerInternals.h" 342bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor#include "clang/Basic/TargetInfo.h" 3557016dda61498294120b1a881d9e6606337b29d9Douglas Gregor#include "clang/Basic/TargetOptions.h" 36ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor#include "clang/Basic/Version.h" 370a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor#include "clang/Basic/VersionTuple.h" 3855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/HeaderSearch.h" 3955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/HeaderSearchOptions.h" 4055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/MacroInfo.h" 4155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/PreprocessingRecord.h" 4255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Preprocessor.h" 4355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/PreprocessorOptions.h" 4455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/IdentifierResolver.h" 4555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Sema.h" 4655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Serialization/ASTReader.h" 4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Serialization/SerializationDiagnostic.h" 4817fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor#include "llvm/ADT/APFloat.h" 4917fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor#include "llvm/ADT/APInt.h" 50ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis#include "llvm/ADT/Hashing.h" 512596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar#include "llvm/ADT/StringExtras.h" 522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "llvm/Bitcode/BitstreamWriter.h" 534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "llvm/Support/Compression.h" 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/EndianStream.h" 55fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer#include "llvm/Support/FileSystem.h" 5614f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "llvm/Support/MemoryBuffer.h" 576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "llvm/Support/OnDiskHashTable.h" 5803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h" 59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/Support/Process.h" 60f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#include <algorithm> 613c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner#include <cstdio> 62cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#include <string.h> 63f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#include <utility> 6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorusing namespace clang; 668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlusing namespace clang::serialization; 672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 68ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redltemplate <typename T, typename Allocator> 69b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstatic StringRef bytes(const std::vector<T, Allocator> &v) { 705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (v.empty()) return StringRef(); 715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner return StringRef(reinterpret_cast<const char*>(&v[0]), 726e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer sizeof(T) * v.size()); 73ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl} 746e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer 756e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramertemplate <typename T> 76b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstatic StringRef bytes(const SmallVectorImpl<T> &v) { 775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner return StringRef(reinterpret_cast<const char*>(v.data()), 786e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer sizeof(T) * v.size()); 79ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl} 80ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl 812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//===----------------------------------------------------------------------===// 822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// Type serialization 832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//===----------------------------------------------------------------------===// 8412b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner 854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace clang { 863397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl class ASTTypeWriter { 87a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl ASTWriter &Writer; 884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTRecordWriter Record; 892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /// \brief Type code that corresponds to the record generated. 918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl TypeCode Code; 92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// \brief Abbreviation to use for the record, if any. 93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned AbbrevToUse; 942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar public: 9689eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis ASTTypeWriter(ASTWriter &Writer, ASTWriter::RecordDataImpl &Record) 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : Writer(Writer), Record(Writer, Record), Code((TypeCode)0), AbbrevToUse(0) { } 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar uint64_t Emit() { 1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Record.Emit(Code, AbbrevToUse); 1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void Visit(QualType T) { 1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T.hasLocalNonFastQualifiers()) { 1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Qualifiers Qs = T.getLocalQualifiers(); 1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T.getLocalUnqualifiedType()); 1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.push_back(Qs.getAsOpaqueValue()); 1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Code = TYPE_EXT_QUAL; 1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AbbrevToUse = Writer.TypeExtQualAbbrev; 1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar switch (T->getTypeClass()) { 1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // For all of the concrete, non-dependent types, call the 1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // appropriate visitor function. 1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define TYPE(Class, Base) \ 1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case Type::Class: Visit##Class##Type(cast<Class##Type>(T)); break; 1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define ABSTRACT_TYPE(Class, Base) 1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/TypeNodes.def" 1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor void VisitArrayType(const ArrayType *T); 1232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor void VisitFunctionType(const FunctionType *T); 1242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor void VisitTagType(const TagType *T); 1252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#define TYPE(Class, Base) void Visit##Class##Type(const Class##Type *T); 1272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#define ABSTRACT_TYPE(Class, Base) 1282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "clang/AST/TypeNodes.def" 1292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor }; 1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end namespace clang 1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1323397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitBuiltinType(const BuiltinType *T) { 133b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Built-in types are never serialized"); 1342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1363397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitComplexType(const ComplexType *T) { 1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getElementType()); 1388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_COMPLEX; 1392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitPointerType(const PointerType *T) { 1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getPointeeType()); 1438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_POINTER; 1442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 14612df246d6dea2ee1f92c186f922f1afcf499647aReid Klecknervoid ASTTypeWriter::VisitDecayedType(const DecayedType *T) { 1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getOriginalType()); 14812df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner Code = TYPE_DECAYED; 14912df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner} 15012df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner 151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTTypeWriter::VisitAdjustedType(const AdjustedType *T) { 1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getOriginalType()); 1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getAdjustedType()); 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Code = TYPE_ADJUSTED; 155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitBlockPointerType(const BlockPointerType *T) { 1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getPointeeType()); 1598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_BLOCK_POINTER; 1602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1623397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitLValueReferenceType(const LValueReferenceType *T) { 1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getPointeeTypeAsWritten()); 164df1550fc59b51681d37225934fe4e3acac321621Richard Smith Record.push_back(T->isSpelledAsLValue()); 1658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_LVALUE_REFERENCE; 1662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1683397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitRValueReferenceType(const RValueReferenceType *T) { 1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getPointeeTypeAsWritten()); 1708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_RVALUE_REFERENCE; 1712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitMemberPointerType(const MemberPointerType *T) { 1744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getPointeeType()); 1754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(QualType(T->getClass(), 0)); 1768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_MEMBER_POINTER; 1772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1793397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitArrayType(const ArrayType *T) { 1804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getElementType()); 1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor Record.push_back(T->getSizeModifier()); // FIXME: stable values 1820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Record.push_back(T->getIndexTypeCVRQualifiers()); // FIXME: stable values 1832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1853397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitConstantArrayType(const ConstantArrayType *T) { 1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor VisitArrayType(T); 1874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddAPInt(T->getSize()); 1888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_CONSTANT_ARRAY; 1892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1913397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitIncompleteArrayType(const IncompleteArrayType *T) { 1922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor VisitArrayType(T); 1938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_INCOMPLETE_ARRAY; 1942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitVariableArrayType(const VariableArrayType *T) { 1972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor VisitArrayType(T); 1984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(T->getLBracketLoc()); 1994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(T->getRBracketLoc()); 2004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddStmt(T->getSizeExpr()); 2018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_VARIABLE_ARRAY; 2022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2043397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitVectorType(const VectorType *T) { 2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getElementType()); 2062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor Record.push_back(T->getNumElements()); 207e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson Record.push_back(T->getVectorKind()); 2088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_VECTOR; 2092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2113397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitExtVectorType(const ExtVectorType *T) { 2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor VisitVectorType(T); 2138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_EXT_VECTOR; 2142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitFunctionType(const FunctionType *T) { 2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getReturnType()); 218264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola FunctionType::ExtInfo C = T->getExtInfo(); 219264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Record.push_back(C.getNoReturn()); 220a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman Record.push_back(C.getHasRegParm()); 221425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola Record.push_back(C.getRegParm()); 222ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor // FIXME: need to stabilize encoding of calling convention... 223264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola Record.push_back(C.getCC()); 224f85e193739c953358c865005855253af4f68a497John McCall Record.push_back(C.getProducesResult()); 225176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (C.getHasRegParm() || C.getRegParm() || C.getProducesResult()) 227176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AbbrevToUse = 0; 2282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2303397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) { 2312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor VisitFunctionType(T); 2328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_FUNCTION_NO_PROTO; 2332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic void addExceptionSpec(const FunctionProtoType *T, 2364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTRecordWriter &Record) { 23760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Record.push_back(T->getExceptionSpecType()); 23860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (T->getExceptionSpecType() == EST_Dynamic) { 23960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl Record.push_back(T->getNumExceptions()); 24060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl for (unsigned I = 0, N = T->getNumExceptions(); I != N; ++I) 2414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getExceptionType(I)); 24260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } else if (T->getExceptionSpecType() == EST_ComputedNoexcept) { 2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddStmt(T->getNoexceptExpr()); 2447bb698aa054de4c0e0aa23973b2c62dac9611262Richard Smith } else if (T->getExceptionSpecType() == EST_Uninstantiated) { 2454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(T->getExceptionSpecDecl()); 2464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(T->getExceptionSpecTemplate()); 247b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith } else if (T->getExceptionSpecType() == EST_Unevaluated) { 2484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(T->getExceptionSpecDecl()); 24960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTTypeWriter::VisitFunctionProtoType(const FunctionProtoType *T) { 253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VisitFunctionType(T); 254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record.push_back(T->isVariadic()); 256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record.push_back(T->hasTrailingReturn()); 257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record.push_back(T->getTypeQuals()); 258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record.push_back(static_cast<unsigned>(T->getRefQualifier())); 2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addExceptionSpec(T, Record); 260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Record.push_back(T->getNumParams()); 262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (unsigned I = 0, N = T->getNumParams(); I != N; ++I) 2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getParamType(I)); 2644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (T->hasExtParameterInfos()) { 2664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (unsigned I = 0, N = T->getNumParams(); I != N; ++I) 2674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.push_back(T->getExtParameterInfo(I).getOpaqueValue()); 2684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (T->isVariadic() || T->hasTrailingReturn() || T->getTypeQuals() || 2714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar T->getRefQualifier() || T->getExceptionSpecType() != EST_None || 2724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar T->hasExtParameterInfos()) 273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AbbrevToUse = 0; 274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_FUNCTION_PROTO; 2762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2783397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitUnresolvedUsingType(const UnresolvedUsingType *T) { 2794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(T->getDecl()); 2808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_UNRESOLVED_USING; 281ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 282ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2833397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitTypedefType(const TypedefType *T) { 2844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(T->getDecl()); 2859763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis assert(!T->isCanonicalUnqualified() && "Invalid typedef ?"); 2864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getCanonicalTypeInternal()); 2878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_TYPEDEF; 2882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2903397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitTypeOfExprType(const TypeOfExprType *T) { 2914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddStmt(T->getUnderlyingExpr()); 2928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_TYPEOF_EXPR; 2932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2953397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitTypeOfType(const TypeOfType *T) { 2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getUnderlyingType()); 2978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_TYPEOF; 2982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3003397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitDecltypeType(const DecltypeType *T) { 3014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getUnderlyingType()); 3024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddStmt(T->getUnderlyingExpr()); 3038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_DECLTYPE; 304395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson} 305395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 306ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Huntvoid ASTTypeWriter::VisitUnaryTransformType(const UnaryTransformType *T) { 3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getBaseType()); 3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getUnderlyingType()); 309ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt Record.push_back(T->getUTTKind()); 310ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt Code = TYPE_UNARY_TRANSFORM; 311ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 312ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 31334b41d939a1328f484511c6002ba2456db879a29Richard Smithvoid ASTTypeWriter::VisitAutoType(const AutoType *T) { 3144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getDeducedType()); 31587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back((unsigned)T->getKeyword()); 316dc7a4f5d7a7e3b60d4dc4a80338d7a2728540998Richard Smith if (T->getDeducedType().isNull()) 317dc7a4f5d7a7e3b60d4dc4a80338d7a2728540998Richard Smith Record.push_back(T->isDependentType()); 31834b41d939a1328f484511c6002ba2456db879a29Richard Smith Code = TYPE_AUTO; 31934b41d939a1328f484511c6002ba2456db879a29Richard Smith} 32034b41d939a1328f484511c6002ba2456db879a29Richard Smith 3213397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitTagType(const TagType *T) { 322be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis Record.push_back(T->isDependentType()); 3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(T->getDecl()->getCanonicalDecl()); 3241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(!T->isBeingDefined() && 3252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor "Cannot serialize in the middle of a type definition"); 3262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 3272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3283397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitRecordType(const RecordType *T) { 3292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor VisitTagType(T); 3308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_RECORD; 3312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 3322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3333397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitEnumType(const EnumType *T) { 3342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor VisitTagType(T); 3358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_ENUM; 3362cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 3372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3389d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallvoid ASTTypeWriter::VisitAttributedType(const AttributedType *T) { 3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getModifiedType()); 3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getEquivalentType()); 3419d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall Record.push_back(T->getAttrKind()); 3429d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall Code = TYPE_ATTRIBUTED; 3439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 3449d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 3463397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlASTTypeWriter::VisitSubstTemplateTypeParmType( 34749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall const SubstTemplateTypeParmType *T) { 3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(QualType(T->getReplacedParameter(), 0)); 3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getReplacementType()); 3508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_SUBST_TEMPLATE_TYPE_PARM; 35149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 35249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 35349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallvoid 354c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorASTTypeWriter::VisitSubstTemplateTypeParmPackType( 355c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor const SubstTemplateTypeParmPackType *T) { 3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(QualType(T->getReplacedParameter(), 0)); 3574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTemplateArgument(T->getArgumentPack()); 358c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Code = TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK; 359c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor} 360c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 361c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorvoid 3623397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlASTTypeWriter::VisitTemplateSpecializationType( 3632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor const TemplateSpecializationType *T) { 364be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis Record.push_back(T->isDependentType()); 3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTemplateName(T->getTemplateName()); 36690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis Record.push_back(T->getNumArgs()); 36787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &ArgI : *T) 3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTemplateArgument(ArgI); 3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->isTypeAlias() ? T->getAliasedType() 3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : T->isCanonicalUnqualified() 3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ? QualType() 3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : T->getCanonicalTypeInternal()); 3738538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_TEMPLATE_SPECIALIZATION; 37490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 37590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 37690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid 3773397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlASTTypeWriter::VisitDependentSizedArrayType(const DependentSizedArrayType *T) { 378ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis VisitArrayType(T); 3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddStmt(T->getSizeExpr()); 3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceRange(T->getBracketsRange()); 3818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_DEPENDENT_SIZED_ARRAY; 38290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 38390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 38490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid 3853397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlASTTypeWriter::VisitDependentSizedExtVectorType( 38690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis const DependentSizedExtVectorType *T) { 38790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis // FIXME: Serialize this type (C++ only) 388b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Cannot serialize dependent sized extended vector types"); 38990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 39090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 39190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid 3923397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlASTTypeWriter::VisitTemplateTypeParmType(const TemplateTypeParmType *T) { 39390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis Record.push_back(T->getDepth()); 39490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis Record.push_back(T->getIndex()); 39590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis Record.push_back(T->isParameterPack()); 3964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(T->getDecl()); 3978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_TEMPLATE_TYPE_PARM; 39890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 39990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 40090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid 4013397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlASTTypeWriter::VisitDependentNameType(const DependentNameType *T) { 4028dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis Record.push_back(T->getKeyword()); 4034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddNestedNameSpecifier(T->getQualifier()); 4044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddIdentifierRef(T->getIdentifier()); 4054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef( 4064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar T->isCanonicalUnqualified() ? QualType() : T->getCanonicalTypeInternal()); 4078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_DEPENDENT_NAME; 40890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 40990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 41090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid 4113397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlASTTypeWriter::VisitDependentTemplateSpecializationType( 41290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis const DependentTemplateSpecializationType *T) { 4133acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis Record.push_back(T->getKeyword()); 4144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddNestedNameSpecifier(T->getQualifier()); 4154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddIdentifierRef(T->getIdentifier()); 4163acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis Record.push_back(T->getNumArgs()); 41787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &I : *T) 4184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTemplateArgument(I); 4198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION; 4202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 4212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 4227536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregorvoid ASTTypeWriter::VisitPackExpansionType(const PackExpansionType *T) { 4234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getPattern()); 424dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> NumExpansions = T->getNumExpansions()) 425cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Record.push_back(*NumExpansions + 1); 426cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor else 427cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor Record.push_back(0); 4287536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor Code = TYPE_PACK_EXPANSION; 4297536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor} 4307536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 431075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaravoid ASTTypeWriter::VisitParenType(const ParenType *T) { 4324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getInnerType()); 433075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara Code = TYPE_PAREN; 434075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara} 435075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 4363397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitElaboratedType(const ElaboratedType *T) { 437465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara Record.push_back(T->getKeyword()); 4384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddNestedNameSpecifier(T->getQualifier()); 4394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getNamedType()); 4408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_ELABORATED; 4412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 4422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 4433397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitInjectedClassNameType(const InjectedClassNameType *T) { 4444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(T->getDecl()->getCanonicalDecl()); 4454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getInjectedSpecializationType()); 4468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_INJECTED_CLASS_NAME; 4473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 4483cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 4493397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { 4504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(T->getDecl()->getCanonicalDecl()); 4518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_OBJC_INTERFACE; 452c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 453c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 4543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid ASTTypeWriter::VisitObjCObjectType(const ObjCObjectType *T) { 4554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getBaseType()); 45687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(T->getTypeArgsAsWritten().size()); 45787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto TypeArg : T->getTypeArgsAsWritten()) 4584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(TypeArg); 4592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor Record.push_back(T->getNumProtocols()); 460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *I : T->quals()) 4614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(I); 46287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(T->isKindOfTypeAsWritten()); 4638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_OBJC_OBJECT; 4642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 4652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 466d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffvoid 4673397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlASTTypeWriter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { 4684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getPointeeType()); 4698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = TYPE_OBJC_OBJECT_POINTER; 4702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 4712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 472b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedmanvoid 473b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanASTTypeWriter::VisitAtomicType(const AtomicType *T) { 4744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getValueType()); 475b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman Code = TYPE_ATOMIC; 476b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman} 477b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 4784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid 4794967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarASTTypeWriter::VisitPipeType(const PipeType *T) { 4804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeRef(T->getElementType()); 4814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Code = TYPE_PIPE; 4824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 4834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 484a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallnamespace { 485a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 486a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallclass TypeLocWriter : public TypeLocVisitor<TypeLocWriter> { 4874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTRecordWriter &Record; 488a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 489a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallpublic: 4904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeLocWriter(ASTRecordWriter &Record) 4914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : Record(Record) { } 492a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 49351bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 494a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#define TYPELOC(CLASS, PARENT) \ 49551bd803fbdade51d674598ed45da3d54190a656cJohn McCall void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 496a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#include "clang/AST/TypeLocNodes.def" 497a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 49851bd803fbdade51d674598ed45da3d54190a656cJohn McCall void VisitArrayTypeLoc(ArrayTypeLoc TyLoc); 49951bd803fbdade51d674598ed45da3d54190a656cJohn McCall void VisitFunctionTypeLoc(FunctionTypeLoc TyLoc); 500a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}; 501a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 50287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end anonymous namespace 503a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 50451bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 50551bd803fbdade51d674598ed45da3d54190a656cJohn McCall // nothing to do 50651bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 50751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 5084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getBuiltinLoc()); 509ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor if (TL.needsExtraLocalData()) { 510ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor Record.push_back(TL.getWrittenTypeSpec()); 511ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor Record.push_back(TL.getWrittenSignSpec()); 512ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor Record.push_back(TL.getWrittenWidthSpec()); 513ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor Record.push_back(TL.hasModeAttr()); 514ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor } 51551bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 51651bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitComplexTypeLoc(ComplexTypeLoc TL) { 5174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 51851bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 51951bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitPointerTypeLoc(PointerTypeLoc TL) { 5204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getStarLoc()); 52151bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 52212df246d6dea2ee1f92c186f922f1afcf499647aReid Klecknervoid TypeLocWriter::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 52312df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner // nothing to do 52412df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner} 525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid TypeLocWriter::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // nothing to do 527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 52851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 5294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getCaretLoc()); 53051bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 53151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 5324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getAmpLoc()); 53351bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 53451bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 5354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getAmpAmpLoc()); 53651bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 53751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 5384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getStarLoc()); 5394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeSourceInfo(TL.getClassTInfo()); 54051bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 54151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitArrayTypeLoc(ArrayTypeLoc TL) { 5424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLBracketLoc()); 5434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getRBracketLoc()); 54451bd803fbdade51d674598ed45da3d54190a656cJohn McCall Record.push_back(TL.getSizeExpr() ? 1 : 0); 54551bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (TL.getSizeExpr()) 5464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddStmt(TL.getSizeExpr()); 54751bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 54851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 54951bd803fbdade51d674598ed45da3d54190a656cJohn McCall VisitArrayTypeLoc(TL); 55051bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 55151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 55251bd803fbdade51d674598ed45da3d54190a656cJohn McCall VisitArrayTypeLoc(TL); 55351bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 55451bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 55551bd803fbdade51d674598ed45da3d54190a656cJohn McCall VisitArrayTypeLoc(TL); 55651bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 55751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitDependentSizedArrayTypeLoc( 55851bd803fbdade51d674598ed45da3d54190a656cJohn McCall DependentSizedArrayTypeLoc TL) { 55951bd803fbdade51d674598ed45da3d54190a656cJohn McCall VisitArrayTypeLoc(TL); 56051bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 56151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitDependentSizedExtVectorTypeLoc( 56251bd803fbdade51d674598ed45da3d54190a656cJohn McCall DependentSizedExtVectorTypeLoc TL) { 5634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 56451bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 56551bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitVectorTypeLoc(VectorTypeLoc TL) { 5664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 56751bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 56851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 5694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 57051bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 57151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 5724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLocalRangeBegin()); 5734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLParenLoc()); 5744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getRParenLoc()); 5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLocalRangeEnd()); 576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) 5774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(TL.getParam(i)); 57851bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 57951bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 58051bd803fbdade51d674598ed45da3d54190a656cJohn McCall VisitFunctionTypeLoc(TL); 58151bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 58251bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 58351bd803fbdade51d674598ed45da3d54190a656cJohn McCall VisitFunctionTypeLoc(TL); 58451bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 585ed97649e9574b9d854fa4d6109c9333ae0993554John McCallvoid TypeLocWriter::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 5864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 587ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 58851bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 5894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 59051bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 59151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 5924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getTypeofLoc()); 5934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLParenLoc()); 5944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getRParenLoc()); 59551bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 59651bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 5974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getTypeofLoc()); 5984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLParenLoc()); 5994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getRParenLoc()); 6004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeSourceInfo(TL.getUnderlyingTInfo()); 60151bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 60251bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 604a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 605ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Huntvoid TypeLocWriter::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getKWLoc()); 6074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLParenLoc()); 6084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getRParenLoc()); 6094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeSourceInfo(TL.getUnderlyingTInfo()); 610ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 61134b41d939a1328f484511c6002ba2456db879a29Richard Smithvoid TypeLocWriter::VisitAutoTypeLoc(AutoTypeLoc TL) { 6124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 61334b41d939a1328f484511c6002ba2456db879a29Richard Smith} 61451bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitRecordTypeLoc(RecordTypeLoc TL) { 6154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 616a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 61751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitEnumTypeLoc(EnumTypeLoc TL) { 6184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 619a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 6209d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallvoid TypeLocWriter::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getAttrNameLoc()); 6229d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (TL.hasAttrOperand()) { 6239d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall SourceRange range = TL.getAttrOperandParensRange(); 6244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(range.getBegin()); 6254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(range.getEnd()); 6269d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall } 6279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall if (TL.hasAttrExprOperand()) { 6289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall Expr *operand = TL.getAttrExprOperand(); 6299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall Record.push_back(operand ? 1 : 0); 6304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (operand) Record.AddStmt(operand); 6319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall } else if (TL.hasAttrEnumOperand()) { 6324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getAttrEnumOperandLoc()); 6339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall } 6349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 63551bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 637a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 63849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallvoid TypeLocWriter::VisitSubstTemplateTypeParmTypeLoc( 63949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall SubstTemplateTypeParmTypeLoc TL) { 6404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 64149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 642c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorvoid TypeLocWriter::VisitSubstTemplateTypeParmPackTypeLoc( 643c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor SubstTemplateTypeParmPackTypeLoc TL) { 6444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 645c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor} 64651bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitTemplateSpecializationTypeLoc( 64751bd803fbdade51d674598ed45da3d54190a656cJohn McCall TemplateSpecializationTypeLoc TL) { 6484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getTemplateKeywordLoc()); 6494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getTemplateNameLoc()); 6504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLAngleLoc()); 6514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getRAngleLoc()); 652833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTemplateArgumentLocInfo(TL.getArgLoc(i).getArgument().getKind(), 6544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TL.getArgLoc(i).getLocInfo()); 655a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 656075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaravoid TypeLocWriter::VisitParenTypeLoc(ParenTypeLoc TL) { 6574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLParenLoc()); 6584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getRParenLoc()); 659075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara} 660465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnaravoid TypeLocWriter::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getElaboratedKeywordLoc()); 6624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddNestedNameSpecifierLoc(TL.getQualifierLoc()); 663a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 6643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallvoid TypeLocWriter::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 6663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 6674714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregorvoid TypeLocWriter::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getElaboratedKeywordLoc()); 6694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddNestedNameSpecifierLoc(TL.getQualifierLoc()); 6704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 671a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 67233500955d731c73717af52088b7fc0e7a85681e7John McCallvoid TypeLocWriter::VisitDependentTemplateSpecializationTypeLoc( 67333500955d731c73717af52088b7fc0e7a85681e7John McCall DependentTemplateSpecializationTypeLoc TL) { 6744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getElaboratedKeywordLoc()); 6754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddNestedNameSpecifierLoc(TL.getQualifierLoc()); 6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getTemplateKeywordLoc()); 6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getTemplateNameLoc()); 6784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLAngleLoc()); 6794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getRAngleLoc()); 68033500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTemplateArgumentLocInfo(TL.getArgLoc(I).getArgument().getKind(), 6824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TL.getArgLoc(I).getLocInfo()); 68333500955d731c73717af52088b7fc0e7a85681e7John McCall} 6847536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregorvoid TypeLocWriter::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getEllipsisLoc()); 6867536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor} 68751bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getNameLoc()); 689c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall} 690c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallvoid TypeLocWriter::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 691c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall Record.push_back(TL.hasBaseTypeAsWritten()); 6924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getTypeArgsLAngleLoc()); 6934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getTypeArgsRAngleLoc()); 69487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTypeSourceInfo(TL.getTypeArgTInfo(i)); 6964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getProtocolLAngleLoc()); 6974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getProtocolRAngleLoc()); 69854e14c4db764c0636160d26c5bbf491637c83a76John McCall for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getProtocolLoc(i)); 700a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 70151bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid TypeLocWriter::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 7024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getStarLoc()); 703a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 704b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedmanvoid TypeLocWriter::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 7054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getKWLoc()); 7064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getLParenLoc()); 7074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getRParenLoc()); 7084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 7094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid TypeLocWriter::VisitPipeTypeLoc(PipeTypeLoc TL) { 7104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(TL.getKWLoc()); 711b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman} 712a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 713176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTWriter::WriteTypeAbbrevs() { 714176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines using namespace llvm; 715176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 716176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BitCodeAbbrev *Abv; 717176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 718176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Abbreviation for TYPE_EXT_QUAL 719176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv = new BitCodeAbbrev(); 720176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(serialization::TYPE_EXT_QUAL)); 721176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type 722176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3)); // Quals 723176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TypeExtQualAbbrev = Stream.EmitAbbrev(Abv); 724176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 725176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Abbreviation for TYPE_FUNCTION_PROTO 726176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv = new BitCodeAbbrev(); 727176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(serialization::TYPE_FUNCTION_PROTO)); 728176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FunctionType 729176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ReturnType 730176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // NoReturn 731176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(0)); // HasRegParm 732176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(0)); // RegParm 733176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // CC 734176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(0)); // ProducesResult 735176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FunctionProtoType 736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(0)); // IsVariadic 737176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(0)); // HasTrailingReturn 738176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(0)); // TypeQuals 739176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(0)); // RefQualifier 740176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(EST_None)); // ExceptionSpec 741176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // NumParams 742176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 743176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Params 744176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TypeFunctionProtoAbbrev = Stream.EmitAbbrev(Abv); 745176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 746176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 7474dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner//===----------------------------------------------------------------------===// 748a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl// ASTWriter Implementation 7492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor//===----------------------------------------------------------------------===// 7502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 751b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic void EmitBlockID(unsigned ID, const char *Name, 752b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner llvm::BitstreamWriter &Stream, 75389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis ASTWriter::RecordDataImpl &Record) { 754b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Record.clear(); 755b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Record.push_back(ID); 756b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID, Record); 757b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 758b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner // Emit the block name if present. 7596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Name || Name[0] == 0) 7606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 761b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Record.clear(); 762b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner while (*Name) 763b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Record.push_back(*Name++); 764b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME, Record); 765b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner} 766b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 767b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic void EmitRecordID(unsigned ID, const char *Name, 768b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner llvm::BitstreamWriter &Stream, 76989eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis ASTWriter::RecordDataImpl &Record) { 770b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Record.clear(); 771b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Record.push_back(ID); 772b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner while (*Name) 773b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Record.push_back(*Name++); 774b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, Record); 7750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner} 7760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 7770558df2da807646e65d4fa290f4e92114af1a746Chris Lattnerstatic void AddStmtsExprs(llvm::BitstreamWriter &Stream, 77889eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis ASTWriter::RecordDataImpl &Record) { 7798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#define RECORD(X) EmitRecordID(X, #X, Stream, Record) 7800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_STOP); 7810558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_NULL_PTR); 782176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(STMT_REF_PTR); 7830558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_NULL); 7840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_COMPOUND); 7850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_CASE); 7860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_DEFAULT); 7870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_LABEL); 788534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith RECORD(STMT_ATTRIBUTED); 7890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_IF); 7900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_SWITCH); 7910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_WHILE); 7920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_DO); 7930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_FOR); 7940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_GOTO); 7950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_INDIRECT_GOTO); 7960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_CONTINUE); 7970558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_BREAK); 7980558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_RETURN); 7990558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_DECL); 800df5faf5e7ae6823d0af0b801c4ac26d47f2cee97Chad Rosier RECORD(STMT_GCCASM); 801cd518a0ebc7c0a6aa41d717c360462540ef80a76Chad Rosier RECORD(STMT_MSASM); 8020558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_PREDEFINED); 8030558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_DECL_REF); 8040558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_INTEGER_LITERAL); 8050558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_FLOATING_LITERAL); 8060558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_IMAGINARY_LITERAL); 8070558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_STRING_LITERAL); 8080558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_CHARACTER_LITERAL); 8090558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_PAREN); 810176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_PAREN_LIST); 8110558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_UNARY_OPERATOR); 8120558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_SIZEOF_ALIGN_OF); 8130558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_ARRAY_SUBSCRIPT); 8140558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_CALL); 8150558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_MEMBER); 8160558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_BINARY_OPERATOR); 8170558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_COMPOUND_ASSIGN_OPERATOR); 8180558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_CONDITIONAL_OPERATOR); 8190558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_IMPLICIT_CAST); 8200558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_CSTYLE_CAST); 8210558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_COMPOUND_LITERAL); 8220558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_EXT_VECTOR_ELEMENT); 8230558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_INIT_LIST); 8240558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_DESIGNATED_INIT); 825b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar RECORD(EXPR_DESIGNATED_INIT_UPDATE); 8260558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_IMPLICIT_VALUE_INIT); 827b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar RECORD(EXPR_NO_INIT); 8280558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_VA_ARG); 8290558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_ADDR_LABEL); 8300558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_STMT); 8310558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_CHOOSE); 8320558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_GNU_NULL); 8330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_SHUFFLE_VECTOR); 8340558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_BLOCK); 835f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne RECORD(EXPR_GENERIC_SELECTION); 8360558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_OBJC_STRING_LITERAL); 837eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beard RECORD(EXPR_OBJC_BOXED_EXPRESSION); 838ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek RECORD(EXPR_OBJC_ARRAY_LITERAL); 839ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek RECORD(EXPR_OBJC_DICTIONARY_LITERAL); 8400558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_OBJC_ENCODE); 8410558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_OBJC_SELECTOR_EXPR); 8420558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_OBJC_PROTOCOL_EXPR); 8430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_OBJC_IVAR_REF_EXPR); 8440558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_OBJC_PROPERTY_REF_EXPR); 8450558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_OBJC_KVC_REF_EXPR); 8460558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(EXPR_OBJC_MESSAGE_EXPR); 8470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_OBJC_FOR_COLLECTION); 8480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_OBJC_CATCH); 8490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_OBJC_FINALLY); 8500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_OBJC_AT_TRY); 8510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_OBJC_AT_SYNCHRONIZED); 8520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner RECORD(STMT_OBJC_AT_THROW); 853ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek RECORD(EXPR_OBJC_BOOL_LITERAL); 854176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(STMT_CXX_CATCH); 855176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(STMT_CXX_TRY); 856176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(STMT_CXX_FOR_RANGE); 857eb7f96141f754150a92433286fa385910a22f494Sam Weinig RECORD(EXPR_CXX_OPERATOR_CALL); 858176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_CXX_MEMBER_CALL); 859eb7f96141f754150a92433286fa385910a22f494Sam Weinig RECORD(EXPR_CXX_CONSTRUCT); 860176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_CXX_TEMPORARY_OBJECT); 861eb7f96141f754150a92433286fa385910a22f494Sam Weinig RECORD(EXPR_CXX_STATIC_CAST); 862eb7f96141f754150a92433286fa385910a22f494Sam Weinig RECORD(EXPR_CXX_DYNAMIC_CAST); 863eb7f96141f754150a92433286fa385910a22f494Sam Weinig RECORD(EXPR_CXX_REINTERPRET_CAST); 864eb7f96141f754150a92433286fa385910a22f494Sam Weinig RECORD(EXPR_CXX_CONST_CAST); 865eb7f96141f754150a92433286fa385910a22f494Sam Weinig RECORD(EXPR_CXX_FUNCTIONAL_CAST); 8669fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith RECORD(EXPR_USER_DEFINED_LITERAL); 8677c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith RECORD(EXPR_CXX_STD_INITIALIZER_LIST); 868eb7f96141f754150a92433286fa385910a22f494Sam Weinig RECORD(EXPR_CXX_BOOL_LITERAL); 869eb7f96141f754150a92433286fa385910a22f494Sam Weinig RECORD(EXPR_CXX_NULL_PTR_LITERAL); 870b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_TYPEID_EXPR); 871b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_TYPEID_TYPE); 872b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_THIS); 873b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_THROW); 874b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_DEFAULT_ARG); 875176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_CXX_DEFAULT_INIT); 876b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_BIND_TEMPORARY); 877b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_SCALAR_VALUE_INIT); 878b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_NEW); 879b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_DELETE); 880b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_PSEUDO_DESTRUCTOR); 881b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_EXPR_WITH_CLEANUPS); 882b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_DEPENDENT_SCOPE_MEMBER); 883b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_DEPENDENT_SCOPE_DECL_REF); 884b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_UNRESOLVED_CONSTRUCT); 885b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_UNRESOLVED_MEMBER); 886b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_UNRESOLVED_LOOKUP); 887176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_CXX_EXPRESSION_TRAIT); 888b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_CXX_NOEXCEPT); 889b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_OPAQUE_VALUE); 890176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_BINARY_CONDITIONAL_OPERATOR); 891176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_TYPE_TRAIT); 892176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_ARRAY_TYPE_TRAIT); 893b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_PACK_EXPANSION); 894b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_SIZEOF_PACK); 895176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_SUBST_NON_TYPE_TEMPLATE_PARM); 896b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK); 897176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_FUNCTION_PARM_PACK); 898176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_MATERIALIZE_TEMPORARY); 899e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne RECORD(EXPR_CUDA_KERNEL_CALL); 900176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_CXX_UUIDOF_EXPR); 901176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_CXX_UUIDOF_TYPE); 902176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(EXPR_LAMBDA); 9030558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#undef RECORD 904b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner} 9051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 906a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redlvoid ASTWriter::WriteBlockInfoBlock() { 907b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RecordData Record; 908b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Stream.EnterSubblock(llvm::bitc::BLOCKINFO_BLOCK_ID, 3); 9091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#define BLOCK(X) EmitBlockID(X ## _ID, #X, Stream, Record) 9118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#define RECORD(X) EmitRecordID(X, #X, Stream, Record) 9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9137ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor // Control Block. 9147ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor BLOCK(CONTROL_BLOCK); 9157ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor RECORD(METADATA); 916176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(SIGNATURE); 9176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RECORD(MODULE_NAME); 91887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(MODULE_DIRECTORY); 9196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RECORD(MODULE_MAP_FILE); 9207ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor RECORD(IMPORTS); 92139c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor RECORD(ORIGINAL_FILE); 9227ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor RECORD(ORIGINAL_PCH_DIR); 923992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis RECORD(ORIGINAL_FILE_ID); 924a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor RECORD(INPUT_FILE_OFFSETS); 92587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 92687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BLOCK(OPTIONS_BLOCK); 92787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(LANGUAGE_OPTIONS); 92887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(TARGET_OPTIONS); 9295f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor RECORD(DIAGNOSTIC_OPTIONS); 9301b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor RECORD(FILE_SYSTEM_OPTIONS); 931bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor RECORD(HEADER_SEARCH_OPTIONS); 932a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor RECORD(PREPROCESSOR_OPTIONS); 933a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor 934c337fefd7317714d365a2acf4f1d2939bbcf8e3bDouglas Gregor BLOCK(INPUT_FILES_BLOCK); 935c337fefd7317714d365a2acf4f1d2939bbcf8e3bDouglas Gregor RECORD(INPUT_FILE); 936c337fefd7317714d365a2acf4f1d2939bbcf8e3bDouglas Gregor 9377ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor // AST Top-Level Block. 9387ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor BLOCK(AST_BLOCK); 939b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_OFFSET); 940b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(DECL_OFFSET); 941b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(IDENTIFIER_OFFSET); 942b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(IDENTIFIER_TABLE); 943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RECORD(EAGERLY_DESERIALIZED_DECLS); 944b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(SPECIAL_TYPES); 945b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(STATISTICS); 946b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TENTATIVE_DEFINITIONS); 947b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(SELECTOR_OFFSETS); 948b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(METHOD_POOL); 949b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(PP_COUNTER_VALUE); 9507f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor RECORD(SOURCE_LOCATION_OFFSETS); 9517f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor RECORD(SOURCE_LOCATION_PRELOADS); 952b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor RECORD(EXT_VECTOR_DECLS); 95387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(UNUSED_FILESCOPED_DECLS); 954e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis RECORD(PPD_ENTITIES_OFFSETS); 95587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(VTABLE_USES); 956320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian RECORD(REFERENCED_SELECTOR_POOL); 957b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TU_UPDATE_LEXICAL); 958b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(SEMA_DECL_REFS); 959b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(WEAK_UNDECLARED_IDENTIFIERS); 960b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(PENDING_IMPLICIT_INSTANTIATIONS); 961b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(UPDATE_VISIBLE); 962b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_UPDATE_OFFSETS); 963b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_UPDATES); 964b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DIAG_PRAGMA_MAPPINGS); 96584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne RECORD(CUDA_SPECIAL_DECL_REFS); 966cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor RECORD(HEADER_SEARCH_TABLE); 96784bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne RECORD(FP_PRAGMA_OPTIONS); 96884bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne RECORD(OPENCL_EXTENSIONS); 969ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt RECORD(DELEGATING_CTORS); 970d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor RECORD(KNOWN_NAMESPACES); 971837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor RECORD(MODULE_OFFSET_MAP); 972837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor RECORD(SOURCE_MANAGER_LINE_TABLE); 973cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor RECORD(OBJC_CATEGORIES_MAP); 974a126651270acf17c434f60f86a3ab3687f87813aDouglas Gregor RECORD(FILE_SORTED_DECLS); 975a126651270acf17c434f60f86a3ab3687f87813aDouglas Gregor RECORD(IMPORTED_MODULES); 976cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor RECORD(OBJC_CATEGORIES); 977a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor RECORD(MACRO_OFFSET); 97887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(INTERESTING_IDENTIFIERS); 97987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(UNDEFINED_BUT_USED); 980ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith RECORD(LATE_PARSED_TEMPLATE); 9816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RECORD(OPTIMIZE_PRAGMA_OPTIONS); 9824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(MSSTRUCT_PRAGMA_OPTIONS); 9834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(POINTERS_TO_MEMBERS_PRAGMA_OPTIONS); 98487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES); 98587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(DELETE_EXPRS_TO_ANALYZE); 9862171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor 987b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner // SourceManager Block. 9882f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner BLOCK(SOURCE_MANAGER_BLOCK); 989b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(SM_SLOC_FILE_ENTRY); 990b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(SM_SLOC_BUFFER_ENTRY); 991b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(SM_SLOC_BUFFER_BLOB); 9924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(SM_SLOC_BUFFER_BLOB_COMPRESSED); 993f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth RECORD(SM_SLOC_EXPANSION_ENTRY); 9941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 995b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner // Preprocessor Block. 9962f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner BLOCK(PREPROCESSOR_BLOCK); 9970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines RECORD(PP_MACRO_DIRECTIVE_HISTORY); 998b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(PP_MACRO_FUNCTION_LIKE); 999b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar RECORD(PP_MACRO_OBJECT_LIKE); 1000b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar RECORD(PP_MODULE_MACRO); 1001b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(PP_TOKEN); 10020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 100387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Submodule Block. 100487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BLOCK(SUBMODULE_BLOCK); 100587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_METADATA); 100687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_DEFINITION); 100787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_UMBRELLA_HEADER); 100887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_HEADER); 100987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_TOPHEADER); 101087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_UMBRELLA_DIR); 101187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_IMPORTS); 101287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_EXPORTS); 101387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_REQUIRES); 101487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_EXCLUDED_HEADER); 101587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_LINK_LIBRARY); 101687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_CONFIG_MACRO); 101787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_CONFLICT); 101887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_PRIVATE_HEADER); 101987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_TEXTUAL_HEADER); 102087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(SUBMODULE_PRIVATE_TEXTUAL_HEADER); 102187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 102287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Comments Block. 102387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BLOCK(COMMENTS_BLOCK); 102487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(COMMENTS_RAW_COMMENT); 102587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 102661d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor // Decls and Types block. 102761d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor BLOCK(DECLTYPES_BLOCK); 1028b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_EXT_QUAL); 1029b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_COMPLEX); 1030b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_POINTER); 1031b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_BLOCK_POINTER); 1032b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_LVALUE_REFERENCE); 1033b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_RVALUE_REFERENCE); 1034b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_MEMBER_POINTER); 1035b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_CONSTANT_ARRAY); 1036b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_INCOMPLETE_ARRAY); 1037b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_VARIABLE_ARRAY); 1038b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_VECTOR); 1039b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_EXT_VECTOR); 1040b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_FUNCTION_NO_PROTO); 1041176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(TYPE_FUNCTION_PROTO); 1042b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_TYPEDEF); 1043b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_TYPEOF_EXPR); 1044b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_TYPEOF); 1045b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_RECORD); 1046b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_ENUM); 1047b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(TYPE_OBJC_INTERFACE); 1048d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff RECORD(TYPE_OBJC_OBJECT_POINTER); 1049b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_DECLTYPE); 1050b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_ELABORATED); 1051b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM); 1052b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_UNRESOLVED_USING); 1053b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_INJECTED_CLASS_NAME); 1054b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_OBJC_OBJECT); 1055b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_TEMPLATE_TYPE_PARM); 1056b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_TEMPLATE_SPECIALIZATION); 1057b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_DEPENDENT_NAME); 1058b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION); 1059b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_DEPENDENT_SIZED_ARRAY); 1060b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_PAREN); 1061b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_PACK_EXPANSION); 1062b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_ATTRIBUTED); 1063b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK); 1064176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(TYPE_AUTO); 1065176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(TYPE_UNARY_TRANSFORM); 1066b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman RECORD(TYPE_ATOMIC); 1067176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(TYPE_DECAYED); 1068176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(TYPE_ADJUSTED); 106987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(LOCAL_REDECLARATIONS); 10700ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_TYPEDEF); 1071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RECORD(DECL_TYPEALIAS); 10720ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_ENUM); 10730ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_RECORD); 10740ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_ENUM_CONSTANT); 10750ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_FUNCTION); 10760ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_METHOD); 10770ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_INTERFACE); 10780ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_PROTOCOL); 10790ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_IVAR); 10800ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_AT_DEFS_FIELD); 10810ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_CATEGORY); 10820ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_CATEGORY_IMPL); 10830ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_IMPLEMENTATION); 10840ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_COMPATIBLE_ALIAS); 10850ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_PROPERTY); 10860ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_OBJC_PROPERTY_IMPL); 1087b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(DECL_FIELD); 108876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall RECORD(DECL_MS_PROPERTY); 1089b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(DECL_VAR); 10900ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_IMPLICIT_PARAM); 1091b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner RECORD(DECL_PARM_VAR); 10920ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_FILE_SCOPE_ASM); 10930ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_BLOCK); 10940ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_CONTEXT_LEXICAL); 10950ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner RECORD(DECL_CONTEXT_VISIBLE); 1096b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_NAMESPACE); 1097b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_NAMESPACE_ALIAS); 1098b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_USING); 1099b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_USING_SHADOW); 1100b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_USING_DIRECTIVE); 1101b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_UNRESOLVED_USING_VALUE); 1102b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_UNRESOLVED_USING_TYPENAME); 1103b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_LINKAGE_SPEC); 1104b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_CXX_RECORD); 1105b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_CXX_METHOD); 1106b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_CXX_CONSTRUCTOR); 11074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_CXX_INHERITED_CONSTRUCTOR); 1108b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_CXX_DESTRUCTOR); 1109b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_CXX_CONVERSION); 1110b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_ACCESS_SPEC); 1111b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_FRIEND); 1112b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_FRIEND_TEMPLATE); 1113b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_CLASS_TEMPLATE); 1114b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_CLASS_TEMPLATE_SPECIALIZATION); 1115b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION); 1116ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo RECORD(DECL_VAR_TEMPLATE); 1117ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo RECORD(DECL_VAR_TEMPLATE_SPECIALIZATION); 1118ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo RECORD(DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION); 1119b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_FUNCTION_TEMPLATE); 1120b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_TEMPLATE_TYPE_PARM); 1121b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_NON_TYPE_TEMPLATE_PARM); 1122b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_TEMPLATE_TEMPLATE_PARM); 11234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_TYPE_ALIAS_TEMPLATE); 1124b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_STATIC_ASSERT); 1125b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_CXX_BASE_SPECIFIERS); 11264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_CXX_CTOR_INITIALIZERS); 1127b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_INDIRECTFIELD); 1128b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor RECORD(DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK); 11294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK); 11304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_CLASS_SCOPE_FUNCTION_SPECIALIZATION); 11314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_IMPORT); 11324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_OMP_THREADPRIVATE); 11334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_EMPTY); 11344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_OBJC_TYPE_PARAM); 11354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_OMP_CAPTUREDEXPR); 11364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_PRAGMA_COMMENT); 11374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_PRAGMA_DETECT_MISMATCH); 11384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RECORD(DECL_OMP_DECLARE_REDUCTION); 1139b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 1140a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor // Statements and Exprs can occur in the Decls and Types block. 1141a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor AddStmtsExprs(Stream, Record); 1142a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor 11434800a5c79023271408af49797e09be32aca93232Douglas Gregor BLOCK(PREPROCESSOR_DETAIL_BLOCK); 1144f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth RECORD(PPD_MACRO_EXPANSION); 11454800a5c79023271408af49797e09be32aca93232Douglas Gregor RECORD(PPD_MACRO_DEFINITION); 11464800a5c79023271408af49797e09be32aca93232Douglas Gregor RECORD(PPD_INCLUSION_DIRECTIVE); 114787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 114887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Decls and Types block. 114987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BLOCK(EXTENSION_BLOCK); 115087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RECORD(EXTENSION_METADATA); 115187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1152b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#undef RECORD 1153b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#undef BLOCK 1154b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner Stream.ExitBlock(); 1155b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner} 1156b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 11570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// \brief Prepares a path for being written to an AST file by converting it 11580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// to an absolute path and removing nested './'s. 11590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// 11600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// \return \c true if the path was changed. 11610e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic bool cleanPathForOutput(FileManager &FileMgr, 11620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallVectorImpl<char> &Path) { 116387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool Changed = FileMgr.makeAbsolutePath(Path); 116487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Changed | llvm::sys::path::remove_dots(Path); 11650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 11660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1167e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// \brief Adjusts the given filename to only write out the portion of the 1168e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// filename that is not part of the system root directory. 11691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 1170e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// \param Filename the file name to adjust. 1171e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// 11720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// \param BaseDir When non-NULL, the PCH file is a relocatable AST file and 11730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// the returned filename will be adjusted by this root directory. 1174e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// 1175e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// \returns either the original filename (if it needs no adjustment) or the 1176e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor/// adjusted filename (which points into the @p Filename parameter). 11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic const char * 11780e2c34f92f00628d48968dfea096d36381f494cbStephen HinesadjustFilenameForRelocatableAST(const char *Filename, StringRef BaseDir) { 1179e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor assert(Filename && "No file name to adjust?"); 11801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (BaseDir.empty()) 1182e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor return Filename; 11831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1184e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor // Verify that the filename and the system root have the same prefix. 1185e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor unsigned Pos = 0; 11860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (; Filename[Pos] && Pos < BaseDir.size(); ++Pos) 11870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Filename[Pos] != BaseDir[Pos]) 1188e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor return Filename; // Prefixes don't match. 11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1190e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor // We hit the end of the filename before we hit the end of the system root. 1191e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor if (!Filename[Pos]) 1192e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor return Filename; 11931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // If there's not a path separator at the end of the base directory nor 11950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // immediately after it, then this isn't within the base directory. 11960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!llvm::sys::path::is_separator(Filename[Pos])) { 11970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!llvm::sys::path::is_separator(BaseDir.back())) 11980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return Filename; 11990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } else { 12000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // If the file name has a '/' at the current position, skip over the '/'. 12010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // We distinguish relative paths from absolute paths by the 12020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // absence of '/' at the beginning of relative paths. 12030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // 12040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: This is wrong. We distinguish them by asking if the path is 12050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // absolute, which isn't the same thing. And there might be multiple '/'s 12060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // in a row. Use a better mechanism to indicate whether we have emitted an 12070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // absolute or relative path. 1208e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor ++Pos; 12090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 12101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1211e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor return Filename + Pos; 1212e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor} 1213b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 1214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic ASTFileSignature getSignature() { 1215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (1) { 1216176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (ASTFileSignature S = llvm::sys::Process::GetRandomNumber()) 1217176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return S; 1218176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Rely on GetRandomNumber to eventually return non-zero... 1219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1220176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 1221176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 12221d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor/// \brief Write the control block. 122387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainaruint64_t ASTWriter::WriteControlBlock(Preprocessor &PP, 122487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTContext &Context, 122587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar StringRef isysroot, 122687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const std::string &OutputFile) { 122787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTFileSignature Signature = 0; 122887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 12292bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor using namespace llvm; 12307ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor Stream.EnterSubblock(CONTROL_BLOCK_ID, 5); 12317ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor RecordData Record; 12321d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor 1233e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor // Metadata 123487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *MetadataAbbrev = new BitCodeAbbrev(); 12357ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor MetadataAbbrev->Add(BitCodeAbbrevOp(METADATA)); 12367ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Major 12377ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Minor 12387ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Clang maj. 12397ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Clang min. 12407ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Relocatable 124187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Timestamps 12427ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Errors 12437ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // SVN branch/tag 12447ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor unsigned MetadataAbbrevCode = Stream.EmitAbbrev(MetadataAbbrev); 12450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines assert((!WritingModule || isysroot.empty()) && 12460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines "writing module as a relocatable PCH?"); 124787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 124887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {METADATA, VERSION_MAJOR, VERSION_MINOR, 124987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CLANG_VERSION_MAJOR, CLANG_VERSION_MINOR, 125087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar !isysroot.empty(), IncludeTimestamps, 125187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTHasCompilerErrors}; 125287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(MetadataAbbrevCode, Record, 125387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getClangFullRepositoryVersion()); 125487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 12556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (WritingModule) { 12563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // For implicit modules we output a signature that we can use to ensure 12573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // duplicate module builds don't collide in the cache as their output order 12583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // is non-deterministic. 12593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // FIXME: Remove this when output is deterministic. 12603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Context.getLangOpts().ImplicitModules) { 126187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Signature = getSignature(); 126287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {Signature}; 12633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Stream.EmitRecord(SIGNATURE, Record); 12643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 12653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 12660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Module name 126787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 12686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Abbrev->Add(BitCodeAbbrevOp(MODULE_NAME)); 12696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 12706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); 127187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {MODULE_NAME}; 12726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Stream.EmitRecordWithBlob(AbbrevCode, Record, WritingModule->Name); 12736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 12746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 12750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (WritingModule && WritingModule->Directory) { 12760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallString<128> BaseDir(WritingModule->Directory->getName()); 12770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines cleanPathForOutput(Context.getSourceManager().getFileManager(), BaseDir); 127887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 127987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // If the home of the module is the current working directory, then we 128087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // want to pick up the cwd of the build process loading the module, not 128187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // our cwd, when we load this module. 128287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!PP.getHeaderSearchInfo() 128387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar .getHeaderSearchOpts() 128487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar .ModuleMapFileHomeIsCwd || 128587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar WritingModule->Directory->getName() != StringRef(".")) { 128687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Module directory. 128787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 128887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Abbrev->Add(BitCodeAbbrevOp(MODULE_DIRECTORY)); 128987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Directory 129087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); 129187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 129287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {MODULE_DIRECTORY}; 129387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(AbbrevCode, Record, BaseDir); 129487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 12950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 12960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Write out all other paths relative to the base directory if possible. 12970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines BaseDirectory.assign(BaseDir.begin(), BaseDir.end()); 12980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } else if (!isysroot.empty()) { 12990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Write out paths relative to the sysroot if possible. 13000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines BaseDirectory = isysroot; 13010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 13020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 13036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Module map file 13046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (WritingModule) { 1305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Record.clear(); 13066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 1308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Primary module map file. 13100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines AddPath(Map.getModuleMapFileForUniquing(WritingModule)->getName(), Record); 1311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Additional module map files. 13130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (auto *AdditionalModMaps = 13140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Map.getAdditionalModuleMapFiles(WritingModule)) { 1315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Record.push_back(AdditionalModMaps->size()); 1316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const FileEntry *F : *AdditionalModMaps) 13170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines AddPath(F->getName(), Record); 1318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 1319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Record.push_back(0); 1320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Stream.EmitRecord(MODULE_MAP_FILE, Record); 13236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 13246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 13251d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor // Imports 1326e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor if (Chain) { 1327e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor serialization::ModuleManager &Mgr = Chain->getModuleManager(); 1328e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor Record.clear(); 132910bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor 13303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto *M : Mgr) { 133110bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor // Skip modules that weren't directly imported. 13323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!M->isDirectlyImported()) 133310bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor continue; 133410bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor 13353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Record.push_back((unsigned)M->Kind); // FIXME: Stable encoding 13363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar AddSourceLocation(M->ImportLoc, Record); 13373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Record.push_back(M->File->getSize()); 133887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(getTimestampForOutput(M->File)); 13393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Record.push_back(M->Signature); 13403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar AddPath(M->FileName, Record); 134110bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor } 1342e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor Stream.EmitRecord(IMPORTS, Record); 1343e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor } 13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 134587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Write the options block. 134687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EnterSubblock(OPTIONS_BLOCK_ID, 4); 134787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 13481d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor // Language options. 13491d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor Record.clear(); 13501d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor const LangOptions &LangOpts = Context.getLangOpts(); 13511d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor#define LANGOPT(Name, Bits, Default, Description) \ 13521d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor Record.push_back(LangOpts.Name); 13531d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 13541d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor Record.push_back(static_cast<unsigned>(LangOpts.get##Name())); 1355176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Basic/LangOptions.def" 1356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define SANITIZER(NAME, ID) \ 1357176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID)); 13584f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz#include "clang/Basic/Sanitizers.def" 13591d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor 136087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(LangOpts.ModuleFeatures.size()); 136187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (StringRef Feature : LangOpts.ModuleFeatures) 136287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddString(Feature, Record); 136387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 13641d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor Record.push_back((unsigned) LangOpts.ObjCRuntime.getKind()); 13651d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor AddVersionTuple(LangOpts.ObjCRuntime.getVersion(), Record); 136687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 136787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddString(LangOpts.CurrentModule, Record); 13686ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 13696ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko // Comment options. 13706ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko Record.push_back(LangOpts.CommentOpts.BlockCommandNames.size()); 137187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &I : LangOpts.CommentOpts.BlockCommandNames) { 137287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddString(I, Record); 13736ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko } 13746fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko Record.push_back(LangOpts.CommentOpts.ParseAllComments); 13756ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 13764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // OpenMP offloading options. 13774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.push_back(LangOpts.OMPTargetTriples.size()); 13784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto &T : LangOpts.OMPTargetTriples) 13794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddString(T.getTriple(), Record); 13804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddString(LangOpts.OMPHostIRFile, Record); 13824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13831d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor Stream.EmitRecord(LANGUAGE_OPTIONS, Record); 13841d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor 1385ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor // Target options. 1386ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor Record.clear(); 13877ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor const TargetInfo &Target = Context.getTargetInfo(); 13887ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor const TargetOptions &TargetOpts = Target.getTargetOpts(); 1389ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor AddString(TargetOpts.Triple, Record); 1390ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor AddString(TargetOpts.CPU, Record); 1391ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor AddString(TargetOpts.ABI, Record); 1392ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor Record.push_back(TargetOpts.FeaturesAsWritten.size()); 1393ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor for (unsigned I = 0, N = TargetOpts.FeaturesAsWritten.size(); I != N; ++I) { 1394ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor AddString(TargetOpts.FeaturesAsWritten[I], Record); 1395ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor } 1396ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor Record.push_back(TargetOpts.Features.size()); 1397ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor for (unsigned I = 0, N = TargetOpts.Features.size(); I != N; ++I) { 1398ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor AddString(TargetOpts.Features[I], Record); 1399ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor } 1400ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor Stream.EmitRecord(TARGET_OPTIONS, Record); 1401ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor 14025f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor // Diagnostic options. 14035f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor Record.clear(); 14045f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor const DiagnosticOptions &DiagOpts 14055f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor = Context.getDiagnostics().getDiagnosticOptions(); 14065f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor#define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name); 14075f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor#define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 14085f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor Record.push_back(static_cast<unsigned>(DiagOpts.get##Name())); 14095f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor#include "clang/Basic/DiagnosticOptions.def" 14105f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor Record.push_back(DiagOpts.Warnings.size()); 14115f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor for (unsigned I = 0, N = DiagOpts.Warnings.size(); I != N; ++I) 14125f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor AddString(DiagOpts.Warnings[I], Record); 1413176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Record.push_back(DiagOpts.Remarks.size()); 1414176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (unsigned I = 0, N = DiagOpts.Remarks.size(); I != N; ++I) 1415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddString(DiagOpts.Remarks[I], Record); 14165f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor // Note: we don't serialize the log or serialization file names, because they 14175f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor // are generally transient files and will almost always be overridden. 14185f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor Stream.EmitRecord(DIAGNOSTIC_OPTIONS, Record); 14195f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor 14201b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor // File system options. 14211b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor Record.clear(); 142287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const FileSystemOptions &FSOpts = 142387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Context.getSourceManager().getFileManager().getFileSystemOpts(); 14241b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor AddString(FSOpts.WorkingDir, Record); 14251b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor Stream.EmitRecord(FILE_SYSTEM_OPTIONS, Record); 14261b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor 1427bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor // Header search options. 1428bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.clear(); 1429bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor const HeaderSearchOptions &HSOpts 1430bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor = PP.getHeaderSearchInfo().getHeaderSearchOpts(); 1431bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor AddString(HSOpts.Sysroot, Record); 1432bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor 1433bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor // Include entries. 1434bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(HSOpts.UserEntries.size()); 1435bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor for (unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) { 1436bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I]; 1437bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor AddString(Entry.Path, Record); 1438bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(static_cast<unsigned>(Entry.Group)); 1439bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(Entry.IsFramework); 1440bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(Entry.IgnoreSysRoot); 1441bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor } 1442bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor 1443bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor // System header prefixes. 1444bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(HSOpts.SystemHeaderPrefixes.size()); 1445bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor for (unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) { 1446bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor AddString(HSOpts.SystemHeaderPrefixes[I].Prefix, Record); 1447bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader); 1448bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor } 1449bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor 1450bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor AddString(HSOpts.ResourceDir, Record); 1451bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor AddString(HSOpts.ModuleCachePath, Record); 1452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AddString(HSOpts.ModuleUserBuildPath, Record); 1453bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(HSOpts.DisableModuleHash); 1454bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(HSOpts.UseBuiltinIncludes); 1455bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(HSOpts.UseStandardSystemIncludes); 1456bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(HSOpts.UseStandardCXXIncludes); 1457bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Record.push_back(HSOpts.UseLibcxx); 14580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Write out the specific module cache path that contains the module files. 14590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines AddString(PP.getHeaderSearchInfo().getModuleCachePath(), Record); 1460bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor Stream.EmitRecord(HEADER_SEARCH_OPTIONS, Record); 1461bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor 1462a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor // Preprocessor options. 1463a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor Record.clear(); 1464a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor const PreprocessorOptions &PPOpts = PP.getPreprocessorOpts(); 1465a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor 1466a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor // Macro definitions. 1467a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor Record.push_back(PPOpts.Macros.size()); 1468a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 1469a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor AddString(PPOpts.Macros[I].first, Record); 1470a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor Record.push_back(PPOpts.Macros[I].second); 1471a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor } 1472a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor 1473a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor // Includes 1474a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor Record.push_back(PPOpts.Includes.size()); 1475a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor for (unsigned I = 0, N = PPOpts.Includes.size(); I != N; ++I) 1476a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor AddString(PPOpts.Includes[I], Record); 1477a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor 1478a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor // Macro includes 1479a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor Record.push_back(PPOpts.MacroIncludes.size()); 1480a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor for (unsigned I = 0, N = PPOpts.MacroIncludes.size(); I != N; ++I) 1481a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor AddString(PPOpts.MacroIncludes[I], Record); 1482a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor 14834c0c7e86645dfa1719d17d70e009ab49347aba62Douglas Gregor Record.push_back(PPOpts.UsePredefines); 148465110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis // Detailed record is important since it is used for the module cache hash. 148565110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis Record.push_back(PPOpts.DetailedRecord); 1486a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor AddString(PPOpts.ImplicitPCHInclude, Record); 1487a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor AddString(PPOpts.ImplicitPTHInclude, Record); 1488a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor Record.push_back(static_cast<unsigned>(PPOpts.ObjCXXARCStandardLibrary)); 1489a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor Stream.EmitRecord(PREPROCESSOR_OPTIONS, Record); 1490a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor 149187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Leave the options block. 149287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.ExitBlock(); 149387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 149431d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor // Original file name and file ID 1495b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor SourceManager &SM = Context.getSourceManager(); 1496b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) { 149787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *FileAbbrev = new BitCodeAbbrev(); 149839c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor FileAbbrev->Add(BitCodeAbbrevOp(ORIGINAL_FILE)); 149939c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // File ID 1500b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name 1501b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor unsigned FileAbbrevCode = Stream.EmitAbbrev(FileAbbrev); 1502b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor 1503a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor Record.clear(); 150439c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor Record.push_back(ORIGINAL_FILE); 150539c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor Record.push_back(SM.getMainFileID().getOpaqueValue()); 15060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines EmitRecordWithPath(FileAbbrevCode, Record, MainFile->getName()); 1507b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor } 150811a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam 1509992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis Record.clear(); 1510992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis Record.push_back(SM.getMainFileID().getOpaqueValue()); 1511992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis Stream.EmitRecord(ORIGINAL_FILE_ID, Record); 1512992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis 15138e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis // Original PCH directory 15148e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis if (!OutputFile.empty() && OutputFile != "-") { 151587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 15168e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(ORIGINAL_PCH_DIR)); 15178e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name 15188e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); 15198e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 1520f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> OutputPath(OutputFile); 15218e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 152287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SM.getFileManager().makeAbsolutePath(OutputPath); 15238e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis StringRef origDir = llvm::sys::path::parent_path(OutputPath); 15248e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 152587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {ORIGINAL_PCH_DIR}; 15268e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis Stream.EmitRecordWithBlob(AbbrevCode, Record, origDir); 15278e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis } 15288e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 15294a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor WriteInputFiles(Context.SourceMgr, 15304a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor PP.getHeaderSearchInfo().getHeaderSearchOpts(), 1531b22d19493d479bf3ed6e5e60bfcf7047823da7fcDouglas Gregor PP.getLangOpts().Modules); 1532745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor Stream.ExitBlock(); 153387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Signature; 1534745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor} 1535745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor 15364a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregornamespace { 15374a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor /// \brief An input file. 15384a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor struct InputFileEntry { 15394a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor const FileEntry *File; 15404a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor bool IsSystemFile; 154187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool IsTransient; 15424a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor bool BufferOverridden; 15434a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor }; 154487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end anonymous namespace 15454a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor 15464a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregorvoid ASTWriter::WriteInputFiles(SourceManager &SourceMgr, 15474a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor HeaderSearchOptions &HSOpts, 1548b22d19493d479bf3ed6e5e60bfcf7047823da7fcDouglas Gregor bool Modules) { 1549745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor using namespace llvm; 1550745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor Stream.EnterSubblock(INPUT_FILES_BLOCK_ID, 4); 155187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1552745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor // Create input-file abbreviation. 155387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *IFAbbrev = new BitCodeAbbrev(); 1554745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor IFAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE)); 1555a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ID 1556745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12)); // Size 1557745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32)); // Modification time 1558a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Overridden 155987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Transient 1560745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name 1561745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor unsigned IFAbbrevCode = Stream.EmitAbbrev(IFAbbrev); 1562745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor 1563398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis // Get all ContentCache objects for files, sorted by whether the file is a 1564398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis // system one or not. System files go at the back, users files at the front. 15654a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor std::deque<InputFileEntry> SortedFiles; 1566745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor for (unsigned I = 1, N = SourceMgr.local_sloc_entry_size(); I != N; ++I) { 1567745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor // Get this source location entry. 1568745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor const SrcMgr::SLocEntry *SLoc = &SourceMgr.getLocalSLocEntry(I); 1569bacc2c543c2236c5add893fabd8ecb798c1cdd76NAKAMURA Takumi assert(&SourceMgr.getSLocEntry(FileID::get(I)) == SLoc); 1570745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor 1571745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor // We only care about file entries that were not overridden. 1572745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor if (!SLoc->isFile()) 1573745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor continue; 1574745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor const SrcMgr::ContentCache *Cache = SLoc->getFile().getContentCache(); 1575a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor if (!Cache->OrigEntry) 1576745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor continue; 1577745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor 15784a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor InputFileEntry Entry; 15794a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor Entry.File = Cache->OrigEntry; 15804a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor Entry.IsSystemFile = Cache->IsSystemFile; 158187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Entry.IsTransient = Cache->IsTransient; 15824a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor Entry.BufferOverridden = Cache->BufferOverridden; 1583398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis if (Cache->IsSystemFile) 15844a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor SortedFiles.push_back(Entry); 1585398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis else 15864a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor SortedFiles.push_front(Entry); 15874a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor } 15884a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor 1589398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis unsigned UserFilesNum = 0; 1590398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis // Write out all of the input files. 15910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines std::vector<uint64_t> InputFileOffsets; 159287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &Entry : SortedFiles) { 15934a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor uint32_t &InputFileID = InputFileIDs[Entry.File]; 1594a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis if (InputFileID != 0) 1595a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis continue; // already recorded this file. 1596a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis 1597a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor // Record this entry's offset. 1598a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor InputFileOffsets.push_back(Stream.GetCurrentBitNo()); 1599a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis 1600a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis InputFileID = InputFileOffsets.size(); 1601a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor 16024a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor if (!Entry.IsSystemFile) 1603398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis ++UserFilesNum; 1604398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis 1605745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor // Emit size/modification time for this file. 160687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // And whether this file was overridden. 160787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = { 160887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar INPUT_FILE, 160987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar InputFileOffsets.size(), 161087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (uint64_t)Entry.File->getSize(), 161187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (uint64_t)getTimestampForOutput(Entry.File), 161287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Entry.BufferOverridden, 161387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Entry.IsTransient}; 1614a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor 16150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines EmitRecordWithPath(IFAbbrevCode, Record, Entry.File->getName()); 16160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 16174a18c3b25a2d7eb7f770ce91ee5e14433b2a1cb6Douglas Gregor 16181d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor Stream.ExitBlock(); 1619a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor 1620a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor // Create input file offsets abbreviation. 162187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *OffsetsAbbrev = new BitCodeAbbrev(); 1622a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor OffsetsAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE_OFFSETS)); 1623a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # input files 1624398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # non-system 1625398253ab0e0dedc6f5ddb1bad2ac6a084d0d88a8Argyrios Kyrtzidis // input files 1626a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Array 1627a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(OffsetsAbbrev); 1628a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor 1629a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor // Write input file offsets. 163087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {INPUT_FILE_OFFSETS, 163187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar InputFileOffsets.size(), UserFilesNum}; 1632b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stream.EmitRecordWithBlob(OffsetsAbbrevCode, Record, bytes(InputFileOffsets)); 16330a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor} 16340a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 163514f79002e58556798e86168c63e48d533287eda5Douglas Gregor//===----------------------------------------------------------------------===// 163614f79002e58556798e86168c63e48d533287eda5Douglas Gregor// Source Manager Serialization 163714f79002e58556798e86168c63e48d533287eda5Douglas Gregor//===----------------------------------------------------------------------===// 163814f79002e58556798e86168c63e48d533287eda5Douglas Gregor 163914f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// \brief Create an abbreviation for the SLocEntry that refers to a 164014f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// file. 1641c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregorstatic unsigned CreateSLocFileAbbrev(llvm::BitstreamWriter &Stream) { 164214f79002e58556798e86168c63e48d533287eda5Douglas Gregor using namespace llvm; 164387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 164487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 16458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_FILE_ENTRY)); 164614f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset 164714f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Include location 164814f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Characteristic 164914f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Line directives 16502d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor // FileEntry fields. 1651a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Input File ID 1652d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // NumCreatedFIDs 165310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24)); // FirstDeclIndex 165410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // NumDecls 1655c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor return Stream.EmitAbbrev(Abbrev); 165614f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 165714f79002e58556798e86168c63e48d533287eda5Douglas Gregor 165814f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// \brief Create an abbreviation for the SLocEntry that refers to a 165914f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// buffer. 1660c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregorstatic unsigned CreateSLocBufferAbbrev(llvm::BitstreamWriter &Stream) { 166114f79002e58556798e86168c63e48d533287eda5Douglas Gregor using namespace llvm; 166287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 166387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 16648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_BUFFER_ENTRY)); 166514f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset 166614f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Include location 166714f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Characteristic 166814f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Line directives 166914f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Buffer name blob 1670c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor return Stream.EmitAbbrev(Abbrev); 167114f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 167214f79002e58556798e86168c63e48d533287eda5Douglas Gregor 167314f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// \brief Create an abbreviation for the SLocEntry that refers to a 167414f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// buffer's blob. 16754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic unsigned CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter &Stream, 16764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool Compressed) { 167714f79002e58556798e86168c63e48d533287eda5Douglas Gregor using namespace llvm; 167887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 167987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 16804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Abbrev->Add(BitCodeAbbrevOp(Compressed ? SM_SLOC_BUFFER_BLOB_COMPRESSED 16814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : SM_SLOC_BUFFER_BLOB)); 16824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Compressed) 16834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Uncompressed size 168414f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Blob 1685c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor return Stream.EmitAbbrev(Abbrev); 168614f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 168714f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1688f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth/// \brief Create an abbreviation for the SLocEntry that refers to a macro 1689f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth/// expansion. 1690f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruthstatic unsigned CreateSLocExpansionAbbrev(llvm::BitstreamWriter &Stream) { 169114f79002e58556798e86168c63e48d533287eda5Douglas Gregor using namespace llvm; 169287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 169387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 1694f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_EXPANSION_ENTRY)); 169514f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset 169614f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Spelling location 169714f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Start location 169814f79002e58556798e86168c63e48d533287eda5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // End location 1699f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Token length 1700c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor return Stream.EmitAbbrev(Abbrev); 170114f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 170214f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1703cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregornamespace { 1704cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor // Trait used for the on-disk hash table of header search information. 1705cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor class HeaderFileInfoTrait { 1706cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor ASTWriter &Writer; 170755ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis const HeaderSearch &HS; 1708cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1709b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor // Keep track of the framework names we've used during serialization. 1710b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor SmallVector<char, 128> FrameworkStringData; 1711b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor llvm::StringMap<unsigned> FrameworkNameOffset; 1712b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1713cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor public: 171455ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis HeaderFileInfoTrait(ASTWriter &Writer, const HeaderSearch &HS) 171555ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis : Writer(Writer), HS(HS) { } 1716cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1717ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis struct key_type { 1718ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis const FileEntry *FE; 1719ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis const char *Filename; 1720ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis }; 1721ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis typedef const key_type &key_type_ref; 1722cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1723cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor typedef HeaderFileInfo data_type; 1724cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor typedef const data_type &data_type_ref; 17256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef unsigned hash_value_type; 17266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef unsigned offset_type; 1727cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 172887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar hash_value_type ComputeHash(key_type_ref key) { 1729ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis // The hash is based only on size/time of the file, so that the reader can 1730ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis // match even when symlinking or excess path elements ("foo/../", "../") 1731ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis // change the form of the name. However, complete path is still the key. 1732ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis return llvm::hash_combine(key.FE->getSize(), 173387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Writer.getTimestampForOutput(key.FE)); 1734cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1735cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1736cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor std::pair<unsigned,unsigned> 1737ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref Data) { 1738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 173987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar endian::Writer<little> LE(Out); 1740ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis unsigned KeyLen = strlen(key.Filename) + 1 + 8 + 8; 174187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint16_t>(KeyLen); 1742b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor unsigned DataLen = 1 + 2 + 4 + 4; 174387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto ModInfo : HS.getModuleMap().findAllModulesForHeader(key.FE)) 174487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Writer.getLocalOrImportedSubmoduleID(ModInfo.getModule())) 174587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DataLen += 4; 174687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint8_t>(DataLen); 1747ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis return std::make_pair(KeyLen, DataLen); 1748cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1749cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1750ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis void EmitKey(raw_ostream& Out, key_type_ref key, unsigned KeyLen) { 1751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 1752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 1753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint64_t>(key.FE->getSize()); 1754ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis KeyLen -= 8; 175587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint64_t>(Writer.getTimestampForOutput(key.FE)); 1756ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis KeyLen -= 8; 1757ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis Out.write(key.Filename, KeyLen); 1758cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1759cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 176055ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis void EmitData(raw_ostream &Out, key_type_ref key, 1761cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor data_type_ref Data, unsigned DataLen) { 1762651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 1763651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 1764cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor uint64_t Start = Out.tell(); (void)Start; 1765cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 176687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned char Flags = (Data.isImport << 4) 176787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar | (Data.isPragmaOnce << 3) 176887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar | (Data.DirInfo << 1) 1769b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor | Data.IndexHeaderMapHeader; 1770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint8_t>(Flags); 1771651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(Data.NumIncludes); 1772cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1773cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (!Data.ControllingMacro) 1774651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint32_t>(Data.ControllingMacroID); 1775cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor else 1776651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint32_t>(Writer.getIdentifierRef(Data.ControllingMacro)); 1777b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1778b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor unsigned Offset = 0; 1779b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor if (!Data.Framework.empty()) { 1780b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor // If this header refers into a framework, save the framework name. 1781b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor llvm::StringMap<unsigned>::iterator Pos 1782b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor = FrameworkNameOffset.find(Data.Framework); 1783b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor if (Pos == FrameworkNameOffset.end()) { 1784b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor Offset = FrameworkStringData.size() + 1; 1785b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor FrameworkStringData.append(Data.Framework.begin(), 1786b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor Data.Framework.end()); 1787b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor FrameworkStringData.push_back(0); 1788b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1789b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor FrameworkNameOffset[Data.Framework] = Offset; 1790b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor } else 1791b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor Offset = Pos->second; 1792b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor } 1793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint32_t>(Offset); 179455ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis 179587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: If the header is excluded, we should write out some 179687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // record of that fact. 179787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto ModInfo : HS.getModuleMap().findAllModulesForHeader(key.FE)) { 179887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (uint32_t ModID = 179987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Writer.getLocalOrImportedSubmoduleID(ModInfo.getModule())) { 180087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar uint32_t Value = (ModID << 2) | (unsigned)ModInfo.getRole(); 180187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert((Value >> 2) == ModID && "overflow in header module info"); 180287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint32_t>(Value); 180387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 180455ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis } 180555ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis 1806cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor assert(Out.tell() - Start == DataLen && "Wrong data length"); 1807cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1808b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1809b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor const char *strings_begin() const { return FrameworkStringData.begin(); } 1810b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor const char *strings_end() const { return FrameworkStringData.end(); } 1811cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor }; 1812cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor} // end anonymous namespace 1813cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1814cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/// \brief Write the header search block for the list of files that 1815cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/// 1816cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/// \param HS The header search structure to save. 18170e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid ASTWriter::WriteHeaderSearch(const HeaderSearch &HS) { 18185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<const FileEntry *, 16> FilesByUID; 1819cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor HS.getFileMgr().GetUniqueIDMapping(FilesByUID); 1820cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1821cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (FilesByUID.size() > HS.header_file_size()) 1822cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor FilesByUID.resize(HS.header_file_size()); 1823cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 182455ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis HeaderFileInfoTrait GeneratorTrait(*this, HS); 18256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait> Generator; 18265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<const char *, 4> SavedStrings; 1827cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor unsigned NumHeaderSearchEntries = 0; 1828cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor for (unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) { 1829cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor const FileEntry *File = FilesByUID[UID]; 1830cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (!File) 1831cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor continue; 1832cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 183387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Get the file info. This will load info from the external source if 183487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // necessary. Skip emitting this file if we have no information on it 183587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // as a header file (in which case HFI will be null) or if it hasn't 183687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // changed since it was loaded. Also skip it if it's for a modular header 183787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // from a different module; in that case, we rely on the module(s) 183887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // containing the header to provide this information. 183987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const HeaderFileInfo *HFI = 184087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HS.getExistingFileInfo(File, /*WantExternal*/!Chain); 184187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!HFI || (HFI->isModuleHeader && !HFI->isCompilingModuleHeader)) 1842d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis continue; 1843cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 18440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Massage the file path into an appropriate form. 1845cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor const char *Filename = File->getName(); 18460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallString<128> FilenameTmp(Filename); 18470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (PreparePathForOutput(FilenameTmp)) { 18480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // If we performed any translation on the file name at all, we need to 18490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // save this string, since the generator will refer to it later. 18500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Filename = strdup(FilenameTmp.c_str()); 1851cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor SavedStrings.push_back(Filename); 1852cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 18530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1854ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis HeaderFileInfoTrait::key_type key = { File, Filename }; 185587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Generator.insert(key, *HFI, GeneratorTrait); 1856cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor ++NumHeaderSearchEntries; 1857cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1858cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1859cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor // Create the on-disk hash table in a buffer. 1860f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<4096> TableData; 1861cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor uint32_t BucketOffset; 1862cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor { 1863651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 1864cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor llvm::raw_svector_ostream Out(TableData); 1865cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor // Make sure that no bucket is at offset 0 1866651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little>(Out).write<uint32_t>(0); 1867cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor BucketOffset = Generator.Emit(Out, GeneratorTrait); 1868cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1869cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1870cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor // Create a blob abbreviation 1871cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor using namespace llvm; 187287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 187387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 1874cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(HEADER_SEARCH_TABLE)); 1875cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 1876cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 1877b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 1878cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 1879cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor unsigned TableAbbrev = Stream.EmitAbbrev(Abbrev); 1880cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1881b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor // Write the header search table 188287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {HEADER_SEARCH_TABLE, BucketOffset, 188387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NumHeaderSearchEntries, TableData.size()}; 1884b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor TableData.append(GeneratorTrait.strings_begin(),GeneratorTrait.strings_end()); 18853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Stream.EmitRecordWithBlob(TableAbbrev, Record, TableData); 1886cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1887cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor // Free all of the strings we had to duplicate. 1888cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor for (unsigned I = 0, N = SavedStrings.size(); I != N; ++I) 1889644448393e5592563f5f53842e1b0c6299f31d6cDavid Greene free(const_cast<char *>(SavedStrings[I])); 1890cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor} 1891cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 189214f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// \brief Writes the block containing the serialized form of the 189314f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// source manager. 189414f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// 189514f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// TODO: We should probably use an on-disk hash table (stored in a 189614f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// blob), indexed based on the file name, so that we only create 189714f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// entries for files that we actually need. In the common case (no 189814f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// errors), we probably won't have to create file entries for any of 189914f79002e58556798e86168c63e48d533287eda5Douglas Gregor/// the files in the AST. 1900a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redlvoid ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, 19010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines const Preprocessor &PP) { 19027f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor RecordData Record; 19037f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 1904f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner // Enter the source manager block. 19054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stream.EnterSubblock(SOURCE_MANAGER_BLOCK_ID, 4); 190614f79002e58556798e86168c63e48d533287eda5Douglas Gregor 190714f79002e58556798e86168c63e48d533287eda5Douglas Gregor // Abbreviations for the various kinds of source-location entries. 1908828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner unsigned SLocFileAbbrv = CreateSLocFileAbbrev(Stream); 1909828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner unsigned SLocBufferAbbrv = CreateSLocBufferAbbrev(Stream); 19104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned SLocBufferBlobAbbrv = CreateSLocBufferBlobAbbrev(Stream, false); 19114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned SLocBufferBlobCompressedAbbrv = 19124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CreateSLocBufferBlobAbbrev(Stream, true); 1913f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth unsigned SLocExpansionAbbrv = CreateSLocExpansionAbbrev(Stream); 19147f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 191514f79002e58556798e86168c63e48d533287eda5Douglas Gregor // Write out the source location entry table. We skip the first 191614f79002e58556798e86168c63e48d533287eda5Douglas Gregor // entry, which is always the same dummy entry. 1917090d9b53e32bb30d9e74de895bb59b409bd49e00Chris Lattner std::vector<uint32_t> SLocEntryOffsets; 19187f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor RecordData PreloadSLocs; 1919f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor SLocEntryOffsets.reserve(SourceMgr.local_sloc_entry_size() - 1); 1920f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor for (unsigned I = 1, N = SourceMgr.local_sloc_entry_size(); 19210fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl I != N; ++I) { 1922bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor // Get this source location entry. 1923f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor const SrcMgr::SLocEntry *SLoc = &SourceMgr.getLocalSLocEntry(I); 1924a2ea4d94f2133aad0d864cf1327af142a47ffb09Argyrios Kyrtzidis FileID FID = FileID::get(I); 1925a2ea4d94f2133aad0d864cf1327af142a47ffb09Argyrios Kyrtzidis assert(&SourceMgr.getSLocEntry(FID) == SLoc); 192611a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam 19277f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor // Record the offset of this source-location entry. 19287f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor SLocEntryOffsets.push_back(Stream.GetCurrentBitNo()); 19297f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 193014f79002e58556798e86168c63e48d533287eda5Douglas Gregor // Figure out which record code to use. 193114f79002e58556798e86168c63e48d533287eda5Douglas Gregor unsigned Code; 193214f79002e58556798e86168c63e48d533287eda5Douglas Gregor if (SLoc->isFile()) { 1933a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor const SrcMgr::ContentCache *Cache = SLoc->getFile().getContentCache(); 1934a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor if (Cache->OrigEntry) { 19358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = SM_SLOC_FILE_ENTRY; 19364cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis } else 19378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Code = SM_SLOC_BUFFER_ENTRY; 193814f79002e58556798e86168c63e48d533287eda5Douglas Gregor } else 1939f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth Code = SM_SLOC_EXPANSION_ENTRY; 19407f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor Record.clear(); 194114f79002e58556798e86168c63e48d533287eda5Douglas Gregor Record.push_back(Code); 194214f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1943f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor // Starting offset of this entry within this module, so skip the dummy. 1944f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor Record.push_back(SLoc->getOffset() - 2); 194514f79002e58556798e86168c63e48d533287eda5Douglas Gregor if (SLoc->isFile()) { 194614f79002e58556798e86168c63e48d533287eda5Douglas Gregor const SrcMgr::FileInfo &File = SLoc->getFile(); 19474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(File.getIncludeLoc(), Record); 194814f79002e58556798e86168c63e48d533287eda5Douglas Gregor Record.push_back(File.getFileCharacteristic()); // FIXME: stable encoding 1949bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor Record.push_back(File.hasLineDirectives()); 195014f79002e58556798e86168c63e48d533287eda5Douglas Gregor 195114f79002e58556798e86168c63e48d533287eda5Douglas Gregor const SrcMgr::ContentCache *Content = File.getContentCache(); 19524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool EmitBlob = false; 1953b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis if (Content->OrigEntry) { 1954b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis assert(Content->OrigEntry == Content->ContentsEntry && 1955a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor "Writing to AST an overridden file is not supported"); 1956b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis 1957a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor // The source location entry is a file. Emit input file ID. 1958a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor assert(InputFileIDs[Content->OrigEntry] != 0 && "Missed file entry"); 1959a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor Record.push_back(InputFileIDs[Content->OrigEntry]); 19601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1961d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis Record.push_back(File.NumCreatedFIDs); 196210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 1963a2ea4d94f2133aad0d864cf1327af142a47ffb09Argyrios Kyrtzidis FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID); 196410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis if (FDI != FileDeclIDs.end()) { 196510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Record.push_back(FDI->second->FirstDeclIndex); 196610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Record.push_back(FDI->second->DeclIDs.size()); 196710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis } else { 196810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Record.push_back(0); 196910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Record.push_back(0); 197010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis } 1971a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor 1972a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor Stream.EmitRecordWithAbbrev(SLocFileAbbrv, Record); 1973a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor 19744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Content->BufferOverridden || Content->IsTransient) 19754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar EmitBlob = true; 197614f79002e58556798e86168c63e48d533287eda5Douglas Gregor } else { 197714f79002e58556798e86168c63e48d533287eda5Douglas Gregor // The source location entry is a buffer. The blob associated 197814f79002e58556798e86168c63e48d533287eda5Douglas Gregor // with this entry contains the contents of the buffer. 197914f79002e58556798e86168c63e48d533287eda5Douglas Gregor 198014f79002e58556798e86168c63e48d533287eda5Douglas Gregor // We add one to the size so that we capture the trailing NULL 198114f79002e58556798e86168c63e48d533287eda5Douglas Gregor // that is required by llvm::MemoryBuffer::getMemBuffer (on 198214f79002e58556798e86168c63e48d533287eda5Douglas Gregor // the reader side). 198336c35ba0aca641e60e5dbee8efbc620c08b9bd61Douglas Gregor const llvm::MemoryBuffer *Buffer 1984e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner = Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager()); 198514f79002e58556798e86168c63e48d533287eda5Douglas Gregor const char *Name = Buffer->getBufferIdentifier(); 1986ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar Stream.EmitRecordWithBlob(SLocBufferAbbrv, Record, 19875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef(Name, strlen(Name) + 1)); 19884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar EmitBlob = true; 19897f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 1990f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (strcmp(Name, "<built-in>") == 0) { 1991f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor PreloadSLocs.push_back(SLocEntryOffsets.size()); 1992f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor } 199314f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 19944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 19954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (EmitBlob) { 19964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Include the implicit terminating null character in the on-disk buffer 19974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // if we're writing it uncompressed. 19984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const llvm::MemoryBuffer *Buffer = 19994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager()); 20004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1); 20014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 20024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Compress the buffer if possible. We expect that almost all PCM 20034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // consumers will not want its contents. 20044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallString<0> CompressedBuffer; 20054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (llvm::zlib::compress(Blob.drop_back(1), CompressedBuffer) == 20064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::zlib::StatusOK) { 20074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RecordData::value_type Record[] = {SM_SLOC_BUFFER_BLOB_COMPRESSED, 20084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Blob.size() - 1}; 20094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv, Record, 20104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CompressedBuffer); 20114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 20124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RecordData::value_type Record[] = {SM_SLOC_BUFFER_BLOB}; 20134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record, Blob); 20144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 20154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 201614f79002e58556798e86168c63e48d533287eda5Douglas Gregor } else { 2017f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth // The source location entry is a macro expansion. 20181728762d5a8cfaf8d64385f47b311e84de1ae7a2Chandler Carruth const SrcMgr::ExpansionInfo &Expansion = SLoc->getExpansion(); 20194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(Expansion.getSpellingLoc(), Record); 20204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(Expansion.getExpansionLocStart(), Record); 20214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(Expansion.isMacroArgExpansion() 20224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ? SourceLocation() 20234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : Expansion.getExpansionLocEnd(), 20244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record); 202514f79002e58556798e86168c63e48d533287eda5Douglas Gregor 2026f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor // Compute the token length for this macro expansion. 2027f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor unsigned NextOffset = SourceMgr.getNextLocalOffset(); 2028bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor if (I + 1 != N) 2029f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor NextOffset = SourceMgr.getLocalSLocEntry(I + 1).getOffset(); 2030f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor Record.push_back(NextOffset - SLoc->getOffset() - 1); 2031f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv, Record); 203214f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 203314f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 203414f79002e58556798e86168c63e48d533287eda5Douglas Gregor 20357f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor Stream.ExitBlock(); 2036bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor 20377f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor if (SLocEntryOffsets.empty()) 20387f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor return; 20392eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor 20403397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl // Write the source-location offsets table into the AST block. This 20417f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor // table is used for lazily loading source-location information. 20427f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor using namespace llvm; 204387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 204487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 20458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(SOURCE_LOCATION_OFFSETS)); 20467f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // # of slocs 2047f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // total size 20487f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // offsets 20497f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(Abbrev); 205087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 205187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = { 205287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SOURCE_LOCATION_OFFSETS, SLocEntryOffsets.size(), 205387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceMgr.getNextLocalOffset() - 1 /* skip dummy */}; 205487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record, 205587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bytes(SLocEntryOffsets)); 205687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 20573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl // Write the source location entry preloads array, telling the AST 20587f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor // reader which source locations entries it should load eagerly. 20598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EmitRecord(SOURCE_LOCATION_PRELOADS, PreloadSLocs); 2060f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 2061f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor // Write the line table. It depends on remapping working, so it must come 2062f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor // after the source location offsets. 2063f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (SourceMgr.hasLineTable()) { 2064f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor LineTableInfo &LineTable = SourceMgr.getLineTable(); 2065f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 2066f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor Record.clear(); 206787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 206887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Emit the needed file names. 206987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::DenseMap<int, int> FilenameMap; 207087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &L : LineTable) { 207187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (L.first.ID < 0) 207287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar continue; 207387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto &LE : L.second) { 207487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FilenameMap.insert(std::make_pair(LE.FilenameID, 207587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FilenameMap.size())).second) 207687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddPath(LineTable.getFilename(LE.FilenameID), Record); 207787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 207887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 207987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(0); 2080f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 2081f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor // Emit the line entries 208287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &L : LineTable) { 2083f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor // Only emit entries for local files. 208487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (L.first.ID < 0) 2085f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor continue; 2086f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 2087f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor // Emit the file ID 208887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(L.first.ID); 2089f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 2090f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor // Emit the line entries 209187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(L.second.size()); 209287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &LE : L.second) { 209387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(LE.FileOffset); 209487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(LE.LineNo); 209587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(FilenameMap[LE.FilenameID]); 209687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back((unsigned)LE.FileKind); 209787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(LE.IncludeOffset); 2098f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor } 2099f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor } 210087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 2101f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor Stream.EmitRecord(SOURCE_MANAGER_LINE_TABLE, Record); 2102f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor } 210314f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 210414f79002e58556798e86168c63e48d533287eda5Douglas Gregor 21054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 21064fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor// Preprocessor Serialization 21074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 21084fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 21099cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidisstatic bool shouldIgnoreMacro(MacroDirective *MD, bool IsModule, 21109cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis const Preprocessor &PP) { 2111c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (MacroInfo *MI = MD->getMacroInfo()) 2112c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (MI->isBuiltinMacro()) 2113c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return true; 21149cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis 21159cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis if (IsModule) { 21169cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis SourceLocation Loc = MD->getLocation(); 21179cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis if (Loc.isInvalid()) 21189cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis return true; 21199cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis if (PP.getSourceManager().getFileID(Loc) == PP.getPredefinesFileID()) 21209cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis return true; 21219cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis } 21229cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis 21239cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis return false; 21249cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis} 21259cc3ed4e4d7f25b1af8ba7b85d324a0bb8747640Argyrios Kyrtzidis 21260b1fb988012da21d996c43e36867787a7a07b889Chris Lattner/// \brief Writes the block containing the serialized form of the 21270b1fb988012da21d996c43e36867787a7a07b889Chris Lattner/// preprocessor. 21280b1fb988012da21d996c43e36867787a7a07b889Chris Lattner/// 21297143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregorvoid ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) { 2130e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis PreprocessingRecord *PPRec = PP.getPreprocessingRecord(); 2131e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis if (PPRec) 2132e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis WritePreprocessorDetail(*PPRec); 2133e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 21347c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner RecordData Record; 2135b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar RecordData ModuleMacroRecord; 21367c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 2137c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner // If the preprocessor __COUNTER__ value has been bumped, remember it. 2138c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner if (PP.getCounterValue() != 0) { 213987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {PP.getCounterValue()}; 21408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EmitRecord(PP_COUNTER_VALUE, Record); 21412eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor } 21422eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor 21432eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor // Enter the preprocessor block. 2144ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor Stream.EnterSubblock(PREPROCESSOR_BLOCK_ID, 3); 21451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21463397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl // If the AST file contains __DATE__ or __TIME__ emit a warning about this. 214787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: Include a location for the use, and say which one was used. 21482eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor if (PP.SawDateOrTime()) 214987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PP.Diag(SourceLocation(), diag::warn_module_uses_date_time) << IsModule; 2150ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 21519317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Loop over all the macro directives that are live at the end of the file, 21527c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner // emitting each to the PP section. 215320249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 2154b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Construct the list of identifiers with macro directives that need to be 2155b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // serialized. 2156b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SmallVector<const IdentifierInfo *, 128> MacroIdentifiers; 2157b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (auto &Id : PP.getIdentifierTable()) 2158b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Id.second->hadMacroDefinition() && 2159b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar (!Id.second->isFromAST() || 2160b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Id.second->hasChangedSinceDeserialization())) 2161b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar MacroIdentifiers.push_back(Id.second); 21629c7361006b8cd95333958150dd0c803261807b68Douglas Gregor // Sort the set of macro definitions that need to be serialized by the 21639c7361006b8cd95333958150dd0c803261807b68Douglas Gregor // name of the macro, to provide a stable ordering. 2164b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar std::sort(MacroIdentifiers.begin(), MacroIdentifiers.end(), 2165b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::less_ptr<IdentifierInfo>()); 21669317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 21679317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Emit the macro directives as a list and associate the offset with the 21689317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // identifier they belong to. 2169b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const IdentifierInfo *Name : MacroIdentifiers) { 2170b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar MacroDirective *MD = PP.getLocalMacroDirectiveHistory(Name); 2171b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto StartOffset = Stream.GetCurrentBitNo(); 21729317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 21739317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Emit the macro directives in reverse source order. 21749317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis for (; MD; MD = MD->getPrevious()) { 2175b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Once we hit an ignored macro, we're done: the rest of the chain 2176b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // will all be ignored macros. 2177c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (shouldIgnoreMacro(MD, IsModule, PP)) 2178b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar break; 21799317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 21809317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis AddSourceLocation(MD->getLocation(), Record); 2181c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis Record.push_back(MD->getKind()); 2182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (auto *DefMD = dyn_cast<DefMacroDirective>(MD)) { 2183b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Record.push_back(getMacroRef(DefMD->getInfo(), Name)); 2184b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } else if (auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) { 2185c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis Record.push_back(VisMD->isPublic()); 2186c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 2187b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 2188176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Write out any exported module macros. 2190b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar bool EmittedModuleMacros = false; 21914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // We write out exported module macros for PCH as well. 21924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto Leafs = PP.getLeafModuleMacros(Name); 21934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<ModuleMacro*, 8> Worklist(Leafs.begin(), Leafs.end()); 21944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::DenseMap<ModuleMacro*, unsigned> Visits; 21954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar while (!Worklist.empty()) { 21964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto *Macro = Worklist.pop_back_val(); 21974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 21984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Emit a record indicating this submodule exports this macro. 21994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ModuleMacroRecord.push_back( 22004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getSubmoduleID(Macro->getOwningModule())); 22014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ModuleMacroRecord.push_back(getMacroRef(Macro->getMacroInfo(), Name)); 22024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto *M : Macro->overrides()) 22034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule())); 22044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 22054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stream.EmitRecord(PP_MODULE_MACRO, ModuleMacroRecord); 22064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ModuleMacroRecord.clear(); 22074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 22084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Enqueue overridden macros once we've visited all their ancestors. 22094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto *M : Macro->overrides()) 22104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (++Visits[M] == M->getNumOverridingMacros()) 22114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Worklist.push_back(M); 22124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 22134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar EmittedModuleMacros = true; 22149317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 2215b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 2216b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Record.empty() && !EmittedModuleMacros) 22179317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis continue; 22189317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 2219b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar IdentMacroDirectivesOffsetMap[Name] = StartOffset; 22209317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Stream.EmitRecord(PP_MACRO_DIRECTIVE_HISTORY, Record); 22219317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Record.clear(); 22229317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 22234d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko 2224a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor /// \brief Offsets of each of the macros into the bitstream, indexed by 2225a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor /// the local macro ID 2226a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor /// 2227a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor /// For each identifier that is associated with a macro, this map 2228a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor /// provides the offset into the bitstream where that macro is 2229a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor /// defined. 2230a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor std::vector<uint32_t> MacroOffsets; 2231a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 22329317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis for (unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) { 22339317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis const IdentifierInfo *Name = MacroInfosToEmit[I].Name; 22349317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroInfo *MI = MacroInfosToEmit[I].MI; 22359317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroID ID = MacroInfosToEmit[I].ID; 22367c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 22379317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (ID < FirstMacroID) { 22389317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis assert(0 && "Loaded MacroInfo entered MacroInfosToEmit ?"); 22399317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis continue; 22409317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 2241a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 22429317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Record the local offset of this macro. 22439317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis unsigned Index = ID - FirstMacroID; 22449317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (Index == MacroOffsets.size()) 22459317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroOffsets.push_back(Stream.GetCurrentBitNo()); 22469317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis else { 22479317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (Index > MacroOffsets.size()) 22489317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroOffsets.resize(Index + 1); 224920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 22509317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroOffsets[Index] = Stream.GetCurrentBitNo(); 22519317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 2252a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 22539317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis AddIdentifierRef(Name, Record); 22549317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Record.push_back(inferSubmoduleIDFromLocation(MI->getDefinitionLoc())); 22559317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis AddSourceLocation(MI->getDefinitionLoc(), Record); 22569317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis AddSourceLocation(MI->getDefinitionEndLoc(), Record); 22579317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Record.push_back(MI->isUsed()); 22586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Record.push_back(MI->isUsedForHeaderGuard()); 22599317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis unsigned Code; 22609317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (MI->isObjectLike()) { 22619317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Code = PP_MACRO_OBJECT_LIKE; 22629317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } else { 22639317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Code = PP_MACRO_FUNCTION_LIKE; 2264a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 22659317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Record.push_back(MI->isC99Varargs()); 22669317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Record.push_back(MI->isGNUVarargs()); 22679317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Record.push_back(MI->hasCommaPasting()); 22689317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Record.push_back(MI->getNumArgs()); 2269b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const IdentifierInfo *Arg : MI->args()) 2270b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar AddIdentifierRef(Arg, Record); 22719317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 227220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 22739317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // If we have a detailed preprocessing record, record the macro definition 22749317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // ID that corresponds to this macro. 22759317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (PPRec) 22769317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Record.push_back(MacroDefinitions[PPRec->findMacroDefinition(MI)]); 2277f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner 22789317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Stream.EmitRecord(Code, Record); 22799317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Record.clear(); 22804d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko 22819317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Emit the tokens array. 22829317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis for (unsigned TokNo = 0, e = MI->getNumTokens(); TokNo != e; ++TokNo) { 22839317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Note that we know that the preprocessor does not have any annotation 22849317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // tokens in it because they are created by the parser, and thus can't 22859317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // be in a macro definition. 22869317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis const Token &Tok = MI->getReplacementToken(TokNo); 2287aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall AddToken(Tok, Record); 22889317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Stream.EmitRecord(PP_TOKEN, Record); 2289df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner Record.clear(); 2290df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner } 22919317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis ++NumMacros; 22927c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner } 22939317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 22944800a5c79023271408af49797e09be32aca93232Douglas Gregor Stream.ExitBlock(); 2295a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 22969317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Write the offsets table for macro IDs. 22979317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis using namespace llvm; 229887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 229958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 2300a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(MACRO_OFFSET)); 2301a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of macros 2302a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID 2303a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 2304a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 2305a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 230687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 230787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {MACRO_OFFSET, MacroOffsets.size(), 230887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FirstMacroID - NUM_PREDEF_MACRO_IDS}; 230987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(MacroOffsetAbbrev, Record, bytes(MacroOffsets)); 231087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 23114800a5c79023271408af49797e09be32aca93232Douglas Gregor} 23124800a5c79023271408af49797e09be32aca93232Douglas Gregor 23134800a5c79023271408af49797e09be32aca93232Douglas Gregorvoid ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) { 2314b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis if (PPRec.local_begin() == PPRec.local_end()) 23154800a5c79023271408af49797e09be32aca93232Douglas Gregor return; 2316e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 23172dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets; 2318e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 23194800a5c79023271408af49797e09be32aca93232Douglas Gregor // Enter the preprocessor block. 23204800a5c79023271408af49797e09be32aca93232Douglas Gregor Stream.EnterSubblock(PREPROCESSOR_DETAIL_BLOCK_ID, 3); 232120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 23226a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor // If the preprocessor has a preprocessing record, emit it. 23236a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor unsigned NumPreprocessingRecords = 0; 23244800a5c79023271408af49797e09be32aca93232Douglas Gregor using namespace llvm; 23254800a5c79023271408af49797e09be32aca93232Douglas Gregor 23264800a5c79023271408af49797e09be32aca93232Douglas Gregor // Set up the abbreviation for 23274800a5c79023271408af49797e09be32aca93232Douglas Gregor unsigned InclusionAbbrev = 0; 23284800a5c79023271408af49797e09be32aca93232Douglas Gregor { 232987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 23304800a5c79023271408af49797e09be32aca93232Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(PPD_INCLUSION_DIRECTIVE)); 23314800a5c79023271408af49797e09be32aca93232Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // filename length 23324800a5c79023271408af49797e09be32aca93232Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // in quotes 23334800a5c79023271408af49797e09be32aca93232Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // kind 23348dd927cf03e85b942f323eebb42e06c839887ebbArgyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // imported module 23354800a5c79023271408af49797e09be32aca93232Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 23364800a5c79023271408af49797e09be32aca93232Douglas Gregor InclusionAbbrev = Stream.EmitAbbrev(Abbrev); 23374800a5c79023271408af49797e09be32aca93232Douglas Gregor } 23384800a5c79023271408af49797e09be32aca93232Douglas Gregor 2339272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor unsigned FirstPreprocessorEntityID 2340272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor = (Chain ? PPRec.getNumLoadedPreprocessedEntities() : 0) 2341272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor + NUM_PREDEF_PP_ENTITY_IDS; 2342272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID; 23434800a5c79023271408af49797e09be32aca93232Douglas Gregor RecordData Record; 2344b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis for (PreprocessingRecord::iterator E = PPRec.local_begin(), 2345b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis EEnd = PPRec.local_end(); 23467338a922dd1164002922163200b18a2c24eb0209Douglas Gregor E != EEnd; 23477338a922dd1164002922163200b18a2c24eb0209Douglas Gregor (void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) { 23484800a5c79023271408af49797e09be32aca93232Douglas Gregor Record.clear(); 234920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 2350b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar PreprocessedEntityOffsets.push_back( 2351b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar PPEntityOffset((*E)->getSourceRange(), Stream.GetCurrentBitNo())); 2352e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 235387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) { 2354e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis // Record this macro definition's ID. 2355e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis MacroDefinitions[MD] = NextPreprocessorEntityID; 2356b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 23574800a5c79023271408af49797e09be32aca93232Douglas Gregor AddIdentifierRef(MD->getName(), Record); 23584800a5c79023271408af49797e09be32aca93232Douglas Gregor Stream.EmitRecord(PPD_MACRO_DEFINITION, Record); 23594800a5c79023271408af49797e09be32aca93232Douglas Gregor continue; 23604800a5c79023271408af49797e09be32aca93232Douglas Gregor } 23614800a5c79023271408af49797e09be32aca93232Douglas Gregor 236287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (auto *ME = dyn_cast<MacroExpansion>(*E)) { 23638f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis Record.push_back(ME->isBuiltinMacro()); 23648f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis if (ME->isBuiltinMacro()) 23658f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis AddIdentifierRef(ME->getName(), Record); 23668f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis else 2367e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis Record.push_back(MacroDefinitions[ME->getDefinition()]); 2368f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth Stream.EmitRecord(PPD_MACRO_EXPANSION, Record); 23694800a5c79023271408af49797e09be32aca93232Douglas Gregor continue; 23706a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor } 237120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 237287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (auto *ID = dyn_cast<InclusionDirective>(*E)) { 23734800a5c79023271408af49797e09be32aca93232Douglas Gregor Record.push_back(PPD_INCLUSION_DIRECTIVE); 23744800a5c79023271408af49797e09be32aca93232Douglas Gregor Record.push_back(ID->getFileName().size()); 23754800a5c79023271408af49797e09be32aca93232Douglas Gregor Record.push_back(ID->wasInQuotes()); 23764800a5c79023271408af49797e09be32aca93232Douglas Gregor Record.push_back(static_cast<unsigned>(ID->getKind())); 23778dd927cf03e85b942f323eebb42e06c839887ebbArgyrios Kyrtzidis Record.push_back(ID->importedModule()); 2378f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<64> Buffer; 23794800a5c79023271408af49797e09be32aca93232Douglas Gregor Buffer += ID->getFileName(); 238029f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis // Check that the FileEntry is not null because it was not resolved and 238129f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis // we create a PCH even with compiler errors. 238229f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis if (ID->getFile()) 238329f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis Buffer += ID->getFile()->getName(); 23844800a5c79023271408af49797e09be32aca93232Douglas Gregor Stream.EmitRecordWithBlob(InclusionAbbrev, Record, Buffer); 23854800a5c79023271408af49797e09be32aca93232Douglas Gregor continue; 23864800a5c79023271408af49797e09be32aca93232Douglas Gregor } 23874800a5c79023271408af49797e09be32aca93232Douglas Gregor 23884800a5c79023271408af49797e09be32aca93232Douglas Gregor llvm_unreachable("Unhandled PreprocessedEntity in ASTWriter"); 23894800a5c79023271408af49797e09be32aca93232Douglas Gregor } 2390c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor Stream.ExitBlock(); 239120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 23926a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor // Write the offsets table for the preprocessing record. 23936a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor if (NumPreprocessingRecords > 0) { 2394e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords); 2395e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 23966a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor // Write the offsets table for identifier IDs. 23976a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor using namespace llvm; 239887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 239987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 2400e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(PPD_ENTITIES_OFFSETS)); 2401272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first pp entity 24026a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 2403e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 240420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 240587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {PPD_ENTITIES_OFFSETS, 240687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FirstPreprocessorEntityID - 240787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NUM_PREDEF_PP_ENTITY_IDS}; 2408e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis Stream.EmitRecordWithBlob(PPEOffsetAbbrev, Record, 2409b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar bytes(PreprocessedEntityOffsets)); 24106a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor } 24110b1fb988012da21d996c43e36867787a7a07b889Chris Lattner} 24120b1fb988012da21d996c43e36867787a7a07b889Chris Lattner 241387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarunsigned ASTWriter::getLocalOrImportedSubmoduleID(Module *Mod) { 241487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!Mod) 241587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return 0; 241687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 2417e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor llvm::DenseMap<Module *, unsigned>::iterator Known = SubmoduleIDs.find(Mod); 2418e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (Known != SubmoduleIDs.end()) 2419e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor return Known->second; 2420e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 242187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Mod->getTopLevelModule() != WritingModule) 242255ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis return 0; 242355ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis 242487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return SubmoduleIDs[Mod] = NextSubmoduleID++; 242587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 242655ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis 242787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarunsigned ASTWriter::getSubmoduleID(Module *Mod) { 242887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: This can easily happen, if we have a reference to a submodule that 242987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // did not result in us loading a module file for that submodule. For 243087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // instance, a cross-top-level-module 'conflict' declaration will hit this. 243187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned ID = getLocalOrImportedSubmoduleID(Mod); 243287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert((ID || !Mod) && 243387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "asked for module ID for non-local, non-imported module"); 243487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return ID; 243555ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis} 243655ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis 243726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor/// \brief Compute the number of modules within the given tree (including the 243826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor/// given module). 243926ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregorstatic unsigned getNumberOfModules(Module *Mod) { 244026ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor unsigned ChildModules = 0; 244187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto Sub = Mod->submodule_begin(), SubEnd = Mod->submodule_end(); 244226ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor Sub != SubEnd; ++Sub) 2443b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor ChildModules += getNumberOfModules(*Sub); 244426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor 244526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor return ChildModules + 1; 244626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor} 244726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor 24481a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorvoid ASTWriter::WriteSubmodules(Module *WritingModule) { 2449392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Enter the submodule description block. 2450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Stream.EnterSubblock(SUBMODULE_BLOCK_ID, /*bits for abbreviations*/5); 2451392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 2452392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Write the abbreviations needed for the submodules block. 2453392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor using namespace llvm; 245487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 245587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 2456392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_DEFINITION)); 2457e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ID 2458392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Parent 2459392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFramework 2460392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExplicit 2461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsSystem 2462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExternC 2463a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferSubmodules... 24641e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExplicit... 24651e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExportWild... 246663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ConfigMacrosExh... 2467392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2468392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor unsigned DefinitionAbbrev = Stream.EmitAbbrev(Abbrev); 2469392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 2470392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev = new BitCodeAbbrev(); 247177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_UMBRELLA_HEADER)); 2472392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2473392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor unsigned UmbrellaAbbrev = Stream.EmitAbbrev(Abbrev); 2474392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 2475392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev = new BitCodeAbbrev(); 2476392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_HEADER)); 2477392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2478392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor unsigned HeaderAbbrev = Stream.EmitAbbrev(Abbrev); 247977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 248077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Abbrev = new BitCodeAbbrev(); 2481c7782d96c657eeb767bfea5117db49dc40e6356cArgyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_TOPHEADER)); 2482c7782d96c657eeb767bfea5117db49dc40e6356cArgyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2483c7782d96c657eeb767bfea5117db49dc40e6356cArgyrios Kyrtzidis unsigned TopHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2484c7782d96c657eeb767bfea5117db49dc40e6356cArgyrios Kyrtzidis 2485c7782d96c657eeb767bfea5117db49dc40e6356cArgyrios Kyrtzidis Abbrev = new BitCodeAbbrev(); 248677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_UMBRELLA_DIR)); 248777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 248877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(Abbrev); 248977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 249051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Abbrev = new BitCodeAbbrev(); 249151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_REQUIRES)); 24925794b53ad5b38b53c9eaf3a172354e63081ceb2fRichard Smith Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // State 24935794b53ad5b38b53c9eaf3a172354e63081ceb2fRichard Smith Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Feature 249451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor unsigned RequiresAbbrev = Stream.EmitAbbrev(Abbrev); 249551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 24962b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Abbrev = new BitCodeAbbrev(); 24972b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_EXCLUDED_HEADER)); 24982b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 24992b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 25002b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor 2501b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor Abbrev = new BitCodeAbbrev(); 2502176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_TEXTUAL_HEADER)); 2503176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2504176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2505176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2506176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abbrev = new BitCodeAbbrev(); 2507bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_PRIVATE_HEADER)); 2508bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2509bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2510bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl 2511bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl Abbrev = new BitCodeAbbrev(); 2512176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_PRIVATE_TEXTUAL_HEADER)); 2513176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2514176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(Abbrev); 2515176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2516176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Abbrev = new BitCodeAbbrev(); 2517b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_LINK_LIBRARY)); 2518b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFramework 2519b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name 2520b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(Abbrev); 2521b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 252263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Abbrev = new BitCodeAbbrev(); 252363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_CONFIG_MACRO)); 252463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Macro name 252563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(Abbrev); 252663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 2527906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Abbrev = new BitCodeAbbrev(); 2528906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_CONFLICT)); 2529906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Other module 2530906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Message 2531906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor unsigned ConflictAbbrev = Stream.EmitAbbrev(Abbrev); 2532906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 253326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor // Write the submodule metadata block. 253487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {getNumberOfModules(WritingModule), 253587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FirstSubmoduleID - 253687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NUM_PREDEF_SUBMODULE_IDS}; 253726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor Stream.EmitRecord(SUBMODULE_METADATA, Record); 253826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor 2539392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Write all of the submodules. 25401a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor std::queue<Module *> Q; 2541392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Q.push(WritingModule); 2542392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor while (!Q.empty()) { 25431a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor Module *Mod = Q.front(); 2544392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Q.pop(); 2545e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor unsigned ID = getSubmoduleID(Mod); 254687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 254787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar uint64_t ParentID = 0; 2548392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (Mod->Parent) { 2549392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor assert(SubmoduleIDs[Mod->Parent] && "Submodule parent not written?"); 255087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParentID = SubmoduleIDs[Mod->Parent]; 2551392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor } 255287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 255387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Emit the definition of the block. 255487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 255587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = { 255687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SUBMODULE_DEFINITION, ID, ParentID, Mod->IsFramework, Mod->IsExplicit, 255787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Mod->IsSystem, Mod->IsExternC, Mod->InferSubmodules, 255887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Mod->InferExplicitSubmodules, Mod->InferExportWildcard, 255987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Mod->ConfigMacrosExhaustive}; 256087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(DefinitionAbbrev, Record, Mod->Name); 256187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 256287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 256351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Emit the requirements. 256487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &R : Mod->Requirements) { 256587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {SUBMODULE_REQUIRES, R.second}; 256687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(RequiresAbbrev, Record, R.first); 256751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 256851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 2569392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Emit the umbrella header, if there is one. 2570b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (auto UmbrellaHeader = Mod->getUmbrellaHeader()) { 257187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {SUBMODULE_UMBRELLA_HEADER}; 2572b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stream.EmitRecordWithBlob(UmbrellaAbbrev, Record, 2573b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar UmbrellaHeader.NameAsWritten); 2574b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } else if (auto UmbrellaDir = Mod->getUmbrellaDir()) { 257587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {SUBMODULE_UMBRELLA_DIR}; 257687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(UmbrellaDirAbbrev, Record, 2577b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar UmbrellaDir.NameAsWritten); 2578392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor } 2579176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2580392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Emit the headers. 2581176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct { 25820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines unsigned RecordKind; 2583176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned Abbrev; 25840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Module::HeaderKind HeaderKind; 2585176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } HeaderLists[] = { 25860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines {SUBMODULE_HEADER, HeaderAbbrev, Module::HK_Normal}, 25870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines {SUBMODULE_TEXTUAL_HEADER, TextualHeaderAbbrev, Module::HK_Textual}, 25880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines {SUBMODULE_PRIVATE_HEADER, PrivateHeaderAbbrev, Module::HK_Private}, 2589176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines {SUBMODULE_PRIVATE_TEXTUAL_HEADER, PrivateTextualHeaderAbbrev, 25900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Module::HK_PrivateTextual}, 25910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines {SUBMODULE_EXCLUDED_HEADER, ExcludedHeaderAbbrev, Module::HK_Excluded} 2592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 2593176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (auto &HL : HeaderLists) { 259487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {HL.RecordKind}; 25950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (auto &H : Mod->Headers[HL.HeaderKind]) 25960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Stream.EmitRecordWithBlob(HL.Abbrev, Record, H.NameAsWritten); 25970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 25980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 25990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Emit the top headers. 26000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines { 26010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto TopHeaders = Mod->getTopHeaders(PP->getFileManager()); 260287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {SUBMODULE_TOPHEADER}; 26030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (auto *H : TopHeaders) 26040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Stream.EmitRecordWithBlob(TopHeaderAbbrev, Record, H->getName()); 2605c7782d96c657eeb767bfea5117db49dc40e6356cArgyrios Kyrtzidis } 260655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 260755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor // Emit the imports. 260855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (!Mod->Imports.empty()) { 260987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData Record; 261087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto *I : Mod->Imports) 261187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(getSubmoduleID(I)); 261255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor Stream.EmitRecord(SUBMODULE_IMPORTS, Record); 261355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor } 261455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 2615af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor // Emit the exports. 2616af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor if (!Mod->Exports.empty()) { 261787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData Record; 261887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &E : Mod->Exports) { 261987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: This may fail; we don't require that all exported modules 262087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // are local or imported. 262187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(getSubmoduleID(E.getPointer())); 262287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(E.getInt()); 2623af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor } 2624af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor Stream.EmitRecord(SUBMODULE_EXPORTS, Record); 2625af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor } 2626b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 2627ddd2dfc1d3f4a36cbe8cd775c588623a17049f9fDaniel Jasper //FIXME: How do we emit the 'use'd modules? They may not be submodules. 2628ddd2dfc1d3f4a36cbe8cd775c588623a17049f9fDaniel Jasper // Might be unnecessary as use declarations are only used to build the 2629ddd2dfc1d3f4a36cbe8cd775c588623a17049f9fDaniel Jasper // module itself. 2630ddd2dfc1d3f4a36cbe8cd775c588623a17049f9fDaniel Jasper 2631b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor // Emit the link libraries. 263287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &LL : Mod->LinkLibraries) { 263387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {SUBMODULE_LINK_LIBRARY, 263487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LL.IsFramework}; 263587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(LinkLibraryAbbrev, Record, LL.Library); 2636b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor } 2637b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 2638906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor // Emit the conflicts. 263987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &C : Mod->Conflicts) { 264087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: This may fail; we don't require that all conflicting modules 264187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // are local or imported. 264287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {SUBMODULE_CONFLICT, 264387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getSubmoduleID(C.Other)}; 264487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(ConflictAbbrev, Record, C.Message); 2645906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 2646906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 264763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Emit the configuration macros. 264887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &CM : Mod->ConfigMacros) { 264987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {SUBMODULE_CONFIG_MACRO}; 265087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(ConfigMacroAbbrev, Record, CM); 265163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 265263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 2653392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Queue up the submodules of this module. 265487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto *M : Mod->submodules()) 265587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Q.push(M); 2656392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor } 2657392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 2658392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Stream.ExitBlock(); 2659b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 2660b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar assert((NextSubmoduleID - FirstSubmoduleID == 2661b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar getNumberOfModules(WritingModule)) && 2662b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar "Wrong # of submodules; found a reference to a non-local, " 2663b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar "non-imported submodule?"); 2664392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor} 2665392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 2666185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregorserialization::SubmoduleID 2667185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas GregorASTWriter::inferSubmoduleIDFromLocation(SourceLocation Loc) { 2668e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (Loc.isInvalid() || !WritingModule) 2669185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor return 0; // No submodule 267055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 267155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor // Find the module that owns this location. 2672185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor ModuleMap &ModMap = PP->getHeaderSearchInfo().getModuleMap(); 267355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor Module *OwningMod 267455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor = ModMap.inferModuleFromLocation(FullSourceLoc(Loc,PP->getSourceManager())); 2675185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor if (!OwningMod) 2676185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor return 0; 2677185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor 2678e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Check whether this submodule is part of our own module. 2679e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (WritingModule != OwningMod && !OwningMod->isSubModuleOf(WritingModule)) 2680185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor return 0; 2681185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor 2682e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor return getSubmoduleID(OwningMod); 2683185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor} 2684185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor 2685ea744ab5f39b8f45f802301841b77398166bce8fArgyrios Kyrtzidisvoid ASTWriter::WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag, 2686ea744ab5f39b8f45f802301841b77398166bce8fArgyrios Kyrtzidis bool isModule) { 2687ea744ab5f39b8f45f802301841b77398166bce8fArgyrios Kyrtzidis // Make sure set diagnostic pragmas don't affect the translation unit that 2688ea744ab5f39b8f45f802301841b77398166bce8fArgyrios Kyrtzidis // imports the module. 2689ea744ab5f39b8f45f802301841b77398166bce8fArgyrios Kyrtzidis // FIXME: Make diagnostic pragma sections work properly with modules. 2690ea744ab5f39b8f45f802301841b77398166bce8fArgyrios Kyrtzidis if (isModule) 2691ea744ab5f39b8f45f802301841b77398166bce8fArgyrios Kyrtzidis return; 2692ea744ab5f39b8f45f802301841b77398166bce8fArgyrios Kyrtzidis 269333e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64> 269433e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis DiagStateIDMap; 269533e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis unsigned CurrID = 0; 269633e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis DiagStateIDMap[&Diag.DiagStates.front()] = ++CurrID; // the command-line one. 2697f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis RecordData Record; 2698d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie for (DiagnosticsEngine::DiagStatePointsTy::const_iterator 26993efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis I = Diag.DiagStatePoints.begin(), E = Diag.DiagStatePoints.end(); 27003efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis I != E; ++I) { 270133e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis const DiagnosticsEngine::DiagStatePoint &point = *I; 27023efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis if (point.Loc.isInvalid()) 27033efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis continue; 27043efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis 27054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(point.Loc, Record); 270633e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis unsigned &DiagStateID = DiagStateIDMap[point.State]; 270733e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis Record.push_back(DiagStateID); 270833e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis 270933e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis if (DiagStateID == 0) { 271033e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis DiagStateID = ++CurrID; 271187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &I : *(point.State)) { 271287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (I.second.isPragma()) { 271387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(I.first); 271487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back((unsigned)I.second.getSeverity()); 271533e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis } 27163efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis } 271733e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis Record.push_back(-1); // mark the end of the diag/map pairs for this 271833e1576ef88ae6fcc4ed8686f34ed28b1a41bcceArgyrios Kyrtzidis // location. 2719f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis } 2720f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis } 2721f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis 272260f7684881f9f6bc779e91212aea89d9afc723ddArgyrios Kyrtzidis if (!Record.empty()) 27233efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis Stream.EmitRecord(DIAG_PRAGMA_MAPPINGS, Record); 2724f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis} 2725f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis 27264fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 27274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor// Type Serialization 27284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 27290b1fb988012da21d996c43e36867787a7a07b889Chris Lattner 27303397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/// \brief Write the representation of a type to the AST stream. 2731a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redlvoid ASTWriter::WriteType(QualType T) { 27324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeIdx &IdxRef = TypeIdxs[T]; 27334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (IdxRef.getIndex() == 0) // we haven't seen this type before. 27344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar IdxRef = TypeIdx(NextTypeID++); 27354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeIdx Idx = IdxRef; 27361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 273797475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor assert(Idx.getIndex() >= FirstTypeID && "Re-writing a type from a prior AST"); 273855f48de5f6b10b50f4d88a9f7235f4532f799550Douglas Gregor 27394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RecordData Record; 27404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 27414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Emit the type's representation. 27424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTTypeWriter W(*this, Record); 27434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar W.Visit(T); 27444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar uint64_t Offset = W.Emit(); 27454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 27462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // Record the offset for this type. 2747c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis unsigned Index = Idx.getIndex() - FirstTypeID; 2748681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl if (TypeOffsets.size() == Index) 27494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeOffsets.push_back(Offset); 2750681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl else if (TypeOffsets.size() < Index) { 2751681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl TypeOffsets.resize(Index + 1); 27524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeOffsets[Index] = Offset; 27530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } else { 27544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm_unreachable("Types emitted in wrong order"); 27552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 27562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 27572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 27584fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 27594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor// Declaration Serialization 27604fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 27614fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 27622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/// \brief Write the block containing all of the declaration IDs 27632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/// lexically declared within the given DeclContext. 27642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/// 27652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/// \returns the offset of the DECL_CONTEXT_LEXICAL block within the 27662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/// bistream, or 0 if no block was written. 2767a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redluint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context, 27682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor DeclContext *DC) { 276917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis if (DC->decls_empty()) 27702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return 0; 27712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2772c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor uint64_t Offset = Stream.GetCurrentBitNo(); 277387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<uint32_t, 128> KindDeclPairs; 277487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto *D : DC->decls()) { 277587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar KindDeclPairs.push_back(D->getKind()); 277687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar KindDeclPairs.push_back(GetDeclRef(D)); 277787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 27782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 27792512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor ++NumLexicalDeclContexts; 278087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {DECL_CONTEXT_LEXICAL}; 278187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev, Record, 278287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bytes(KindDeclPairs)); 27832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return Offset; 27842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 27852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2786a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redlvoid ASTWriter::WriteTypeDeclOffsets() { 27871476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl using namespace llvm; 27881476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 27891476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl // Write the type offsets array 279087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 27918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(TYPE_OFFSET)); 27921476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of types 2793a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base type index 27941476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // types block 27951476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 279687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 279787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {TYPE_OFFSET, TypeOffsets.size(), 279887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FirstTypeID - NUM_PREDEF_TYPE_IDS}; 279987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(TypeOffsetAbbrev, Record, bytes(TypeOffsets)); 280087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 28011476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 28021476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl // Write the declaration offsets array 28031476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl Abbrev = new BitCodeAbbrev(); 28048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(DECL_OFFSET)); 28051476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of declarations 2806496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base decl ID 28071476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // declarations block 28081476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 280987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 281087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {DECL_OFFSET, DeclOffsets.size(), 281187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FirstDeclID - NUM_PREDEF_DECL_IDS}; 281287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record, bytes(DeclOffsets)); 281387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 28141476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl} 28151476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 281610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidisvoid ASTWriter::WriteFileDeclIDsMap() { 281710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis using namespace llvm; 281810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 28193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs( 28203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar FileDeclIDs.begin(), FileDeclIDs.end()); 28213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar std::sort(SortedFileDeclIDs.begin(), SortedFileDeclIDs.end(), 28223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar llvm::less_first()); 28233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 282410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // Join the vectors of DeclIDs from all files. 28253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SmallVector<DeclID, 256> FileGroupedDeclIDs; 28263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto &FileDeclEntry : SortedFileDeclIDs) { 28273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclIDInFileInfo &Info = *FileDeclEntry.second; 28283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Info.FirstDeclIndex = FileGroupedDeclIDs.size(); 28293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto &LocDeclEntry : Info.DeclIDs) 28303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar FileGroupedDeclIDs.push_back(LocDeclEntry.second); 283110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis } 283210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 283387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 283410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(FILE_SORTED_DECLS)); 28352093e0bc4e436b1b2791d5423fb3274dd37231b8Argyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 283610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 283710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); 283887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {FILE_SORTED_DECLS, 283987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FileGroupedDeclIDs.size()}; 2840b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stream.EmitRecordWithBlob(AbbrevCode, Record, bytes(FileGroupedDeclIDs)); 284110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis} 284210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 2843aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkovoid ASTWriter::WriteComments() { 2844aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Stream.EnterSubblock(COMMENTS_BLOCK_ID, 3); 2845811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko ArrayRef<RawComment *> RawComments = Context->Comments.getComments(); 2846aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RecordData Record; 284787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto *I : RawComments) { 2848aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Record.clear(); 284987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddSourceRange(I->getSourceRange(), Record); 285087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(I->getKind()); 285187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(I->isTrailingComment()); 285287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(I->isAlmostTrailingComment()); 2853aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Stream.EmitRecord(COMMENTS_RAW_COMMENT, Record); 2854aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 2855aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Stream.ExitBlock(); 2856aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko} 2857aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 28584fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 28594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor// Global Method Pool and Selector Serialization 28604fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 28614fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 28623251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregornamespace { 2863f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor// Trait used for the on-disk hash table used in the method pool. 28643397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlclass ASTMethodPoolTrait { 2865a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl ASTWriter &Writer; 2866f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2867f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregorpublic: 2868f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor typedef Selector key_type; 2869f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor typedef key_type key_type_ref; 28701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28715d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl struct data_type { 28728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl SelectorID ID; 28735d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl ObjCMethodList Instance, Factory; 28745d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl }; 2875f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor typedef const data_type& data_type_ref; 2876f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 28776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef unsigned hash_value_type; 28786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef unsigned offset_type; 28796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 28803397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) { } 28811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static hash_value_type ComputeHash(Selector Sel) { 28830eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis return serialization::ComputeHash(Sel); 2884f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<unsigned,unsigned> 28875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner EmitKeyDataLength(raw_ostream& Out, Selector Sel, 2888f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor data_type_ref Methods) { 2889651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 2890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 2891f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor unsigned KeyLen = 2 + (Sel.getNumArgs()? Sel.getNumArgs() * 4 : 4); 2892651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(KeyLen); 28935d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl unsigned DataLen = 4 + 2 + 2; // 2 bytes for each of the method counts 28945d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl for (const ObjCMethodList *Method = &Methods.Instance; Method; 28952e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Method = Method->getNext()) 28960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Method->getMethod()) 2897f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor DataLen += 4; 28985d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl for (const ObjCMethodList *Method = &Methods.Factory; Method; 28992e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Method = Method->getNext()) 29000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Method->getMethod()) 2901f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor DataLen += 4; 2902651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(DataLen); 2903f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return std::make_pair(KeyLen, DataLen); 2904f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 29051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner void EmitKey(raw_ostream& Out, Selector Sel, unsigned) { 2907651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 2908651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 29091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump uint64_t Start = Out.tell(); 291083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor assert((Start >> 32) == 0 && "Selector key offset too large"); 291183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor Writer.SetSelectorOffset(Sel, Start); 2912f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor unsigned N = Sel.getNumArgs(); 2913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(N); 2914f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor if (N == 0) 2915f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor N = 1; 2916f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor for (unsigned I = 0; I != N; ++I) 2917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint32_t>( 2918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Writer.getIdentifierRef(Sel.getIdentifierInfoForSlot(I))); 2919f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 29201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner void EmitData(raw_ostream& Out, key_type_ref, 2922a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor data_type_ref Methods, unsigned DataLen) { 2923651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 2924651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 2925a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor uint64_t Start = Out.tell(); (void)Start; 2926651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint32_t>(Methods.ID); 2927f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor unsigned NumInstanceMethods = 0; 29285d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl for (const ObjCMethodList *Method = &Methods.Instance; Method; 29292e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Method = Method->getNext()) 29300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Method->getMethod()) 2931f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor ++NumInstanceMethods; 2932f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2933f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor unsigned NumFactoryMethods = 0; 29345d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl for (const ObjCMethodList *Method = &Methods.Factory; Method; 29352e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Method = Method->getNext()) 29360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Method->getMethod()) 2937f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor ++NumFactoryMethods; 2938f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 29392e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis unsigned InstanceBits = Methods.Instance.getBits(); 29402e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis assert(InstanceBits < 4); 29410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines unsigned InstanceHasMoreThanOneDeclBit = 29420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Methods.Instance.hasMoreThanOneDecl(); 29430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines unsigned FullInstanceBits = (NumInstanceMethods << 3) | 29440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines (InstanceHasMoreThanOneDeclBit << 2) | 29450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines InstanceBits; 29462e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis unsigned FactoryBits = Methods.Factory.getBits(); 29472e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis assert(FactoryBits < 4); 29480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines unsigned FactoryHasMoreThanOneDeclBit = 29490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Methods.Factory.hasMoreThanOneDecl(); 29500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines unsigned FullFactoryBits = (NumFactoryMethods << 3) | 29510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines (FactoryHasMoreThanOneDeclBit << 2) | 29520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines FactoryBits; 29530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LE.write<uint16_t>(FullInstanceBits); 29540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LE.write<uint16_t>(FullFactoryBits); 29555d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl for (const ObjCMethodList *Method = &Methods.Instance; Method; 29562e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Method = Method->getNext()) 29570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Method->getMethod()) 29580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LE.write<uint32_t>(Writer.getDeclID(Method->getMethod())); 29595d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl for (const ObjCMethodList *Method = &Methods.Factory; Method; 29602e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Method = Method->getNext()) 29610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Method->getMethod()) 29620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LE.write<uint32_t>(Writer.getDeclID(Method->getMethod())); 2963a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor 2964a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor assert(Out.tell() - Start == DataLen && "Data length is wrong"); 2965f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 2966f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor}; 2967f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor} // end anonymous namespace 2968f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2969059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl/// \brief Write ObjC data: selectors and the method pool. 2970f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor/// 2971f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor/// The method pool contains both instance and factory methods, stored 2972059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl/// in an on-disk hash table indexed by the selector. The hash table also 2973059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl/// contains an empty entry for every other selector known to Sema. 2974a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redlvoid ASTWriter::WriteSelectors(Sema &SemaRef) { 2975f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor using namespace llvm; 2976f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2977059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl // Do we have to do anything at all? 29785d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl if (SemaRef.MethodPool.empty() && SelectorIDs.empty()) 2979059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl return; 2980e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl unsigned NumTableEntries = 0; 2981059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl // Create and write out the blob that contains selectors and the method pool. 2982f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor { 29836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait> Generator; 29845d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis ASTMethodPoolTrait Trait(*this); 29851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2986059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl // Create the on-disk hash table representation. We walk through every 2987059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl // selector we've seen and look it up in the method pool. 2988e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl SelectorOffsets.resize(NextSelectorID - FirstSelectorID); 29893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto &SelectorAndID : SelectorIDs) { 29903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Selector S = SelectorAndID.first; 29913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SelectorID ID = SelectorAndID.second; 2992059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl Sema::GlobalMethodPool::iterator F = SemaRef.MethodPool.find(S); 29933397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl ASTMethodPoolTrait::data_type Data = { 29943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ID, 29955d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl ObjCMethodList(), 29965d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl ObjCMethodList() 29975d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl }; 29985d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl if (F != SemaRef.MethodPool.end()) { 29995d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl Data.Instance = F->second.first; 30005d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl Data.Factory = F->second.second; 30015d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl } 30023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl // Only write this selector if it's not in an existing AST or something 3003e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl // changed. 30043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Chain && ID < FirstSelectorID) { 3005e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl // Selector already exists. Did it change? 3006e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl bool changed = false; 30070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (ObjCMethodList *M = &Data.Instance; 30080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines !changed && M && M->getMethod(); M = M->getNext()) { 30090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!M->getMethod()->isFromASTFile()) 3010e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl changed = true; 3011e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl } 30120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (ObjCMethodList *M = &Data.Factory; !changed && M && M->getMethod(); 30132e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis M = M->getNext()) { 30140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!M->getMethod()->isFromASTFile()) 3015e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl changed = true; 3016e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl } 3017e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl if (!changed) 3018e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl continue; 30190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } else if (Data.Instance.getMethod() || Data.Factory.getMethod()) { 3020fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl // A new method pool entry. 3021fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl ++NumTableEntries; 3022e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl } 30235d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis Generator.insert(S, Data, Trait); 3024f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 3025f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 3026f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor // Create the on-disk hash table in a buffer. 3027f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<4096> MethodPool; 3028f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor uint32_t BucketOffset; 3029f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor { 3030651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 30313397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl ASTMethodPoolTrait Trait(*this); 3032f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor llvm::raw_svector_ostream Out(MethodPool); 3033f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor // Make sure that no bucket is at offset 0 3034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little>(Out).write<uint32_t>(0); 3035f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor BucketOffset = Generator.Emit(Out, Trait); 3036f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 3037f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 3038f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor // Create a blob abbreviation 303987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 30408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(METHOD_POOL)); 3041f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 304283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 3043f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 3044f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor unsigned MethodPoolAbbrev = Stream.EmitAbbrev(Abbrev); 3045f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 304683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor // Write the method pool 304787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 304887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {METHOD_POOL, BucketOffset, 304987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NumTableEntries}; 305087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(MethodPoolAbbrev, Record, MethodPool); 305187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 305283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 305383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor // Create a blob abbreviation for the selector table offsets. 305483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor Abbrev = new BitCodeAbbrev(); 30558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(SELECTOR_OFFSETS)); 30567c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // size 3057b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID 305883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 305983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 306083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 306183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor // Write the selector offsets table. 306287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 306387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = { 306487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SELECTOR_OFFSETS, SelectorOffsets.size(), 306587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FirstSelectorID - NUM_PREDEF_SELECTOR_IDS}; 306687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(SelectorOffsetAbbrev, Record, 306787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bytes(SelectorOffsets)); 306887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 3069f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 3070f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor} 3071f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 30723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/// \brief Write the selectors referenced in @selector expression into AST file. 3073a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redlvoid ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) { 3074320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian using namespace llvm; 3075320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian if (SemaRef.ReferencedSelectors.empty()) 3076320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian return; 3077725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl 3078320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian RecordData Record; 30794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTRecordWriter Writer(*this, Record); 3080725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl 30813397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl // Note: this writes out all references even for a dependent AST. But it is 3082a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl // very tricky to fix, and given that @selector shouldn't really appear in 3083a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl // headers, probably not worth it. It's not a correctness issue. 30843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto &SelectorAndLocation : SemaRef.ReferencedSelectors) { 30853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Selector Sel = SelectorAndLocation.first; 30863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SourceLocation Loc = SelectorAndLocation.second; 30874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddSelectorRef(Sel); 30884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddSourceLocation(Loc); 3089320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian } 30904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.Emit(REFERENCED_SELECTOR_POOL); 3091320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian} 3092320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian 30934fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 30944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor// Identifier Table Serialization 30954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 30964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 30970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// Determine the declaration that should be put into the name lookup table to 30980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// represent the given declaration in this module. This is usually D itself, 30990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// but if D was imported and merged into a local declaration, we want the most 31000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// recent local declaration instead. The chosen declaration will be the most 31010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// recent declaration in any module that imports this one. 31020e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic NamedDecl *getDeclForLocalLookup(const LangOptions &LangOpts, 31030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines NamedDecl *D) { 31040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!LangOpts.Modules || !D->isFromASTFile()) 31050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return D; 31060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 31070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Decl *Redecl = D->getPreviousDecl()) { 31080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // For Redeclarable decls, a prior declaration might be local. 31090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines for (; Redecl; Redecl = Redecl->getPreviousDecl()) { 31104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // If we find a local decl, we're done. 31114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Redecl->isFromASTFile()) { 31124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Exception: in very rare cases (for injected-class-names), not all 31134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // redeclarations are in the same semantic context. Skip ones in a 31144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // different context. They don't go in this lookup table at all. 31154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Redecl->getDeclContext()->getRedeclContext()->Equals( 31164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D->getDeclContext()->getRedeclContext())) 31174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar continue; 31180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return cast<NamedDecl>(Redecl); 31194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 31204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 31213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // If we find a decl from a (chained-)PCH stop since we won't find a 31220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // local one. 31234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Redecl->getOwningModuleID() == 0) 31240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 31250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 31260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } else if (Decl *First = D->getCanonicalDecl()) { 31270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // For Mergeable decls, the first decl might be local. 31280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!First->isFromASTFile()) 31290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return cast<NamedDecl>(First); 31300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 31310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 31320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // All declarations are imported. Our most recent declaration will also be 31330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // the most recent one in anyone who imports us. 31340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return D; 31350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 31360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3137f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregornamespace { 31383397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlclass ASTIdentifierTableTrait { 3139a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl ASTWriter &Writer; 314037e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor Preprocessor &PP; 3141eee242ff426bf79149f221798966e58688383c1eDouglas Gregor IdentifierResolver &IdResolver; 314287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool IsModule; 314387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool NeedDecls; 314487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTWriter::RecordData *InterestingIdentifierOffsets; 31457143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor 3146b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar /// \brief Determines whether this is an "interesting" identifier that needs a 3147b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar /// full IdentifierInfo structure written into the hash table. Notably, this 3148b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar /// doesn't check whether the name has macros defined; use PublicMacroIterator 3149b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar /// to check that. 315087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool isInterestingIdentifier(const IdentifierInfo *II, uint64_t MacroOffset) { 3151b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (MacroOffset || 3152b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar II->isPoisoned() || 315387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (IsModule ? II->hasRevertedBuiltin() : II->getObjCOrBuiltinID()) || 3154eee242ff426bf79149f221798966e58688383c1eDouglas Gregor II->hasRevertedTokenIDToIdentifier() || 315587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (NeedDecls && II->getFETokenInfo<void>())) 31567143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor return true; 31577143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor 31584d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko return false; 3159a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor } 3160a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor 31613251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregorpublic: 31627143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor typedef IdentifierInfo* key_type; 31633251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor typedef key_type key_type_ref; 31641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl typedef IdentID data_type; 31663251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor typedef data_type data_type_ref; 31671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef unsigned hash_value_type; 31696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef unsigned offset_type; 31706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3171b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP, 317287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IdentifierResolver &IdResolver, bool IsModule, 317387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTWriter::RecordData *InterestingIdentifierOffsets) 317487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule), 317587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NeedDecls(!IsModule || !Writer.getLangOpts().CPlusPlus), 317687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar InterestingIdentifierOffsets(InterestingIdentifierOffsets) {} 31773251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 31784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool needDecls() const { return NeedDecls; } 31794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 31806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static hash_value_type ComputeHash(const IdentifierInfo* II) { 31812596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar return llvm::HashString(II->getName()); 31823251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor } 31831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool isInterestingIdentifier(const IdentifierInfo *II) { 318587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto MacroOffset = Writer.getMacroDirectivesOffset(II); 318687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return isInterestingIdentifier(II, MacroOffset); 318787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 318887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool isInterestingNonMacroIdentifier(const IdentifierInfo *II) { 318987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return isInterestingIdentifier(II, 0); 319087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 319187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 31921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump std::pair<unsigned,unsigned> 3193eee242ff426bf79149f221798966e58688383c1eDouglas Gregor EmitKeyDataLength(raw_ostream& Out, IdentifierInfo* II, IdentID ID) { 3194e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar unsigned KeyLen = II->getLength() + 1; 3195a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor unsigned DataLen = 4; // 4 bytes for the persistent ID << 1 3196b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto MacroOffset = Writer.getMacroDirectivesOffset(II); 3197b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (isInterestingIdentifier(II, MacroOffset)) { 31984d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko DataLen += 2; // 2 bytes for builtin ID 31994d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko DataLen += 2; // 2 bytes for flags 3200b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (MacroOffset) 32019317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis DataLen += 4; // MacroDirectives offset. 32024d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko 320387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (NeedDecls) { 320487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (IdentifierResolver::iterator D = IdResolver.begin(II), 320587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DEnd = IdResolver.end(); 320687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar D != DEnd; ++D) 320787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DataLen += 4; 320887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 3209a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor } 3210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 3211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 3212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 32133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert((uint16_t)DataLen == DataLen && (uint16_t)KeyLen == KeyLen); 3214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(DataLen); 321502fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor // We emit the key length after the data length so that every 321602fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor // string is preceded by a 16-bit length. This matches the PTH 321702fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor // format for storing identifiers. 3218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(KeyLen); 32193251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor return std::make_pair(KeyLen, DataLen); 32203251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor } 32211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner void EmitKey(raw_ostream& Out, const IdentifierInfo* II, 32233251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor unsigned KeyLen) { 32243251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor // Record the location of the key data. This is used when generating 32253251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor // the mapping from persistent IDs to strings. 32263251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor Writer.SetIdentifierOffset(II, Out.tell()); 322787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 322887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Emit the offset of the key/data length information to the interesting 322987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // identifiers table if necessary. 323087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (InterestingIdentifierOffsets && isInterestingIdentifier(II)) 323187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar InterestingIdentifierOffsets->push_back(Out.tell() - 4); 323287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3233e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar Out.write(II->getNameStart(), KeyLen); 32343251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor } 32351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32367143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor void EmitData(raw_ostream& Out, IdentifierInfo* II, 32378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl IdentID ID, unsigned) { 3238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 3239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 3240b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 3241b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto MacroOffset = Writer.getMacroDirectivesOffset(II); 3242b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!isInterestingIdentifier(II, MacroOffset)) { 3243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint32_t>(ID << 1); 3244a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor return; 3245a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor } 32465998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor 3247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint32_t>((ID << 1) | 0x01); 32484d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko uint32_t Bits = (uint32_t)II->getObjCOrBuiltinID(); 32494d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko assert((Bits & 0xffff) == Bits && "ObjCOrBuiltinID too big for ASTReader."); 3250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(Bits); 32514d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko Bits = 0; 3252b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar bool HadMacroDefinition = MacroOffset != 0; 32534d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko Bits = (Bits << 1) | unsigned(HadMacroDefinition); 3254b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar Bits = (Bits << 1) | unsigned(II->isExtensionToken()); 3255b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar Bits = (Bits << 1) | unsigned(II->isPoisoned()); 325687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Bits = (Bits << 1) | unsigned(II->hasRevertedBuiltin()); 3257646395bbcaa849c94bc2a3246c71d809ca719f01Argyrios Kyrtzidis Bits = (Bits << 1) | unsigned(II->hasRevertedTokenIDToIdentifier()); 3258b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar Bits = (Bits << 1) | unsigned(II->isCPlusPlusOperatorKeyword()); 3259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(Bits); 32603251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 3261b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (HadMacroDefinition) 3262b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar LE.write<uint32_t>(MacroOffset); 32634d7e0ced7f16a04aabe2d8d91cbbb52fb1162810Alexander Kornienko 326487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (NeedDecls) { 326587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Emit the declaration IDs in reverse order, because the 326687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // IdentifierResolver provides the declarations as they would be 326787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // visible (e.g., the function "stat" would come before the struct 326887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // "stat"), but the ASTReader adds declarations to the end of the list 326987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // (so we need to see the struct "stat" before the function "stat"). 327087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Only emit declarations that aren't from a chained PCH, though. 327187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<NamedDecl *, 16> Decls(IdResolver.begin(II), 327287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IdResolver.end()); 327387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (SmallVectorImpl<NamedDecl *>::reverse_iterator D = Decls.rbegin(), 327487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DEnd = Decls.rend(); 327587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar D != DEnd; ++D) 327687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint32_t>( 327787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Writer.getDeclID(getDeclForLocalLookup(PP.getLangOpts(), *D))); 327887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 32793251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor } 32803251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor}; 32813251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor} // end anonymous namespace 32823251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 32833397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/// \brief Write the identifier table into the AST file. 3284afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor/// 3285afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor/// The identifier table consists of a blob containing string data 3286afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor/// (the actual identifiers themselves) and a separate "offsets" index 3287afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor/// that maps identifier IDs to locations within the blob. 3288eee242ff426bf79149f221798966e58688383c1eDouglas Gregorvoid ASTWriter::WriteIdentifierTable(Preprocessor &PP, 3289eee242ff426bf79149f221798966e58688383c1eDouglas Gregor IdentifierResolver &IdResolver, 3290eee242ff426bf79149f221798966e58688383c1eDouglas Gregor bool IsModule) { 3291afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor using namespace llvm; 3292afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 329387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData InterestingIdents; 329487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3295afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor // Create and write out the blob that contains the identifier 3296afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor // strings. 3297afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor { 32986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait> Generator; 329987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTIdentifierTableTrait Trait( 330087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar *this, PP, IdResolver, IsModule, 330187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar (getLangOpts().CPlusPlus && IsModule) ? &InterestingIdents : nullptr); 33021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330392b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor // Look for any identifiers that were named while processing the 330492b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor // headers, but are otherwise not needed. We add these to the hash 330592b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor // table to enable checking of the predefines buffer in the case 33063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl // where the user adds new macro definitions when building the AST 330792b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor // file. 33083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SmallVector<const IdentifierInfo *, 128> IIs; 330987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &ID : PP.getIdentifierTable()) 331087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IIs.push_back(ID.second); 33113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Sort the identifiers lexicographically before getting them references so 33123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // that their order is stable. 33133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar std::sort(IIs.begin(), IIs.end(), llvm::less_ptr<IdentifierInfo>()); 33143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (const IdentifierInfo *II : IIs) 331587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Trait.isInterestingNonMacroIdentifier(II)) 331687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getIdentifierRef(II); 331792b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor 3318f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl // Create the on-disk hash table representation. We only store offsets 3319f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl // for identifiers that appear here for the first time. 3320f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl IdentifierOffsets.resize(NextIdentID - FirstIdentID); 33213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto IdentIDPair : IdentifierIDs) { 332287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *II = const_cast<IdentifierInfo *>(IdentIDPair.first); 33233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar IdentID ID = IdentIDPair.second; 33243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(II && "NULL identifier in identifier table"); 33254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Write out identifiers if either the ID is local or the identifier has 33264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // changed since it was loaded. 33274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ID >= FirstIdentID || !Chain || !II->isFromAST() 33284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar || II->hasChangedSinceDeserialization() || 33294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (Trait.needDecls() && 33304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar II->hasFETokenInfoChangedSinceDeserialization())) 33313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Generator.insert(II, ID, Trait); 33323251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor } 3333afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 33343251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor // Create the on-disk hash table in a buffer. 3335f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<4096> IdentifierTable; 3336668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor uint32_t BucketOffset; 33373251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor { 3338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 33393251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor llvm::raw_svector_ostream Out(IdentifierTable); 3340f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor // Make sure that no bucket is at offset 0 3341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little>(Out).write<uint32_t>(0); 3342668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor BucketOffset = Generator.Emit(Out, Trait); 3343afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor } 3344afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 3345afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor // Create a blob abbreviation 334687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 33478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(IDENTIFIER_TABLE)); 3348668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); 33493251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 3350c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor unsigned IDTableAbbrev = Stream.EmitAbbrev(Abbrev); 3351afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 3352afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor // Write the identifier table 335387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {IDENTIFIER_TABLE, BucketOffset}; 33543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Stream.EmitRecordWithBlob(IDTableAbbrev, Record, IdentifierTable); 3355afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor } 3356afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 3357afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor // Write the offsets table for identifier IDs. 335887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 33598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Abbrev->Add(BitCodeAbbrevOp(IDENTIFIER_OFFSET)); 33602b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of identifiers 33616ec60e00eeaaed78d98c85ce962d6f328094ca14Douglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID 33622b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 33632b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(Abbrev); 33642b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor 33652d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor#ifndef NDEBUG 33662d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor for (unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I) 33672d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor assert(IdentifierOffsets[I] && "Missing identifier offset?"); 33682d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor#endif 336987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 337087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {IDENTIFIER_OFFSET, 337187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IdentifierOffsets.size(), 337287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FirstIdentID - NUM_PREDEF_IDENT_IDS}; 33732b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev, Record, 3374b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar bytes(IdentifierOffsets)); 337587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 337687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // In C++, write the list of interesting identifiers (those that are 337787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // defined as macros, poisoned, or similar unusual things). 337887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!InterestingIdents.empty()) 337987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecord(INTERESTING_IDENTIFIERS, InterestingIdents); 3380afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor} 3381afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 33824fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 33835d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis// DeclContext's Name Lookup Table Serialization 33845d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 33855d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 33865d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidisnamespace { 33875d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis// Trait used for the on-disk hash table used in the method pool. 33885d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidisclass ASTDeclContextNameLookupTrait { 33895d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis ASTWriter &Writer; 339087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::SmallVector<DeclID, 64> DeclIDs; 33915d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 33925d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidispublic: 339387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar typedef DeclarationNameKey key_type; 33945d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis typedef key_type key_type_ref; 33955d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 339687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// A start and end index into DeclIDs, representing a sequence of decls. 339787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar typedef std::pair<unsigned, unsigned> data_type; 33985d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis typedef const data_type& data_type_ref; 33995d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 34006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef unsigned hash_value_type; 34016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef unsigned offset_type; 34026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 34035d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis explicit ASTDeclContextNameLookupTrait(ASTWriter &Writer) : Writer(Writer) { } 34045d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 340587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar template<typename Coll> 340687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar data_type getData(const Coll &Decls) { 340787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned Start = DeclIDs.size(); 340887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (NamedDecl *D : Decls) { 340987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclIDs.push_back( 341087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Writer.GetDeclRef(getDeclForLocalLookup(Writer.getLangOpts(), D))); 34115d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 341287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return std::make_pair(Start, DeclIDs.size()); 341387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 34145d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 341587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar data_type ImportData(const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) { 341687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned Start = DeclIDs.size(); 341787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto ID : FromReader) 341887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclIDs.push_back(ID); 341987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return std::make_pair(Start, DeclIDs.size()); 34205d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 34215d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 342287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar static bool EqualKey(key_type_ref a, key_type_ref b) { 342387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return a == b; 342487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 342587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 342687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar hash_value_type ComputeHash(DeclarationNameKey Name) { 342787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Name.getHash(); 342887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 342987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 343087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void EmitFileRef(raw_ostream &Out, ModuleFile *F) const { 343187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Writer.hasChain() && 343287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "have reference to loaded module file but no chain?"); 343387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 343487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar using namespace llvm::support; 343587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar endian::Writer<little>(Out) 343687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar .write<uint32_t>(Writer.getChain()->getModuleFileID(F)); 343787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 343887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 343987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out, 344087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclarationNameKey Name, 344187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar data_type_ref Lookup) { 3442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 3443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 34445d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis unsigned KeyLen = 1; 344587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar switch (Name.getKind()) { 34465d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::Identifier: 34475d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::ObjCZeroArgSelector: 34485d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::ObjCOneArgSelector: 34495d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::ObjCMultiArgSelector: 34505d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::CXXLiteralOperatorName: 34515d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis KeyLen += 4; 34525d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis break; 34535d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::CXXOperatorName: 34545d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis KeyLen += 1; 34555d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis break; 3456e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor case DeclarationName::CXXConstructorName: 3457e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor case DeclarationName::CXXDestructorName: 3458e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor case DeclarationName::CXXConversionFunctionName: 34595d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::CXXUsingDirective: 34605d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis break; 34615d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 3462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(KeyLen); 34635d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 346487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // 4 bytes for each DeclID. 346587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned DataLen = 4 * (Lookup.second - Lookup.first); 346687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(uint16_t(DataLen) == DataLen && 346787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "too many decls for serialized lookup result"); 3468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(DataLen); 34695d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 34705d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return std::make_pair(KeyLen, DataLen); 34715d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 34725d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 347387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void EmitKey(raw_ostream &Out, DeclarationNameKey Name, unsigned) { 3474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 3475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 347687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint8_t>(Name.getKind()); 347787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar switch (Name.getKind()) { 34785d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::Identifier: 347987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case DeclarationName::CXXLiteralOperatorName: 348087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint32_t>(Writer.getIdentifierRef(Name.getIdentifier())); 34815931331d4b99c8c602fa3ab6c82b94adb7e5552fBenjamin Kramer return; 34825d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::ObjCZeroArgSelector: 34835d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::ObjCOneArgSelector: 34845d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::ObjCMultiArgSelector: 348587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint32_t>(Writer.getSelectorRef(Name.getSelector())); 34865931331d4b99c8c602fa3ab6c82b94adb7e5552fBenjamin Kramer return; 34875d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::CXXOperatorName: 348887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Name.getOperatorKind() < NUM_OVERLOADED_OPERATORS && 34895931331d4b99c8c602fa3ab6c82b94adb7e5552fBenjamin Kramer "Invalid operator?"); 349087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint8_t>(Name.getOperatorKind()); 34915931331d4b99c8c602fa3ab6c82b94adb7e5552fBenjamin Kramer return; 3492e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor case DeclarationName::CXXConstructorName: 3493e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor case DeclarationName::CXXDestructorName: 3494e36050111e2bdb7efc014af9dd7f0009b492ac36Douglas Gregor case DeclarationName::CXXConversionFunctionName: 34955d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case DeclarationName::CXXUsingDirective: 34965931331d4b99c8c602fa3ab6c82b94adb7e5552fBenjamin Kramer return; 34975d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 34985931331d4b99c8c602fa3ab6c82b94adb7e5552fBenjamin Kramer 34995931331d4b99c8c602fa3ab6c82b94adb7e5552fBenjamin Kramer llvm_unreachable("Invalid name kind?"); 35005d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 35015d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 350287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup, 350387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned DataLen) { 3504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 3505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 35065d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis uint64_t Start = Out.tell(); (void)Start; 350787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (unsigned I = Lookup.first, N = Lookup.second; I != N; ++I) 350887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LE.write<uint32_t>(DeclIDs[I]); 35095d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis assert(Out.tell() - Start == DataLen && "Data length is wrong"); 35105d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 35115d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis}; 35125d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis} // end anonymous namespace 35135d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 35143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarbool ASTWriter::isLookupResultExternal(StoredDeclsList &Result, 35153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclContext *DC) { 35163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return Result.hasExternalDecls() && DC->NeedToReconcileExternalVisibleStorage; 35173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 35183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 35193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarbool ASTWriter::isLookupResultEntirelyExternal(StoredDeclsList &Result, 35203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclContext *DC) { 35213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto *D : Result.getLookupResult()) 35223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!getDeclForLocalLookup(getLangOpts(), D)->isFromASTFile()) 35233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return false; 35243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 35253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return true; 35263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 35273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 352887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid 35293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarASTWriter::GenerateNameLookupTable(const DeclContext *ConstDC, 35303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar llvm::SmallVectorImpl<char> &LookupTable) { 35313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(!ConstDC->HasLazyLocalLexicalLookups && 35323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar !ConstDC->HasLazyExternalLexicalLookups && 35333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar "must call buildLookups first"); 35343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 35356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: We need to build the lookups table, which is logically const. 353687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *DC = const_cast<DeclContext*>(ConstDC); 35376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(DC == DC->getPrimaryContext() && "only primary DC has lookup table"); 35386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Create the on-disk hash table representation. 354087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait, 354187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTDeclContextNameLookupTrait> Generator; 35423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ASTDeclContextNameLookupTrait Trait(*this); 35433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 35443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // The first step is to collect the declaration names which we need to 35453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // serialize into the name lookup table, and to collect them in a stable 35463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // order. 35473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SmallVector<DeclarationName, 16> Names; 35483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 35493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // We also build up small sets of the constructor and conversion function 35503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // names which are visible. 35513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar llvm::SmallSet<DeclarationName, 8> ConstructorNameSet, ConversionNameSet; 35523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 35536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (auto &Lookup : *DC->buildLookup()) { 35543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar auto &Name = Lookup.first; 35553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar auto &Result = Lookup.second; 35563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 355787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // If there are no local declarations in our lookup result, we 355887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // don't need to write an entry for the name at all. If we can't 355987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // write out a lookup set without performing more deserialization, 356087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // just skip this entry. 356187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isLookupResultExternal(Result, DC) && 35623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar isLookupResultEntirelyExternal(Result, DC)) 35636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines continue; 35646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // We also skip empty results. If any of the results could be external and 35663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // the currently available results are empty, then all of the results are 35673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // external and we skip it above. So the only way we get here with an empty 35683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // results is when no results could have been external *and* we have 35693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // external results. 35703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // 35713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // FIXME: While we might want to start emitting on-disk entries for negative 35723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // lookups into a decl context as an optimization, today we *have* to skip 35733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // them because there are names with empty lookup results in decl contexts 35743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // which we can't emit in any stable ordering: we lookup constructors and 35753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // conversion functions in the enclosing namespace scope creating empty 35763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // results for them. This in almost certainly a bug in Clang's name lookup, 35773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // but that is likely to be hard or impossible to fix and so we tolerate it 35783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // here by omitting lookups with empty results. 35793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Lookup.second.getLookupResult().empty()) 35803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar continue; 35816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 35823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar switch (Lookup.first.getNameKind()) { 35833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar default: 35843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Names.push_back(Lookup.first); 35853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 35863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 35873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case DeclarationName::CXXConstructorName: 35883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(isa<CXXRecordDecl>(DC) && 35893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar "Cannot have a constructor name outside of a class!"); 35903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ConstructorNameSet.insert(Name); 35913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 35923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 35933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case DeclarationName::CXXConversionFunctionName: 35943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(isa<CXXRecordDecl>(DC) && 35953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar "Cannot have a conversion function name outside of a class!"); 35963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ConversionNameSet.insert(Name); 35973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 35983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 35996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 36006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 36013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Sort the names into a stable order. 36023ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar std::sort(Names.begin(), Names.end()); 36033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 36043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (auto *D = dyn_cast<CXXRecordDecl>(DC)) { 36053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // We need to establish an ordering of constructor and conversion function 36063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // names, and they don't have an intrinsic ordering. 36073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 36083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // First we try the easy case by forming the current context's constructor 36093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // name and adding that name first. This is a very useful optimization to 36103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // avoid walking the lexical declarations in many cases, and it also 36113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // handles the only case where a constructor name can come from some other 36123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // lexical context -- when that name is an implicit constructor merged from 36133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // another declaration in the redecl chain. Any non-implicit constructor or 36143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // conversion function which doesn't occur in all the lexical contexts 36153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // would be an ODR violation. 36163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar auto ImplicitCtorName = Context->DeclarationNames.getCXXConstructorName( 36173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Context->getCanonicalType(Context->getRecordType(D))); 36183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (ConstructorNameSet.erase(ImplicitCtorName)) 36193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Names.push_back(ImplicitCtorName); 36203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 36213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // If we still have constructors or conversion functions, we walk all the 36223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // names in the decl and add the constructors and conversion functions 36233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // which are visible in the order they lexically occur within the context. 36243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!ConstructorNameSet.empty() || !ConversionNameSet.empty()) 36253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (Decl *ChildD : cast<CXXRecordDecl>(DC)->decls()) 36263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (auto *ChildND = dyn_cast<NamedDecl>(ChildD)) { 36273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar auto Name = ChildND->getDeclName(); 36283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar switch (Name.getNameKind()) { 36293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar default: 36303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar continue; 36313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 36323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case DeclarationName::CXXConstructorName: 36333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (ConstructorNameSet.erase(Name)) 36343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Names.push_back(Name); 36353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 36363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 36373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case DeclarationName::CXXConversionFunctionName: 36383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (ConversionNameSet.erase(Name)) 36393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Names.push_back(Name); 36403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 36413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 3642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 36433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (ConstructorNameSet.empty() && ConversionNameSet.empty()) 36443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 36453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 3646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 36473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(ConstructorNameSet.empty() && "Failed to find all of the visible " 36483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar "constructors by walking all the " 36493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar "lexical members of the context."); 36503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(ConversionNameSet.empty() && "Failed to find all of the visible " 36513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar "conversion functions by walking all " 36523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar "the lexical members of the context."); 36533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 36543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 36553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Next we need to do a lookup with each name into this decl context to fully 36563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // populate any results from external sources. We don't actually use the 36573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // results of these lookups because we only want to use the results after all 36583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // results have been loaded and the pointers into them will be stable. 36593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto &Name : Names) 36603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DC->lookup(Name); 36613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 36623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Now we need to insert the results for each name into the hash table. For 36633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // constructor names and conversion function names, we actually need to merge 36643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // all of the results for them into one list of results each and insert 36653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // those. 3666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVector<NamedDecl *, 8> ConstructorDecls; 36673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar SmallVector<NamedDecl *, 8> ConversionDecls; 3668651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 36693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Now loop over the names, either inserting them or appending for the two 36703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // special cases. 36713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto &Name : Names) { 36723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclContext::lookup_result Result = DC->noload_lookup(Name); 3673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (Name.getNameKind()) { 36753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar default: 367687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Generator.insert(Name, Trait.getData(Result), Trait); 36773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 36783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 3679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case DeclarationName::CXXConstructorName: 3680651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ConstructorDecls.append(Result.begin(), Result.end()); 36813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 36826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3683651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case DeclarationName::CXXConversionFunctionName: 3684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ConversionDecls.append(Result.begin(), Result.end()); 3685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 3686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 3687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 36886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 36893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Handle our two special cases if we ended up having any. We arbitrarily use 36903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // the first declaration's name here because the name itself isn't part of 36913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // the key, only the kind of name is used. 36923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!ConstructorDecls.empty()) 36933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Generator.insert(ConstructorDecls.front()->getDeclName(), 369487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Trait.getData(ConstructorDecls), Trait); 36953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!ConversionDecls.empty()) 36963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Generator.insert(ConversionDecls.front()->getDeclName(), 369787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Trait.getData(ConversionDecls), Trait); 3698651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 369987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Create the on-disk hash table. Also emit the existing imported and 370087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // merged table if there is one. 370187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Lookups = Chain ? Chain->getLoadedLookupTables(DC) : nullptr; 370287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table : nullptr); 3703651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 3704651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3705074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis/// \brief Write the block containing all of the declaration IDs 3706074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis/// visible from the given DeclContext. 3707074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis/// 3708074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis/// \returns the offset of the DECL_CONTEXT_VISIBLE block within the 37091d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl/// bitstream, or 0 if no block was written. 3710074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidisuint64_t ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context, 3711074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis DeclContext *DC) { 371287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // If we imported a key declaration of this namespace, write the visible 371387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // lookup results as an update record for it rather than including them 371487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // on this declaration. We will only look at key declarations on reload. 371587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isa<NamespaceDecl>(DC) && Chain && 371687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Chain->getKeyDeclaration(cast<Decl>(DC))->isFromASTFile()) { 371787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Only do this once, for the first local declaration of the namespace. 371887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto *Prev = cast<NamespaceDecl>(DC)->getPreviousDecl(); Prev; 371987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Prev = Prev->getPreviousDecl()) 372087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!Prev->isFromASTFile()) 372187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return 0; 372287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 372387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Note that we need to emit an update record for the primary context. 372487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar UpdatedDeclContexts.insert(DC->getPrimaryContext()); 372587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 372687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Make sure all visible decls are written. They will be recorded later. We 372787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // do this using a side data structure so we can sort the names into 372887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // a deterministic order. 372987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar StoredDeclsMap *Map = DC->getPrimaryContext()->buildLookup(); 373087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16> 373187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LookupResults; 373287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Map) { 373387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LookupResults.reserve(Map->size()); 373487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto &Entry : *Map) 373587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LookupResults.push_back( 373687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::make_pair(Entry.first, Entry.second.getLookupResult())); 373787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 373887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 373987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::sort(LookupResults.begin(), LookupResults.end(), llvm::less_first()); 374087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto &NameAndResult : LookupResults) { 374187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclarationName Name = NameAndResult.first; 374287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclContext::lookup_result Result = NameAndResult.second; 374387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Name.getNameKind() == DeclarationName::CXXConstructorName || 374487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Name.getNameKind() == DeclarationName::CXXConversionFunctionName) { 374587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // We have to work around a name lookup bug here where negative lookup 374687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // results for these names get cached in namespace lookup tables (these 374787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // names should never be looked up in a namespace). 374887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Result.empty() && "Cannot have a constructor or conversion " 374987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "function name in a namespace!"); 375087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar continue; 375187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 375287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 375387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (NamedDecl *ND : Result) 375487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!ND->isFromASTFile()) 375587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar GetDeclRef(ND); 375687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 375787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 375887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return 0; 375987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 376087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3761074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis if (DC->getPrimaryContext() != DC) 3762074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return 0; 3763074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 37643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Skip contexts which don't support name lookup. 37653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!DC->isLookupContext()) 3766074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return 0; 3767074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 3768074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis // If not in C++, we perform name lookup for the translation unit via the 3769074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis // IdentifierInfo chains, don't bother to build a visible-declarations table. 37704e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (DC->isTranslationUnit() && !Context.getLangOpts().CPlusPlus) 3771074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return 0; 3772074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 3773074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis // Serialize the contents of the mapping used for lookup. Note that, 3774074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis // although we have two very different code paths, the serialized 3775074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis // representation is the same for both cases: a declaration name, 3776074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis // followed by a size, followed by references to the visible 3777074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis // declarations that have that name. 3778074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis uint64_t Offset = Stream.GetCurrentBitNo(); 3779c5d3e80c64af9604ad798282cc6861f9cd2afc52Richard Smith StoredDeclsMap *Map = DC->buildLookup(); 3780074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis if (!Map || Map->empty()) 3781074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return 0; 3782074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 3783074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis // Create the on-disk hash table in a buffer. 3784f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<4096> LookupTable; 378587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar GenerateNameLookupTable(DC, LookupTable); 3786074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 3787074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis // Write the lookup table 378887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {DECL_CONTEXT_VISIBLE}; 3789074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev, Record, 37903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar LookupTable); 3791074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis ++NumVisibleDeclContexts; 3792074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return Offset; 3793074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis} 3794074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 37951d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl/// \brief Write an UPDATE_VISIBLE block for the given context. 37961d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl/// 37971d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl/// UPDATE_VISIBLE blocks contain the declarations that are added to an existing 37981d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl/// DeclContext in a dependent AST file. As such, they only exist for the TU 3799c5d3e80c64af9604ad798282cc6861f9cd2afc52Richard Smith/// (in C++), for namespaces, and for classes with forward-declared unscoped 3800c5d3e80c64af9604ad798282cc6861f9cd2afc52Richard Smith/// enumeration members (in C++11). 38011d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redlvoid ASTWriter::WriteDeclContextVisibleUpdate(const DeclContext *DC) { 3802651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StoredDeclsMap *Map = DC->getLookupPtr(); 38031d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl if (!Map || Map->empty()) 38041d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl return; 38051d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl 38061d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl // Create the on-disk hash table in a buffer. 3807f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<4096> LookupTable; 380887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar GenerateNameLookupTable(DC, LookupTable); 380987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 381087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // If we're updating a namespace, select a key declaration as the key for the 381187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // update record; those are the only ones that will be checked on reload. 381287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isa<NamespaceDecl>(DC)) 381387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DC = cast<DeclContext>(Chain->getKeyDeclaration(cast<Decl>(DC))); 38141d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl 38151d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl // Write the lookup table 381687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {UPDATE_VISIBLE, getDeclID(cast<Decl>(DC))}; 38173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Stream.EmitRecordWithBlob(UpdateVisibleAbbrev, Record, LookupTable); 38181d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl} 38191d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl 382084bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne/// \brief Write an FP_PRAGMA_OPTIONS block for the given FPOptions. 382184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbournevoid ASTWriter::WriteFPPragmaOptions(const FPOptions &Opts) { 382287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {Opts.fp_contract}; 382384bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne Stream.EmitRecord(FP_PRAGMA_OPTIONS, Record); 382484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne} 382584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne 382684bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne/// \brief Write an OPENCL_EXTENSIONS block for the given OpenCLOptions. 382784bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbournevoid ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) { 38284e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.Context.getLangOpts().OpenCL) 382984bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne return; 383084bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne 383184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne const OpenCLOptions &Opts = SemaRef.getOpenCLOptions(); 383284bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne RecordData Record; 383384bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne#define OPENCLEXT(nm) Record.push_back(Opts.nm); 383484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne#include "clang/Basic/OpenCLExtensions.def" 383584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne Stream.EmitRecord(OPENCL_EXTENSIONS, Record); 383684bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne} 383784bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne 3838cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregorvoid ASTWriter::WriteObjCCategories() { 3839cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<ObjCCategoriesInfo, 2> CategoriesMap; 3840cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor RecordData Categories; 3841cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 3842cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor for (unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) { 3843cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor unsigned Size = 0; 3844cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor unsigned StartIndex = Categories.size(); 3845cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 3846cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor ObjCInterfaceDecl *Class = ObjCClassesWithCategories[I]; 3847cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 3848cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor // Allocate space for the size. 3849cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor Categories.push_back(0); 3850cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 3851cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor // Add the categories. 3852d329724745b49f894b768d47275b7c2713106e89Douglas Gregor for (ObjCInterfaceDecl::known_categories_iterator 3853d329724745b49f894b768d47275b7c2713106e89Douglas Gregor Cat = Class->known_categories_begin(), 3854d329724745b49f894b768d47275b7c2713106e89Douglas Gregor CatEnd = Class->known_categories_end(); 3855d329724745b49f894b768d47275b7c2713106e89Douglas Gregor Cat != CatEnd; ++Cat, ++Size) { 3856d329724745b49f894b768d47275b7c2713106e89Douglas Gregor assert(getDeclID(*Cat) != 0 && "Bogus category"); 3857d329724745b49f894b768d47275b7c2713106e89Douglas Gregor AddDeclRef(*Cat, Categories); 3858cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor } 3859cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 3860cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor // Update the size. 3861cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor Categories[StartIndex] = Size; 3862cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 3863cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor // Record this interface -> category map. 3864cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor ObjCCategoriesInfo CatInfo = { getDeclID(Class), StartIndex }; 3865cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor CategoriesMap.push_back(CatInfo); 3866cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor } 3867cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 3868cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor // Sort the categories map by the definition ID, since the reader will be 3869cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor // performing binary searches on this information. 3870cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end()); 3871cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 3872cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor // Emit the categories map. 3873cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor using namespace llvm; 387487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 387587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 3876cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(OBJC_CATEGORIES_MAP)); 3877cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of entries 3878cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 3879cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor unsigned AbbrevID = Stream.EmitAbbrev(Abbrev); 388087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 388187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {OBJC_CATEGORIES_MAP, CategoriesMap.size()}; 388287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(AbbrevID, Record, 388387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar reinterpret_cast<char *>(CategoriesMap.data()), 3884cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor CategoriesMap.size() * sizeof(ObjCCategoriesInfo)); 388587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3886cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor // Emit the category lists. 3887cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor Stream.EmitRecord(OBJC_CATEGORIES, Categories); 3888cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor} 3889cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 3890ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smithvoid ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) { 3891ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith Sema::LateParsedTemplateMapT &LPTMap = SemaRef.LateParsedTemplateMap; 3892ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 3893ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith if (LPTMap.empty()) 3894ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith return; 3895ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 3896ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith RecordData Record; 38973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto LPTMapEntry : LPTMap) { 38983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar const FunctionDecl *FD = LPTMapEntry.first; 38993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar LateParsedTemplate *LPT = LPTMapEntry.second; 39003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar AddDeclRef(FD, Record); 3901ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith AddDeclRef(LPT->D, Record); 3902ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith Record.push_back(LPT->Toks.size()); 3903ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 390487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &Tok : LPT->Toks) { 390587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddToken(Tok, Record); 3906ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith } 3907ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith } 3908ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith Stream.EmitRecord(LATE_PARSED_TEMPLATE, Record); 3909ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith} 3910ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 39116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \brief Write the state of 'pragma clang optimize' at the end of the module. 39126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) { 39136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RecordData Record; 39146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation PragmaLoc = SemaRef.getOptimizeOffPragmaLocation(); 39156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AddSourceLocation(PragmaLoc, Record); 39166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Stream.EmitRecord(OPTIMIZE_PRAGMA_OPTIONS, Record); 39176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 39186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 39194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief Write the state of 'pragma ms_struct' at the end of the module. 39204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) { 39214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RecordData Record; 39224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.push_back(SemaRef.MSStructPragmaOn ? PMSST_ON : PMSST_OFF); 39234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stream.EmitRecord(MSSTRUCT_PRAGMA_OPTIONS, Record); 39244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 39254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 39264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief Write the state of 'pragma pointers_to_members' at the end of the 39274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//module. 39284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTWriter::WriteMSPointersToMembersPragmaOptions(Sema &SemaRef) { 39294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RecordData Record; 39304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.push_back(SemaRef.MSPointerToMemberRepresentationMethod); 39314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(SemaRef.ImplicitMSInheritanceAttrLoc, Record); 39324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stream.EmitRecord(POINTERS_TO_MEMBERS_PRAGMA_OPTIONS, Record); 39334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 39344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 393587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid ASTWriter::WriteModuleFileExtension(Sema &SemaRef, 393687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ModuleFileExtensionWriter &Writer) { 393787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Enter the extension block. 393887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EnterSubblock(EXTENSION_BLOCK_ID, 4); 393987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 394087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Emit the metadata record abbreviation. 394187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abv = new llvm::BitCodeAbbrev(); 394287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Abv->Add(llvm::BitCodeAbbrevOp(EXTENSION_METADATA)); 394387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6)); 394487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6)); 394587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6)); 394687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6)); 394787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)); 394887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned Abbrev = Stream.EmitAbbrev(Abv); 394987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 395087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Emit the metadata record. 395187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData Record; 395287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto Metadata = Writer.getExtension()->getExtensionMetadata(); 395387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(EXTENSION_METADATA); 395487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(Metadata.MajorVersion); 395587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(Metadata.MinorVersion); 395687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(Metadata.BlockName.size()); 395787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Record.push_back(Metadata.UserInfo.size()); 395887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallString<64> Buffer; 395987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Buffer += Metadata.BlockName; 396087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Buffer += Metadata.UserInfo; 396187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(Abbrev, Record, Buffer); 396287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 396387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Emit the contents of the extension block. 396487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Writer.writeExtensionContents(SemaRef, Stream); 396587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 396687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Exit the extension block. 396787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.ExitBlock(); 396887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 396987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 39705d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 39714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor// General Serialization Routines 39724fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor//===----------------------------------------------------------------------===// 39734fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 39744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief Emit the list of attributes to the specified record. 39754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddAttributes(ArrayRef<const Attr *> Attrs) { 39764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto &Record = *this; 39774eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis Record.push_back(Attrs.size()); 397887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto *A : Attrs) { 3979cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt Record.push_back(A->getKind()); // FIXME: stable encoding, target attrs 39804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceRange(A->getRange()); 398168a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor 3982cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt#include "clang/Serialization/AttrPCHWrite.inc" 39835b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian 398468a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor } 398568a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor} 398668a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor 3987aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCallvoid ASTWriter::AddToken(const Token &Tok, RecordDataImpl &Record) { 3988aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall AddSourceLocation(Tok.getLocation(), Record); 3989aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Record.push_back(Tok.getLength()); 3990aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall 3991aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall // FIXME: When reading literal tokens, reconstruct the literal pointer 3992aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall // if it is needed. 3993aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall AddIdentifierRef(Tok.getIdentifierInfo(), Record); 3994aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall // FIXME: Should translate token kind to a stable encoding. 3995aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Record.push_back(Tok.getKind()); 3996aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall // FIXME: Should translate token flags to a stable encoding. 3997aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Record.push_back(Tok.getFlags()); 3998aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall} 3999aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall 40005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid ASTWriter::AddString(StringRef Str, RecordDataImpl &Record) { 400168a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor Record.push_back(Str.size()); 400268a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor Record.insert(Record.end(), Str.begin(), Str.end()); 400368a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor} 400468a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor 40050e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesbool ASTWriter::PreparePathForOutput(SmallVectorImpl<char> &Path) { 40060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines assert(Context && "should have context when outputting path"); 40070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 40080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool Changed = 40090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines cleanPathForOutput(Context->getSourceManager().getFileManager(), Path); 40100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 40110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Remove a prefix to make the path relative, if relevant. 40120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines const char *PathBegin = Path.data(); 40130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines const char *PathPtr = 40140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines adjustFilenameForRelocatableAST(PathBegin, BaseDirectory); 40150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (PathPtr != PathBegin) { 40160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin)); 40170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Changed = true; 40180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 40190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 40200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return Changed; 40210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 40220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 40230e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid ASTWriter::AddPath(StringRef Path, RecordDataImpl &Record) { 40240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallString<128> FilePath(Path); 40250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines PreparePathForOutput(FilePath); 40260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines AddString(FilePath, Record); 40270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 40280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 402987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid ASTWriter::EmitRecordWithPath(unsigned Abbrev, RecordDataRef Record, 40300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines StringRef Path) { 40310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SmallString<128> FilePath(Path); 40320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines PreparePathForOutput(FilePath); 40330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Stream.EmitRecordWithBlob(Abbrev, Record, FilePath); 40340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 40350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 40360a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregorvoid ASTWriter::AddVersionTuple(const VersionTuple &Version, 40370a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor RecordDataImpl &Record) { 40380a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Record.push_back(Version.getMajor()); 4039dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> Minor = Version.getMinor()) 40400a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Record.push_back(*Minor + 1); 40410a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor else 40420a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Record.push_back(0); 4043dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> Subminor = Version.getSubminor()) 40440a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Record.push_back(*Subminor + 1); 40450a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor else 40460a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor Record.push_back(0); 40470a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor} 40480a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor 40493251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor/// \brief Note that the identifier II occurs at the given offset 40503251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor/// within the identifier table. 4051a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redlvoid ASTWriter::SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset) { 40528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl IdentID ID = IdentifierIDs[II]; 40533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl // Only store offsets new to this AST file. Other identifier names are looked 4054f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl // up earlier in the chain and thus don't need an offset. 4055f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl if (ID >= FirstIdentID) 4056f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl IdentifierOffsets[ID - FirstIdentID] = Offset; 40573251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor} 40583251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 405983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor/// \brief Note that the selector Sel occurs at the given offset 406083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor/// within the method pool/selector table. 4061a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redlvoid ASTWriter::SetSelectorOffset(Selector Sel, uint32_t Offset) { 406283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor unsigned ID = SelectorIDs[Sel]; 406383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor assert(ID && "Unknown selector"); 4064e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl // Don't record offsets for selectors that are also available in a different 4065e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl // file. 4066e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl if (ID < FirstSelectorID) 4067e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl return; 4068e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl SelectorOffsets[ID - FirstSelectorID] = Offset; 406983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor} 407083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 407187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarASTWriter::ASTWriter( 407287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::BitstreamWriter &Stream, 407387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ArrayRef<llvm::IntrusiveRefCntPtr<ModuleFileExtension>> Extensions, 407487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool IncludeTimestamps) 4075176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : Stream(Stream), Context(nullptr), PP(nullptr), Chain(nullptr), 407687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar WritingModule(nullptr), IncludeTimestamps(IncludeTimestamps), 407787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar WritingAST(false), DoneWritingDeclsAndTypes(false), 407887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTHasCompilerErrors(false), FirstDeclID(NUM_PREDEF_DECL_IDS), 407987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NextDeclID(FirstDeclID), FirstTypeID(NUM_PREDEF_TYPE_IDS), 408087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NextTypeID(FirstTypeID), FirstIdentID(NUM_PREDEF_IDENT_IDS), 408187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NextIdentID(FirstIdentID), FirstMacroID(NUM_PREDEF_MACRO_IDS), 408287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NextMacroID(FirstMacroID), FirstSubmoduleID(NUM_PREDEF_SUBMODULE_IDS), 4083176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines NextSubmoduleID(FirstSubmoduleID), 4084176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FirstSelectorID(NUM_PREDEF_SELECTOR_IDS), NextSelectorID(FirstSelectorID), 40854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NumStatements(0), NumMacros(0), 4086176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines NumLexicalDeclContexts(0), NumVisibleDeclContexts(0), 408787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TypeExtQualAbbrev(0), TypeFunctionProtoAbbrev(0), DeclParmVarAbbrev(0), 4088176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclContextLexicalAbbrev(0), DeclContextVisibleLookupAbbrev(0), 4089176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines UpdateVisibleAbbrev(0), DeclRecordAbbrev(0), DeclTypedefAbbrev(0), 4090176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclVarAbbrev(0), DeclFieldAbbrev(0), DeclEnumAbbrev(0), 4091176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclObjCIvarAbbrev(0), DeclCXXMethodAbbrev(0), DeclRefExprAbbrev(0), 4092176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CharacterLiteralAbbrev(0), IntegerLiteralAbbrev(0), 409387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ExprImplicitCastAbbrev(0) { 409487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &Ext : Extensions) { 409587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (auto Writer = Ext->createExtensionWriter(*this)) 409687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ModuleFileExtensionWriters.push_back(std::move(Writer)); 409787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 409887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 40992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 410010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios KyrtzidisASTWriter::~ASTWriter() { 4101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::DeleteContainerSeconds(FileDeclIDs); 410210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis} 410310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 41040e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesconst LangOptions &ASTWriter::getLangOpts() const { 41050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines assert(WritingAST && "can't determine lang opts when not writing AST"); 41060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return Context->getLangOpts(); 41070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 41080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 410987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartime_t ASTWriter::getTimestampForOutput(const FileEntry *E) const { 411087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return IncludeTimestamps ? E->getModificationTime() : 0; 411187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 411287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 411387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainaruint64_t ASTWriter::WriteAST(Sema &SemaRef, const std::string &OutputFile, 411487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Module *WritingModule, StringRef isysroot, 411587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool hasErrors) { 411661c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor WritingAST = true; 411787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 4118bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis ASTHasCompilerErrors = hasErrors; 4119bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis 41202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // Emit the file header. 4121c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor Stream.Emit((unsigned)'C', 8); 4122c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor Stream.Emit((unsigned)'P', 8); 4123c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor Stream.Emit((unsigned)'C', 8); 4124c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor Stream.Emit((unsigned)'H', 8); 41251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4126b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner WriteBlockInfoBlock(); 41272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 41283b8043b49aff6e5d70f29ef5684214ce2473763cDouglas Gregor Context = &SemaRef.Context; 4129185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor PP = &SemaRef.PP; 4130e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor this->WritingModule = WritingModule; 413187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTFileSignature Signature = 413287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar WriteASTCore(SemaRef, isysroot, OutputFile, WritingModule); 41336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Context = nullptr; 41346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PP = nullptr; 41356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines this->WritingModule = nullptr; 41360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines this->BaseDirectory.clear(); 41376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 413861c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor WritingAST = false; 413987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Signature; 41401dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl} 41411dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl 4142a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregortemplate<typename Vector> 4143a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregorstatic void AddLazyVectorDecls(ASTWriter &Writer, Vector &Vec, 4144a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor ASTWriter::RecordData &Record) { 41456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (typename Vector::iterator I = Vec.begin(nullptr, true), E = Vec.end(); 41466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines I != E; ++I) { 4147a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor Writer.AddDeclRef(*I, Record); 4148a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor } 4149a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor} 4150a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor 415187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainaruint64_t ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot, 415287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const std::string &OutputFile, 415387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Module *WritingModule) { 41541dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl using namespace llvm; 41551dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl 41566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool isModule = WritingModule != nullptr; 4157975d353997a13f7dfdaf4ec7a547fe1adb15f35eArgyrios Kyrtzidis 4158ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor // Make sure that the AST reader knows to finalize itself. 4159ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor if (Chain) 4160ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor Chain->finalizeForWriting(); 4161ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0Douglas Gregor 41621dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl ASTContext &Context = SemaRef.Context; 41631dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl Preprocessor &PP = SemaRef.PP; 41641dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl 41656bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor // Set up predefined declaration IDs. 416687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto RegisterPredefDecl = [&] (Decl *D, PredefinedDeclIDs ID) { 416787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (D) { 416887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(D->isCanonicalDecl() && "predefined decl is not canonical"); 416987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclIDs[D] = ID; 417087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 417187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar }; 417287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.getTranslationUnitDecl(), 417387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PREDEF_DECL_TRANSLATION_UNIT_ID); 417487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.ObjCIdDecl, PREDEF_DECL_OBJC_ID_ID); 417587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.ObjCSelDecl, PREDEF_DECL_OBJC_SEL_ID); 417687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.ObjCClassDecl, PREDEF_DECL_OBJC_CLASS_ID); 417787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.ObjCProtocolClassDecl, 417887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PREDEF_DECL_OBJC_PROTOCOL_ID); 417987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.Int128Decl, PREDEF_DECL_INT_128_ID); 418087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.UInt128Decl, PREDEF_DECL_UNSIGNED_INT_128_ID); 418187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.ObjCInstanceTypeDecl, 418287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PREDEF_DECL_OBJC_INSTANCETYPE_ID); 418387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.BuiltinVaListDecl, PREDEF_DECL_BUILTIN_VA_LIST_ID); 418487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.VaListTagDecl, PREDEF_DECL_VA_LIST_TAG); 418587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.BuiltinMSVaListDecl, 418687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PREDEF_DECL_BUILTIN_MS_VA_LIST_ID); 418787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.ExternCContext, PREDEF_DECL_EXTERN_C_CONTEXT_ID); 418887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RegisterPredefDecl(Context.MakeIntegerSeqDecl, 418987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PREDEF_DECL_MAKE_INTEGER_SEQ_ID); 41904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RegisterPredefDecl(Context.CFConstantStringTypeDecl, 41914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PREDEF_DECL_CF_CONSTANT_STRING_ID); 41924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RegisterPredefDecl(Context.CFConstantStringTagDecl, 41934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID); 41944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RegisterPredefDecl(Context.TypePackElementDecl, 41954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PREDEF_DECL_TYPE_PACK_ELEMENT_ID); 41966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 419763d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner // Build a record containing all of the tentative definitions in this file, in 4198e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl // TentativeDefinitions order. Generally, this record will be empty for 419963d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner // headers. 42004c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor RecordData TentativeDefinitions; 4201a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor AddLazyVectorDecls(*this, SemaRef.TentativeDefinitions, TentativeDefinitions); 4202a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor 420349b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis // Build a record containing all of the file scoped decls in this file. 420449b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis RecordData UnusedFileScopedDecls; 4205faf01f02f6f3844cec6c2ddca297b4f33b361960Argyrios Kyrtzidis if (!isModule) 4206faf01f02f6f3844cec6c2ddca297b4f33b361960Argyrios Kyrtzidis AddLazyVectorDecls(*this, SemaRef.UnusedFileScopedDecls, 4207faf01f02f6f3844cec6c2ddca297b4f33b361960Argyrios Kyrtzidis UnusedFileScopedDecls); 42084056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 4209b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // Build a record containing all of the delegating constructors we still need 4210b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // to resolve. 4211ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt RecordData DelegatingCtorDecls; 4212975d353997a13f7dfdaf4ec7a547fe1adb15f35eArgyrios Kyrtzidis if (!isModule) 4213975d353997a13f7dfdaf4ec7a547fe1adb15f35eArgyrios Kyrtzidis AddLazyVectorDecls(*this, SemaRef.DelegatingCtorDecls, DelegatingCtorDecls); 4214ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt 4215b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // Write the set of weak, undeclared identifiers. We always write the 4216b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // entire table, since later PCH files in a PCH chain are only interested in 4217b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // the results at the end of the chain. 421872b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis RecordData WeakUndeclaredIdentifiers; 42193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (auto &WeakUndeclaredIdentifier : SemaRef.WeakUndeclaredIdentifiers) { 42203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar IdentifierInfo *II = WeakUndeclaredIdentifier.first; 42213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar WeakInfo &WI = WeakUndeclaredIdentifier.second; 42223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar AddIdentifierRef(II, WeakUndeclaredIdentifiers); 42233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar AddIdentifierRef(WI.getAlias(), WeakUndeclaredIdentifiers); 42243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar AddSourceLocation(WI.getLocation(), WeakUndeclaredIdentifiers); 42253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar WeakUndeclaredIdentifiers.push_back(WI.getUsed()); 422672b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis } 422711a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam 4228b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor // Build a record containing all of the ext_vector declarations. 4229b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor RecordData ExtVectorDecls; 4230d58a0a55e64a7c410a80e9d6dcd899e61e99cc4dDouglas Gregor AddLazyVectorDecls(*this, SemaRef.ExtVectorDecls, ExtVectorDecls); 4231b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor 4232d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis // Build a record containing all of the VTable uses information. 4233d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis RecordData VTableUses; 4234be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis if (!SemaRef.VTableUses.empty()) { 4235be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis for (unsigned I = 0, N = SemaRef.VTableUses.size(); I != N; ++I) { 4236be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis AddDeclRef(SemaRef.VTableUses[I].first, VTableUses); 4237be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis AddSourceLocation(SemaRef.VTableUses[I].second, VTableUses); 4238be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis VTableUses.push_back(SemaRef.VTablesUsed[SemaRef.VTableUses[I].first]); 4239be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis } 4240d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis } 4241d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis 4242176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Build a record containing all of the UnusedLocalTypedefNameCandidates. 4243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RecordData UnusedLocalTypedefNameCandidates; 4244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const TypedefNameDecl *TD : SemaRef.UnusedLocalTypedefNameCandidates) 4245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AddDeclRef(TD, UnusedLocalTypedefNameCandidates); 4246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 42470e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis // Build a record containing all of pending implicit instantiations. 424862c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth RecordData PendingInstantiations; 424987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &I : SemaRef.PendingInstantiations) { 425087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddDeclRef(I.first, PendingInstantiations); 425187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddSourceLocation(I.second, PendingInstantiations); 42520e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis } 42530e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis assert(SemaRef.PendingLocalImplicitInstantiations.empty() && 42540e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis "There are local ones at end of translation unit!"); 42550e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis 425676c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis // Build a record containing some declaration references. 425776c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis RecordData SemaDeclRefs; 425876c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis if (SemaRef.StdNamespace || SemaRef.StdBadAlloc) { 425976c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis AddDeclRef(SemaRef.getStdNamespace(), SemaDeclRefs); 426076c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis AddDeclRef(SemaRef.getStdBadAlloc(), SemaDeclRefs); 426176c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis } 426276c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis 426314b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne RecordData CUDASpecialDeclRefs; 426414b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne if (Context.getcudaConfigureCallDecl()) { 426514b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne AddDeclRef(Context.getcudaConfigureCallDecl(), CUDASpecialDeclRefs); 426614b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne } 426714b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne 4268d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor // Build a record containing all of the known namespaces. 4269d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor RecordData KnownNamespaces; 427087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &I : SemaRef.KnownNamespaces) { 427187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!I.second) 427287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddDeclRef(I.first, KnownNamespaces); 4273d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor } 42741d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor 4275cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky // Build a record of all used, undefined objects that require definitions. 4276cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky RecordData UndefinedButUsed; 4277995e26b0523ac8e3b6199a509b871b81fa5df6eeNick Lewycky 4278995e26b0523ac8e3b6199a509b871b81fa5df6eeNick Lewycky SmallVector<std::pair<NamedDecl *, SourceLocation>, 16> Undefined; 4279cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky SemaRef.getUndefinedButUsed(Undefined); 428087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &I : Undefined) { 428187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddDeclRef(I.first, UndefinedButUsed); 428287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AddSourceLocation(I.second, UndefinedButUsed); 428301a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky } 428401a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 4285b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Build a record containing all delete-expressions that we would like to 4286b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // analyze later in AST. 4287b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar RecordData DeleteExprsToAnalyze; 4288b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4289b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const auto &DeleteExprsInfo : 4290b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SemaRef.getMismatchingDeleteExpressions()) { 4291b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze); 4292b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size()); 4293b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (const auto &DeleteLoc : DeleteExprsInfo.second) { 4294b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar AddSourceLocation(DeleteLoc.first, DeleteExprsToAnalyze); 4295b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DeleteExprsToAnalyze.push_back(DeleteLoc.second); 4296b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 4297b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 4298b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 42991d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor // Write the control block 430087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar uint64_t Signature = WriteControlBlock(PP, Context, isysroot, OutputFile); 43011d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor 43023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl // Write the remaining AST contents. 43038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EnterSubblock(AST_BLOCK_ID, 5); 43041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43055e24f2d83099bb557b1d39c6420787eeaf072a81Argyrios Kyrtzidis // This is so that older clang versions, before the introduction 43065e24f2d83099bb557b1d39c6420787eeaf072a81Argyrios Kyrtzidis // of the control block, can read and reject the newer PCH format. 430787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 430887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData Record = {VERSION_MAJOR}; 430987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecord(METADATA_OLD_FORMAT, Record); 431087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 43115e24f2d83099bb557b1d39c6420787eeaf072a81Argyrios Kyrtzidis 4312b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // Create a lexical update block containing all of the declarations in the 4313b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // translation unit that do not come from other AST files. 43146bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor const TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); 431587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<uint32_t, 128> NewGlobalKindDeclPairs; 431687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto *D : TU->noload_decls()) { 431787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!D->isFromASTFile()) { 431887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NewGlobalKindDeclPairs.push_back(D->getKind()); 431987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NewGlobalKindDeclPairs.push_back(GetDeclRef(D)); 432087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 43216bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor } 4322b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor 432387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abv = new llvm::BitCodeAbbrev(); 43246bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor Abv->Add(llvm::BitCodeAbbrevOp(TU_UPDATE_LEXICAL)); 43256bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)); 43266bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(Abv); 432787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar { 432887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {TU_UPDATE_LEXICAL}; 432987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev, Record, 433087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bytes(NewGlobalKindDeclPairs)); 433187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 433287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 4333b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // And a visible updates block for the translation unit. 43346bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor Abv = new llvm::BitCodeAbbrev(); 43356bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor Abv->Add(llvm::BitCodeAbbrevOp(UPDATE_VISIBLE)); 43366bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6)); 43376bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)); 43386bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor UpdateVisibleAbbrev = Stream.EmitAbbrev(Abv); 43396bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor WriteDeclContextVisibleUpdate(TU); 43403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 43413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // If we have any extern "C" names, write out a visible update for them. 43423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Context.ExternCContext) 43433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar WriteDeclContextVisibleUpdate(Context.ExternCContext); 43446bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor 4345b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // If the translation unit has an anonymous namespace, and we don't already 4346b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // have an update block for it, write it as an update block. 4347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: Why do we not do this if there's already an update block? 43486bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor if (NamespaceDecl *NS = TU->getAnonymousNamespace()) { 43496bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor ASTWriter::UpdateRecord &Record = DeclUpdates[TU]; 4350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Record.empty()) 4351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record.push_back(DeclUpdate(UPD_CXX_ADDED_ANONYMOUS_NAMESPACE, NS)); 43526bf2b9fbd3e3adc38d4712de79aeaa81d651aa08Douglas Gregor } 43537518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis 4354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Add update records for all mangling numbers and static local numbers. 4355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // These aren't really update records, but this is a convenient way of 4356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // tagging this rare extra data onto the declarations. 4357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &Number : Context.MangleNumbers) 4358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Number.first->isFromASTFile()) 4359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclUpdates[Number.first].push_back(DeclUpdate(UPD_MANGLING_NUMBER, 4360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Number.second)); 4361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &Number : Context.StaticLocalNumbers) 4362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Number.first->isFromASTFile()) 4363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclUpdates[Number.first].push_back(DeclUpdate(UPD_STATIC_LOCAL_NUMBER, 4364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Number.second)); 4365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 43667518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis // Make sure visible decls, added to DeclContexts previously loaded from 43677518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis // an AST file, are registered for serialization. 436887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto *I : UpdatingVisibleDecls) { 436987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar GetDeclRef(I); 43707518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis } 43717518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis 437251e75aecf4fb303b91c9e54fd88e3509e5acc7a6Argyrios Kyrtzidis // Make sure all decls associated with an identifier are registered for 437387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // serialization, if we're storing decls with identifiers. 437487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!WritingModule || !getLangOpts().CPlusPlus) { 437587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::SmallVector<const IdentifierInfo*, 256> IIs; 437687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &ID : PP.getIdentifierTable()) { 437787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const IdentifierInfo *II = ID.second; 437887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization()) 437987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IIs.push_back(II); 438087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 438187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Sort the identifiers to visit based on their name. 438287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::sort(IIs.begin(), IIs.end(), llvm::less_ptr<IdentifierInfo>()); 438387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const IdentifierInfo *II : IIs) { 438487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (IdentifierResolver::iterator D = SemaRef.IdResolver.begin(II), 438587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DEnd = SemaRef.IdResolver.end(); 438687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar D != DEnd; ++D) { 438787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar GetDeclRef(*D); 438887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 438951e75aecf4fb303b91c9e54fd88e3509e5acc7a6Argyrios Kyrtzidis } 439051e75aecf4fb303b91c9e54fd88e3509e5acc7a6Argyrios Kyrtzidis } 439151e75aecf4fb303b91c9e54fd88e3509e5acc7a6Argyrios Kyrtzidis 43924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // For method pool in the module, if it contains an entry for a selector, 43934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // the entry should be complete, containing everything introduced by that 43944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // module and all modules it imports. It's possible that the entry is out of 43954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // date, so we need to pull in the new content here. 43964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 43974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // It's possible that updateOutOfDateSelector can update SelectorIDs. To be 43984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // safe, we copy all selectors out. 43994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::SmallVector<Selector, 256> AllSelectors; 44004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto &SelectorAndID : SelectorIDs) 44014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AllSelectors.push_back(SelectorAndID.first); 44024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto &Selector : AllSelectors) 44034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SemaRef.updateOutOfDateSelector(Selector); 44044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 4405b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // Form the record of special types. 4406b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor RecordData SpecialTypes; 4407b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor AddTypeRef(Context.getRawCFConstantStringType(), SpecialTypes); 4408b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor AddTypeRef(Context.getFILEType(), SpecialTypes); 4409b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor AddTypeRef(Context.getjmp_bufType(), SpecialTypes); 4410b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor AddTypeRef(Context.getsigjmp_bufType(), SpecialTypes); 4411b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor AddTypeRef(Context.ObjCIdRedefinitionType, SpecialTypes); 4412b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor AddTypeRef(Context.ObjCClassRedefinitionType, SpecialTypes); 4413b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor AddTypeRef(Context.ObjCSelRedefinitionType, SpecialTypes); 4414e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola AddTypeRef(Context.getucontext_tType(), SpecialTypes); 4415185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor 441610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis if (Chain) { 441710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // Write the mapping information describing our module dependencies and how 441810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // each of those modules were mapped into our own offset/ID space, so that 441910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // the reader can build the appropriate mapping to its own offset/ID space. 442010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // The map consists solely of a blob with the following format: 442110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // *(module-name-len:i16 module-name:len*i8 442210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // source-location-offset:i32 442310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // identifier-id:i32 442410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // preprocessed-entity-id:i32 442510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // macro-definition-id:i32 442626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor // submodule-id:i32 442710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // selector-id:i32 442810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // declaration-id:i32 442910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // c++-base-specifiers-id:i32 443010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // type-id:i32) 443110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // 443287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Abbrev = new BitCodeAbbrev(); 443310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(MODULE_OFFSET_MAP)); 443410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); 443510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(Abbrev); 4436f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<2048> Buffer; 443710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis { 443810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis llvm::raw_svector_ostream Out(Buffer); 4439176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ModuleFile *M : Chain->ModuleMgr) { 4440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 4441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::Writer<little> LE(Out); 4442176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines StringRef FileName = M->FileName; 4443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LE.write<uint16_t>(FileName.size()); 444410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Out.write(FileName.data(), FileName.size()); 4445176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4446176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Note: if a base ID was uint max, it would not be possible to load 4447176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // another module after it or have more than one entity inside it. 4448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines uint32_t None = std::numeric_limits<uint32_t>::max(); 4449176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto writeBaseIDOrNone = [&](uint32_t BaseID, bool ShouldWrite) { 4451176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(BaseID < std::numeric_limits<uint32_t>::max() && "base id too high"); 4452176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (ShouldWrite) 4453176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LE.write<uint32_t>(BaseID); 4454176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else 4455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LE.write<uint32_t>(None); 4456176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 4457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // These values should be unique within a chain, since they will be read 4459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // as keys into ContinuousRangeMaps. 4460176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines writeBaseIDOrNone(M->SLocEntryBaseOffset, M->LocalNumSLocEntries); 4461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines writeBaseIDOrNone(M->BaseIdentifierID, M->LocalNumIdentifiers); 4462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines writeBaseIDOrNone(M->BaseMacroID, M->LocalNumMacros); 4463176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines writeBaseIDOrNone(M->BasePreprocessedEntityID, 4464176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines M->NumPreprocessedEntities); 4465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines writeBaseIDOrNone(M->BaseSubmoduleID, M->LocalNumSubmodules); 4466176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines writeBaseIDOrNone(M->BaseSelectorID, M->LocalNumSelectors); 4467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines writeBaseIDOrNone(M->BaseDeclID, M->LocalNumDecls); 4468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines writeBaseIDOrNone(M->BaseTypeIndex, M->LocalNumTypes); 446910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis } 447010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis } 447187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = {MODULE_OFFSET_MAP}; 447210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev, Record, 447310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Buffer.data(), Buffer.size()); 447410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis } 4475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RecordData DeclUpdatesOffsetsRecord; 4477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Keep writing types, declarations, and declaration update records 4479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // until we've emitted all of them. 4480176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Stream.EnterSubblock(DECLTYPES_BLOCK_ID, /*bits for abbreviations*/5); 4481176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines WriteTypeAbbrevs(); 4482176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines WriteDeclAbbrevs(); 4483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines do { 4484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WriteDeclUpdatesBlocks(DeclUpdatesOffsetsRecord); 4485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines while (!DeclTypesToEmit.empty()) { 4486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclOrType DOT = DeclTypesToEmit.front(); 4487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclTypesToEmit.pop(); 4488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DOT.isType()) 4489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WriteType(DOT.getType()); 4490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 4491651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WriteDecl(Context, DOT.getDecl()); 4492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 4493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } while (!DeclUpdates.empty()); 4494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Stream.ExitBlock(); 4495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DoneWritingDeclsAndTypes = true; 4497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // These things can only be done once we've written out decls and types. 4499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WriteTypeDeclOffsets(); 4500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!DeclUpdatesOffsetsRecord.empty()) 4501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Stream.EmitRecord(DECL_UPDATE_OFFSETS, DeclUpdatesOffsetsRecord); 4502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WriteFileDeclIDsMap(); 45030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines WriteSourceManagerBlock(Context.getSourceManager(), PP); 4504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WriteComments(); 4505975d353997a13f7dfdaf4ec7a547fe1adb15f35eArgyrios Kyrtzidis WritePreprocessor(PP, isModule); 45060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines WriteHeaderSearch(PP.getHeaderSearchInfo()); 4507059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl WriteSelectors(SemaRef); 4508320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian WriteReferencedSelectorsPool(SemaRef); 450987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar WriteLateParsedTemplates(SemaRef); 4510975d353997a13f7dfdaf4ec7a547fe1adb15f35eArgyrios Kyrtzidis WriteIdentifierTable(PP, SemaRef.IdResolver, isModule); 451184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne WriteFPPragmaOptions(SemaRef.getFPOptions()); 451284bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne WriteOpenCLExtensions(SemaRef); 4513ea744ab5f39b8f45f802301841b77398166bce8fArgyrios Kyrtzidis WritePragmaDiagnosticMappings(Context.getDiagnostics(), isModule); 4514ad1de006ea080b540e480efc6b86c2e201dbf1ecDouglas Gregor 4515e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // If we're emitting a module, write out the submodule information. 4516e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (WritingModule) 4517e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor WriteSubmodules(WritingModule); 4518e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 4519a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor Stream.EmitRecord(SPECIAL_TYPES, SpecialTypes); 4520a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor 4521083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl // Write the record containing external, unnamed definitions. 4522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!EagerlyDeserializedDecls.empty()) 4523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Stream.EmitRecord(EAGERLY_DESERIALIZED_DECLS, EagerlyDeserializedDecls); 4524083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 4525083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl // Write the record containing tentative definitions. 4526083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl if (!TentativeDefinitions.empty()) 45278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EmitRecord(TENTATIVE_DEFINITIONS, TentativeDefinitions); 4528083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 452949b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis // Write the record containing unused file scoped decls. 453049b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis if (!UnusedFileScopedDecls.empty()) 45318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EmitRecord(UNUSED_FILESCOPED_DECLS, UnusedFileScopedDecls); 4532083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 45334056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl // Write the record containing weak undeclared identifiers. 45344056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl if (!WeakUndeclaredIdentifiers.empty()) 45358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EmitRecord(WEAK_UNDECLARED_IDENTIFIERS, 45364056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl WeakUndeclaredIdentifiers); 45374056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 4538083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl // Write the record containing ext_vector type names. 4539083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl if (!ExtVectorDecls.empty()) 45408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EmitRecord(EXT_VECTOR_DECLS, ExtVectorDecls); 4541083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 45424056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl // Write the record containing VTable uses information. 45434056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl if (!VTableUses.empty()) 45448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EmitRecord(VTABLE_USES, VTableUses); 45454056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 4546176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Write the record containing potentially unused local typedefs. 4547176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!UnusedLocalTypedefNameCandidates.empty()) 4548176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Stream.EmitRecord(UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES, 4549176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines UnusedLocalTypedefNameCandidates); 4550176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 45514056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl // Write the record containing pending implicit instantiations. 455262c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth if (!PendingInstantiations.empty()) 455362c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth Stream.EmitRecord(PENDING_IMPLICIT_INSTANTIATIONS, PendingInstantiations); 45544056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 45554056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl // Write the record containing declaration references of Sema. 45564056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl if (!SemaDeclRefs.empty()) 45578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EmitRecord(SEMA_DECL_REFS, SemaDeclRefs); 4558b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor 4559b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // Write the record containing CUDA-specific declaration references. 4560b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor if (!CUDASpecialDeclRefs.empty()) 4561b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor Stream.EmitRecord(CUDA_SPECIAL_DECL_REFS, CUDASpecialDeclRefs); 4562ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt 4563ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt // Write the delegating constructors. 4564ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt if (!DelegatingCtorDecls.empty()) 4565ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt Stream.EmitRecord(DELEGATING_CTORS, DelegatingCtorDecls); 4566083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 4567b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // Write the known namespaces. 4568b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor if (!KnownNamespaces.empty()) 4569b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor Stream.EmitRecord(KNOWN_NAMESPACES, KnownNamespaces); 457001a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 4571cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky // Write the undefined internal functions and variables, and inline functions. 4572cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky if (!UndefinedButUsed.empty()) 4573cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky Stream.EmitRecord(UNDEFINED_BUT_USED, UndefinedButUsed); 4574b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4575b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!DeleteExprsToAnalyze.empty()) 4576b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Stream.EmitRecord(DELETE_EXPRS_TO_ANALYZE, DeleteExprsToAnalyze); 4577b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 4578b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // Write the visible updates to DeclContexts. 45796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (auto *DC : UpdatedDeclContexts) 45806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines WriteDeclContextVisibleUpdate(DC); 45811d1e42b17da6a53391d50b08068ecde04311e368Sebastian Redl 4582c5e0f9b44782204437de21594c1748b1405d90bcDouglas Gregor if (!WritingModule) { 4583c5e0f9b44782204437de21594c1748b1405d90bcDouglas Gregor // Write the submodules that were imported, if any. 4584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct ModuleInfo { 4585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint64_t ID; 4586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Module *M; 4587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ModuleInfo(uint64_t ID, Module *M) : ID(ID), M(M) {} 4588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 4589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::SmallVector<ModuleInfo, 64> Imports; 4590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *I : Context.local_imports()) { 4591c5e0f9b44782204437de21594c1748b1405d90bcDouglas Gregor assert(SubmoduleIDs.find(I->getImportedModule()) != SubmoduleIDs.end()); 4592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()], 4593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I->getImportedModule())); 4594c5e0f9b44782204437de21594c1748b1405d90bcDouglas Gregor } 4595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Imports.empty()) { 4597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto Cmp = [](const ModuleInfo &A, const ModuleInfo &B) { 4598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return A.ID < B.ID; 4599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 4600176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto Eq = [](const ModuleInfo &A, const ModuleInfo &B) { 4601176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return A.ID == B.ID; 4602176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 4603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Sort and deduplicate module IDs. 4605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::sort(Imports.begin(), Imports.end(), Cmp); 4606176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Imports.erase(std::unique(Imports.begin(), Imports.end(), Eq), 4607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Imports.end()); 4608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RecordData ImportedModules; 4610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &Import : Imports) { 4611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ImportedModules.push_back(Import.ID); 4612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: If the module has macros imported then later has declarations 4613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // imported, this location won't be the right one as a location for the 4614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // declaration imports. 4615b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar AddSourceLocation(PP.getModuleImportLoc(Import.M), ImportedModules); 4616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 4617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4618c5e0f9b44782204437de21594c1748b1405d90bcDouglas Gregor Stream.EmitRecord(IMPORTED_MODULES, ImportedModules); 4619c5e0f9b44782204437de21594c1748b1405d90bcDouglas Gregor } 4620f6137e4d15cb6bbd10547267babfc699c1945873Douglas Gregor } 4621a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 4622cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor WriteObjCCategories(); 46234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if(!WritingModule) { 46246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines WriteOptimizePragmaOptions(SemaRef); 46254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar WriteMSStructPragmaOptions(SemaRef); 46264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar WriteMSPointersToMembersPragmaOptions(SemaRef); 46274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 4628ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 4629b7c324f8581a55e2a918e5f3eb2e7418b09df0f2Douglas Gregor // Some simple statistics 463087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RecordData::value_type Record[] = { 463187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NumStatements, NumMacros, NumLexicalDeclContexts, NumVisibleDeclContexts}; 46328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Stream.EmitRecord(STATISTICS, Record); 46331dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl Stream.ExitBlock(); 463487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 463587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Write the module file extension blocks. 463687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &ExtWriter : ModuleFileExtensionWriters) 463787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar WriteModuleFileExtension(SemaRef, *ExtWriter); 463887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 463987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Signature; 46401dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl} 46411dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl 4642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) { 4643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DeclUpdates.empty()) 4644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 4645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclUpdateMap LocalUpdates; 4647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LocalUpdates.swap(DeclUpdates); 4648651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4649651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto &DeclUpdate : LocalUpdates) { 4650651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Decl *D = DeclUpdate.first; 465161c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor 4652651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool HasUpdatedBody = false; 46534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RecordData RecordData; 46544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTRecordWriter Record(*this, RecordData); 4655651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto &Update : DeclUpdate.second) { 4656651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclUpdateKind Kind = (DeclUpdateKind)Update.getKind(); 4657651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 46584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // An updated body is emitted last, so that the reader doesn't need 46594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // to skip over the lazy body to reach statements for other records. 46604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Kind == UPD_CXX_ADDED_FUNCTION_DEFINITION) 46614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar HasUpdatedBody = true; 46624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 46634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.push_back(Kind); 46644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 4665651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (Kind) { 466661c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor case UPD_CXX_ADDED_IMPLICIT_MEMBER: 466761c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION: 466861c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor case UPD_CXX_ADDED_ANONYMOUS_NAMESPACE: 46696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(Update.getDecl() && "no decl to add?"); 4670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record.push_back(GetDeclRef(Update.getDecl())); 467161c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor break; 46729dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smith 4673176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case UPD_CXX_ADDED_FUNCTION_DEFINITION: 4674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 4675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4676176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER: 46774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(Update.getLoc()); 46784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 46794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 46804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT: 46814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddStmt(const_cast<Expr *>( 46824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar cast<ParmVarDecl>(Update.getDecl())->getDefaultArg())); 4683176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 4684176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 46856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case UPD_CXX_INSTANTIATED_CLASS_DEFINITION: { 46866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto *RD = cast<CXXRecordDecl>(D); 46873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar UpdatedDeclContexts.insert(RD->getPrimaryContext()); 46884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddCXXDefinitionData(RD); 46894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddOffset(WriteDeclContextLexicalBlock( 46906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines *Context, const_cast<CXXRecordDecl *>(RD))); 46916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 46926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // This state is sometimes updated by template instantiation, when we 46936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // switch from the specialization referring to the template declaration 46946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // to it referring to the template definition. 46956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (auto *MSInfo = RD->getMemberSpecializationInfo()) { 46966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Record.push_back(MSInfo->getTemplateSpecializationKind()); 46974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(MSInfo->getPointOfInstantiation()); 46986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else { 46996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto *Spec = cast<ClassTemplateSpecializationDecl>(RD); 47006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Record.push_back(Spec->getTemplateSpecializationKind()); 47014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(Spec->getPointOfInstantiation()); 47026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 47036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // The instantiation might have been resolved to a partial 47046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // specialization. If so, record which one. 47056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto From = Spec->getInstantiatedFrom(); 47066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (auto PartialSpec = 47076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) { 47086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Record.push_back(true); 47094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(PartialSpec); 47104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddTemplateArgumentList( 47114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar &Spec->getTemplateInstantiationArgs()); 47126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else { 47136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Record.push_back(false); 47146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 47156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 47166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Record.push_back(RD->getTagKind()); 47174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(RD->getLocation()); 47184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(RD->getLocStart()); 47194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(RD->getRBraceLoc()); 47206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 47216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Instantiation may change attributes; write them all out afresh. 47226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Record.push_back(D->hasAttrs()); 47234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (D->hasAttrs()) 47244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddAttributes(D->getAttrs()); 47256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 47266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: Ensure we don't get here for explicit instantiations. 47276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 47286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 47296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 47303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case UPD_CXX_RESOLVED_DTOR_DELETE: 47314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddDeclRef(Update.getDecl()); 47323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 47333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 4734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case UPD_CXX_RESOLVED_EXCEPTION_SPEC: 4735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addExceptionSpec( 4736651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<FunctionDecl>(D)->getType()->castAs<FunctionProtoType>(), 4737651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record); 473861c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor break; 47399dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smith 47409dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smith case UPD_CXX_DEDUCED_RETURN_TYPE: 4741651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record.push_back(GetOrCreateTypeID(Update.getType())); 47429dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smith break; 474361c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor 4744651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case UPD_DECL_MARKED_USED: 4745651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 47467b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 4747651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case UPD_MANGLING_NUMBER: 4748651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case UPD_STATIC_LOCAL_NUMBER: 4749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record.push_back(Update.getNumber()); 4750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 47513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 4752176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case UPD_DECL_MARKED_OPENMP_THREADPRIVATE: 47534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceRange( 47544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D->getAttr<OMPThreadPrivateDeclAttr>()->getRange()); 47554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 47564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 47574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case UPD_DECL_MARKED_OPENMP_DECLARETARGET: 47584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceRange( 47594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar D->getAttr<OMPDeclareTargetDeclAttr>()->getRange()); 4760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 47613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 47623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case UPD_DECL_EXPORTED: 4763b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Record.push_back(getSubmoduleID(Update.getModule())); 47643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 476587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 476687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case UPD_ADDED_ATTR_TO_RECORD: 47674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddAttributes(llvm::makeArrayRef(Update.getAttr())); 476887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 4769651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 4770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 47717b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 4772651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (HasUpdatedBody) { 477387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const auto *Def = cast<FunctionDecl>(D); 4774176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Record.push_back(UPD_CXX_ADDED_FUNCTION_DEFINITION); 4775651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Record.push_back(Def->isInlined()); 47764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddSourceLocation(Def->getInnerLocStart()); 47774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.AddFunctionDefinition(Def); 4778651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 4779ba901b507fc36408fe6f8478e8ac90b554f1d230Argyrios Kyrtzidis 47806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OffsetsRecord.push_back(GetDeclRef(D)); 47814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar OffsetsRecord.push_back(Record.Emit(DECL_UPDATES)); 47820b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl } 47830b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl} 47840b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl 478589eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidisvoid ASTWriter::AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record) { 47864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar uint32_t Raw = Loc.getRawEncoding(); 47874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record.push_back((Raw << 1) | (Raw >> 31)); 47882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 47892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 479089eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidisvoid ASTWriter::AddSourceRange(SourceRange Range, RecordDataImpl &Record) { 47916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner AddSourceLocation(Range.getBegin(), Record); 47926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner AddSourceLocation(Range.getEnd(), Record); 47936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 47946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 47954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddAPInt(const llvm::APInt &Value) { 47964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Value.getBitWidth()); 47974ea884b429445aa6f1af5bc6e51d0b65a4043e24Benjamin Kramer const uint64_t *Words = Value.getRawData(); 47984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->append(Words, Words + Value.getNumWords()); 47992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 48002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddAPSInt(const llvm::APSInt &Value) { 48024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Value.isUnsigned()); 48034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddAPInt(Value); 48040a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor} 48050a2b45e5885b6b8477b167042c0f6cd1d99a1f13Douglas Gregor 48064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddAPFloat(const llvm::APFloat &Value) { 48074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddAPInt(Value.bitcastToAPInt()); 480817fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor} 480917fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 481089eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidisvoid ASTWriter::AddIdentifierRef(const IdentifierInfo *II, RecordDataImpl &Record) { 48112deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor Record.push_back(getIdentifierRef(II)); 48122deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor} 48132deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor 48148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlIdentID ASTWriter::getIdentifierRef(const IdentifierInfo *II) { 48156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!II) 48162deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor return 0; 4817afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 48188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl IdentID &ID = IdentifierIDs[II]; 4819afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor if (ID == 0) 4820f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl ID = NextIdentID++; 48212deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor return ID; 48222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 48232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48249317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios KyrtzidisMacroID ASTWriter::getMacroRef(MacroInfo *MI, const IdentifierInfo *Name) { 4825a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor // Don't emit builtin macros like __LINE__ to the AST file unless they 4826a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor // have been redefined by the header (in which case they are not 4827a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor // isBuiltinMacro). 48286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!MI || MI->isBuiltinMacro()) 4829a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor return 0; 4830a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 48319317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroID &ID = MacroIDs[MI]; 48329317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (ID == 0) { 4833a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor ID = NextMacroID++; 48349317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroInfoToEmitData Info = { Name, MI, ID }; 48359317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroInfosToEmit.push_back(Info); 48369317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 4837a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor return ID; 4838a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor} 4839a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 48409317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios KyrtzidisMacroID ASTWriter::getMacroID(MacroInfo *MI) { 48416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!MI || MI->isBuiltinMacro()) 48429317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return 0; 48439317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 48449317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis assert(MacroIDs.find(MI) != MacroIDs.end() && "Macro not emitted!"); 48459317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return MacroIDs[MI]; 48469317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis} 48479317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 48489317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidisuint64_t ASTWriter::getMacroDirectivesOffset(const IdentifierInfo *Name) { 4849b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return IdentMacroDirectivesOffsetMap.lookup(Name); 48509317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis} 48519317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 48524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddSelectorRef(const Selector SelRef) { 48534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Writer->getSelectorRef(SelRef)); 48545d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl} 48555d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl 48568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlSelectorID ASTWriter::getSelectorRef(Selector Sel) { 48576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Sel.getAsOpaquePtr() == nullptr) { 48585d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl return 0; 485990cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff } 486090cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff 48612d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor SelectorID SID = SelectorIDs[Sel]; 4862e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl if (SID == 0 && Chain) { 4863e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl // This might trigger a ReadSelector callback, which will set the ID for 4864e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl // this selector. 4865e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl Chain->LoadSelector(Sel); 48662d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor SID = SelectorIDs[Sel]; 4867e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl } 486890cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff if (SID == 0) { 4869e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl SID = NextSelectorID++; 48702d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor SelectorIDs[Sel] = SID; 487190cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff } 48725d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl return SID; 487390cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff} 487490cd1bb1baac2a0221f3642de0cbea3244b116e5Steve Naroff 48754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddCXXTemporary(const CXXTemporary *Temp) { 48764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(Temp->getDestructor()); 48777c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor} 48787c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor 48794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddTemplateArgumentLocInfo( 48804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgument::ArgKind Kind, const TemplateArgumentLocInfo &Arg) { 488144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis switch (Kind) { 4882833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 488344f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis AddStmt(Arg.getAsExpr()); 4884833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 4885833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 48864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeSourceInfo(Arg.getAsTypeSourceInfo()); 4887833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 4888788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 48894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc()); 48904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(Arg.getTemplateNameLoc()); 4891a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor break; 4892a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 48934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc()); 48944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(Arg.getTemplateNameLoc()); 48954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(Arg.getTemplateEllipsisLoc()); 4896788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor break; 4897833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 4898833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 4899833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 4900d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman case TemplateArgument::NullPtr: 4901833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 4902d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman // FIXME: Is this right? 4903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 4904833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 4905833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 4906833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 49074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg) { 49084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateArgument(Arg.getArgument()); 490917cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis 491017cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis if (Arg.getArgument().getKind() == TemplateArgument::Expression) { 491117cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis bool InfoHasSameExpr 491217cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis = Arg.getArgument().getAsExpr() == Arg.getLocInfo().getAsExpr(); 49134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(InfoHasSameExpr); 491417cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis if (InfoHasSameExpr) 491517cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis return; // Avoid storing the same expr twice. 491617cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis } 49174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateArgumentLocInfo(Arg.getArgument().getKind(), Arg.getLocInfo()); 491844f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis} 491944f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis 49204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddTypeSourceInfo(TypeSourceInfo *TInfo) { 49216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!TInfo) { 49224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeRef(QualType()); 4923a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall return; 4924a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall } 4925a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 49264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeLoc(TInfo->getTypeLoc()); 4927dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor} 4928dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 49294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddTypeLoc(TypeLoc TL) { 49304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeRef(TL.getType()); 4931dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 49324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeLocWriter TLW(*this); 4933dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 493411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam TLW.Visit(TL); 4935a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall} 4936a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 493789eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidisvoid ASTWriter::AddTypeRef(QualType T, RecordDataImpl &Record) { 49387fb35182f43392cea4517c203bbabb22364a19fcArgyrios Kyrtzidis Record.push_back(GetOrCreateTypeID(T)); 49397fb35182f43392cea4517c203bbabb22364a19fcArgyrios Kyrtzidis} 49407fb35182f43392cea4517c203bbabb22364a19fcArgyrios Kyrtzidis 49413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarTypeID ASTWriter::GetOrCreateTypeID(QualType T) { 49429dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smith assert(Context); 49433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return MakeTypeID(*Context, T, [&](QualType T) -> TypeIdx { 49443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (T.isNull()) 49453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return TypeIdx(); 49463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(!T.getLocalFastQualifiers()); 494726fca90786af17f97e1a5ecc310d4bf39b831595Argyrios Kyrtzidis 49483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar TypeIdx &Idx = TypeIdxs[T]; 49493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Idx.getIndex() == 0) { 49503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (DoneWritingDeclsAndTypes) { 49513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(0 && "New type seen after serializing all the types to emit!"); 49523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return TypeIdx(); 49533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 495426fca90786af17f97e1a5ecc310d4bf39b831595Argyrios Kyrtzidis 49553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // We haven't seen this type before. Assign it a new ID and put it 49563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // into the queue of types to emit. 49573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar Idx = TypeIdx(NextTypeID++); 49583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclTypesToEmit.push(T); 49597518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis } 49603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return Idx; 49613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar }); 496226fca90786af17f97e1a5ecc310d4bf39b831595Argyrios Kyrtzidis} 49632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 49643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarTypeID ASTWriter::getTypeID(QualType T) const { 49653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(Context); 49663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return MakeTypeID(*Context, T, [&](QualType T) -> TypeIdx { 49673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (T.isNull()) 49683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return TypeIdx(); 49693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(!T.getLocalFastQualifiers()); 497026fca90786af17f97e1a5ecc310d4bf39b831595Argyrios Kyrtzidis 49713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar TypeIdxMap::const_iterator I = TypeIdxs.find(T); 49723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(I != TypeIdxs.end() && "Type not emitted!"); 49733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return I->second; 49743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar }); 49752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 49762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 49777b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidisvoid ASTWriter::AddDeclRef(const Decl *D, RecordDataImpl &Record) { 4978681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl Record.push_back(GetDeclRef(D)); 4979681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl} 4980681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl 49818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlDeclID ASTWriter::GetDeclRef(const Decl *D) { 498261c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor assert(WritingAST && "Cannot request a declaration ID before AST writing"); 49836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 49846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!D) { 4985681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl return 0; 49862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 49871c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor 49881c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor // If D comes from an AST file, its declaration ID is already known and 49891c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor // fixed. 49901c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor if (D->isFromASTFile()) 49911c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor return D->getGlobalID(); 49921c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor 499397475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor assert(!(reinterpret_cast<uintptr_t>(D) & 0x01) && "Invalid decl pointer"); 49948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl DeclID &ID = DeclIDs[D]; 49951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ID == 0) { 49967518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis if (DoneWritingDeclsAndTypes) { 49977518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis assert(0 && "New decl seen after serializing all the decls to emit!"); 49987518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis return 0; 49997518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis } 50007518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis 50012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // We haven't seen this declaration before. Give it a new ID and 50022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // enqueue it in the list of declarations to emit. 5003f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl ID = NextDeclID++; 500461d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor DeclTypesToEmit.push(const_cast<Decl *>(D)); 50052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 50062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 5007681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl return ID; 50082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 50092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 50108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlDeclID ASTWriter::getDeclID(const Decl *D) { 50116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!D) 50123251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor return 0; 50133251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 50141c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor // If D comes from an AST file, its declaration ID is already known and 50151c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor // fixed. 50161c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor if (D->isFromASTFile()) 50171c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor return D->getGlobalID(); 50181c7946a9fbba8671cc57f7dfd00721f8c035f913Douglas Gregor 50193251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor assert(DeclIDs.find(D) != DeclIDs.end() && "Declaration not emitted!"); 50203251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor return DeclIDs[D]; 50213251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor} 50223251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 502319645d2ae928580b62f9feff91c5aa5e19f5f20dArgyrios Kyrtzidisvoid ASTWriter::associateDeclWithFile(const Decl *D, DeclID ID) { 502410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis assert(ID); 502519645d2ae928580b62f9feff91c5aa5e19f5f20dArgyrios Kyrtzidis assert(D); 502619645d2ae928580b62f9feff91c5aa5e19f5f20dArgyrios Kyrtzidis 502719645d2ae928580b62f9feff91c5aa5e19f5f20dArgyrios Kyrtzidis SourceLocation Loc = D->getLocation(); 502819645d2ae928580b62f9feff91c5aa5e19f5f20dArgyrios Kyrtzidis if (Loc.isInvalid()) 502919645d2ae928580b62f9feff91c5aa5e19f5f20dArgyrios Kyrtzidis return; 503010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 503110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis // We only keep track of the file-level declarations of each file. 503210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis if (!D->getLexicalDeclContext()->isFileContext()) 503310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis return; 503469015c22e1e3f96ff0e6e31965188e095297a744Argyrios Kyrtzidis // FIXME: ParmVarDecls that are part of a function type of a parameter of 503569015c22e1e3f96ff0e6e31965188e095297a744Argyrios Kyrtzidis // a function/objc method, should not have TU as lexical context. 50368cceefac395d476114b3d4ecd7e969b2e1c9271dArgyrios Kyrtzidis if (isa<ParmVarDecl>(D)) 50378cceefac395d476114b3d4ecd7e969b2e1c9271dArgyrios Kyrtzidis return; 503810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 503910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis SourceManager &SM = Context->getSourceManager(); 504019645d2ae928580b62f9feff91c5aa5e19f5f20dArgyrios Kyrtzidis SourceLocation FileLoc = SM.getFileLoc(Loc); 504110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis assert(SM.isLocalSourceLocation(FileLoc)); 5042fab8d5b478e6fb112b4414c4698a7cc2a350b0f0Argyrios Kyrtzidis FileID FID; 5043fab8d5b478e6fb112b4414c4698a7cc2a350b0f0Argyrios Kyrtzidis unsigned Offset; 5044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::tie(FID, Offset) = SM.getDecomposedLoc(FileLoc); 504510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis if (FID.isInvalid()) 504610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis return; 5047a2ea4d94f2133aad0d864cf1327af142a47ffb09Argyrios Kyrtzidis assert(SM.getSLocEntry(FID).isFile()); 504810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 5049a2ea4d94f2133aad0d864cf1327af142a47ffb09Argyrios Kyrtzidis DeclIDInFileInfo *&Info = FileDeclIDs[FID]; 505010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis if (!Info) 505110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Info = new DeclIDInFileInfo(); 505210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 5053fab8d5b478e6fb112b4414c4698a7cc2a350b0f0Argyrios Kyrtzidis std::pair<unsigned, serialization::DeclID> LocDecl(Offset, ID); 505410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis LocDeclIDsTy &Decls = Info->DeclIDs; 505510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 5056fab8d5b478e6fb112b4414c4698a7cc2a350b0f0Argyrios Kyrtzidis if (Decls.empty() || Decls.back().first <= Offset) { 505710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Decls.push_back(LocDecl); 505810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis return; 505910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis } 506010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 5061809d254c1f1521c141c8807638c29d67b50ebf29Benjamin Kramer LocDeclIDsTy::iterator I = 5062809d254c1f1521c141c8807638c29d67b50ebf29Benjamin Kramer std::upper_bound(Decls.begin(), Decls.end(), LocDecl, llvm::less_first()); 506310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 506410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis Decls.insert(I, LocDecl); 506510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis} 506610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 50674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddDeclarationName(DeclarationName Name) { 5068ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner // FIXME: Emit a stable enum for NameKind. 0 = Identifier etc. 50694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Name.getNameKind()); 50702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor switch (Name.getNameKind()) { 50712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor case DeclarationName::Identifier: 50724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddIdentifierRef(Name.getAsIdentifierInfo()); 50732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor break; 50742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 50752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 50762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor case DeclarationName::ObjCOneArgSelector: 50772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 50784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSelectorRef(Name.getObjCSelector()); 50792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor break; 50802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 50812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor case DeclarationName::CXXConstructorName: 50822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor case DeclarationName::CXXDestructorName: 50832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor case DeclarationName::CXXConversionFunctionName: 50844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeRef(Name.getCXXNameType()); 50852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor break; 50862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 50872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor case DeclarationName::CXXOperatorName: 50884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Name.getCXXOverloadedOperator()); 50892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor break; 50902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 50913e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 50924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddIdentifierRef(Name.getCXXLiteralIdentifier()); 50933e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt break; 50943e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 50952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor case DeclarationName::CXXUsingDirective: 50962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // No extra data to emit 50972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor break; 50982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 50992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 51006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 5101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesunsigned ASTWriter::getAnonymousDeclarationNumber(const NamedDecl *D) { 5102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(needsAnonymousDeclarationNumber(D) && 5103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "expected an anonymous declaration"); 5104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 5105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Number the anonymous declarations within this context, if we've not 5106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // already done so. 5107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto It = AnonymousDeclarationNumbers.find(D); 5108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (It == AnonymousDeclarationNumbers.end()) { 51090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto *DC = D->getLexicalDeclContext(); 51100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines numberAnonymousDeclsWithin(DC, [&](const NamedDecl *ND, unsigned Number) { 51110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines AnonymousDeclarationNumbers[ND] = Number; 51120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines }); 5113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 5114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines It = AnonymousDeclarationNumbers.find(D); 5115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(It != AnonymousDeclarationNumbers.end() && 5116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "declaration not found within its lexical context"); 5117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 5118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 5119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return It->second; 5120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 5121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 51224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc, 51234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclarationName Name) { 51244045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis switch (Name.getNameKind()) { 51254045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::CXXConstructorName: 51264045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::CXXDestructorName: 51274045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::CXXConversionFunctionName: 51284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeSourceInfo(DNLoc.NamedType.TInfo); 51294045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis break; 51304045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 51314045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::CXXOperatorName: 51324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(SourceLocation::getFromRawEncoding( 51334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DNLoc.CXXOperatorName.BeginOpNameLoc)); 51344045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis AddSourceLocation( 51354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation::getFromRawEncoding(DNLoc.CXXOperatorName.EndOpNameLoc)); 51364045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis break; 51374045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 51384045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::CXXLiteralOperatorName: 51394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(SourceLocation::getFromRawEncoding( 51404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DNLoc.CXXLiteralOperatorName.OpNameLoc)); 51414045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis break; 51424045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 51434045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::Identifier: 51444045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::ObjCZeroArgSelector: 51454045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::ObjCOneArgSelector: 51464045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::ObjCMultiArgSelector: 51474045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis case DeclarationName::CXXUsingDirective: 51484045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis break; 51494045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } 51504045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis} 51514045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 51524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddDeclarationNameInfo( 51534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const DeclarationNameInfo &NameInfo) { 51544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclarationName(NameInfo.getName()); 51554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(NameInfo.getLoc()); 51564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclarationNameLoc(NameInfo.getInfo(), NameInfo.getName()); 51574045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis} 51584045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 51594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddQualifierInfo(const QualifierInfo &Info) { 51604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddNestedNameSpecifierLoc(Info.QualifierLoc); 51614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Info.NumTemplParamLists); 51624045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis for (unsigned i=0, e=Info.NumTemplParamLists; i != e; ++i) 51634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateParameterList(Info.TemplParamLists[i]); 51644045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis} 51654045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 51664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddNestedNameSpecifier(NestedNameSpecifier *NNS) { 51676ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // Nested name specifiers usually aren't too long. I think that 8 would 5168fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // typically accommodate the vast majority. 51695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NestedNameSpecifier *, 8> NestedNames; 51706ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 51716ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // Push each of the NNS's onto a stack for serialization in reverse order. 51726ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner while (NNS) { 51736ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner NestedNames.push_back(NNS); 51746ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner NNS = NNS->getPrefix(); 51756ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner } 51766ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 51774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(NestedNames.size()); 51786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner while(!NestedNames.empty()) { 51796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner NNS = NestedNames.pop_back_val(); 51806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner NestedNameSpecifier::SpecifierKind Kind = NNS->getKind(); 51814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Kind); 51826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner switch (Kind) { 51836ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner case NestedNameSpecifier::Identifier: 51844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddIdentifierRef(NNS->getAsIdentifier()); 51856ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 51866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 51876ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner case NestedNameSpecifier::Namespace: 51884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(NNS->getAsNamespace()); 51896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 51906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 519114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor case NestedNameSpecifier::NamespaceAlias: 51924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(NNS->getAsNamespaceAlias()); 519314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor break; 519414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor 51956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner case NestedNameSpecifier::TypeSpec: 51966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner case NestedNameSpecifier::TypeSpecWithTemplate: 51974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeRef(QualType(NNS->getAsType(), 0)); 51984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Kind == NestedNameSpecifier::TypeSpecWithTemplate); 51996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 52006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 52016ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner case NestedNameSpecifier::Global: 52026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // Don't need to write an associated value. 52036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 5204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 5205176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case NestedNameSpecifier::Super: 52064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(NNS->getAsRecordDecl()); 5207176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 52086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner } 52096ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner } 52106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 521190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 52124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) { 5213dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor // Nested name specifiers usually aren't too long. I think that 8 would 5214fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // typically accommodate the vast majority. 52155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<NestedNameSpecifierLoc , 8> NestedNames; 5216dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 5217dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor // Push each of the nested-name-specifiers's onto a stack for 5218dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor // serialization in reverse order. 5219dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor while (NNS) { 5220dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor NestedNames.push_back(NNS); 5221dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor NNS = NNS.getPrefix(); 5222dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor } 5223dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 52244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(NestedNames.size()); 5225dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor while(!NestedNames.empty()) { 5226dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor NNS = NestedNames.pop_back_val(); 5227dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor NestedNameSpecifier::SpecifierKind Kind 5228dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor = NNS.getNestedNameSpecifier()->getKind(); 52294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Kind); 5230dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor switch (Kind) { 5231dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::Identifier: 52324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddIdentifierRef(NNS.getNestedNameSpecifier()->getAsIdentifier()); 52334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceRange(NNS.getLocalSourceRange()); 5234dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor break; 5235dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 5236dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::Namespace: 52374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespace()); 52384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceRange(NNS.getLocalSourceRange()); 5239dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor break; 5240dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 5241dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::NamespaceAlias: 52424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespaceAlias()); 52434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceRange(NNS.getLocalSourceRange()); 5244dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor break; 5245dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 5246dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::TypeSpec: 5247dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 52484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Kind == NestedNameSpecifier::TypeSpecWithTemplate); 52494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeLoc(NNS.getTypeLoc()); 52504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(NNS.getLocalSourceRange().getEnd()); 5251dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor break; 5252dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 5253dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::Global: 52544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(NNS.getLocalSourceRange().getEnd()); 5255dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor break; 5256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 5257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case NestedNameSpecifier::Super: 52584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(NNS.getNestedNameSpecifier()->getAsRecordDecl()); 52594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceRange(NNS.getLocalSourceRange()); 5260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 5261dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor } 5262dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor } 5263dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor} 5264dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 52654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddTemplateName(TemplateName Name) { 526620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer TemplateName::NameKind Kind = Name.getKind(); 52674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Kind); 526890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis switch (Kind) { 526990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateName::Template: 52704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(Name.getAsTemplateDecl()); 527190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 527290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 527390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateName::OverloadedTemplate: { 527490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis OverloadedTemplateStorage *OvT = Name.getAsOverloadedTemplate(); 52754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(OvT->size()); 527687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &I : *OvT) 52774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(I); 527890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 527990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis } 528020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 528190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateName::QualifiedTemplate: { 528290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis QualifiedTemplateName *QualT = Name.getAsQualifiedTemplateName(); 52834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddNestedNameSpecifier(QualT->getQualifier()); 52844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(QualT->hasTemplateKeyword()); 52854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(QualT->getTemplateDecl()); 528690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 528790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis } 528820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 528990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateName::DependentTemplate: { 529090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis DependentTemplateName *DepT = Name.getAsDependentTemplateName(); 52914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddNestedNameSpecifier(DepT->getQualifier()); 52924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(DepT->isIdentifier()); 529390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis if (DepT->isIdentifier()) 52944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddIdentifierRef(DepT->getIdentifier()); 529590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis else 52964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(DepT->getOperator()); 529790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 529890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis } 5299146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall 5300146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall case TemplateName::SubstTemplateTemplateParm: { 5301146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall SubstTemplateTemplateParmStorage *subst 5302146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall = Name.getAsSubstTemplateTemplateParm(); 53034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(subst->getParameter()); 53044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateName(subst->getReplacement()); 5305146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall break; 5306146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall } 53071aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor 53081aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor case TemplateName::SubstTemplateTemplateParmPack: { 53091aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor SubstTemplateTemplateParmPackStorage *SubstPack 53101aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor = Name.getAsSubstTemplateTemplateParmPack(); 53114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(SubstPack->getParameterPack()); 53124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateArgument(SubstPack->getArgumentPack()); 53131aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor break; 53141aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor } 531590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis } 531690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 531790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 53184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddTemplateArgument(const TemplateArgument &Arg) { 53194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Arg.getKind()); 532090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis switch (Arg.getKind()) { 532190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateArgument::Null: 532290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 532390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateArgument::Type: 53244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeRef(Arg.getAsType()); 532590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 532690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateArgument::Declaration: 53274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(Arg.getAsDecl()); 53284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeRef(Arg.getParamTypeForDecl()); 5329d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman break; 5330d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman case TemplateArgument::NullPtr: 53314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeRef(Arg.getNullPtrType()); 533290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 533390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateArgument::Integral: 53344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddAPSInt(Arg.getAsIntegral()); 53354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeRef(Arg.getIntegralType()); 533690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 533790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateArgument::Template: 53384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateName(Arg.getAsTemplateOrTemplatePattern()); 53392be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor break; 5340a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 53414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateName(Arg.getAsTemplateOrTemplatePattern()); 5342dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<unsigned> NumExpansions = Arg.getNumTemplateExpansions()) 53434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(*NumExpansions + 1); 53442be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor else 53454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(0); 534690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 534790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateArgument::Expression: 534890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis AddStmt(Arg.getAsExpr()); 534990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 535090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis case TemplateArgument::Pack: 53514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Arg.pack_size()); 5352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const auto &P : Arg.pack_elements()) 53534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateArgument(P); 535490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis break; 535590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis } 535690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 5357dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 53584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddTemplateParameterList( 53594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const TemplateParameterList *TemplateParams) { 5360dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis assert(TemplateParams && "No TemplateParams!"); 53614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(TemplateParams->getTemplateLoc()); 53624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(TemplateParams->getLAngleLoc()); 53634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(TemplateParams->getRAngleLoc()); 53644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(TemplateParams->size()); 536587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const auto &P : *TemplateParams) 53664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(P); 5367dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis} 5368dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 5369dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis/// \brief Emit a template argument list. 53704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddTemplateArgumentList( 53714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const TemplateArgumentList *TemplateArgs) { 5372dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis assert(TemplateArgs && "No TemplateArgs!"); 53734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(TemplateArgs->size()); 5374910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor for (int i=0, e = TemplateArgs->size(); i != e; ++i) 53754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateArgument(TemplateArgs->get(i)); 5376dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis} 537737ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis 53784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddASTTemplateArgumentListInfo( 53794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ASTTemplateArgumentListInfo *ASTTemplArgList) { 5380c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella assert(ASTTemplArgList && "No ASTTemplArgList!"); 53814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(ASTTemplArgList->LAngleLoc); 53824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(ASTTemplArgList->RAngleLoc); 53834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(ASTTemplArgList->NumTemplateArgs); 5384c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella const TemplateArgumentLoc *TemplArgs = ASTTemplArgList->getTemplateArgs(); 5385c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella for (int i=0, e = ASTTemplArgList->NumTemplateArgs; i != e; ++i) 53864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTemplateArgumentLoc(TemplArgs[i]); 5387c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella} 538837ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis 53894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddUnresolvedSet(const ASTUnresolvedSet &Set) { 53904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Set.size()); 53912a82ca255b0f99f6201a75ed52b91fc024f6e9cfArgyrios Kyrtzidis for (ASTUnresolvedSet::const_iterator 539237ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis I = Set.begin(), E = Set.end(); I != E; ++I) { 53934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(I.getDecl()); 53944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(I.getAccess()); 539537ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis } 539637ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis} 53970745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis 53984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// FIXME: Move this out of the main ASTRecordWriter interface. 53994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddCXXBaseSpecifier(const CXXBaseSpecifier &Base) { 54004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Base.isVirtual()); 54014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Base.isBaseOfClass()); 54024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Base.getAccessSpecifierAsWritten()); 54034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Base.getInheritConstructors()); 54044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeSourceInfo(Base.getTypeSourceInfo()); 54054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceRange(Base.getSourceRange()); 5406f90b27ad077c3339b62befc892382845339f9490Douglas Gregor AddSourceLocation(Base.isPackExpansion()? Base.getEllipsisLoc() 54074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : SourceLocation()); 54080745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis} 540930c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl 54104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic uint64_t EmitCXXBaseSpecifiers(ASTWriter &W, 54114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<CXXBaseSpecifier> Bases) { 54124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTWriter::RecordData Record; 54134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTRecordWriter Writer(W, Record); 54144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(Bases.size()); 54157c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor 54164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto &Base : Bases) 54174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddCXXBaseSpecifier(Base); 54187c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor 54194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Writer.Emit(serialization::DECL_CXX_BASE_SPECIFIERS); 54207c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor} 54217c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor 54224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// FIXME: Move this out of the main ASTRecordWriter interface. 54234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddCXXBaseSpecifiers(ArrayRef<CXXBaseSpecifier> Bases) { 54244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddOffset(EmitCXXBaseSpecifiers(*Writer, Bases)); 54254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 54264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic uint64_t 54284967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarEmitCXXCtorInitializers(ASTWriter &W, 54294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<CXXCtorInitializer *> CtorInits) { 54304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTWriter::RecordData Record; 54314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTRecordWriter Writer(W, Record); 54324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(CtorInits.size()); 54338e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis 54344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto *Init : CtorInits) { 54358e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis if (Init->isBaseInitializer()) { 54364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(CTOR_INITIALIZER_BASE); 54374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddTypeSourceInfo(Init->getTypeSourceInfo()); 54384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(Init->isBaseVirtual()); 5439156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt } else if (Init->isDelegatingInitializer()) { 54404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(CTOR_INITIALIZER_DELEGATING); 54414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddTypeSourceInfo(Init->getTypeSourceInfo()); 5442156b640c67300f2b70eb11102aa393a610798cc6Sean Hunt } else if (Init->isMemberInitializer()){ 54434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(CTOR_INITIALIZER_MEMBER); 54444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddDeclRef(Init->getMember()); 54458e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis } else { 54464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(CTOR_INITIALIZER_INDIRECT_MEMBER); 54474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddDeclRef(Init->getIndirectMember()); 54488e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis } 544900eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet 54504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddSourceLocation(Init->getMemberLocation()); 54514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddStmt(Init->getInit()); 54524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddSourceLocation(Init->getLParenLoc()); 54534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddSourceLocation(Init->getRParenLoc()); 54544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(Init->isWritten()); 54558e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis if (Init->isWritten()) { 54564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(Init->getSourceOrder()); 54578e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis } else { 54584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.push_back(Init->getNumArrayIndices()); 54594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto *VD : Init->getArrayIndices()) 54604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Writer.AddDeclRef(VD); 54618e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis } 54628e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis } 54633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 54644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Writer.Emit(serialization::DECL_CXX_CTOR_INITIALIZERS); 54654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 54663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 54674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// FIXME: Move this out of the main ASTRecordWriter interface. 54684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddCXXCtorInitializers( 54694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<CXXCtorInitializer *> CtorInits) { 54704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddOffset(EmitCXXCtorInitializers(*Writer, CtorInits)); 54713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 54723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 54734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTRecordWriter::AddCXXDefinitionData(const CXXRecordDecl *D) { 54746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto &Data = D->data(); 54754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.IsLambda); 54764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.UserDeclaredConstructor); 54774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.UserDeclaredSpecialMembers); 54784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.Aggregate); 54794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.PlainOldData); 54804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.Empty); 54814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.Polymorphic); 54824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.Abstract); 54834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.IsStandardLayout); 54844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasNoNonEmptyBases); 54854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasPrivateFields); 54864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasProtectedFields); 54874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasPublicFields); 54884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasMutableFields); 54894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasVariantMembers); 54904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasOnlyCMembers); 54914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasInClassInitializer); 54924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasUninitializedReferenceMember); 54934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasUninitializedFields); 54944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasInheritedConstructor); 54954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasInheritedAssignment); 54964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.NeedOverloadResolutionForMoveConstructor); 54974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.NeedOverloadResolutionForMoveAssignment); 54984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.NeedOverloadResolutionForDestructor); 54994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.DefaultedMoveConstructorIsDeleted); 55004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.DefaultedMoveAssignmentIsDeleted); 55014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.DefaultedDestructorIsDeleted); 55024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasTrivialSpecialMembers); 55034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.DeclaredNonTrivialSpecialMembers); 55044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasIrrelevantDestructor); 55054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasConstexprNonCopyMoveConstructor); 55064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasDefaultedDefaultConstructor); 55074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.DefaultedDefaultConstructorIsConstexpr); 55084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasConstexprDefaultConstructor); 55094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasNonLiteralTypeFieldsOrBases); 55104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.ComputedVisibleConversions); 55114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.UserProvidedDefaultConstructor); 55124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.DeclaredSpecialMembers); 55134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.ImplicitCopyConstructorHasConstParam); 55144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.ImplicitCopyAssignmentHasConstParam); 55154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasDeclaredCopyConstructorWithConstParam); 55164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.HasDeclaredCopyAssignmentWithConstParam); 5517dfefb840e36f069286ef6cf178ef339c90f4603dRichard Smith // IsLambda bit is already saved. 551889eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis 55194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.NumBases); 55207c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor if (Data.NumBases > 0) 55214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddCXXBaseSpecifiers(Data.bases()); 55224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 552389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis // FIXME: Make VBases lazily computed when needed to avoid storing them. 55244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Data.NumVBases); 55257c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor if (Data.NumVBases > 0) 55264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddCXXBaseSpecifiers(Data.vbases()); 552789eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis 55284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddUnresolvedSet(Data.Conversions.get(*Writer->Context)); 55294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddUnresolvedSet(Data.VisibleConversions.get(*Writer->Context)); 553089eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis // Data.Definition is the owning decl, no need to write it. 55314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(D->getFirstFriend()); 55329d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor 55339d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor // Add lambda-specific data. 55349d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor if (Data.IsLambda) { 55356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto &Lambda = D->getLambdaData(); 55364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Lambda.Dependent); 55374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Lambda.IsGenericLambda); 55384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Lambda.CaptureDefault); 55394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Lambda.NumCaptures); 55404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Lambda.NumExplicitCaptures); 55414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Lambda.ManglingNumber); 55424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(Lambda.ContextDecl); 55434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddTypeSourceInfo(Lambda.MethodTyInfo); 55449d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) { 55456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const LambdaCapture &Capture = Lambda.Captures[I]; 55464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddSourceLocation(Capture.getLocation()); 55474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Capture.isImplicit()); 55484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Record->push_back(Capture.getCaptureKind()); 55490d8e9646bc000bab521ce52ed294209a92298cefRichard Smith switch (Capture.getCaptureKind()) { 55504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case LCK_StarThis: 55510d8e9646bc000bab521ce52ed294209a92298cefRichard Smith case LCK_This: 5552176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case LCK_VLAType: 55530d8e9646bc000bab521ce52ed294209a92298cefRichard Smith break; 55540d8e9646bc000bab521ce52ed294209a92298cefRichard Smith case LCK_ByCopy: 555504fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith case LCK_ByRef: 55560d8e9646bc000bab521ce52ed294209a92298cefRichard Smith VarDecl *Var = 55576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Capture.capturesVariable() ? Capture.getCapturedVar() : nullptr; 55584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AddDeclRef(Var); 55590d8e9646bc000bab521ce52ed294209a92298cefRichard Smith AddSourceLocation(Capture.isPackExpansion() ? Capture.getEllipsisLoc() 55604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : SourceLocation()); 55610d8e9646bc000bab521ce52ed294209a92298cefRichard Smith break; 55620d8e9646bc000bab521ce52ed294209a92298cefRichard Smith } 55639d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor } 55649d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor } 556589eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis} 556689eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis 55677b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidisvoid ASTWriter::ReaderInitialized(ASTReader *Reader) { 5568ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl assert(Reader && "Cannot remove chain"); 556910bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor assert((!Chain || Chain == Reader) && "Cannot replace chain"); 5570ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl assert(FirstDeclID == NextDeclID && 5571ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl FirstTypeID == NextTypeID && 5572ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl FirstIdentID == NextIdentID && 5573a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor FirstMacroID == NextMacroID && 557426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor FirstSubmoduleID == NextSubmoduleID && 5575e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl FirstSelectorID == NextSelectorID && 5576ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl "Setting chain after writing has started."); 5577f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 5578ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl Chain = Reader; 55797b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 55803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Note, this will get called multiple times, once one the reader starts up 55813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // and again each time it's done reading a PCH or module. 558210bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor FirstDeclID = NUM_PREDEF_DECL_IDS + Chain->getTotalNumDecls(); 558310bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor FirstTypeID = NUM_PREDEF_TYPE_IDS + Chain->getTotalNumTypes(); 558410bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor FirstIdentID = NUM_PREDEF_IDENT_IDS + Chain->getTotalNumIdentifiers(); 5585a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor FirstMacroID = NUM_PREDEF_MACRO_IDS + Chain->getTotalNumMacros(); 558626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor FirstSubmoduleID = NUM_PREDEF_SUBMODULE_IDS + Chain->getTotalNumSubmodules(); 558710bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor FirstSelectorID = NUM_PREDEF_SELECTOR_IDS + Chain->getTotalNumSelectors(); 55887b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis NextDeclID = FirstDeclID; 55897b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis NextTypeID = FirstTypeID; 55907b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis NextIdentID = FirstIdentID; 5591a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor NextMacroID = FirstMacroID; 55927b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis NextSelectorID = FirstSelectorID; 559326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor NextSubmoduleID = FirstSubmoduleID; 5594ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl} 5595ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl 55968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid ASTWriter::IdentifierRead(IdentID ID, IdentifierInfo *II) { 55972d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor // Always keep the highest ID. See \p TypeRead() for more information. 55982d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor IdentID &StoredID = IdentifierIDs[II]; 55992d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor if (ID > StoredID) 56002d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor StoredID = ID; 5601f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl} 5602f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl 56039317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidisvoid ASTWriter::MacroRead(serialization::MacroID ID, MacroInfo *MI) { 56042d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor // Always keep the highest ID. See \p TypeRead() for more information. 56059317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroID &StoredID = MacroIDs[MI]; 56062d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor if (ID > StoredID) 56072d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor StoredID = ID; 5608a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor} 5609a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 5610c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidisvoid ASTWriter::TypeRead(TypeIdx Idx, QualType T) { 561197475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor // Always take the highest-numbered type index. This copes with an interesting 561297475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor // case for chained AST writing where we schedule writing the type and then, 561320249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer // later, deserialize the type from another AST. In this case, we want to 561497475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor // keep the higher-numbered entry so that we can properly write it out to 561597475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor // the AST file. 561697475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor TypeIdx &StoredIdx = TypeIdxs[T]; 561797475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor if (Idx.getIndex() >= StoredIdx.getIndex()) 561897475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor StoredIdx = Idx; 561930c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl} 562030c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl 56218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid ASTWriter::SelectorRead(SelectorID ID, Selector S) { 56222d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor // Always keep the highest ID. See \p TypeRead() for more information. 56232d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor SelectorID &StoredID = SelectorIDs[S]; 56242d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor if (ID > StoredID) 56252d1ece81a5c47eebbaa6ad6de70714ac7ff973c2Douglas Gregor StoredID = ID; 56265d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl} 562777424bc3794f569816dba52e423b57486a98e5baDouglas Gregor 5628e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidisvoid ASTWriter::MacroDefinitionRead(serialization::PreprocessedEntityID ID, 5629b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar MacroDefinitionRecord *MD) { 5630e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis assert(MacroDefinitions.find(MD) == MacroDefinitions.end()); 563177424bc3794f569816dba52e423b57486a98e5baDouglas Gregor MacroDefinitions[MD] = ID; 563277424bc3794f569816dba52e423b57486a98e5baDouglas Gregor} 5633565bf30bf5607b9740d288d8d9c45cf38ea75298Argyrios Kyrtzidis 5634a015cab273705d1198d13e8389c2f4775f539a8bDouglas Gregorvoid ASTWriter::ModuleRead(serialization::SubmoduleID ID, Module *Mod) { 5635a015cab273705d1198d13e8389c2f4775f539a8bDouglas Gregor assert(SubmoduleIDs.find(Mod) == SubmoduleIDs.end()); 5636a015cab273705d1198d13e8389c2f4775f539a8bDouglas Gregor SubmoduleIDs[Mod] = ID; 5637a015cab273705d1198d13e8389c2f4775f539a8bDouglas Gregor} 5638a015cab273705d1198d13e8389c2f4775f539a8bDouglas Gregor 5639565bf30bf5607b9740d288d8d9c45cf38ea75298Argyrios Kyrtzidisvoid ASTWriter::CompletedTagDefinition(const TagDecl *D) { 56405e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall assert(D->isCompleteDefinition()); 564161c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor assert(!WritingAST && "Already writing the AST!"); 564287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (auto *RD = dyn_cast<CXXRecordDecl>(D)) { 5643565bf30bf5607b9740d288d8d9c45cf38ea75298Argyrios Kyrtzidis // We are interested when a PCH decl is modified. 5644919814def90acecd25a35445862f0c0ff72a9b05Douglas Gregor if (RD->isFromASTFile()) { 5645565bf30bf5607b9740d288d8d9c45cf38ea75298Argyrios Kyrtzidis // A forward reference was mutated into a definition. Rewrite it. 5646565bf30bf5607b9740d288d8d9c45cf38ea75298Argyrios Kyrtzidis // FIXME: This happens during template instantiation, should we 5647565bf30bf5607b9740d288d8d9c45cf38ea75298Argyrios Kyrtzidis // have created a new definition decl instead ? 56486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isTemplateInstantiation(RD->getTemplateSpecializationKind()) && 56496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "completed a tag from another module but not by instantiation?"); 56506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclUpdates[RD].push_back( 56516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclUpdate(UPD_CXX_INSTANTIATED_CLASS_DEFINITION)); 5652565bf30bf5607b9740d288d8d9c45cf38ea75298Argyrios Kyrtzidis } 5653565bf30bf5607b9740d288d8d9c45cf38ea75298Argyrios Kyrtzidis } 5654565bf30bf5607b9740d288d8d9c45cf38ea75298Argyrios Kyrtzidis} 5655a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor 565687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic bool isImportedDeclContext(ASTReader *Chain, const Decl *D) { 565787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (D->isFromASTFile()) 565887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return true; 565987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 566087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // The predefined __va_list_tag struct is imported if we imported any decls. 566187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: This is a gross hack. 566287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return D == D->getASTContext().getVaListTagDecl(); 566387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 566487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 5665100050bf643bcfe2d06bdcef491e387171249260Argyrios Kyrtzidisvoid ASTWriter::AddedVisibleDecl(const DeclContext *DC, const Decl *D) { 56664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(DC->isLookupContext() && 56674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar "Should not add lookup results to non-lookup contexts!"); 56684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // TU is handled elsewhere. 56704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (isa<TranslationUnitDecl>(DC)) 56714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 56724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 56734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Namespaces are handled elsewhere, except for template instantiations of 56744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FunctionTemplateDecls in namespaces. We are interested in cases where the 56754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // local instantiations are added to an imported context. Only happens when 56764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // adding ADL lookup candidates, for example templated friends. 56774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (isa<NamespaceDecl>(DC) && D->getFriendObjectKind() == Decl::FOK_None && 56784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !isa<FunctionTemplateDecl>(D)) 5679100050bf643bcfe2d06bdcef491e387171249260Argyrios Kyrtzidis return; 5680100050bf643bcfe2d06bdcef491e387171249260Argyrios Kyrtzidis 568187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // We're only interested in cases where a local declaration is added to an 568287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // imported context. 568387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (D->isFromASTFile() || !isImportedDeclContext(Chain, cast<Decl>(DC))) 568487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 5685100050bf643bcfe2d06bdcef491e387171249260Argyrios Kyrtzidis 568687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(DC == DC->getPrimaryContext() && "added to non-primary context"); 56875a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor assert(!getDefinitiveDeclContext(DC) && "DeclContext not definitive!"); 5688176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(!WritingAST && "Already writing the AST!"); 568987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (UpdatedDeclContexts.insert(DC) && !cast<Decl>(DC)->isFromASTFile()) { 569087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // We're adding a visible declaration to a predefined decl context. Ensure 569187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // that we write out all of its lookup results so we don't get a nasty 569287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // surprise when we try to emit its lookup table. 569387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto *Child : DC->decls()) 569487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar UpdatingVisibleDecls.push_back(Child); 569587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 56967518b3784ed2176aad8dcabe0685c6e02c5f1043Argyrios Kyrtzidis UpdatingVisibleDecls.push_back(D); 5697100050bf643bcfe2d06bdcef491e387171249260Argyrios Kyrtzidis} 5698b6cc0e1a789c3f33e3f4b1ee768e679a9beab941Argyrios Kyrtzidis 5699b6cc0e1a789c3f33e3f4b1ee768e679a9beab941Argyrios Kyrtzidisvoid ASTWriter::AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) { 5700b6cc0e1a789c3f33e3f4b1ee768e679a9beab941Argyrios Kyrtzidis assert(D->isImplicit()); 570187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 570287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // We're only interested in cases where a local declaration is added to an 570387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // imported context. 570487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (D->isFromASTFile() || !isImportedDeclContext(Chain, RD)) 570587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 570687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 5707b6cc0e1a789c3f33e3f4b1ee768e679a9beab941Argyrios Kyrtzidis if (!isa<CXXMethodDecl>(D)) 570887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 5709b6cc0e1a789c3f33e3f4b1ee768e679a9beab941Argyrios Kyrtzidis 5710b6cc0e1a789c3f33e3f4b1ee768e679a9beab941Argyrios Kyrtzidis // A decl coming from PCH was modified. 57115e1cdac63c3d9c9b32fa41fa0b2d242a58a20d49John McCall assert(RD->isCompleteDefinition()); 5712176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(!WritingAST && "Already writing the AST!"); 5713651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclUpdates[RD].push_back(DeclUpdate(UPD_CXX_ADDED_IMPLICIT_MEMBER, D)); 5714b6cc0e1a789c3f33e3f4b1ee768e679a9beab941Argyrios Kyrtzidis} 5715bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 5716651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTWriter::ResolvedExceptionSpec(const FunctionDecl *FD) { 57173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(!DoneWritingDeclsAndTypes && "Already done writing updates!"); 57183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!Chain) return; 571987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Chain->forEachImportedKeyDecl(FD, [&](const Decl *D) { 57203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // If we don't already know the exception specification for this redecl 57213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // chain, add an update record for it. 57223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (isUnresolvedExceptionSpec(cast<FunctionDecl>(D) 57233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ->getType() 57243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ->castAs<FunctionProtoType>() 57253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar ->getExceptionSpecType())) 57263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclUpdates[D].push_back(UPD_CXX_RESOLVED_EXCEPTION_SPEC); 57273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar }); 57285bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl} 57295bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl 57309dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smithvoid ASTWriter::DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) { 57319dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smith assert(!WritingAST && "Already writing the AST!"); 57323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!Chain) return; 573387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Chain->forEachImportedKeyDecl(FD, [&](const Decl *D) { 57343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclUpdates[D].push_back( 57353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclUpdate(UPD_CXX_DEDUCED_RETURN_TYPE, ReturnType)); 57363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar }); 57373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 57389dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smith 57393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid ASTWriter::ResolvedOperatorDelete(const CXXDestructorDecl *DD, 57403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar const FunctionDecl *Delete) { 57413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(!WritingAST && "Already writing the AST!"); 57423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(Delete && "Not given an operator delete"); 57433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!Chain) return; 574487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Chain->forEachImportedKeyDecl(DD, [&](const Decl *D) { 57453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_RESOLVED_DTOR_DELETE, Delete)); 57463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar }); 57479dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smith} 57489dadfab2faebe40e7dbbfd0801c15174b69bd726Richard Smith 574958a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redlvoid ASTWriter::CompletedImplicitDefinition(const FunctionDecl *D) { 575061c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor assert(!WritingAST && "Already writing the AST!"); 5751919814def90acecd25a35445862f0c0ff72a9b05Douglas Gregor if (!D->isFromASTFile()) 575258a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl return; // Declaration not imported from PCH. 575358a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl 5754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Implicit function decl from a PCH was defined. 5755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_ADDED_FUNCTION_DEFINITION)); 575658a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl} 575758a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl 5758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTWriter::FunctionDefinitionInstantiated(const FunctionDecl *D) { 5759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(!WritingAST && "Already writing the AST!"); 5760651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!D->isFromASTFile()) 5761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 5762651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 57633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_ADDED_FUNCTION_DEFINITION)); 5764651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 5765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 5766f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlvoid ASTWriter::StaticDataMemberInstantiated(const VarDecl *D) { 576761c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor assert(!WritingAST && "Already writing the AST!"); 5768919814def90acecd25a35445862f0c0ff72a9b05Douglas Gregor if (!D->isFromASTFile()) 5769f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl return; 5770f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl 5771f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl // Since the actual instantiation is delayed, this really means that we need 5772f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl // to update the instantiation location. 5773651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclUpdates[D].push_back( 5774651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclUpdate(UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER, 5775651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->getMemberSpecializationInfo()->getPointOfInstantiation())); 5776f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl} 5777f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl 57784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTWriter::DefaultArgumentInstantiated(const ParmVarDecl *D) { 57794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(!WritingAST && "Already writing the AST!"); 57804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!D->isFromASTFile()) 57814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 57824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 57834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclUpdates[D].push_back( 57844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclUpdate(UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT, D)); 57854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 57864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 5787e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidisvoid ASTWriter::AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD, 5788e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis const ObjCInterfaceDecl *IFD) { 578961c5e340c26971d195bd27232e7f2e71be24bb52Douglas Gregor assert(!WritingAST && "Already writing the AST!"); 5790919814def90acecd25a35445862f0c0ff72a9b05Douglas Gregor if (!IFD->isFromASTFile()) 5791e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis return; // Declaration not imported from PCH. 5792cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor 5793cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor assert(IFD->getDefinition() && "Category on a class without a definition?"); 5794cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor ObjCClassesWithCategories.insert( 5795cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor const_cast<ObjCInterfaceDecl *>(IFD->getDefinition())); 5796e6b8d68a927368b06ac06cc9ac9e7f60aa966d5fArgyrios Kyrtzidis} 5797ad834d534e9a5db3d3baa09593775f83ceaff1f2Argyrios Kyrtzidis 579886164e8f51fa89a3ec904607c3848dc4a21b12cfEli Friedmanvoid ASTWriter::DeclarationMarkedUsed(const Decl *D) { 579986164e8f51fa89a3ec904607c3848dc4a21b12cfEli Friedman assert(!WritingAST && "Already writing the AST!"); 58004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // If there is *any* declaration of the entity that's not from an AST file, 58024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // we can skip writing the update record. We make sure that isUsed() triggers 58034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // completion of the redeclaration chain of the entity. 58044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto Prev = D->getMostRecentDecl(); Prev; Prev = Prev->getPreviousDecl()) 58054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (IsLocalDecl(Prev)) 58064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 580786164e8f51fa89a3ec904607c3848dc4a21b12cfEli Friedman 5808651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_USED)); 580986164e8f51fa89a3ec904607c3848dc4a21b12cfEli Friedman} 5810176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 5811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid ASTWriter::DeclarationMarkedOpenMPThreadPrivate(const Decl *D) { 5812176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(!WritingAST && "Already writing the AST!"); 5813176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!D->isFromASTFile()) 5814176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 5815176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 5816176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_OPENMP_THREADPRIVATE)); 5817176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 58183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 58194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid ASTWriter::DeclarationMarkedOpenMPDeclareTarget(const Decl *D, 58204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const Attr *Attr) { 58214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(!WritingAST && "Already writing the AST!"); 58224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!D->isFromASTFile()) 58234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 58244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 58254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclUpdates[D].push_back( 58264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclUpdate(UPD_DECL_MARKED_OPENMP_DECLARETARGET, Attr)); 58274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 58284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 5829b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid ASTWriter::RedefinedHiddenDefinition(const NamedDecl *D, Module *M) { 58303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(!WritingAST && "Already writing the AST!"); 58313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(D->isHidden() && "expected a hidden declaration"); 5832b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_EXPORTED, M)); 58333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 583487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 583587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid ASTWriter::AddedAttributeToRecord(const Attr *Attr, 583687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const RecordDecl *Record) { 583787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(!WritingAST && "Already writing the AST!"); 583887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!Record->isFromASTFile()) 583987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 584087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclUpdates[Record].push_back(DeclUpdate(UPD_ADDED_ATTR_TO_RECORD, Attr)); 584187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 5842