1*67e74705SXin Li //===--- ASTWriter.cpp - AST File Writer ------------------------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file defines the ASTWriter class, which writes AST files.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li
14*67e74705SXin Li #include "clang/Serialization/ASTWriter.h"
15*67e74705SXin Li #include "clang/Serialization/ModuleFileExtension.h"
16*67e74705SXin Li #include "ASTCommon.h"
17*67e74705SXin Li #include "ASTReaderInternals.h"
18*67e74705SXin Li #include "MultiOnDiskHashTable.h"
19*67e74705SXin Li #include "clang/AST/ASTContext.h"
20*67e74705SXin Li #include "clang/AST/Decl.h"
21*67e74705SXin Li #include "clang/AST/DeclContextInternals.h"
22*67e74705SXin Li #include "clang/AST/DeclFriend.h"
23*67e74705SXin Li #include "clang/AST/DeclLookups.h"
24*67e74705SXin Li #include "clang/AST/DeclTemplate.h"
25*67e74705SXin Li #include "clang/AST/Expr.h"
26*67e74705SXin Li #include "clang/AST/ExprCXX.h"
27*67e74705SXin Li #include "clang/AST/Type.h"
28*67e74705SXin Li #include "clang/AST/TypeLocVisitor.h"
29*67e74705SXin Li #include "clang/Basic/DiagnosticOptions.h"
30*67e74705SXin Li #include "clang/Basic/FileManager.h"
31*67e74705SXin Li #include "clang/Basic/FileSystemStatCache.h"
32*67e74705SXin Li #include "clang/Basic/SourceManager.h"
33*67e74705SXin Li #include "clang/Basic/SourceManagerInternals.h"
34*67e74705SXin Li #include "clang/Basic/TargetInfo.h"
35*67e74705SXin Li #include "clang/Basic/TargetOptions.h"
36*67e74705SXin Li #include "clang/Basic/Version.h"
37*67e74705SXin Li #include "clang/Basic/VersionTuple.h"
38*67e74705SXin Li #include "clang/Lex/HeaderSearch.h"
39*67e74705SXin Li #include "clang/Lex/HeaderSearchOptions.h"
40*67e74705SXin Li #include "clang/Lex/MacroInfo.h"
41*67e74705SXin Li #include "clang/Lex/PreprocessingRecord.h"
42*67e74705SXin Li #include "clang/Lex/Preprocessor.h"
43*67e74705SXin Li #include "clang/Lex/PreprocessorOptions.h"
44*67e74705SXin Li #include "clang/Sema/IdentifierResolver.h"
45*67e74705SXin Li #include "clang/Sema/Sema.h"
46*67e74705SXin Li #include "clang/Serialization/ASTReader.h"
47*67e74705SXin Li #include "clang/Serialization/SerializationDiagnostic.h"
48*67e74705SXin Li #include "llvm/ADT/APFloat.h"
49*67e74705SXin Li #include "llvm/ADT/APInt.h"
50*67e74705SXin Li #include "llvm/ADT/Hashing.h"
51*67e74705SXin Li #include "llvm/ADT/StringExtras.h"
52*67e74705SXin Li #include "llvm/Bitcode/BitstreamWriter.h"
53*67e74705SXin Li #include "llvm/Support/Compression.h"
54*67e74705SXin Li #include "llvm/Support/EndianStream.h"
55*67e74705SXin Li #include "llvm/Support/FileSystem.h"
56*67e74705SXin Li #include "llvm/Support/MemoryBuffer.h"
57*67e74705SXin Li #include "llvm/Support/OnDiskHashTable.h"
58*67e74705SXin Li #include "llvm/Support/Path.h"
59*67e74705SXin Li #include "llvm/Support/Process.h"
60*67e74705SXin Li #include <algorithm>
61*67e74705SXin Li #include <cstdio>
62*67e74705SXin Li #include <string.h>
63*67e74705SXin Li #include <utility>
64*67e74705SXin Li
65*67e74705SXin Li using namespace clang;
66*67e74705SXin Li using namespace clang::serialization;
67*67e74705SXin Li
68*67e74705SXin Li template <typename T, typename Allocator>
bytes(const std::vector<T,Allocator> & v)69*67e74705SXin Li static StringRef bytes(const std::vector<T, Allocator> &v) {
70*67e74705SXin Li if (v.empty()) return StringRef();
71*67e74705SXin Li return StringRef(reinterpret_cast<const char*>(&v[0]),
72*67e74705SXin Li sizeof(T) * v.size());
73*67e74705SXin Li }
74*67e74705SXin Li
75*67e74705SXin Li template <typename T>
bytes(const SmallVectorImpl<T> & v)76*67e74705SXin Li static StringRef bytes(const SmallVectorImpl<T> &v) {
77*67e74705SXin Li return StringRef(reinterpret_cast<const char*>(v.data()),
78*67e74705SXin Li sizeof(T) * v.size());
79*67e74705SXin Li }
80*67e74705SXin Li
81*67e74705SXin Li //===----------------------------------------------------------------------===//
82*67e74705SXin Li // Type serialization
83*67e74705SXin Li //===----------------------------------------------------------------------===//
84*67e74705SXin Li
85*67e74705SXin Li namespace clang {
86*67e74705SXin Li class ASTTypeWriter {
87*67e74705SXin Li ASTWriter &Writer;
88*67e74705SXin Li ASTRecordWriter Record;
89*67e74705SXin Li
90*67e74705SXin Li /// \brief Type code that corresponds to the record generated.
91*67e74705SXin Li TypeCode Code;
92*67e74705SXin Li /// \brief Abbreviation to use for the record, if any.
93*67e74705SXin Li unsigned AbbrevToUse;
94*67e74705SXin Li
95*67e74705SXin Li public:
ASTTypeWriter(ASTWriter & Writer,ASTWriter::RecordDataImpl & Record)96*67e74705SXin Li ASTTypeWriter(ASTWriter &Writer, ASTWriter::RecordDataImpl &Record)
97*67e74705SXin Li : Writer(Writer), Record(Writer, Record), Code((TypeCode)0), AbbrevToUse(0) { }
98*67e74705SXin Li
Emit()99*67e74705SXin Li uint64_t Emit() {
100*67e74705SXin Li return Record.Emit(Code, AbbrevToUse);
101*67e74705SXin Li }
102*67e74705SXin Li
Visit(QualType T)103*67e74705SXin Li void Visit(QualType T) {
104*67e74705SXin Li if (T.hasLocalNonFastQualifiers()) {
105*67e74705SXin Li Qualifiers Qs = T.getLocalQualifiers();
106*67e74705SXin Li Record.AddTypeRef(T.getLocalUnqualifiedType());
107*67e74705SXin Li Record.push_back(Qs.getAsOpaqueValue());
108*67e74705SXin Li Code = TYPE_EXT_QUAL;
109*67e74705SXin Li AbbrevToUse = Writer.TypeExtQualAbbrev;
110*67e74705SXin Li } else {
111*67e74705SXin Li switch (T->getTypeClass()) {
112*67e74705SXin Li // For all of the concrete, non-dependent types, call the
113*67e74705SXin Li // appropriate visitor function.
114*67e74705SXin Li #define TYPE(Class, Base) \
115*67e74705SXin Li case Type::Class: Visit##Class##Type(cast<Class##Type>(T)); break;
116*67e74705SXin Li #define ABSTRACT_TYPE(Class, Base)
117*67e74705SXin Li #include "clang/AST/TypeNodes.def"
118*67e74705SXin Li }
119*67e74705SXin Li }
120*67e74705SXin Li }
121*67e74705SXin Li
122*67e74705SXin Li void VisitArrayType(const ArrayType *T);
123*67e74705SXin Li void VisitFunctionType(const FunctionType *T);
124*67e74705SXin Li void VisitTagType(const TagType *T);
125*67e74705SXin Li
126*67e74705SXin Li #define TYPE(Class, Base) void Visit##Class##Type(const Class##Type *T);
127*67e74705SXin Li #define ABSTRACT_TYPE(Class, Base)
128*67e74705SXin Li #include "clang/AST/TypeNodes.def"
129*67e74705SXin Li };
130*67e74705SXin Li } // end namespace clang
131*67e74705SXin Li
VisitBuiltinType(const BuiltinType * T)132*67e74705SXin Li void ASTTypeWriter::VisitBuiltinType(const BuiltinType *T) {
133*67e74705SXin Li llvm_unreachable("Built-in types are never serialized");
134*67e74705SXin Li }
135*67e74705SXin Li
VisitComplexType(const ComplexType * T)136*67e74705SXin Li void ASTTypeWriter::VisitComplexType(const ComplexType *T) {
137*67e74705SXin Li Record.AddTypeRef(T->getElementType());
138*67e74705SXin Li Code = TYPE_COMPLEX;
139*67e74705SXin Li }
140*67e74705SXin Li
VisitPointerType(const PointerType * T)141*67e74705SXin Li void ASTTypeWriter::VisitPointerType(const PointerType *T) {
142*67e74705SXin Li Record.AddTypeRef(T->getPointeeType());
143*67e74705SXin Li Code = TYPE_POINTER;
144*67e74705SXin Li }
145*67e74705SXin Li
VisitDecayedType(const DecayedType * T)146*67e74705SXin Li void ASTTypeWriter::VisitDecayedType(const DecayedType *T) {
147*67e74705SXin Li Record.AddTypeRef(T->getOriginalType());
148*67e74705SXin Li Code = TYPE_DECAYED;
149*67e74705SXin Li }
150*67e74705SXin Li
VisitAdjustedType(const AdjustedType * T)151*67e74705SXin Li void ASTTypeWriter::VisitAdjustedType(const AdjustedType *T) {
152*67e74705SXin Li Record.AddTypeRef(T->getOriginalType());
153*67e74705SXin Li Record.AddTypeRef(T->getAdjustedType());
154*67e74705SXin Li Code = TYPE_ADJUSTED;
155*67e74705SXin Li }
156*67e74705SXin Li
VisitBlockPointerType(const BlockPointerType * T)157*67e74705SXin Li void ASTTypeWriter::VisitBlockPointerType(const BlockPointerType *T) {
158*67e74705SXin Li Record.AddTypeRef(T->getPointeeType());
159*67e74705SXin Li Code = TYPE_BLOCK_POINTER;
160*67e74705SXin Li }
161*67e74705SXin Li
VisitLValueReferenceType(const LValueReferenceType * T)162*67e74705SXin Li void ASTTypeWriter::VisitLValueReferenceType(const LValueReferenceType *T) {
163*67e74705SXin Li Record.AddTypeRef(T->getPointeeTypeAsWritten());
164*67e74705SXin Li Record.push_back(T->isSpelledAsLValue());
165*67e74705SXin Li Code = TYPE_LVALUE_REFERENCE;
166*67e74705SXin Li }
167*67e74705SXin Li
VisitRValueReferenceType(const RValueReferenceType * T)168*67e74705SXin Li void ASTTypeWriter::VisitRValueReferenceType(const RValueReferenceType *T) {
169*67e74705SXin Li Record.AddTypeRef(T->getPointeeTypeAsWritten());
170*67e74705SXin Li Code = TYPE_RVALUE_REFERENCE;
171*67e74705SXin Li }
172*67e74705SXin Li
VisitMemberPointerType(const MemberPointerType * T)173*67e74705SXin Li void ASTTypeWriter::VisitMemberPointerType(const MemberPointerType *T) {
174*67e74705SXin Li Record.AddTypeRef(T->getPointeeType());
175*67e74705SXin Li Record.AddTypeRef(QualType(T->getClass(), 0));
176*67e74705SXin Li Code = TYPE_MEMBER_POINTER;
177*67e74705SXin Li }
178*67e74705SXin Li
VisitArrayType(const ArrayType * T)179*67e74705SXin Li void ASTTypeWriter::VisitArrayType(const ArrayType *T) {
180*67e74705SXin Li Record.AddTypeRef(T->getElementType());
181*67e74705SXin Li Record.push_back(T->getSizeModifier()); // FIXME: stable values
182*67e74705SXin Li Record.push_back(T->getIndexTypeCVRQualifiers()); // FIXME: stable values
183*67e74705SXin Li }
184*67e74705SXin Li
VisitConstantArrayType(const ConstantArrayType * T)185*67e74705SXin Li void ASTTypeWriter::VisitConstantArrayType(const ConstantArrayType *T) {
186*67e74705SXin Li VisitArrayType(T);
187*67e74705SXin Li Record.AddAPInt(T->getSize());
188*67e74705SXin Li Code = TYPE_CONSTANT_ARRAY;
189*67e74705SXin Li }
190*67e74705SXin Li
VisitIncompleteArrayType(const IncompleteArrayType * T)191*67e74705SXin Li void ASTTypeWriter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
192*67e74705SXin Li VisitArrayType(T);
193*67e74705SXin Li Code = TYPE_INCOMPLETE_ARRAY;
194*67e74705SXin Li }
195*67e74705SXin Li
VisitVariableArrayType(const VariableArrayType * T)196*67e74705SXin Li void ASTTypeWriter::VisitVariableArrayType(const VariableArrayType *T) {
197*67e74705SXin Li VisitArrayType(T);
198*67e74705SXin Li Record.AddSourceLocation(T->getLBracketLoc());
199*67e74705SXin Li Record.AddSourceLocation(T->getRBracketLoc());
200*67e74705SXin Li Record.AddStmt(T->getSizeExpr());
201*67e74705SXin Li Code = TYPE_VARIABLE_ARRAY;
202*67e74705SXin Li }
203*67e74705SXin Li
VisitVectorType(const VectorType * T)204*67e74705SXin Li void ASTTypeWriter::VisitVectorType(const VectorType *T) {
205*67e74705SXin Li Record.AddTypeRef(T->getElementType());
206*67e74705SXin Li Record.push_back(T->getNumElements());
207*67e74705SXin Li Record.push_back(T->getVectorKind());
208*67e74705SXin Li Code = TYPE_VECTOR;
209*67e74705SXin Li }
210*67e74705SXin Li
VisitExtVectorType(const ExtVectorType * T)211*67e74705SXin Li void ASTTypeWriter::VisitExtVectorType(const ExtVectorType *T) {
212*67e74705SXin Li VisitVectorType(T);
213*67e74705SXin Li Code = TYPE_EXT_VECTOR;
214*67e74705SXin Li }
215*67e74705SXin Li
VisitFunctionType(const FunctionType * T)216*67e74705SXin Li void ASTTypeWriter::VisitFunctionType(const FunctionType *T) {
217*67e74705SXin Li Record.AddTypeRef(T->getReturnType());
218*67e74705SXin Li FunctionType::ExtInfo C = T->getExtInfo();
219*67e74705SXin Li Record.push_back(C.getNoReturn());
220*67e74705SXin Li Record.push_back(C.getHasRegParm());
221*67e74705SXin Li Record.push_back(C.getRegParm());
222*67e74705SXin Li // FIXME: need to stabilize encoding of calling convention...
223*67e74705SXin Li Record.push_back(C.getCC());
224*67e74705SXin Li Record.push_back(C.getProducesResult());
225*67e74705SXin Li
226*67e74705SXin Li if (C.getHasRegParm() || C.getRegParm() || C.getProducesResult())
227*67e74705SXin Li AbbrevToUse = 0;
228*67e74705SXin Li }
229*67e74705SXin Li
VisitFunctionNoProtoType(const FunctionNoProtoType * T)230*67e74705SXin Li void ASTTypeWriter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
231*67e74705SXin Li VisitFunctionType(T);
232*67e74705SXin Li Code = TYPE_FUNCTION_NO_PROTO;
233*67e74705SXin Li }
234*67e74705SXin Li
addExceptionSpec(const FunctionProtoType * T,ASTRecordWriter & Record)235*67e74705SXin Li static void addExceptionSpec(const FunctionProtoType *T,
236*67e74705SXin Li ASTRecordWriter &Record) {
237*67e74705SXin Li Record.push_back(T->getExceptionSpecType());
238*67e74705SXin Li if (T->getExceptionSpecType() == EST_Dynamic) {
239*67e74705SXin Li Record.push_back(T->getNumExceptions());
240*67e74705SXin Li for (unsigned I = 0, N = T->getNumExceptions(); I != N; ++I)
241*67e74705SXin Li Record.AddTypeRef(T->getExceptionType(I));
242*67e74705SXin Li } else if (T->getExceptionSpecType() == EST_ComputedNoexcept) {
243*67e74705SXin Li Record.AddStmt(T->getNoexceptExpr());
244*67e74705SXin Li } else if (T->getExceptionSpecType() == EST_Uninstantiated) {
245*67e74705SXin Li Record.AddDeclRef(T->getExceptionSpecDecl());
246*67e74705SXin Li Record.AddDeclRef(T->getExceptionSpecTemplate());
247*67e74705SXin Li } else if (T->getExceptionSpecType() == EST_Unevaluated) {
248*67e74705SXin Li Record.AddDeclRef(T->getExceptionSpecDecl());
249*67e74705SXin Li }
250*67e74705SXin Li }
251*67e74705SXin Li
VisitFunctionProtoType(const FunctionProtoType * T)252*67e74705SXin Li void ASTTypeWriter::VisitFunctionProtoType(const FunctionProtoType *T) {
253*67e74705SXin Li VisitFunctionType(T);
254*67e74705SXin Li
255*67e74705SXin Li Record.push_back(T->isVariadic());
256*67e74705SXin Li Record.push_back(T->hasTrailingReturn());
257*67e74705SXin Li Record.push_back(T->getTypeQuals());
258*67e74705SXin Li Record.push_back(static_cast<unsigned>(T->getRefQualifier()));
259*67e74705SXin Li addExceptionSpec(T, Record);
260*67e74705SXin Li
261*67e74705SXin Li Record.push_back(T->getNumParams());
262*67e74705SXin Li for (unsigned I = 0, N = T->getNumParams(); I != N; ++I)
263*67e74705SXin Li Record.AddTypeRef(T->getParamType(I));
264*67e74705SXin Li
265*67e74705SXin Li if (T->hasExtParameterInfos()) {
266*67e74705SXin Li for (unsigned I = 0, N = T->getNumParams(); I != N; ++I)
267*67e74705SXin Li Record.push_back(T->getExtParameterInfo(I).getOpaqueValue());
268*67e74705SXin Li }
269*67e74705SXin Li
270*67e74705SXin Li if (T->isVariadic() || T->hasTrailingReturn() || T->getTypeQuals() ||
271*67e74705SXin Li T->getRefQualifier() || T->getExceptionSpecType() != EST_None ||
272*67e74705SXin Li T->hasExtParameterInfos())
273*67e74705SXin Li AbbrevToUse = 0;
274*67e74705SXin Li
275*67e74705SXin Li Code = TYPE_FUNCTION_PROTO;
276*67e74705SXin Li }
277*67e74705SXin Li
VisitUnresolvedUsingType(const UnresolvedUsingType * T)278*67e74705SXin Li void ASTTypeWriter::VisitUnresolvedUsingType(const UnresolvedUsingType *T) {
279*67e74705SXin Li Record.AddDeclRef(T->getDecl());
280*67e74705SXin Li Code = TYPE_UNRESOLVED_USING;
281*67e74705SXin Li }
282*67e74705SXin Li
VisitTypedefType(const TypedefType * T)283*67e74705SXin Li void ASTTypeWriter::VisitTypedefType(const TypedefType *T) {
284*67e74705SXin Li Record.AddDeclRef(T->getDecl());
285*67e74705SXin Li assert(!T->isCanonicalUnqualified() && "Invalid typedef ?");
286*67e74705SXin Li Record.AddTypeRef(T->getCanonicalTypeInternal());
287*67e74705SXin Li Code = TYPE_TYPEDEF;
288*67e74705SXin Li }
289*67e74705SXin Li
VisitTypeOfExprType(const TypeOfExprType * T)290*67e74705SXin Li void ASTTypeWriter::VisitTypeOfExprType(const TypeOfExprType *T) {
291*67e74705SXin Li Record.AddStmt(T->getUnderlyingExpr());
292*67e74705SXin Li Code = TYPE_TYPEOF_EXPR;
293*67e74705SXin Li }
294*67e74705SXin Li
VisitTypeOfType(const TypeOfType * T)295*67e74705SXin Li void ASTTypeWriter::VisitTypeOfType(const TypeOfType *T) {
296*67e74705SXin Li Record.AddTypeRef(T->getUnderlyingType());
297*67e74705SXin Li Code = TYPE_TYPEOF;
298*67e74705SXin Li }
299*67e74705SXin Li
VisitDecltypeType(const DecltypeType * T)300*67e74705SXin Li void ASTTypeWriter::VisitDecltypeType(const DecltypeType *T) {
301*67e74705SXin Li Record.AddTypeRef(T->getUnderlyingType());
302*67e74705SXin Li Record.AddStmt(T->getUnderlyingExpr());
303*67e74705SXin Li Code = TYPE_DECLTYPE;
304*67e74705SXin Li }
305*67e74705SXin Li
VisitUnaryTransformType(const UnaryTransformType * T)306*67e74705SXin Li void ASTTypeWriter::VisitUnaryTransformType(const UnaryTransformType *T) {
307*67e74705SXin Li Record.AddTypeRef(T->getBaseType());
308*67e74705SXin Li Record.AddTypeRef(T->getUnderlyingType());
309*67e74705SXin Li Record.push_back(T->getUTTKind());
310*67e74705SXin Li Code = TYPE_UNARY_TRANSFORM;
311*67e74705SXin Li }
312*67e74705SXin Li
VisitAutoType(const AutoType * T)313*67e74705SXin Li void ASTTypeWriter::VisitAutoType(const AutoType *T) {
314*67e74705SXin Li Record.AddTypeRef(T->getDeducedType());
315*67e74705SXin Li Record.push_back((unsigned)T->getKeyword());
316*67e74705SXin Li if (T->getDeducedType().isNull())
317*67e74705SXin Li Record.push_back(T->isDependentType());
318*67e74705SXin Li Code = TYPE_AUTO;
319*67e74705SXin Li }
320*67e74705SXin Li
VisitTagType(const TagType * T)321*67e74705SXin Li void ASTTypeWriter::VisitTagType(const TagType *T) {
322*67e74705SXin Li Record.push_back(T->isDependentType());
323*67e74705SXin Li Record.AddDeclRef(T->getDecl()->getCanonicalDecl());
324*67e74705SXin Li assert(!T->isBeingDefined() &&
325*67e74705SXin Li "Cannot serialize in the middle of a type definition");
326*67e74705SXin Li }
327*67e74705SXin Li
VisitRecordType(const RecordType * T)328*67e74705SXin Li void ASTTypeWriter::VisitRecordType(const RecordType *T) {
329*67e74705SXin Li VisitTagType(T);
330*67e74705SXin Li Code = TYPE_RECORD;
331*67e74705SXin Li }
332*67e74705SXin Li
VisitEnumType(const EnumType * T)333*67e74705SXin Li void ASTTypeWriter::VisitEnumType(const EnumType *T) {
334*67e74705SXin Li VisitTagType(T);
335*67e74705SXin Li Code = TYPE_ENUM;
336*67e74705SXin Li }
337*67e74705SXin Li
VisitAttributedType(const AttributedType * T)338*67e74705SXin Li void ASTTypeWriter::VisitAttributedType(const AttributedType *T) {
339*67e74705SXin Li Record.AddTypeRef(T->getModifiedType());
340*67e74705SXin Li Record.AddTypeRef(T->getEquivalentType());
341*67e74705SXin Li Record.push_back(T->getAttrKind());
342*67e74705SXin Li Code = TYPE_ATTRIBUTED;
343*67e74705SXin Li }
344*67e74705SXin Li
345*67e74705SXin Li void
VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType * T)346*67e74705SXin Li ASTTypeWriter::VisitSubstTemplateTypeParmType(
347*67e74705SXin Li const SubstTemplateTypeParmType *T) {
348*67e74705SXin Li Record.AddTypeRef(QualType(T->getReplacedParameter(), 0));
349*67e74705SXin Li Record.AddTypeRef(T->getReplacementType());
350*67e74705SXin Li Code = TYPE_SUBST_TEMPLATE_TYPE_PARM;
351*67e74705SXin Li }
352*67e74705SXin Li
353*67e74705SXin Li void
VisitSubstTemplateTypeParmPackType(const SubstTemplateTypeParmPackType * T)354*67e74705SXin Li ASTTypeWriter::VisitSubstTemplateTypeParmPackType(
355*67e74705SXin Li const SubstTemplateTypeParmPackType *T) {
356*67e74705SXin Li Record.AddTypeRef(QualType(T->getReplacedParameter(), 0));
357*67e74705SXin Li Record.AddTemplateArgument(T->getArgumentPack());
358*67e74705SXin Li Code = TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK;
359*67e74705SXin Li }
360*67e74705SXin Li
361*67e74705SXin Li void
VisitTemplateSpecializationType(const TemplateSpecializationType * T)362*67e74705SXin Li ASTTypeWriter::VisitTemplateSpecializationType(
363*67e74705SXin Li const TemplateSpecializationType *T) {
364*67e74705SXin Li Record.push_back(T->isDependentType());
365*67e74705SXin Li Record.AddTemplateName(T->getTemplateName());
366*67e74705SXin Li Record.push_back(T->getNumArgs());
367*67e74705SXin Li for (const auto &ArgI : *T)
368*67e74705SXin Li Record.AddTemplateArgument(ArgI);
369*67e74705SXin Li Record.AddTypeRef(T->isTypeAlias() ? T->getAliasedType()
370*67e74705SXin Li : T->isCanonicalUnqualified()
371*67e74705SXin Li ? QualType()
372*67e74705SXin Li : T->getCanonicalTypeInternal());
373*67e74705SXin Li Code = TYPE_TEMPLATE_SPECIALIZATION;
374*67e74705SXin Li }
375*67e74705SXin Li
376*67e74705SXin Li void
VisitDependentSizedArrayType(const DependentSizedArrayType * T)377*67e74705SXin Li ASTTypeWriter::VisitDependentSizedArrayType(const DependentSizedArrayType *T) {
378*67e74705SXin Li VisitArrayType(T);
379*67e74705SXin Li Record.AddStmt(T->getSizeExpr());
380*67e74705SXin Li Record.AddSourceRange(T->getBracketsRange());
381*67e74705SXin Li Code = TYPE_DEPENDENT_SIZED_ARRAY;
382*67e74705SXin Li }
383*67e74705SXin Li
384*67e74705SXin Li void
VisitDependentSizedExtVectorType(const DependentSizedExtVectorType * T)385*67e74705SXin Li ASTTypeWriter::VisitDependentSizedExtVectorType(
386*67e74705SXin Li const DependentSizedExtVectorType *T) {
387*67e74705SXin Li // FIXME: Serialize this type (C++ only)
388*67e74705SXin Li llvm_unreachable("Cannot serialize dependent sized extended vector types");
389*67e74705SXin Li }
390*67e74705SXin Li
391*67e74705SXin Li void
VisitTemplateTypeParmType(const TemplateTypeParmType * T)392*67e74705SXin Li ASTTypeWriter::VisitTemplateTypeParmType(const TemplateTypeParmType *T) {
393*67e74705SXin Li Record.push_back(T->getDepth());
394*67e74705SXin Li Record.push_back(T->getIndex());
395*67e74705SXin Li Record.push_back(T->isParameterPack());
396*67e74705SXin Li Record.AddDeclRef(T->getDecl());
397*67e74705SXin Li Code = TYPE_TEMPLATE_TYPE_PARM;
398*67e74705SXin Li }
399*67e74705SXin Li
400*67e74705SXin Li void
VisitDependentNameType(const DependentNameType * T)401*67e74705SXin Li ASTTypeWriter::VisitDependentNameType(const DependentNameType *T) {
402*67e74705SXin Li Record.push_back(T->getKeyword());
403*67e74705SXin Li Record.AddNestedNameSpecifier(T->getQualifier());
404*67e74705SXin Li Record.AddIdentifierRef(T->getIdentifier());
405*67e74705SXin Li Record.AddTypeRef(
406*67e74705SXin Li T->isCanonicalUnqualified() ? QualType() : T->getCanonicalTypeInternal());
407*67e74705SXin Li Code = TYPE_DEPENDENT_NAME;
408*67e74705SXin Li }
409*67e74705SXin Li
410*67e74705SXin Li void
VisitDependentTemplateSpecializationType(const DependentTemplateSpecializationType * T)411*67e74705SXin Li ASTTypeWriter::VisitDependentTemplateSpecializationType(
412*67e74705SXin Li const DependentTemplateSpecializationType *T) {
413*67e74705SXin Li Record.push_back(T->getKeyword());
414*67e74705SXin Li Record.AddNestedNameSpecifier(T->getQualifier());
415*67e74705SXin Li Record.AddIdentifierRef(T->getIdentifier());
416*67e74705SXin Li Record.push_back(T->getNumArgs());
417*67e74705SXin Li for (const auto &I : *T)
418*67e74705SXin Li Record.AddTemplateArgument(I);
419*67e74705SXin Li Code = TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION;
420*67e74705SXin Li }
421*67e74705SXin Li
VisitPackExpansionType(const PackExpansionType * T)422*67e74705SXin Li void ASTTypeWriter::VisitPackExpansionType(const PackExpansionType *T) {
423*67e74705SXin Li Record.AddTypeRef(T->getPattern());
424*67e74705SXin Li if (Optional<unsigned> NumExpansions = T->getNumExpansions())
425*67e74705SXin Li Record.push_back(*NumExpansions + 1);
426*67e74705SXin Li else
427*67e74705SXin Li Record.push_back(0);
428*67e74705SXin Li Code = TYPE_PACK_EXPANSION;
429*67e74705SXin Li }
430*67e74705SXin Li
VisitParenType(const ParenType * T)431*67e74705SXin Li void ASTTypeWriter::VisitParenType(const ParenType *T) {
432*67e74705SXin Li Record.AddTypeRef(T->getInnerType());
433*67e74705SXin Li Code = TYPE_PAREN;
434*67e74705SXin Li }
435*67e74705SXin Li
VisitElaboratedType(const ElaboratedType * T)436*67e74705SXin Li void ASTTypeWriter::VisitElaboratedType(const ElaboratedType *T) {
437*67e74705SXin Li Record.push_back(T->getKeyword());
438*67e74705SXin Li Record.AddNestedNameSpecifier(T->getQualifier());
439*67e74705SXin Li Record.AddTypeRef(T->getNamedType());
440*67e74705SXin Li Code = TYPE_ELABORATED;
441*67e74705SXin Li }
442*67e74705SXin Li
VisitInjectedClassNameType(const InjectedClassNameType * T)443*67e74705SXin Li void ASTTypeWriter::VisitInjectedClassNameType(const InjectedClassNameType *T) {
444*67e74705SXin Li Record.AddDeclRef(T->getDecl()->getCanonicalDecl());
445*67e74705SXin Li Record.AddTypeRef(T->getInjectedSpecializationType());
446*67e74705SXin Li Code = TYPE_INJECTED_CLASS_NAME;
447*67e74705SXin Li }
448*67e74705SXin Li
VisitObjCInterfaceType(const ObjCInterfaceType * T)449*67e74705SXin Li void ASTTypeWriter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
450*67e74705SXin Li Record.AddDeclRef(T->getDecl()->getCanonicalDecl());
451*67e74705SXin Li Code = TYPE_OBJC_INTERFACE;
452*67e74705SXin Li }
453*67e74705SXin Li
VisitObjCObjectType(const ObjCObjectType * T)454*67e74705SXin Li void ASTTypeWriter::VisitObjCObjectType(const ObjCObjectType *T) {
455*67e74705SXin Li Record.AddTypeRef(T->getBaseType());
456*67e74705SXin Li Record.push_back(T->getTypeArgsAsWritten().size());
457*67e74705SXin Li for (auto TypeArg : T->getTypeArgsAsWritten())
458*67e74705SXin Li Record.AddTypeRef(TypeArg);
459*67e74705SXin Li Record.push_back(T->getNumProtocols());
460*67e74705SXin Li for (const auto *I : T->quals())
461*67e74705SXin Li Record.AddDeclRef(I);
462*67e74705SXin Li Record.push_back(T->isKindOfTypeAsWritten());
463*67e74705SXin Li Code = TYPE_OBJC_OBJECT;
464*67e74705SXin Li }
465*67e74705SXin Li
466*67e74705SXin Li void
VisitObjCObjectPointerType(const ObjCObjectPointerType * T)467*67e74705SXin Li ASTTypeWriter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
468*67e74705SXin Li Record.AddTypeRef(T->getPointeeType());
469*67e74705SXin Li Code = TYPE_OBJC_OBJECT_POINTER;
470*67e74705SXin Li }
471*67e74705SXin Li
472*67e74705SXin Li void
VisitAtomicType(const AtomicType * T)473*67e74705SXin Li ASTTypeWriter::VisitAtomicType(const AtomicType *T) {
474*67e74705SXin Li Record.AddTypeRef(T->getValueType());
475*67e74705SXin Li Code = TYPE_ATOMIC;
476*67e74705SXin Li }
477*67e74705SXin Li
478*67e74705SXin Li void
VisitPipeType(const PipeType * T)479*67e74705SXin Li ASTTypeWriter::VisitPipeType(const PipeType *T) {
480*67e74705SXin Li Record.AddTypeRef(T->getElementType());
481*67e74705SXin Li Code = TYPE_PIPE;
482*67e74705SXin Li }
483*67e74705SXin Li
484*67e74705SXin Li namespace {
485*67e74705SXin Li
486*67e74705SXin Li class TypeLocWriter : public TypeLocVisitor<TypeLocWriter> {
487*67e74705SXin Li ASTRecordWriter &Record;
488*67e74705SXin Li
489*67e74705SXin Li public:
TypeLocWriter(ASTRecordWriter & Record)490*67e74705SXin Li TypeLocWriter(ASTRecordWriter &Record)
491*67e74705SXin Li : Record(Record) { }
492*67e74705SXin Li
493*67e74705SXin Li #define ABSTRACT_TYPELOC(CLASS, PARENT)
494*67e74705SXin Li #define TYPELOC(CLASS, PARENT) \
495*67e74705SXin Li void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
496*67e74705SXin Li #include "clang/AST/TypeLocNodes.def"
497*67e74705SXin Li
498*67e74705SXin Li void VisitArrayTypeLoc(ArrayTypeLoc TyLoc);
499*67e74705SXin Li void VisitFunctionTypeLoc(FunctionTypeLoc TyLoc);
500*67e74705SXin Li };
501*67e74705SXin Li
502*67e74705SXin Li } // end anonymous namespace
503*67e74705SXin Li
VisitQualifiedTypeLoc(QualifiedTypeLoc TL)504*67e74705SXin Li void TypeLocWriter::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
505*67e74705SXin Li // nothing to do
506*67e74705SXin Li }
VisitBuiltinTypeLoc(BuiltinTypeLoc TL)507*67e74705SXin Li void TypeLocWriter::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
508*67e74705SXin Li Record.AddSourceLocation(TL.getBuiltinLoc());
509*67e74705SXin Li if (TL.needsExtraLocalData()) {
510*67e74705SXin Li Record.push_back(TL.getWrittenTypeSpec());
511*67e74705SXin Li Record.push_back(TL.getWrittenSignSpec());
512*67e74705SXin Li Record.push_back(TL.getWrittenWidthSpec());
513*67e74705SXin Li Record.push_back(TL.hasModeAttr());
514*67e74705SXin Li }
515*67e74705SXin Li }
VisitComplexTypeLoc(ComplexTypeLoc TL)516*67e74705SXin Li void TypeLocWriter::VisitComplexTypeLoc(ComplexTypeLoc TL) {
517*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
518*67e74705SXin Li }
VisitPointerTypeLoc(PointerTypeLoc TL)519*67e74705SXin Li void TypeLocWriter::VisitPointerTypeLoc(PointerTypeLoc TL) {
520*67e74705SXin Li Record.AddSourceLocation(TL.getStarLoc());
521*67e74705SXin Li }
VisitDecayedTypeLoc(DecayedTypeLoc TL)522*67e74705SXin Li void TypeLocWriter::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
523*67e74705SXin Li // nothing to do
524*67e74705SXin Li }
VisitAdjustedTypeLoc(AdjustedTypeLoc TL)525*67e74705SXin Li void TypeLocWriter::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
526*67e74705SXin Li // nothing to do
527*67e74705SXin Li }
VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL)528*67e74705SXin Li void TypeLocWriter::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
529*67e74705SXin Li Record.AddSourceLocation(TL.getCaretLoc());
530*67e74705SXin Li }
VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL)531*67e74705SXin Li void TypeLocWriter::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
532*67e74705SXin Li Record.AddSourceLocation(TL.getAmpLoc());
533*67e74705SXin Li }
VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL)534*67e74705SXin Li void TypeLocWriter::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
535*67e74705SXin Li Record.AddSourceLocation(TL.getAmpAmpLoc());
536*67e74705SXin Li }
VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL)537*67e74705SXin Li void TypeLocWriter::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
538*67e74705SXin Li Record.AddSourceLocation(TL.getStarLoc());
539*67e74705SXin Li Record.AddTypeSourceInfo(TL.getClassTInfo());
540*67e74705SXin Li }
VisitArrayTypeLoc(ArrayTypeLoc TL)541*67e74705SXin Li void TypeLocWriter::VisitArrayTypeLoc(ArrayTypeLoc TL) {
542*67e74705SXin Li Record.AddSourceLocation(TL.getLBracketLoc());
543*67e74705SXin Li Record.AddSourceLocation(TL.getRBracketLoc());
544*67e74705SXin Li Record.push_back(TL.getSizeExpr() ? 1 : 0);
545*67e74705SXin Li if (TL.getSizeExpr())
546*67e74705SXin Li Record.AddStmt(TL.getSizeExpr());
547*67e74705SXin Li }
VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL)548*67e74705SXin Li void TypeLocWriter::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
549*67e74705SXin Li VisitArrayTypeLoc(TL);
550*67e74705SXin Li }
VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL)551*67e74705SXin Li void TypeLocWriter::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
552*67e74705SXin Li VisitArrayTypeLoc(TL);
553*67e74705SXin Li }
VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL)554*67e74705SXin Li void TypeLocWriter::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
555*67e74705SXin Li VisitArrayTypeLoc(TL);
556*67e74705SXin Li }
VisitDependentSizedArrayTypeLoc(DependentSizedArrayTypeLoc TL)557*67e74705SXin Li void TypeLocWriter::VisitDependentSizedArrayTypeLoc(
558*67e74705SXin Li DependentSizedArrayTypeLoc TL) {
559*67e74705SXin Li VisitArrayTypeLoc(TL);
560*67e74705SXin Li }
VisitDependentSizedExtVectorTypeLoc(DependentSizedExtVectorTypeLoc TL)561*67e74705SXin Li void TypeLocWriter::VisitDependentSizedExtVectorTypeLoc(
562*67e74705SXin Li DependentSizedExtVectorTypeLoc TL) {
563*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
564*67e74705SXin Li }
VisitVectorTypeLoc(VectorTypeLoc TL)565*67e74705SXin Li void TypeLocWriter::VisitVectorTypeLoc(VectorTypeLoc TL) {
566*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
567*67e74705SXin Li }
VisitExtVectorTypeLoc(ExtVectorTypeLoc TL)568*67e74705SXin Li void TypeLocWriter::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
569*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
570*67e74705SXin Li }
VisitFunctionTypeLoc(FunctionTypeLoc TL)571*67e74705SXin Li void TypeLocWriter::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
572*67e74705SXin Li Record.AddSourceLocation(TL.getLocalRangeBegin());
573*67e74705SXin Li Record.AddSourceLocation(TL.getLParenLoc());
574*67e74705SXin Li Record.AddSourceLocation(TL.getRParenLoc());
575*67e74705SXin Li Record.AddSourceLocation(TL.getLocalRangeEnd());
576*67e74705SXin Li for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i)
577*67e74705SXin Li Record.AddDeclRef(TL.getParam(i));
578*67e74705SXin Li }
VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL)579*67e74705SXin Li void TypeLocWriter::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
580*67e74705SXin Li VisitFunctionTypeLoc(TL);
581*67e74705SXin Li }
VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL)582*67e74705SXin Li void TypeLocWriter::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
583*67e74705SXin Li VisitFunctionTypeLoc(TL);
584*67e74705SXin Li }
VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL)585*67e74705SXin Li void TypeLocWriter::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
586*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
587*67e74705SXin Li }
VisitTypedefTypeLoc(TypedefTypeLoc TL)588*67e74705SXin Li void TypeLocWriter::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
589*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
590*67e74705SXin Li }
VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL)591*67e74705SXin Li void TypeLocWriter::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
592*67e74705SXin Li Record.AddSourceLocation(TL.getTypeofLoc());
593*67e74705SXin Li Record.AddSourceLocation(TL.getLParenLoc());
594*67e74705SXin Li Record.AddSourceLocation(TL.getRParenLoc());
595*67e74705SXin Li }
VisitTypeOfTypeLoc(TypeOfTypeLoc TL)596*67e74705SXin Li void TypeLocWriter::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
597*67e74705SXin Li Record.AddSourceLocation(TL.getTypeofLoc());
598*67e74705SXin Li Record.AddSourceLocation(TL.getLParenLoc());
599*67e74705SXin Li Record.AddSourceLocation(TL.getRParenLoc());
600*67e74705SXin Li Record.AddTypeSourceInfo(TL.getUnderlyingTInfo());
601*67e74705SXin Li }
VisitDecltypeTypeLoc(DecltypeTypeLoc TL)602*67e74705SXin Li void TypeLocWriter::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
603*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
604*67e74705SXin Li }
VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL)605*67e74705SXin Li void TypeLocWriter::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
606*67e74705SXin Li Record.AddSourceLocation(TL.getKWLoc());
607*67e74705SXin Li Record.AddSourceLocation(TL.getLParenLoc());
608*67e74705SXin Li Record.AddSourceLocation(TL.getRParenLoc());
609*67e74705SXin Li Record.AddTypeSourceInfo(TL.getUnderlyingTInfo());
610*67e74705SXin Li }
VisitAutoTypeLoc(AutoTypeLoc TL)611*67e74705SXin Li void TypeLocWriter::VisitAutoTypeLoc(AutoTypeLoc TL) {
612*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
613*67e74705SXin Li }
VisitRecordTypeLoc(RecordTypeLoc TL)614*67e74705SXin Li void TypeLocWriter::VisitRecordTypeLoc(RecordTypeLoc TL) {
615*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
616*67e74705SXin Li }
VisitEnumTypeLoc(EnumTypeLoc TL)617*67e74705SXin Li void TypeLocWriter::VisitEnumTypeLoc(EnumTypeLoc TL) {
618*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
619*67e74705SXin Li }
VisitAttributedTypeLoc(AttributedTypeLoc TL)620*67e74705SXin Li void TypeLocWriter::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
621*67e74705SXin Li Record.AddSourceLocation(TL.getAttrNameLoc());
622*67e74705SXin Li if (TL.hasAttrOperand()) {
623*67e74705SXin Li SourceRange range = TL.getAttrOperandParensRange();
624*67e74705SXin Li Record.AddSourceLocation(range.getBegin());
625*67e74705SXin Li Record.AddSourceLocation(range.getEnd());
626*67e74705SXin Li }
627*67e74705SXin Li if (TL.hasAttrExprOperand()) {
628*67e74705SXin Li Expr *operand = TL.getAttrExprOperand();
629*67e74705SXin Li Record.push_back(operand ? 1 : 0);
630*67e74705SXin Li if (operand) Record.AddStmt(operand);
631*67e74705SXin Li } else if (TL.hasAttrEnumOperand()) {
632*67e74705SXin Li Record.AddSourceLocation(TL.getAttrEnumOperandLoc());
633*67e74705SXin Li }
634*67e74705SXin Li }
VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL)635*67e74705SXin Li void TypeLocWriter::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
636*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
637*67e74705SXin Li }
VisitSubstTemplateTypeParmTypeLoc(SubstTemplateTypeParmTypeLoc TL)638*67e74705SXin Li void TypeLocWriter::VisitSubstTemplateTypeParmTypeLoc(
639*67e74705SXin Li SubstTemplateTypeParmTypeLoc TL) {
640*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
641*67e74705SXin Li }
VisitSubstTemplateTypeParmPackTypeLoc(SubstTemplateTypeParmPackTypeLoc TL)642*67e74705SXin Li void TypeLocWriter::VisitSubstTemplateTypeParmPackTypeLoc(
643*67e74705SXin Li SubstTemplateTypeParmPackTypeLoc TL) {
644*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
645*67e74705SXin Li }
VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL)646*67e74705SXin Li void TypeLocWriter::VisitTemplateSpecializationTypeLoc(
647*67e74705SXin Li TemplateSpecializationTypeLoc TL) {
648*67e74705SXin Li Record.AddSourceLocation(TL.getTemplateKeywordLoc());
649*67e74705SXin Li Record.AddSourceLocation(TL.getTemplateNameLoc());
650*67e74705SXin Li Record.AddSourceLocation(TL.getLAngleLoc());
651*67e74705SXin Li Record.AddSourceLocation(TL.getRAngleLoc());
652*67e74705SXin Li for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
653*67e74705SXin Li Record.AddTemplateArgumentLocInfo(TL.getArgLoc(i).getArgument().getKind(),
654*67e74705SXin Li TL.getArgLoc(i).getLocInfo());
655*67e74705SXin Li }
VisitParenTypeLoc(ParenTypeLoc TL)656*67e74705SXin Li void TypeLocWriter::VisitParenTypeLoc(ParenTypeLoc TL) {
657*67e74705SXin Li Record.AddSourceLocation(TL.getLParenLoc());
658*67e74705SXin Li Record.AddSourceLocation(TL.getRParenLoc());
659*67e74705SXin Li }
VisitElaboratedTypeLoc(ElaboratedTypeLoc TL)660*67e74705SXin Li void TypeLocWriter::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
661*67e74705SXin Li Record.AddSourceLocation(TL.getElaboratedKeywordLoc());
662*67e74705SXin Li Record.AddNestedNameSpecifierLoc(TL.getQualifierLoc());
663*67e74705SXin Li }
VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL)664*67e74705SXin Li void TypeLocWriter::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
665*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
666*67e74705SXin Li }
VisitDependentNameTypeLoc(DependentNameTypeLoc TL)667*67e74705SXin Li void TypeLocWriter::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
668*67e74705SXin Li Record.AddSourceLocation(TL.getElaboratedKeywordLoc());
669*67e74705SXin Li Record.AddNestedNameSpecifierLoc(TL.getQualifierLoc());
670*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
671*67e74705SXin Li }
VisitDependentTemplateSpecializationTypeLoc(DependentTemplateSpecializationTypeLoc TL)672*67e74705SXin Li void TypeLocWriter::VisitDependentTemplateSpecializationTypeLoc(
673*67e74705SXin Li DependentTemplateSpecializationTypeLoc TL) {
674*67e74705SXin Li Record.AddSourceLocation(TL.getElaboratedKeywordLoc());
675*67e74705SXin Li Record.AddNestedNameSpecifierLoc(TL.getQualifierLoc());
676*67e74705SXin Li Record.AddSourceLocation(TL.getTemplateKeywordLoc());
677*67e74705SXin Li Record.AddSourceLocation(TL.getTemplateNameLoc());
678*67e74705SXin Li Record.AddSourceLocation(TL.getLAngleLoc());
679*67e74705SXin Li Record.AddSourceLocation(TL.getRAngleLoc());
680*67e74705SXin Li for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
681*67e74705SXin Li Record.AddTemplateArgumentLocInfo(TL.getArgLoc(I).getArgument().getKind(),
682*67e74705SXin Li TL.getArgLoc(I).getLocInfo());
683*67e74705SXin Li }
VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL)684*67e74705SXin Li void TypeLocWriter::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
685*67e74705SXin Li Record.AddSourceLocation(TL.getEllipsisLoc());
686*67e74705SXin Li }
VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL)687*67e74705SXin Li void TypeLocWriter::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
688*67e74705SXin Li Record.AddSourceLocation(TL.getNameLoc());
689*67e74705SXin Li }
VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL)690*67e74705SXin Li void TypeLocWriter::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
691*67e74705SXin Li Record.push_back(TL.hasBaseTypeAsWritten());
692*67e74705SXin Li Record.AddSourceLocation(TL.getTypeArgsLAngleLoc());
693*67e74705SXin Li Record.AddSourceLocation(TL.getTypeArgsRAngleLoc());
694*67e74705SXin Li for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
695*67e74705SXin Li Record.AddTypeSourceInfo(TL.getTypeArgTInfo(i));
696*67e74705SXin Li Record.AddSourceLocation(TL.getProtocolLAngleLoc());
697*67e74705SXin Li Record.AddSourceLocation(TL.getProtocolRAngleLoc());
698*67e74705SXin Li for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
699*67e74705SXin Li Record.AddSourceLocation(TL.getProtocolLoc(i));
700*67e74705SXin Li }
VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL)701*67e74705SXin Li void TypeLocWriter::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
702*67e74705SXin Li Record.AddSourceLocation(TL.getStarLoc());
703*67e74705SXin Li }
VisitAtomicTypeLoc(AtomicTypeLoc TL)704*67e74705SXin Li void TypeLocWriter::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
705*67e74705SXin Li Record.AddSourceLocation(TL.getKWLoc());
706*67e74705SXin Li Record.AddSourceLocation(TL.getLParenLoc());
707*67e74705SXin Li Record.AddSourceLocation(TL.getRParenLoc());
708*67e74705SXin Li }
VisitPipeTypeLoc(PipeTypeLoc TL)709*67e74705SXin Li void TypeLocWriter::VisitPipeTypeLoc(PipeTypeLoc TL) {
710*67e74705SXin Li Record.AddSourceLocation(TL.getKWLoc());
711*67e74705SXin Li }
712*67e74705SXin Li
WriteTypeAbbrevs()713*67e74705SXin Li void ASTWriter::WriteTypeAbbrevs() {
714*67e74705SXin Li using namespace llvm;
715*67e74705SXin Li
716*67e74705SXin Li BitCodeAbbrev *Abv;
717*67e74705SXin Li
718*67e74705SXin Li // Abbreviation for TYPE_EXT_QUAL
719*67e74705SXin Li Abv = new BitCodeAbbrev();
720*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(serialization::TYPE_EXT_QUAL));
721*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
722*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3)); // Quals
723*67e74705SXin Li TypeExtQualAbbrev = Stream.EmitAbbrev(Abv);
724*67e74705SXin Li
725*67e74705SXin Li // Abbreviation for TYPE_FUNCTION_PROTO
726*67e74705SXin Li Abv = new BitCodeAbbrev();
727*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(serialization::TYPE_FUNCTION_PROTO));
728*67e74705SXin Li // FunctionType
729*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ReturnType
730*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // NoReturn
731*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(0)); // HasRegParm
732*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(0)); // RegParm
733*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // CC
734*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(0)); // ProducesResult
735*67e74705SXin Li // FunctionProtoType
736*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(0)); // IsVariadic
737*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(0)); // HasTrailingReturn
738*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(0)); // TypeQuals
739*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(0)); // RefQualifier
740*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(EST_None)); // ExceptionSpec
741*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // NumParams
742*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
743*67e74705SXin Li Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Params
744*67e74705SXin Li TypeFunctionProtoAbbrev = Stream.EmitAbbrev(Abv);
745*67e74705SXin Li }
746*67e74705SXin Li
747*67e74705SXin Li //===----------------------------------------------------------------------===//
748*67e74705SXin Li // ASTWriter Implementation
749*67e74705SXin Li //===----------------------------------------------------------------------===//
750*67e74705SXin Li
EmitBlockID(unsigned ID,const char * Name,llvm::BitstreamWriter & Stream,ASTWriter::RecordDataImpl & Record)751*67e74705SXin Li static void EmitBlockID(unsigned ID, const char *Name,
752*67e74705SXin Li llvm::BitstreamWriter &Stream,
753*67e74705SXin Li ASTWriter::RecordDataImpl &Record) {
754*67e74705SXin Li Record.clear();
755*67e74705SXin Li Record.push_back(ID);
756*67e74705SXin Li Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID, Record);
757*67e74705SXin Li
758*67e74705SXin Li // Emit the block name if present.
759*67e74705SXin Li if (!Name || Name[0] == 0)
760*67e74705SXin Li return;
761*67e74705SXin Li Record.clear();
762*67e74705SXin Li while (*Name)
763*67e74705SXin Li Record.push_back(*Name++);
764*67e74705SXin Li Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME, Record);
765*67e74705SXin Li }
766*67e74705SXin Li
EmitRecordID(unsigned ID,const char * Name,llvm::BitstreamWriter & Stream,ASTWriter::RecordDataImpl & Record)767*67e74705SXin Li static void EmitRecordID(unsigned ID, const char *Name,
768*67e74705SXin Li llvm::BitstreamWriter &Stream,
769*67e74705SXin Li ASTWriter::RecordDataImpl &Record) {
770*67e74705SXin Li Record.clear();
771*67e74705SXin Li Record.push_back(ID);
772*67e74705SXin Li while (*Name)
773*67e74705SXin Li Record.push_back(*Name++);
774*67e74705SXin Li Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, Record);
775*67e74705SXin Li }
776*67e74705SXin Li
AddStmtsExprs(llvm::BitstreamWriter & Stream,ASTWriter::RecordDataImpl & Record)777*67e74705SXin Li static void AddStmtsExprs(llvm::BitstreamWriter &Stream,
778*67e74705SXin Li ASTWriter::RecordDataImpl &Record) {
779*67e74705SXin Li #define RECORD(X) EmitRecordID(X, #X, Stream, Record)
780*67e74705SXin Li RECORD(STMT_STOP);
781*67e74705SXin Li RECORD(STMT_NULL_PTR);
782*67e74705SXin Li RECORD(STMT_REF_PTR);
783*67e74705SXin Li RECORD(STMT_NULL);
784*67e74705SXin Li RECORD(STMT_COMPOUND);
785*67e74705SXin Li RECORD(STMT_CASE);
786*67e74705SXin Li RECORD(STMT_DEFAULT);
787*67e74705SXin Li RECORD(STMT_LABEL);
788*67e74705SXin Li RECORD(STMT_ATTRIBUTED);
789*67e74705SXin Li RECORD(STMT_IF);
790*67e74705SXin Li RECORD(STMT_SWITCH);
791*67e74705SXin Li RECORD(STMT_WHILE);
792*67e74705SXin Li RECORD(STMT_DO);
793*67e74705SXin Li RECORD(STMT_FOR);
794*67e74705SXin Li RECORD(STMT_GOTO);
795*67e74705SXin Li RECORD(STMT_INDIRECT_GOTO);
796*67e74705SXin Li RECORD(STMT_CONTINUE);
797*67e74705SXin Li RECORD(STMT_BREAK);
798*67e74705SXin Li RECORD(STMT_RETURN);
799*67e74705SXin Li RECORD(STMT_DECL);
800*67e74705SXin Li RECORD(STMT_GCCASM);
801*67e74705SXin Li RECORD(STMT_MSASM);
802*67e74705SXin Li RECORD(EXPR_PREDEFINED);
803*67e74705SXin Li RECORD(EXPR_DECL_REF);
804*67e74705SXin Li RECORD(EXPR_INTEGER_LITERAL);
805*67e74705SXin Li RECORD(EXPR_FLOATING_LITERAL);
806*67e74705SXin Li RECORD(EXPR_IMAGINARY_LITERAL);
807*67e74705SXin Li RECORD(EXPR_STRING_LITERAL);
808*67e74705SXin Li RECORD(EXPR_CHARACTER_LITERAL);
809*67e74705SXin Li RECORD(EXPR_PAREN);
810*67e74705SXin Li RECORD(EXPR_PAREN_LIST);
811*67e74705SXin Li RECORD(EXPR_UNARY_OPERATOR);
812*67e74705SXin Li RECORD(EXPR_SIZEOF_ALIGN_OF);
813*67e74705SXin Li RECORD(EXPR_ARRAY_SUBSCRIPT);
814*67e74705SXin Li RECORD(EXPR_CALL);
815*67e74705SXin Li RECORD(EXPR_MEMBER);
816*67e74705SXin Li RECORD(EXPR_BINARY_OPERATOR);
817*67e74705SXin Li RECORD(EXPR_COMPOUND_ASSIGN_OPERATOR);
818*67e74705SXin Li RECORD(EXPR_CONDITIONAL_OPERATOR);
819*67e74705SXin Li RECORD(EXPR_IMPLICIT_CAST);
820*67e74705SXin Li RECORD(EXPR_CSTYLE_CAST);
821*67e74705SXin Li RECORD(EXPR_COMPOUND_LITERAL);
822*67e74705SXin Li RECORD(EXPR_EXT_VECTOR_ELEMENT);
823*67e74705SXin Li RECORD(EXPR_INIT_LIST);
824*67e74705SXin Li RECORD(EXPR_DESIGNATED_INIT);
825*67e74705SXin Li RECORD(EXPR_DESIGNATED_INIT_UPDATE);
826*67e74705SXin Li RECORD(EXPR_IMPLICIT_VALUE_INIT);
827*67e74705SXin Li RECORD(EXPR_NO_INIT);
828*67e74705SXin Li RECORD(EXPR_VA_ARG);
829*67e74705SXin Li RECORD(EXPR_ADDR_LABEL);
830*67e74705SXin Li RECORD(EXPR_STMT);
831*67e74705SXin Li RECORD(EXPR_CHOOSE);
832*67e74705SXin Li RECORD(EXPR_GNU_NULL);
833*67e74705SXin Li RECORD(EXPR_SHUFFLE_VECTOR);
834*67e74705SXin Li RECORD(EXPR_BLOCK);
835*67e74705SXin Li RECORD(EXPR_GENERIC_SELECTION);
836*67e74705SXin Li RECORD(EXPR_OBJC_STRING_LITERAL);
837*67e74705SXin Li RECORD(EXPR_OBJC_BOXED_EXPRESSION);
838*67e74705SXin Li RECORD(EXPR_OBJC_ARRAY_LITERAL);
839*67e74705SXin Li RECORD(EXPR_OBJC_DICTIONARY_LITERAL);
840*67e74705SXin Li RECORD(EXPR_OBJC_ENCODE);
841*67e74705SXin Li RECORD(EXPR_OBJC_SELECTOR_EXPR);
842*67e74705SXin Li RECORD(EXPR_OBJC_PROTOCOL_EXPR);
843*67e74705SXin Li RECORD(EXPR_OBJC_IVAR_REF_EXPR);
844*67e74705SXin Li RECORD(EXPR_OBJC_PROPERTY_REF_EXPR);
845*67e74705SXin Li RECORD(EXPR_OBJC_KVC_REF_EXPR);
846*67e74705SXin Li RECORD(EXPR_OBJC_MESSAGE_EXPR);
847*67e74705SXin Li RECORD(STMT_OBJC_FOR_COLLECTION);
848*67e74705SXin Li RECORD(STMT_OBJC_CATCH);
849*67e74705SXin Li RECORD(STMT_OBJC_FINALLY);
850*67e74705SXin Li RECORD(STMT_OBJC_AT_TRY);
851*67e74705SXin Li RECORD(STMT_OBJC_AT_SYNCHRONIZED);
852*67e74705SXin Li RECORD(STMT_OBJC_AT_THROW);
853*67e74705SXin Li RECORD(EXPR_OBJC_BOOL_LITERAL);
854*67e74705SXin Li RECORD(STMT_CXX_CATCH);
855*67e74705SXin Li RECORD(STMT_CXX_TRY);
856*67e74705SXin Li RECORD(STMT_CXX_FOR_RANGE);
857*67e74705SXin Li RECORD(EXPR_CXX_OPERATOR_CALL);
858*67e74705SXin Li RECORD(EXPR_CXX_MEMBER_CALL);
859*67e74705SXin Li RECORD(EXPR_CXX_CONSTRUCT);
860*67e74705SXin Li RECORD(EXPR_CXX_TEMPORARY_OBJECT);
861*67e74705SXin Li RECORD(EXPR_CXX_STATIC_CAST);
862*67e74705SXin Li RECORD(EXPR_CXX_DYNAMIC_CAST);
863*67e74705SXin Li RECORD(EXPR_CXX_REINTERPRET_CAST);
864*67e74705SXin Li RECORD(EXPR_CXX_CONST_CAST);
865*67e74705SXin Li RECORD(EXPR_CXX_FUNCTIONAL_CAST);
866*67e74705SXin Li RECORD(EXPR_USER_DEFINED_LITERAL);
867*67e74705SXin Li RECORD(EXPR_CXX_STD_INITIALIZER_LIST);
868*67e74705SXin Li RECORD(EXPR_CXX_BOOL_LITERAL);
869*67e74705SXin Li RECORD(EXPR_CXX_NULL_PTR_LITERAL);
870*67e74705SXin Li RECORD(EXPR_CXX_TYPEID_EXPR);
871*67e74705SXin Li RECORD(EXPR_CXX_TYPEID_TYPE);
872*67e74705SXin Li RECORD(EXPR_CXX_THIS);
873*67e74705SXin Li RECORD(EXPR_CXX_THROW);
874*67e74705SXin Li RECORD(EXPR_CXX_DEFAULT_ARG);
875*67e74705SXin Li RECORD(EXPR_CXX_DEFAULT_INIT);
876*67e74705SXin Li RECORD(EXPR_CXX_BIND_TEMPORARY);
877*67e74705SXin Li RECORD(EXPR_CXX_SCALAR_VALUE_INIT);
878*67e74705SXin Li RECORD(EXPR_CXX_NEW);
879*67e74705SXin Li RECORD(EXPR_CXX_DELETE);
880*67e74705SXin Li RECORD(EXPR_CXX_PSEUDO_DESTRUCTOR);
881*67e74705SXin Li RECORD(EXPR_EXPR_WITH_CLEANUPS);
882*67e74705SXin Li RECORD(EXPR_CXX_DEPENDENT_SCOPE_MEMBER);
883*67e74705SXin Li RECORD(EXPR_CXX_DEPENDENT_SCOPE_DECL_REF);
884*67e74705SXin Li RECORD(EXPR_CXX_UNRESOLVED_CONSTRUCT);
885*67e74705SXin Li RECORD(EXPR_CXX_UNRESOLVED_MEMBER);
886*67e74705SXin Li RECORD(EXPR_CXX_UNRESOLVED_LOOKUP);
887*67e74705SXin Li RECORD(EXPR_CXX_EXPRESSION_TRAIT);
888*67e74705SXin Li RECORD(EXPR_CXX_NOEXCEPT);
889*67e74705SXin Li RECORD(EXPR_OPAQUE_VALUE);
890*67e74705SXin Li RECORD(EXPR_BINARY_CONDITIONAL_OPERATOR);
891*67e74705SXin Li RECORD(EXPR_TYPE_TRAIT);
892*67e74705SXin Li RECORD(EXPR_ARRAY_TYPE_TRAIT);
893*67e74705SXin Li RECORD(EXPR_PACK_EXPANSION);
894*67e74705SXin Li RECORD(EXPR_SIZEOF_PACK);
895*67e74705SXin Li RECORD(EXPR_SUBST_NON_TYPE_TEMPLATE_PARM);
896*67e74705SXin Li RECORD(EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK);
897*67e74705SXin Li RECORD(EXPR_FUNCTION_PARM_PACK);
898*67e74705SXin Li RECORD(EXPR_MATERIALIZE_TEMPORARY);
899*67e74705SXin Li RECORD(EXPR_CUDA_KERNEL_CALL);
900*67e74705SXin Li RECORD(EXPR_CXX_UUIDOF_EXPR);
901*67e74705SXin Li RECORD(EXPR_CXX_UUIDOF_TYPE);
902*67e74705SXin Li RECORD(EXPR_LAMBDA);
903*67e74705SXin Li #undef RECORD
904*67e74705SXin Li }
905*67e74705SXin Li
WriteBlockInfoBlock()906*67e74705SXin Li void ASTWriter::WriteBlockInfoBlock() {
907*67e74705SXin Li RecordData Record;
908*67e74705SXin Li Stream.EnterSubblock(llvm::bitc::BLOCKINFO_BLOCK_ID, 3);
909*67e74705SXin Li
910*67e74705SXin Li #define BLOCK(X) EmitBlockID(X ## _ID, #X, Stream, Record)
911*67e74705SXin Li #define RECORD(X) EmitRecordID(X, #X, Stream, Record)
912*67e74705SXin Li
913*67e74705SXin Li // Control Block.
914*67e74705SXin Li BLOCK(CONTROL_BLOCK);
915*67e74705SXin Li RECORD(METADATA);
916*67e74705SXin Li RECORD(SIGNATURE);
917*67e74705SXin Li RECORD(MODULE_NAME);
918*67e74705SXin Li RECORD(MODULE_DIRECTORY);
919*67e74705SXin Li RECORD(MODULE_MAP_FILE);
920*67e74705SXin Li RECORD(IMPORTS);
921*67e74705SXin Li RECORD(ORIGINAL_FILE);
922*67e74705SXin Li RECORD(ORIGINAL_PCH_DIR);
923*67e74705SXin Li RECORD(ORIGINAL_FILE_ID);
924*67e74705SXin Li RECORD(INPUT_FILE_OFFSETS);
925*67e74705SXin Li
926*67e74705SXin Li BLOCK(OPTIONS_BLOCK);
927*67e74705SXin Li RECORD(LANGUAGE_OPTIONS);
928*67e74705SXin Li RECORD(TARGET_OPTIONS);
929*67e74705SXin Li RECORD(DIAGNOSTIC_OPTIONS);
930*67e74705SXin Li RECORD(FILE_SYSTEM_OPTIONS);
931*67e74705SXin Li RECORD(HEADER_SEARCH_OPTIONS);
932*67e74705SXin Li RECORD(PREPROCESSOR_OPTIONS);
933*67e74705SXin Li
934*67e74705SXin Li BLOCK(INPUT_FILES_BLOCK);
935*67e74705SXin Li RECORD(INPUT_FILE);
936*67e74705SXin Li
937*67e74705SXin Li // AST Top-Level Block.
938*67e74705SXin Li BLOCK(AST_BLOCK);
939*67e74705SXin Li RECORD(TYPE_OFFSET);
940*67e74705SXin Li RECORD(DECL_OFFSET);
941*67e74705SXin Li RECORD(IDENTIFIER_OFFSET);
942*67e74705SXin Li RECORD(IDENTIFIER_TABLE);
943*67e74705SXin Li RECORD(EAGERLY_DESERIALIZED_DECLS);
944*67e74705SXin Li RECORD(SPECIAL_TYPES);
945*67e74705SXin Li RECORD(STATISTICS);
946*67e74705SXin Li RECORD(TENTATIVE_DEFINITIONS);
947*67e74705SXin Li RECORD(SELECTOR_OFFSETS);
948*67e74705SXin Li RECORD(METHOD_POOL);
949*67e74705SXin Li RECORD(PP_COUNTER_VALUE);
950*67e74705SXin Li RECORD(SOURCE_LOCATION_OFFSETS);
951*67e74705SXin Li RECORD(SOURCE_LOCATION_PRELOADS);
952*67e74705SXin Li RECORD(EXT_VECTOR_DECLS);
953*67e74705SXin Li RECORD(UNUSED_FILESCOPED_DECLS);
954*67e74705SXin Li RECORD(PPD_ENTITIES_OFFSETS);
955*67e74705SXin Li RECORD(VTABLE_USES);
956*67e74705SXin Li RECORD(REFERENCED_SELECTOR_POOL);
957*67e74705SXin Li RECORD(TU_UPDATE_LEXICAL);
958*67e74705SXin Li RECORD(SEMA_DECL_REFS);
959*67e74705SXin Li RECORD(WEAK_UNDECLARED_IDENTIFIERS);
960*67e74705SXin Li RECORD(PENDING_IMPLICIT_INSTANTIATIONS);
961*67e74705SXin Li RECORD(UPDATE_VISIBLE);
962*67e74705SXin Li RECORD(DECL_UPDATE_OFFSETS);
963*67e74705SXin Li RECORD(DECL_UPDATES);
964*67e74705SXin Li RECORD(DIAG_PRAGMA_MAPPINGS);
965*67e74705SXin Li RECORD(CUDA_SPECIAL_DECL_REFS);
966*67e74705SXin Li RECORD(HEADER_SEARCH_TABLE);
967*67e74705SXin Li RECORD(FP_PRAGMA_OPTIONS);
968*67e74705SXin Li RECORD(OPENCL_EXTENSIONS);
969*67e74705SXin Li RECORD(DELEGATING_CTORS);
970*67e74705SXin Li RECORD(KNOWN_NAMESPACES);
971*67e74705SXin Li RECORD(MODULE_OFFSET_MAP);
972*67e74705SXin Li RECORD(SOURCE_MANAGER_LINE_TABLE);
973*67e74705SXin Li RECORD(OBJC_CATEGORIES_MAP);
974*67e74705SXin Li RECORD(FILE_SORTED_DECLS);
975*67e74705SXin Li RECORD(IMPORTED_MODULES);
976*67e74705SXin Li RECORD(OBJC_CATEGORIES);
977*67e74705SXin Li RECORD(MACRO_OFFSET);
978*67e74705SXin Li RECORD(INTERESTING_IDENTIFIERS);
979*67e74705SXin Li RECORD(UNDEFINED_BUT_USED);
980*67e74705SXin Li RECORD(LATE_PARSED_TEMPLATE);
981*67e74705SXin Li RECORD(OPTIMIZE_PRAGMA_OPTIONS);
982*67e74705SXin Li RECORD(MSSTRUCT_PRAGMA_OPTIONS);
983*67e74705SXin Li RECORD(POINTERS_TO_MEMBERS_PRAGMA_OPTIONS);
984*67e74705SXin Li RECORD(UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES);
985*67e74705SXin Li RECORD(DELETE_EXPRS_TO_ANALYZE);
986*67e74705SXin Li
987*67e74705SXin Li // SourceManager Block.
988*67e74705SXin Li BLOCK(SOURCE_MANAGER_BLOCK);
989*67e74705SXin Li RECORD(SM_SLOC_FILE_ENTRY);
990*67e74705SXin Li RECORD(SM_SLOC_BUFFER_ENTRY);
991*67e74705SXin Li RECORD(SM_SLOC_BUFFER_BLOB);
992*67e74705SXin Li RECORD(SM_SLOC_BUFFER_BLOB_COMPRESSED);
993*67e74705SXin Li RECORD(SM_SLOC_EXPANSION_ENTRY);
994*67e74705SXin Li
995*67e74705SXin Li // Preprocessor Block.
996*67e74705SXin Li BLOCK(PREPROCESSOR_BLOCK);
997*67e74705SXin Li RECORD(PP_MACRO_DIRECTIVE_HISTORY);
998*67e74705SXin Li RECORD(PP_MACRO_FUNCTION_LIKE);
999*67e74705SXin Li RECORD(PP_MACRO_OBJECT_LIKE);
1000*67e74705SXin Li RECORD(PP_MODULE_MACRO);
1001*67e74705SXin Li RECORD(PP_TOKEN);
1002*67e74705SXin Li
1003*67e74705SXin Li // Submodule Block.
1004*67e74705SXin Li BLOCK(SUBMODULE_BLOCK);
1005*67e74705SXin Li RECORD(SUBMODULE_METADATA);
1006*67e74705SXin Li RECORD(SUBMODULE_DEFINITION);
1007*67e74705SXin Li RECORD(SUBMODULE_UMBRELLA_HEADER);
1008*67e74705SXin Li RECORD(SUBMODULE_HEADER);
1009*67e74705SXin Li RECORD(SUBMODULE_TOPHEADER);
1010*67e74705SXin Li RECORD(SUBMODULE_UMBRELLA_DIR);
1011*67e74705SXin Li RECORD(SUBMODULE_IMPORTS);
1012*67e74705SXin Li RECORD(SUBMODULE_EXPORTS);
1013*67e74705SXin Li RECORD(SUBMODULE_REQUIRES);
1014*67e74705SXin Li RECORD(SUBMODULE_EXCLUDED_HEADER);
1015*67e74705SXin Li RECORD(SUBMODULE_LINK_LIBRARY);
1016*67e74705SXin Li RECORD(SUBMODULE_CONFIG_MACRO);
1017*67e74705SXin Li RECORD(SUBMODULE_CONFLICT);
1018*67e74705SXin Li RECORD(SUBMODULE_PRIVATE_HEADER);
1019*67e74705SXin Li RECORD(SUBMODULE_TEXTUAL_HEADER);
1020*67e74705SXin Li RECORD(SUBMODULE_PRIVATE_TEXTUAL_HEADER);
1021*67e74705SXin Li
1022*67e74705SXin Li // Comments Block.
1023*67e74705SXin Li BLOCK(COMMENTS_BLOCK);
1024*67e74705SXin Li RECORD(COMMENTS_RAW_COMMENT);
1025*67e74705SXin Li
1026*67e74705SXin Li // Decls and Types block.
1027*67e74705SXin Li BLOCK(DECLTYPES_BLOCK);
1028*67e74705SXin Li RECORD(TYPE_EXT_QUAL);
1029*67e74705SXin Li RECORD(TYPE_COMPLEX);
1030*67e74705SXin Li RECORD(TYPE_POINTER);
1031*67e74705SXin Li RECORD(TYPE_BLOCK_POINTER);
1032*67e74705SXin Li RECORD(TYPE_LVALUE_REFERENCE);
1033*67e74705SXin Li RECORD(TYPE_RVALUE_REFERENCE);
1034*67e74705SXin Li RECORD(TYPE_MEMBER_POINTER);
1035*67e74705SXin Li RECORD(TYPE_CONSTANT_ARRAY);
1036*67e74705SXin Li RECORD(TYPE_INCOMPLETE_ARRAY);
1037*67e74705SXin Li RECORD(TYPE_VARIABLE_ARRAY);
1038*67e74705SXin Li RECORD(TYPE_VECTOR);
1039*67e74705SXin Li RECORD(TYPE_EXT_VECTOR);
1040*67e74705SXin Li RECORD(TYPE_FUNCTION_NO_PROTO);
1041*67e74705SXin Li RECORD(TYPE_FUNCTION_PROTO);
1042*67e74705SXin Li RECORD(TYPE_TYPEDEF);
1043*67e74705SXin Li RECORD(TYPE_TYPEOF_EXPR);
1044*67e74705SXin Li RECORD(TYPE_TYPEOF);
1045*67e74705SXin Li RECORD(TYPE_RECORD);
1046*67e74705SXin Li RECORD(TYPE_ENUM);
1047*67e74705SXin Li RECORD(TYPE_OBJC_INTERFACE);
1048*67e74705SXin Li RECORD(TYPE_OBJC_OBJECT_POINTER);
1049*67e74705SXin Li RECORD(TYPE_DECLTYPE);
1050*67e74705SXin Li RECORD(TYPE_ELABORATED);
1051*67e74705SXin Li RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM);
1052*67e74705SXin Li RECORD(TYPE_UNRESOLVED_USING);
1053*67e74705SXin Li RECORD(TYPE_INJECTED_CLASS_NAME);
1054*67e74705SXin Li RECORD(TYPE_OBJC_OBJECT);
1055*67e74705SXin Li RECORD(TYPE_TEMPLATE_TYPE_PARM);
1056*67e74705SXin Li RECORD(TYPE_TEMPLATE_SPECIALIZATION);
1057*67e74705SXin Li RECORD(TYPE_DEPENDENT_NAME);
1058*67e74705SXin Li RECORD(TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION);
1059*67e74705SXin Li RECORD(TYPE_DEPENDENT_SIZED_ARRAY);
1060*67e74705SXin Li RECORD(TYPE_PAREN);
1061*67e74705SXin Li RECORD(TYPE_PACK_EXPANSION);
1062*67e74705SXin Li RECORD(TYPE_ATTRIBUTED);
1063*67e74705SXin Li RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);
1064*67e74705SXin Li RECORD(TYPE_AUTO);
1065*67e74705SXin Li RECORD(TYPE_UNARY_TRANSFORM);
1066*67e74705SXin Li RECORD(TYPE_ATOMIC);
1067*67e74705SXin Li RECORD(TYPE_DECAYED);
1068*67e74705SXin Li RECORD(TYPE_ADJUSTED);
1069*67e74705SXin Li RECORD(LOCAL_REDECLARATIONS);
1070*67e74705SXin Li RECORD(DECL_TYPEDEF);
1071*67e74705SXin Li RECORD(DECL_TYPEALIAS);
1072*67e74705SXin Li RECORD(DECL_ENUM);
1073*67e74705SXin Li RECORD(DECL_RECORD);
1074*67e74705SXin Li RECORD(DECL_ENUM_CONSTANT);
1075*67e74705SXin Li RECORD(DECL_FUNCTION);
1076*67e74705SXin Li RECORD(DECL_OBJC_METHOD);
1077*67e74705SXin Li RECORD(DECL_OBJC_INTERFACE);
1078*67e74705SXin Li RECORD(DECL_OBJC_PROTOCOL);
1079*67e74705SXin Li RECORD(DECL_OBJC_IVAR);
1080*67e74705SXin Li RECORD(DECL_OBJC_AT_DEFS_FIELD);
1081*67e74705SXin Li RECORD(DECL_OBJC_CATEGORY);
1082*67e74705SXin Li RECORD(DECL_OBJC_CATEGORY_IMPL);
1083*67e74705SXin Li RECORD(DECL_OBJC_IMPLEMENTATION);
1084*67e74705SXin Li RECORD(DECL_OBJC_COMPATIBLE_ALIAS);
1085*67e74705SXin Li RECORD(DECL_OBJC_PROPERTY);
1086*67e74705SXin Li RECORD(DECL_OBJC_PROPERTY_IMPL);
1087*67e74705SXin Li RECORD(DECL_FIELD);
1088*67e74705SXin Li RECORD(DECL_MS_PROPERTY);
1089*67e74705SXin Li RECORD(DECL_VAR);
1090*67e74705SXin Li RECORD(DECL_IMPLICIT_PARAM);
1091*67e74705SXin Li RECORD(DECL_PARM_VAR);
1092*67e74705SXin Li RECORD(DECL_FILE_SCOPE_ASM);
1093*67e74705SXin Li RECORD(DECL_BLOCK);
1094*67e74705SXin Li RECORD(DECL_CONTEXT_LEXICAL);
1095*67e74705SXin Li RECORD(DECL_CONTEXT_VISIBLE);
1096*67e74705SXin Li RECORD(DECL_NAMESPACE);
1097*67e74705SXin Li RECORD(DECL_NAMESPACE_ALIAS);
1098*67e74705SXin Li RECORD(DECL_USING);
1099*67e74705SXin Li RECORD(DECL_USING_SHADOW);
1100*67e74705SXin Li RECORD(DECL_USING_DIRECTIVE);
1101*67e74705SXin Li RECORD(DECL_UNRESOLVED_USING_VALUE);
1102*67e74705SXin Li RECORD(DECL_UNRESOLVED_USING_TYPENAME);
1103*67e74705SXin Li RECORD(DECL_LINKAGE_SPEC);
1104*67e74705SXin Li RECORD(DECL_CXX_RECORD);
1105*67e74705SXin Li RECORD(DECL_CXX_METHOD);
1106*67e74705SXin Li RECORD(DECL_CXX_CONSTRUCTOR);
1107*67e74705SXin Li RECORD(DECL_CXX_INHERITED_CONSTRUCTOR);
1108*67e74705SXin Li RECORD(DECL_CXX_DESTRUCTOR);
1109*67e74705SXin Li RECORD(DECL_CXX_CONVERSION);
1110*67e74705SXin Li RECORD(DECL_ACCESS_SPEC);
1111*67e74705SXin Li RECORD(DECL_FRIEND);
1112*67e74705SXin Li RECORD(DECL_FRIEND_TEMPLATE);
1113*67e74705SXin Li RECORD(DECL_CLASS_TEMPLATE);
1114*67e74705SXin Li RECORD(DECL_CLASS_TEMPLATE_SPECIALIZATION);
1115*67e74705SXin Li RECORD(DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION);
1116*67e74705SXin Li RECORD(DECL_VAR_TEMPLATE);
1117*67e74705SXin Li RECORD(DECL_VAR_TEMPLATE_SPECIALIZATION);
1118*67e74705SXin Li RECORD(DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION);
1119*67e74705SXin Li RECORD(DECL_FUNCTION_TEMPLATE);
1120*67e74705SXin Li RECORD(DECL_TEMPLATE_TYPE_PARM);
1121*67e74705SXin Li RECORD(DECL_NON_TYPE_TEMPLATE_PARM);
1122*67e74705SXin Li RECORD(DECL_TEMPLATE_TEMPLATE_PARM);
1123*67e74705SXin Li RECORD(DECL_TYPE_ALIAS_TEMPLATE);
1124*67e74705SXin Li RECORD(DECL_STATIC_ASSERT);
1125*67e74705SXin Li RECORD(DECL_CXX_BASE_SPECIFIERS);
1126*67e74705SXin Li RECORD(DECL_CXX_CTOR_INITIALIZERS);
1127*67e74705SXin Li RECORD(DECL_INDIRECTFIELD);
1128*67e74705SXin Li RECORD(DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK);
1129*67e74705SXin Li RECORD(DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK);
1130*67e74705SXin Li RECORD(DECL_CLASS_SCOPE_FUNCTION_SPECIALIZATION);
1131*67e74705SXin Li RECORD(DECL_IMPORT);
1132*67e74705SXin Li RECORD(DECL_OMP_THREADPRIVATE);
1133*67e74705SXin Li RECORD(DECL_EMPTY);
1134*67e74705SXin Li RECORD(DECL_OBJC_TYPE_PARAM);
1135*67e74705SXin Li RECORD(DECL_OMP_CAPTUREDEXPR);
1136*67e74705SXin Li RECORD(DECL_PRAGMA_COMMENT);
1137*67e74705SXin Li RECORD(DECL_PRAGMA_DETECT_MISMATCH);
1138*67e74705SXin Li RECORD(DECL_OMP_DECLARE_REDUCTION);
1139*67e74705SXin Li
1140*67e74705SXin Li // Statements and Exprs can occur in the Decls and Types block.
1141*67e74705SXin Li AddStmtsExprs(Stream, Record);
1142*67e74705SXin Li
1143*67e74705SXin Li BLOCK(PREPROCESSOR_DETAIL_BLOCK);
1144*67e74705SXin Li RECORD(PPD_MACRO_EXPANSION);
1145*67e74705SXin Li RECORD(PPD_MACRO_DEFINITION);
1146*67e74705SXin Li RECORD(PPD_INCLUSION_DIRECTIVE);
1147*67e74705SXin Li
1148*67e74705SXin Li // Decls and Types block.
1149*67e74705SXin Li BLOCK(EXTENSION_BLOCK);
1150*67e74705SXin Li RECORD(EXTENSION_METADATA);
1151*67e74705SXin Li
1152*67e74705SXin Li #undef RECORD
1153*67e74705SXin Li #undef BLOCK
1154*67e74705SXin Li Stream.ExitBlock();
1155*67e74705SXin Li }
1156*67e74705SXin Li
1157*67e74705SXin Li /// \brief Prepares a path for being written to an AST file by converting it
1158*67e74705SXin Li /// to an absolute path and removing nested './'s.
1159*67e74705SXin Li ///
1160*67e74705SXin Li /// \return \c true if the path was changed.
cleanPathForOutput(FileManager & FileMgr,SmallVectorImpl<char> & Path)1161*67e74705SXin Li static bool cleanPathForOutput(FileManager &FileMgr,
1162*67e74705SXin Li SmallVectorImpl<char> &Path) {
1163*67e74705SXin Li bool Changed = FileMgr.makeAbsolutePath(Path);
1164*67e74705SXin Li return Changed | llvm::sys::path::remove_dots(Path);
1165*67e74705SXin Li }
1166*67e74705SXin Li
1167*67e74705SXin Li /// \brief Adjusts the given filename to only write out the portion of the
1168*67e74705SXin Li /// filename that is not part of the system root directory.
1169*67e74705SXin Li ///
1170*67e74705SXin Li /// \param Filename the file name to adjust.
1171*67e74705SXin Li ///
1172*67e74705SXin Li /// \param BaseDir When non-NULL, the PCH file is a relocatable AST file and
1173*67e74705SXin Li /// the returned filename will be adjusted by this root directory.
1174*67e74705SXin Li ///
1175*67e74705SXin Li /// \returns either the original filename (if it needs no adjustment) or the
1176*67e74705SXin Li /// adjusted filename (which points into the @p Filename parameter).
1177*67e74705SXin Li static const char *
adjustFilenameForRelocatableAST(const char * Filename,StringRef BaseDir)1178*67e74705SXin Li adjustFilenameForRelocatableAST(const char *Filename, StringRef BaseDir) {
1179*67e74705SXin Li assert(Filename && "No file name to adjust?");
1180*67e74705SXin Li
1181*67e74705SXin Li if (BaseDir.empty())
1182*67e74705SXin Li return Filename;
1183*67e74705SXin Li
1184*67e74705SXin Li // Verify that the filename and the system root have the same prefix.
1185*67e74705SXin Li unsigned Pos = 0;
1186*67e74705SXin Li for (; Filename[Pos] && Pos < BaseDir.size(); ++Pos)
1187*67e74705SXin Li if (Filename[Pos] != BaseDir[Pos])
1188*67e74705SXin Li return Filename; // Prefixes don't match.
1189*67e74705SXin Li
1190*67e74705SXin Li // We hit the end of the filename before we hit the end of the system root.
1191*67e74705SXin Li if (!Filename[Pos])
1192*67e74705SXin Li return Filename;
1193*67e74705SXin Li
1194*67e74705SXin Li // If there's not a path separator at the end of the base directory nor
1195*67e74705SXin Li // immediately after it, then this isn't within the base directory.
1196*67e74705SXin Li if (!llvm::sys::path::is_separator(Filename[Pos])) {
1197*67e74705SXin Li if (!llvm::sys::path::is_separator(BaseDir.back()))
1198*67e74705SXin Li return Filename;
1199*67e74705SXin Li } else {
1200*67e74705SXin Li // If the file name has a '/' at the current position, skip over the '/'.
1201*67e74705SXin Li // We distinguish relative paths from absolute paths by the
1202*67e74705SXin Li // absence of '/' at the beginning of relative paths.
1203*67e74705SXin Li //
1204*67e74705SXin Li // FIXME: This is wrong. We distinguish them by asking if the path is
1205*67e74705SXin Li // absolute, which isn't the same thing. And there might be multiple '/'s
1206*67e74705SXin Li // in a row. Use a better mechanism to indicate whether we have emitted an
1207*67e74705SXin Li // absolute or relative path.
1208*67e74705SXin Li ++Pos;
1209*67e74705SXin Li }
1210*67e74705SXin Li
1211*67e74705SXin Li return Filename + Pos;
1212*67e74705SXin Li }
1213*67e74705SXin Li
getSignature()1214*67e74705SXin Li static ASTFileSignature getSignature() {
1215*67e74705SXin Li while (1) {
1216*67e74705SXin Li if (ASTFileSignature S = llvm::sys::Process::GetRandomNumber())
1217*67e74705SXin Li return S;
1218*67e74705SXin Li // Rely on GetRandomNumber to eventually return non-zero...
1219*67e74705SXin Li }
1220*67e74705SXin Li }
1221*67e74705SXin Li
1222*67e74705SXin Li /// \brief Write the control block.
WriteControlBlock(Preprocessor & PP,ASTContext & Context,StringRef isysroot,const std::string & OutputFile)1223*67e74705SXin Li uint64_t ASTWriter::WriteControlBlock(Preprocessor &PP,
1224*67e74705SXin Li ASTContext &Context,
1225*67e74705SXin Li StringRef isysroot,
1226*67e74705SXin Li const std::string &OutputFile) {
1227*67e74705SXin Li ASTFileSignature Signature = 0;
1228*67e74705SXin Li
1229*67e74705SXin Li using namespace llvm;
1230*67e74705SXin Li Stream.EnterSubblock(CONTROL_BLOCK_ID, 5);
1231*67e74705SXin Li RecordData Record;
1232*67e74705SXin Li
1233*67e74705SXin Li // Metadata
1234*67e74705SXin Li auto *MetadataAbbrev = new BitCodeAbbrev();
1235*67e74705SXin Li MetadataAbbrev->Add(BitCodeAbbrevOp(METADATA));
1236*67e74705SXin Li MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Major
1237*67e74705SXin Li MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Minor
1238*67e74705SXin Li MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Clang maj.
1239*67e74705SXin Li MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Clang min.
1240*67e74705SXin Li MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Relocatable
1241*67e74705SXin Li MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Timestamps
1242*67e74705SXin Li MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Errors
1243*67e74705SXin Li MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // SVN branch/tag
1244*67e74705SXin Li unsigned MetadataAbbrevCode = Stream.EmitAbbrev(MetadataAbbrev);
1245*67e74705SXin Li assert((!WritingModule || isysroot.empty()) &&
1246*67e74705SXin Li "writing module as a relocatable PCH?");
1247*67e74705SXin Li {
1248*67e74705SXin Li RecordData::value_type Record[] = {METADATA, VERSION_MAJOR, VERSION_MINOR,
1249*67e74705SXin Li CLANG_VERSION_MAJOR, CLANG_VERSION_MINOR,
1250*67e74705SXin Li !isysroot.empty(), IncludeTimestamps,
1251*67e74705SXin Li ASTHasCompilerErrors};
1252*67e74705SXin Li Stream.EmitRecordWithBlob(MetadataAbbrevCode, Record,
1253*67e74705SXin Li getClangFullRepositoryVersion());
1254*67e74705SXin Li }
1255*67e74705SXin Li if (WritingModule) {
1256*67e74705SXin Li // For implicit modules we output a signature that we can use to ensure
1257*67e74705SXin Li // duplicate module builds don't collide in the cache as their output order
1258*67e74705SXin Li // is non-deterministic.
1259*67e74705SXin Li // FIXME: Remove this when output is deterministic.
1260*67e74705SXin Li if (Context.getLangOpts().ImplicitModules) {
1261*67e74705SXin Li Signature = getSignature();
1262*67e74705SXin Li RecordData::value_type Record[] = {Signature};
1263*67e74705SXin Li Stream.EmitRecord(SIGNATURE, Record);
1264*67e74705SXin Li }
1265*67e74705SXin Li
1266*67e74705SXin Li // Module name
1267*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
1268*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(MODULE_NAME));
1269*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
1270*67e74705SXin Li unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);
1271*67e74705SXin Li RecordData::value_type Record[] = {MODULE_NAME};
1272*67e74705SXin Li Stream.EmitRecordWithBlob(AbbrevCode, Record, WritingModule->Name);
1273*67e74705SXin Li }
1274*67e74705SXin Li
1275*67e74705SXin Li if (WritingModule && WritingModule->Directory) {
1276*67e74705SXin Li SmallString<128> BaseDir(WritingModule->Directory->getName());
1277*67e74705SXin Li cleanPathForOutput(Context.getSourceManager().getFileManager(), BaseDir);
1278*67e74705SXin Li
1279*67e74705SXin Li // If the home of the module is the current working directory, then we
1280*67e74705SXin Li // want to pick up the cwd of the build process loading the module, not
1281*67e74705SXin Li // our cwd, when we load this module.
1282*67e74705SXin Li if (!PP.getHeaderSearchInfo()
1283*67e74705SXin Li .getHeaderSearchOpts()
1284*67e74705SXin Li .ModuleMapFileHomeIsCwd ||
1285*67e74705SXin Li WritingModule->Directory->getName() != StringRef(".")) {
1286*67e74705SXin Li // Module directory.
1287*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
1288*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(MODULE_DIRECTORY));
1289*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Directory
1290*67e74705SXin Li unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);
1291*67e74705SXin Li
1292*67e74705SXin Li RecordData::value_type Record[] = {MODULE_DIRECTORY};
1293*67e74705SXin Li Stream.EmitRecordWithBlob(AbbrevCode, Record, BaseDir);
1294*67e74705SXin Li }
1295*67e74705SXin Li
1296*67e74705SXin Li // Write out all other paths relative to the base directory if possible.
1297*67e74705SXin Li BaseDirectory.assign(BaseDir.begin(), BaseDir.end());
1298*67e74705SXin Li } else if (!isysroot.empty()) {
1299*67e74705SXin Li // Write out paths relative to the sysroot if possible.
1300*67e74705SXin Li BaseDirectory = isysroot;
1301*67e74705SXin Li }
1302*67e74705SXin Li
1303*67e74705SXin Li // Module map file
1304*67e74705SXin Li if (WritingModule) {
1305*67e74705SXin Li Record.clear();
1306*67e74705SXin Li
1307*67e74705SXin Li auto &Map = PP.getHeaderSearchInfo().getModuleMap();
1308*67e74705SXin Li
1309*67e74705SXin Li // Primary module map file.
1310*67e74705SXin Li AddPath(Map.getModuleMapFileForUniquing(WritingModule)->getName(), Record);
1311*67e74705SXin Li
1312*67e74705SXin Li // Additional module map files.
1313*67e74705SXin Li if (auto *AdditionalModMaps =
1314*67e74705SXin Li Map.getAdditionalModuleMapFiles(WritingModule)) {
1315*67e74705SXin Li Record.push_back(AdditionalModMaps->size());
1316*67e74705SXin Li for (const FileEntry *F : *AdditionalModMaps)
1317*67e74705SXin Li AddPath(F->getName(), Record);
1318*67e74705SXin Li } else {
1319*67e74705SXin Li Record.push_back(0);
1320*67e74705SXin Li }
1321*67e74705SXin Li
1322*67e74705SXin Li Stream.EmitRecord(MODULE_MAP_FILE, Record);
1323*67e74705SXin Li }
1324*67e74705SXin Li
1325*67e74705SXin Li // Imports
1326*67e74705SXin Li if (Chain) {
1327*67e74705SXin Li serialization::ModuleManager &Mgr = Chain->getModuleManager();
1328*67e74705SXin Li Record.clear();
1329*67e74705SXin Li
1330*67e74705SXin Li for (auto *M : Mgr) {
1331*67e74705SXin Li // Skip modules that weren't directly imported.
1332*67e74705SXin Li if (!M->isDirectlyImported())
1333*67e74705SXin Li continue;
1334*67e74705SXin Li
1335*67e74705SXin Li Record.push_back((unsigned)M->Kind); // FIXME: Stable encoding
1336*67e74705SXin Li AddSourceLocation(M->ImportLoc, Record);
1337*67e74705SXin Li Record.push_back(M->File->getSize());
1338*67e74705SXin Li Record.push_back(getTimestampForOutput(M->File));
1339*67e74705SXin Li Record.push_back(M->Signature);
1340*67e74705SXin Li AddPath(M->FileName, Record);
1341*67e74705SXin Li }
1342*67e74705SXin Li Stream.EmitRecord(IMPORTS, Record);
1343*67e74705SXin Li }
1344*67e74705SXin Li
1345*67e74705SXin Li // Write the options block.
1346*67e74705SXin Li Stream.EnterSubblock(OPTIONS_BLOCK_ID, 4);
1347*67e74705SXin Li
1348*67e74705SXin Li // Language options.
1349*67e74705SXin Li Record.clear();
1350*67e74705SXin Li const LangOptions &LangOpts = Context.getLangOpts();
1351*67e74705SXin Li #define LANGOPT(Name, Bits, Default, Description) \
1352*67e74705SXin Li Record.push_back(LangOpts.Name);
1353*67e74705SXin Li #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
1354*67e74705SXin Li Record.push_back(static_cast<unsigned>(LangOpts.get##Name()));
1355*67e74705SXin Li #include "clang/Basic/LangOptions.def"
1356*67e74705SXin Li #define SANITIZER(NAME, ID) \
1357*67e74705SXin Li Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID));
1358*67e74705SXin Li #include "clang/Basic/Sanitizers.def"
1359*67e74705SXin Li
1360*67e74705SXin Li Record.push_back(LangOpts.ModuleFeatures.size());
1361*67e74705SXin Li for (StringRef Feature : LangOpts.ModuleFeatures)
1362*67e74705SXin Li AddString(Feature, Record);
1363*67e74705SXin Li
1364*67e74705SXin Li Record.push_back((unsigned) LangOpts.ObjCRuntime.getKind());
1365*67e74705SXin Li AddVersionTuple(LangOpts.ObjCRuntime.getVersion(), Record);
1366*67e74705SXin Li
1367*67e74705SXin Li AddString(LangOpts.CurrentModule, Record);
1368*67e74705SXin Li
1369*67e74705SXin Li // Comment options.
1370*67e74705SXin Li Record.push_back(LangOpts.CommentOpts.BlockCommandNames.size());
1371*67e74705SXin Li for (const auto &I : LangOpts.CommentOpts.BlockCommandNames) {
1372*67e74705SXin Li AddString(I, Record);
1373*67e74705SXin Li }
1374*67e74705SXin Li Record.push_back(LangOpts.CommentOpts.ParseAllComments);
1375*67e74705SXin Li
1376*67e74705SXin Li // OpenMP offloading options.
1377*67e74705SXin Li Record.push_back(LangOpts.OMPTargetTriples.size());
1378*67e74705SXin Li for (auto &T : LangOpts.OMPTargetTriples)
1379*67e74705SXin Li AddString(T.getTriple(), Record);
1380*67e74705SXin Li
1381*67e74705SXin Li AddString(LangOpts.OMPHostIRFile, Record);
1382*67e74705SXin Li
1383*67e74705SXin Li Stream.EmitRecord(LANGUAGE_OPTIONS, Record);
1384*67e74705SXin Li
1385*67e74705SXin Li // Target options.
1386*67e74705SXin Li Record.clear();
1387*67e74705SXin Li const TargetInfo &Target = Context.getTargetInfo();
1388*67e74705SXin Li const TargetOptions &TargetOpts = Target.getTargetOpts();
1389*67e74705SXin Li AddString(TargetOpts.Triple, Record);
1390*67e74705SXin Li AddString(TargetOpts.CPU, Record);
1391*67e74705SXin Li AddString(TargetOpts.ABI, Record);
1392*67e74705SXin Li Record.push_back(TargetOpts.FeaturesAsWritten.size());
1393*67e74705SXin Li for (unsigned I = 0, N = TargetOpts.FeaturesAsWritten.size(); I != N; ++I) {
1394*67e74705SXin Li AddString(TargetOpts.FeaturesAsWritten[I], Record);
1395*67e74705SXin Li }
1396*67e74705SXin Li Record.push_back(TargetOpts.Features.size());
1397*67e74705SXin Li for (unsigned I = 0, N = TargetOpts.Features.size(); I != N; ++I) {
1398*67e74705SXin Li AddString(TargetOpts.Features[I], Record);
1399*67e74705SXin Li }
1400*67e74705SXin Li Stream.EmitRecord(TARGET_OPTIONS, Record);
1401*67e74705SXin Li
1402*67e74705SXin Li // Diagnostic options.
1403*67e74705SXin Li Record.clear();
1404*67e74705SXin Li const DiagnosticOptions &DiagOpts
1405*67e74705SXin Li = Context.getDiagnostics().getDiagnosticOptions();
1406*67e74705SXin Li #define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name);
1407*67e74705SXin Li #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
1408*67e74705SXin Li Record.push_back(static_cast<unsigned>(DiagOpts.get##Name()));
1409*67e74705SXin Li #include "clang/Basic/DiagnosticOptions.def"
1410*67e74705SXin Li Record.push_back(DiagOpts.Warnings.size());
1411*67e74705SXin Li for (unsigned I = 0, N = DiagOpts.Warnings.size(); I != N; ++I)
1412*67e74705SXin Li AddString(DiagOpts.Warnings[I], Record);
1413*67e74705SXin Li Record.push_back(DiagOpts.Remarks.size());
1414*67e74705SXin Li for (unsigned I = 0, N = DiagOpts.Remarks.size(); I != N; ++I)
1415*67e74705SXin Li AddString(DiagOpts.Remarks[I], Record);
1416*67e74705SXin Li // Note: we don't serialize the log or serialization file names, because they
1417*67e74705SXin Li // are generally transient files and will almost always be overridden.
1418*67e74705SXin Li Stream.EmitRecord(DIAGNOSTIC_OPTIONS, Record);
1419*67e74705SXin Li
1420*67e74705SXin Li // File system options.
1421*67e74705SXin Li Record.clear();
1422*67e74705SXin Li const FileSystemOptions &FSOpts =
1423*67e74705SXin Li Context.getSourceManager().getFileManager().getFileSystemOpts();
1424*67e74705SXin Li AddString(FSOpts.WorkingDir, Record);
1425*67e74705SXin Li Stream.EmitRecord(FILE_SYSTEM_OPTIONS, Record);
1426*67e74705SXin Li
1427*67e74705SXin Li // Header search options.
1428*67e74705SXin Li Record.clear();
1429*67e74705SXin Li const HeaderSearchOptions &HSOpts
1430*67e74705SXin Li = PP.getHeaderSearchInfo().getHeaderSearchOpts();
1431*67e74705SXin Li AddString(HSOpts.Sysroot, Record);
1432*67e74705SXin Li
1433*67e74705SXin Li // Include entries.
1434*67e74705SXin Li Record.push_back(HSOpts.UserEntries.size());
1435*67e74705SXin Li for (unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {
1436*67e74705SXin Li const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I];
1437*67e74705SXin Li AddString(Entry.Path, Record);
1438*67e74705SXin Li Record.push_back(static_cast<unsigned>(Entry.Group));
1439*67e74705SXin Li Record.push_back(Entry.IsFramework);
1440*67e74705SXin Li Record.push_back(Entry.IgnoreSysRoot);
1441*67e74705SXin Li }
1442*67e74705SXin Li
1443*67e74705SXin Li // System header prefixes.
1444*67e74705SXin Li Record.push_back(HSOpts.SystemHeaderPrefixes.size());
1445*67e74705SXin Li for (unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {
1446*67e74705SXin Li AddString(HSOpts.SystemHeaderPrefixes[I].Prefix, Record);
1447*67e74705SXin Li Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);
1448*67e74705SXin Li }
1449*67e74705SXin Li
1450*67e74705SXin Li AddString(HSOpts.ResourceDir, Record);
1451*67e74705SXin Li AddString(HSOpts.ModuleCachePath, Record);
1452*67e74705SXin Li AddString(HSOpts.ModuleUserBuildPath, Record);
1453*67e74705SXin Li Record.push_back(HSOpts.DisableModuleHash);
1454*67e74705SXin Li Record.push_back(HSOpts.UseBuiltinIncludes);
1455*67e74705SXin Li Record.push_back(HSOpts.UseStandardSystemIncludes);
1456*67e74705SXin Li Record.push_back(HSOpts.UseStandardCXXIncludes);
1457*67e74705SXin Li Record.push_back(HSOpts.UseLibcxx);
1458*67e74705SXin Li // Write out the specific module cache path that contains the module files.
1459*67e74705SXin Li AddString(PP.getHeaderSearchInfo().getModuleCachePath(), Record);
1460*67e74705SXin Li Stream.EmitRecord(HEADER_SEARCH_OPTIONS, Record);
1461*67e74705SXin Li
1462*67e74705SXin Li // Preprocessor options.
1463*67e74705SXin Li Record.clear();
1464*67e74705SXin Li const PreprocessorOptions &PPOpts = PP.getPreprocessorOpts();
1465*67e74705SXin Li
1466*67e74705SXin Li // Macro definitions.
1467*67e74705SXin Li Record.push_back(PPOpts.Macros.size());
1468*67e74705SXin Li for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
1469*67e74705SXin Li AddString(PPOpts.Macros[I].first, Record);
1470*67e74705SXin Li Record.push_back(PPOpts.Macros[I].second);
1471*67e74705SXin Li }
1472*67e74705SXin Li
1473*67e74705SXin Li // Includes
1474*67e74705SXin Li Record.push_back(PPOpts.Includes.size());
1475*67e74705SXin Li for (unsigned I = 0, N = PPOpts.Includes.size(); I != N; ++I)
1476*67e74705SXin Li AddString(PPOpts.Includes[I], Record);
1477*67e74705SXin Li
1478*67e74705SXin Li // Macro includes
1479*67e74705SXin Li Record.push_back(PPOpts.MacroIncludes.size());
1480*67e74705SXin Li for (unsigned I = 0, N = PPOpts.MacroIncludes.size(); I != N; ++I)
1481*67e74705SXin Li AddString(PPOpts.MacroIncludes[I], Record);
1482*67e74705SXin Li
1483*67e74705SXin Li Record.push_back(PPOpts.UsePredefines);
1484*67e74705SXin Li // Detailed record is important since it is used for the module cache hash.
1485*67e74705SXin Li Record.push_back(PPOpts.DetailedRecord);
1486*67e74705SXin Li AddString(PPOpts.ImplicitPCHInclude, Record);
1487*67e74705SXin Li AddString(PPOpts.ImplicitPTHInclude, Record);
1488*67e74705SXin Li Record.push_back(static_cast<unsigned>(PPOpts.ObjCXXARCStandardLibrary));
1489*67e74705SXin Li Stream.EmitRecord(PREPROCESSOR_OPTIONS, Record);
1490*67e74705SXin Li
1491*67e74705SXin Li // Leave the options block.
1492*67e74705SXin Li Stream.ExitBlock();
1493*67e74705SXin Li
1494*67e74705SXin Li // Original file name and file ID
1495*67e74705SXin Li SourceManager &SM = Context.getSourceManager();
1496*67e74705SXin Li if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
1497*67e74705SXin Li auto *FileAbbrev = new BitCodeAbbrev();
1498*67e74705SXin Li FileAbbrev->Add(BitCodeAbbrevOp(ORIGINAL_FILE));
1499*67e74705SXin Li FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // File ID
1500*67e74705SXin Li FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name
1501*67e74705SXin Li unsigned FileAbbrevCode = Stream.EmitAbbrev(FileAbbrev);
1502*67e74705SXin Li
1503*67e74705SXin Li Record.clear();
1504*67e74705SXin Li Record.push_back(ORIGINAL_FILE);
1505*67e74705SXin Li Record.push_back(SM.getMainFileID().getOpaqueValue());
1506*67e74705SXin Li EmitRecordWithPath(FileAbbrevCode, Record, MainFile->getName());
1507*67e74705SXin Li }
1508*67e74705SXin Li
1509*67e74705SXin Li Record.clear();
1510*67e74705SXin Li Record.push_back(SM.getMainFileID().getOpaqueValue());
1511*67e74705SXin Li Stream.EmitRecord(ORIGINAL_FILE_ID, Record);
1512*67e74705SXin Li
1513*67e74705SXin Li // Original PCH directory
1514*67e74705SXin Li if (!OutputFile.empty() && OutputFile != "-") {
1515*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
1516*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(ORIGINAL_PCH_DIR));
1517*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name
1518*67e74705SXin Li unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);
1519*67e74705SXin Li
1520*67e74705SXin Li SmallString<128> OutputPath(OutputFile);
1521*67e74705SXin Li
1522*67e74705SXin Li SM.getFileManager().makeAbsolutePath(OutputPath);
1523*67e74705SXin Li StringRef origDir = llvm::sys::path::parent_path(OutputPath);
1524*67e74705SXin Li
1525*67e74705SXin Li RecordData::value_type Record[] = {ORIGINAL_PCH_DIR};
1526*67e74705SXin Li Stream.EmitRecordWithBlob(AbbrevCode, Record, origDir);
1527*67e74705SXin Li }
1528*67e74705SXin Li
1529*67e74705SXin Li WriteInputFiles(Context.SourceMgr,
1530*67e74705SXin Li PP.getHeaderSearchInfo().getHeaderSearchOpts(),
1531*67e74705SXin Li PP.getLangOpts().Modules);
1532*67e74705SXin Li Stream.ExitBlock();
1533*67e74705SXin Li return Signature;
1534*67e74705SXin Li }
1535*67e74705SXin Li
1536*67e74705SXin Li namespace {
1537*67e74705SXin Li /// \brief An input file.
1538*67e74705SXin Li struct InputFileEntry {
1539*67e74705SXin Li const FileEntry *File;
1540*67e74705SXin Li bool IsSystemFile;
1541*67e74705SXin Li bool IsTransient;
1542*67e74705SXin Li bool BufferOverridden;
1543*67e74705SXin Li };
1544*67e74705SXin Li } // end anonymous namespace
1545*67e74705SXin Li
WriteInputFiles(SourceManager & SourceMgr,HeaderSearchOptions & HSOpts,bool Modules)1546*67e74705SXin Li void ASTWriter::WriteInputFiles(SourceManager &SourceMgr,
1547*67e74705SXin Li HeaderSearchOptions &HSOpts,
1548*67e74705SXin Li bool Modules) {
1549*67e74705SXin Li using namespace llvm;
1550*67e74705SXin Li Stream.EnterSubblock(INPUT_FILES_BLOCK_ID, 4);
1551*67e74705SXin Li
1552*67e74705SXin Li // Create input-file abbreviation.
1553*67e74705SXin Li auto *IFAbbrev = new BitCodeAbbrev();
1554*67e74705SXin Li IFAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE));
1555*67e74705SXin Li IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ID
1556*67e74705SXin Li IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12)); // Size
1557*67e74705SXin Li IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32)); // Modification time
1558*67e74705SXin Li IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Overridden
1559*67e74705SXin Li IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Transient
1560*67e74705SXin Li IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name
1561*67e74705SXin Li unsigned IFAbbrevCode = Stream.EmitAbbrev(IFAbbrev);
1562*67e74705SXin Li
1563*67e74705SXin Li // Get all ContentCache objects for files, sorted by whether the file is a
1564*67e74705SXin Li // system one or not. System files go at the back, users files at the front.
1565*67e74705SXin Li std::deque<InputFileEntry> SortedFiles;
1566*67e74705SXin Li for (unsigned I = 1, N = SourceMgr.local_sloc_entry_size(); I != N; ++I) {
1567*67e74705SXin Li // Get this source location entry.
1568*67e74705SXin Li const SrcMgr::SLocEntry *SLoc = &SourceMgr.getLocalSLocEntry(I);
1569*67e74705SXin Li assert(&SourceMgr.getSLocEntry(FileID::get(I)) == SLoc);
1570*67e74705SXin Li
1571*67e74705SXin Li // We only care about file entries that were not overridden.
1572*67e74705SXin Li if (!SLoc->isFile())
1573*67e74705SXin Li continue;
1574*67e74705SXin Li const SrcMgr::ContentCache *Cache = SLoc->getFile().getContentCache();
1575*67e74705SXin Li if (!Cache->OrigEntry)
1576*67e74705SXin Li continue;
1577*67e74705SXin Li
1578*67e74705SXin Li InputFileEntry Entry;
1579*67e74705SXin Li Entry.File = Cache->OrigEntry;
1580*67e74705SXin Li Entry.IsSystemFile = Cache->IsSystemFile;
1581*67e74705SXin Li Entry.IsTransient = Cache->IsTransient;
1582*67e74705SXin Li Entry.BufferOverridden = Cache->BufferOverridden;
1583*67e74705SXin Li if (Cache->IsSystemFile)
1584*67e74705SXin Li SortedFiles.push_back(Entry);
1585*67e74705SXin Li else
1586*67e74705SXin Li SortedFiles.push_front(Entry);
1587*67e74705SXin Li }
1588*67e74705SXin Li
1589*67e74705SXin Li unsigned UserFilesNum = 0;
1590*67e74705SXin Li // Write out all of the input files.
1591*67e74705SXin Li std::vector<uint64_t> InputFileOffsets;
1592*67e74705SXin Li for (const auto &Entry : SortedFiles) {
1593*67e74705SXin Li uint32_t &InputFileID = InputFileIDs[Entry.File];
1594*67e74705SXin Li if (InputFileID != 0)
1595*67e74705SXin Li continue; // already recorded this file.
1596*67e74705SXin Li
1597*67e74705SXin Li // Record this entry's offset.
1598*67e74705SXin Li InputFileOffsets.push_back(Stream.GetCurrentBitNo());
1599*67e74705SXin Li
1600*67e74705SXin Li InputFileID = InputFileOffsets.size();
1601*67e74705SXin Li
1602*67e74705SXin Li if (!Entry.IsSystemFile)
1603*67e74705SXin Li ++UserFilesNum;
1604*67e74705SXin Li
1605*67e74705SXin Li // Emit size/modification time for this file.
1606*67e74705SXin Li // And whether this file was overridden.
1607*67e74705SXin Li RecordData::value_type Record[] = {
1608*67e74705SXin Li INPUT_FILE,
1609*67e74705SXin Li InputFileOffsets.size(),
1610*67e74705SXin Li (uint64_t)Entry.File->getSize(),
1611*67e74705SXin Li (uint64_t)getTimestampForOutput(Entry.File),
1612*67e74705SXin Li Entry.BufferOverridden,
1613*67e74705SXin Li Entry.IsTransient};
1614*67e74705SXin Li
1615*67e74705SXin Li EmitRecordWithPath(IFAbbrevCode, Record, Entry.File->getName());
1616*67e74705SXin Li }
1617*67e74705SXin Li
1618*67e74705SXin Li Stream.ExitBlock();
1619*67e74705SXin Li
1620*67e74705SXin Li // Create input file offsets abbreviation.
1621*67e74705SXin Li auto *OffsetsAbbrev = new BitCodeAbbrev();
1622*67e74705SXin Li OffsetsAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE_OFFSETS));
1623*67e74705SXin Li OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # input files
1624*67e74705SXin Li OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # non-system
1625*67e74705SXin Li // input files
1626*67e74705SXin Li OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Array
1627*67e74705SXin Li unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(OffsetsAbbrev);
1628*67e74705SXin Li
1629*67e74705SXin Li // Write input file offsets.
1630*67e74705SXin Li RecordData::value_type Record[] = {INPUT_FILE_OFFSETS,
1631*67e74705SXin Li InputFileOffsets.size(), UserFilesNum};
1632*67e74705SXin Li Stream.EmitRecordWithBlob(OffsetsAbbrevCode, Record, bytes(InputFileOffsets));
1633*67e74705SXin Li }
1634*67e74705SXin Li
1635*67e74705SXin Li //===----------------------------------------------------------------------===//
1636*67e74705SXin Li // Source Manager Serialization
1637*67e74705SXin Li //===----------------------------------------------------------------------===//
1638*67e74705SXin Li
1639*67e74705SXin Li /// \brief Create an abbreviation for the SLocEntry that refers to a
1640*67e74705SXin Li /// file.
CreateSLocFileAbbrev(llvm::BitstreamWriter & Stream)1641*67e74705SXin Li static unsigned CreateSLocFileAbbrev(llvm::BitstreamWriter &Stream) {
1642*67e74705SXin Li using namespace llvm;
1643*67e74705SXin Li
1644*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
1645*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_FILE_ENTRY));
1646*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset
1647*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Include location
1648*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Characteristic
1649*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Line directives
1650*67e74705SXin Li // FileEntry fields.
1651*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Input File ID
1652*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // NumCreatedFIDs
1653*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24)); // FirstDeclIndex
1654*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // NumDecls
1655*67e74705SXin Li return Stream.EmitAbbrev(Abbrev);
1656*67e74705SXin Li }
1657*67e74705SXin Li
1658*67e74705SXin Li /// \brief Create an abbreviation for the SLocEntry that refers to a
1659*67e74705SXin Li /// buffer.
CreateSLocBufferAbbrev(llvm::BitstreamWriter & Stream)1660*67e74705SXin Li static unsigned CreateSLocBufferAbbrev(llvm::BitstreamWriter &Stream) {
1661*67e74705SXin Li using namespace llvm;
1662*67e74705SXin Li
1663*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
1664*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_BUFFER_ENTRY));
1665*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset
1666*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Include location
1667*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Characteristic
1668*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Line directives
1669*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Buffer name blob
1670*67e74705SXin Li return Stream.EmitAbbrev(Abbrev);
1671*67e74705SXin Li }
1672*67e74705SXin Li
1673*67e74705SXin Li /// \brief Create an abbreviation for the SLocEntry that refers to a
1674*67e74705SXin Li /// buffer's blob.
CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter & Stream,bool Compressed)1675*67e74705SXin Li static unsigned CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter &Stream,
1676*67e74705SXin Li bool Compressed) {
1677*67e74705SXin Li using namespace llvm;
1678*67e74705SXin Li
1679*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
1680*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(Compressed ? SM_SLOC_BUFFER_BLOB_COMPRESSED
1681*67e74705SXin Li : SM_SLOC_BUFFER_BLOB));
1682*67e74705SXin Li if (Compressed)
1683*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Uncompressed size
1684*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Blob
1685*67e74705SXin Li return Stream.EmitAbbrev(Abbrev);
1686*67e74705SXin Li }
1687*67e74705SXin Li
1688*67e74705SXin Li /// \brief Create an abbreviation for the SLocEntry that refers to a macro
1689*67e74705SXin Li /// expansion.
CreateSLocExpansionAbbrev(llvm::BitstreamWriter & Stream)1690*67e74705SXin Li static unsigned CreateSLocExpansionAbbrev(llvm::BitstreamWriter &Stream) {
1691*67e74705SXin Li using namespace llvm;
1692*67e74705SXin Li
1693*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
1694*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_EXPANSION_ENTRY));
1695*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset
1696*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Spelling location
1697*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Start location
1698*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // End location
1699*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Token length
1700*67e74705SXin Li return Stream.EmitAbbrev(Abbrev);
1701*67e74705SXin Li }
1702*67e74705SXin Li
1703*67e74705SXin Li namespace {
1704*67e74705SXin Li // Trait used for the on-disk hash table of header search information.
1705*67e74705SXin Li class HeaderFileInfoTrait {
1706*67e74705SXin Li ASTWriter &Writer;
1707*67e74705SXin Li const HeaderSearch &HS;
1708*67e74705SXin Li
1709*67e74705SXin Li // Keep track of the framework names we've used during serialization.
1710*67e74705SXin Li SmallVector<char, 128> FrameworkStringData;
1711*67e74705SXin Li llvm::StringMap<unsigned> FrameworkNameOffset;
1712*67e74705SXin Li
1713*67e74705SXin Li public:
HeaderFileInfoTrait(ASTWriter & Writer,const HeaderSearch & HS)1714*67e74705SXin Li HeaderFileInfoTrait(ASTWriter &Writer, const HeaderSearch &HS)
1715*67e74705SXin Li : Writer(Writer), HS(HS) { }
1716*67e74705SXin Li
1717*67e74705SXin Li struct key_type {
1718*67e74705SXin Li const FileEntry *FE;
1719*67e74705SXin Li const char *Filename;
1720*67e74705SXin Li };
1721*67e74705SXin Li typedef const key_type &key_type_ref;
1722*67e74705SXin Li
1723*67e74705SXin Li typedef HeaderFileInfo data_type;
1724*67e74705SXin Li typedef const data_type &data_type_ref;
1725*67e74705SXin Li typedef unsigned hash_value_type;
1726*67e74705SXin Li typedef unsigned offset_type;
1727*67e74705SXin Li
ComputeHash(key_type_ref key)1728*67e74705SXin Li hash_value_type ComputeHash(key_type_ref key) {
1729*67e74705SXin Li // The hash is based only on size/time of the file, so that the reader can
1730*67e74705SXin Li // match even when symlinking or excess path elements ("foo/../", "../")
1731*67e74705SXin Li // change the form of the name. However, complete path is still the key.
1732*67e74705SXin Li return llvm::hash_combine(key.FE->getSize(),
1733*67e74705SXin Li Writer.getTimestampForOutput(key.FE));
1734*67e74705SXin Li }
1735*67e74705SXin Li
1736*67e74705SXin Li std::pair<unsigned,unsigned>
EmitKeyDataLength(raw_ostream & Out,key_type_ref key,data_type_ref Data)1737*67e74705SXin Li EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref Data) {
1738*67e74705SXin Li using namespace llvm::support;
1739*67e74705SXin Li endian::Writer<little> LE(Out);
1740*67e74705SXin Li unsigned KeyLen = strlen(key.Filename) + 1 + 8 + 8;
1741*67e74705SXin Li LE.write<uint16_t>(KeyLen);
1742*67e74705SXin Li unsigned DataLen = 1 + 2 + 4 + 4;
1743*67e74705SXin Li for (auto ModInfo : HS.getModuleMap().findAllModulesForHeader(key.FE))
1744*67e74705SXin Li if (Writer.getLocalOrImportedSubmoduleID(ModInfo.getModule()))
1745*67e74705SXin Li DataLen += 4;
1746*67e74705SXin Li LE.write<uint8_t>(DataLen);
1747*67e74705SXin Li return std::make_pair(KeyLen, DataLen);
1748*67e74705SXin Li }
1749*67e74705SXin Li
EmitKey(raw_ostream & Out,key_type_ref key,unsigned KeyLen)1750*67e74705SXin Li void EmitKey(raw_ostream& Out, key_type_ref key, unsigned KeyLen) {
1751*67e74705SXin Li using namespace llvm::support;
1752*67e74705SXin Li endian::Writer<little> LE(Out);
1753*67e74705SXin Li LE.write<uint64_t>(key.FE->getSize());
1754*67e74705SXin Li KeyLen -= 8;
1755*67e74705SXin Li LE.write<uint64_t>(Writer.getTimestampForOutput(key.FE));
1756*67e74705SXin Li KeyLen -= 8;
1757*67e74705SXin Li Out.write(key.Filename, KeyLen);
1758*67e74705SXin Li }
1759*67e74705SXin Li
EmitData(raw_ostream & Out,key_type_ref key,data_type_ref Data,unsigned DataLen)1760*67e74705SXin Li void EmitData(raw_ostream &Out, key_type_ref key,
1761*67e74705SXin Li data_type_ref Data, unsigned DataLen) {
1762*67e74705SXin Li using namespace llvm::support;
1763*67e74705SXin Li endian::Writer<little> LE(Out);
1764*67e74705SXin Li uint64_t Start = Out.tell(); (void)Start;
1765*67e74705SXin Li
1766*67e74705SXin Li unsigned char Flags = (Data.isImport << 4)
1767*67e74705SXin Li | (Data.isPragmaOnce << 3)
1768*67e74705SXin Li | (Data.DirInfo << 1)
1769*67e74705SXin Li | Data.IndexHeaderMapHeader;
1770*67e74705SXin Li LE.write<uint8_t>(Flags);
1771*67e74705SXin Li LE.write<uint16_t>(Data.NumIncludes);
1772*67e74705SXin Li
1773*67e74705SXin Li if (!Data.ControllingMacro)
1774*67e74705SXin Li LE.write<uint32_t>(Data.ControllingMacroID);
1775*67e74705SXin Li else
1776*67e74705SXin Li LE.write<uint32_t>(Writer.getIdentifierRef(Data.ControllingMacro));
1777*67e74705SXin Li
1778*67e74705SXin Li unsigned Offset = 0;
1779*67e74705SXin Li if (!Data.Framework.empty()) {
1780*67e74705SXin Li // If this header refers into a framework, save the framework name.
1781*67e74705SXin Li llvm::StringMap<unsigned>::iterator Pos
1782*67e74705SXin Li = FrameworkNameOffset.find(Data.Framework);
1783*67e74705SXin Li if (Pos == FrameworkNameOffset.end()) {
1784*67e74705SXin Li Offset = FrameworkStringData.size() + 1;
1785*67e74705SXin Li FrameworkStringData.append(Data.Framework.begin(),
1786*67e74705SXin Li Data.Framework.end());
1787*67e74705SXin Li FrameworkStringData.push_back(0);
1788*67e74705SXin Li
1789*67e74705SXin Li FrameworkNameOffset[Data.Framework] = Offset;
1790*67e74705SXin Li } else
1791*67e74705SXin Li Offset = Pos->second;
1792*67e74705SXin Li }
1793*67e74705SXin Li LE.write<uint32_t>(Offset);
1794*67e74705SXin Li
1795*67e74705SXin Li // FIXME: If the header is excluded, we should write out some
1796*67e74705SXin Li // record of that fact.
1797*67e74705SXin Li for (auto ModInfo : HS.getModuleMap().findAllModulesForHeader(key.FE)) {
1798*67e74705SXin Li if (uint32_t ModID =
1799*67e74705SXin Li Writer.getLocalOrImportedSubmoduleID(ModInfo.getModule())) {
1800*67e74705SXin Li uint32_t Value = (ModID << 2) | (unsigned)ModInfo.getRole();
1801*67e74705SXin Li assert((Value >> 2) == ModID && "overflow in header module info");
1802*67e74705SXin Li LE.write<uint32_t>(Value);
1803*67e74705SXin Li }
1804*67e74705SXin Li }
1805*67e74705SXin Li
1806*67e74705SXin Li assert(Out.tell() - Start == DataLen && "Wrong data length");
1807*67e74705SXin Li }
1808*67e74705SXin Li
strings_begin() const1809*67e74705SXin Li const char *strings_begin() const { return FrameworkStringData.begin(); }
strings_end() const1810*67e74705SXin Li const char *strings_end() const { return FrameworkStringData.end(); }
1811*67e74705SXin Li };
1812*67e74705SXin Li } // end anonymous namespace
1813*67e74705SXin Li
1814*67e74705SXin Li /// \brief Write the header search block for the list of files that
1815*67e74705SXin Li ///
1816*67e74705SXin Li /// \param HS The header search structure to save.
WriteHeaderSearch(const HeaderSearch & HS)1817*67e74705SXin Li void ASTWriter::WriteHeaderSearch(const HeaderSearch &HS) {
1818*67e74705SXin Li SmallVector<const FileEntry *, 16> FilesByUID;
1819*67e74705SXin Li HS.getFileMgr().GetUniqueIDMapping(FilesByUID);
1820*67e74705SXin Li
1821*67e74705SXin Li if (FilesByUID.size() > HS.header_file_size())
1822*67e74705SXin Li FilesByUID.resize(HS.header_file_size());
1823*67e74705SXin Li
1824*67e74705SXin Li HeaderFileInfoTrait GeneratorTrait(*this, HS);
1825*67e74705SXin Li llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait> Generator;
1826*67e74705SXin Li SmallVector<const char *, 4> SavedStrings;
1827*67e74705SXin Li unsigned NumHeaderSearchEntries = 0;
1828*67e74705SXin Li for (unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
1829*67e74705SXin Li const FileEntry *File = FilesByUID[UID];
1830*67e74705SXin Li if (!File)
1831*67e74705SXin Li continue;
1832*67e74705SXin Li
1833*67e74705SXin Li // Get the file info. This will load info from the external source if
1834*67e74705SXin Li // necessary. Skip emitting this file if we have no information on it
1835*67e74705SXin Li // as a header file (in which case HFI will be null) or if it hasn't
1836*67e74705SXin Li // changed since it was loaded. Also skip it if it's for a modular header
1837*67e74705SXin Li // from a different module; in that case, we rely on the module(s)
1838*67e74705SXin Li // containing the header to provide this information.
1839*67e74705SXin Li const HeaderFileInfo *HFI =
1840*67e74705SXin Li HS.getExistingFileInfo(File, /*WantExternal*/!Chain);
1841*67e74705SXin Li if (!HFI || (HFI->isModuleHeader && !HFI->isCompilingModuleHeader))
1842*67e74705SXin Li continue;
1843*67e74705SXin Li
1844*67e74705SXin Li // Massage the file path into an appropriate form.
1845*67e74705SXin Li const char *Filename = File->getName();
1846*67e74705SXin Li SmallString<128> FilenameTmp(Filename);
1847*67e74705SXin Li if (PreparePathForOutput(FilenameTmp)) {
1848*67e74705SXin Li // If we performed any translation on the file name at all, we need to
1849*67e74705SXin Li // save this string, since the generator will refer to it later.
1850*67e74705SXin Li Filename = strdup(FilenameTmp.c_str());
1851*67e74705SXin Li SavedStrings.push_back(Filename);
1852*67e74705SXin Li }
1853*67e74705SXin Li
1854*67e74705SXin Li HeaderFileInfoTrait::key_type key = { File, Filename };
1855*67e74705SXin Li Generator.insert(key, *HFI, GeneratorTrait);
1856*67e74705SXin Li ++NumHeaderSearchEntries;
1857*67e74705SXin Li }
1858*67e74705SXin Li
1859*67e74705SXin Li // Create the on-disk hash table in a buffer.
1860*67e74705SXin Li SmallString<4096> TableData;
1861*67e74705SXin Li uint32_t BucketOffset;
1862*67e74705SXin Li {
1863*67e74705SXin Li using namespace llvm::support;
1864*67e74705SXin Li llvm::raw_svector_ostream Out(TableData);
1865*67e74705SXin Li // Make sure that no bucket is at offset 0
1866*67e74705SXin Li endian::Writer<little>(Out).write<uint32_t>(0);
1867*67e74705SXin Li BucketOffset = Generator.Emit(Out, GeneratorTrait);
1868*67e74705SXin Li }
1869*67e74705SXin Li
1870*67e74705SXin Li // Create a blob abbreviation
1871*67e74705SXin Li using namespace llvm;
1872*67e74705SXin Li
1873*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
1874*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(HEADER_SEARCH_TABLE));
1875*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1876*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1877*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1878*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1879*67e74705SXin Li unsigned TableAbbrev = Stream.EmitAbbrev(Abbrev);
1880*67e74705SXin Li
1881*67e74705SXin Li // Write the header search table
1882*67e74705SXin Li RecordData::value_type Record[] = {HEADER_SEARCH_TABLE, BucketOffset,
1883*67e74705SXin Li NumHeaderSearchEntries, TableData.size()};
1884*67e74705SXin Li TableData.append(GeneratorTrait.strings_begin(),GeneratorTrait.strings_end());
1885*67e74705SXin Li Stream.EmitRecordWithBlob(TableAbbrev, Record, TableData);
1886*67e74705SXin Li
1887*67e74705SXin Li // Free all of the strings we had to duplicate.
1888*67e74705SXin Li for (unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
1889*67e74705SXin Li free(const_cast<char *>(SavedStrings[I]));
1890*67e74705SXin Li }
1891*67e74705SXin Li
1892*67e74705SXin Li /// \brief Writes the block containing the serialized form of the
1893*67e74705SXin Li /// source manager.
1894*67e74705SXin Li ///
1895*67e74705SXin Li /// TODO: We should probably use an on-disk hash table (stored in a
1896*67e74705SXin Li /// blob), indexed based on the file name, so that we only create
1897*67e74705SXin Li /// entries for files that we actually need. In the common case (no
1898*67e74705SXin Li /// errors), we probably won't have to create file entries for any of
1899*67e74705SXin Li /// the files in the AST.
WriteSourceManagerBlock(SourceManager & SourceMgr,const Preprocessor & PP)1900*67e74705SXin Li void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,
1901*67e74705SXin Li const Preprocessor &PP) {
1902*67e74705SXin Li RecordData Record;
1903*67e74705SXin Li
1904*67e74705SXin Li // Enter the source manager block.
1905*67e74705SXin Li Stream.EnterSubblock(SOURCE_MANAGER_BLOCK_ID, 4);
1906*67e74705SXin Li
1907*67e74705SXin Li // Abbreviations for the various kinds of source-location entries.
1908*67e74705SXin Li unsigned SLocFileAbbrv = CreateSLocFileAbbrev(Stream);
1909*67e74705SXin Li unsigned SLocBufferAbbrv = CreateSLocBufferAbbrev(Stream);
1910*67e74705SXin Li unsigned SLocBufferBlobAbbrv = CreateSLocBufferBlobAbbrev(Stream, false);
1911*67e74705SXin Li unsigned SLocBufferBlobCompressedAbbrv =
1912*67e74705SXin Li CreateSLocBufferBlobAbbrev(Stream, true);
1913*67e74705SXin Li unsigned SLocExpansionAbbrv = CreateSLocExpansionAbbrev(Stream);
1914*67e74705SXin Li
1915*67e74705SXin Li // Write out the source location entry table. We skip the first
1916*67e74705SXin Li // entry, which is always the same dummy entry.
1917*67e74705SXin Li std::vector<uint32_t> SLocEntryOffsets;
1918*67e74705SXin Li RecordData PreloadSLocs;
1919*67e74705SXin Li SLocEntryOffsets.reserve(SourceMgr.local_sloc_entry_size() - 1);
1920*67e74705SXin Li for (unsigned I = 1, N = SourceMgr.local_sloc_entry_size();
1921*67e74705SXin Li I != N; ++I) {
1922*67e74705SXin Li // Get this source location entry.
1923*67e74705SXin Li const SrcMgr::SLocEntry *SLoc = &SourceMgr.getLocalSLocEntry(I);
1924*67e74705SXin Li FileID FID = FileID::get(I);
1925*67e74705SXin Li assert(&SourceMgr.getSLocEntry(FID) == SLoc);
1926*67e74705SXin Li
1927*67e74705SXin Li // Record the offset of this source-location entry.
1928*67e74705SXin Li SLocEntryOffsets.push_back(Stream.GetCurrentBitNo());
1929*67e74705SXin Li
1930*67e74705SXin Li // Figure out which record code to use.
1931*67e74705SXin Li unsigned Code;
1932*67e74705SXin Li if (SLoc->isFile()) {
1933*67e74705SXin Li const SrcMgr::ContentCache *Cache = SLoc->getFile().getContentCache();
1934*67e74705SXin Li if (Cache->OrigEntry) {
1935*67e74705SXin Li Code = SM_SLOC_FILE_ENTRY;
1936*67e74705SXin Li } else
1937*67e74705SXin Li Code = SM_SLOC_BUFFER_ENTRY;
1938*67e74705SXin Li } else
1939*67e74705SXin Li Code = SM_SLOC_EXPANSION_ENTRY;
1940*67e74705SXin Li Record.clear();
1941*67e74705SXin Li Record.push_back(Code);
1942*67e74705SXin Li
1943*67e74705SXin Li // Starting offset of this entry within this module, so skip the dummy.
1944*67e74705SXin Li Record.push_back(SLoc->getOffset() - 2);
1945*67e74705SXin Li if (SLoc->isFile()) {
1946*67e74705SXin Li const SrcMgr::FileInfo &File = SLoc->getFile();
1947*67e74705SXin Li AddSourceLocation(File.getIncludeLoc(), Record);
1948*67e74705SXin Li Record.push_back(File.getFileCharacteristic()); // FIXME: stable encoding
1949*67e74705SXin Li Record.push_back(File.hasLineDirectives());
1950*67e74705SXin Li
1951*67e74705SXin Li const SrcMgr::ContentCache *Content = File.getContentCache();
1952*67e74705SXin Li bool EmitBlob = false;
1953*67e74705SXin Li if (Content->OrigEntry) {
1954*67e74705SXin Li assert(Content->OrigEntry == Content->ContentsEntry &&
1955*67e74705SXin Li "Writing to AST an overridden file is not supported");
1956*67e74705SXin Li
1957*67e74705SXin Li // The source location entry is a file. Emit input file ID.
1958*67e74705SXin Li assert(InputFileIDs[Content->OrigEntry] != 0 && "Missed file entry");
1959*67e74705SXin Li Record.push_back(InputFileIDs[Content->OrigEntry]);
1960*67e74705SXin Li
1961*67e74705SXin Li Record.push_back(File.NumCreatedFIDs);
1962*67e74705SXin Li
1963*67e74705SXin Li FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
1964*67e74705SXin Li if (FDI != FileDeclIDs.end()) {
1965*67e74705SXin Li Record.push_back(FDI->second->FirstDeclIndex);
1966*67e74705SXin Li Record.push_back(FDI->second->DeclIDs.size());
1967*67e74705SXin Li } else {
1968*67e74705SXin Li Record.push_back(0);
1969*67e74705SXin Li Record.push_back(0);
1970*67e74705SXin Li }
1971*67e74705SXin Li
1972*67e74705SXin Li Stream.EmitRecordWithAbbrev(SLocFileAbbrv, Record);
1973*67e74705SXin Li
1974*67e74705SXin Li if (Content->BufferOverridden || Content->IsTransient)
1975*67e74705SXin Li EmitBlob = true;
1976*67e74705SXin Li } else {
1977*67e74705SXin Li // The source location entry is a buffer. The blob associated
1978*67e74705SXin Li // with this entry contains the contents of the buffer.
1979*67e74705SXin Li
1980*67e74705SXin Li // We add one to the size so that we capture the trailing NULL
1981*67e74705SXin Li // that is required by llvm::MemoryBuffer::getMemBuffer (on
1982*67e74705SXin Li // the reader side).
1983*67e74705SXin Li const llvm::MemoryBuffer *Buffer
1984*67e74705SXin Li = Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager());
1985*67e74705SXin Li const char *Name = Buffer->getBufferIdentifier();
1986*67e74705SXin Li Stream.EmitRecordWithBlob(SLocBufferAbbrv, Record,
1987*67e74705SXin Li StringRef(Name, strlen(Name) + 1));
1988*67e74705SXin Li EmitBlob = true;
1989*67e74705SXin Li
1990*67e74705SXin Li if (strcmp(Name, "<built-in>") == 0) {
1991*67e74705SXin Li PreloadSLocs.push_back(SLocEntryOffsets.size());
1992*67e74705SXin Li }
1993*67e74705SXin Li }
1994*67e74705SXin Li
1995*67e74705SXin Li if (EmitBlob) {
1996*67e74705SXin Li // Include the implicit terminating null character in the on-disk buffer
1997*67e74705SXin Li // if we're writing it uncompressed.
1998*67e74705SXin Li const llvm::MemoryBuffer *Buffer =
1999*67e74705SXin Li Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager());
2000*67e74705SXin Li StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);
2001*67e74705SXin Li
2002*67e74705SXin Li // Compress the buffer if possible. We expect that almost all PCM
2003*67e74705SXin Li // consumers will not want its contents.
2004*67e74705SXin Li SmallString<0> CompressedBuffer;
2005*67e74705SXin Li if (llvm::zlib::compress(Blob.drop_back(1), CompressedBuffer) ==
2006*67e74705SXin Li llvm::zlib::StatusOK) {
2007*67e74705SXin Li RecordData::value_type Record[] = {SM_SLOC_BUFFER_BLOB_COMPRESSED,
2008*67e74705SXin Li Blob.size() - 1};
2009*67e74705SXin Li Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv, Record,
2010*67e74705SXin Li CompressedBuffer);
2011*67e74705SXin Li } else {
2012*67e74705SXin Li RecordData::value_type Record[] = {SM_SLOC_BUFFER_BLOB};
2013*67e74705SXin Li Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record, Blob);
2014*67e74705SXin Li }
2015*67e74705SXin Li }
2016*67e74705SXin Li } else {
2017*67e74705SXin Li // The source location entry is a macro expansion.
2018*67e74705SXin Li const SrcMgr::ExpansionInfo &Expansion = SLoc->getExpansion();
2019*67e74705SXin Li AddSourceLocation(Expansion.getSpellingLoc(), Record);
2020*67e74705SXin Li AddSourceLocation(Expansion.getExpansionLocStart(), Record);
2021*67e74705SXin Li AddSourceLocation(Expansion.isMacroArgExpansion()
2022*67e74705SXin Li ? SourceLocation()
2023*67e74705SXin Li : Expansion.getExpansionLocEnd(),
2024*67e74705SXin Li Record);
2025*67e74705SXin Li
2026*67e74705SXin Li // Compute the token length for this macro expansion.
2027*67e74705SXin Li unsigned NextOffset = SourceMgr.getNextLocalOffset();
2028*67e74705SXin Li if (I + 1 != N)
2029*67e74705SXin Li NextOffset = SourceMgr.getLocalSLocEntry(I + 1).getOffset();
2030*67e74705SXin Li Record.push_back(NextOffset - SLoc->getOffset() - 1);
2031*67e74705SXin Li Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv, Record);
2032*67e74705SXin Li }
2033*67e74705SXin Li }
2034*67e74705SXin Li
2035*67e74705SXin Li Stream.ExitBlock();
2036*67e74705SXin Li
2037*67e74705SXin Li if (SLocEntryOffsets.empty())
2038*67e74705SXin Li return;
2039*67e74705SXin Li
2040*67e74705SXin Li // Write the source-location offsets table into the AST block. This
2041*67e74705SXin Li // table is used for lazily loading source-location information.
2042*67e74705SXin Li using namespace llvm;
2043*67e74705SXin Li
2044*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
2045*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SOURCE_LOCATION_OFFSETS));
2046*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // # of slocs
2047*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // total size
2048*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // offsets
2049*67e74705SXin Li unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(Abbrev);
2050*67e74705SXin Li {
2051*67e74705SXin Li RecordData::value_type Record[] = {
2052*67e74705SXin Li SOURCE_LOCATION_OFFSETS, SLocEntryOffsets.size(),
2053*67e74705SXin Li SourceMgr.getNextLocalOffset() - 1 /* skip dummy */};
2054*67e74705SXin Li Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record,
2055*67e74705SXin Li bytes(SLocEntryOffsets));
2056*67e74705SXin Li }
2057*67e74705SXin Li // Write the source location entry preloads array, telling the AST
2058*67e74705SXin Li // reader which source locations entries it should load eagerly.
2059*67e74705SXin Li Stream.EmitRecord(SOURCE_LOCATION_PRELOADS, PreloadSLocs);
2060*67e74705SXin Li
2061*67e74705SXin Li // Write the line table. It depends on remapping working, so it must come
2062*67e74705SXin Li // after the source location offsets.
2063*67e74705SXin Li if (SourceMgr.hasLineTable()) {
2064*67e74705SXin Li LineTableInfo &LineTable = SourceMgr.getLineTable();
2065*67e74705SXin Li
2066*67e74705SXin Li Record.clear();
2067*67e74705SXin Li
2068*67e74705SXin Li // Emit the needed file names.
2069*67e74705SXin Li llvm::DenseMap<int, int> FilenameMap;
2070*67e74705SXin Li for (const auto &L : LineTable) {
2071*67e74705SXin Li if (L.first.ID < 0)
2072*67e74705SXin Li continue;
2073*67e74705SXin Li for (auto &LE : L.second) {
2074*67e74705SXin Li if (FilenameMap.insert(std::make_pair(LE.FilenameID,
2075*67e74705SXin Li FilenameMap.size())).second)
2076*67e74705SXin Li AddPath(LineTable.getFilename(LE.FilenameID), Record);
2077*67e74705SXin Li }
2078*67e74705SXin Li }
2079*67e74705SXin Li Record.push_back(0);
2080*67e74705SXin Li
2081*67e74705SXin Li // Emit the line entries
2082*67e74705SXin Li for (const auto &L : LineTable) {
2083*67e74705SXin Li // Only emit entries for local files.
2084*67e74705SXin Li if (L.first.ID < 0)
2085*67e74705SXin Li continue;
2086*67e74705SXin Li
2087*67e74705SXin Li // Emit the file ID
2088*67e74705SXin Li Record.push_back(L.first.ID);
2089*67e74705SXin Li
2090*67e74705SXin Li // Emit the line entries
2091*67e74705SXin Li Record.push_back(L.second.size());
2092*67e74705SXin Li for (const auto &LE : L.second) {
2093*67e74705SXin Li Record.push_back(LE.FileOffset);
2094*67e74705SXin Li Record.push_back(LE.LineNo);
2095*67e74705SXin Li Record.push_back(FilenameMap[LE.FilenameID]);
2096*67e74705SXin Li Record.push_back((unsigned)LE.FileKind);
2097*67e74705SXin Li Record.push_back(LE.IncludeOffset);
2098*67e74705SXin Li }
2099*67e74705SXin Li }
2100*67e74705SXin Li
2101*67e74705SXin Li Stream.EmitRecord(SOURCE_MANAGER_LINE_TABLE, Record);
2102*67e74705SXin Li }
2103*67e74705SXin Li }
2104*67e74705SXin Li
2105*67e74705SXin Li //===----------------------------------------------------------------------===//
2106*67e74705SXin Li // Preprocessor Serialization
2107*67e74705SXin Li //===----------------------------------------------------------------------===//
2108*67e74705SXin Li
shouldIgnoreMacro(MacroDirective * MD,bool IsModule,const Preprocessor & PP)2109*67e74705SXin Li static bool shouldIgnoreMacro(MacroDirective *MD, bool IsModule,
2110*67e74705SXin Li const Preprocessor &PP) {
2111*67e74705SXin Li if (MacroInfo *MI = MD->getMacroInfo())
2112*67e74705SXin Li if (MI->isBuiltinMacro())
2113*67e74705SXin Li return true;
2114*67e74705SXin Li
2115*67e74705SXin Li if (IsModule) {
2116*67e74705SXin Li SourceLocation Loc = MD->getLocation();
2117*67e74705SXin Li if (Loc.isInvalid())
2118*67e74705SXin Li return true;
2119*67e74705SXin Li if (PP.getSourceManager().getFileID(Loc) == PP.getPredefinesFileID())
2120*67e74705SXin Li return true;
2121*67e74705SXin Li }
2122*67e74705SXin Li
2123*67e74705SXin Li return false;
2124*67e74705SXin Li }
2125*67e74705SXin Li
2126*67e74705SXin Li /// \brief Writes the block containing the serialized form of the
2127*67e74705SXin Li /// preprocessor.
2128*67e74705SXin Li ///
WritePreprocessor(const Preprocessor & PP,bool IsModule)2129*67e74705SXin Li void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) {
2130*67e74705SXin Li PreprocessingRecord *PPRec = PP.getPreprocessingRecord();
2131*67e74705SXin Li if (PPRec)
2132*67e74705SXin Li WritePreprocessorDetail(*PPRec);
2133*67e74705SXin Li
2134*67e74705SXin Li RecordData Record;
2135*67e74705SXin Li RecordData ModuleMacroRecord;
2136*67e74705SXin Li
2137*67e74705SXin Li // If the preprocessor __COUNTER__ value has been bumped, remember it.
2138*67e74705SXin Li if (PP.getCounterValue() != 0) {
2139*67e74705SXin Li RecordData::value_type Record[] = {PP.getCounterValue()};
2140*67e74705SXin Li Stream.EmitRecord(PP_COUNTER_VALUE, Record);
2141*67e74705SXin Li }
2142*67e74705SXin Li
2143*67e74705SXin Li // Enter the preprocessor block.
2144*67e74705SXin Li Stream.EnterSubblock(PREPROCESSOR_BLOCK_ID, 3);
2145*67e74705SXin Li
2146*67e74705SXin Li // If the AST file contains __DATE__ or __TIME__ emit a warning about this.
2147*67e74705SXin Li // FIXME: Include a location for the use, and say which one was used.
2148*67e74705SXin Li if (PP.SawDateOrTime())
2149*67e74705SXin Li PP.Diag(SourceLocation(), diag::warn_module_uses_date_time) << IsModule;
2150*67e74705SXin Li
2151*67e74705SXin Li // Loop over all the macro directives that are live at the end of the file,
2152*67e74705SXin Li // emitting each to the PP section.
2153*67e74705SXin Li
2154*67e74705SXin Li // Construct the list of identifiers with macro directives that need to be
2155*67e74705SXin Li // serialized.
2156*67e74705SXin Li SmallVector<const IdentifierInfo *, 128> MacroIdentifiers;
2157*67e74705SXin Li for (auto &Id : PP.getIdentifierTable())
2158*67e74705SXin Li if (Id.second->hadMacroDefinition() &&
2159*67e74705SXin Li (!Id.second->isFromAST() ||
2160*67e74705SXin Li Id.second->hasChangedSinceDeserialization()))
2161*67e74705SXin Li MacroIdentifiers.push_back(Id.second);
2162*67e74705SXin Li // Sort the set of macro definitions that need to be serialized by the
2163*67e74705SXin Li // name of the macro, to provide a stable ordering.
2164*67e74705SXin Li std::sort(MacroIdentifiers.begin(), MacroIdentifiers.end(),
2165*67e74705SXin Li llvm::less_ptr<IdentifierInfo>());
2166*67e74705SXin Li
2167*67e74705SXin Li // Emit the macro directives as a list and associate the offset with the
2168*67e74705SXin Li // identifier they belong to.
2169*67e74705SXin Li for (const IdentifierInfo *Name : MacroIdentifiers) {
2170*67e74705SXin Li MacroDirective *MD = PP.getLocalMacroDirectiveHistory(Name);
2171*67e74705SXin Li auto StartOffset = Stream.GetCurrentBitNo();
2172*67e74705SXin Li
2173*67e74705SXin Li // Emit the macro directives in reverse source order.
2174*67e74705SXin Li for (; MD; MD = MD->getPrevious()) {
2175*67e74705SXin Li // Once we hit an ignored macro, we're done: the rest of the chain
2176*67e74705SXin Li // will all be ignored macros.
2177*67e74705SXin Li if (shouldIgnoreMacro(MD, IsModule, PP))
2178*67e74705SXin Li break;
2179*67e74705SXin Li
2180*67e74705SXin Li AddSourceLocation(MD->getLocation(), Record);
2181*67e74705SXin Li Record.push_back(MD->getKind());
2182*67e74705SXin Li if (auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2183*67e74705SXin Li Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2184*67e74705SXin Li } else if (auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2185*67e74705SXin Li Record.push_back(VisMD->isPublic());
2186*67e74705SXin Li }
2187*67e74705SXin Li }
2188*67e74705SXin Li
2189*67e74705SXin Li // Write out any exported module macros.
2190*67e74705SXin Li bool EmittedModuleMacros = false;
2191*67e74705SXin Li // We write out exported module macros for PCH as well.
2192*67e74705SXin Li auto Leafs = PP.getLeafModuleMacros(Name);
2193*67e74705SXin Li SmallVector<ModuleMacro*, 8> Worklist(Leafs.begin(), Leafs.end());
2194*67e74705SXin Li llvm::DenseMap<ModuleMacro*, unsigned> Visits;
2195*67e74705SXin Li while (!Worklist.empty()) {
2196*67e74705SXin Li auto *Macro = Worklist.pop_back_val();
2197*67e74705SXin Li
2198*67e74705SXin Li // Emit a record indicating this submodule exports this macro.
2199*67e74705SXin Li ModuleMacroRecord.push_back(
2200*67e74705SXin Li getSubmoduleID(Macro->getOwningModule()));
2201*67e74705SXin Li ModuleMacroRecord.push_back(getMacroRef(Macro->getMacroInfo(), Name));
2202*67e74705SXin Li for (auto *M : Macro->overrides())
2203*67e74705SXin Li ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2204*67e74705SXin Li
2205*67e74705SXin Li Stream.EmitRecord(PP_MODULE_MACRO, ModuleMacroRecord);
2206*67e74705SXin Li ModuleMacroRecord.clear();
2207*67e74705SXin Li
2208*67e74705SXin Li // Enqueue overridden macros once we've visited all their ancestors.
2209*67e74705SXin Li for (auto *M : Macro->overrides())
2210*67e74705SXin Li if (++Visits[M] == M->getNumOverridingMacros())
2211*67e74705SXin Li Worklist.push_back(M);
2212*67e74705SXin Li
2213*67e74705SXin Li EmittedModuleMacros = true;
2214*67e74705SXin Li }
2215*67e74705SXin Li
2216*67e74705SXin Li if (Record.empty() && !EmittedModuleMacros)
2217*67e74705SXin Li continue;
2218*67e74705SXin Li
2219*67e74705SXin Li IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2220*67e74705SXin Li Stream.EmitRecord(PP_MACRO_DIRECTIVE_HISTORY, Record);
2221*67e74705SXin Li Record.clear();
2222*67e74705SXin Li }
2223*67e74705SXin Li
2224*67e74705SXin Li /// \brief Offsets of each of the macros into the bitstream, indexed by
2225*67e74705SXin Li /// the local macro ID
2226*67e74705SXin Li ///
2227*67e74705SXin Li /// For each identifier that is associated with a macro, this map
2228*67e74705SXin Li /// provides the offset into the bitstream where that macro is
2229*67e74705SXin Li /// defined.
2230*67e74705SXin Li std::vector<uint32_t> MacroOffsets;
2231*67e74705SXin Li
2232*67e74705SXin Li for (unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2233*67e74705SXin Li const IdentifierInfo *Name = MacroInfosToEmit[I].Name;
2234*67e74705SXin Li MacroInfo *MI = MacroInfosToEmit[I].MI;
2235*67e74705SXin Li MacroID ID = MacroInfosToEmit[I].ID;
2236*67e74705SXin Li
2237*67e74705SXin Li if (ID < FirstMacroID) {
2238*67e74705SXin Li assert(0 && "Loaded MacroInfo entered MacroInfosToEmit ?");
2239*67e74705SXin Li continue;
2240*67e74705SXin Li }
2241*67e74705SXin Li
2242*67e74705SXin Li // Record the local offset of this macro.
2243*67e74705SXin Li unsigned Index = ID - FirstMacroID;
2244*67e74705SXin Li if (Index == MacroOffsets.size())
2245*67e74705SXin Li MacroOffsets.push_back(Stream.GetCurrentBitNo());
2246*67e74705SXin Li else {
2247*67e74705SXin Li if (Index > MacroOffsets.size())
2248*67e74705SXin Li MacroOffsets.resize(Index + 1);
2249*67e74705SXin Li
2250*67e74705SXin Li MacroOffsets[Index] = Stream.GetCurrentBitNo();
2251*67e74705SXin Li }
2252*67e74705SXin Li
2253*67e74705SXin Li AddIdentifierRef(Name, Record);
2254*67e74705SXin Li Record.push_back(inferSubmoduleIDFromLocation(MI->getDefinitionLoc()));
2255*67e74705SXin Li AddSourceLocation(MI->getDefinitionLoc(), Record);
2256*67e74705SXin Li AddSourceLocation(MI->getDefinitionEndLoc(), Record);
2257*67e74705SXin Li Record.push_back(MI->isUsed());
2258*67e74705SXin Li Record.push_back(MI->isUsedForHeaderGuard());
2259*67e74705SXin Li unsigned Code;
2260*67e74705SXin Li if (MI->isObjectLike()) {
2261*67e74705SXin Li Code = PP_MACRO_OBJECT_LIKE;
2262*67e74705SXin Li } else {
2263*67e74705SXin Li Code = PP_MACRO_FUNCTION_LIKE;
2264*67e74705SXin Li
2265*67e74705SXin Li Record.push_back(MI->isC99Varargs());
2266*67e74705SXin Li Record.push_back(MI->isGNUVarargs());
2267*67e74705SXin Li Record.push_back(MI->hasCommaPasting());
2268*67e74705SXin Li Record.push_back(MI->getNumArgs());
2269*67e74705SXin Li for (const IdentifierInfo *Arg : MI->args())
2270*67e74705SXin Li AddIdentifierRef(Arg, Record);
2271*67e74705SXin Li }
2272*67e74705SXin Li
2273*67e74705SXin Li // If we have a detailed preprocessing record, record the macro definition
2274*67e74705SXin Li // ID that corresponds to this macro.
2275*67e74705SXin Li if (PPRec)
2276*67e74705SXin Li Record.push_back(MacroDefinitions[PPRec->findMacroDefinition(MI)]);
2277*67e74705SXin Li
2278*67e74705SXin Li Stream.EmitRecord(Code, Record);
2279*67e74705SXin Li Record.clear();
2280*67e74705SXin Li
2281*67e74705SXin Li // Emit the tokens array.
2282*67e74705SXin Li for (unsigned TokNo = 0, e = MI->getNumTokens(); TokNo != e; ++TokNo) {
2283*67e74705SXin Li // Note that we know that the preprocessor does not have any annotation
2284*67e74705SXin Li // tokens in it because they are created by the parser, and thus can't
2285*67e74705SXin Li // be in a macro definition.
2286*67e74705SXin Li const Token &Tok = MI->getReplacementToken(TokNo);
2287*67e74705SXin Li AddToken(Tok, Record);
2288*67e74705SXin Li Stream.EmitRecord(PP_TOKEN, Record);
2289*67e74705SXin Li Record.clear();
2290*67e74705SXin Li }
2291*67e74705SXin Li ++NumMacros;
2292*67e74705SXin Li }
2293*67e74705SXin Li
2294*67e74705SXin Li Stream.ExitBlock();
2295*67e74705SXin Li
2296*67e74705SXin Li // Write the offsets table for macro IDs.
2297*67e74705SXin Li using namespace llvm;
2298*67e74705SXin Li
2299*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
2300*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(MACRO_OFFSET));
2301*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of macros
2302*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID
2303*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2304*67e74705SXin Li
2305*67e74705SXin Li unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2306*67e74705SXin Li {
2307*67e74705SXin Li RecordData::value_type Record[] = {MACRO_OFFSET, MacroOffsets.size(),
2308*67e74705SXin Li FirstMacroID - NUM_PREDEF_MACRO_IDS};
2309*67e74705SXin Li Stream.EmitRecordWithBlob(MacroOffsetAbbrev, Record, bytes(MacroOffsets));
2310*67e74705SXin Li }
2311*67e74705SXin Li }
2312*67e74705SXin Li
WritePreprocessorDetail(PreprocessingRecord & PPRec)2313*67e74705SXin Li void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) {
2314*67e74705SXin Li if (PPRec.local_begin() == PPRec.local_end())
2315*67e74705SXin Li return;
2316*67e74705SXin Li
2317*67e74705SXin Li SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets;
2318*67e74705SXin Li
2319*67e74705SXin Li // Enter the preprocessor block.
2320*67e74705SXin Li Stream.EnterSubblock(PREPROCESSOR_DETAIL_BLOCK_ID, 3);
2321*67e74705SXin Li
2322*67e74705SXin Li // If the preprocessor has a preprocessing record, emit it.
2323*67e74705SXin Li unsigned NumPreprocessingRecords = 0;
2324*67e74705SXin Li using namespace llvm;
2325*67e74705SXin Li
2326*67e74705SXin Li // Set up the abbreviation for
2327*67e74705SXin Li unsigned InclusionAbbrev = 0;
2328*67e74705SXin Li {
2329*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
2330*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(PPD_INCLUSION_DIRECTIVE));
2331*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // filename length
2332*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // in quotes
2333*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // kind
2334*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // imported module
2335*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2336*67e74705SXin Li InclusionAbbrev = Stream.EmitAbbrev(Abbrev);
2337*67e74705SXin Li }
2338*67e74705SXin Li
2339*67e74705SXin Li unsigned FirstPreprocessorEntityID
2340*67e74705SXin Li = (Chain ? PPRec.getNumLoadedPreprocessedEntities() : 0)
2341*67e74705SXin Li + NUM_PREDEF_PP_ENTITY_IDS;
2342*67e74705SXin Li unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2343*67e74705SXin Li RecordData Record;
2344*67e74705SXin Li for (PreprocessingRecord::iterator E = PPRec.local_begin(),
2345*67e74705SXin Li EEnd = PPRec.local_end();
2346*67e74705SXin Li E != EEnd;
2347*67e74705SXin Li (void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2348*67e74705SXin Li Record.clear();
2349*67e74705SXin Li
2350*67e74705SXin Li PreprocessedEntityOffsets.push_back(
2351*67e74705SXin Li PPEntityOffset((*E)->getSourceRange(), Stream.GetCurrentBitNo()));
2352*67e74705SXin Li
2353*67e74705SXin Li if (auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) {
2354*67e74705SXin Li // Record this macro definition's ID.
2355*67e74705SXin Li MacroDefinitions[MD] = NextPreprocessorEntityID;
2356*67e74705SXin Li
2357*67e74705SXin Li AddIdentifierRef(MD->getName(), Record);
2358*67e74705SXin Li Stream.EmitRecord(PPD_MACRO_DEFINITION, Record);
2359*67e74705SXin Li continue;
2360*67e74705SXin Li }
2361*67e74705SXin Li
2362*67e74705SXin Li if (auto *ME = dyn_cast<MacroExpansion>(*E)) {
2363*67e74705SXin Li Record.push_back(ME->isBuiltinMacro());
2364*67e74705SXin Li if (ME->isBuiltinMacro())
2365*67e74705SXin Li AddIdentifierRef(ME->getName(), Record);
2366*67e74705SXin Li else
2367*67e74705SXin Li Record.push_back(MacroDefinitions[ME->getDefinition()]);
2368*67e74705SXin Li Stream.EmitRecord(PPD_MACRO_EXPANSION, Record);
2369*67e74705SXin Li continue;
2370*67e74705SXin Li }
2371*67e74705SXin Li
2372*67e74705SXin Li if (auto *ID = dyn_cast<InclusionDirective>(*E)) {
2373*67e74705SXin Li Record.push_back(PPD_INCLUSION_DIRECTIVE);
2374*67e74705SXin Li Record.push_back(ID->getFileName().size());
2375*67e74705SXin Li Record.push_back(ID->wasInQuotes());
2376*67e74705SXin Li Record.push_back(static_cast<unsigned>(ID->getKind()));
2377*67e74705SXin Li Record.push_back(ID->importedModule());
2378*67e74705SXin Li SmallString<64> Buffer;
2379*67e74705SXin Li Buffer += ID->getFileName();
2380*67e74705SXin Li // Check that the FileEntry is not null because it was not resolved and
2381*67e74705SXin Li // we create a PCH even with compiler errors.
2382*67e74705SXin Li if (ID->getFile())
2383*67e74705SXin Li Buffer += ID->getFile()->getName();
2384*67e74705SXin Li Stream.EmitRecordWithBlob(InclusionAbbrev, Record, Buffer);
2385*67e74705SXin Li continue;
2386*67e74705SXin Li }
2387*67e74705SXin Li
2388*67e74705SXin Li llvm_unreachable("Unhandled PreprocessedEntity in ASTWriter");
2389*67e74705SXin Li }
2390*67e74705SXin Li Stream.ExitBlock();
2391*67e74705SXin Li
2392*67e74705SXin Li // Write the offsets table for the preprocessing record.
2393*67e74705SXin Li if (NumPreprocessingRecords > 0) {
2394*67e74705SXin Li assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2395*67e74705SXin Li
2396*67e74705SXin Li // Write the offsets table for identifier IDs.
2397*67e74705SXin Li using namespace llvm;
2398*67e74705SXin Li
2399*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
2400*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(PPD_ENTITIES_OFFSETS));
2401*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first pp entity
2402*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2403*67e74705SXin Li unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2404*67e74705SXin Li
2405*67e74705SXin Li RecordData::value_type Record[] = {PPD_ENTITIES_OFFSETS,
2406*67e74705SXin Li FirstPreprocessorEntityID -
2407*67e74705SXin Li NUM_PREDEF_PP_ENTITY_IDS};
2408*67e74705SXin Li Stream.EmitRecordWithBlob(PPEOffsetAbbrev, Record,
2409*67e74705SXin Li bytes(PreprocessedEntityOffsets));
2410*67e74705SXin Li }
2411*67e74705SXin Li }
2412*67e74705SXin Li
getLocalOrImportedSubmoduleID(Module * Mod)2413*67e74705SXin Li unsigned ASTWriter::getLocalOrImportedSubmoduleID(Module *Mod) {
2414*67e74705SXin Li if (!Mod)
2415*67e74705SXin Li return 0;
2416*67e74705SXin Li
2417*67e74705SXin Li llvm::DenseMap<Module *, unsigned>::iterator Known = SubmoduleIDs.find(Mod);
2418*67e74705SXin Li if (Known != SubmoduleIDs.end())
2419*67e74705SXin Li return Known->second;
2420*67e74705SXin Li
2421*67e74705SXin Li if (Mod->getTopLevelModule() != WritingModule)
2422*67e74705SXin Li return 0;
2423*67e74705SXin Li
2424*67e74705SXin Li return SubmoduleIDs[Mod] = NextSubmoduleID++;
2425*67e74705SXin Li }
2426*67e74705SXin Li
getSubmoduleID(Module * Mod)2427*67e74705SXin Li unsigned ASTWriter::getSubmoduleID(Module *Mod) {
2428*67e74705SXin Li // FIXME: This can easily happen, if we have a reference to a submodule that
2429*67e74705SXin Li // did not result in us loading a module file for that submodule. For
2430*67e74705SXin Li // instance, a cross-top-level-module 'conflict' declaration will hit this.
2431*67e74705SXin Li unsigned ID = getLocalOrImportedSubmoduleID(Mod);
2432*67e74705SXin Li assert((ID || !Mod) &&
2433*67e74705SXin Li "asked for module ID for non-local, non-imported module");
2434*67e74705SXin Li return ID;
2435*67e74705SXin Li }
2436*67e74705SXin Li
2437*67e74705SXin Li /// \brief Compute the number of modules within the given tree (including the
2438*67e74705SXin Li /// given module).
getNumberOfModules(Module * Mod)2439*67e74705SXin Li static unsigned getNumberOfModules(Module *Mod) {
2440*67e74705SXin Li unsigned ChildModules = 0;
2441*67e74705SXin Li for (auto Sub = Mod->submodule_begin(), SubEnd = Mod->submodule_end();
2442*67e74705SXin Li Sub != SubEnd; ++Sub)
2443*67e74705SXin Li ChildModules += getNumberOfModules(*Sub);
2444*67e74705SXin Li
2445*67e74705SXin Li return ChildModules + 1;
2446*67e74705SXin Li }
2447*67e74705SXin Li
WriteSubmodules(Module * WritingModule)2448*67e74705SXin Li void ASTWriter::WriteSubmodules(Module *WritingModule) {
2449*67e74705SXin Li // Enter the submodule description block.
2450*67e74705SXin Li Stream.EnterSubblock(SUBMODULE_BLOCK_ID, /*bits for abbreviations*/5);
2451*67e74705SXin Li
2452*67e74705SXin Li // Write the abbreviations needed for the submodules block.
2453*67e74705SXin Li using namespace llvm;
2454*67e74705SXin Li
2455*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
2456*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_DEFINITION));
2457*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ID
2458*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Parent
2459*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFramework
2460*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExplicit
2461*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsSystem
2462*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExternC
2463*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferSubmodules...
2464*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExplicit...
2465*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExportWild...
2466*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ConfigMacrosExh...
2467*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2468*67e74705SXin Li unsigned DefinitionAbbrev = Stream.EmitAbbrev(Abbrev);
2469*67e74705SXin Li
2470*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2471*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_UMBRELLA_HEADER));
2472*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2473*67e74705SXin Li unsigned UmbrellaAbbrev = Stream.EmitAbbrev(Abbrev);
2474*67e74705SXin Li
2475*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2476*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_HEADER));
2477*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2478*67e74705SXin Li unsigned HeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2479*67e74705SXin Li
2480*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2481*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_TOPHEADER));
2482*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2483*67e74705SXin Li unsigned TopHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2484*67e74705SXin Li
2485*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2486*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_UMBRELLA_DIR));
2487*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2488*67e74705SXin Li unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(Abbrev);
2489*67e74705SXin Li
2490*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2491*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_REQUIRES));
2492*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // State
2493*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Feature
2494*67e74705SXin Li unsigned RequiresAbbrev = Stream.EmitAbbrev(Abbrev);
2495*67e74705SXin Li
2496*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2497*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_EXCLUDED_HEADER));
2498*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2499*67e74705SXin Li unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2500*67e74705SXin Li
2501*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2502*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_TEXTUAL_HEADER));
2503*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2504*67e74705SXin Li unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2505*67e74705SXin Li
2506*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2507*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_PRIVATE_HEADER));
2508*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2509*67e74705SXin Li unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2510*67e74705SXin Li
2511*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2512*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_PRIVATE_TEXTUAL_HEADER));
2513*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2514*67e74705SXin Li unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2515*67e74705SXin Li
2516*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2517*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_LINK_LIBRARY));
2518*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFramework
2519*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2520*67e74705SXin Li unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(Abbrev);
2521*67e74705SXin Li
2522*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2523*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_CONFIG_MACRO));
2524*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Macro name
2525*67e74705SXin Li unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(Abbrev);
2526*67e74705SXin Li
2527*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2528*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_CONFLICT));
2529*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Other module
2530*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Message
2531*67e74705SXin Li unsigned ConflictAbbrev = Stream.EmitAbbrev(Abbrev);
2532*67e74705SXin Li
2533*67e74705SXin Li // Write the submodule metadata block.
2534*67e74705SXin Li RecordData::value_type Record[] = {getNumberOfModules(WritingModule),
2535*67e74705SXin Li FirstSubmoduleID -
2536*67e74705SXin Li NUM_PREDEF_SUBMODULE_IDS};
2537*67e74705SXin Li Stream.EmitRecord(SUBMODULE_METADATA, Record);
2538*67e74705SXin Li
2539*67e74705SXin Li // Write all of the submodules.
2540*67e74705SXin Li std::queue<Module *> Q;
2541*67e74705SXin Li Q.push(WritingModule);
2542*67e74705SXin Li while (!Q.empty()) {
2543*67e74705SXin Li Module *Mod = Q.front();
2544*67e74705SXin Li Q.pop();
2545*67e74705SXin Li unsigned ID = getSubmoduleID(Mod);
2546*67e74705SXin Li
2547*67e74705SXin Li uint64_t ParentID = 0;
2548*67e74705SXin Li if (Mod->Parent) {
2549*67e74705SXin Li assert(SubmoduleIDs[Mod->Parent] && "Submodule parent not written?");
2550*67e74705SXin Li ParentID = SubmoduleIDs[Mod->Parent];
2551*67e74705SXin Li }
2552*67e74705SXin Li
2553*67e74705SXin Li // Emit the definition of the block.
2554*67e74705SXin Li {
2555*67e74705SXin Li RecordData::value_type Record[] = {
2556*67e74705SXin Li SUBMODULE_DEFINITION, ID, ParentID, Mod->IsFramework, Mod->IsExplicit,
2557*67e74705SXin Li Mod->IsSystem, Mod->IsExternC, Mod->InferSubmodules,
2558*67e74705SXin Li Mod->InferExplicitSubmodules, Mod->InferExportWildcard,
2559*67e74705SXin Li Mod->ConfigMacrosExhaustive};
2560*67e74705SXin Li Stream.EmitRecordWithBlob(DefinitionAbbrev, Record, Mod->Name);
2561*67e74705SXin Li }
2562*67e74705SXin Li
2563*67e74705SXin Li // Emit the requirements.
2564*67e74705SXin Li for (const auto &R : Mod->Requirements) {
2565*67e74705SXin Li RecordData::value_type Record[] = {SUBMODULE_REQUIRES, R.second};
2566*67e74705SXin Li Stream.EmitRecordWithBlob(RequiresAbbrev, Record, R.first);
2567*67e74705SXin Li }
2568*67e74705SXin Li
2569*67e74705SXin Li // Emit the umbrella header, if there is one.
2570*67e74705SXin Li if (auto UmbrellaHeader = Mod->getUmbrellaHeader()) {
2571*67e74705SXin Li RecordData::value_type Record[] = {SUBMODULE_UMBRELLA_HEADER};
2572*67e74705SXin Li Stream.EmitRecordWithBlob(UmbrellaAbbrev, Record,
2573*67e74705SXin Li UmbrellaHeader.NameAsWritten);
2574*67e74705SXin Li } else if (auto UmbrellaDir = Mod->getUmbrellaDir()) {
2575*67e74705SXin Li RecordData::value_type Record[] = {SUBMODULE_UMBRELLA_DIR};
2576*67e74705SXin Li Stream.EmitRecordWithBlob(UmbrellaDirAbbrev, Record,
2577*67e74705SXin Li UmbrellaDir.NameAsWritten);
2578*67e74705SXin Li }
2579*67e74705SXin Li
2580*67e74705SXin Li // Emit the headers.
2581*67e74705SXin Li struct {
2582*67e74705SXin Li unsigned RecordKind;
2583*67e74705SXin Li unsigned Abbrev;
2584*67e74705SXin Li Module::HeaderKind HeaderKind;
2585*67e74705SXin Li } HeaderLists[] = {
2586*67e74705SXin Li {SUBMODULE_HEADER, HeaderAbbrev, Module::HK_Normal},
2587*67e74705SXin Li {SUBMODULE_TEXTUAL_HEADER, TextualHeaderAbbrev, Module::HK_Textual},
2588*67e74705SXin Li {SUBMODULE_PRIVATE_HEADER, PrivateHeaderAbbrev, Module::HK_Private},
2589*67e74705SXin Li {SUBMODULE_PRIVATE_TEXTUAL_HEADER, PrivateTextualHeaderAbbrev,
2590*67e74705SXin Li Module::HK_PrivateTextual},
2591*67e74705SXin Li {SUBMODULE_EXCLUDED_HEADER, ExcludedHeaderAbbrev, Module::HK_Excluded}
2592*67e74705SXin Li };
2593*67e74705SXin Li for (auto &HL : HeaderLists) {
2594*67e74705SXin Li RecordData::value_type Record[] = {HL.RecordKind};
2595*67e74705SXin Li for (auto &H : Mod->Headers[HL.HeaderKind])
2596*67e74705SXin Li Stream.EmitRecordWithBlob(HL.Abbrev, Record, H.NameAsWritten);
2597*67e74705SXin Li }
2598*67e74705SXin Li
2599*67e74705SXin Li // Emit the top headers.
2600*67e74705SXin Li {
2601*67e74705SXin Li auto TopHeaders = Mod->getTopHeaders(PP->getFileManager());
2602*67e74705SXin Li RecordData::value_type Record[] = {SUBMODULE_TOPHEADER};
2603*67e74705SXin Li for (auto *H : TopHeaders)
2604*67e74705SXin Li Stream.EmitRecordWithBlob(TopHeaderAbbrev, Record, H->getName());
2605*67e74705SXin Li }
2606*67e74705SXin Li
2607*67e74705SXin Li // Emit the imports.
2608*67e74705SXin Li if (!Mod->Imports.empty()) {
2609*67e74705SXin Li RecordData Record;
2610*67e74705SXin Li for (auto *I : Mod->Imports)
2611*67e74705SXin Li Record.push_back(getSubmoduleID(I));
2612*67e74705SXin Li Stream.EmitRecord(SUBMODULE_IMPORTS, Record);
2613*67e74705SXin Li }
2614*67e74705SXin Li
2615*67e74705SXin Li // Emit the exports.
2616*67e74705SXin Li if (!Mod->Exports.empty()) {
2617*67e74705SXin Li RecordData Record;
2618*67e74705SXin Li for (const auto &E : Mod->Exports) {
2619*67e74705SXin Li // FIXME: This may fail; we don't require that all exported modules
2620*67e74705SXin Li // are local or imported.
2621*67e74705SXin Li Record.push_back(getSubmoduleID(E.getPointer()));
2622*67e74705SXin Li Record.push_back(E.getInt());
2623*67e74705SXin Li }
2624*67e74705SXin Li Stream.EmitRecord(SUBMODULE_EXPORTS, Record);
2625*67e74705SXin Li }
2626*67e74705SXin Li
2627*67e74705SXin Li //FIXME: How do we emit the 'use'd modules? They may not be submodules.
2628*67e74705SXin Li // Might be unnecessary as use declarations are only used to build the
2629*67e74705SXin Li // module itself.
2630*67e74705SXin Li
2631*67e74705SXin Li // Emit the link libraries.
2632*67e74705SXin Li for (const auto &LL : Mod->LinkLibraries) {
2633*67e74705SXin Li RecordData::value_type Record[] = {SUBMODULE_LINK_LIBRARY,
2634*67e74705SXin Li LL.IsFramework};
2635*67e74705SXin Li Stream.EmitRecordWithBlob(LinkLibraryAbbrev, Record, LL.Library);
2636*67e74705SXin Li }
2637*67e74705SXin Li
2638*67e74705SXin Li // Emit the conflicts.
2639*67e74705SXin Li for (const auto &C : Mod->Conflicts) {
2640*67e74705SXin Li // FIXME: This may fail; we don't require that all conflicting modules
2641*67e74705SXin Li // are local or imported.
2642*67e74705SXin Li RecordData::value_type Record[] = {SUBMODULE_CONFLICT,
2643*67e74705SXin Li getSubmoduleID(C.Other)};
2644*67e74705SXin Li Stream.EmitRecordWithBlob(ConflictAbbrev, Record, C.Message);
2645*67e74705SXin Li }
2646*67e74705SXin Li
2647*67e74705SXin Li // Emit the configuration macros.
2648*67e74705SXin Li for (const auto &CM : Mod->ConfigMacros) {
2649*67e74705SXin Li RecordData::value_type Record[] = {SUBMODULE_CONFIG_MACRO};
2650*67e74705SXin Li Stream.EmitRecordWithBlob(ConfigMacroAbbrev, Record, CM);
2651*67e74705SXin Li }
2652*67e74705SXin Li
2653*67e74705SXin Li // Queue up the submodules of this module.
2654*67e74705SXin Li for (auto *M : Mod->submodules())
2655*67e74705SXin Li Q.push(M);
2656*67e74705SXin Li }
2657*67e74705SXin Li
2658*67e74705SXin Li Stream.ExitBlock();
2659*67e74705SXin Li
2660*67e74705SXin Li assert((NextSubmoduleID - FirstSubmoduleID ==
2661*67e74705SXin Li getNumberOfModules(WritingModule)) &&
2662*67e74705SXin Li "Wrong # of submodules; found a reference to a non-local, "
2663*67e74705SXin Li "non-imported submodule?");
2664*67e74705SXin Li }
2665*67e74705SXin Li
2666*67e74705SXin Li serialization::SubmoduleID
inferSubmoduleIDFromLocation(SourceLocation Loc)2667*67e74705SXin Li ASTWriter::inferSubmoduleIDFromLocation(SourceLocation Loc) {
2668*67e74705SXin Li if (Loc.isInvalid() || !WritingModule)
2669*67e74705SXin Li return 0; // No submodule
2670*67e74705SXin Li
2671*67e74705SXin Li // Find the module that owns this location.
2672*67e74705SXin Li ModuleMap &ModMap = PP->getHeaderSearchInfo().getModuleMap();
2673*67e74705SXin Li Module *OwningMod
2674*67e74705SXin Li = ModMap.inferModuleFromLocation(FullSourceLoc(Loc,PP->getSourceManager()));
2675*67e74705SXin Li if (!OwningMod)
2676*67e74705SXin Li return 0;
2677*67e74705SXin Li
2678*67e74705SXin Li // Check whether this submodule is part of our own module.
2679*67e74705SXin Li if (WritingModule != OwningMod && !OwningMod->isSubModuleOf(WritingModule))
2680*67e74705SXin Li return 0;
2681*67e74705SXin Li
2682*67e74705SXin Li return getSubmoduleID(OwningMod);
2683*67e74705SXin Li }
2684*67e74705SXin Li
WritePragmaDiagnosticMappings(const DiagnosticsEngine & Diag,bool isModule)2685*67e74705SXin Li void ASTWriter::WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag,
2686*67e74705SXin Li bool isModule) {
2687*67e74705SXin Li // Make sure set diagnostic pragmas don't affect the translation unit that
2688*67e74705SXin Li // imports the module.
2689*67e74705SXin Li // FIXME: Make diagnostic pragma sections work properly with modules.
2690*67e74705SXin Li if (isModule)
2691*67e74705SXin Li return;
2692*67e74705SXin Li
2693*67e74705SXin Li llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
2694*67e74705SXin Li DiagStateIDMap;
2695*67e74705SXin Li unsigned CurrID = 0;
2696*67e74705SXin Li DiagStateIDMap[&Diag.DiagStates.front()] = ++CurrID; // the command-line one.
2697*67e74705SXin Li RecordData Record;
2698*67e74705SXin Li for (DiagnosticsEngine::DiagStatePointsTy::const_iterator
2699*67e74705SXin Li I = Diag.DiagStatePoints.begin(), E = Diag.DiagStatePoints.end();
2700*67e74705SXin Li I != E; ++I) {
2701*67e74705SXin Li const DiagnosticsEngine::DiagStatePoint &point = *I;
2702*67e74705SXin Li if (point.Loc.isInvalid())
2703*67e74705SXin Li continue;
2704*67e74705SXin Li
2705*67e74705SXin Li AddSourceLocation(point.Loc, Record);
2706*67e74705SXin Li unsigned &DiagStateID = DiagStateIDMap[point.State];
2707*67e74705SXin Li Record.push_back(DiagStateID);
2708*67e74705SXin Li
2709*67e74705SXin Li if (DiagStateID == 0) {
2710*67e74705SXin Li DiagStateID = ++CurrID;
2711*67e74705SXin Li for (const auto &I : *(point.State)) {
2712*67e74705SXin Li if (I.second.isPragma()) {
2713*67e74705SXin Li Record.push_back(I.first);
2714*67e74705SXin Li Record.push_back((unsigned)I.second.getSeverity());
2715*67e74705SXin Li }
2716*67e74705SXin Li }
2717*67e74705SXin Li Record.push_back(-1); // mark the end of the diag/map pairs for this
2718*67e74705SXin Li // location.
2719*67e74705SXin Li }
2720*67e74705SXin Li }
2721*67e74705SXin Li
2722*67e74705SXin Li if (!Record.empty())
2723*67e74705SXin Li Stream.EmitRecord(DIAG_PRAGMA_MAPPINGS, Record);
2724*67e74705SXin Li }
2725*67e74705SXin Li
2726*67e74705SXin Li //===----------------------------------------------------------------------===//
2727*67e74705SXin Li // Type Serialization
2728*67e74705SXin Li //===----------------------------------------------------------------------===//
2729*67e74705SXin Li
2730*67e74705SXin Li /// \brief Write the representation of a type to the AST stream.
WriteType(QualType T)2731*67e74705SXin Li void ASTWriter::WriteType(QualType T) {
2732*67e74705SXin Li TypeIdx &IdxRef = TypeIdxs[T];
2733*67e74705SXin Li if (IdxRef.getIndex() == 0) // we haven't seen this type before.
2734*67e74705SXin Li IdxRef = TypeIdx(NextTypeID++);
2735*67e74705SXin Li TypeIdx Idx = IdxRef;
2736*67e74705SXin Li
2737*67e74705SXin Li assert(Idx.getIndex() >= FirstTypeID && "Re-writing a type from a prior AST");
2738*67e74705SXin Li
2739*67e74705SXin Li RecordData Record;
2740*67e74705SXin Li
2741*67e74705SXin Li // Emit the type's representation.
2742*67e74705SXin Li ASTTypeWriter W(*this, Record);
2743*67e74705SXin Li W.Visit(T);
2744*67e74705SXin Li uint64_t Offset = W.Emit();
2745*67e74705SXin Li
2746*67e74705SXin Li // Record the offset for this type.
2747*67e74705SXin Li unsigned Index = Idx.getIndex() - FirstTypeID;
2748*67e74705SXin Li if (TypeOffsets.size() == Index)
2749*67e74705SXin Li TypeOffsets.push_back(Offset);
2750*67e74705SXin Li else if (TypeOffsets.size() < Index) {
2751*67e74705SXin Li TypeOffsets.resize(Index + 1);
2752*67e74705SXin Li TypeOffsets[Index] = Offset;
2753*67e74705SXin Li } else {
2754*67e74705SXin Li llvm_unreachable("Types emitted in wrong order");
2755*67e74705SXin Li }
2756*67e74705SXin Li }
2757*67e74705SXin Li
2758*67e74705SXin Li //===----------------------------------------------------------------------===//
2759*67e74705SXin Li // Declaration Serialization
2760*67e74705SXin Li //===----------------------------------------------------------------------===//
2761*67e74705SXin Li
2762*67e74705SXin Li /// \brief Write the block containing all of the declaration IDs
2763*67e74705SXin Li /// lexically declared within the given DeclContext.
2764*67e74705SXin Li ///
2765*67e74705SXin Li /// \returns the offset of the DECL_CONTEXT_LEXICAL block within the
2766*67e74705SXin Li /// bistream, or 0 if no block was written.
WriteDeclContextLexicalBlock(ASTContext & Context,DeclContext * DC)2767*67e74705SXin Li uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
2768*67e74705SXin Li DeclContext *DC) {
2769*67e74705SXin Li if (DC->decls_empty())
2770*67e74705SXin Li return 0;
2771*67e74705SXin Li
2772*67e74705SXin Li uint64_t Offset = Stream.GetCurrentBitNo();
2773*67e74705SXin Li SmallVector<uint32_t, 128> KindDeclPairs;
2774*67e74705SXin Li for (const auto *D : DC->decls()) {
2775*67e74705SXin Li KindDeclPairs.push_back(D->getKind());
2776*67e74705SXin Li KindDeclPairs.push_back(GetDeclRef(D));
2777*67e74705SXin Li }
2778*67e74705SXin Li
2779*67e74705SXin Li ++NumLexicalDeclContexts;
2780*67e74705SXin Li RecordData::value_type Record[] = {DECL_CONTEXT_LEXICAL};
2781*67e74705SXin Li Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev, Record,
2782*67e74705SXin Li bytes(KindDeclPairs));
2783*67e74705SXin Li return Offset;
2784*67e74705SXin Li }
2785*67e74705SXin Li
WriteTypeDeclOffsets()2786*67e74705SXin Li void ASTWriter::WriteTypeDeclOffsets() {
2787*67e74705SXin Li using namespace llvm;
2788*67e74705SXin Li
2789*67e74705SXin Li // Write the type offsets array
2790*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
2791*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(TYPE_OFFSET));
2792*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of types
2793*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base type index
2794*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // types block
2795*67e74705SXin Li unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2796*67e74705SXin Li {
2797*67e74705SXin Li RecordData::value_type Record[] = {TYPE_OFFSET, TypeOffsets.size(),
2798*67e74705SXin Li FirstTypeID - NUM_PREDEF_TYPE_IDS};
2799*67e74705SXin Li Stream.EmitRecordWithBlob(TypeOffsetAbbrev, Record, bytes(TypeOffsets));
2800*67e74705SXin Li }
2801*67e74705SXin Li
2802*67e74705SXin Li // Write the declaration offsets array
2803*67e74705SXin Li Abbrev = new BitCodeAbbrev();
2804*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(DECL_OFFSET));
2805*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of declarations
2806*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base decl ID
2807*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // declarations block
2808*67e74705SXin Li unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2809*67e74705SXin Li {
2810*67e74705SXin Li RecordData::value_type Record[] = {DECL_OFFSET, DeclOffsets.size(),
2811*67e74705SXin Li FirstDeclID - NUM_PREDEF_DECL_IDS};
2812*67e74705SXin Li Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record, bytes(DeclOffsets));
2813*67e74705SXin Li }
2814*67e74705SXin Li }
2815*67e74705SXin Li
WriteFileDeclIDsMap()2816*67e74705SXin Li void ASTWriter::WriteFileDeclIDsMap() {
2817*67e74705SXin Li using namespace llvm;
2818*67e74705SXin Li
2819*67e74705SXin Li SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs(
2820*67e74705SXin Li FileDeclIDs.begin(), FileDeclIDs.end());
2821*67e74705SXin Li std::sort(SortedFileDeclIDs.begin(), SortedFileDeclIDs.end(),
2822*67e74705SXin Li llvm::less_first());
2823*67e74705SXin Li
2824*67e74705SXin Li // Join the vectors of DeclIDs from all files.
2825*67e74705SXin Li SmallVector<DeclID, 256> FileGroupedDeclIDs;
2826*67e74705SXin Li for (auto &FileDeclEntry : SortedFileDeclIDs) {
2827*67e74705SXin Li DeclIDInFileInfo &Info = *FileDeclEntry.second;
2828*67e74705SXin Li Info.FirstDeclIndex = FileGroupedDeclIDs.size();
2829*67e74705SXin Li for (auto &LocDeclEntry : Info.DeclIDs)
2830*67e74705SXin Li FileGroupedDeclIDs.push_back(LocDeclEntry.second);
2831*67e74705SXin Li }
2832*67e74705SXin Li
2833*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
2834*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(FILE_SORTED_DECLS));
2835*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2836*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2837*67e74705SXin Li unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);
2838*67e74705SXin Li RecordData::value_type Record[] = {FILE_SORTED_DECLS,
2839*67e74705SXin Li FileGroupedDeclIDs.size()};
2840*67e74705SXin Li Stream.EmitRecordWithBlob(AbbrevCode, Record, bytes(FileGroupedDeclIDs));
2841*67e74705SXin Li }
2842*67e74705SXin Li
WriteComments()2843*67e74705SXin Li void ASTWriter::WriteComments() {
2844*67e74705SXin Li Stream.EnterSubblock(COMMENTS_BLOCK_ID, 3);
2845*67e74705SXin Li ArrayRef<RawComment *> RawComments = Context->Comments.getComments();
2846*67e74705SXin Li RecordData Record;
2847*67e74705SXin Li for (const auto *I : RawComments) {
2848*67e74705SXin Li Record.clear();
2849*67e74705SXin Li AddSourceRange(I->getSourceRange(), Record);
2850*67e74705SXin Li Record.push_back(I->getKind());
2851*67e74705SXin Li Record.push_back(I->isTrailingComment());
2852*67e74705SXin Li Record.push_back(I->isAlmostTrailingComment());
2853*67e74705SXin Li Stream.EmitRecord(COMMENTS_RAW_COMMENT, Record);
2854*67e74705SXin Li }
2855*67e74705SXin Li Stream.ExitBlock();
2856*67e74705SXin Li }
2857*67e74705SXin Li
2858*67e74705SXin Li //===----------------------------------------------------------------------===//
2859*67e74705SXin Li // Global Method Pool and Selector Serialization
2860*67e74705SXin Li //===----------------------------------------------------------------------===//
2861*67e74705SXin Li
2862*67e74705SXin Li namespace {
2863*67e74705SXin Li // Trait used for the on-disk hash table used in the method pool.
2864*67e74705SXin Li class ASTMethodPoolTrait {
2865*67e74705SXin Li ASTWriter &Writer;
2866*67e74705SXin Li
2867*67e74705SXin Li public:
2868*67e74705SXin Li typedef Selector key_type;
2869*67e74705SXin Li typedef key_type key_type_ref;
2870*67e74705SXin Li
2871*67e74705SXin Li struct data_type {
2872*67e74705SXin Li SelectorID ID;
2873*67e74705SXin Li ObjCMethodList Instance, Factory;
2874*67e74705SXin Li };
2875*67e74705SXin Li typedef const data_type& data_type_ref;
2876*67e74705SXin Li
2877*67e74705SXin Li typedef unsigned hash_value_type;
2878*67e74705SXin Li typedef unsigned offset_type;
2879*67e74705SXin Li
ASTMethodPoolTrait(ASTWriter & Writer)2880*67e74705SXin Li explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) { }
2881*67e74705SXin Li
ComputeHash(Selector Sel)2882*67e74705SXin Li static hash_value_type ComputeHash(Selector Sel) {
2883*67e74705SXin Li return serialization::ComputeHash(Sel);
2884*67e74705SXin Li }
2885*67e74705SXin Li
2886*67e74705SXin Li std::pair<unsigned,unsigned>
EmitKeyDataLength(raw_ostream & Out,Selector Sel,data_type_ref Methods)2887*67e74705SXin Li EmitKeyDataLength(raw_ostream& Out, Selector Sel,
2888*67e74705SXin Li data_type_ref Methods) {
2889*67e74705SXin Li using namespace llvm::support;
2890*67e74705SXin Li endian::Writer<little> LE(Out);
2891*67e74705SXin Li unsigned KeyLen = 2 + (Sel.getNumArgs()? Sel.getNumArgs() * 4 : 4);
2892*67e74705SXin Li LE.write<uint16_t>(KeyLen);
2893*67e74705SXin Li unsigned DataLen = 4 + 2 + 2; // 2 bytes for each of the method counts
2894*67e74705SXin Li for (const ObjCMethodList *Method = &Methods.Instance; Method;
2895*67e74705SXin Li Method = Method->getNext())
2896*67e74705SXin Li if (Method->getMethod())
2897*67e74705SXin Li DataLen += 4;
2898*67e74705SXin Li for (const ObjCMethodList *Method = &Methods.Factory; Method;
2899*67e74705SXin Li Method = Method->getNext())
2900*67e74705SXin Li if (Method->getMethod())
2901*67e74705SXin Li DataLen += 4;
2902*67e74705SXin Li LE.write<uint16_t>(DataLen);
2903*67e74705SXin Li return std::make_pair(KeyLen, DataLen);
2904*67e74705SXin Li }
2905*67e74705SXin Li
EmitKey(raw_ostream & Out,Selector Sel,unsigned)2906*67e74705SXin Li void EmitKey(raw_ostream& Out, Selector Sel, unsigned) {
2907*67e74705SXin Li using namespace llvm::support;
2908*67e74705SXin Li endian::Writer<little> LE(Out);
2909*67e74705SXin Li uint64_t Start = Out.tell();
2910*67e74705SXin Li assert((Start >> 32) == 0 && "Selector key offset too large");
2911*67e74705SXin Li Writer.SetSelectorOffset(Sel, Start);
2912*67e74705SXin Li unsigned N = Sel.getNumArgs();
2913*67e74705SXin Li LE.write<uint16_t>(N);
2914*67e74705SXin Li if (N == 0)
2915*67e74705SXin Li N = 1;
2916*67e74705SXin Li for (unsigned I = 0; I != N; ++I)
2917*67e74705SXin Li LE.write<uint32_t>(
2918*67e74705SXin Li Writer.getIdentifierRef(Sel.getIdentifierInfoForSlot(I)));
2919*67e74705SXin Li }
2920*67e74705SXin Li
EmitData(raw_ostream & Out,key_type_ref,data_type_ref Methods,unsigned DataLen)2921*67e74705SXin Li void EmitData(raw_ostream& Out, key_type_ref,
2922*67e74705SXin Li data_type_ref Methods, unsigned DataLen) {
2923*67e74705SXin Li using namespace llvm::support;
2924*67e74705SXin Li endian::Writer<little> LE(Out);
2925*67e74705SXin Li uint64_t Start = Out.tell(); (void)Start;
2926*67e74705SXin Li LE.write<uint32_t>(Methods.ID);
2927*67e74705SXin Li unsigned NumInstanceMethods = 0;
2928*67e74705SXin Li for (const ObjCMethodList *Method = &Methods.Instance; Method;
2929*67e74705SXin Li Method = Method->getNext())
2930*67e74705SXin Li if (Method->getMethod())
2931*67e74705SXin Li ++NumInstanceMethods;
2932*67e74705SXin Li
2933*67e74705SXin Li unsigned NumFactoryMethods = 0;
2934*67e74705SXin Li for (const ObjCMethodList *Method = &Methods.Factory; Method;
2935*67e74705SXin Li Method = Method->getNext())
2936*67e74705SXin Li if (Method->getMethod())
2937*67e74705SXin Li ++NumFactoryMethods;
2938*67e74705SXin Li
2939*67e74705SXin Li unsigned InstanceBits = Methods.Instance.getBits();
2940*67e74705SXin Li assert(InstanceBits < 4);
2941*67e74705SXin Li unsigned InstanceHasMoreThanOneDeclBit =
2942*67e74705SXin Li Methods.Instance.hasMoreThanOneDecl();
2943*67e74705SXin Li unsigned FullInstanceBits = (NumInstanceMethods << 3) |
2944*67e74705SXin Li (InstanceHasMoreThanOneDeclBit << 2) |
2945*67e74705SXin Li InstanceBits;
2946*67e74705SXin Li unsigned FactoryBits = Methods.Factory.getBits();
2947*67e74705SXin Li assert(FactoryBits < 4);
2948*67e74705SXin Li unsigned FactoryHasMoreThanOneDeclBit =
2949*67e74705SXin Li Methods.Factory.hasMoreThanOneDecl();
2950*67e74705SXin Li unsigned FullFactoryBits = (NumFactoryMethods << 3) |
2951*67e74705SXin Li (FactoryHasMoreThanOneDeclBit << 2) |
2952*67e74705SXin Li FactoryBits;
2953*67e74705SXin Li LE.write<uint16_t>(FullInstanceBits);
2954*67e74705SXin Li LE.write<uint16_t>(FullFactoryBits);
2955*67e74705SXin Li for (const ObjCMethodList *Method = &Methods.Instance; Method;
2956*67e74705SXin Li Method = Method->getNext())
2957*67e74705SXin Li if (Method->getMethod())
2958*67e74705SXin Li LE.write<uint32_t>(Writer.getDeclID(Method->getMethod()));
2959*67e74705SXin Li for (const ObjCMethodList *Method = &Methods.Factory; Method;
2960*67e74705SXin Li Method = Method->getNext())
2961*67e74705SXin Li if (Method->getMethod())
2962*67e74705SXin Li LE.write<uint32_t>(Writer.getDeclID(Method->getMethod()));
2963*67e74705SXin Li
2964*67e74705SXin Li assert(Out.tell() - Start == DataLen && "Data length is wrong");
2965*67e74705SXin Li }
2966*67e74705SXin Li };
2967*67e74705SXin Li } // end anonymous namespace
2968*67e74705SXin Li
2969*67e74705SXin Li /// \brief Write ObjC data: selectors and the method pool.
2970*67e74705SXin Li ///
2971*67e74705SXin Li /// The method pool contains both instance and factory methods, stored
2972*67e74705SXin Li /// in an on-disk hash table indexed by the selector. The hash table also
2973*67e74705SXin Li /// contains an empty entry for every other selector known to Sema.
WriteSelectors(Sema & SemaRef)2974*67e74705SXin Li void ASTWriter::WriteSelectors(Sema &SemaRef) {
2975*67e74705SXin Li using namespace llvm;
2976*67e74705SXin Li
2977*67e74705SXin Li // Do we have to do anything at all?
2978*67e74705SXin Li if (SemaRef.MethodPool.empty() && SelectorIDs.empty())
2979*67e74705SXin Li return;
2980*67e74705SXin Li unsigned NumTableEntries = 0;
2981*67e74705SXin Li // Create and write out the blob that contains selectors and the method pool.
2982*67e74705SXin Li {
2983*67e74705SXin Li llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait> Generator;
2984*67e74705SXin Li ASTMethodPoolTrait Trait(*this);
2985*67e74705SXin Li
2986*67e74705SXin Li // Create the on-disk hash table representation. We walk through every
2987*67e74705SXin Li // selector we've seen and look it up in the method pool.
2988*67e74705SXin Li SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
2989*67e74705SXin Li for (auto &SelectorAndID : SelectorIDs) {
2990*67e74705SXin Li Selector S = SelectorAndID.first;
2991*67e74705SXin Li SelectorID ID = SelectorAndID.second;
2992*67e74705SXin Li Sema::GlobalMethodPool::iterator F = SemaRef.MethodPool.find(S);
2993*67e74705SXin Li ASTMethodPoolTrait::data_type Data = {
2994*67e74705SXin Li ID,
2995*67e74705SXin Li ObjCMethodList(),
2996*67e74705SXin Li ObjCMethodList()
2997*67e74705SXin Li };
2998*67e74705SXin Li if (F != SemaRef.MethodPool.end()) {
2999*67e74705SXin Li Data.Instance = F->second.first;
3000*67e74705SXin Li Data.Factory = F->second.second;
3001*67e74705SXin Li }
3002*67e74705SXin Li // Only write this selector if it's not in an existing AST or something
3003*67e74705SXin Li // changed.
3004*67e74705SXin Li if (Chain && ID < FirstSelectorID) {
3005*67e74705SXin Li // Selector already exists. Did it change?
3006*67e74705SXin Li bool changed = false;
3007*67e74705SXin Li for (ObjCMethodList *M = &Data.Instance;
3008*67e74705SXin Li !changed && M && M->getMethod(); M = M->getNext()) {
3009*67e74705SXin Li if (!M->getMethod()->isFromASTFile())
3010*67e74705SXin Li changed = true;
3011*67e74705SXin Li }
3012*67e74705SXin Li for (ObjCMethodList *M = &Data.Factory; !changed && M && M->getMethod();
3013*67e74705SXin Li M = M->getNext()) {
3014*67e74705SXin Li if (!M->getMethod()->isFromASTFile())
3015*67e74705SXin Li changed = true;
3016*67e74705SXin Li }
3017*67e74705SXin Li if (!changed)
3018*67e74705SXin Li continue;
3019*67e74705SXin Li } else if (Data.Instance.getMethod() || Data.Factory.getMethod()) {
3020*67e74705SXin Li // A new method pool entry.
3021*67e74705SXin Li ++NumTableEntries;
3022*67e74705SXin Li }
3023*67e74705SXin Li Generator.insert(S, Data, Trait);
3024*67e74705SXin Li }
3025*67e74705SXin Li
3026*67e74705SXin Li // Create the on-disk hash table in a buffer.
3027*67e74705SXin Li SmallString<4096> MethodPool;
3028*67e74705SXin Li uint32_t BucketOffset;
3029*67e74705SXin Li {
3030*67e74705SXin Li using namespace llvm::support;
3031*67e74705SXin Li ASTMethodPoolTrait Trait(*this);
3032*67e74705SXin Li llvm::raw_svector_ostream Out(MethodPool);
3033*67e74705SXin Li // Make sure that no bucket is at offset 0
3034*67e74705SXin Li endian::Writer<little>(Out).write<uint32_t>(0);
3035*67e74705SXin Li BucketOffset = Generator.Emit(Out, Trait);
3036*67e74705SXin Li }
3037*67e74705SXin Li
3038*67e74705SXin Li // Create a blob abbreviation
3039*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
3040*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(METHOD_POOL));
3041*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3042*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3043*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3044*67e74705SXin Li unsigned MethodPoolAbbrev = Stream.EmitAbbrev(Abbrev);
3045*67e74705SXin Li
3046*67e74705SXin Li // Write the method pool
3047*67e74705SXin Li {
3048*67e74705SXin Li RecordData::value_type Record[] = {METHOD_POOL, BucketOffset,
3049*67e74705SXin Li NumTableEntries};
3050*67e74705SXin Li Stream.EmitRecordWithBlob(MethodPoolAbbrev, Record, MethodPool);
3051*67e74705SXin Li }
3052*67e74705SXin Li
3053*67e74705SXin Li // Create a blob abbreviation for the selector table offsets.
3054*67e74705SXin Li Abbrev = new BitCodeAbbrev();
3055*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(SELECTOR_OFFSETS));
3056*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // size
3057*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID
3058*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3059*67e74705SXin Li unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
3060*67e74705SXin Li
3061*67e74705SXin Li // Write the selector offsets table.
3062*67e74705SXin Li {
3063*67e74705SXin Li RecordData::value_type Record[] = {
3064*67e74705SXin Li SELECTOR_OFFSETS, SelectorOffsets.size(),
3065*67e74705SXin Li FirstSelectorID - NUM_PREDEF_SELECTOR_IDS};
3066*67e74705SXin Li Stream.EmitRecordWithBlob(SelectorOffsetAbbrev, Record,
3067*67e74705SXin Li bytes(SelectorOffsets));
3068*67e74705SXin Li }
3069*67e74705SXin Li }
3070*67e74705SXin Li }
3071*67e74705SXin Li
3072*67e74705SXin Li /// \brief Write the selectors referenced in @selector expression into AST file.
WriteReferencedSelectorsPool(Sema & SemaRef)3073*67e74705SXin Li void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) {
3074*67e74705SXin Li using namespace llvm;
3075*67e74705SXin Li if (SemaRef.ReferencedSelectors.empty())
3076*67e74705SXin Li return;
3077*67e74705SXin Li
3078*67e74705SXin Li RecordData Record;
3079*67e74705SXin Li ASTRecordWriter Writer(*this, Record);
3080*67e74705SXin Li
3081*67e74705SXin Li // Note: this writes out all references even for a dependent AST. But it is
3082*67e74705SXin Li // very tricky to fix, and given that @selector shouldn't really appear in
3083*67e74705SXin Li // headers, probably not worth it. It's not a correctness issue.
3084*67e74705SXin Li for (auto &SelectorAndLocation : SemaRef.ReferencedSelectors) {
3085*67e74705SXin Li Selector Sel = SelectorAndLocation.first;
3086*67e74705SXin Li SourceLocation Loc = SelectorAndLocation.second;
3087*67e74705SXin Li Writer.AddSelectorRef(Sel);
3088*67e74705SXin Li Writer.AddSourceLocation(Loc);
3089*67e74705SXin Li }
3090*67e74705SXin Li Writer.Emit(REFERENCED_SELECTOR_POOL);
3091*67e74705SXin Li }
3092*67e74705SXin Li
3093*67e74705SXin Li //===----------------------------------------------------------------------===//
3094*67e74705SXin Li // Identifier Table Serialization
3095*67e74705SXin Li //===----------------------------------------------------------------------===//
3096*67e74705SXin Li
3097*67e74705SXin Li /// Determine the declaration that should be put into the name lookup table to
3098*67e74705SXin Li /// represent the given declaration in this module. This is usually D itself,
3099*67e74705SXin Li /// but if D was imported and merged into a local declaration, we want the most
3100*67e74705SXin Li /// recent local declaration instead. The chosen declaration will be the most
3101*67e74705SXin Li /// recent declaration in any module that imports this one.
getDeclForLocalLookup(const LangOptions & LangOpts,NamedDecl * D)3102*67e74705SXin Li static NamedDecl *getDeclForLocalLookup(const LangOptions &LangOpts,
3103*67e74705SXin Li NamedDecl *D) {
3104*67e74705SXin Li if (!LangOpts.Modules || !D->isFromASTFile())
3105*67e74705SXin Li return D;
3106*67e74705SXin Li
3107*67e74705SXin Li if (Decl *Redecl = D->getPreviousDecl()) {
3108*67e74705SXin Li // For Redeclarable decls, a prior declaration might be local.
3109*67e74705SXin Li for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3110*67e74705SXin Li // If we find a local decl, we're done.
3111*67e74705SXin Li if (!Redecl->isFromASTFile()) {
3112*67e74705SXin Li // Exception: in very rare cases (for injected-class-names), not all
3113*67e74705SXin Li // redeclarations are in the same semantic context. Skip ones in a
3114*67e74705SXin Li // different context. They don't go in this lookup table at all.
3115*67e74705SXin Li if (!Redecl->getDeclContext()->getRedeclContext()->Equals(
3116*67e74705SXin Li D->getDeclContext()->getRedeclContext()))
3117*67e74705SXin Li continue;
3118*67e74705SXin Li return cast<NamedDecl>(Redecl);
3119*67e74705SXin Li }
3120*67e74705SXin Li
3121*67e74705SXin Li // If we find a decl from a (chained-)PCH stop since we won't find a
3122*67e74705SXin Li // local one.
3123*67e74705SXin Li if (Redecl->getOwningModuleID() == 0)
3124*67e74705SXin Li break;
3125*67e74705SXin Li }
3126*67e74705SXin Li } else if (Decl *First = D->getCanonicalDecl()) {
3127*67e74705SXin Li // For Mergeable decls, the first decl might be local.
3128*67e74705SXin Li if (!First->isFromASTFile())
3129*67e74705SXin Li return cast<NamedDecl>(First);
3130*67e74705SXin Li }
3131*67e74705SXin Li
3132*67e74705SXin Li // All declarations are imported. Our most recent declaration will also be
3133*67e74705SXin Li // the most recent one in anyone who imports us.
3134*67e74705SXin Li return D;
3135*67e74705SXin Li }
3136*67e74705SXin Li
3137*67e74705SXin Li namespace {
3138*67e74705SXin Li class ASTIdentifierTableTrait {
3139*67e74705SXin Li ASTWriter &Writer;
3140*67e74705SXin Li Preprocessor &PP;
3141*67e74705SXin Li IdentifierResolver &IdResolver;
3142*67e74705SXin Li bool IsModule;
3143*67e74705SXin Li bool NeedDecls;
3144*67e74705SXin Li ASTWriter::RecordData *InterestingIdentifierOffsets;
3145*67e74705SXin Li
3146*67e74705SXin Li /// \brief Determines whether this is an "interesting" identifier that needs a
3147*67e74705SXin Li /// full IdentifierInfo structure written into the hash table. Notably, this
3148*67e74705SXin Li /// doesn't check whether the name has macros defined; use PublicMacroIterator
3149*67e74705SXin Li /// to check that.
isInterestingIdentifier(const IdentifierInfo * II,uint64_t MacroOffset)3150*67e74705SXin Li bool isInterestingIdentifier(const IdentifierInfo *II, uint64_t MacroOffset) {
3151*67e74705SXin Li if (MacroOffset ||
3152*67e74705SXin Li II->isPoisoned() ||
3153*67e74705SXin Li (IsModule ? II->hasRevertedBuiltin() : II->getObjCOrBuiltinID()) ||
3154*67e74705SXin Li II->hasRevertedTokenIDToIdentifier() ||
3155*67e74705SXin Li (NeedDecls && II->getFETokenInfo<void>()))
3156*67e74705SXin Li return true;
3157*67e74705SXin Li
3158*67e74705SXin Li return false;
3159*67e74705SXin Li }
3160*67e74705SXin Li
3161*67e74705SXin Li public:
3162*67e74705SXin Li typedef IdentifierInfo* key_type;
3163*67e74705SXin Li typedef key_type key_type_ref;
3164*67e74705SXin Li
3165*67e74705SXin Li typedef IdentID data_type;
3166*67e74705SXin Li typedef data_type data_type_ref;
3167*67e74705SXin Li
3168*67e74705SXin Li typedef unsigned hash_value_type;
3169*67e74705SXin Li typedef unsigned offset_type;
3170*67e74705SXin Li
ASTIdentifierTableTrait(ASTWriter & Writer,Preprocessor & PP,IdentifierResolver & IdResolver,bool IsModule,ASTWriter::RecordData * InterestingIdentifierOffsets)3171*67e74705SXin Li ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP,
3172*67e74705SXin Li IdentifierResolver &IdResolver, bool IsModule,
3173*67e74705SXin Li ASTWriter::RecordData *InterestingIdentifierOffsets)
3174*67e74705SXin Li : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3175*67e74705SXin Li NeedDecls(!IsModule || !Writer.getLangOpts().CPlusPlus),
3176*67e74705SXin Li InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3177*67e74705SXin Li
needDecls() const3178*67e74705SXin Li bool needDecls() const { return NeedDecls; }
3179*67e74705SXin Li
ComputeHash(const IdentifierInfo * II)3180*67e74705SXin Li static hash_value_type ComputeHash(const IdentifierInfo* II) {
3181*67e74705SXin Li return llvm::HashString(II->getName());
3182*67e74705SXin Li }
3183*67e74705SXin Li
isInterestingIdentifier(const IdentifierInfo * II)3184*67e74705SXin Li bool isInterestingIdentifier(const IdentifierInfo *II) {
3185*67e74705SXin Li auto MacroOffset = Writer.getMacroDirectivesOffset(II);
3186*67e74705SXin Li return isInterestingIdentifier(II, MacroOffset);
3187*67e74705SXin Li }
isInterestingNonMacroIdentifier(const IdentifierInfo * II)3188*67e74705SXin Li bool isInterestingNonMacroIdentifier(const IdentifierInfo *II) {
3189*67e74705SXin Li return isInterestingIdentifier(II, 0);
3190*67e74705SXin Li }
3191*67e74705SXin Li
3192*67e74705SXin Li std::pair<unsigned,unsigned>
EmitKeyDataLength(raw_ostream & Out,IdentifierInfo * II,IdentID ID)3193*67e74705SXin Li EmitKeyDataLength(raw_ostream& Out, IdentifierInfo* II, IdentID ID) {
3194*67e74705SXin Li unsigned KeyLen = II->getLength() + 1;
3195*67e74705SXin Li unsigned DataLen = 4; // 4 bytes for the persistent ID << 1
3196*67e74705SXin Li auto MacroOffset = Writer.getMacroDirectivesOffset(II);
3197*67e74705SXin Li if (isInterestingIdentifier(II, MacroOffset)) {
3198*67e74705SXin Li DataLen += 2; // 2 bytes for builtin ID
3199*67e74705SXin Li DataLen += 2; // 2 bytes for flags
3200*67e74705SXin Li if (MacroOffset)
3201*67e74705SXin Li DataLen += 4; // MacroDirectives offset.
3202*67e74705SXin Li
3203*67e74705SXin Li if (NeedDecls) {
3204*67e74705SXin Li for (IdentifierResolver::iterator D = IdResolver.begin(II),
3205*67e74705SXin Li DEnd = IdResolver.end();
3206*67e74705SXin Li D != DEnd; ++D)
3207*67e74705SXin Li DataLen += 4;
3208*67e74705SXin Li }
3209*67e74705SXin Li }
3210*67e74705SXin Li using namespace llvm::support;
3211*67e74705SXin Li endian::Writer<little> LE(Out);
3212*67e74705SXin Li
3213*67e74705SXin Li assert((uint16_t)DataLen == DataLen && (uint16_t)KeyLen == KeyLen);
3214*67e74705SXin Li LE.write<uint16_t>(DataLen);
3215*67e74705SXin Li // We emit the key length after the data length so that every
3216*67e74705SXin Li // string is preceded by a 16-bit length. This matches the PTH
3217*67e74705SXin Li // format for storing identifiers.
3218*67e74705SXin Li LE.write<uint16_t>(KeyLen);
3219*67e74705SXin Li return std::make_pair(KeyLen, DataLen);
3220*67e74705SXin Li }
3221*67e74705SXin Li
EmitKey(raw_ostream & Out,const IdentifierInfo * II,unsigned KeyLen)3222*67e74705SXin Li void EmitKey(raw_ostream& Out, const IdentifierInfo* II,
3223*67e74705SXin Li unsigned KeyLen) {
3224*67e74705SXin Li // Record the location of the key data. This is used when generating
3225*67e74705SXin Li // the mapping from persistent IDs to strings.
3226*67e74705SXin Li Writer.SetIdentifierOffset(II, Out.tell());
3227*67e74705SXin Li
3228*67e74705SXin Li // Emit the offset of the key/data length information to the interesting
3229*67e74705SXin Li // identifiers table if necessary.
3230*67e74705SXin Li if (InterestingIdentifierOffsets && isInterestingIdentifier(II))
3231*67e74705SXin Li InterestingIdentifierOffsets->push_back(Out.tell() - 4);
3232*67e74705SXin Li
3233*67e74705SXin Li Out.write(II->getNameStart(), KeyLen);
3234*67e74705SXin Li }
3235*67e74705SXin Li
EmitData(raw_ostream & Out,IdentifierInfo * II,IdentID ID,unsigned)3236*67e74705SXin Li void EmitData(raw_ostream& Out, IdentifierInfo* II,
3237*67e74705SXin Li IdentID ID, unsigned) {
3238*67e74705SXin Li using namespace llvm::support;
3239*67e74705SXin Li endian::Writer<little> LE(Out);
3240*67e74705SXin Li
3241*67e74705SXin Li auto MacroOffset = Writer.getMacroDirectivesOffset(II);
3242*67e74705SXin Li if (!isInterestingIdentifier(II, MacroOffset)) {
3243*67e74705SXin Li LE.write<uint32_t>(ID << 1);
3244*67e74705SXin Li return;
3245*67e74705SXin Li }
3246*67e74705SXin Li
3247*67e74705SXin Li LE.write<uint32_t>((ID << 1) | 0x01);
3248*67e74705SXin Li uint32_t Bits = (uint32_t)II->getObjCOrBuiltinID();
3249*67e74705SXin Li assert((Bits & 0xffff) == Bits && "ObjCOrBuiltinID too big for ASTReader.");
3250*67e74705SXin Li LE.write<uint16_t>(Bits);
3251*67e74705SXin Li Bits = 0;
3252*67e74705SXin Li bool HadMacroDefinition = MacroOffset != 0;
3253*67e74705SXin Li Bits = (Bits << 1) | unsigned(HadMacroDefinition);
3254*67e74705SXin Li Bits = (Bits << 1) | unsigned(II->isExtensionToken());
3255*67e74705SXin Li Bits = (Bits << 1) | unsigned(II->isPoisoned());
3256*67e74705SXin Li Bits = (Bits << 1) | unsigned(II->hasRevertedBuiltin());
3257*67e74705SXin Li Bits = (Bits << 1) | unsigned(II->hasRevertedTokenIDToIdentifier());
3258*67e74705SXin Li Bits = (Bits << 1) | unsigned(II->isCPlusPlusOperatorKeyword());
3259*67e74705SXin Li LE.write<uint16_t>(Bits);
3260*67e74705SXin Li
3261*67e74705SXin Li if (HadMacroDefinition)
3262*67e74705SXin Li LE.write<uint32_t>(MacroOffset);
3263*67e74705SXin Li
3264*67e74705SXin Li if (NeedDecls) {
3265*67e74705SXin Li // Emit the declaration IDs in reverse order, because the
3266*67e74705SXin Li // IdentifierResolver provides the declarations as they would be
3267*67e74705SXin Li // visible (e.g., the function "stat" would come before the struct
3268*67e74705SXin Li // "stat"), but the ASTReader adds declarations to the end of the list
3269*67e74705SXin Li // (so we need to see the struct "stat" before the function "stat").
3270*67e74705SXin Li // Only emit declarations that aren't from a chained PCH, though.
3271*67e74705SXin Li SmallVector<NamedDecl *, 16> Decls(IdResolver.begin(II),
3272*67e74705SXin Li IdResolver.end());
3273*67e74705SXin Li for (SmallVectorImpl<NamedDecl *>::reverse_iterator D = Decls.rbegin(),
3274*67e74705SXin Li DEnd = Decls.rend();
3275*67e74705SXin Li D != DEnd; ++D)
3276*67e74705SXin Li LE.write<uint32_t>(
3277*67e74705SXin Li Writer.getDeclID(getDeclForLocalLookup(PP.getLangOpts(), *D)));
3278*67e74705SXin Li }
3279*67e74705SXin Li }
3280*67e74705SXin Li };
3281*67e74705SXin Li } // end anonymous namespace
3282*67e74705SXin Li
3283*67e74705SXin Li /// \brief Write the identifier table into the AST file.
3284*67e74705SXin Li ///
3285*67e74705SXin Li /// The identifier table consists of a blob containing string data
3286*67e74705SXin Li /// (the actual identifiers themselves) and a separate "offsets" index
3287*67e74705SXin Li /// that maps identifier IDs to locations within the blob.
WriteIdentifierTable(Preprocessor & PP,IdentifierResolver & IdResolver,bool IsModule)3288*67e74705SXin Li void ASTWriter::WriteIdentifierTable(Preprocessor &PP,
3289*67e74705SXin Li IdentifierResolver &IdResolver,
3290*67e74705SXin Li bool IsModule) {
3291*67e74705SXin Li using namespace llvm;
3292*67e74705SXin Li
3293*67e74705SXin Li RecordData InterestingIdents;
3294*67e74705SXin Li
3295*67e74705SXin Li // Create and write out the blob that contains the identifier
3296*67e74705SXin Li // strings.
3297*67e74705SXin Li {
3298*67e74705SXin Li llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait> Generator;
3299*67e74705SXin Li ASTIdentifierTableTrait Trait(
3300*67e74705SXin Li *this, PP, IdResolver, IsModule,
3301*67e74705SXin Li (getLangOpts().CPlusPlus && IsModule) ? &InterestingIdents : nullptr);
3302*67e74705SXin Li
3303*67e74705SXin Li // Look for any identifiers that were named while processing the
3304*67e74705SXin Li // headers, but are otherwise not needed. We add these to the hash
3305*67e74705SXin Li // table to enable checking of the predefines buffer in the case
3306*67e74705SXin Li // where the user adds new macro definitions when building the AST
3307*67e74705SXin Li // file.
3308*67e74705SXin Li SmallVector<const IdentifierInfo *, 128> IIs;
3309*67e74705SXin Li for (const auto &ID : PP.getIdentifierTable())
3310*67e74705SXin Li IIs.push_back(ID.second);
3311*67e74705SXin Li // Sort the identifiers lexicographically before getting them references so
3312*67e74705SXin Li // that their order is stable.
3313*67e74705SXin Li std::sort(IIs.begin(), IIs.end(), llvm::less_ptr<IdentifierInfo>());
3314*67e74705SXin Li for (const IdentifierInfo *II : IIs)
3315*67e74705SXin Li if (Trait.isInterestingNonMacroIdentifier(II))
3316*67e74705SXin Li getIdentifierRef(II);
3317*67e74705SXin Li
3318*67e74705SXin Li // Create the on-disk hash table representation. We only store offsets
3319*67e74705SXin Li // for identifiers that appear here for the first time.
3320*67e74705SXin Li IdentifierOffsets.resize(NextIdentID - FirstIdentID);
3321*67e74705SXin Li for (auto IdentIDPair : IdentifierIDs) {
3322*67e74705SXin Li auto *II = const_cast<IdentifierInfo *>(IdentIDPair.first);
3323*67e74705SXin Li IdentID ID = IdentIDPair.second;
3324*67e74705SXin Li assert(II && "NULL identifier in identifier table");
3325*67e74705SXin Li // Write out identifiers if either the ID is local or the identifier has
3326*67e74705SXin Li // changed since it was loaded.
3327*67e74705SXin Li if (ID >= FirstIdentID || !Chain || !II->isFromAST()
3328*67e74705SXin Li || II->hasChangedSinceDeserialization() ||
3329*67e74705SXin Li (Trait.needDecls() &&
3330*67e74705SXin Li II->hasFETokenInfoChangedSinceDeserialization()))
3331*67e74705SXin Li Generator.insert(II, ID, Trait);
3332*67e74705SXin Li }
3333*67e74705SXin Li
3334*67e74705SXin Li // Create the on-disk hash table in a buffer.
3335*67e74705SXin Li SmallString<4096> IdentifierTable;
3336*67e74705SXin Li uint32_t BucketOffset;
3337*67e74705SXin Li {
3338*67e74705SXin Li using namespace llvm::support;
3339*67e74705SXin Li llvm::raw_svector_ostream Out(IdentifierTable);
3340*67e74705SXin Li // Make sure that no bucket is at offset 0
3341*67e74705SXin Li endian::Writer<little>(Out).write<uint32_t>(0);
3342*67e74705SXin Li BucketOffset = Generator.Emit(Out, Trait);
3343*67e74705SXin Li }
3344*67e74705SXin Li
3345*67e74705SXin Li // Create a blob abbreviation
3346*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
3347*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(IDENTIFIER_TABLE));
3348*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3349*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3350*67e74705SXin Li unsigned IDTableAbbrev = Stream.EmitAbbrev(Abbrev);
3351*67e74705SXin Li
3352*67e74705SXin Li // Write the identifier table
3353*67e74705SXin Li RecordData::value_type Record[] = {IDENTIFIER_TABLE, BucketOffset};
3354*67e74705SXin Li Stream.EmitRecordWithBlob(IDTableAbbrev, Record, IdentifierTable);
3355*67e74705SXin Li }
3356*67e74705SXin Li
3357*67e74705SXin Li // Write the offsets table for identifier IDs.
3358*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
3359*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(IDENTIFIER_OFFSET));
3360*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of identifiers
3361*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID
3362*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3363*67e74705SXin Li unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
3364*67e74705SXin Li
3365*67e74705SXin Li #ifndef NDEBUG
3366*67e74705SXin Li for (unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
3367*67e74705SXin Li assert(IdentifierOffsets[I] && "Missing identifier offset?");
3368*67e74705SXin Li #endif
3369*67e74705SXin Li
3370*67e74705SXin Li RecordData::value_type Record[] = {IDENTIFIER_OFFSET,
3371*67e74705SXin Li IdentifierOffsets.size(),
3372*67e74705SXin Li FirstIdentID - NUM_PREDEF_IDENT_IDS};
3373*67e74705SXin Li Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev, Record,
3374*67e74705SXin Li bytes(IdentifierOffsets));
3375*67e74705SXin Li
3376*67e74705SXin Li // In C++, write the list of interesting identifiers (those that are
3377*67e74705SXin Li // defined as macros, poisoned, or similar unusual things).
3378*67e74705SXin Li if (!InterestingIdents.empty())
3379*67e74705SXin Li Stream.EmitRecord(INTERESTING_IDENTIFIERS, InterestingIdents);
3380*67e74705SXin Li }
3381*67e74705SXin Li
3382*67e74705SXin Li //===----------------------------------------------------------------------===//
3383*67e74705SXin Li // DeclContext's Name Lookup Table Serialization
3384*67e74705SXin Li //===----------------------------------------------------------------------===//
3385*67e74705SXin Li
3386*67e74705SXin Li namespace {
3387*67e74705SXin Li // Trait used for the on-disk hash table used in the method pool.
3388*67e74705SXin Li class ASTDeclContextNameLookupTrait {
3389*67e74705SXin Li ASTWriter &Writer;
3390*67e74705SXin Li llvm::SmallVector<DeclID, 64> DeclIDs;
3391*67e74705SXin Li
3392*67e74705SXin Li public:
3393*67e74705SXin Li typedef DeclarationNameKey key_type;
3394*67e74705SXin Li typedef key_type key_type_ref;
3395*67e74705SXin Li
3396*67e74705SXin Li /// A start and end index into DeclIDs, representing a sequence of decls.
3397*67e74705SXin Li typedef std::pair<unsigned, unsigned> data_type;
3398*67e74705SXin Li typedef const data_type& data_type_ref;
3399*67e74705SXin Li
3400*67e74705SXin Li typedef unsigned hash_value_type;
3401*67e74705SXin Li typedef unsigned offset_type;
3402*67e74705SXin Li
ASTDeclContextNameLookupTrait(ASTWriter & Writer)3403*67e74705SXin Li explicit ASTDeclContextNameLookupTrait(ASTWriter &Writer) : Writer(Writer) { }
3404*67e74705SXin Li
3405*67e74705SXin Li template<typename Coll>
getData(const Coll & Decls)3406*67e74705SXin Li data_type getData(const Coll &Decls) {
3407*67e74705SXin Li unsigned Start = DeclIDs.size();
3408*67e74705SXin Li for (NamedDecl *D : Decls) {
3409*67e74705SXin Li DeclIDs.push_back(
3410*67e74705SXin Li Writer.GetDeclRef(getDeclForLocalLookup(Writer.getLangOpts(), D)));
3411*67e74705SXin Li }
3412*67e74705SXin Li return std::make_pair(Start, DeclIDs.size());
3413*67e74705SXin Li }
3414*67e74705SXin Li
ImportData(const reader::ASTDeclContextNameLookupTrait::data_type & FromReader)3415*67e74705SXin Li data_type ImportData(const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) {
3416*67e74705SXin Li unsigned Start = DeclIDs.size();
3417*67e74705SXin Li for (auto ID : FromReader)
3418*67e74705SXin Li DeclIDs.push_back(ID);
3419*67e74705SXin Li return std::make_pair(Start, DeclIDs.size());
3420*67e74705SXin Li }
3421*67e74705SXin Li
EqualKey(key_type_ref a,key_type_ref b)3422*67e74705SXin Li static bool EqualKey(key_type_ref a, key_type_ref b) {
3423*67e74705SXin Li return a == b;
3424*67e74705SXin Li }
3425*67e74705SXin Li
ComputeHash(DeclarationNameKey Name)3426*67e74705SXin Li hash_value_type ComputeHash(DeclarationNameKey Name) {
3427*67e74705SXin Li return Name.getHash();
3428*67e74705SXin Li }
3429*67e74705SXin Li
EmitFileRef(raw_ostream & Out,ModuleFile * F) const3430*67e74705SXin Li void EmitFileRef(raw_ostream &Out, ModuleFile *F) const {
3431*67e74705SXin Li assert(Writer.hasChain() &&
3432*67e74705SXin Li "have reference to loaded module file but no chain?");
3433*67e74705SXin Li
3434*67e74705SXin Li using namespace llvm::support;
3435*67e74705SXin Li endian::Writer<little>(Out)
3436*67e74705SXin Li .write<uint32_t>(Writer.getChain()->getModuleFileID(F));
3437*67e74705SXin Li }
3438*67e74705SXin Li
EmitKeyDataLength(raw_ostream & Out,DeclarationNameKey Name,data_type_ref Lookup)3439*67e74705SXin Li std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
3440*67e74705SXin Li DeclarationNameKey Name,
3441*67e74705SXin Li data_type_ref Lookup) {
3442*67e74705SXin Li using namespace llvm::support;
3443*67e74705SXin Li endian::Writer<little> LE(Out);
3444*67e74705SXin Li unsigned KeyLen = 1;
3445*67e74705SXin Li switch (Name.getKind()) {
3446*67e74705SXin Li case DeclarationName::Identifier:
3447*67e74705SXin Li case DeclarationName::ObjCZeroArgSelector:
3448*67e74705SXin Li case DeclarationName::ObjCOneArgSelector:
3449*67e74705SXin Li case DeclarationName::ObjCMultiArgSelector:
3450*67e74705SXin Li case DeclarationName::CXXLiteralOperatorName:
3451*67e74705SXin Li KeyLen += 4;
3452*67e74705SXin Li break;
3453*67e74705SXin Li case DeclarationName::CXXOperatorName:
3454*67e74705SXin Li KeyLen += 1;
3455*67e74705SXin Li break;
3456*67e74705SXin Li case DeclarationName::CXXConstructorName:
3457*67e74705SXin Li case DeclarationName::CXXDestructorName:
3458*67e74705SXin Li case DeclarationName::CXXConversionFunctionName:
3459*67e74705SXin Li case DeclarationName::CXXUsingDirective:
3460*67e74705SXin Li break;
3461*67e74705SXin Li }
3462*67e74705SXin Li LE.write<uint16_t>(KeyLen);
3463*67e74705SXin Li
3464*67e74705SXin Li // 4 bytes for each DeclID.
3465*67e74705SXin Li unsigned DataLen = 4 * (Lookup.second - Lookup.first);
3466*67e74705SXin Li assert(uint16_t(DataLen) == DataLen &&
3467*67e74705SXin Li "too many decls for serialized lookup result");
3468*67e74705SXin Li LE.write<uint16_t>(DataLen);
3469*67e74705SXin Li
3470*67e74705SXin Li return std::make_pair(KeyLen, DataLen);
3471*67e74705SXin Li }
3472*67e74705SXin Li
EmitKey(raw_ostream & Out,DeclarationNameKey Name,unsigned)3473*67e74705SXin Li void EmitKey(raw_ostream &Out, DeclarationNameKey Name, unsigned) {
3474*67e74705SXin Li using namespace llvm::support;
3475*67e74705SXin Li endian::Writer<little> LE(Out);
3476*67e74705SXin Li LE.write<uint8_t>(Name.getKind());
3477*67e74705SXin Li switch (Name.getKind()) {
3478*67e74705SXin Li case DeclarationName::Identifier:
3479*67e74705SXin Li case DeclarationName::CXXLiteralOperatorName:
3480*67e74705SXin Li LE.write<uint32_t>(Writer.getIdentifierRef(Name.getIdentifier()));
3481*67e74705SXin Li return;
3482*67e74705SXin Li case DeclarationName::ObjCZeroArgSelector:
3483*67e74705SXin Li case DeclarationName::ObjCOneArgSelector:
3484*67e74705SXin Li case DeclarationName::ObjCMultiArgSelector:
3485*67e74705SXin Li LE.write<uint32_t>(Writer.getSelectorRef(Name.getSelector()));
3486*67e74705SXin Li return;
3487*67e74705SXin Li case DeclarationName::CXXOperatorName:
3488*67e74705SXin Li assert(Name.getOperatorKind() < NUM_OVERLOADED_OPERATORS &&
3489*67e74705SXin Li "Invalid operator?");
3490*67e74705SXin Li LE.write<uint8_t>(Name.getOperatorKind());
3491*67e74705SXin Li return;
3492*67e74705SXin Li case DeclarationName::CXXConstructorName:
3493*67e74705SXin Li case DeclarationName::CXXDestructorName:
3494*67e74705SXin Li case DeclarationName::CXXConversionFunctionName:
3495*67e74705SXin Li case DeclarationName::CXXUsingDirective:
3496*67e74705SXin Li return;
3497*67e74705SXin Li }
3498*67e74705SXin Li
3499*67e74705SXin Li llvm_unreachable("Invalid name kind?");
3500*67e74705SXin Li }
3501*67e74705SXin Li
EmitData(raw_ostream & Out,key_type_ref,data_type Lookup,unsigned DataLen)3502*67e74705SXin Li void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
3503*67e74705SXin Li unsigned DataLen) {
3504*67e74705SXin Li using namespace llvm::support;
3505*67e74705SXin Li endian::Writer<little> LE(Out);
3506*67e74705SXin Li uint64_t Start = Out.tell(); (void)Start;
3507*67e74705SXin Li for (unsigned I = Lookup.first, N = Lookup.second; I != N; ++I)
3508*67e74705SXin Li LE.write<uint32_t>(DeclIDs[I]);
3509*67e74705SXin Li assert(Out.tell() - Start == DataLen && "Data length is wrong");
3510*67e74705SXin Li }
3511*67e74705SXin Li };
3512*67e74705SXin Li } // end anonymous namespace
3513*67e74705SXin Li
isLookupResultExternal(StoredDeclsList & Result,DeclContext * DC)3514*67e74705SXin Li bool ASTWriter::isLookupResultExternal(StoredDeclsList &Result,
3515*67e74705SXin Li DeclContext *DC) {
3516*67e74705SXin Li return Result.hasExternalDecls() && DC->NeedToReconcileExternalVisibleStorage;
3517*67e74705SXin Li }
3518*67e74705SXin Li
isLookupResultEntirelyExternal(StoredDeclsList & Result,DeclContext * DC)3519*67e74705SXin Li bool ASTWriter::isLookupResultEntirelyExternal(StoredDeclsList &Result,
3520*67e74705SXin Li DeclContext *DC) {
3521*67e74705SXin Li for (auto *D : Result.getLookupResult())
3522*67e74705SXin Li if (!getDeclForLocalLookup(getLangOpts(), D)->isFromASTFile())
3523*67e74705SXin Li return false;
3524*67e74705SXin Li
3525*67e74705SXin Li return true;
3526*67e74705SXin Li }
3527*67e74705SXin Li
3528*67e74705SXin Li void
GenerateNameLookupTable(const DeclContext * ConstDC,llvm::SmallVectorImpl<char> & LookupTable)3529*67e74705SXin Li ASTWriter::GenerateNameLookupTable(const DeclContext *ConstDC,
3530*67e74705SXin Li llvm::SmallVectorImpl<char> &LookupTable) {
3531*67e74705SXin Li assert(!ConstDC->HasLazyLocalLexicalLookups &&
3532*67e74705SXin Li !ConstDC->HasLazyExternalLexicalLookups &&
3533*67e74705SXin Li "must call buildLookups first");
3534*67e74705SXin Li
3535*67e74705SXin Li // FIXME: We need to build the lookups table, which is logically const.
3536*67e74705SXin Li auto *DC = const_cast<DeclContext*>(ConstDC);
3537*67e74705SXin Li assert(DC == DC->getPrimaryContext() && "only primary DC has lookup table");
3538*67e74705SXin Li
3539*67e74705SXin Li // Create the on-disk hash table representation.
3540*67e74705SXin Li MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
3541*67e74705SXin Li ASTDeclContextNameLookupTrait> Generator;
3542*67e74705SXin Li ASTDeclContextNameLookupTrait Trait(*this);
3543*67e74705SXin Li
3544*67e74705SXin Li // The first step is to collect the declaration names which we need to
3545*67e74705SXin Li // serialize into the name lookup table, and to collect them in a stable
3546*67e74705SXin Li // order.
3547*67e74705SXin Li SmallVector<DeclarationName, 16> Names;
3548*67e74705SXin Li
3549*67e74705SXin Li // We also build up small sets of the constructor and conversion function
3550*67e74705SXin Li // names which are visible.
3551*67e74705SXin Li llvm::SmallSet<DeclarationName, 8> ConstructorNameSet, ConversionNameSet;
3552*67e74705SXin Li
3553*67e74705SXin Li for (auto &Lookup : *DC->buildLookup()) {
3554*67e74705SXin Li auto &Name = Lookup.first;
3555*67e74705SXin Li auto &Result = Lookup.second;
3556*67e74705SXin Li
3557*67e74705SXin Li // If there are no local declarations in our lookup result, we
3558*67e74705SXin Li // don't need to write an entry for the name at all. If we can't
3559*67e74705SXin Li // write out a lookup set without performing more deserialization,
3560*67e74705SXin Li // just skip this entry.
3561*67e74705SXin Li if (isLookupResultExternal(Result, DC) &&
3562*67e74705SXin Li isLookupResultEntirelyExternal(Result, DC))
3563*67e74705SXin Li continue;
3564*67e74705SXin Li
3565*67e74705SXin Li // We also skip empty results. If any of the results could be external and
3566*67e74705SXin Li // the currently available results are empty, then all of the results are
3567*67e74705SXin Li // external and we skip it above. So the only way we get here with an empty
3568*67e74705SXin Li // results is when no results could have been external *and* we have
3569*67e74705SXin Li // external results.
3570*67e74705SXin Li //
3571*67e74705SXin Li // FIXME: While we might want to start emitting on-disk entries for negative
3572*67e74705SXin Li // lookups into a decl context as an optimization, today we *have* to skip
3573*67e74705SXin Li // them because there are names with empty lookup results in decl contexts
3574*67e74705SXin Li // which we can't emit in any stable ordering: we lookup constructors and
3575*67e74705SXin Li // conversion functions in the enclosing namespace scope creating empty
3576*67e74705SXin Li // results for them. This in almost certainly a bug in Clang's name lookup,
3577*67e74705SXin Li // but that is likely to be hard or impossible to fix and so we tolerate it
3578*67e74705SXin Li // here by omitting lookups with empty results.
3579*67e74705SXin Li if (Lookup.second.getLookupResult().empty())
3580*67e74705SXin Li continue;
3581*67e74705SXin Li
3582*67e74705SXin Li switch (Lookup.first.getNameKind()) {
3583*67e74705SXin Li default:
3584*67e74705SXin Li Names.push_back(Lookup.first);
3585*67e74705SXin Li break;
3586*67e74705SXin Li
3587*67e74705SXin Li case DeclarationName::CXXConstructorName:
3588*67e74705SXin Li assert(isa<CXXRecordDecl>(DC) &&
3589*67e74705SXin Li "Cannot have a constructor name outside of a class!");
3590*67e74705SXin Li ConstructorNameSet.insert(Name);
3591*67e74705SXin Li break;
3592*67e74705SXin Li
3593*67e74705SXin Li case DeclarationName::CXXConversionFunctionName:
3594*67e74705SXin Li assert(isa<CXXRecordDecl>(DC) &&
3595*67e74705SXin Li "Cannot have a conversion function name outside of a class!");
3596*67e74705SXin Li ConversionNameSet.insert(Name);
3597*67e74705SXin Li break;
3598*67e74705SXin Li }
3599*67e74705SXin Li }
3600*67e74705SXin Li
3601*67e74705SXin Li // Sort the names into a stable order.
3602*67e74705SXin Li std::sort(Names.begin(), Names.end());
3603*67e74705SXin Li
3604*67e74705SXin Li if (auto *D = dyn_cast<CXXRecordDecl>(DC)) {
3605*67e74705SXin Li // We need to establish an ordering of constructor and conversion function
3606*67e74705SXin Li // names, and they don't have an intrinsic ordering.
3607*67e74705SXin Li
3608*67e74705SXin Li // First we try the easy case by forming the current context's constructor
3609*67e74705SXin Li // name and adding that name first. This is a very useful optimization to
3610*67e74705SXin Li // avoid walking the lexical declarations in many cases, and it also
3611*67e74705SXin Li // handles the only case where a constructor name can come from some other
3612*67e74705SXin Li // lexical context -- when that name is an implicit constructor merged from
3613*67e74705SXin Li // another declaration in the redecl chain. Any non-implicit constructor or
3614*67e74705SXin Li // conversion function which doesn't occur in all the lexical contexts
3615*67e74705SXin Li // would be an ODR violation.
3616*67e74705SXin Li auto ImplicitCtorName = Context->DeclarationNames.getCXXConstructorName(
3617*67e74705SXin Li Context->getCanonicalType(Context->getRecordType(D)));
3618*67e74705SXin Li if (ConstructorNameSet.erase(ImplicitCtorName))
3619*67e74705SXin Li Names.push_back(ImplicitCtorName);
3620*67e74705SXin Li
3621*67e74705SXin Li // If we still have constructors or conversion functions, we walk all the
3622*67e74705SXin Li // names in the decl and add the constructors and conversion functions
3623*67e74705SXin Li // which are visible in the order they lexically occur within the context.
3624*67e74705SXin Li if (!ConstructorNameSet.empty() || !ConversionNameSet.empty())
3625*67e74705SXin Li for (Decl *ChildD : cast<CXXRecordDecl>(DC)->decls())
3626*67e74705SXin Li if (auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
3627*67e74705SXin Li auto Name = ChildND->getDeclName();
3628*67e74705SXin Li switch (Name.getNameKind()) {
3629*67e74705SXin Li default:
3630*67e74705SXin Li continue;
3631*67e74705SXin Li
3632*67e74705SXin Li case DeclarationName::CXXConstructorName:
3633*67e74705SXin Li if (ConstructorNameSet.erase(Name))
3634*67e74705SXin Li Names.push_back(Name);
3635*67e74705SXin Li break;
3636*67e74705SXin Li
3637*67e74705SXin Li case DeclarationName::CXXConversionFunctionName:
3638*67e74705SXin Li if (ConversionNameSet.erase(Name))
3639*67e74705SXin Li Names.push_back(Name);
3640*67e74705SXin Li break;
3641*67e74705SXin Li }
3642*67e74705SXin Li
3643*67e74705SXin Li if (ConstructorNameSet.empty() && ConversionNameSet.empty())
3644*67e74705SXin Li break;
3645*67e74705SXin Li }
3646*67e74705SXin Li
3647*67e74705SXin Li assert(ConstructorNameSet.empty() && "Failed to find all of the visible "
3648*67e74705SXin Li "constructors by walking all the "
3649*67e74705SXin Li "lexical members of the context.");
3650*67e74705SXin Li assert(ConversionNameSet.empty() && "Failed to find all of the visible "
3651*67e74705SXin Li "conversion functions by walking all "
3652*67e74705SXin Li "the lexical members of the context.");
3653*67e74705SXin Li }
3654*67e74705SXin Li
3655*67e74705SXin Li // Next we need to do a lookup with each name into this decl context to fully
3656*67e74705SXin Li // populate any results from external sources. We don't actually use the
3657*67e74705SXin Li // results of these lookups because we only want to use the results after all
3658*67e74705SXin Li // results have been loaded and the pointers into them will be stable.
3659*67e74705SXin Li for (auto &Name : Names)
3660*67e74705SXin Li DC->lookup(Name);
3661*67e74705SXin Li
3662*67e74705SXin Li // Now we need to insert the results for each name into the hash table. For
3663*67e74705SXin Li // constructor names and conversion function names, we actually need to merge
3664*67e74705SXin Li // all of the results for them into one list of results each and insert
3665*67e74705SXin Li // those.
3666*67e74705SXin Li SmallVector<NamedDecl *, 8> ConstructorDecls;
3667*67e74705SXin Li SmallVector<NamedDecl *, 8> ConversionDecls;
3668*67e74705SXin Li
3669*67e74705SXin Li // Now loop over the names, either inserting them or appending for the two
3670*67e74705SXin Li // special cases.
3671*67e74705SXin Li for (auto &Name : Names) {
3672*67e74705SXin Li DeclContext::lookup_result Result = DC->noload_lookup(Name);
3673*67e74705SXin Li
3674*67e74705SXin Li switch (Name.getNameKind()) {
3675*67e74705SXin Li default:
3676*67e74705SXin Li Generator.insert(Name, Trait.getData(Result), Trait);
3677*67e74705SXin Li break;
3678*67e74705SXin Li
3679*67e74705SXin Li case DeclarationName::CXXConstructorName:
3680*67e74705SXin Li ConstructorDecls.append(Result.begin(), Result.end());
3681*67e74705SXin Li break;
3682*67e74705SXin Li
3683*67e74705SXin Li case DeclarationName::CXXConversionFunctionName:
3684*67e74705SXin Li ConversionDecls.append(Result.begin(), Result.end());
3685*67e74705SXin Li break;
3686*67e74705SXin Li }
3687*67e74705SXin Li }
3688*67e74705SXin Li
3689*67e74705SXin Li // Handle our two special cases if we ended up having any. We arbitrarily use
3690*67e74705SXin Li // the first declaration's name here because the name itself isn't part of
3691*67e74705SXin Li // the key, only the kind of name is used.
3692*67e74705SXin Li if (!ConstructorDecls.empty())
3693*67e74705SXin Li Generator.insert(ConstructorDecls.front()->getDeclName(),
3694*67e74705SXin Li Trait.getData(ConstructorDecls), Trait);
3695*67e74705SXin Li if (!ConversionDecls.empty())
3696*67e74705SXin Li Generator.insert(ConversionDecls.front()->getDeclName(),
3697*67e74705SXin Li Trait.getData(ConversionDecls), Trait);
3698*67e74705SXin Li
3699*67e74705SXin Li // Create the on-disk hash table. Also emit the existing imported and
3700*67e74705SXin Li // merged table if there is one.
3701*67e74705SXin Li auto *Lookups = Chain ? Chain->getLoadedLookupTables(DC) : nullptr;
3702*67e74705SXin Li Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table : nullptr);
3703*67e74705SXin Li }
3704*67e74705SXin Li
3705*67e74705SXin Li /// \brief Write the block containing all of the declaration IDs
3706*67e74705SXin Li /// visible from the given DeclContext.
3707*67e74705SXin Li ///
3708*67e74705SXin Li /// \returns the offset of the DECL_CONTEXT_VISIBLE block within the
3709*67e74705SXin Li /// bitstream, or 0 if no block was written.
WriteDeclContextVisibleBlock(ASTContext & Context,DeclContext * DC)3710*67e74705SXin Li uint64_t ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context,
3711*67e74705SXin Li DeclContext *DC) {
3712*67e74705SXin Li // If we imported a key declaration of this namespace, write the visible
3713*67e74705SXin Li // lookup results as an update record for it rather than including them
3714*67e74705SXin Li // on this declaration. We will only look at key declarations on reload.
3715*67e74705SXin Li if (isa<NamespaceDecl>(DC) && Chain &&
3716*67e74705SXin Li Chain->getKeyDeclaration(cast<Decl>(DC))->isFromASTFile()) {
3717*67e74705SXin Li // Only do this once, for the first local declaration of the namespace.
3718*67e74705SXin Li for (auto *Prev = cast<NamespaceDecl>(DC)->getPreviousDecl(); Prev;
3719*67e74705SXin Li Prev = Prev->getPreviousDecl())
3720*67e74705SXin Li if (!Prev->isFromASTFile())
3721*67e74705SXin Li return 0;
3722*67e74705SXin Li
3723*67e74705SXin Li // Note that we need to emit an update record for the primary context.
3724*67e74705SXin Li UpdatedDeclContexts.insert(DC->getPrimaryContext());
3725*67e74705SXin Li
3726*67e74705SXin Li // Make sure all visible decls are written. They will be recorded later. We
3727*67e74705SXin Li // do this using a side data structure so we can sort the names into
3728*67e74705SXin Li // a deterministic order.
3729*67e74705SXin Li StoredDeclsMap *Map = DC->getPrimaryContext()->buildLookup();
3730*67e74705SXin Li SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
3731*67e74705SXin Li LookupResults;
3732*67e74705SXin Li if (Map) {
3733*67e74705SXin Li LookupResults.reserve(Map->size());
3734*67e74705SXin Li for (auto &Entry : *Map)
3735*67e74705SXin Li LookupResults.push_back(
3736*67e74705SXin Li std::make_pair(Entry.first, Entry.second.getLookupResult()));
3737*67e74705SXin Li }
3738*67e74705SXin Li
3739*67e74705SXin Li std::sort(LookupResults.begin(), LookupResults.end(), llvm::less_first());
3740*67e74705SXin Li for (auto &NameAndResult : LookupResults) {
3741*67e74705SXin Li DeclarationName Name = NameAndResult.first;
3742*67e74705SXin Li DeclContext::lookup_result Result = NameAndResult.second;
3743*67e74705SXin Li if (Name.getNameKind() == DeclarationName::CXXConstructorName ||
3744*67e74705SXin Li Name.getNameKind() == DeclarationName::CXXConversionFunctionName) {
3745*67e74705SXin Li // We have to work around a name lookup bug here where negative lookup
3746*67e74705SXin Li // results for these names get cached in namespace lookup tables (these
3747*67e74705SXin Li // names should never be looked up in a namespace).
3748*67e74705SXin Li assert(Result.empty() && "Cannot have a constructor or conversion "
3749*67e74705SXin Li "function name in a namespace!");
3750*67e74705SXin Li continue;
3751*67e74705SXin Li }
3752*67e74705SXin Li
3753*67e74705SXin Li for (NamedDecl *ND : Result)
3754*67e74705SXin Li if (!ND->isFromASTFile())
3755*67e74705SXin Li GetDeclRef(ND);
3756*67e74705SXin Li }
3757*67e74705SXin Li
3758*67e74705SXin Li return 0;
3759*67e74705SXin Li }
3760*67e74705SXin Li
3761*67e74705SXin Li if (DC->getPrimaryContext() != DC)
3762*67e74705SXin Li return 0;
3763*67e74705SXin Li
3764*67e74705SXin Li // Skip contexts which don't support name lookup.
3765*67e74705SXin Li if (!DC->isLookupContext())
3766*67e74705SXin Li return 0;
3767*67e74705SXin Li
3768*67e74705SXin Li // If not in C++, we perform name lookup for the translation unit via the
3769*67e74705SXin Li // IdentifierInfo chains, don't bother to build a visible-declarations table.
3770*67e74705SXin Li if (DC->isTranslationUnit() && !Context.getLangOpts().CPlusPlus)
3771*67e74705SXin Li return 0;
3772*67e74705SXin Li
3773*67e74705SXin Li // Serialize the contents of the mapping used for lookup. Note that,
3774*67e74705SXin Li // although we have two very different code paths, the serialized
3775*67e74705SXin Li // representation is the same for both cases: a declaration name,
3776*67e74705SXin Li // followed by a size, followed by references to the visible
3777*67e74705SXin Li // declarations that have that name.
3778*67e74705SXin Li uint64_t Offset = Stream.GetCurrentBitNo();
3779*67e74705SXin Li StoredDeclsMap *Map = DC->buildLookup();
3780*67e74705SXin Li if (!Map || Map->empty())
3781*67e74705SXin Li return 0;
3782*67e74705SXin Li
3783*67e74705SXin Li // Create the on-disk hash table in a buffer.
3784*67e74705SXin Li SmallString<4096> LookupTable;
3785*67e74705SXin Li GenerateNameLookupTable(DC, LookupTable);
3786*67e74705SXin Li
3787*67e74705SXin Li // Write the lookup table
3788*67e74705SXin Li RecordData::value_type Record[] = {DECL_CONTEXT_VISIBLE};
3789*67e74705SXin Li Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev, Record,
3790*67e74705SXin Li LookupTable);
3791*67e74705SXin Li ++NumVisibleDeclContexts;
3792*67e74705SXin Li return Offset;
3793*67e74705SXin Li }
3794*67e74705SXin Li
3795*67e74705SXin Li /// \brief Write an UPDATE_VISIBLE block for the given context.
3796*67e74705SXin Li ///
3797*67e74705SXin Li /// UPDATE_VISIBLE blocks contain the declarations that are added to an existing
3798*67e74705SXin Li /// DeclContext in a dependent AST file. As such, they only exist for the TU
3799*67e74705SXin Li /// (in C++), for namespaces, and for classes with forward-declared unscoped
3800*67e74705SXin Li /// enumeration members (in C++11).
WriteDeclContextVisibleUpdate(const DeclContext * DC)3801*67e74705SXin Li void ASTWriter::WriteDeclContextVisibleUpdate(const DeclContext *DC) {
3802*67e74705SXin Li StoredDeclsMap *Map = DC->getLookupPtr();
3803*67e74705SXin Li if (!Map || Map->empty())
3804*67e74705SXin Li return;
3805*67e74705SXin Li
3806*67e74705SXin Li // Create the on-disk hash table in a buffer.
3807*67e74705SXin Li SmallString<4096> LookupTable;
3808*67e74705SXin Li GenerateNameLookupTable(DC, LookupTable);
3809*67e74705SXin Li
3810*67e74705SXin Li // If we're updating a namespace, select a key declaration as the key for the
3811*67e74705SXin Li // update record; those are the only ones that will be checked on reload.
3812*67e74705SXin Li if (isa<NamespaceDecl>(DC))
3813*67e74705SXin Li DC = cast<DeclContext>(Chain->getKeyDeclaration(cast<Decl>(DC)));
3814*67e74705SXin Li
3815*67e74705SXin Li // Write the lookup table
3816*67e74705SXin Li RecordData::value_type Record[] = {UPDATE_VISIBLE, getDeclID(cast<Decl>(DC))};
3817*67e74705SXin Li Stream.EmitRecordWithBlob(UpdateVisibleAbbrev, Record, LookupTable);
3818*67e74705SXin Li }
3819*67e74705SXin Li
3820*67e74705SXin Li /// \brief Write an FP_PRAGMA_OPTIONS block for the given FPOptions.
WriteFPPragmaOptions(const FPOptions & Opts)3821*67e74705SXin Li void ASTWriter::WriteFPPragmaOptions(const FPOptions &Opts) {
3822*67e74705SXin Li RecordData::value_type Record[] = {Opts.fp_contract};
3823*67e74705SXin Li Stream.EmitRecord(FP_PRAGMA_OPTIONS, Record);
3824*67e74705SXin Li }
3825*67e74705SXin Li
3826*67e74705SXin Li /// \brief Write an OPENCL_EXTENSIONS block for the given OpenCLOptions.
WriteOpenCLExtensions(Sema & SemaRef)3827*67e74705SXin Li void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) {
3828*67e74705SXin Li if (!SemaRef.Context.getLangOpts().OpenCL)
3829*67e74705SXin Li return;
3830*67e74705SXin Li
3831*67e74705SXin Li const OpenCLOptions &Opts = SemaRef.getOpenCLOptions();
3832*67e74705SXin Li RecordData Record;
3833*67e74705SXin Li #define OPENCLEXT(nm) Record.push_back(Opts.nm);
3834*67e74705SXin Li #include "clang/Basic/OpenCLExtensions.def"
3835*67e74705SXin Li Stream.EmitRecord(OPENCL_EXTENSIONS, Record);
3836*67e74705SXin Li }
3837*67e74705SXin Li
WriteObjCCategories()3838*67e74705SXin Li void ASTWriter::WriteObjCCategories() {
3839*67e74705SXin Li SmallVector<ObjCCategoriesInfo, 2> CategoriesMap;
3840*67e74705SXin Li RecordData Categories;
3841*67e74705SXin Li
3842*67e74705SXin Li for (unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
3843*67e74705SXin Li unsigned Size = 0;
3844*67e74705SXin Li unsigned StartIndex = Categories.size();
3845*67e74705SXin Li
3846*67e74705SXin Li ObjCInterfaceDecl *Class = ObjCClassesWithCategories[I];
3847*67e74705SXin Li
3848*67e74705SXin Li // Allocate space for the size.
3849*67e74705SXin Li Categories.push_back(0);
3850*67e74705SXin Li
3851*67e74705SXin Li // Add the categories.
3852*67e74705SXin Li for (ObjCInterfaceDecl::known_categories_iterator
3853*67e74705SXin Li Cat = Class->known_categories_begin(),
3854*67e74705SXin Li CatEnd = Class->known_categories_end();
3855*67e74705SXin Li Cat != CatEnd; ++Cat, ++Size) {
3856*67e74705SXin Li assert(getDeclID(*Cat) != 0 && "Bogus category");
3857*67e74705SXin Li AddDeclRef(*Cat, Categories);
3858*67e74705SXin Li }
3859*67e74705SXin Li
3860*67e74705SXin Li // Update the size.
3861*67e74705SXin Li Categories[StartIndex] = Size;
3862*67e74705SXin Li
3863*67e74705SXin Li // Record this interface -> category map.
3864*67e74705SXin Li ObjCCategoriesInfo CatInfo = { getDeclID(Class), StartIndex };
3865*67e74705SXin Li CategoriesMap.push_back(CatInfo);
3866*67e74705SXin Li }
3867*67e74705SXin Li
3868*67e74705SXin Li // Sort the categories map by the definition ID, since the reader will be
3869*67e74705SXin Li // performing binary searches on this information.
3870*67e74705SXin Li llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
3871*67e74705SXin Li
3872*67e74705SXin Li // Emit the categories map.
3873*67e74705SXin Li using namespace llvm;
3874*67e74705SXin Li
3875*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
3876*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(OBJC_CATEGORIES_MAP));
3877*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of entries
3878*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3879*67e74705SXin Li unsigned AbbrevID = Stream.EmitAbbrev(Abbrev);
3880*67e74705SXin Li
3881*67e74705SXin Li RecordData::value_type Record[] = {OBJC_CATEGORIES_MAP, CategoriesMap.size()};
3882*67e74705SXin Li Stream.EmitRecordWithBlob(AbbrevID, Record,
3883*67e74705SXin Li reinterpret_cast<char *>(CategoriesMap.data()),
3884*67e74705SXin Li CategoriesMap.size() * sizeof(ObjCCategoriesInfo));
3885*67e74705SXin Li
3886*67e74705SXin Li // Emit the category lists.
3887*67e74705SXin Li Stream.EmitRecord(OBJC_CATEGORIES, Categories);
3888*67e74705SXin Li }
3889*67e74705SXin Li
WriteLateParsedTemplates(Sema & SemaRef)3890*67e74705SXin Li void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) {
3891*67e74705SXin Li Sema::LateParsedTemplateMapT &LPTMap = SemaRef.LateParsedTemplateMap;
3892*67e74705SXin Li
3893*67e74705SXin Li if (LPTMap.empty())
3894*67e74705SXin Li return;
3895*67e74705SXin Li
3896*67e74705SXin Li RecordData Record;
3897*67e74705SXin Li for (auto LPTMapEntry : LPTMap) {
3898*67e74705SXin Li const FunctionDecl *FD = LPTMapEntry.first;
3899*67e74705SXin Li LateParsedTemplate *LPT = LPTMapEntry.second;
3900*67e74705SXin Li AddDeclRef(FD, Record);
3901*67e74705SXin Li AddDeclRef(LPT->D, Record);
3902*67e74705SXin Li Record.push_back(LPT->Toks.size());
3903*67e74705SXin Li
3904*67e74705SXin Li for (const auto &Tok : LPT->Toks) {
3905*67e74705SXin Li AddToken(Tok, Record);
3906*67e74705SXin Li }
3907*67e74705SXin Li }
3908*67e74705SXin Li Stream.EmitRecord(LATE_PARSED_TEMPLATE, Record);
3909*67e74705SXin Li }
3910*67e74705SXin Li
3911*67e74705SXin Li /// \brief Write the state of 'pragma clang optimize' at the end of the module.
WriteOptimizePragmaOptions(Sema & SemaRef)3912*67e74705SXin Li void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) {
3913*67e74705SXin Li RecordData Record;
3914*67e74705SXin Li SourceLocation PragmaLoc = SemaRef.getOptimizeOffPragmaLocation();
3915*67e74705SXin Li AddSourceLocation(PragmaLoc, Record);
3916*67e74705SXin Li Stream.EmitRecord(OPTIMIZE_PRAGMA_OPTIONS, Record);
3917*67e74705SXin Li }
3918*67e74705SXin Li
3919*67e74705SXin Li /// \brief Write the state of 'pragma ms_struct' at the end of the module.
WriteMSStructPragmaOptions(Sema & SemaRef)3920*67e74705SXin Li void ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) {
3921*67e74705SXin Li RecordData Record;
3922*67e74705SXin Li Record.push_back(SemaRef.MSStructPragmaOn ? PMSST_ON : PMSST_OFF);
3923*67e74705SXin Li Stream.EmitRecord(MSSTRUCT_PRAGMA_OPTIONS, Record);
3924*67e74705SXin Li }
3925*67e74705SXin Li
3926*67e74705SXin Li /// \brief Write the state of 'pragma pointers_to_members' at the end of the
3927*67e74705SXin Li //module.
WriteMSPointersToMembersPragmaOptions(Sema & SemaRef)3928*67e74705SXin Li void ASTWriter::WriteMSPointersToMembersPragmaOptions(Sema &SemaRef) {
3929*67e74705SXin Li RecordData Record;
3930*67e74705SXin Li Record.push_back(SemaRef.MSPointerToMemberRepresentationMethod);
3931*67e74705SXin Li AddSourceLocation(SemaRef.ImplicitMSInheritanceAttrLoc, Record);
3932*67e74705SXin Li Stream.EmitRecord(POINTERS_TO_MEMBERS_PRAGMA_OPTIONS, Record);
3933*67e74705SXin Li }
3934*67e74705SXin Li
WriteModuleFileExtension(Sema & SemaRef,ModuleFileExtensionWriter & Writer)3935*67e74705SXin Li void ASTWriter::WriteModuleFileExtension(Sema &SemaRef,
3936*67e74705SXin Li ModuleFileExtensionWriter &Writer) {
3937*67e74705SXin Li // Enter the extension block.
3938*67e74705SXin Li Stream.EnterSubblock(EXTENSION_BLOCK_ID, 4);
3939*67e74705SXin Li
3940*67e74705SXin Li // Emit the metadata record abbreviation.
3941*67e74705SXin Li auto *Abv = new llvm::BitCodeAbbrev();
3942*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(EXTENSION_METADATA));
3943*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
3944*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
3945*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
3946*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
3947*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
3948*67e74705SXin Li unsigned Abbrev = Stream.EmitAbbrev(Abv);
3949*67e74705SXin Li
3950*67e74705SXin Li // Emit the metadata record.
3951*67e74705SXin Li RecordData Record;
3952*67e74705SXin Li auto Metadata = Writer.getExtension()->getExtensionMetadata();
3953*67e74705SXin Li Record.push_back(EXTENSION_METADATA);
3954*67e74705SXin Li Record.push_back(Metadata.MajorVersion);
3955*67e74705SXin Li Record.push_back(Metadata.MinorVersion);
3956*67e74705SXin Li Record.push_back(Metadata.BlockName.size());
3957*67e74705SXin Li Record.push_back(Metadata.UserInfo.size());
3958*67e74705SXin Li SmallString<64> Buffer;
3959*67e74705SXin Li Buffer += Metadata.BlockName;
3960*67e74705SXin Li Buffer += Metadata.UserInfo;
3961*67e74705SXin Li Stream.EmitRecordWithBlob(Abbrev, Record, Buffer);
3962*67e74705SXin Li
3963*67e74705SXin Li // Emit the contents of the extension block.
3964*67e74705SXin Li Writer.writeExtensionContents(SemaRef, Stream);
3965*67e74705SXin Li
3966*67e74705SXin Li // Exit the extension block.
3967*67e74705SXin Li Stream.ExitBlock();
3968*67e74705SXin Li }
3969*67e74705SXin Li
3970*67e74705SXin Li //===----------------------------------------------------------------------===//
3971*67e74705SXin Li // General Serialization Routines
3972*67e74705SXin Li //===----------------------------------------------------------------------===//
3973*67e74705SXin Li
3974*67e74705SXin Li /// \brief Emit the list of attributes to the specified record.
AddAttributes(ArrayRef<const Attr * > Attrs)3975*67e74705SXin Li void ASTRecordWriter::AddAttributes(ArrayRef<const Attr *> Attrs) {
3976*67e74705SXin Li auto &Record = *this;
3977*67e74705SXin Li Record.push_back(Attrs.size());
3978*67e74705SXin Li for (const auto *A : Attrs) {
3979*67e74705SXin Li Record.push_back(A->getKind()); // FIXME: stable encoding, target attrs
3980*67e74705SXin Li Record.AddSourceRange(A->getRange());
3981*67e74705SXin Li
3982*67e74705SXin Li #include "clang/Serialization/AttrPCHWrite.inc"
3983*67e74705SXin Li
3984*67e74705SXin Li }
3985*67e74705SXin Li }
3986*67e74705SXin Li
AddToken(const Token & Tok,RecordDataImpl & Record)3987*67e74705SXin Li void ASTWriter::AddToken(const Token &Tok, RecordDataImpl &Record) {
3988*67e74705SXin Li AddSourceLocation(Tok.getLocation(), Record);
3989*67e74705SXin Li Record.push_back(Tok.getLength());
3990*67e74705SXin Li
3991*67e74705SXin Li // FIXME: When reading literal tokens, reconstruct the literal pointer
3992*67e74705SXin Li // if it is needed.
3993*67e74705SXin Li AddIdentifierRef(Tok.getIdentifierInfo(), Record);
3994*67e74705SXin Li // FIXME: Should translate token kind to a stable encoding.
3995*67e74705SXin Li Record.push_back(Tok.getKind());
3996*67e74705SXin Li // FIXME: Should translate token flags to a stable encoding.
3997*67e74705SXin Li Record.push_back(Tok.getFlags());
3998*67e74705SXin Li }
3999*67e74705SXin Li
AddString(StringRef Str,RecordDataImpl & Record)4000*67e74705SXin Li void ASTWriter::AddString(StringRef Str, RecordDataImpl &Record) {
4001*67e74705SXin Li Record.push_back(Str.size());
4002*67e74705SXin Li Record.insert(Record.end(), Str.begin(), Str.end());
4003*67e74705SXin Li }
4004*67e74705SXin Li
PreparePathForOutput(SmallVectorImpl<char> & Path)4005*67e74705SXin Li bool ASTWriter::PreparePathForOutput(SmallVectorImpl<char> &Path) {
4006*67e74705SXin Li assert(Context && "should have context when outputting path");
4007*67e74705SXin Li
4008*67e74705SXin Li bool Changed =
4009*67e74705SXin Li cleanPathForOutput(Context->getSourceManager().getFileManager(), Path);
4010*67e74705SXin Li
4011*67e74705SXin Li // Remove a prefix to make the path relative, if relevant.
4012*67e74705SXin Li const char *PathBegin = Path.data();
4013*67e74705SXin Li const char *PathPtr =
4014*67e74705SXin Li adjustFilenameForRelocatableAST(PathBegin, BaseDirectory);
4015*67e74705SXin Li if (PathPtr != PathBegin) {
4016*67e74705SXin Li Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin));
4017*67e74705SXin Li Changed = true;
4018*67e74705SXin Li }
4019*67e74705SXin Li
4020*67e74705SXin Li return Changed;
4021*67e74705SXin Li }
4022*67e74705SXin Li
AddPath(StringRef Path,RecordDataImpl & Record)4023*67e74705SXin Li void ASTWriter::AddPath(StringRef Path, RecordDataImpl &Record) {
4024*67e74705SXin Li SmallString<128> FilePath(Path);
4025*67e74705SXin Li PreparePathForOutput(FilePath);
4026*67e74705SXin Li AddString(FilePath, Record);
4027*67e74705SXin Li }
4028*67e74705SXin Li
EmitRecordWithPath(unsigned Abbrev,RecordDataRef Record,StringRef Path)4029*67e74705SXin Li void ASTWriter::EmitRecordWithPath(unsigned Abbrev, RecordDataRef Record,
4030*67e74705SXin Li StringRef Path) {
4031*67e74705SXin Li SmallString<128> FilePath(Path);
4032*67e74705SXin Li PreparePathForOutput(FilePath);
4033*67e74705SXin Li Stream.EmitRecordWithBlob(Abbrev, Record, FilePath);
4034*67e74705SXin Li }
4035*67e74705SXin Li
AddVersionTuple(const VersionTuple & Version,RecordDataImpl & Record)4036*67e74705SXin Li void ASTWriter::AddVersionTuple(const VersionTuple &Version,
4037*67e74705SXin Li RecordDataImpl &Record) {
4038*67e74705SXin Li Record.push_back(Version.getMajor());
4039*67e74705SXin Li if (Optional<unsigned> Minor = Version.getMinor())
4040*67e74705SXin Li Record.push_back(*Minor + 1);
4041*67e74705SXin Li else
4042*67e74705SXin Li Record.push_back(0);
4043*67e74705SXin Li if (Optional<unsigned> Subminor = Version.getSubminor())
4044*67e74705SXin Li Record.push_back(*Subminor + 1);
4045*67e74705SXin Li else
4046*67e74705SXin Li Record.push_back(0);
4047*67e74705SXin Li }
4048*67e74705SXin Li
4049*67e74705SXin Li /// \brief Note that the identifier II occurs at the given offset
4050*67e74705SXin Li /// within the identifier table.
SetIdentifierOffset(const IdentifierInfo * II,uint32_t Offset)4051*67e74705SXin Li void ASTWriter::SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset) {
4052*67e74705SXin Li IdentID ID = IdentifierIDs[II];
4053*67e74705SXin Li // Only store offsets new to this AST file. Other identifier names are looked
4054*67e74705SXin Li // up earlier in the chain and thus don't need an offset.
4055*67e74705SXin Li if (ID >= FirstIdentID)
4056*67e74705SXin Li IdentifierOffsets[ID - FirstIdentID] = Offset;
4057*67e74705SXin Li }
4058*67e74705SXin Li
4059*67e74705SXin Li /// \brief Note that the selector Sel occurs at the given offset
4060*67e74705SXin Li /// within the method pool/selector table.
SetSelectorOffset(Selector Sel,uint32_t Offset)4061*67e74705SXin Li void ASTWriter::SetSelectorOffset(Selector Sel, uint32_t Offset) {
4062*67e74705SXin Li unsigned ID = SelectorIDs[Sel];
4063*67e74705SXin Li assert(ID && "Unknown selector");
4064*67e74705SXin Li // Don't record offsets for selectors that are also available in a different
4065*67e74705SXin Li // file.
4066*67e74705SXin Li if (ID < FirstSelectorID)
4067*67e74705SXin Li return;
4068*67e74705SXin Li SelectorOffsets[ID - FirstSelectorID] = Offset;
4069*67e74705SXin Li }
4070*67e74705SXin Li
ASTWriter(llvm::BitstreamWriter & Stream,ArrayRef<llvm::IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,bool IncludeTimestamps)4071*67e74705SXin Li ASTWriter::ASTWriter(
4072*67e74705SXin Li llvm::BitstreamWriter &Stream,
4073*67e74705SXin Li ArrayRef<llvm::IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,
4074*67e74705SXin Li bool IncludeTimestamps)
4075*67e74705SXin Li : Stream(Stream), Context(nullptr), PP(nullptr), Chain(nullptr),
4076*67e74705SXin Li WritingModule(nullptr), IncludeTimestamps(IncludeTimestamps),
4077*67e74705SXin Li WritingAST(false), DoneWritingDeclsAndTypes(false),
4078*67e74705SXin Li ASTHasCompilerErrors(false), FirstDeclID(NUM_PREDEF_DECL_IDS),
4079*67e74705SXin Li NextDeclID(FirstDeclID), FirstTypeID(NUM_PREDEF_TYPE_IDS),
4080*67e74705SXin Li NextTypeID(FirstTypeID), FirstIdentID(NUM_PREDEF_IDENT_IDS),
4081*67e74705SXin Li NextIdentID(FirstIdentID), FirstMacroID(NUM_PREDEF_MACRO_IDS),
4082*67e74705SXin Li NextMacroID(FirstMacroID), FirstSubmoduleID(NUM_PREDEF_SUBMODULE_IDS),
4083*67e74705SXin Li NextSubmoduleID(FirstSubmoduleID),
4084*67e74705SXin Li FirstSelectorID(NUM_PREDEF_SELECTOR_IDS), NextSelectorID(FirstSelectorID),
4085*67e74705SXin Li NumStatements(0), NumMacros(0),
4086*67e74705SXin Li NumLexicalDeclContexts(0), NumVisibleDeclContexts(0),
4087*67e74705SXin Li TypeExtQualAbbrev(0), TypeFunctionProtoAbbrev(0), DeclParmVarAbbrev(0),
4088*67e74705SXin Li DeclContextLexicalAbbrev(0), DeclContextVisibleLookupAbbrev(0),
4089*67e74705SXin Li UpdateVisibleAbbrev(0), DeclRecordAbbrev(0), DeclTypedefAbbrev(0),
4090*67e74705SXin Li DeclVarAbbrev(0), DeclFieldAbbrev(0), DeclEnumAbbrev(0),
4091*67e74705SXin Li DeclObjCIvarAbbrev(0), DeclCXXMethodAbbrev(0), DeclRefExprAbbrev(0),
4092*67e74705SXin Li CharacterLiteralAbbrev(0), IntegerLiteralAbbrev(0),
4093*67e74705SXin Li ExprImplicitCastAbbrev(0) {
4094*67e74705SXin Li for (const auto &Ext : Extensions) {
4095*67e74705SXin Li if (auto Writer = Ext->createExtensionWriter(*this))
4096*67e74705SXin Li ModuleFileExtensionWriters.push_back(std::move(Writer));
4097*67e74705SXin Li }
4098*67e74705SXin Li }
4099*67e74705SXin Li
~ASTWriter()4100*67e74705SXin Li ASTWriter::~ASTWriter() {
4101*67e74705SXin Li llvm::DeleteContainerSeconds(FileDeclIDs);
4102*67e74705SXin Li }
4103*67e74705SXin Li
getLangOpts() const4104*67e74705SXin Li const LangOptions &ASTWriter::getLangOpts() const {
4105*67e74705SXin Li assert(WritingAST && "can't determine lang opts when not writing AST");
4106*67e74705SXin Li return Context->getLangOpts();
4107*67e74705SXin Li }
4108*67e74705SXin Li
getTimestampForOutput(const FileEntry * E) const4109*67e74705SXin Li time_t ASTWriter::getTimestampForOutput(const FileEntry *E) const {
4110*67e74705SXin Li return IncludeTimestamps ? E->getModificationTime() : 0;
4111*67e74705SXin Li }
4112*67e74705SXin Li
WriteAST(Sema & SemaRef,const std::string & OutputFile,Module * WritingModule,StringRef isysroot,bool hasErrors)4113*67e74705SXin Li uint64_t ASTWriter::WriteAST(Sema &SemaRef, const std::string &OutputFile,
4114*67e74705SXin Li Module *WritingModule, StringRef isysroot,
4115*67e74705SXin Li bool hasErrors) {
4116*67e74705SXin Li WritingAST = true;
4117*67e74705SXin Li
4118*67e74705SXin Li ASTHasCompilerErrors = hasErrors;
4119*67e74705SXin Li
4120*67e74705SXin Li // Emit the file header.
4121*67e74705SXin Li Stream.Emit((unsigned)'C', 8);
4122*67e74705SXin Li Stream.Emit((unsigned)'P', 8);
4123*67e74705SXin Li Stream.Emit((unsigned)'C', 8);
4124*67e74705SXin Li Stream.Emit((unsigned)'H', 8);
4125*67e74705SXin Li
4126*67e74705SXin Li WriteBlockInfoBlock();
4127*67e74705SXin Li
4128*67e74705SXin Li Context = &SemaRef.Context;
4129*67e74705SXin Li PP = &SemaRef.PP;
4130*67e74705SXin Li this->WritingModule = WritingModule;
4131*67e74705SXin Li ASTFileSignature Signature =
4132*67e74705SXin Li WriteASTCore(SemaRef, isysroot, OutputFile, WritingModule);
4133*67e74705SXin Li Context = nullptr;
4134*67e74705SXin Li PP = nullptr;
4135*67e74705SXin Li this->WritingModule = nullptr;
4136*67e74705SXin Li this->BaseDirectory.clear();
4137*67e74705SXin Li
4138*67e74705SXin Li WritingAST = false;
4139*67e74705SXin Li return Signature;
4140*67e74705SXin Li }
4141*67e74705SXin Li
4142*67e74705SXin Li template<typename Vector>
AddLazyVectorDecls(ASTWriter & Writer,Vector & Vec,ASTWriter::RecordData & Record)4143*67e74705SXin Li static void AddLazyVectorDecls(ASTWriter &Writer, Vector &Vec,
4144*67e74705SXin Li ASTWriter::RecordData &Record) {
4145*67e74705SXin Li for (typename Vector::iterator I = Vec.begin(nullptr, true), E = Vec.end();
4146*67e74705SXin Li I != E; ++I) {
4147*67e74705SXin Li Writer.AddDeclRef(*I, Record);
4148*67e74705SXin Li }
4149*67e74705SXin Li }
4150*67e74705SXin Li
WriteASTCore(Sema & SemaRef,StringRef isysroot,const std::string & OutputFile,Module * WritingModule)4151*67e74705SXin Li uint64_t ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot,
4152*67e74705SXin Li const std::string &OutputFile,
4153*67e74705SXin Li Module *WritingModule) {
4154*67e74705SXin Li using namespace llvm;
4155*67e74705SXin Li
4156*67e74705SXin Li bool isModule = WritingModule != nullptr;
4157*67e74705SXin Li
4158*67e74705SXin Li // Make sure that the AST reader knows to finalize itself.
4159*67e74705SXin Li if (Chain)
4160*67e74705SXin Li Chain->finalizeForWriting();
4161*67e74705SXin Li
4162*67e74705SXin Li ASTContext &Context = SemaRef.Context;
4163*67e74705SXin Li Preprocessor &PP = SemaRef.PP;
4164*67e74705SXin Li
4165*67e74705SXin Li // Set up predefined declaration IDs.
4166*67e74705SXin Li auto RegisterPredefDecl = [&] (Decl *D, PredefinedDeclIDs ID) {
4167*67e74705SXin Li if (D) {
4168*67e74705SXin Li assert(D->isCanonicalDecl() && "predefined decl is not canonical");
4169*67e74705SXin Li DeclIDs[D] = ID;
4170*67e74705SXin Li }
4171*67e74705SXin Li };
4172*67e74705SXin Li RegisterPredefDecl(Context.getTranslationUnitDecl(),
4173*67e74705SXin Li PREDEF_DECL_TRANSLATION_UNIT_ID);
4174*67e74705SXin Li RegisterPredefDecl(Context.ObjCIdDecl, PREDEF_DECL_OBJC_ID_ID);
4175*67e74705SXin Li RegisterPredefDecl(Context.ObjCSelDecl, PREDEF_DECL_OBJC_SEL_ID);
4176*67e74705SXin Li RegisterPredefDecl(Context.ObjCClassDecl, PREDEF_DECL_OBJC_CLASS_ID);
4177*67e74705SXin Li RegisterPredefDecl(Context.ObjCProtocolClassDecl,
4178*67e74705SXin Li PREDEF_DECL_OBJC_PROTOCOL_ID);
4179*67e74705SXin Li RegisterPredefDecl(Context.Int128Decl, PREDEF_DECL_INT_128_ID);
4180*67e74705SXin Li RegisterPredefDecl(Context.UInt128Decl, PREDEF_DECL_UNSIGNED_INT_128_ID);
4181*67e74705SXin Li RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
4182*67e74705SXin Li PREDEF_DECL_OBJC_INSTANCETYPE_ID);
4183*67e74705SXin Li RegisterPredefDecl(Context.BuiltinVaListDecl, PREDEF_DECL_BUILTIN_VA_LIST_ID);
4184*67e74705SXin Li RegisterPredefDecl(Context.VaListTagDecl, PREDEF_DECL_VA_LIST_TAG);
4185*67e74705SXin Li RegisterPredefDecl(Context.BuiltinMSVaListDecl,
4186*67e74705SXin Li PREDEF_DECL_BUILTIN_MS_VA_LIST_ID);
4187*67e74705SXin Li RegisterPredefDecl(Context.ExternCContext, PREDEF_DECL_EXTERN_C_CONTEXT_ID);
4188*67e74705SXin Li RegisterPredefDecl(Context.MakeIntegerSeqDecl,
4189*67e74705SXin Li PREDEF_DECL_MAKE_INTEGER_SEQ_ID);
4190*67e74705SXin Li RegisterPredefDecl(Context.CFConstantStringTypeDecl,
4191*67e74705SXin Li PREDEF_DECL_CF_CONSTANT_STRING_ID);
4192*67e74705SXin Li RegisterPredefDecl(Context.CFConstantStringTagDecl,
4193*67e74705SXin Li PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID);
4194*67e74705SXin Li RegisterPredefDecl(Context.TypePackElementDecl,
4195*67e74705SXin Li PREDEF_DECL_TYPE_PACK_ELEMENT_ID);
4196*67e74705SXin Li
4197*67e74705SXin Li // Build a record containing all of the tentative definitions in this file, in
4198*67e74705SXin Li // TentativeDefinitions order. Generally, this record will be empty for
4199*67e74705SXin Li // headers.
4200*67e74705SXin Li RecordData TentativeDefinitions;
4201*67e74705SXin Li AddLazyVectorDecls(*this, SemaRef.TentativeDefinitions, TentativeDefinitions);
4202*67e74705SXin Li
4203*67e74705SXin Li // Build a record containing all of the file scoped decls in this file.
4204*67e74705SXin Li RecordData UnusedFileScopedDecls;
4205*67e74705SXin Li if (!isModule)
4206*67e74705SXin Li AddLazyVectorDecls(*this, SemaRef.UnusedFileScopedDecls,
4207*67e74705SXin Li UnusedFileScopedDecls);
4208*67e74705SXin Li
4209*67e74705SXin Li // Build a record containing all of the delegating constructors we still need
4210*67e74705SXin Li // to resolve.
4211*67e74705SXin Li RecordData DelegatingCtorDecls;
4212*67e74705SXin Li if (!isModule)
4213*67e74705SXin Li AddLazyVectorDecls(*this, SemaRef.DelegatingCtorDecls, DelegatingCtorDecls);
4214*67e74705SXin Li
4215*67e74705SXin Li // Write the set of weak, undeclared identifiers. We always write the
4216*67e74705SXin Li // entire table, since later PCH files in a PCH chain are only interested in
4217*67e74705SXin Li // the results at the end of the chain.
4218*67e74705SXin Li RecordData WeakUndeclaredIdentifiers;
4219*67e74705SXin Li for (auto &WeakUndeclaredIdentifier : SemaRef.WeakUndeclaredIdentifiers) {
4220*67e74705SXin Li IdentifierInfo *II = WeakUndeclaredIdentifier.first;
4221*67e74705SXin Li WeakInfo &WI = WeakUndeclaredIdentifier.second;
4222*67e74705SXin Li AddIdentifierRef(II, WeakUndeclaredIdentifiers);
4223*67e74705SXin Li AddIdentifierRef(WI.getAlias(), WeakUndeclaredIdentifiers);
4224*67e74705SXin Li AddSourceLocation(WI.getLocation(), WeakUndeclaredIdentifiers);
4225*67e74705SXin Li WeakUndeclaredIdentifiers.push_back(WI.getUsed());
4226*67e74705SXin Li }
4227*67e74705SXin Li
4228*67e74705SXin Li // Build a record containing all of the ext_vector declarations.
4229*67e74705SXin Li RecordData ExtVectorDecls;
4230*67e74705SXin Li AddLazyVectorDecls(*this, SemaRef.ExtVectorDecls, ExtVectorDecls);
4231*67e74705SXin Li
4232*67e74705SXin Li // Build a record containing all of the VTable uses information.
4233*67e74705SXin Li RecordData VTableUses;
4234*67e74705SXin Li if (!SemaRef.VTableUses.empty()) {
4235*67e74705SXin Li for (unsigned I = 0, N = SemaRef.VTableUses.size(); I != N; ++I) {
4236*67e74705SXin Li AddDeclRef(SemaRef.VTableUses[I].first, VTableUses);
4237*67e74705SXin Li AddSourceLocation(SemaRef.VTableUses[I].second, VTableUses);
4238*67e74705SXin Li VTableUses.push_back(SemaRef.VTablesUsed[SemaRef.VTableUses[I].first]);
4239*67e74705SXin Li }
4240*67e74705SXin Li }
4241*67e74705SXin Li
4242*67e74705SXin Li // Build a record containing all of the UnusedLocalTypedefNameCandidates.
4243*67e74705SXin Li RecordData UnusedLocalTypedefNameCandidates;
4244*67e74705SXin Li for (const TypedefNameDecl *TD : SemaRef.UnusedLocalTypedefNameCandidates)
4245*67e74705SXin Li AddDeclRef(TD, UnusedLocalTypedefNameCandidates);
4246*67e74705SXin Li
4247*67e74705SXin Li // Build a record containing all of pending implicit instantiations.
4248*67e74705SXin Li RecordData PendingInstantiations;
4249*67e74705SXin Li for (const auto &I : SemaRef.PendingInstantiations) {
4250*67e74705SXin Li AddDeclRef(I.first, PendingInstantiations);
4251*67e74705SXin Li AddSourceLocation(I.second, PendingInstantiations);
4252*67e74705SXin Li }
4253*67e74705SXin Li assert(SemaRef.PendingLocalImplicitInstantiations.empty() &&
4254*67e74705SXin Li "There are local ones at end of translation unit!");
4255*67e74705SXin Li
4256*67e74705SXin Li // Build a record containing some declaration references.
4257*67e74705SXin Li RecordData SemaDeclRefs;
4258*67e74705SXin Li if (SemaRef.StdNamespace || SemaRef.StdBadAlloc) {
4259*67e74705SXin Li AddDeclRef(SemaRef.getStdNamespace(), SemaDeclRefs);
4260*67e74705SXin Li AddDeclRef(SemaRef.getStdBadAlloc(), SemaDeclRefs);
4261*67e74705SXin Li }
4262*67e74705SXin Li
4263*67e74705SXin Li RecordData CUDASpecialDeclRefs;
4264*67e74705SXin Li if (Context.getcudaConfigureCallDecl()) {
4265*67e74705SXin Li AddDeclRef(Context.getcudaConfigureCallDecl(), CUDASpecialDeclRefs);
4266*67e74705SXin Li }
4267*67e74705SXin Li
4268*67e74705SXin Li // Build a record containing all of the known namespaces.
4269*67e74705SXin Li RecordData KnownNamespaces;
4270*67e74705SXin Li for (const auto &I : SemaRef.KnownNamespaces) {
4271*67e74705SXin Li if (!I.second)
4272*67e74705SXin Li AddDeclRef(I.first, KnownNamespaces);
4273*67e74705SXin Li }
4274*67e74705SXin Li
4275*67e74705SXin Li // Build a record of all used, undefined objects that require definitions.
4276*67e74705SXin Li RecordData UndefinedButUsed;
4277*67e74705SXin Li
4278*67e74705SXin Li SmallVector<std::pair<NamedDecl *, SourceLocation>, 16> Undefined;
4279*67e74705SXin Li SemaRef.getUndefinedButUsed(Undefined);
4280*67e74705SXin Li for (const auto &I : Undefined) {
4281*67e74705SXin Li AddDeclRef(I.first, UndefinedButUsed);
4282*67e74705SXin Li AddSourceLocation(I.second, UndefinedButUsed);
4283*67e74705SXin Li }
4284*67e74705SXin Li
4285*67e74705SXin Li // Build a record containing all delete-expressions that we would like to
4286*67e74705SXin Li // analyze later in AST.
4287*67e74705SXin Li RecordData DeleteExprsToAnalyze;
4288*67e74705SXin Li
4289*67e74705SXin Li for (const auto &DeleteExprsInfo :
4290*67e74705SXin Li SemaRef.getMismatchingDeleteExpressions()) {
4291*67e74705SXin Li AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
4292*67e74705SXin Li DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
4293*67e74705SXin Li for (const auto &DeleteLoc : DeleteExprsInfo.second) {
4294*67e74705SXin Li AddSourceLocation(DeleteLoc.first, DeleteExprsToAnalyze);
4295*67e74705SXin Li DeleteExprsToAnalyze.push_back(DeleteLoc.second);
4296*67e74705SXin Li }
4297*67e74705SXin Li }
4298*67e74705SXin Li
4299*67e74705SXin Li // Write the control block
4300*67e74705SXin Li uint64_t Signature = WriteControlBlock(PP, Context, isysroot, OutputFile);
4301*67e74705SXin Li
4302*67e74705SXin Li // Write the remaining AST contents.
4303*67e74705SXin Li Stream.EnterSubblock(AST_BLOCK_ID, 5);
4304*67e74705SXin Li
4305*67e74705SXin Li // This is so that older clang versions, before the introduction
4306*67e74705SXin Li // of the control block, can read and reject the newer PCH format.
4307*67e74705SXin Li {
4308*67e74705SXin Li RecordData Record = {VERSION_MAJOR};
4309*67e74705SXin Li Stream.EmitRecord(METADATA_OLD_FORMAT, Record);
4310*67e74705SXin Li }
4311*67e74705SXin Li
4312*67e74705SXin Li // Create a lexical update block containing all of the declarations in the
4313*67e74705SXin Li // translation unit that do not come from other AST files.
4314*67e74705SXin Li const TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
4315*67e74705SXin Li SmallVector<uint32_t, 128> NewGlobalKindDeclPairs;
4316*67e74705SXin Li for (const auto *D : TU->noload_decls()) {
4317*67e74705SXin Li if (!D->isFromASTFile()) {
4318*67e74705SXin Li NewGlobalKindDeclPairs.push_back(D->getKind());
4319*67e74705SXin Li NewGlobalKindDeclPairs.push_back(GetDeclRef(D));
4320*67e74705SXin Li }
4321*67e74705SXin Li }
4322*67e74705SXin Li
4323*67e74705SXin Li auto *Abv = new llvm::BitCodeAbbrev();
4324*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(TU_UPDATE_LEXICAL));
4325*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
4326*67e74705SXin Li unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(Abv);
4327*67e74705SXin Li {
4328*67e74705SXin Li RecordData::value_type Record[] = {TU_UPDATE_LEXICAL};
4329*67e74705SXin Li Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev, Record,
4330*67e74705SXin Li bytes(NewGlobalKindDeclPairs));
4331*67e74705SXin Li }
4332*67e74705SXin Li
4333*67e74705SXin Li // And a visible updates block for the translation unit.
4334*67e74705SXin Li Abv = new llvm::BitCodeAbbrev();
4335*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(UPDATE_VISIBLE));
4336*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
4337*67e74705SXin Li Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
4338*67e74705SXin Li UpdateVisibleAbbrev = Stream.EmitAbbrev(Abv);
4339*67e74705SXin Li WriteDeclContextVisibleUpdate(TU);
4340*67e74705SXin Li
4341*67e74705SXin Li // If we have any extern "C" names, write out a visible update for them.
4342*67e74705SXin Li if (Context.ExternCContext)
4343*67e74705SXin Li WriteDeclContextVisibleUpdate(Context.ExternCContext);
4344*67e74705SXin Li
4345*67e74705SXin Li // If the translation unit has an anonymous namespace, and we don't already
4346*67e74705SXin Li // have an update block for it, write it as an update block.
4347*67e74705SXin Li // FIXME: Why do we not do this if there's already an update block?
4348*67e74705SXin Li if (NamespaceDecl *NS = TU->getAnonymousNamespace()) {
4349*67e74705SXin Li ASTWriter::UpdateRecord &Record = DeclUpdates[TU];
4350*67e74705SXin Li if (Record.empty())
4351*67e74705SXin Li Record.push_back(DeclUpdate(UPD_CXX_ADDED_ANONYMOUS_NAMESPACE, NS));
4352*67e74705SXin Li }
4353*67e74705SXin Li
4354*67e74705SXin Li // Add update records for all mangling numbers and static local numbers.
4355*67e74705SXin Li // These aren't really update records, but this is a convenient way of
4356*67e74705SXin Li // tagging this rare extra data onto the declarations.
4357*67e74705SXin Li for (const auto &Number : Context.MangleNumbers)
4358*67e74705SXin Li if (!Number.first->isFromASTFile())
4359*67e74705SXin Li DeclUpdates[Number.first].push_back(DeclUpdate(UPD_MANGLING_NUMBER,
4360*67e74705SXin Li Number.second));
4361*67e74705SXin Li for (const auto &Number : Context.StaticLocalNumbers)
4362*67e74705SXin Li if (!Number.first->isFromASTFile())
4363*67e74705SXin Li DeclUpdates[Number.first].push_back(DeclUpdate(UPD_STATIC_LOCAL_NUMBER,
4364*67e74705SXin Li Number.second));
4365*67e74705SXin Li
4366*67e74705SXin Li // Make sure visible decls, added to DeclContexts previously loaded from
4367*67e74705SXin Li // an AST file, are registered for serialization.
4368*67e74705SXin Li for (const auto *I : UpdatingVisibleDecls) {
4369*67e74705SXin Li GetDeclRef(I);
4370*67e74705SXin Li }
4371*67e74705SXin Li
4372*67e74705SXin Li // Make sure all decls associated with an identifier are registered for
4373*67e74705SXin Li // serialization, if we're storing decls with identifiers.
4374*67e74705SXin Li if (!WritingModule || !getLangOpts().CPlusPlus) {
4375*67e74705SXin Li llvm::SmallVector<const IdentifierInfo*, 256> IIs;
4376*67e74705SXin Li for (const auto &ID : PP.getIdentifierTable()) {
4377*67e74705SXin Li const IdentifierInfo *II = ID.second;
4378*67e74705SXin Li if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization())
4379*67e74705SXin Li IIs.push_back(II);
4380*67e74705SXin Li }
4381*67e74705SXin Li // Sort the identifiers to visit based on their name.
4382*67e74705SXin Li std::sort(IIs.begin(), IIs.end(), llvm::less_ptr<IdentifierInfo>());
4383*67e74705SXin Li for (const IdentifierInfo *II : IIs) {
4384*67e74705SXin Li for (IdentifierResolver::iterator D = SemaRef.IdResolver.begin(II),
4385*67e74705SXin Li DEnd = SemaRef.IdResolver.end();
4386*67e74705SXin Li D != DEnd; ++D) {
4387*67e74705SXin Li GetDeclRef(*D);
4388*67e74705SXin Li }
4389*67e74705SXin Li }
4390*67e74705SXin Li }
4391*67e74705SXin Li
4392*67e74705SXin Li // For method pool in the module, if it contains an entry for a selector,
4393*67e74705SXin Li // the entry should be complete, containing everything introduced by that
4394*67e74705SXin Li // module and all modules it imports. It's possible that the entry is out of
4395*67e74705SXin Li // date, so we need to pull in the new content here.
4396*67e74705SXin Li
4397*67e74705SXin Li // It's possible that updateOutOfDateSelector can update SelectorIDs. To be
4398*67e74705SXin Li // safe, we copy all selectors out.
4399*67e74705SXin Li llvm::SmallVector<Selector, 256> AllSelectors;
4400*67e74705SXin Li for (auto &SelectorAndID : SelectorIDs)
4401*67e74705SXin Li AllSelectors.push_back(SelectorAndID.first);
4402*67e74705SXin Li for (auto &Selector : AllSelectors)
4403*67e74705SXin Li SemaRef.updateOutOfDateSelector(Selector);
4404*67e74705SXin Li
4405*67e74705SXin Li // Form the record of special types.
4406*67e74705SXin Li RecordData SpecialTypes;
4407*67e74705SXin Li AddTypeRef(Context.getRawCFConstantStringType(), SpecialTypes);
4408*67e74705SXin Li AddTypeRef(Context.getFILEType(), SpecialTypes);
4409*67e74705SXin Li AddTypeRef(Context.getjmp_bufType(), SpecialTypes);
4410*67e74705SXin Li AddTypeRef(Context.getsigjmp_bufType(), SpecialTypes);
4411*67e74705SXin Li AddTypeRef(Context.ObjCIdRedefinitionType, SpecialTypes);
4412*67e74705SXin Li AddTypeRef(Context.ObjCClassRedefinitionType, SpecialTypes);
4413*67e74705SXin Li AddTypeRef(Context.ObjCSelRedefinitionType, SpecialTypes);
4414*67e74705SXin Li AddTypeRef(Context.getucontext_tType(), SpecialTypes);
4415*67e74705SXin Li
4416*67e74705SXin Li if (Chain) {
4417*67e74705SXin Li // Write the mapping information describing our module dependencies and how
4418*67e74705SXin Li // each of those modules were mapped into our own offset/ID space, so that
4419*67e74705SXin Li // the reader can build the appropriate mapping to its own offset/ID space.
4420*67e74705SXin Li // The map consists solely of a blob with the following format:
4421*67e74705SXin Li // *(module-name-len:i16 module-name:len*i8
4422*67e74705SXin Li // source-location-offset:i32
4423*67e74705SXin Li // identifier-id:i32
4424*67e74705SXin Li // preprocessed-entity-id:i32
4425*67e74705SXin Li // macro-definition-id:i32
4426*67e74705SXin Li // submodule-id:i32
4427*67e74705SXin Li // selector-id:i32
4428*67e74705SXin Li // declaration-id:i32
4429*67e74705SXin Li // c++-base-specifiers-id:i32
4430*67e74705SXin Li // type-id:i32)
4431*67e74705SXin Li //
4432*67e74705SXin Li auto *Abbrev = new BitCodeAbbrev();
4433*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(MODULE_OFFSET_MAP));
4434*67e74705SXin Li Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4435*67e74705SXin Li unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(Abbrev);
4436*67e74705SXin Li SmallString<2048> Buffer;
4437*67e74705SXin Li {
4438*67e74705SXin Li llvm::raw_svector_ostream Out(Buffer);
4439*67e74705SXin Li for (ModuleFile *M : Chain->ModuleMgr) {
4440*67e74705SXin Li using namespace llvm::support;
4441*67e74705SXin Li endian::Writer<little> LE(Out);
4442*67e74705SXin Li StringRef FileName = M->FileName;
4443*67e74705SXin Li LE.write<uint16_t>(FileName.size());
4444*67e74705SXin Li Out.write(FileName.data(), FileName.size());
4445*67e74705SXin Li
4446*67e74705SXin Li // Note: if a base ID was uint max, it would not be possible to load
4447*67e74705SXin Li // another module after it or have more than one entity inside it.
4448*67e74705SXin Li uint32_t None = std::numeric_limits<uint32_t>::max();
4449*67e74705SXin Li
4450*67e74705SXin Li auto writeBaseIDOrNone = [&](uint32_t BaseID, bool ShouldWrite) {
4451*67e74705SXin Li assert(BaseID < std::numeric_limits<uint32_t>::max() && "base id too high");
4452*67e74705SXin Li if (ShouldWrite)
4453*67e74705SXin Li LE.write<uint32_t>(BaseID);
4454*67e74705SXin Li else
4455*67e74705SXin Li LE.write<uint32_t>(None);
4456*67e74705SXin Li };
4457*67e74705SXin Li
4458*67e74705SXin Li // These values should be unique within a chain, since they will be read
4459*67e74705SXin Li // as keys into ContinuousRangeMaps.
4460*67e74705SXin Li writeBaseIDOrNone(M->SLocEntryBaseOffset, M->LocalNumSLocEntries);
4461*67e74705SXin Li writeBaseIDOrNone(M->BaseIdentifierID, M->LocalNumIdentifiers);
4462*67e74705SXin Li writeBaseIDOrNone(M->BaseMacroID, M->LocalNumMacros);
4463*67e74705SXin Li writeBaseIDOrNone(M->BasePreprocessedEntityID,
4464*67e74705SXin Li M->NumPreprocessedEntities);
4465*67e74705SXin Li writeBaseIDOrNone(M->BaseSubmoduleID, M->LocalNumSubmodules);
4466*67e74705SXin Li writeBaseIDOrNone(M->BaseSelectorID, M->LocalNumSelectors);
4467*67e74705SXin Li writeBaseIDOrNone(M->BaseDeclID, M->LocalNumDecls);
4468*67e74705SXin Li writeBaseIDOrNone(M->BaseTypeIndex, M->LocalNumTypes);
4469*67e74705SXin Li }
4470*67e74705SXin Li }
4471*67e74705SXin Li RecordData::value_type Record[] = {MODULE_OFFSET_MAP};
4472*67e74705SXin Li Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev, Record,
4473*67e74705SXin Li Buffer.data(), Buffer.size());
4474*67e74705SXin Li }
4475*67e74705SXin Li
4476*67e74705SXin Li RecordData DeclUpdatesOffsetsRecord;
4477*67e74705SXin Li
4478*67e74705SXin Li // Keep writing types, declarations, and declaration update records
4479*67e74705SXin Li // until we've emitted all of them.
4480*67e74705SXin Li Stream.EnterSubblock(DECLTYPES_BLOCK_ID, /*bits for abbreviations*/5);
4481*67e74705SXin Li WriteTypeAbbrevs();
4482*67e74705SXin Li WriteDeclAbbrevs();
4483*67e74705SXin Li do {
4484*67e74705SXin Li WriteDeclUpdatesBlocks(DeclUpdatesOffsetsRecord);
4485*67e74705SXin Li while (!DeclTypesToEmit.empty()) {
4486*67e74705SXin Li DeclOrType DOT = DeclTypesToEmit.front();
4487*67e74705SXin Li DeclTypesToEmit.pop();
4488*67e74705SXin Li if (DOT.isType())
4489*67e74705SXin Li WriteType(DOT.getType());
4490*67e74705SXin Li else
4491*67e74705SXin Li WriteDecl(Context, DOT.getDecl());
4492*67e74705SXin Li }
4493*67e74705SXin Li } while (!DeclUpdates.empty());
4494*67e74705SXin Li Stream.ExitBlock();
4495*67e74705SXin Li
4496*67e74705SXin Li DoneWritingDeclsAndTypes = true;
4497*67e74705SXin Li
4498*67e74705SXin Li // These things can only be done once we've written out decls and types.
4499*67e74705SXin Li WriteTypeDeclOffsets();
4500*67e74705SXin Li if (!DeclUpdatesOffsetsRecord.empty())
4501*67e74705SXin Li Stream.EmitRecord(DECL_UPDATE_OFFSETS, DeclUpdatesOffsetsRecord);
4502*67e74705SXin Li WriteFileDeclIDsMap();
4503*67e74705SXin Li WriteSourceManagerBlock(Context.getSourceManager(), PP);
4504*67e74705SXin Li WriteComments();
4505*67e74705SXin Li WritePreprocessor(PP, isModule);
4506*67e74705SXin Li WriteHeaderSearch(PP.getHeaderSearchInfo());
4507*67e74705SXin Li WriteSelectors(SemaRef);
4508*67e74705SXin Li WriteReferencedSelectorsPool(SemaRef);
4509*67e74705SXin Li WriteLateParsedTemplates(SemaRef);
4510*67e74705SXin Li WriteIdentifierTable(PP, SemaRef.IdResolver, isModule);
4511*67e74705SXin Li WriteFPPragmaOptions(SemaRef.getFPOptions());
4512*67e74705SXin Li WriteOpenCLExtensions(SemaRef);
4513*67e74705SXin Li WritePragmaDiagnosticMappings(Context.getDiagnostics(), isModule);
4514*67e74705SXin Li
4515*67e74705SXin Li // If we're emitting a module, write out the submodule information.
4516*67e74705SXin Li if (WritingModule)
4517*67e74705SXin Li WriteSubmodules(WritingModule);
4518*67e74705SXin Li
4519*67e74705SXin Li Stream.EmitRecord(SPECIAL_TYPES, SpecialTypes);
4520*67e74705SXin Li
4521*67e74705SXin Li // Write the record containing external, unnamed definitions.
4522*67e74705SXin Li if (!EagerlyDeserializedDecls.empty())
4523*67e74705SXin Li Stream.EmitRecord(EAGERLY_DESERIALIZED_DECLS, EagerlyDeserializedDecls);
4524*67e74705SXin Li
4525*67e74705SXin Li // Write the record containing tentative definitions.
4526*67e74705SXin Li if (!TentativeDefinitions.empty())
4527*67e74705SXin Li Stream.EmitRecord(TENTATIVE_DEFINITIONS, TentativeDefinitions);
4528*67e74705SXin Li
4529*67e74705SXin Li // Write the record containing unused file scoped decls.
4530*67e74705SXin Li if (!UnusedFileScopedDecls.empty())
4531*67e74705SXin Li Stream.EmitRecord(UNUSED_FILESCOPED_DECLS, UnusedFileScopedDecls);
4532*67e74705SXin Li
4533*67e74705SXin Li // Write the record containing weak undeclared identifiers.
4534*67e74705SXin Li if (!WeakUndeclaredIdentifiers.empty())
4535*67e74705SXin Li Stream.EmitRecord(WEAK_UNDECLARED_IDENTIFIERS,
4536*67e74705SXin Li WeakUndeclaredIdentifiers);
4537*67e74705SXin Li
4538*67e74705SXin Li // Write the record containing ext_vector type names.
4539*67e74705SXin Li if (!ExtVectorDecls.empty())
4540*67e74705SXin Li Stream.EmitRecord(EXT_VECTOR_DECLS, ExtVectorDecls);
4541*67e74705SXin Li
4542*67e74705SXin Li // Write the record containing VTable uses information.
4543*67e74705SXin Li if (!VTableUses.empty())
4544*67e74705SXin Li Stream.EmitRecord(VTABLE_USES, VTableUses);
4545*67e74705SXin Li
4546*67e74705SXin Li // Write the record containing potentially unused local typedefs.
4547*67e74705SXin Li if (!UnusedLocalTypedefNameCandidates.empty())
4548*67e74705SXin Li Stream.EmitRecord(UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES,
4549*67e74705SXin Li UnusedLocalTypedefNameCandidates);
4550*67e74705SXin Li
4551*67e74705SXin Li // Write the record containing pending implicit instantiations.
4552*67e74705SXin Li if (!PendingInstantiations.empty())
4553*67e74705SXin Li Stream.EmitRecord(PENDING_IMPLICIT_INSTANTIATIONS, PendingInstantiations);
4554*67e74705SXin Li
4555*67e74705SXin Li // Write the record containing declaration references of Sema.
4556*67e74705SXin Li if (!SemaDeclRefs.empty())
4557*67e74705SXin Li Stream.EmitRecord(SEMA_DECL_REFS, SemaDeclRefs);
4558*67e74705SXin Li
4559*67e74705SXin Li // Write the record containing CUDA-specific declaration references.
4560*67e74705SXin Li if (!CUDASpecialDeclRefs.empty())
4561*67e74705SXin Li Stream.EmitRecord(CUDA_SPECIAL_DECL_REFS, CUDASpecialDeclRefs);
4562*67e74705SXin Li
4563*67e74705SXin Li // Write the delegating constructors.
4564*67e74705SXin Li if (!DelegatingCtorDecls.empty())
4565*67e74705SXin Li Stream.EmitRecord(DELEGATING_CTORS, DelegatingCtorDecls);
4566*67e74705SXin Li
4567*67e74705SXin Li // Write the known namespaces.
4568*67e74705SXin Li if (!KnownNamespaces.empty())
4569*67e74705SXin Li Stream.EmitRecord(KNOWN_NAMESPACES, KnownNamespaces);
4570*67e74705SXin Li
4571*67e74705SXin Li // Write the undefined internal functions and variables, and inline functions.
4572*67e74705SXin Li if (!UndefinedButUsed.empty())
4573*67e74705SXin Li Stream.EmitRecord(UNDEFINED_BUT_USED, UndefinedButUsed);
4574*67e74705SXin Li
4575*67e74705SXin Li if (!DeleteExprsToAnalyze.empty())
4576*67e74705SXin Li Stream.EmitRecord(DELETE_EXPRS_TO_ANALYZE, DeleteExprsToAnalyze);
4577*67e74705SXin Li
4578*67e74705SXin Li // Write the visible updates to DeclContexts.
4579*67e74705SXin Li for (auto *DC : UpdatedDeclContexts)
4580*67e74705SXin Li WriteDeclContextVisibleUpdate(DC);
4581*67e74705SXin Li
4582*67e74705SXin Li if (!WritingModule) {
4583*67e74705SXin Li // Write the submodules that were imported, if any.
4584*67e74705SXin Li struct ModuleInfo {
4585*67e74705SXin Li uint64_t ID;
4586*67e74705SXin Li Module *M;
4587*67e74705SXin Li ModuleInfo(uint64_t ID, Module *M) : ID(ID), M(M) {}
4588*67e74705SXin Li };
4589*67e74705SXin Li llvm::SmallVector<ModuleInfo, 64> Imports;
4590*67e74705SXin Li for (const auto *I : Context.local_imports()) {
4591*67e74705SXin Li assert(SubmoduleIDs.find(I->getImportedModule()) != SubmoduleIDs.end());
4592*67e74705SXin Li Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],
4593*67e74705SXin Li I->getImportedModule()));
4594*67e74705SXin Li }
4595*67e74705SXin Li
4596*67e74705SXin Li if (!Imports.empty()) {
4597*67e74705SXin Li auto Cmp = [](const ModuleInfo &A, const ModuleInfo &B) {
4598*67e74705SXin Li return A.ID < B.ID;
4599*67e74705SXin Li };
4600*67e74705SXin Li auto Eq = [](const ModuleInfo &A, const ModuleInfo &B) {
4601*67e74705SXin Li return A.ID == B.ID;
4602*67e74705SXin Li };
4603*67e74705SXin Li
4604*67e74705SXin Li // Sort and deduplicate module IDs.
4605*67e74705SXin Li std::sort(Imports.begin(), Imports.end(), Cmp);
4606*67e74705SXin Li Imports.erase(std::unique(Imports.begin(), Imports.end(), Eq),
4607*67e74705SXin Li Imports.end());
4608*67e74705SXin Li
4609*67e74705SXin Li RecordData ImportedModules;
4610*67e74705SXin Li for (const auto &Import : Imports) {
4611*67e74705SXin Li ImportedModules.push_back(Import.ID);
4612*67e74705SXin Li // FIXME: If the module has macros imported then later has declarations
4613*67e74705SXin Li // imported, this location won't be the right one as a location for the
4614*67e74705SXin Li // declaration imports.
4615*67e74705SXin Li AddSourceLocation(PP.getModuleImportLoc(Import.M), ImportedModules);
4616*67e74705SXin Li }
4617*67e74705SXin Li
4618*67e74705SXin Li Stream.EmitRecord(IMPORTED_MODULES, ImportedModules);
4619*67e74705SXin Li }
4620*67e74705SXin Li }
4621*67e74705SXin Li
4622*67e74705SXin Li WriteObjCCategories();
4623*67e74705SXin Li if(!WritingModule) {
4624*67e74705SXin Li WriteOptimizePragmaOptions(SemaRef);
4625*67e74705SXin Li WriteMSStructPragmaOptions(SemaRef);
4626*67e74705SXin Li WriteMSPointersToMembersPragmaOptions(SemaRef);
4627*67e74705SXin Li }
4628*67e74705SXin Li
4629*67e74705SXin Li // Some simple statistics
4630*67e74705SXin Li RecordData::value_type Record[] = {
4631*67e74705SXin Li NumStatements, NumMacros, NumLexicalDeclContexts, NumVisibleDeclContexts};
4632*67e74705SXin Li Stream.EmitRecord(STATISTICS, Record);
4633*67e74705SXin Li Stream.ExitBlock();
4634*67e74705SXin Li
4635*67e74705SXin Li // Write the module file extension blocks.
4636*67e74705SXin Li for (const auto &ExtWriter : ModuleFileExtensionWriters)
4637*67e74705SXin Li WriteModuleFileExtension(SemaRef, *ExtWriter);
4638*67e74705SXin Li
4639*67e74705SXin Li return Signature;
4640*67e74705SXin Li }
4641*67e74705SXin Li
WriteDeclUpdatesBlocks(RecordDataImpl & OffsetsRecord)4642*67e74705SXin Li void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) {
4643*67e74705SXin Li if (DeclUpdates.empty())
4644*67e74705SXin Li return;
4645*67e74705SXin Li
4646*67e74705SXin Li DeclUpdateMap LocalUpdates;
4647*67e74705SXin Li LocalUpdates.swap(DeclUpdates);
4648*67e74705SXin Li
4649*67e74705SXin Li for (auto &DeclUpdate : LocalUpdates) {
4650*67e74705SXin Li const Decl *D = DeclUpdate.first;
4651*67e74705SXin Li
4652*67e74705SXin Li bool HasUpdatedBody = false;
4653*67e74705SXin Li RecordData RecordData;
4654*67e74705SXin Li ASTRecordWriter Record(*this, RecordData);
4655*67e74705SXin Li for (auto &Update : DeclUpdate.second) {
4656*67e74705SXin Li DeclUpdateKind Kind = (DeclUpdateKind)Update.getKind();
4657*67e74705SXin Li
4658*67e74705SXin Li // An updated body is emitted last, so that the reader doesn't need
4659*67e74705SXin Li // to skip over the lazy body to reach statements for other records.
4660*67e74705SXin Li if (Kind == UPD_CXX_ADDED_FUNCTION_DEFINITION)
4661*67e74705SXin Li HasUpdatedBody = true;
4662*67e74705SXin Li else
4663*67e74705SXin Li Record.push_back(Kind);
4664*67e74705SXin Li
4665*67e74705SXin Li switch (Kind) {
4666*67e74705SXin Li case UPD_CXX_ADDED_IMPLICIT_MEMBER:
4667*67e74705SXin Li case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION:
4668*67e74705SXin Li case UPD_CXX_ADDED_ANONYMOUS_NAMESPACE:
4669*67e74705SXin Li assert(Update.getDecl() && "no decl to add?");
4670*67e74705SXin Li Record.push_back(GetDeclRef(Update.getDecl()));
4671*67e74705SXin Li break;
4672*67e74705SXin Li
4673*67e74705SXin Li case UPD_CXX_ADDED_FUNCTION_DEFINITION:
4674*67e74705SXin Li break;
4675*67e74705SXin Li
4676*67e74705SXin Li case UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER:
4677*67e74705SXin Li Record.AddSourceLocation(Update.getLoc());
4678*67e74705SXin Li break;
4679*67e74705SXin Li
4680*67e74705SXin Li case UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT:
4681*67e74705SXin Li Record.AddStmt(const_cast<Expr *>(
4682*67e74705SXin Li cast<ParmVarDecl>(Update.getDecl())->getDefaultArg()));
4683*67e74705SXin Li break;
4684*67e74705SXin Li
4685*67e74705SXin Li case UPD_CXX_INSTANTIATED_CLASS_DEFINITION: {
4686*67e74705SXin Li auto *RD = cast<CXXRecordDecl>(D);
4687*67e74705SXin Li UpdatedDeclContexts.insert(RD->getPrimaryContext());
4688*67e74705SXin Li Record.AddCXXDefinitionData(RD);
4689*67e74705SXin Li Record.AddOffset(WriteDeclContextLexicalBlock(
4690*67e74705SXin Li *Context, const_cast<CXXRecordDecl *>(RD)));
4691*67e74705SXin Li
4692*67e74705SXin Li // This state is sometimes updated by template instantiation, when we
4693*67e74705SXin Li // switch from the specialization referring to the template declaration
4694*67e74705SXin Li // to it referring to the template definition.
4695*67e74705SXin Li if (auto *MSInfo = RD->getMemberSpecializationInfo()) {
4696*67e74705SXin Li Record.push_back(MSInfo->getTemplateSpecializationKind());
4697*67e74705SXin Li Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
4698*67e74705SXin Li } else {
4699*67e74705SXin Li auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4700*67e74705SXin Li Record.push_back(Spec->getTemplateSpecializationKind());
4701*67e74705SXin Li Record.AddSourceLocation(Spec->getPointOfInstantiation());
4702*67e74705SXin Li
4703*67e74705SXin Li // The instantiation might have been resolved to a partial
4704*67e74705SXin Li // specialization. If so, record which one.
4705*67e74705SXin Li auto From = Spec->getInstantiatedFrom();
4706*67e74705SXin Li if (auto PartialSpec =
4707*67e74705SXin Li From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) {
4708*67e74705SXin Li Record.push_back(true);
4709*67e74705SXin Li Record.AddDeclRef(PartialSpec);
4710*67e74705SXin Li Record.AddTemplateArgumentList(
4711*67e74705SXin Li &Spec->getTemplateInstantiationArgs());
4712*67e74705SXin Li } else {
4713*67e74705SXin Li Record.push_back(false);
4714*67e74705SXin Li }
4715*67e74705SXin Li }
4716*67e74705SXin Li Record.push_back(RD->getTagKind());
4717*67e74705SXin Li Record.AddSourceLocation(RD->getLocation());
4718*67e74705SXin Li Record.AddSourceLocation(RD->getLocStart());
4719*67e74705SXin Li Record.AddSourceLocation(RD->getRBraceLoc());
4720*67e74705SXin Li
4721*67e74705SXin Li // Instantiation may change attributes; write them all out afresh.
4722*67e74705SXin Li Record.push_back(D->hasAttrs());
4723*67e74705SXin Li if (D->hasAttrs())
4724*67e74705SXin Li Record.AddAttributes(D->getAttrs());
4725*67e74705SXin Li
4726*67e74705SXin Li // FIXME: Ensure we don't get here for explicit instantiations.
4727*67e74705SXin Li break;
4728*67e74705SXin Li }
4729*67e74705SXin Li
4730*67e74705SXin Li case UPD_CXX_RESOLVED_DTOR_DELETE:
4731*67e74705SXin Li Record.AddDeclRef(Update.getDecl());
4732*67e74705SXin Li break;
4733*67e74705SXin Li
4734*67e74705SXin Li case UPD_CXX_RESOLVED_EXCEPTION_SPEC:
4735*67e74705SXin Li addExceptionSpec(
4736*67e74705SXin Li cast<FunctionDecl>(D)->getType()->castAs<FunctionProtoType>(),
4737*67e74705SXin Li Record);
4738*67e74705SXin Li break;
4739*67e74705SXin Li
4740*67e74705SXin Li case UPD_CXX_DEDUCED_RETURN_TYPE:
4741*67e74705SXin Li Record.push_back(GetOrCreateTypeID(Update.getType()));
4742*67e74705SXin Li break;
4743*67e74705SXin Li
4744*67e74705SXin Li case UPD_DECL_MARKED_USED:
4745*67e74705SXin Li break;
4746*67e74705SXin Li
4747*67e74705SXin Li case UPD_MANGLING_NUMBER:
4748*67e74705SXin Li case UPD_STATIC_LOCAL_NUMBER:
4749*67e74705SXin Li Record.push_back(Update.getNumber());
4750*67e74705SXin Li break;
4751*67e74705SXin Li
4752*67e74705SXin Li case UPD_DECL_MARKED_OPENMP_THREADPRIVATE:
4753*67e74705SXin Li Record.AddSourceRange(
4754*67e74705SXin Li D->getAttr<OMPThreadPrivateDeclAttr>()->getRange());
4755*67e74705SXin Li break;
4756*67e74705SXin Li
4757*67e74705SXin Li case UPD_DECL_MARKED_OPENMP_DECLARETARGET:
4758*67e74705SXin Li Record.AddSourceRange(
4759*67e74705SXin Li D->getAttr<OMPDeclareTargetDeclAttr>()->getRange());
4760*67e74705SXin Li break;
4761*67e74705SXin Li
4762*67e74705SXin Li case UPD_DECL_EXPORTED:
4763*67e74705SXin Li Record.push_back(getSubmoduleID(Update.getModule()));
4764*67e74705SXin Li break;
4765*67e74705SXin Li
4766*67e74705SXin Li case UPD_ADDED_ATTR_TO_RECORD:
4767*67e74705SXin Li Record.AddAttributes(llvm::makeArrayRef(Update.getAttr()));
4768*67e74705SXin Li break;
4769*67e74705SXin Li }
4770*67e74705SXin Li }
4771*67e74705SXin Li
4772*67e74705SXin Li if (HasUpdatedBody) {
4773*67e74705SXin Li const auto *Def = cast<FunctionDecl>(D);
4774*67e74705SXin Li Record.push_back(UPD_CXX_ADDED_FUNCTION_DEFINITION);
4775*67e74705SXin Li Record.push_back(Def->isInlined());
4776*67e74705SXin Li Record.AddSourceLocation(Def->getInnerLocStart());
4777*67e74705SXin Li Record.AddFunctionDefinition(Def);
4778*67e74705SXin Li }
4779*67e74705SXin Li
4780*67e74705SXin Li OffsetsRecord.push_back(GetDeclRef(D));
4781*67e74705SXin Li OffsetsRecord.push_back(Record.Emit(DECL_UPDATES));
4782*67e74705SXin Li }
4783*67e74705SXin Li }
4784*67e74705SXin Li
AddSourceLocation(SourceLocation Loc,RecordDataImpl & Record)4785*67e74705SXin Li void ASTWriter::AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record) {
4786*67e74705SXin Li uint32_t Raw = Loc.getRawEncoding();
4787*67e74705SXin Li Record.push_back((Raw << 1) | (Raw >> 31));
4788*67e74705SXin Li }
4789*67e74705SXin Li
AddSourceRange(SourceRange Range,RecordDataImpl & Record)4790*67e74705SXin Li void ASTWriter::AddSourceRange(SourceRange Range, RecordDataImpl &Record) {
4791*67e74705SXin Li AddSourceLocation(Range.getBegin(), Record);
4792*67e74705SXin Li AddSourceLocation(Range.getEnd(), Record);
4793*67e74705SXin Li }
4794*67e74705SXin Li
AddAPInt(const llvm::APInt & Value)4795*67e74705SXin Li void ASTRecordWriter::AddAPInt(const llvm::APInt &Value) {
4796*67e74705SXin Li Record->push_back(Value.getBitWidth());
4797*67e74705SXin Li const uint64_t *Words = Value.getRawData();
4798*67e74705SXin Li Record->append(Words, Words + Value.getNumWords());
4799*67e74705SXin Li }
4800*67e74705SXin Li
AddAPSInt(const llvm::APSInt & Value)4801*67e74705SXin Li void ASTRecordWriter::AddAPSInt(const llvm::APSInt &Value) {
4802*67e74705SXin Li Record->push_back(Value.isUnsigned());
4803*67e74705SXin Li AddAPInt(Value);
4804*67e74705SXin Li }
4805*67e74705SXin Li
AddAPFloat(const llvm::APFloat & Value)4806*67e74705SXin Li void ASTRecordWriter::AddAPFloat(const llvm::APFloat &Value) {
4807*67e74705SXin Li AddAPInt(Value.bitcastToAPInt());
4808*67e74705SXin Li }
4809*67e74705SXin Li
AddIdentifierRef(const IdentifierInfo * II,RecordDataImpl & Record)4810*67e74705SXin Li void ASTWriter::AddIdentifierRef(const IdentifierInfo *II, RecordDataImpl &Record) {
4811*67e74705SXin Li Record.push_back(getIdentifierRef(II));
4812*67e74705SXin Li }
4813*67e74705SXin Li
getIdentifierRef(const IdentifierInfo * II)4814*67e74705SXin Li IdentID ASTWriter::getIdentifierRef(const IdentifierInfo *II) {
4815*67e74705SXin Li if (!II)
4816*67e74705SXin Li return 0;
4817*67e74705SXin Li
4818*67e74705SXin Li IdentID &ID = IdentifierIDs[II];
4819*67e74705SXin Li if (ID == 0)
4820*67e74705SXin Li ID = NextIdentID++;
4821*67e74705SXin Li return ID;
4822*67e74705SXin Li }
4823*67e74705SXin Li
getMacroRef(MacroInfo * MI,const IdentifierInfo * Name)4824*67e74705SXin Li MacroID ASTWriter::getMacroRef(MacroInfo *MI, const IdentifierInfo *Name) {
4825*67e74705SXin Li // Don't emit builtin macros like __LINE__ to the AST file unless they
4826*67e74705SXin Li // have been redefined by the header (in which case they are not
4827*67e74705SXin Li // isBuiltinMacro).
4828*67e74705SXin Li if (!MI || MI->isBuiltinMacro())
4829*67e74705SXin Li return 0;
4830*67e74705SXin Li
4831*67e74705SXin Li MacroID &ID = MacroIDs[MI];
4832*67e74705SXin Li if (ID == 0) {
4833*67e74705SXin Li ID = NextMacroID++;
4834*67e74705SXin Li MacroInfoToEmitData Info = { Name, MI, ID };
4835*67e74705SXin Li MacroInfosToEmit.push_back(Info);
4836*67e74705SXin Li }
4837*67e74705SXin Li return ID;
4838*67e74705SXin Li }
4839*67e74705SXin Li
getMacroID(MacroInfo * MI)4840*67e74705SXin Li MacroID ASTWriter::getMacroID(MacroInfo *MI) {
4841*67e74705SXin Li if (!MI || MI->isBuiltinMacro())
4842*67e74705SXin Li return 0;
4843*67e74705SXin Li
4844*67e74705SXin Li assert(MacroIDs.find(MI) != MacroIDs.end() && "Macro not emitted!");
4845*67e74705SXin Li return MacroIDs[MI];
4846*67e74705SXin Li }
4847*67e74705SXin Li
getMacroDirectivesOffset(const IdentifierInfo * Name)4848*67e74705SXin Li uint64_t ASTWriter::getMacroDirectivesOffset(const IdentifierInfo *Name) {
4849*67e74705SXin Li return IdentMacroDirectivesOffsetMap.lookup(Name);
4850*67e74705SXin Li }
4851*67e74705SXin Li
AddSelectorRef(const Selector SelRef)4852*67e74705SXin Li void ASTRecordWriter::AddSelectorRef(const Selector SelRef) {
4853*67e74705SXin Li Record->push_back(Writer->getSelectorRef(SelRef));
4854*67e74705SXin Li }
4855*67e74705SXin Li
getSelectorRef(Selector Sel)4856*67e74705SXin Li SelectorID ASTWriter::getSelectorRef(Selector Sel) {
4857*67e74705SXin Li if (Sel.getAsOpaquePtr() == nullptr) {
4858*67e74705SXin Li return 0;
4859*67e74705SXin Li }
4860*67e74705SXin Li
4861*67e74705SXin Li SelectorID SID = SelectorIDs[Sel];
4862*67e74705SXin Li if (SID == 0 && Chain) {
4863*67e74705SXin Li // This might trigger a ReadSelector callback, which will set the ID for
4864*67e74705SXin Li // this selector.
4865*67e74705SXin Li Chain->LoadSelector(Sel);
4866*67e74705SXin Li SID = SelectorIDs[Sel];
4867*67e74705SXin Li }
4868*67e74705SXin Li if (SID == 0) {
4869*67e74705SXin Li SID = NextSelectorID++;
4870*67e74705SXin Li SelectorIDs[Sel] = SID;
4871*67e74705SXin Li }
4872*67e74705SXin Li return SID;
4873*67e74705SXin Li }
4874*67e74705SXin Li
AddCXXTemporary(const CXXTemporary * Temp)4875*67e74705SXin Li void ASTRecordWriter::AddCXXTemporary(const CXXTemporary *Temp) {
4876*67e74705SXin Li AddDeclRef(Temp->getDestructor());
4877*67e74705SXin Li }
4878*67e74705SXin Li
AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind,const TemplateArgumentLocInfo & Arg)4879*67e74705SXin Li void ASTRecordWriter::AddTemplateArgumentLocInfo(
4880*67e74705SXin Li TemplateArgument::ArgKind Kind, const TemplateArgumentLocInfo &Arg) {
4881*67e74705SXin Li switch (Kind) {
4882*67e74705SXin Li case TemplateArgument::Expression:
4883*67e74705SXin Li AddStmt(Arg.getAsExpr());
4884*67e74705SXin Li break;
4885*67e74705SXin Li case TemplateArgument::Type:
4886*67e74705SXin Li AddTypeSourceInfo(Arg.getAsTypeSourceInfo());
4887*67e74705SXin Li break;
4888*67e74705SXin Li case TemplateArgument::Template:
4889*67e74705SXin Li AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc());
4890*67e74705SXin Li AddSourceLocation(Arg.getTemplateNameLoc());
4891*67e74705SXin Li break;
4892*67e74705SXin Li case TemplateArgument::TemplateExpansion:
4893*67e74705SXin Li AddNestedNameSpecifierLoc(Arg.getTemplateQualifierLoc());
4894*67e74705SXin Li AddSourceLocation(Arg.getTemplateNameLoc());
4895*67e74705SXin Li AddSourceLocation(Arg.getTemplateEllipsisLoc());
4896*67e74705SXin Li break;
4897*67e74705SXin Li case TemplateArgument::Null:
4898*67e74705SXin Li case TemplateArgument::Integral:
4899*67e74705SXin Li case TemplateArgument::Declaration:
4900*67e74705SXin Li case TemplateArgument::NullPtr:
4901*67e74705SXin Li case TemplateArgument::Pack:
4902*67e74705SXin Li // FIXME: Is this right?
4903*67e74705SXin Li break;
4904*67e74705SXin Li }
4905*67e74705SXin Li }
4906*67e74705SXin Li
AddTemplateArgumentLoc(const TemplateArgumentLoc & Arg)4907*67e74705SXin Li void ASTRecordWriter::AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg) {
4908*67e74705SXin Li AddTemplateArgument(Arg.getArgument());
4909*67e74705SXin Li
4910*67e74705SXin Li if (Arg.getArgument().getKind() == TemplateArgument::Expression) {
4911*67e74705SXin Li bool InfoHasSameExpr
4912*67e74705SXin Li = Arg.getArgument().getAsExpr() == Arg.getLocInfo().getAsExpr();
4913*67e74705SXin Li Record->push_back(InfoHasSameExpr);
4914*67e74705SXin Li if (InfoHasSameExpr)
4915*67e74705SXin Li return; // Avoid storing the same expr twice.
4916*67e74705SXin Li }
4917*67e74705SXin Li AddTemplateArgumentLocInfo(Arg.getArgument().getKind(), Arg.getLocInfo());
4918*67e74705SXin Li }
4919*67e74705SXin Li
AddTypeSourceInfo(TypeSourceInfo * TInfo)4920*67e74705SXin Li void ASTRecordWriter::AddTypeSourceInfo(TypeSourceInfo *TInfo) {
4921*67e74705SXin Li if (!TInfo) {
4922*67e74705SXin Li AddTypeRef(QualType());
4923*67e74705SXin Li return;
4924*67e74705SXin Li }
4925*67e74705SXin Li
4926*67e74705SXin Li AddTypeLoc(TInfo->getTypeLoc());
4927*67e74705SXin Li }
4928*67e74705SXin Li
AddTypeLoc(TypeLoc TL)4929*67e74705SXin Li void ASTRecordWriter::AddTypeLoc(TypeLoc TL) {
4930*67e74705SXin Li AddTypeRef(TL.getType());
4931*67e74705SXin Li
4932*67e74705SXin Li TypeLocWriter TLW(*this);
4933*67e74705SXin Li for (; !TL.isNull(); TL = TL.getNextTypeLoc())
4934*67e74705SXin Li TLW.Visit(TL);
4935*67e74705SXin Li }
4936*67e74705SXin Li
AddTypeRef(QualType T,RecordDataImpl & Record)4937*67e74705SXin Li void ASTWriter::AddTypeRef(QualType T, RecordDataImpl &Record) {
4938*67e74705SXin Li Record.push_back(GetOrCreateTypeID(T));
4939*67e74705SXin Li }
4940*67e74705SXin Li
GetOrCreateTypeID(QualType T)4941*67e74705SXin Li TypeID ASTWriter::GetOrCreateTypeID(QualType T) {
4942*67e74705SXin Li assert(Context);
4943*67e74705SXin Li return MakeTypeID(*Context, T, [&](QualType T) -> TypeIdx {
4944*67e74705SXin Li if (T.isNull())
4945*67e74705SXin Li return TypeIdx();
4946*67e74705SXin Li assert(!T.getLocalFastQualifiers());
4947*67e74705SXin Li
4948*67e74705SXin Li TypeIdx &Idx = TypeIdxs[T];
4949*67e74705SXin Li if (Idx.getIndex() == 0) {
4950*67e74705SXin Li if (DoneWritingDeclsAndTypes) {
4951*67e74705SXin Li assert(0 && "New type seen after serializing all the types to emit!");
4952*67e74705SXin Li return TypeIdx();
4953*67e74705SXin Li }
4954*67e74705SXin Li
4955*67e74705SXin Li // We haven't seen this type before. Assign it a new ID and put it
4956*67e74705SXin Li // into the queue of types to emit.
4957*67e74705SXin Li Idx = TypeIdx(NextTypeID++);
4958*67e74705SXin Li DeclTypesToEmit.push(T);
4959*67e74705SXin Li }
4960*67e74705SXin Li return Idx;
4961*67e74705SXin Li });
4962*67e74705SXin Li }
4963*67e74705SXin Li
getTypeID(QualType T) const4964*67e74705SXin Li TypeID ASTWriter::getTypeID(QualType T) const {
4965*67e74705SXin Li assert(Context);
4966*67e74705SXin Li return MakeTypeID(*Context, T, [&](QualType T) -> TypeIdx {
4967*67e74705SXin Li if (T.isNull())
4968*67e74705SXin Li return TypeIdx();
4969*67e74705SXin Li assert(!T.getLocalFastQualifiers());
4970*67e74705SXin Li
4971*67e74705SXin Li TypeIdxMap::const_iterator I = TypeIdxs.find(T);
4972*67e74705SXin Li assert(I != TypeIdxs.end() && "Type not emitted!");
4973*67e74705SXin Li return I->second;
4974*67e74705SXin Li });
4975*67e74705SXin Li }
4976*67e74705SXin Li
AddDeclRef(const Decl * D,RecordDataImpl & Record)4977*67e74705SXin Li void ASTWriter::AddDeclRef(const Decl *D, RecordDataImpl &Record) {
4978*67e74705SXin Li Record.push_back(GetDeclRef(D));
4979*67e74705SXin Li }
4980*67e74705SXin Li
GetDeclRef(const Decl * D)4981*67e74705SXin Li DeclID ASTWriter::GetDeclRef(const Decl *D) {
4982*67e74705SXin Li assert(WritingAST && "Cannot request a declaration ID before AST writing");
4983*67e74705SXin Li
4984*67e74705SXin Li if (!D) {
4985*67e74705SXin Li return 0;
4986*67e74705SXin Li }
4987*67e74705SXin Li
4988*67e74705SXin Li // If D comes from an AST file, its declaration ID is already known and
4989*67e74705SXin Li // fixed.
4990*67e74705SXin Li if (D->isFromASTFile())
4991*67e74705SXin Li return D->getGlobalID();
4992*67e74705SXin Li
4993*67e74705SXin Li assert(!(reinterpret_cast<uintptr_t>(D) & 0x01) && "Invalid decl pointer");
4994*67e74705SXin Li DeclID &ID = DeclIDs[D];
4995*67e74705SXin Li if (ID == 0) {
4996*67e74705SXin Li if (DoneWritingDeclsAndTypes) {
4997*67e74705SXin Li assert(0 && "New decl seen after serializing all the decls to emit!");
4998*67e74705SXin Li return 0;
4999*67e74705SXin Li }
5000*67e74705SXin Li
5001*67e74705SXin Li // We haven't seen this declaration before. Give it a new ID and
5002*67e74705SXin Li // enqueue it in the list of declarations to emit.
5003*67e74705SXin Li ID = NextDeclID++;
5004*67e74705SXin Li DeclTypesToEmit.push(const_cast<Decl *>(D));
5005*67e74705SXin Li }
5006*67e74705SXin Li
5007*67e74705SXin Li return ID;
5008*67e74705SXin Li }
5009*67e74705SXin Li
getDeclID(const Decl * D)5010*67e74705SXin Li DeclID ASTWriter::getDeclID(const Decl *D) {
5011*67e74705SXin Li if (!D)
5012*67e74705SXin Li return 0;
5013*67e74705SXin Li
5014*67e74705SXin Li // If D comes from an AST file, its declaration ID is already known and
5015*67e74705SXin Li // fixed.
5016*67e74705SXin Li if (D->isFromASTFile())
5017*67e74705SXin Li return D->getGlobalID();
5018*67e74705SXin Li
5019*67e74705SXin Li assert(DeclIDs.find(D) != DeclIDs.end() && "Declaration not emitted!");
5020*67e74705SXin Li return DeclIDs[D];
5021*67e74705SXin Li }
5022*67e74705SXin Li
associateDeclWithFile(const Decl * D,DeclID ID)5023*67e74705SXin Li void ASTWriter::associateDeclWithFile(const Decl *D, DeclID ID) {
5024*67e74705SXin Li assert(ID);
5025*67e74705SXin Li assert(D);
5026*67e74705SXin Li
5027*67e74705SXin Li SourceLocation Loc = D->getLocation();
5028*67e74705SXin Li if (Loc.isInvalid())
5029*67e74705SXin Li return;
5030*67e74705SXin Li
5031*67e74705SXin Li // We only keep track of the file-level declarations of each file.
5032*67e74705SXin Li if (!D->getLexicalDeclContext()->isFileContext())
5033*67e74705SXin Li return;
5034*67e74705SXin Li // FIXME: ParmVarDecls that are part of a function type of a parameter of
5035*67e74705SXin Li // a function/objc method, should not have TU as lexical context.
5036*67e74705SXin Li if (isa<ParmVarDecl>(D))
5037*67e74705SXin Li return;
5038*67e74705SXin Li
5039*67e74705SXin Li SourceManager &SM = Context->getSourceManager();
5040*67e74705SXin Li SourceLocation FileLoc = SM.getFileLoc(Loc);
5041*67e74705SXin Li assert(SM.isLocalSourceLocation(FileLoc));
5042*67e74705SXin Li FileID FID;
5043*67e74705SXin Li unsigned Offset;
5044*67e74705SXin Li std::tie(FID, Offset) = SM.getDecomposedLoc(FileLoc);
5045*67e74705SXin Li if (FID.isInvalid())
5046*67e74705SXin Li return;
5047*67e74705SXin Li assert(SM.getSLocEntry(FID).isFile());
5048*67e74705SXin Li
5049*67e74705SXin Li DeclIDInFileInfo *&Info = FileDeclIDs[FID];
5050*67e74705SXin Li if (!Info)
5051*67e74705SXin Li Info = new DeclIDInFileInfo();
5052*67e74705SXin Li
5053*67e74705SXin Li std::pair<unsigned, serialization::DeclID> LocDecl(Offset, ID);
5054*67e74705SXin Li LocDeclIDsTy &Decls = Info->DeclIDs;
5055*67e74705SXin Li
5056*67e74705SXin Li if (Decls.empty() || Decls.back().first <= Offset) {
5057*67e74705SXin Li Decls.push_back(LocDecl);
5058*67e74705SXin Li return;
5059*67e74705SXin Li }
5060*67e74705SXin Li
5061*67e74705SXin Li LocDeclIDsTy::iterator I =
5062*67e74705SXin Li std::upper_bound(Decls.begin(), Decls.end(), LocDecl, llvm::less_first());
5063*67e74705SXin Li
5064*67e74705SXin Li Decls.insert(I, LocDecl);
5065*67e74705SXin Li }
5066*67e74705SXin Li
AddDeclarationName(DeclarationName Name)5067*67e74705SXin Li void ASTRecordWriter::AddDeclarationName(DeclarationName Name) {
5068*67e74705SXin Li // FIXME: Emit a stable enum for NameKind. 0 = Identifier etc.
5069*67e74705SXin Li Record->push_back(Name.getNameKind());
5070*67e74705SXin Li switch (Name.getNameKind()) {
5071*67e74705SXin Li case DeclarationName::Identifier:
5072*67e74705SXin Li AddIdentifierRef(Name.getAsIdentifierInfo());
5073*67e74705SXin Li break;
5074*67e74705SXin Li
5075*67e74705SXin Li case DeclarationName::ObjCZeroArgSelector:
5076*67e74705SXin Li case DeclarationName::ObjCOneArgSelector:
5077*67e74705SXin Li case DeclarationName::ObjCMultiArgSelector:
5078*67e74705SXin Li AddSelectorRef(Name.getObjCSelector());
5079*67e74705SXin Li break;
5080*67e74705SXin Li
5081*67e74705SXin Li case DeclarationName::CXXConstructorName:
5082*67e74705SXin Li case DeclarationName::CXXDestructorName:
5083*67e74705SXin Li case DeclarationName::CXXConversionFunctionName:
5084*67e74705SXin Li AddTypeRef(Name.getCXXNameType());
5085*67e74705SXin Li break;
5086*67e74705SXin Li
5087*67e74705SXin Li case DeclarationName::CXXOperatorName:
5088*67e74705SXin Li Record->push_back(Name.getCXXOverloadedOperator());
5089*67e74705SXin Li break;
5090*67e74705SXin Li
5091*67e74705SXin Li case DeclarationName::CXXLiteralOperatorName:
5092*67e74705SXin Li AddIdentifierRef(Name.getCXXLiteralIdentifier());
5093*67e74705SXin Li break;
5094*67e74705SXin Li
5095*67e74705SXin Li case DeclarationName::CXXUsingDirective:
5096*67e74705SXin Li // No extra data to emit
5097*67e74705SXin Li break;
5098*67e74705SXin Li }
5099*67e74705SXin Li }
5100*67e74705SXin Li
getAnonymousDeclarationNumber(const NamedDecl * D)5101*67e74705SXin Li unsigned ASTWriter::getAnonymousDeclarationNumber(const NamedDecl *D) {
5102*67e74705SXin Li assert(needsAnonymousDeclarationNumber(D) &&
5103*67e74705SXin Li "expected an anonymous declaration");
5104*67e74705SXin Li
5105*67e74705SXin Li // Number the anonymous declarations within this context, if we've not
5106*67e74705SXin Li // already done so.
5107*67e74705SXin Li auto It = AnonymousDeclarationNumbers.find(D);
5108*67e74705SXin Li if (It == AnonymousDeclarationNumbers.end()) {
5109*67e74705SXin Li auto *DC = D->getLexicalDeclContext();
5110*67e74705SXin Li numberAnonymousDeclsWithin(DC, [&](const NamedDecl *ND, unsigned Number) {
5111*67e74705SXin Li AnonymousDeclarationNumbers[ND] = Number;
5112*67e74705SXin Li });
5113*67e74705SXin Li
5114*67e74705SXin Li It = AnonymousDeclarationNumbers.find(D);
5115*67e74705SXin Li assert(It != AnonymousDeclarationNumbers.end() &&
5116*67e74705SXin Li "declaration not found within its lexical context");
5117*67e74705SXin Li }
5118*67e74705SXin Li
5119*67e74705SXin Li return It->second;
5120*67e74705SXin Li }
5121*67e74705SXin Li
AddDeclarationNameLoc(const DeclarationNameLoc & DNLoc,DeclarationName Name)5122*67e74705SXin Li void ASTRecordWriter::AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc,
5123*67e74705SXin Li DeclarationName Name) {
5124*67e74705SXin Li switch (Name.getNameKind()) {
5125*67e74705SXin Li case DeclarationName::CXXConstructorName:
5126*67e74705SXin Li case DeclarationName::CXXDestructorName:
5127*67e74705SXin Li case DeclarationName::CXXConversionFunctionName:
5128*67e74705SXin Li AddTypeSourceInfo(DNLoc.NamedType.TInfo);
5129*67e74705SXin Li break;
5130*67e74705SXin Li
5131*67e74705SXin Li case DeclarationName::CXXOperatorName:
5132*67e74705SXin Li AddSourceLocation(SourceLocation::getFromRawEncoding(
5133*67e74705SXin Li DNLoc.CXXOperatorName.BeginOpNameLoc));
5134*67e74705SXin Li AddSourceLocation(
5135*67e74705SXin Li SourceLocation::getFromRawEncoding(DNLoc.CXXOperatorName.EndOpNameLoc));
5136*67e74705SXin Li break;
5137*67e74705SXin Li
5138*67e74705SXin Li case DeclarationName::CXXLiteralOperatorName:
5139*67e74705SXin Li AddSourceLocation(SourceLocation::getFromRawEncoding(
5140*67e74705SXin Li DNLoc.CXXLiteralOperatorName.OpNameLoc));
5141*67e74705SXin Li break;
5142*67e74705SXin Li
5143*67e74705SXin Li case DeclarationName::Identifier:
5144*67e74705SXin Li case DeclarationName::ObjCZeroArgSelector:
5145*67e74705SXin Li case DeclarationName::ObjCOneArgSelector:
5146*67e74705SXin Li case DeclarationName::ObjCMultiArgSelector:
5147*67e74705SXin Li case DeclarationName::CXXUsingDirective:
5148*67e74705SXin Li break;
5149*67e74705SXin Li }
5150*67e74705SXin Li }
5151*67e74705SXin Li
AddDeclarationNameInfo(const DeclarationNameInfo & NameInfo)5152*67e74705SXin Li void ASTRecordWriter::AddDeclarationNameInfo(
5153*67e74705SXin Li const DeclarationNameInfo &NameInfo) {
5154*67e74705SXin Li AddDeclarationName(NameInfo.getName());
5155*67e74705SXin Li AddSourceLocation(NameInfo.getLoc());
5156*67e74705SXin Li AddDeclarationNameLoc(NameInfo.getInfo(), NameInfo.getName());
5157*67e74705SXin Li }
5158*67e74705SXin Li
AddQualifierInfo(const QualifierInfo & Info)5159*67e74705SXin Li void ASTRecordWriter::AddQualifierInfo(const QualifierInfo &Info) {
5160*67e74705SXin Li AddNestedNameSpecifierLoc(Info.QualifierLoc);
5161*67e74705SXin Li Record->push_back(Info.NumTemplParamLists);
5162*67e74705SXin Li for (unsigned i=0, e=Info.NumTemplParamLists; i != e; ++i)
5163*67e74705SXin Li AddTemplateParameterList(Info.TemplParamLists[i]);
5164*67e74705SXin Li }
5165*67e74705SXin Li
AddNestedNameSpecifier(NestedNameSpecifier * NNS)5166*67e74705SXin Li void ASTRecordWriter::AddNestedNameSpecifier(NestedNameSpecifier *NNS) {
5167*67e74705SXin Li // Nested name specifiers usually aren't too long. I think that 8 would
5168*67e74705SXin Li // typically accommodate the vast majority.
5169*67e74705SXin Li SmallVector<NestedNameSpecifier *, 8> NestedNames;
5170*67e74705SXin Li
5171*67e74705SXin Li // Push each of the NNS's onto a stack for serialization in reverse order.
5172*67e74705SXin Li while (NNS) {
5173*67e74705SXin Li NestedNames.push_back(NNS);
5174*67e74705SXin Li NNS = NNS->getPrefix();
5175*67e74705SXin Li }
5176*67e74705SXin Li
5177*67e74705SXin Li Record->push_back(NestedNames.size());
5178*67e74705SXin Li while(!NestedNames.empty()) {
5179*67e74705SXin Li NNS = NestedNames.pop_back_val();
5180*67e74705SXin Li NestedNameSpecifier::SpecifierKind Kind = NNS->getKind();
5181*67e74705SXin Li Record->push_back(Kind);
5182*67e74705SXin Li switch (Kind) {
5183*67e74705SXin Li case NestedNameSpecifier::Identifier:
5184*67e74705SXin Li AddIdentifierRef(NNS->getAsIdentifier());
5185*67e74705SXin Li break;
5186*67e74705SXin Li
5187*67e74705SXin Li case NestedNameSpecifier::Namespace:
5188*67e74705SXin Li AddDeclRef(NNS->getAsNamespace());
5189*67e74705SXin Li break;
5190*67e74705SXin Li
5191*67e74705SXin Li case NestedNameSpecifier::NamespaceAlias:
5192*67e74705SXin Li AddDeclRef(NNS->getAsNamespaceAlias());
5193*67e74705SXin Li break;
5194*67e74705SXin Li
5195*67e74705SXin Li case NestedNameSpecifier::TypeSpec:
5196*67e74705SXin Li case NestedNameSpecifier::TypeSpecWithTemplate:
5197*67e74705SXin Li AddTypeRef(QualType(NNS->getAsType(), 0));
5198*67e74705SXin Li Record->push_back(Kind == NestedNameSpecifier::TypeSpecWithTemplate);
5199*67e74705SXin Li break;
5200*67e74705SXin Li
5201*67e74705SXin Li case NestedNameSpecifier::Global:
5202*67e74705SXin Li // Don't need to write an associated value.
5203*67e74705SXin Li break;
5204*67e74705SXin Li
5205*67e74705SXin Li case NestedNameSpecifier::Super:
5206*67e74705SXin Li AddDeclRef(NNS->getAsRecordDecl());
5207*67e74705SXin Li break;
5208*67e74705SXin Li }
5209*67e74705SXin Li }
5210*67e74705SXin Li }
5211*67e74705SXin Li
AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS)5212*67e74705SXin Li void ASTRecordWriter::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) {
5213*67e74705SXin Li // Nested name specifiers usually aren't too long. I think that 8 would
5214*67e74705SXin Li // typically accommodate the vast majority.
5215*67e74705SXin Li SmallVector<NestedNameSpecifierLoc , 8> NestedNames;
5216*67e74705SXin Li
5217*67e74705SXin Li // Push each of the nested-name-specifiers's onto a stack for
5218*67e74705SXin Li // serialization in reverse order.
5219*67e74705SXin Li while (NNS) {
5220*67e74705SXin Li NestedNames.push_back(NNS);
5221*67e74705SXin Li NNS = NNS.getPrefix();
5222*67e74705SXin Li }
5223*67e74705SXin Li
5224*67e74705SXin Li Record->push_back(NestedNames.size());
5225*67e74705SXin Li while(!NestedNames.empty()) {
5226*67e74705SXin Li NNS = NestedNames.pop_back_val();
5227*67e74705SXin Li NestedNameSpecifier::SpecifierKind Kind
5228*67e74705SXin Li = NNS.getNestedNameSpecifier()->getKind();
5229*67e74705SXin Li Record->push_back(Kind);
5230*67e74705SXin Li switch (Kind) {
5231*67e74705SXin Li case NestedNameSpecifier::Identifier:
5232*67e74705SXin Li AddIdentifierRef(NNS.getNestedNameSpecifier()->getAsIdentifier());
5233*67e74705SXin Li AddSourceRange(NNS.getLocalSourceRange());
5234*67e74705SXin Li break;
5235*67e74705SXin Li
5236*67e74705SXin Li case NestedNameSpecifier::Namespace:
5237*67e74705SXin Li AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespace());
5238*67e74705SXin Li AddSourceRange(NNS.getLocalSourceRange());
5239*67e74705SXin Li break;
5240*67e74705SXin Li
5241*67e74705SXin Li case NestedNameSpecifier::NamespaceAlias:
5242*67e74705SXin Li AddDeclRef(NNS.getNestedNameSpecifier()->getAsNamespaceAlias());
5243*67e74705SXin Li AddSourceRange(NNS.getLocalSourceRange());
5244*67e74705SXin Li break;
5245*67e74705SXin Li
5246*67e74705SXin Li case NestedNameSpecifier::TypeSpec:
5247*67e74705SXin Li case NestedNameSpecifier::TypeSpecWithTemplate:
5248*67e74705SXin Li Record->push_back(Kind == NestedNameSpecifier::TypeSpecWithTemplate);
5249*67e74705SXin Li AddTypeLoc(NNS.getTypeLoc());
5250*67e74705SXin Li AddSourceLocation(NNS.getLocalSourceRange().getEnd());
5251*67e74705SXin Li break;
5252*67e74705SXin Li
5253*67e74705SXin Li case NestedNameSpecifier::Global:
5254*67e74705SXin Li AddSourceLocation(NNS.getLocalSourceRange().getEnd());
5255*67e74705SXin Li break;
5256*67e74705SXin Li
5257*67e74705SXin Li case NestedNameSpecifier::Super:
5258*67e74705SXin Li AddDeclRef(NNS.getNestedNameSpecifier()->getAsRecordDecl());
5259*67e74705SXin Li AddSourceRange(NNS.getLocalSourceRange());
5260*67e74705SXin Li break;
5261*67e74705SXin Li }
5262*67e74705SXin Li }
5263*67e74705SXin Li }
5264*67e74705SXin Li
AddTemplateName(TemplateName Name)5265*67e74705SXin Li void ASTRecordWriter::AddTemplateName(TemplateName Name) {
5266*67e74705SXin Li TemplateName::NameKind Kind = Name.getKind();
5267*67e74705SXin Li Record->push_back(Kind);
5268*67e74705SXin Li switch (Kind) {
5269*67e74705SXin Li case TemplateName::Template:
5270*67e74705SXin Li AddDeclRef(Name.getAsTemplateDecl());
5271*67e74705SXin Li break;
5272*67e74705SXin Li
5273*67e74705SXin Li case TemplateName::OverloadedTemplate: {
5274*67e74705SXin Li OverloadedTemplateStorage *OvT = Name.getAsOverloadedTemplate();
5275*67e74705SXin Li Record->push_back(OvT->size());
5276*67e74705SXin Li for (const auto &I : *OvT)
5277*67e74705SXin Li AddDeclRef(I);
5278*67e74705SXin Li break;
5279*67e74705SXin Li }
5280*67e74705SXin Li
5281*67e74705SXin Li case TemplateName::QualifiedTemplate: {
5282*67e74705SXin Li QualifiedTemplateName *QualT = Name.getAsQualifiedTemplateName();
5283*67e74705SXin Li AddNestedNameSpecifier(QualT->getQualifier());
5284*67e74705SXin Li Record->push_back(QualT->hasTemplateKeyword());
5285*67e74705SXin Li AddDeclRef(QualT->getTemplateDecl());
5286*67e74705SXin Li break;
5287*67e74705SXin Li }
5288*67e74705SXin Li
5289*67e74705SXin Li case TemplateName::DependentTemplate: {
5290*67e74705SXin Li DependentTemplateName *DepT = Name.getAsDependentTemplateName();
5291*67e74705SXin Li AddNestedNameSpecifier(DepT->getQualifier());
5292*67e74705SXin Li Record->push_back(DepT->isIdentifier());
5293*67e74705SXin Li if (DepT->isIdentifier())
5294*67e74705SXin Li AddIdentifierRef(DepT->getIdentifier());
5295*67e74705SXin Li else
5296*67e74705SXin Li Record->push_back(DepT->getOperator());
5297*67e74705SXin Li break;
5298*67e74705SXin Li }
5299*67e74705SXin Li
5300*67e74705SXin Li case TemplateName::SubstTemplateTemplateParm: {
5301*67e74705SXin Li SubstTemplateTemplateParmStorage *subst
5302*67e74705SXin Li = Name.getAsSubstTemplateTemplateParm();
5303*67e74705SXin Li AddDeclRef(subst->getParameter());
5304*67e74705SXin Li AddTemplateName(subst->getReplacement());
5305*67e74705SXin Li break;
5306*67e74705SXin Li }
5307*67e74705SXin Li
5308*67e74705SXin Li case TemplateName::SubstTemplateTemplateParmPack: {
5309*67e74705SXin Li SubstTemplateTemplateParmPackStorage *SubstPack
5310*67e74705SXin Li = Name.getAsSubstTemplateTemplateParmPack();
5311*67e74705SXin Li AddDeclRef(SubstPack->getParameterPack());
5312*67e74705SXin Li AddTemplateArgument(SubstPack->getArgumentPack());
5313*67e74705SXin Li break;
5314*67e74705SXin Li }
5315*67e74705SXin Li }
5316*67e74705SXin Li }
5317*67e74705SXin Li
AddTemplateArgument(const TemplateArgument & Arg)5318*67e74705SXin Li void ASTRecordWriter::AddTemplateArgument(const TemplateArgument &Arg) {
5319*67e74705SXin Li Record->push_back(Arg.getKind());
5320*67e74705SXin Li switch (Arg.getKind()) {
5321*67e74705SXin Li case TemplateArgument::Null:
5322*67e74705SXin Li break;
5323*67e74705SXin Li case TemplateArgument::Type:
5324*67e74705SXin Li AddTypeRef(Arg.getAsType());
5325*67e74705SXin Li break;
5326*67e74705SXin Li case TemplateArgument::Declaration:
5327*67e74705SXin Li AddDeclRef(Arg.getAsDecl());
5328*67e74705SXin Li AddTypeRef(Arg.getParamTypeForDecl());
5329*67e74705SXin Li break;
5330*67e74705SXin Li case TemplateArgument::NullPtr:
5331*67e74705SXin Li AddTypeRef(Arg.getNullPtrType());
5332*67e74705SXin Li break;
5333*67e74705SXin Li case TemplateArgument::Integral:
5334*67e74705SXin Li AddAPSInt(Arg.getAsIntegral());
5335*67e74705SXin Li AddTypeRef(Arg.getIntegralType());
5336*67e74705SXin Li break;
5337*67e74705SXin Li case TemplateArgument::Template:
5338*67e74705SXin Li AddTemplateName(Arg.getAsTemplateOrTemplatePattern());
5339*67e74705SXin Li break;
5340*67e74705SXin Li case TemplateArgument::TemplateExpansion:
5341*67e74705SXin Li AddTemplateName(Arg.getAsTemplateOrTemplatePattern());
5342*67e74705SXin Li if (Optional<unsigned> NumExpansions = Arg.getNumTemplateExpansions())
5343*67e74705SXin Li Record->push_back(*NumExpansions + 1);
5344*67e74705SXin Li else
5345*67e74705SXin Li Record->push_back(0);
5346*67e74705SXin Li break;
5347*67e74705SXin Li case TemplateArgument::Expression:
5348*67e74705SXin Li AddStmt(Arg.getAsExpr());
5349*67e74705SXin Li break;
5350*67e74705SXin Li case TemplateArgument::Pack:
5351*67e74705SXin Li Record->push_back(Arg.pack_size());
5352*67e74705SXin Li for (const auto &P : Arg.pack_elements())
5353*67e74705SXin Li AddTemplateArgument(P);
5354*67e74705SXin Li break;
5355*67e74705SXin Li }
5356*67e74705SXin Li }
5357*67e74705SXin Li
AddTemplateParameterList(const TemplateParameterList * TemplateParams)5358*67e74705SXin Li void ASTRecordWriter::AddTemplateParameterList(
5359*67e74705SXin Li const TemplateParameterList *TemplateParams) {
5360*67e74705SXin Li assert(TemplateParams && "No TemplateParams!");
5361*67e74705SXin Li AddSourceLocation(TemplateParams->getTemplateLoc());
5362*67e74705SXin Li AddSourceLocation(TemplateParams->getLAngleLoc());
5363*67e74705SXin Li AddSourceLocation(TemplateParams->getRAngleLoc());
5364*67e74705SXin Li Record->push_back(TemplateParams->size());
5365*67e74705SXin Li for (const auto &P : *TemplateParams)
5366*67e74705SXin Li AddDeclRef(P);
5367*67e74705SXin Li }
5368*67e74705SXin Li
5369*67e74705SXin Li /// \brief Emit a template argument list.
AddTemplateArgumentList(const TemplateArgumentList * TemplateArgs)5370*67e74705SXin Li void ASTRecordWriter::AddTemplateArgumentList(
5371*67e74705SXin Li const TemplateArgumentList *TemplateArgs) {
5372*67e74705SXin Li assert(TemplateArgs && "No TemplateArgs!");
5373*67e74705SXin Li Record->push_back(TemplateArgs->size());
5374*67e74705SXin Li for (int i=0, e = TemplateArgs->size(); i != e; ++i)
5375*67e74705SXin Li AddTemplateArgument(TemplateArgs->get(i));
5376*67e74705SXin Li }
5377*67e74705SXin Li
AddASTTemplateArgumentListInfo(const ASTTemplateArgumentListInfo * ASTTemplArgList)5378*67e74705SXin Li void ASTRecordWriter::AddASTTemplateArgumentListInfo(
5379*67e74705SXin Li const ASTTemplateArgumentListInfo *ASTTemplArgList) {
5380*67e74705SXin Li assert(ASTTemplArgList && "No ASTTemplArgList!");
5381*67e74705SXin Li AddSourceLocation(ASTTemplArgList->LAngleLoc);
5382*67e74705SXin Li AddSourceLocation(ASTTemplArgList->RAngleLoc);
5383*67e74705SXin Li Record->push_back(ASTTemplArgList->NumTemplateArgs);
5384*67e74705SXin Li const TemplateArgumentLoc *TemplArgs = ASTTemplArgList->getTemplateArgs();
5385*67e74705SXin Li for (int i=0, e = ASTTemplArgList->NumTemplateArgs; i != e; ++i)
5386*67e74705SXin Li AddTemplateArgumentLoc(TemplArgs[i]);
5387*67e74705SXin Li }
5388*67e74705SXin Li
AddUnresolvedSet(const ASTUnresolvedSet & Set)5389*67e74705SXin Li void ASTRecordWriter::AddUnresolvedSet(const ASTUnresolvedSet &Set) {
5390*67e74705SXin Li Record->push_back(Set.size());
5391*67e74705SXin Li for (ASTUnresolvedSet::const_iterator
5392*67e74705SXin Li I = Set.begin(), E = Set.end(); I != E; ++I) {
5393*67e74705SXin Li AddDeclRef(I.getDecl());
5394*67e74705SXin Li Record->push_back(I.getAccess());
5395*67e74705SXin Li }
5396*67e74705SXin Li }
5397*67e74705SXin Li
5398*67e74705SXin Li // FIXME: Move this out of the main ASTRecordWriter interface.
AddCXXBaseSpecifier(const CXXBaseSpecifier & Base)5399*67e74705SXin Li void ASTRecordWriter::AddCXXBaseSpecifier(const CXXBaseSpecifier &Base) {
5400*67e74705SXin Li Record->push_back(Base.isVirtual());
5401*67e74705SXin Li Record->push_back(Base.isBaseOfClass());
5402*67e74705SXin Li Record->push_back(Base.getAccessSpecifierAsWritten());
5403*67e74705SXin Li Record->push_back(Base.getInheritConstructors());
5404*67e74705SXin Li AddTypeSourceInfo(Base.getTypeSourceInfo());
5405*67e74705SXin Li AddSourceRange(Base.getSourceRange());
5406*67e74705SXin Li AddSourceLocation(Base.isPackExpansion()? Base.getEllipsisLoc()
5407*67e74705SXin Li : SourceLocation());
5408*67e74705SXin Li }
5409*67e74705SXin Li
EmitCXXBaseSpecifiers(ASTWriter & W,ArrayRef<CXXBaseSpecifier> Bases)5410*67e74705SXin Li static uint64_t EmitCXXBaseSpecifiers(ASTWriter &W,
5411*67e74705SXin Li ArrayRef<CXXBaseSpecifier> Bases) {
5412*67e74705SXin Li ASTWriter::RecordData Record;
5413*67e74705SXin Li ASTRecordWriter Writer(W, Record);
5414*67e74705SXin Li Writer.push_back(Bases.size());
5415*67e74705SXin Li
5416*67e74705SXin Li for (auto &Base : Bases)
5417*67e74705SXin Li Writer.AddCXXBaseSpecifier(Base);
5418*67e74705SXin Li
5419*67e74705SXin Li return Writer.Emit(serialization::DECL_CXX_BASE_SPECIFIERS);
5420*67e74705SXin Li }
5421*67e74705SXin Li
5422*67e74705SXin Li // FIXME: Move this out of the main ASTRecordWriter interface.
AddCXXBaseSpecifiers(ArrayRef<CXXBaseSpecifier> Bases)5423*67e74705SXin Li void ASTRecordWriter::AddCXXBaseSpecifiers(ArrayRef<CXXBaseSpecifier> Bases) {
5424*67e74705SXin Li AddOffset(EmitCXXBaseSpecifiers(*Writer, Bases));
5425*67e74705SXin Li }
5426*67e74705SXin Li
5427*67e74705SXin Li static uint64_t
EmitCXXCtorInitializers(ASTWriter & W,ArrayRef<CXXCtorInitializer * > CtorInits)5428*67e74705SXin Li EmitCXXCtorInitializers(ASTWriter &W,
5429*67e74705SXin Li ArrayRef<CXXCtorInitializer *> CtorInits) {
5430*67e74705SXin Li ASTWriter::RecordData Record;
5431*67e74705SXin Li ASTRecordWriter Writer(W, Record);
5432*67e74705SXin Li Writer.push_back(CtorInits.size());
5433*67e74705SXin Li
5434*67e74705SXin Li for (auto *Init : CtorInits) {
5435*67e74705SXin Li if (Init->isBaseInitializer()) {
5436*67e74705SXin Li Writer.push_back(CTOR_INITIALIZER_BASE);
5437*67e74705SXin Li Writer.AddTypeSourceInfo(Init->getTypeSourceInfo());
5438*67e74705SXin Li Writer.push_back(Init->isBaseVirtual());
5439*67e74705SXin Li } else if (Init->isDelegatingInitializer()) {
5440*67e74705SXin Li Writer.push_back(CTOR_INITIALIZER_DELEGATING);
5441*67e74705SXin Li Writer.AddTypeSourceInfo(Init->getTypeSourceInfo());
5442*67e74705SXin Li } else if (Init->isMemberInitializer()){
5443*67e74705SXin Li Writer.push_back(CTOR_INITIALIZER_MEMBER);
5444*67e74705SXin Li Writer.AddDeclRef(Init->getMember());
5445*67e74705SXin Li } else {
5446*67e74705SXin Li Writer.push_back(CTOR_INITIALIZER_INDIRECT_MEMBER);
5447*67e74705SXin Li Writer.AddDeclRef(Init->getIndirectMember());
5448*67e74705SXin Li }
5449*67e74705SXin Li
5450*67e74705SXin Li Writer.AddSourceLocation(Init->getMemberLocation());
5451*67e74705SXin Li Writer.AddStmt(Init->getInit());
5452*67e74705SXin Li Writer.AddSourceLocation(Init->getLParenLoc());
5453*67e74705SXin Li Writer.AddSourceLocation(Init->getRParenLoc());
5454*67e74705SXin Li Writer.push_back(Init->isWritten());
5455*67e74705SXin Li if (Init->isWritten()) {
5456*67e74705SXin Li Writer.push_back(Init->getSourceOrder());
5457*67e74705SXin Li } else {
5458*67e74705SXin Li Writer.push_back(Init->getNumArrayIndices());
5459*67e74705SXin Li for (auto *VD : Init->getArrayIndices())
5460*67e74705SXin Li Writer.AddDeclRef(VD);
5461*67e74705SXin Li }
5462*67e74705SXin Li }
5463*67e74705SXin Li
5464*67e74705SXin Li return Writer.Emit(serialization::DECL_CXX_CTOR_INITIALIZERS);
5465*67e74705SXin Li }
5466*67e74705SXin Li
5467*67e74705SXin Li // FIXME: Move this out of the main ASTRecordWriter interface.
AddCXXCtorInitializers(ArrayRef<CXXCtorInitializer * > CtorInits)5468*67e74705SXin Li void ASTRecordWriter::AddCXXCtorInitializers(
5469*67e74705SXin Li ArrayRef<CXXCtorInitializer *> CtorInits) {
5470*67e74705SXin Li AddOffset(EmitCXXCtorInitializers(*Writer, CtorInits));
5471*67e74705SXin Li }
5472*67e74705SXin Li
AddCXXDefinitionData(const CXXRecordDecl * D)5473*67e74705SXin Li void ASTRecordWriter::AddCXXDefinitionData(const CXXRecordDecl *D) {
5474*67e74705SXin Li auto &Data = D->data();
5475*67e74705SXin Li Record->push_back(Data.IsLambda);
5476*67e74705SXin Li Record->push_back(Data.UserDeclaredConstructor);
5477*67e74705SXin Li Record->push_back(Data.UserDeclaredSpecialMembers);
5478*67e74705SXin Li Record->push_back(Data.Aggregate);
5479*67e74705SXin Li Record->push_back(Data.PlainOldData);
5480*67e74705SXin Li Record->push_back(Data.Empty);
5481*67e74705SXin Li Record->push_back(Data.Polymorphic);
5482*67e74705SXin Li Record->push_back(Data.Abstract);
5483*67e74705SXin Li Record->push_back(Data.IsStandardLayout);
5484*67e74705SXin Li Record->push_back(Data.HasNoNonEmptyBases);
5485*67e74705SXin Li Record->push_back(Data.HasPrivateFields);
5486*67e74705SXin Li Record->push_back(Data.HasProtectedFields);
5487*67e74705SXin Li Record->push_back(Data.HasPublicFields);
5488*67e74705SXin Li Record->push_back(Data.HasMutableFields);
5489*67e74705SXin Li Record->push_back(Data.HasVariantMembers);
5490*67e74705SXin Li Record->push_back(Data.HasOnlyCMembers);
5491*67e74705SXin Li Record->push_back(Data.HasInClassInitializer);
5492*67e74705SXin Li Record->push_back(Data.HasUninitializedReferenceMember);
5493*67e74705SXin Li Record->push_back(Data.HasUninitializedFields);
5494*67e74705SXin Li Record->push_back(Data.HasInheritedConstructor);
5495*67e74705SXin Li Record->push_back(Data.HasInheritedAssignment);
5496*67e74705SXin Li Record->push_back(Data.NeedOverloadResolutionForMoveConstructor);
5497*67e74705SXin Li Record->push_back(Data.NeedOverloadResolutionForMoveAssignment);
5498*67e74705SXin Li Record->push_back(Data.NeedOverloadResolutionForDestructor);
5499*67e74705SXin Li Record->push_back(Data.DefaultedMoveConstructorIsDeleted);
5500*67e74705SXin Li Record->push_back(Data.DefaultedMoveAssignmentIsDeleted);
5501*67e74705SXin Li Record->push_back(Data.DefaultedDestructorIsDeleted);
5502*67e74705SXin Li Record->push_back(Data.HasTrivialSpecialMembers);
5503*67e74705SXin Li Record->push_back(Data.DeclaredNonTrivialSpecialMembers);
5504*67e74705SXin Li Record->push_back(Data.HasIrrelevantDestructor);
5505*67e74705SXin Li Record->push_back(Data.HasConstexprNonCopyMoveConstructor);
5506*67e74705SXin Li Record->push_back(Data.HasDefaultedDefaultConstructor);
5507*67e74705SXin Li Record->push_back(Data.DefaultedDefaultConstructorIsConstexpr);
5508*67e74705SXin Li Record->push_back(Data.HasConstexprDefaultConstructor);
5509*67e74705SXin Li Record->push_back(Data.HasNonLiteralTypeFieldsOrBases);
5510*67e74705SXin Li Record->push_back(Data.ComputedVisibleConversions);
5511*67e74705SXin Li Record->push_back(Data.UserProvidedDefaultConstructor);
5512*67e74705SXin Li Record->push_back(Data.DeclaredSpecialMembers);
5513*67e74705SXin Li Record->push_back(Data.ImplicitCopyConstructorHasConstParam);
5514*67e74705SXin Li Record->push_back(Data.ImplicitCopyAssignmentHasConstParam);
5515*67e74705SXin Li Record->push_back(Data.HasDeclaredCopyConstructorWithConstParam);
5516*67e74705SXin Li Record->push_back(Data.HasDeclaredCopyAssignmentWithConstParam);
5517*67e74705SXin Li // IsLambda bit is already saved.
5518*67e74705SXin Li
5519*67e74705SXin Li Record->push_back(Data.NumBases);
5520*67e74705SXin Li if (Data.NumBases > 0)
5521*67e74705SXin Li AddCXXBaseSpecifiers(Data.bases());
5522*67e74705SXin Li
5523*67e74705SXin Li // FIXME: Make VBases lazily computed when needed to avoid storing them.
5524*67e74705SXin Li Record->push_back(Data.NumVBases);
5525*67e74705SXin Li if (Data.NumVBases > 0)
5526*67e74705SXin Li AddCXXBaseSpecifiers(Data.vbases());
5527*67e74705SXin Li
5528*67e74705SXin Li AddUnresolvedSet(Data.Conversions.get(*Writer->Context));
5529*67e74705SXin Li AddUnresolvedSet(Data.VisibleConversions.get(*Writer->Context));
5530*67e74705SXin Li // Data.Definition is the owning decl, no need to write it.
5531*67e74705SXin Li AddDeclRef(D->getFirstFriend());
5532*67e74705SXin Li
5533*67e74705SXin Li // Add lambda-specific data.
5534*67e74705SXin Li if (Data.IsLambda) {
5535*67e74705SXin Li auto &Lambda = D->getLambdaData();
5536*67e74705SXin Li Record->push_back(Lambda.Dependent);
5537*67e74705SXin Li Record->push_back(Lambda.IsGenericLambda);
5538*67e74705SXin Li Record->push_back(Lambda.CaptureDefault);
5539*67e74705SXin Li Record->push_back(Lambda.NumCaptures);
5540*67e74705SXin Li Record->push_back(Lambda.NumExplicitCaptures);
5541*67e74705SXin Li Record->push_back(Lambda.ManglingNumber);
5542*67e74705SXin Li AddDeclRef(Lambda.ContextDecl);
5543*67e74705SXin Li AddTypeSourceInfo(Lambda.MethodTyInfo);
5544*67e74705SXin Li for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
5545*67e74705SXin Li const LambdaCapture &Capture = Lambda.Captures[I];
5546*67e74705SXin Li AddSourceLocation(Capture.getLocation());
5547*67e74705SXin Li Record->push_back(Capture.isImplicit());
5548*67e74705SXin Li Record->push_back(Capture.getCaptureKind());
5549*67e74705SXin Li switch (Capture.getCaptureKind()) {
5550*67e74705SXin Li case LCK_StarThis:
5551*67e74705SXin Li case LCK_This:
5552*67e74705SXin Li case LCK_VLAType:
5553*67e74705SXin Li break;
5554*67e74705SXin Li case LCK_ByCopy:
5555*67e74705SXin Li case LCK_ByRef:
5556*67e74705SXin Li VarDecl *Var =
5557*67e74705SXin Li Capture.capturesVariable() ? Capture.getCapturedVar() : nullptr;
5558*67e74705SXin Li AddDeclRef(Var);
5559*67e74705SXin Li AddSourceLocation(Capture.isPackExpansion() ? Capture.getEllipsisLoc()
5560*67e74705SXin Li : SourceLocation());
5561*67e74705SXin Li break;
5562*67e74705SXin Li }
5563*67e74705SXin Li }
5564*67e74705SXin Li }
5565*67e74705SXin Li }
5566*67e74705SXin Li
ReaderInitialized(ASTReader * Reader)5567*67e74705SXin Li void ASTWriter::ReaderInitialized(ASTReader *Reader) {
5568*67e74705SXin Li assert(Reader && "Cannot remove chain");
5569*67e74705SXin Li assert((!Chain || Chain == Reader) && "Cannot replace chain");
5570*67e74705SXin Li assert(FirstDeclID == NextDeclID &&
5571*67e74705SXin Li FirstTypeID == NextTypeID &&
5572*67e74705SXin Li FirstIdentID == NextIdentID &&
5573*67e74705SXin Li FirstMacroID == NextMacroID &&
5574*67e74705SXin Li FirstSubmoduleID == NextSubmoduleID &&
5575*67e74705SXin Li FirstSelectorID == NextSelectorID &&
5576*67e74705SXin Li "Setting chain after writing has started.");
5577*67e74705SXin Li
5578*67e74705SXin Li Chain = Reader;
5579*67e74705SXin Li
5580*67e74705SXin Li // Note, this will get called multiple times, once one the reader starts up
5581*67e74705SXin Li // and again each time it's done reading a PCH or module.
5582*67e74705SXin Li FirstDeclID = NUM_PREDEF_DECL_IDS + Chain->getTotalNumDecls();
5583*67e74705SXin Li FirstTypeID = NUM_PREDEF_TYPE_IDS + Chain->getTotalNumTypes();
5584*67e74705SXin Li FirstIdentID = NUM_PREDEF_IDENT_IDS + Chain->getTotalNumIdentifiers();
5585*67e74705SXin Li FirstMacroID = NUM_PREDEF_MACRO_IDS + Chain->getTotalNumMacros();
5586*67e74705SXin Li FirstSubmoduleID = NUM_PREDEF_SUBMODULE_IDS + Chain->getTotalNumSubmodules();
5587*67e74705SXin Li FirstSelectorID = NUM_PREDEF_SELECTOR_IDS + Chain->getTotalNumSelectors();
5588*67e74705SXin Li NextDeclID = FirstDeclID;
5589*67e74705SXin Li NextTypeID = FirstTypeID;
5590*67e74705SXin Li NextIdentID = FirstIdentID;
5591*67e74705SXin Li NextMacroID = FirstMacroID;
5592*67e74705SXin Li NextSelectorID = FirstSelectorID;
5593*67e74705SXin Li NextSubmoduleID = FirstSubmoduleID;
5594*67e74705SXin Li }
5595*67e74705SXin Li
IdentifierRead(IdentID ID,IdentifierInfo * II)5596*67e74705SXin Li void ASTWriter::IdentifierRead(IdentID ID, IdentifierInfo *II) {
5597*67e74705SXin Li // Always keep the highest ID. See \p TypeRead() for more information.
5598*67e74705SXin Li IdentID &StoredID = IdentifierIDs[II];
5599*67e74705SXin Li if (ID > StoredID)
5600*67e74705SXin Li StoredID = ID;
5601*67e74705SXin Li }
5602*67e74705SXin Li
MacroRead(serialization::MacroID ID,MacroInfo * MI)5603*67e74705SXin Li void ASTWriter::MacroRead(serialization::MacroID ID, MacroInfo *MI) {
5604*67e74705SXin Li // Always keep the highest ID. See \p TypeRead() for more information.
5605*67e74705SXin Li MacroID &StoredID = MacroIDs[MI];
5606*67e74705SXin Li if (ID > StoredID)
5607*67e74705SXin Li StoredID = ID;
5608*67e74705SXin Li }
5609*67e74705SXin Li
TypeRead(TypeIdx Idx,QualType T)5610*67e74705SXin Li void ASTWriter::TypeRead(TypeIdx Idx, QualType T) {
5611*67e74705SXin Li // Always take the highest-numbered type index. This copes with an interesting
5612*67e74705SXin Li // case for chained AST writing where we schedule writing the type and then,
5613*67e74705SXin Li // later, deserialize the type from another AST. In this case, we want to
5614*67e74705SXin Li // keep the higher-numbered entry so that we can properly write it out to
5615*67e74705SXin Li // the AST file.
5616*67e74705SXin Li TypeIdx &StoredIdx = TypeIdxs[T];
5617*67e74705SXin Li if (Idx.getIndex() >= StoredIdx.getIndex())
5618*67e74705SXin Li StoredIdx = Idx;
5619*67e74705SXin Li }
5620*67e74705SXin Li
SelectorRead(SelectorID ID,Selector S)5621*67e74705SXin Li void ASTWriter::SelectorRead(SelectorID ID, Selector S) {
5622*67e74705SXin Li // Always keep the highest ID. See \p TypeRead() for more information.
5623*67e74705SXin Li SelectorID &StoredID = SelectorIDs[S];
5624*67e74705SXin Li if (ID > StoredID)
5625*67e74705SXin Li StoredID = ID;
5626*67e74705SXin Li }
5627*67e74705SXin Li
MacroDefinitionRead(serialization::PreprocessedEntityID ID,MacroDefinitionRecord * MD)5628*67e74705SXin Li void ASTWriter::MacroDefinitionRead(serialization::PreprocessedEntityID ID,
5629*67e74705SXin Li MacroDefinitionRecord *MD) {
5630*67e74705SXin Li assert(MacroDefinitions.find(MD) == MacroDefinitions.end());
5631*67e74705SXin Li MacroDefinitions[MD] = ID;
5632*67e74705SXin Li }
5633*67e74705SXin Li
ModuleRead(serialization::SubmoduleID ID,Module * Mod)5634*67e74705SXin Li void ASTWriter::ModuleRead(serialization::SubmoduleID ID, Module *Mod) {
5635*67e74705SXin Li assert(SubmoduleIDs.find(Mod) == SubmoduleIDs.end());
5636*67e74705SXin Li SubmoduleIDs[Mod] = ID;
5637*67e74705SXin Li }
5638*67e74705SXin Li
CompletedTagDefinition(const TagDecl * D)5639*67e74705SXin Li void ASTWriter::CompletedTagDefinition(const TagDecl *D) {
5640*67e74705SXin Li assert(D->isCompleteDefinition());
5641*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5642*67e74705SXin Li if (auto *RD = dyn_cast<CXXRecordDecl>(D)) {
5643*67e74705SXin Li // We are interested when a PCH decl is modified.
5644*67e74705SXin Li if (RD->isFromASTFile()) {
5645*67e74705SXin Li // A forward reference was mutated into a definition. Rewrite it.
5646*67e74705SXin Li // FIXME: This happens during template instantiation, should we
5647*67e74705SXin Li // have created a new definition decl instead ?
5648*67e74705SXin Li assert(isTemplateInstantiation(RD->getTemplateSpecializationKind()) &&
5649*67e74705SXin Li "completed a tag from another module but not by instantiation?");
5650*67e74705SXin Li DeclUpdates[RD].push_back(
5651*67e74705SXin Li DeclUpdate(UPD_CXX_INSTANTIATED_CLASS_DEFINITION));
5652*67e74705SXin Li }
5653*67e74705SXin Li }
5654*67e74705SXin Li }
5655*67e74705SXin Li
isImportedDeclContext(ASTReader * Chain,const Decl * D)5656*67e74705SXin Li static bool isImportedDeclContext(ASTReader *Chain, const Decl *D) {
5657*67e74705SXin Li if (D->isFromASTFile())
5658*67e74705SXin Li return true;
5659*67e74705SXin Li
5660*67e74705SXin Li // The predefined __va_list_tag struct is imported if we imported any decls.
5661*67e74705SXin Li // FIXME: This is a gross hack.
5662*67e74705SXin Li return D == D->getASTContext().getVaListTagDecl();
5663*67e74705SXin Li }
5664*67e74705SXin Li
AddedVisibleDecl(const DeclContext * DC,const Decl * D)5665*67e74705SXin Li void ASTWriter::AddedVisibleDecl(const DeclContext *DC, const Decl *D) {
5666*67e74705SXin Li assert(DC->isLookupContext() &&
5667*67e74705SXin Li "Should not add lookup results to non-lookup contexts!");
5668*67e74705SXin Li
5669*67e74705SXin Li // TU is handled elsewhere.
5670*67e74705SXin Li if (isa<TranslationUnitDecl>(DC))
5671*67e74705SXin Li return;
5672*67e74705SXin Li
5673*67e74705SXin Li // Namespaces are handled elsewhere, except for template instantiations of
5674*67e74705SXin Li // FunctionTemplateDecls in namespaces. We are interested in cases where the
5675*67e74705SXin Li // local instantiations are added to an imported context. Only happens when
5676*67e74705SXin Li // adding ADL lookup candidates, for example templated friends.
5677*67e74705SXin Li if (isa<NamespaceDecl>(DC) && D->getFriendObjectKind() == Decl::FOK_None &&
5678*67e74705SXin Li !isa<FunctionTemplateDecl>(D))
5679*67e74705SXin Li return;
5680*67e74705SXin Li
5681*67e74705SXin Li // We're only interested in cases where a local declaration is added to an
5682*67e74705SXin Li // imported context.
5683*67e74705SXin Li if (D->isFromASTFile() || !isImportedDeclContext(Chain, cast<Decl>(DC)))
5684*67e74705SXin Li return;
5685*67e74705SXin Li
5686*67e74705SXin Li assert(DC == DC->getPrimaryContext() && "added to non-primary context");
5687*67e74705SXin Li assert(!getDefinitiveDeclContext(DC) && "DeclContext not definitive!");
5688*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5689*67e74705SXin Li if (UpdatedDeclContexts.insert(DC) && !cast<Decl>(DC)->isFromASTFile()) {
5690*67e74705SXin Li // We're adding a visible declaration to a predefined decl context. Ensure
5691*67e74705SXin Li // that we write out all of its lookup results so we don't get a nasty
5692*67e74705SXin Li // surprise when we try to emit its lookup table.
5693*67e74705SXin Li for (auto *Child : DC->decls())
5694*67e74705SXin Li UpdatingVisibleDecls.push_back(Child);
5695*67e74705SXin Li }
5696*67e74705SXin Li UpdatingVisibleDecls.push_back(D);
5697*67e74705SXin Li }
5698*67e74705SXin Li
AddedCXXImplicitMember(const CXXRecordDecl * RD,const Decl * D)5699*67e74705SXin Li void ASTWriter::AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) {
5700*67e74705SXin Li assert(D->isImplicit());
5701*67e74705SXin Li
5702*67e74705SXin Li // We're only interested in cases where a local declaration is added to an
5703*67e74705SXin Li // imported context.
5704*67e74705SXin Li if (D->isFromASTFile() || !isImportedDeclContext(Chain, RD))
5705*67e74705SXin Li return;
5706*67e74705SXin Li
5707*67e74705SXin Li if (!isa<CXXMethodDecl>(D))
5708*67e74705SXin Li return;
5709*67e74705SXin Li
5710*67e74705SXin Li // A decl coming from PCH was modified.
5711*67e74705SXin Li assert(RD->isCompleteDefinition());
5712*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5713*67e74705SXin Li DeclUpdates[RD].push_back(DeclUpdate(UPD_CXX_ADDED_IMPLICIT_MEMBER, D));
5714*67e74705SXin Li }
5715*67e74705SXin Li
ResolvedExceptionSpec(const FunctionDecl * FD)5716*67e74705SXin Li void ASTWriter::ResolvedExceptionSpec(const FunctionDecl *FD) {
5717*67e74705SXin Li assert(!DoneWritingDeclsAndTypes && "Already done writing updates!");
5718*67e74705SXin Li if (!Chain) return;
5719*67e74705SXin Li Chain->forEachImportedKeyDecl(FD, [&](const Decl *D) {
5720*67e74705SXin Li // If we don't already know the exception specification for this redecl
5721*67e74705SXin Li // chain, add an update record for it.
5722*67e74705SXin Li if (isUnresolvedExceptionSpec(cast<FunctionDecl>(D)
5723*67e74705SXin Li ->getType()
5724*67e74705SXin Li ->castAs<FunctionProtoType>()
5725*67e74705SXin Li ->getExceptionSpecType()))
5726*67e74705SXin Li DeclUpdates[D].push_back(UPD_CXX_RESOLVED_EXCEPTION_SPEC);
5727*67e74705SXin Li });
5728*67e74705SXin Li }
5729*67e74705SXin Li
DeducedReturnType(const FunctionDecl * FD,QualType ReturnType)5730*67e74705SXin Li void ASTWriter::DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) {
5731*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5732*67e74705SXin Li if (!Chain) return;
5733*67e74705SXin Li Chain->forEachImportedKeyDecl(FD, [&](const Decl *D) {
5734*67e74705SXin Li DeclUpdates[D].push_back(
5735*67e74705SXin Li DeclUpdate(UPD_CXX_DEDUCED_RETURN_TYPE, ReturnType));
5736*67e74705SXin Li });
5737*67e74705SXin Li }
5738*67e74705SXin Li
ResolvedOperatorDelete(const CXXDestructorDecl * DD,const FunctionDecl * Delete)5739*67e74705SXin Li void ASTWriter::ResolvedOperatorDelete(const CXXDestructorDecl *DD,
5740*67e74705SXin Li const FunctionDecl *Delete) {
5741*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5742*67e74705SXin Li assert(Delete && "Not given an operator delete");
5743*67e74705SXin Li if (!Chain) return;
5744*67e74705SXin Li Chain->forEachImportedKeyDecl(DD, [&](const Decl *D) {
5745*67e74705SXin Li DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_RESOLVED_DTOR_DELETE, Delete));
5746*67e74705SXin Li });
5747*67e74705SXin Li }
5748*67e74705SXin Li
CompletedImplicitDefinition(const FunctionDecl * D)5749*67e74705SXin Li void ASTWriter::CompletedImplicitDefinition(const FunctionDecl *D) {
5750*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5751*67e74705SXin Li if (!D->isFromASTFile())
5752*67e74705SXin Li return; // Declaration not imported from PCH.
5753*67e74705SXin Li
5754*67e74705SXin Li // Implicit function decl from a PCH was defined.
5755*67e74705SXin Li DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_ADDED_FUNCTION_DEFINITION));
5756*67e74705SXin Li }
5757*67e74705SXin Li
FunctionDefinitionInstantiated(const FunctionDecl * D)5758*67e74705SXin Li void ASTWriter::FunctionDefinitionInstantiated(const FunctionDecl *D) {
5759*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5760*67e74705SXin Li if (!D->isFromASTFile())
5761*67e74705SXin Li return;
5762*67e74705SXin Li
5763*67e74705SXin Li DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_ADDED_FUNCTION_DEFINITION));
5764*67e74705SXin Li }
5765*67e74705SXin Li
StaticDataMemberInstantiated(const VarDecl * D)5766*67e74705SXin Li void ASTWriter::StaticDataMemberInstantiated(const VarDecl *D) {
5767*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5768*67e74705SXin Li if (!D->isFromASTFile())
5769*67e74705SXin Li return;
5770*67e74705SXin Li
5771*67e74705SXin Li // Since the actual instantiation is delayed, this really means that we need
5772*67e74705SXin Li // to update the instantiation location.
5773*67e74705SXin Li DeclUpdates[D].push_back(
5774*67e74705SXin Li DeclUpdate(UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER,
5775*67e74705SXin Li D->getMemberSpecializationInfo()->getPointOfInstantiation()));
5776*67e74705SXin Li }
5777*67e74705SXin Li
DefaultArgumentInstantiated(const ParmVarDecl * D)5778*67e74705SXin Li void ASTWriter::DefaultArgumentInstantiated(const ParmVarDecl *D) {
5779*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5780*67e74705SXin Li if (!D->isFromASTFile())
5781*67e74705SXin Li return;
5782*67e74705SXin Li
5783*67e74705SXin Li DeclUpdates[D].push_back(
5784*67e74705SXin Li DeclUpdate(UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT, D));
5785*67e74705SXin Li }
5786*67e74705SXin Li
AddedObjCCategoryToInterface(const ObjCCategoryDecl * CatD,const ObjCInterfaceDecl * IFD)5787*67e74705SXin Li void ASTWriter::AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
5788*67e74705SXin Li const ObjCInterfaceDecl *IFD) {
5789*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5790*67e74705SXin Li if (!IFD->isFromASTFile())
5791*67e74705SXin Li return; // Declaration not imported from PCH.
5792*67e74705SXin Li
5793*67e74705SXin Li assert(IFD->getDefinition() && "Category on a class without a definition?");
5794*67e74705SXin Li ObjCClassesWithCategories.insert(
5795*67e74705SXin Li const_cast<ObjCInterfaceDecl *>(IFD->getDefinition()));
5796*67e74705SXin Li }
5797*67e74705SXin Li
DeclarationMarkedUsed(const Decl * D)5798*67e74705SXin Li void ASTWriter::DeclarationMarkedUsed(const Decl *D) {
5799*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5800*67e74705SXin Li
5801*67e74705SXin Li // If there is *any* declaration of the entity that's not from an AST file,
5802*67e74705SXin Li // we can skip writing the update record. We make sure that isUsed() triggers
5803*67e74705SXin Li // completion of the redeclaration chain of the entity.
5804*67e74705SXin Li for (auto Prev = D->getMostRecentDecl(); Prev; Prev = Prev->getPreviousDecl())
5805*67e74705SXin Li if (IsLocalDecl(Prev))
5806*67e74705SXin Li return;
5807*67e74705SXin Li
5808*67e74705SXin Li DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_USED));
5809*67e74705SXin Li }
5810*67e74705SXin Li
DeclarationMarkedOpenMPThreadPrivate(const Decl * D)5811*67e74705SXin Li void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(const Decl *D) {
5812*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5813*67e74705SXin Li if (!D->isFromASTFile())
5814*67e74705SXin Li return;
5815*67e74705SXin Li
5816*67e74705SXin Li DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_OPENMP_THREADPRIVATE));
5817*67e74705SXin Li }
5818*67e74705SXin Li
DeclarationMarkedOpenMPDeclareTarget(const Decl * D,const Attr * Attr)5819*67e74705SXin Li void ASTWriter::DeclarationMarkedOpenMPDeclareTarget(const Decl *D,
5820*67e74705SXin Li const Attr *Attr) {
5821*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5822*67e74705SXin Li if (!D->isFromASTFile())
5823*67e74705SXin Li return;
5824*67e74705SXin Li
5825*67e74705SXin Li DeclUpdates[D].push_back(
5826*67e74705SXin Li DeclUpdate(UPD_DECL_MARKED_OPENMP_DECLARETARGET, Attr));
5827*67e74705SXin Li }
5828*67e74705SXin Li
RedefinedHiddenDefinition(const NamedDecl * D,Module * M)5829*67e74705SXin Li void ASTWriter::RedefinedHiddenDefinition(const NamedDecl *D, Module *M) {
5830*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5831*67e74705SXin Li assert(D->isHidden() && "expected a hidden declaration");
5832*67e74705SXin Li DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_EXPORTED, M));
5833*67e74705SXin Li }
5834*67e74705SXin Li
AddedAttributeToRecord(const Attr * Attr,const RecordDecl * Record)5835*67e74705SXin Li void ASTWriter::AddedAttributeToRecord(const Attr *Attr,
5836*67e74705SXin Li const RecordDecl *Record) {
5837*67e74705SXin Li assert(!WritingAST && "Already writing the AST!");
5838*67e74705SXin Li if (!Record->isFromASTFile())
5839*67e74705SXin Li return;
5840*67e74705SXin Li DeclUpdates[Record].push_back(DeclUpdate(UPD_ADDED_ATTR_TO_RECORD, Attr));
5841*67e74705SXin Li }
5842