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