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