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(KNOWN_MODULE_FILES);
881   RECORD(LANGUAGE_OPTIONS);
882   RECORD(TARGET_OPTIONS);
883   RECORD(ORIGINAL_FILE);
884   RECORD(ORIGINAL_PCH_DIR);
885   RECORD(ORIGINAL_FILE_ID);
886   RECORD(INPUT_FILE_OFFSETS);
887   RECORD(DIAGNOSTIC_OPTIONS);
888   RECORD(FILE_SYSTEM_OPTIONS);
889   RECORD(HEADER_SEARCH_OPTIONS);
890   RECORD(PREPROCESSOR_OPTIONS);
891 
892   BLOCK(INPUT_FILES_BLOCK);
893   RECORD(INPUT_FILE);
894 
895   // AST Top-Level Block.
896   BLOCK(AST_BLOCK);
897   RECORD(TYPE_OFFSET);
898   RECORD(DECL_OFFSET);
899   RECORD(IDENTIFIER_OFFSET);
900   RECORD(IDENTIFIER_TABLE);
901   RECORD(EAGERLY_DESERIALIZED_DECLS);
902   RECORD(SPECIAL_TYPES);
903   RECORD(STATISTICS);
904   RECORD(TENTATIVE_DEFINITIONS);
905   RECORD(UNUSED_FILESCOPED_DECLS);
906   RECORD(SELECTOR_OFFSETS);
907   RECORD(METHOD_POOL);
908   RECORD(PP_COUNTER_VALUE);
909   RECORD(SOURCE_LOCATION_OFFSETS);
910   RECORD(SOURCE_LOCATION_PRELOADS);
911   RECORD(EXT_VECTOR_DECLS);
912   RECORD(PPD_ENTITIES_OFFSETS);
913   RECORD(REFERENCED_SELECTOR_POOL);
914   RECORD(TU_UPDATE_LEXICAL);
915   RECORD(LOCAL_REDECLARATIONS_MAP);
916   RECORD(SEMA_DECL_REFS);
917   RECORD(WEAK_UNDECLARED_IDENTIFIERS);
918   RECORD(PENDING_IMPLICIT_INSTANTIATIONS);
919   RECORD(DECL_REPLACEMENTS);
920   RECORD(UPDATE_VISIBLE);
921   RECORD(DECL_UPDATE_OFFSETS);
922   RECORD(DECL_UPDATES);
923   RECORD(CXX_BASE_SPECIFIER_OFFSETS);
924   RECORD(DIAG_PRAGMA_MAPPINGS);
925   RECORD(CUDA_SPECIAL_DECL_REFS);
926   RECORD(HEADER_SEARCH_TABLE);
927   RECORD(FP_PRAGMA_OPTIONS);
928   RECORD(OPENCL_EXTENSIONS);
929   RECORD(DELEGATING_CTORS);
930   RECORD(KNOWN_NAMESPACES);
931   RECORD(UNDEFINED_BUT_USED);
932   RECORD(MODULE_OFFSET_MAP);
933   RECORD(SOURCE_MANAGER_LINE_TABLE);
934   RECORD(OBJC_CATEGORIES_MAP);
935   RECORD(FILE_SORTED_DECLS);
936   RECORD(IMPORTED_MODULES);
937   RECORD(LOCAL_REDECLARATIONS);
938   RECORD(OBJC_CATEGORIES);
939   RECORD(MACRO_OFFSET);
940   RECORD(LATE_PARSED_TEMPLATE);
941   RECORD(OPTIMIZE_PRAGMA_OPTIONS);
942 
943   // SourceManager Block.
944   BLOCK(SOURCE_MANAGER_BLOCK);
945   RECORD(SM_SLOC_FILE_ENTRY);
946   RECORD(SM_SLOC_BUFFER_ENTRY);
947   RECORD(SM_SLOC_BUFFER_BLOB);
948   RECORD(SM_SLOC_EXPANSION_ENTRY);
949 
950   // Preprocessor Block.
951   BLOCK(PREPROCESSOR_BLOCK);
952   RECORD(PP_MACRO_DIRECTIVE_HISTORY);
953   RECORD(PP_MACRO_FUNCTION_LIKE);
954   RECORD(PP_MACRO_OBJECT_LIKE);
955   RECORD(PP_MODULE_MACRO);
956   RECORD(PP_TOKEN);
957 
958   // Decls and Types block.
959   BLOCK(DECLTYPES_BLOCK);
960   RECORD(TYPE_EXT_QUAL);
961   RECORD(TYPE_COMPLEX);
962   RECORD(TYPE_POINTER);
963   RECORD(TYPE_BLOCK_POINTER);
964   RECORD(TYPE_LVALUE_REFERENCE);
965   RECORD(TYPE_RVALUE_REFERENCE);
966   RECORD(TYPE_MEMBER_POINTER);
967   RECORD(TYPE_CONSTANT_ARRAY);
968   RECORD(TYPE_INCOMPLETE_ARRAY);
969   RECORD(TYPE_VARIABLE_ARRAY);
970   RECORD(TYPE_VECTOR);
971   RECORD(TYPE_EXT_VECTOR);
972   RECORD(TYPE_FUNCTION_NO_PROTO);
973   RECORD(TYPE_FUNCTION_PROTO);
974   RECORD(TYPE_TYPEDEF);
975   RECORD(TYPE_TYPEOF_EXPR);
976   RECORD(TYPE_TYPEOF);
977   RECORD(TYPE_RECORD);
978   RECORD(TYPE_ENUM);
979   RECORD(TYPE_OBJC_INTERFACE);
980   RECORD(TYPE_OBJC_OBJECT_POINTER);
981   RECORD(TYPE_DECLTYPE);
982   RECORD(TYPE_ELABORATED);
983   RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM);
984   RECORD(TYPE_UNRESOLVED_USING);
985   RECORD(TYPE_INJECTED_CLASS_NAME);
986   RECORD(TYPE_OBJC_OBJECT);
987   RECORD(TYPE_TEMPLATE_TYPE_PARM);
988   RECORD(TYPE_TEMPLATE_SPECIALIZATION);
989   RECORD(TYPE_DEPENDENT_NAME);
990   RECORD(TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION);
991   RECORD(TYPE_DEPENDENT_SIZED_ARRAY);
992   RECORD(TYPE_PAREN);
993   RECORD(TYPE_PACK_EXPANSION);
994   RECORD(TYPE_ATTRIBUTED);
995   RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);
996   RECORD(TYPE_AUTO);
997   RECORD(TYPE_UNARY_TRANSFORM);
998   RECORD(TYPE_ATOMIC);
999   RECORD(TYPE_DECAYED);
1000   RECORD(TYPE_ADJUSTED);
1001   RECORD(DECL_TYPEDEF);
1002   RECORD(DECL_TYPEALIAS);
1003   RECORD(DECL_ENUM);
1004   RECORD(DECL_RECORD);
1005   RECORD(DECL_ENUM_CONSTANT);
1006   RECORD(DECL_FUNCTION);
1007   RECORD(DECL_OBJC_METHOD);
1008   RECORD(DECL_OBJC_INTERFACE);
1009   RECORD(DECL_OBJC_PROTOCOL);
1010   RECORD(DECL_OBJC_IVAR);
1011   RECORD(DECL_OBJC_AT_DEFS_FIELD);
1012   RECORD(DECL_OBJC_CATEGORY);
1013   RECORD(DECL_OBJC_CATEGORY_IMPL);
1014   RECORD(DECL_OBJC_IMPLEMENTATION);
1015   RECORD(DECL_OBJC_COMPATIBLE_ALIAS);
1016   RECORD(DECL_OBJC_PROPERTY);
1017   RECORD(DECL_OBJC_PROPERTY_IMPL);
1018   RECORD(DECL_FIELD);
1019   RECORD(DECL_MS_PROPERTY);
1020   RECORD(DECL_VAR);
1021   RECORD(DECL_IMPLICIT_PARAM);
1022   RECORD(DECL_PARM_VAR);
1023   RECORD(DECL_FILE_SCOPE_ASM);
1024   RECORD(DECL_BLOCK);
1025   RECORD(DECL_CONTEXT_LEXICAL);
1026   RECORD(DECL_CONTEXT_VISIBLE);
1027   RECORD(DECL_NAMESPACE);
1028   RECORD(DECL_NAMESPACE_ALIAS);
1029   RECORD(DECL_USING);
1030   RECORD(DECL_USING_SHADOW);
1031   RECORD(DECL_USING_DIRECTIVE);
1032   RECORD(DECL_UNRESOLVED_USING_VALUE);
1033   RECORD(DECL_UNRESOLVED_USING_TYPENAME);
1034   RECORD(DECL_LINKAGE_SPEC);
1035   RECORD(DECL_CXX_RECORD);
1036   RECORD(DECL_CXX_METHOD);
1037   RECORD(DECL_CXX_CONSTRUCTOR);
1038   RECORD(DECL_CXX_DESTRUCTOR);
1039   RECORD(DECL_CXX_CONVERSION);
1040   RECORD(DECL_ACCESS_SPEC);
1041   RECORD(DECL_FRIEND);
1042   RECORD(DECL_FRIEND_TEMPLATE);
1043   RECORD(DECL_CLASS_TEMPLATE);
1044   RECORD(DECL_CLASS_TEMPLATE_SPECIALIZATION);
1045   RECORD(DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION);
1046   RECORD(DECL_VAR_TEMPLATE);
1047   RECORD(DECL_VAR_TEMPLATE_SPECIALIZATION);
1048   RECORD(DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION);
1049   RECORD(DECL_FUNCTION_TEMPLATE);
1050   RECORD(DECL_TEMPLATE_TYPE_PARM);
1051   RECORD(DECL_NON_TYPE_TEMPLATE_PARM);
1052   RECORD(DECL_TEMPLATE_TEMPLATE_PARM);
1053   RECORD(DECL_STATIC_ASSERT);
1054   RECORD(DECL_CXX_BASE_SPECIFIERS);
1055   RECORD(DECL_INDIRECTFIELD);
1056   RECORD(DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK);
1057 
1058   // Statements and Exprs can occur in the Decls and Types block.
1059   AddStmtsExprs(Stream, Record);
1060 
1061   BLOCK(PREPROCESSOR_DETAIL_BLOCK);
1062   RECORD(PPD_MACRO_EXPANSION);
1063   RECORD(PPD_MACRO_DEFINITION);
1064   RECORD(PPD_INCLUSION_DIRECTIVE);
1065 
1066 #undef RECORD
1067 #undef BLOCK
1068   Stream.ExitBlock();
1069 }
1070 
1071 /// \brief Prepares a path for being written to an AST file by converting it
1072 /// to an absolute path and removing nested './'s.
1073 ///
1074 /// \return \c true if the path was changed.
1075 static bool cleanPathForOutput(FileManager &FileMgr,
1076                                SmallVectorImpl<char> &Path) {
1077   bool Changed = false;
1078 
1079   if (!llvm::sys::path::is_absolute(StringRef(Path.data(), Path.size()))) {
1080     llvm::sys::fs::make_absolute(Path);
1081     Changed = true;
1082   }
1083 
1084   return Changed | FileMgr.removeDotPaths(Path);
1085 }
1086 
1087 /// \brief Adjusts the given filename to only write out the portion of the
1088 /// filename that is not part of the system root directory.
1089 ///
1090 /// \param Filename the file name to adjust.
1091 ///
1092 /// \param BaseDir When non-NULL, the PCH file is a relocatable AST file and
1093 /// the returned filename will be adjusted by this root directory.
1094 ///
1095 /// \returns either the original filename (if it needs no adjustment) or the
1096 /// adjusted filename (which points into the @p Filename parameter).
1097 static const char *
1098 adjustFilenameForRelocatableAST(const char *Filename, StringRef BaseDir) {
1099   assert(Filename && "No file name to adjust?");
1100 
1101   if (BaseDir.empty())
1102     return Filename;
1103 
1104   // Verify that the filename and the system root have the same prefix.
1105   unsigned Pos = 0;
1106   for (; Filename[Pos] && Pos < BaseDir.size(); ++Pos)
1107     if (Filename[Pos] != BaseDir[Pos])
1108       return Filename; // Prefixes don't match.
1109 
1110   // We hit the end of the filename before we hit the end of the system root.
1111   if (!Filename[Pos])
1112     return Filename;
1113 
1114   // If there's not a path separator at the end of the base directory nor
1115   // immediately after it, then this isn't within the base directory.
1116   if (!llvm::sys::path::is_separator(Filename[Pos])) {
1117     if (!llvm::sys::path::is_separator(BaseDir.back()))
1118       return Filename;
1119   } else {
1120     // If the file name has a '/' at the current position, skip over the '/'.
1121     // We distinguish relative paths from absolute paths by the
1122     // absence of '/' at the beginning of relative paths.
1123     //
1124     // FIXME: This is wrong. We distinguish them by asking if the path is
1125     // absolute, which isn't the same thing. And there might be multiple '/'s
1126     // in a row. Use a better mechanism to indicate whether we have emitted an
1127     // absolute or relative path.
1128     ++Pos;
1129   }
1130 
1131   return Filename + Pos;
1132 }
1133 
1134 static ASTFileSignature getSignature() {
1135   while (1) {
1136     if (ASTFileSignature S = llvm::sys::Process::GetRandomNumber())
1137       return S;
1138     // Rely on GetRandomNumber to eventually return non-zero...
1139   }
1140 }
1141 
1142 /// \brief Write the control block.
1143 void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context,
1144                                   StringRef isysroot,
1145                                   const std::string &OutputFile) {
1146   using namespace llvm;
1147   Stream.EnterSubblock(CONTROL_BLOCK_ID, 5);
1148   RecordData Record;
1149 
1150   // Metadata
1151   BitCodeAbbrev *MetadataAbbrev = new BitCodeAbbrev();
1152   MetadataAbbrev->Add(BitCodeAbbrevOp(METADATA));
1153   MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Major
1154   MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Minor
1155   MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Clang maj.
1156   MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16)); // Clang min.
1157   MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Relocatable
1158   MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Errors
1159   MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // SVN branch/tag
1160   unsigned MetadataAbbrevCode = Stream.EmitAbbrev(MetadataAbbrev);
1161   Record.push_back(METADATA);
1162   Record.push_back(VERSION_MAJOR);
1163   Record.push_back(VERSION_MINOR);
1164   Record.push_back(CLANG_VERSION_MAJOR);
1165   Record.push_back(CLANG_VERSION_MINOR);
1166   assert((!WritingModule || isysroot.empty()) &&
1167          "writing module as a relocatable PCH?");
1168   Record.push_back(!isysroot.empty());
1169   Record.push_back(ASTHasCompilerErrors);
1170   Stream.EmitRecordWithBlob(MetadataAbbrevCode, Record,
1171                             getClangFullRepositoryVersion());
1172 
1173   if (WritingModule) {
1174     // For implicit modules we output a signature that we can use to ensure
1175     // duplicate module builds don't collide in the cache as their output order
1176     // is non-deterministic.
1177     // FIXME: Remove this when output is deterministic.
1178     if (Context.getLangOpts().ImplicitModules) {
1179       Record.clear();
1180       Record.push_back(getSignature());
1181       Stream.EmitRecord(SIGNATURE, Record);
1182     }
1183 
1184     // Module name
1185     BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
1186     Abbrev->Add(BitCodeAbbrevOp(MODULE_NAME));
1187     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
1188     unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);
1189     RecordData Record;
1190     Record.push_back(MODULE_NAME);
1191     Stream.EmitRecordWithBlob(AbbrevCode, Record, WritingModule->Name);
1192   }
1193 
1194   if (WritingModule && WritingModule->Directory) {
1195     // Module directory.
1196     BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
1197     Abbrev->Add(BitCodeAbbrevOp(MODULE_DIRECTORY));
1198     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Directory
1199     unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);
1200     RecordData Record;
1201     Record.push_back(MODULE_DIRECTORY);
1202 
1203     SmallString<128> BaseDir(WritingModule->Directory->getName());
1204     cleanPathForOutput(Context.getSourceManager().getFileManager(), BaseDir);
1205     Stream.EmitRecordWithBlob(AbbrevCode, Record, BaseDir);
1206 
1207     // Write out all other paths relative to the base directory if possible.
1208     BaseDirectory.assign(BaseDir.begin(), BaseDir.end());
1209   } else if (!isysroot.empty()) {
1210     // Write out paths relative to the sysroot if possible.
1211     BaseDirectory = isysroot;
1212   }
1213 
1214   // Module map file
1215   if (WritingModule) {
1216     Record.clear();
1217 
1218     auto &Map = PP.getHeaderSearchInfo().getModuleMap();
1219 
1220     // Primary module map file.
1221     AddPath(Map.getModuleMapFileForUniquing(WritingModule)->getName(), Record);
1222 
1223     // Additional module map files.
1224     if (auto *AdditionalModMaps =
1225             Map.getAdditionalModuleMapFiles(WritingModule)) {
1226       Record.push_back(AdditionalModMaps->size());
1227       for (const FileEntry *F : *AdditionalModMaps)
1228         AddPath(F->getName(), Record);
1229     } else {
1230       Record.push_back(0);
1231     }
1232 
1233     Stream.EmitRecord(MODULE_MAP_FILE, Record);
1234   }
1235 
1236   // Imports
1237   if (Chain) {
1238     serialization::ModuleManager &Mgr = Chain->getModuleManager();
1239     Record.clear();
1240 
1241     for (auto *M : Mgr) {
1242       // Skip modules that weren't directly imported.
1243       if (!M->isDirectlyImported())
1244         continue;
1245 
1246       Record.push_back((unsigned)M->Kind); // FIXME: Stable encoding
1247       AddSourceLocation(M->ImportLoc, Record);
1248       Record.push_back(M->File->getSize());
1249       Record.push_back(M->File->getModificationTime());
1250       Record.push_back(M->Signature);
1251       AddPath(M->FileName, Record);
1252     }
1253     Stream.EmitRecord(IMPORTS, Record);
1254 
1255     // Also emit a list of known module files that were not imported,
1256     // but are made available by this module.
1257     // FIXME: Should we also include a signature here?
1258     Record.clear();
1259     for (auto *E : Mgr.getAdditionalKnownModuleFiles())
1260       AddPath(E->getName(), Record);
1261     if (!Record.empty())
1262       Stream.EmitRecord(KNOWN_MODULE_FILES, Record);
1263   }
1264 
1265   // Language options.
1266   Record.clear();
1267   const LangOptions &LangOpts = Context.getLangOpts();
1268 #define LANGOPT(Name, Bits, Default, Description) \
1269   Record.push_back(LangOpts.Name);
1270 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
1271   Record.push_back(static_cast<unsigned>(LangOpts.get##Name()));
1272 #include "clang/Basic/LangOptions.def"
1273 #define SANITIZER(NAME, ID)                                                    \
1274   Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID));
1275 #include "clang/Basic/Sanitizers.def"
1276 
1277   Record.push_back(LangOpts.ModuleFeatures.size());
1278   for (StringRef Feature : LangOpts.ModuleFeatures)
1279     AddString(Feature, Record);
1280 
1281   Record.push_back((unsigned) LangOpts.ObjCRuntime.getKind());
1282   AddVersionTuple(LangOpts.ObjCRuntime.getVersion(), Record);
1283 
1284   AddString(LangOpts.CurrentModule, Record);
1285 
1286   // Comment options.
1287   Record.push_back(LangOpts.CommentOpts.BlockCommandNames.size());
1288   for (CommentOptions::BlockCommandNamesTy::const_iterator
1289            I = LangOpts.CommentOpts.BlockCommandNames.begin(),
1290            IEnd = LangOpts.CommentOpts.BlockCommandNames.end();
1291        I != IEnd; ++I) {
1292     AddString(*I, Record);
1293   }
1294   Record.push_back(LangOpts.CommentOpts.ParseAllComments);
1295 
1296   Stream.EmitRecord(LANGUAGE_OPTIONS, Record);
1297 
1298   // Target options.
1299   Record.clear();
1300   const TargetInfo &Target = Context.getTargetInfo();
1301   const TargetOptions &TargetOpts = Target.getTargetOpts();
1302   AddString(TargetOpts.Triple, Record);
1303   AddString(TargetOpts.CPU, Record);
1304   AddString(TargetOpts.ABI, Record);
1305   Record.push_back(TargetOpts.FeaturesAsWritten.size());
1306   for (unsigned I = 0, N = TargetOpts.FeaturesAsWritten.size(); I != N; ++I) {
1307     AddString(TargetOpts.FeaturesAsWritten[I], Record);
1308   }
1309   Record.push_back(TargetOpts.Features.size());
1310   for (unsigned I = 0, N = TargetOpts.Features.size(); I != N; ++I) {
1311     AddString(TargetOpts.Features[I], Record);
1312   }
1313   Stream.EmitRecord(TARGET_OPTIONS, Record);
1314 
1315   // Diagnostic options.
1316   Record.clear();
1317   const DiagnosticOptions &DiagOpts
1318     = Context.getDiagnostics().getDiagnosticOptions();
1319 #define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name);
1320 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
1321   Record.push_back(static_cast<unsigned>(DiagOpts.get##Name()));
1322 #include "clang/Basic/DiagnosticOptions.def"
1323   Record.push_back(DiagOpts.Warnings.size());
1324   for (unsigned I = 0, N = DiagOpts.Warnings.size(); I != N; ++I)
1325     AddString(DiagOpts.Warnings[I], Record);
1326   Record.push_back(DiagOpts.Remarks.size());
1327   for (unsigned I = 0, N = DiagOpts.Remarks.size(); I != N; ++I)
1328     AddString(DiagOpts.Remarks[I], Record);
1329   // Note: we don't serialize the log or serialization file names, because they
1330   // are generally transient files and will almost always be overridden.
1331   Stream.EmitRecord(DIAGNOSTIC_OPTIONS, Record);
1332 
1333   // File system options.
1334   Record.clear();
1335   const FileSystemOptions &FSOpts
1336     = Context.getSourceManager().getFileManager().getFileSystemOptions();
1337   AddString(FSOpts.WorkingDir, Record);
1338   Stream.EmitRecord(FILE_SYSTEM_OPTIONS, Record);
1339 
1340   // Header search options.
1341   Record.clear();
1342   const HeaderSearchOptions &HSOpts
1343     = PP.getHeaderSearchInfo().getHeaderSearchOpts();
1344   AddString(HSOpts.Sysroot, Record);
1345 
1346   // Include entries.
1347   Record.push_back(HSOpts.UserEntries.size());
1348   for (unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {
1349     const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I];
1350     AddString(Entry.Path, Record);
1351     Record.push_back(static_cast<unsigned>(Entry.Group));
1352     Record.push_back(Entry.IsFramework);
1353     Record.push_back(Entry.IgnoreSysRoot);
1354   }
1355 
1356   // System header prefixes.
1357   Record.push_back(HSOpts.SystemHeaderPrefixes.size());
1358   for (unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {
1359     AddString(HSOpts.SystemHeaderPrefixes[I].Prefix, Record);
1360     Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);
1361   }
1362 
1363   AddString(HSOpts.ResourceDir, Record);
1364   AddString(HSOpts.ModuleCachePath, Record);
1365   AddString(HSOpts.ModuleUserBuildPath, Record);
1366   Record.push_back(HSOpts.DisableModuleHash);
1367   Record.push_back(HSOpts.UseBuiltinIncludes);
1368   Record.push_back(HSOpts.UseStandardSystemIncludes);
1369   Record.push_back(HSOpts.UseStandardCXXIncludes);
1370   Record.push_back(HSOpts.UseLibcxx);
1371   // Write out the specific module cache path that contains the module files.
1372   AddString(PP.getHeaderSearchInfo().getModuleCachePath(), Record);
1373   Stream.EmitRecord(HEADER_SEARCH_OPTIONS, Record);
1374 
1375   // Preprocessor options.
1376   Record.clear();
1377   const PreprocessorOptions &PPOpts = PP.getPreprocessorOpts();
1378 
1379   // Macro definitions.
1380   Record.push_back(PPOpts.Macros.size());
1381   for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
1382     AddString(PPOpts.Macros[I].first, Record);
1383     Record.push_back(PPOpts.Macros[I].second);
1384   }
1385 
1386   // Includes
1387   Record.push_back(PPOpts.Includes.size());
1388   for (unsigned I = 0, N = PPOpts.Includes.size(); I != N; ++I)
1389     AddString(PPOpts.Includes[I], Record);
1390 
1391   // Macro includes
1392   Record.push_back(PPOpts.MacroIncludes.size());
1393   for (unsigned I = 0, N = PPOpts.MacroIncludes.size(); I != N; ++I)
1394     AddString(PPOpts.MacroIncludes[I], Record);
1395 
1396   Record.push_back(PPOpts.UsePredefines);
1397   // Detailed record is important since it is used for the module cache hash.
1398   Record.push_back(PPOpts.DetailedRecord);
1399   AddString(PPOpts.ImplicitPCHInclude, Record);
1400   AddString(PPOpts.ImplicitPTHInclude, Record);
1401   Record.push_back(static_cast<unsigned>(PPOpts.ObjCXXARCStandardLibrary));
1402   Stream.EmitRecord(PREPROCESSOR_OPTIONS, Record);
1403 
1404   // Original file name and file ID
1405   SourceManager &SM = Context.getSourceManager();
1406   if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {
1407     BitCodeAbbrev *FileAbbrev = new BitCodeAbbrev();
1408     FileAbbrev->Add(BitCodeAbbrevOp(ORIGINAL_FILE));
1409     FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // File ID
1410     FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name
1411     unsigned FileAbbrevCode = Stream.EmitAbbrev(FileAbbrev);
1412 
1413     Record.clear();
1414     Record.push_back(ORIGINAL_FILE);
1415     Record.push_back(SM.getMainFileID().getOpaqueValue());
1416     EmitRecordWithPath(FileAbbrevCode, Record, MainFile->getName());
1417   }
1418 
1419   Record.clear();
1420   Record.push_back(SM.getMainFileID().getOpaqueValue());
1421   Stream.EmitRecord(ORIGINAL_FILE_ID, Record);
1422 
1423   // Original PCH directory
1424   if (!OutputFile.empty() && OutputFile != "-") {
1425     BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
1426     Abbrev->Add(BitCodeAbbrevOp(ORIGINAL_PCH_DIR));
1427     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name
1428     unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);
1429 
1430     SmallString<128> OutputPath(OutputFile);
1431 
1432     llvm::sys::fs::make_absolute(OutputPath);
1433     StringRef origDir = llvm::sys::path::parent_path(OutputPath);
1434 
1435     RecordData Record;
1436     Record.push_back(ORIGINAL_PCH_DIR);
1437     Stream.EmitRecordWithBlob(AbbrevCode, Record, origDir);
1438   }
1439 
1440   WriteInputFiles(Context.SourceMgr,
1441                   PP.getHeaderSearchInfo().getHeaderSearchOpts(),
1442                   PP.getLangOpts().Modules);
1443   Stream.ExitBlock();
1444 }
1445 
1446 namespace  {
1447   /// \brief An input file.
1448   struct InputFileEntry {
1449     const FileEntry *File;
1450     bool IsSystemFile;
1451     bool BufferOverridden;
1452   };
1453 }
1454 
1455 void ASTWriter::WriteInputFiles(SourceManager &SourceMgr,
1456                                 HeaderSearchOptions &HSOpts,
1457                                 bool Modules) {
1458   using namespace llvm;
1459   Stream.EnterSubblock(INPUT_FILES_BLOCK_ID, 4);
1460   RecordData Record;
1461 
1462   // Create input-file abbreviation.
1463   BitCodeAbbrev *IFAbbrev = new BitCodeAbbrev();
1464   IFAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE));
1465   IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ID
1466   IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12)); // Size
1467   IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32)); // Modification time
1468   IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Overridden
1469   IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // File name
1470   unsigned IFAbbrevCode = Stream.EmitAbbrev(IFAbbrev);
1471 
1472   // Get all ContentCache objects for files, sorted by whether the file is a
1473   // system one or not. System files go at the back, users files at the front.
1474   std::deque<InputFileEntry> SortedFiles;
1475   for (unsigned I = 1, N = SourceMgr.local_sloc_entry_size(); I != N; ++I) {
1476     // Get this source location entry.
1477     const SrcMgr::SLocEntry *SLoc = &SourceMgr.getLocalSLocEntry(I);
1478     assert(&SourceMgr.getSLocEntry(FileID::get(I)) == SLoc);
1479 
1480     // We only care about file entries that were not overridden.
1481     if (!SLoc->isFile())
1482       continue;
1483     const SrcMgr::ContentCache *Cache = SLoc->getFile().getContentCache();
1484     if (!Cache->OrigEntry)
1485       continue;
1486 
1487     InputFileEntry Entry;
1488     Entry.File = Cache->OrigEntry;
1489     Entry.IsSystemFile = Cache->IsSystemFile;
1490     Entry.BufferOverridden = Cache->BufferOverridden;
1491     if (Cache->IsSystemFile)
1492       SortedFiles.push_back(Entry);
1493     else
1494       SortedFiles.push_front(Entry);
1495   }
1496 
1497   unsigned UserFilesNum = 0;
1498   // Write out all of the input files.
1499   std::vector<uint64_t> InputFileOffsets;
1500   for (std::deque<InputFileEntry>::iterator
1501          I = SortedFiles.begin(), E = SortedFiles.end(); I != E; ++I) {
1502     const InputFileEntry &Entry = *I;
1503 
1504     uint32_t &InputFileID = InputFileIDs[Entry.File];
1505     if (InputFileID != 0)
1506       continue; // already recorded this file.
1507 
1508     // Record this entry's offset.
1509     InputFileOffsets.push_back(Stream.GetCurrentBitNo());
1510 
1511     InputFileID = InputFileOffsets.size();
1512 
1513     if (!Entry.IsSystemFile)
1514       ++UserFilesNum;
1515 
1516     Record.clear();
1517     Record.push_back(INPUT_FILE);
1518     Record.push_back(InputFileOffsets.size());
1519 
1520     // Emit size/modification time for this file.
1521     Record.push_back(Entry.File->getSize());
1522     Record.push_back(Entry.File->getModificationTime());
1523 
1524     // Whether this file was overridden.
1525     Record.push_back(Entry.BufferOverridden);
1526 
1527     EmitRecordWithPath(IFAbbrevCode, Record, Entry.File->getName());
1528   }
1529 
1530   Stream.ExitBlock();
1531 
1532   // Create input file offsets abbreviation.
1533   BitCodeAbbrev *OffsetsAbbrev = new BitCodeAbbrev();
1534   OffsetsAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE_OFFSETS));
1535   OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # input files
1536   OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # non-system
1537                                                                 //   input files
1538   OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));   // Array
1539   unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(OffsetsAbbrev);
1540 
1541   // Write input file offsets.
1542   Record.clear();
1543   Record.push_back(INPUT_FILE_OFFSETS);
1544   Record.push_back(InputFileOffsets.size());
1545   Record.push_back(UserFilesNum);
1546   Stream.EmitRecordWithBlob(OffsetsAbbrevCode, Record, bytes(InputFileOffsets));
1547 }
1548 
1549 //===----------------------------------------------------------------------===//
1550 // Source Manager Serialization
1551 //===----------------------------------------------------------------------===//
1552 
1553 /// \brief Create an abbreviation for the SLocEntry that refers to a
1554 /// file.
1555 static unsigned CreateSLocFileAbbrev(llvm::BitstreamWriter &Stream) {
1556   using namespace llvm;
1557   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
1558   Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_FILE_ENTRY));
1559   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset
1560   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Include location
1561   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Characteristic
1562   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Line directives
1563   // FileEntry fields.
1564   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Input File ID
1565   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // NumCreatedFIDs
1566   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24)); // FirstDeclIndex
1567   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // NumDecls
1568   return Stream.EmitAbbrev(Abbrev);
1569 }
1570 
1571 /// \brief Create an abbreviation for the SLocEntry that refers to a
1572 /// buffer.
1573 static unsigned CreateSLocBufferAbbrev(llvm::BitstreamWriter &Stream) {
1574   using namespace llvm;
1575   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
1576   Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_BUFFER_ENTRY));
1577   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset
1578   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Include location
1579   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Characteristic
1580   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Line directives
1581   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Buffer name blob
1582   return Stream.EmitAbbrev(Abbrev);
1583 }
1584 
1585 /// \brief Create an abbreviation for the SLocEntry that refers to a
1586 /// buffer's blob.
1587 static unsigned CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter &Stream) {
1588   using namespace llvm;
1589   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
1590   Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_BUFFER_BLOB));
1591   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Blob
1592   return Stream.EmitAbbrev(Abbrev);
1593 }
1594 
1595 /// \brief Create an abbreviation for the SLocEntry that refers to a macro
1596 /// expansion.
1597 static unsigned CreateSLocExpansionAbbrev(llvm::BitstreamWriter &Stream) {
1598   using namespace llvm;
1599   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
1600   Abbrev->Add(BitCodeAbbrevOp(SM_SLOC_EXPANSION_ENTRY));
1601   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Offset
1602   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Spelling location
1603   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // Start location
1604   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // End location
1605   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Token length
1606   return Stream.EmitAbbrev(Abbrev);
1607 }
1608 
1609 namespace {
1610   // Trait used for the on-disk hash table of header search information.
1611   class HeaderFileInfoTrait {
1612     ASTWriter &Writer;
1613     const HeaderSearch &HS;
1614 
1615     // Keep track of the framework names we've used during serialization.
1616     SmallVector<char, 128> FrameworkStringData;
1617     llvm::StringMap<unsigned> FrameworkNameOffset;
1618 
1619   public:
1620     HeaderFileInfoTrait(ASTWriter &Writer, const HeaderSearch &HS)
1621       : Writer(Writer), HS(HS) { }
1622 
1623     struct key_type {
1624       const FileEntry *FE;
1625       const char *Filename;
1626     };
1627     typedef const key_type &key_type_ref;
1628 
1629     typedef HeaderFileInfo data_type;
1630     typedef const data_type &data_type_ref;
1631     typedef unsigned hash_value_type;
1632     typedef unsigned offset_type;
1633 
1634     static hash_value_type ComputeHash(key_type_ref key) {
1635       // The hash is based only on size/time of the file, so that the reader can
1636       // match even when symlinking or excess path elements ("foo/../", "../")
1637       // change the form of the name. However, complete path is still the key.
1638       //
1639       // FIXME: Using the mtime here will cause problems for explicit module
1640       // imports.
1641       return llvm::hash_combine(key.FE->getSize(),
1642                                 key.FE->getModificationTime());
1643     }
1644 
1645     std::pair<unsigned,unsigned>
1646     EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref Data) {
1647       using namespace llvm::support;
1648       endian::Writer<little> Writer(Out);
1649       unsigned KeyLen = strlen(key.Filename) + 1 + 8 + 8;
1650       Writer.write<uint16_t>(KeyLen);
1651       unsigned DataLen = 1 + 2 + 4 + 4;
1652       if (Data.isModuleHeader)
1653         DataLen += 4;
1654       Writer.write<uint8_t>(DataLen);
1655       return std::make_pair(KeyLen, DataLen);
1656     }
1657 
1658     void EmitKey(raw_ostream& Out, key_type_ref key, unsigned KeyLen) {
1659       using namespace llvm::support;
1660       endian::Writer<little> LE(Out);
1661       LE.write<uint64_t>(key.FE->getSize());
1662       KeyLen -= 8;
1663       LE.write<uint64_t>(key.FE->getModificationTime());
1664       KeyLen -= 8;
1665       Out.write(key.Filename, KeyLen);
1666     }
1667 
1668     void EmitData(raw_ostream &Out, key_type_ref key,
1669                   data_type_ref Data, unsigned DataLen) {
1670       using namespace llvm::support;
1671       endian::Writer<little> LE(Out);
1672       uint64_t Start = Out.tell(); (void)Start;
1673 
1674       unsigned char Flags = (Data.HeaderRole << 6)
1675                           | (Data.isImport << 5)
1676                           | (Data.isPragmaOnce << 4)
1677                           | (Data.DirInfo << 2)
1678                           | (Data.Resolved << 1)
1679                           | Data.IndexHeaderMapHeader;
1680       LE.write<uint8_t>(Flags);
1681       LE.write<uint16_t>(Data.NumIncludes);
1682 
1683       if (!Data.ControllingMacro)
1684         LE.write<uint32_t>(Data.ControllingMacroID);
1685       else
1686         LE.write<uint32_t>(Writer.getIdentifierRef(Data.ControllingMacro));
1687 
1688       unsigned Offset = 0;
1689       if (!Data.Framework.empty()) {
1690         // If this header refers into a framework, save the framework name.
1691         llvm::StringMap<unsigned>::iterator Pos
1692           = FrameworkNameOffset.find(Data.Framework);
1693         if (Pos == FrameworkNameOffset.end()) {
1694           Offset = FrameworkStringData.size() + 1;
1695           FrameworkStringData.append(Data.Framework.begin(),
1696                                      Data.Framework.end());
1697           FrameworkStringData.push_back(0);
1698 
1699           FrameworkNameOffset[Data.Framework] = Offset;
1700         } else
1701           Offset = Pos->second;
1702       }
1703       LE.write<uint32_t>(Offset);
1704 
1705       if (Data.isModuleHeader) {
1706         Module *Mod = HS.findModuleForHeader(key.FE).getModule();
1707         LE.write<uint32_t>(Writer.getExistingSubmoduleID(Mod));
1708       }
1709 
1710       assert(Out.tell() - Start == DataLen && "Wrong data length");
1711     }
1712 
1713     const char *strings_begin() const { return FrameworkStringData.begin(); }
1714     const char *strings_end() const { return FrameworkStringData.end(); }
1715   };
1716 } // end anonymous namespace
1717 
1718 /// \brief Write the header search block for the list of files that
1719 ///
1720 /// \param HS The header search structure to save.
1721 void ASTWriter::WriteHeaderSearch(const HeaderSearch &HS) {
1722   SmallVector<const FileEntry *, 16> FilesByUID;
1723   HS.getFileMgr().GetUniqueIDMapping(FilesByUID);
1724 
1725   if (FilesByUID.size() > HS.header_file_size())
1726     FilesByUID.resize(HS.header_file_size());
1727 
1728   HeaderFileInfoTrait GeneratorTrait(*this, HS);
1729   llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait> Generator;
1730   SmallVector<const char *, 4> SavedStrings;
1731   unsigned NumHeaderSearchEntries = 0;
1732   for (unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
1733     const FileEntry *File = FilesByUID[UID];
1734     if (!File)
1735       continue;
1736 
1737     // Use HeaderSearch's getFileInfo to make sure we get the HeaderFileInfo
1738     // from the external source if it was not provided already.
1739     HeaderFileInfo HFI;
1740     if (!HS.tryGetFileInfo(File, HFI) ||
1741         (HFI.External && Chain) ||
1742         (HFI.isModuleHeader && !HFI.isCompilingModuleHeader))
1743       continue;
1744 
1745     // Massage the file path into an appropriate form.
1746     const char *Filename = File->getName();
1747     SmallString<128> FilenameTmp(Filename);
1748     if (PreparePathForOutput(FilenameTmp)) {
1749       // If we performed any translation on the file name at all, we need to
1750       // save this string, since the generator will refer to it later.
1751       Filename = strdup(FilenameTmp.c_str());
1752       SavedStrings.push_back(Filename);
1753     }
1754 
1755     HeaderFileInfoTrait::key_type key = { File, Filename };
1756     Generator.insert(key, HFI, GeneratorTrait);
1757     ++NumHeaderSearchEntries;
1758   }
1759 
1760   // Create the on-disk hash table in a buffer.
1761   SmallString<4096> TableData;
1762   uint32_t BucketOffset;
1763   {
1764     using namespace llvm::support;
1765     llvm::raw_svector_ostream Out(TableData);
1766     // Make sure that no bucket is at offset 0
1767     endian::Writer<little>(Out).write<uint32_t>(0);
1768     BucketOffset = Generator.Emit(Out, GeneratorTrait);
1769   }
1770 
1771   // Create a blob abbreviation
1772   using namespace llvm;
1773   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
1774   Abbrev->Add(BitCodeAbbrevOp(HEADER_SEARCH_TABLE));
1775   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1776   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1777   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1778   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1779   unsigned TableAbbrev = Stream.EmitAbbrev(Abbrev);
1780 
1781   // Write the header search table
1782   RecordData Record;
1783   Record.push_back(HEADER_SEARCH_TABLE);
1784   Record.push_back(BucketOffset);
1785   Record.push_back(NumHeaderSearchEntries);
1786   Record.push_back(TableData.size());
1787   TableData.append(GeneratorTrait.strings_begin(),GeneratorTrait.strings_end());
1788   Stream.EmitRecordWithBlob(TableAbbrev, Record, TableData);
1789 
1790   // Free all of the strings we had to duplicate.
1791   for (unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
1792     free(const_cast<char *>(SavedStrings[I]));
1793 }
1794 
1795 /// \brief Writes the block containing the serialized form of the
1796 /// source manager.
1797 ///
1798 /// TODO: We should probably use an on-disk hash table (stored in a
1799 /// blob), indexed based on the file name, so that we only create
1800 /// entries for files that we actually need. In the common case (no
1801 /// errors), we probably won't have to create file entries for any of
1802 /// the files in the AST.
1803 void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr,
1804                                         const Preprocessor &PP) {
1805   RecordData Record;
1806 
1807   // Enter the source manager block.
1808   Stream.EnterSubblock(SOURCE_MANAGER_BLOCK_ID, 3);
1809 
1810   // Abbreviations for the various kinds of source-location entries.
1811   unsigned SLocFileAbbrv = CreateSLocFileAbbrev(Stream);
1812   unsigned SLocBufferAbbrv = CreateSLocBufferAbbrev(Stream);
1813   unsigned SLocBufferBlobAbbrv = CreateSLocBufferBlobAbbrev(Stream);
1814   unsigned SLocExpansionAbbrv = CreateSLocExpansionAbbrev(Stream);
1815 
1816   // Write out the source location entry table. We skip the first
1817   // entry, which is always the same dummy entry.
1818   std::vector<uint32_t> SLocEntryOffsets;
1819   RecordData PreloadSLocs;
1820   SLocEntryOffsets.reserve(SourceMgr.local_sloc_entry_size() - 1);
1821   for (unsigned I = 1, N = SourceMgr.local_sloc_entry_size();
1822        I != N; ++I) {
1823     // Get this source location entry.
1824     const SrcMgr::SLocEntry *SLoc = &SourceMgr.getLocalSLocEntry(I);
1825     FileID FID = FileID::get(I);
1826     assert(&SourceMgr.getSLocEntry(FID) == SLoc);
1827 
1828     // Record the offset of this source-location entry.
1829     SLocEntryOffsets.push_back(Stream.GetCurrentBitNo());
1830 
1831     // Figure out which record code to use.
1832     unsigned Code;
1833     if (SLoc->isFile()) {
1834       const SrcMgr::ContentCache *Cache = SLoc->getFile().getContentCache();
1835       if (Cache->OrigEntry) {
1836         Code = SM_SLOC_FILE_ENTRY;
1837       } else
1838         Code = SM_SLOC_BUFFER_ENTRY;
1839     } else
1840       Code = SM_SLOC_EXPANSION_ENTRY;
1841     Record.clear();
1842     Record.push_back(Code);
1843 
1844     // Starting offset of this entry within this module, so skip the dummy.
1845     Record.push_back(SLoc->getOffset() - 2);
1846     if (SLoc->isFile()) {
1847       const SrcMgr::FileInfo &File = SLoc->getFile();
1848       Record.push_back(File.getIncludeLoc().getRawEncoding());
1849       Record.push_back(File.getFileCharacteristic()); // FIXME: stable encoding
1850       Record.push_back(File.hasLineDirectives());
1851 
1852       const SrcMgr::ContentCache *Content = File.getContentCache();
1853       if (Content->OrigEntry) {
1854         assert(Content->OrigEntry == Content->ContentsEntry &&
1855                "Writing to AST an overridden file is not supported");
1856 
1857         // The source location entry is a file. Emit input file ID.
1858         assert(InputFileIDs[Content->OrigEntry] != 0 && "Missed file entry");
1859         Record.push_back(InputFileIDs[Content->OrigEntry]);
1860 
1861         Record.push_back(File.NumCreatedFIDs);
1862 
1863         FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
1864         if (FDI != FileDeclIDs.end()) {
1865           Record.push_back(FDI->second->FirstDeclIndex);
1866           Record.push_back(FDI->second->DeclIDs.size());
1867         } else {
1868           Record.push_back(0);
1869           Record.push_back(0);
1870         }
1871 
1872         Stream.EmitRecordWithAbbrev(SLocFileAbbrv, Record);
1873 
1874         if (Content->BufferOverridden) {
1875           Record.clear();
1876           Record.push_back(SM_SLOC_BUFFER_BLOB);
1877           const llvm::MemoryBuffer *Buffer
1878             = Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager());
1879           Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record,
1880                                     StringRef(Buffer->getBufferStart(),
1881                                               Buffer->getBufferSize() + 1));
1882         }
1883       } else {
1884         // The source location entry is a buffer. The blob associated
1885         // with this entry contains the contents of the buffer.
1886 
1887         // We add one to the size so that we capture the trailing NULL
1888         // that is required by llvm::MemoryBuffer::getMemBuffer (on
1889         // the reader side).
1890         const llvm::MemoryBuffer *Buffer
1891           = Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager());
1892         const char *Name = Buffer->getBufferIdentifier();
1893         Stream.EmitRecordWithBlob(SLocBufferAbbrv, Record,
1894                                   StringRef(Name, strlen(Name) + 1));
1895         Record.clear();
1896         Record.push_back(SM_SLOC_BUFFER_BLOB);
1897         Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record,
1898                                   StringRef(Buffer->getBufferStart(),
1899                                                   Buffer->getBufferSize() + 1));
1900 
1901         if (strcmp(Name, "<built-in>") == 0) {
1902           PreloadSLocs.push_back(SLocEntryOffsets.size());
1903         }
1904       }
1905     } else {
1906       // The source location entry is a macro expansion.
1907       const SrcMgr::ExpansionInfo &Expansion = SLoc->getExpansion();
1908       Record.push_back(Expansion.getSpellingLoc().getRawEncoding());
1909       Record.push_back(Expansion.getExpansionLocStart().getRawEncoding());
1910       Record.push_back(Expansion.isMacroArgExpansion() ? 0
1911                              : Expansion.getExpansionLocEnd().getRawEncoding());
1912 
1913       // Compute the token length for this macro expansion.
1914       unsigned NextOffset = SourceMgr.getNextLocalOffset();
1915       if (I + 1 != N)
1916         NextOffset = SourceMgr.getLocalSLocEntry(I + 1).getOffset();
1917       Record.push_back(NextOffset - SLoc->getOffset() - 1);
1918       Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv, Record);
1919     }
1920   }
1921 
1922   Stream.ExitBlock();
1923 
1924   if (SLocEntryOffsets.empty())
1925     return;
1926 
1927   // Write the source-location offsets table into the AST block. This
1928   // table is used for lazily loading source-location information.
1929   using namespace llvm;
1930   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
1931   Abbrev->Add(BitCodeAbbrevOp(SOURCE_LOCATION_OFFSETS));
1932   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // # of slocs
1933   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // total size
1934   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // offsets
1935   unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(Abbrev);
1936 
1937   Record.clear();
1938   Record.push_back(SOURCE_LOCATION_OFFSETS);
1939   Record.push_back(SLocEntryOffsets.size());
1940   Record.push_back(SourceMgr.getNextLocalOffset() - 1); // skip dummy
1941   Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record, bytes(SLocEntryOffsets));
1942 
1943   // Write the source location entry preloads array, telling the AST
1944   // reader which source locations entries it should load eagerly.
1945   Stream.EmitRecord(SOURCE_LOCATION_PRELOADS, PreloadSLocs);
1946 
1947   // Write the line table. It depends on remapping working, so it must come
1948   // after the source location offsets.
1949   if (SourceMgr.hasLineTable()) {
1950     LineTableInfo &LineTable = SourceMgr.getLineTable();
1951 
1952     Record.clear();
1953     // Emit the file names.
1954     Record.push_back(LineTable.getNumFilenames());
1955     for (unsigned I = 0, N = LineTable.getNumFilenames(); I != N; ++I)
1956       AddPath(LineTable.getFilename(I), Record);
1957 
1958     // Emit the line entries
1959     for (LineTableInfo::iterator L = LineTable.begin(), LEnd = LineTable.end();
1960          L != LEnd; ++L) {
1961       // Only emit entries for local files.
1962       if (L->first.ID < 0)
1963         continue;
1964 
1965       // Emit the file ID
1966       Record.push_back(L->first.ID);
1967 
1968       // Emit the line entries
1969       Record.push_back(L->second.size());
1970       for (std::vector<LineEntry>::iterator LE = L->second.begin(),
1971                                          LEEnd = L->second.end();
1972            LE != LEEnd; ++LE) {
1973         Record.push_back(LE->FileOffset);
1974         Record.push_back(LE->LineNo);
1975         Record.push_back(LE->FilenameID);
1976         Record.push_back((unsigned)LE->FileKind);
1977         Record.push_back(LE->IncludeOffset);
1978       }
1979     }
1980     Stream.EmitRecord(SOURCE_MANAGER_LINE_TABLE, Record);
1981   }
1982 }
1983 
1984 //===----------------------------------------------------------------------===//
1985 // Preprocessor Serialization
1986 //===----------------------------------------------------------------------===//
1987 
1988 static bool shouldIgnoreMacro(MacroDirective *MD, bool IsModule,
1989                               const Preprocessor &PP) {
1990   if (MacroInfo *MI = MD->getMacroInfo())
1991     if (MI->isBuiltinMacro())
1992       return true;
1993 
1994   if (IsModule) {
1995     SourceLocation Loc = MD->getLocation();
1996     if (Loc.isInvalid())
1997       return true;
1998     if (PP.getSourceManager().getFileID(Loc) == PP.getPredefinesFileID())
1999       return true;
2000   }
2001 
2002   return false;
2003 }
2004 
2005 /// \brief Writes the block containing the serialized form of the
2006 /// preprocessor.
2007 ///
2008 void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) {
2009   PreprocessingRecord *PPRec = PP.getPreprocessingRecord();
2010   if (PPRec)
2011     WritePreprocessorDetail(*PPRec);
2012 
2013   RecordData Record;
2014   RecordData ModuleMacroRecord;
2015 
2016   // If the preprocessor __COUNTER__ value has been bumped, remember it.
2017   if (PP.getCounterValue() != 0) {
2018     Record.push_back(PP.getCounterValue());
2019     Stream.EmitRecord(PP_COUNTER_VALUE, Record);
2020     Record.clear();
2021   }
2022 
2023   // Enter the preprocessor block.
2024   Stream.EnterSubblock(PREPROCESSOR_BLOCK_ID, 3);
2025 
2026   // If the AST file contains __DATE__ or __TIME__ emit a warning about this.
2027   // FIXME: use diagnostics subsystem for localization etc.
2028   if (PP.SawDateOrTime())
2029     fprintf(stderr, "warning: precompiled header used __DATE__ or __TIME__.\n");
2030 
2031 
2032   // Loop over all the macro directives that are live at the end of the file,
2033   // emitting each to the PP section.
2034 
2035   // Construct the list of identifiers with macro directives that need to be
2036   // serialized.
2037   SmallVector<const IdentifierInfo *, 128> MacroIdentifiers;
2038   for (auto &Id : PP.getIdentifierTable())
2039     if (Id.second->hadMacroDefinition() &&
2040         (!Id.second->isFromAST() ||
2041          Id.second->hasChangedSinceDeserialization()))
2042       MacroIdentifiers.push_back(Id.second);
2043   // Sort the set of macro definitions that need to be serialized by the
2044   // name of the macro, to provide a stable ordering.
2045   std::sort(MacroIdentifiers.begin(), MacroIdentifiers.end(),
2046             llvm::less_ptr<IdentifierInfo>());
2047 
2048   // Emit the macro directives as a list and associate the offset with the
2049   // identifier they belong to.
2050   for (const IdentifierInfo *Name : MacroIdentifiers) {
2051     MacroDirective *MD = PP.getLocalMacroDirectiveHistory(Name);
2052     auto StartOffset = Stream.GetCurrentBitNo();
2053 
2054     // Emit the macro directives in reverse source order.
2055     for (; MD; MD = MD->getPrevious()) {
2056       // Once we hit an ignored macro, we're done: the rest of the chain
2057       // will all be ignored macros.
2058       if (shouldIgnoreMacro(MD, IsModule, PP))
2059         break;
2060 
2061       AddSourceLocation(MD->getLocation(), Record);
2062       Record.push_back(MD->getKind());
2063       if (auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2064         Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2065       } else if (auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2066         Record.push_back(VisMD->isPublic());
2067       }
2068     }
2069 
2070     // Write out any exported module macros.
2071     bool EmittedModuleMacros = false;
2072     if (IsModule) {
2073       auto Leafs = PP.getLeafModuleMacros(Name);
2074       SmallVector<ModuleMacro*, 8> Worklist(Leafs.begin(), Leafs.end());
2075       llvm::DenseMap<ModuleMacro*, unsigned> Visits;
2076       while (!Worklist.empty()) {
2077         auto *Macro = Worklist.pop_back_val();
2078 
2079         // Emit a record indicating this submodule exports this macro.
2080         ModuleMacroRecord.push_back(
2081             getSubmoduleID(Macro->getOwningModule()));
2082         ModuleMacroRecord.push_back(getMacroRef(Macro->getMacroInfo(), Name));
2083         for (auto *M : Macro->overrides())
2084           ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2085 
2086         Stream.EmitRecord(PP_MODULE_MACRO, ModuleMacroRecord);
2087         ModuleMacroRecord.clear();
2088 
2089         // Enqueue overridden macros once we've visited all their ancestors.
2090         for (auto *M : Macro->overrides())
2091           if (++Visits[M] == M->getNumOverridingMacros())
2092             Worklist.push_back(M);
2093 
2094         EmittedModuleMacros = true;
2095       }
2096     }
2097 
2098     if (Record.empty() && !EmittedModuleMacros)
2099       continue;
2100 
2101     IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2102     Stream.EmitRecord(PP_MACRO_DIRECTIVE_HISTORY, Record);
2103     Record.clear();
2104   }
2105 
2106   /// \brief Offsets of each of the macros into the bitstream, indexed by
2107   /// the local macro ID
2108   ///
2109   /// For each identifier that is associated with a macro, this map
2110   /// provides the offset into the bitstream where that macro is
2111   /// defined.
2112   std::vector<uint32_t> MacroOffsets;
2113 
2114   for (unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2115     const IdentifierInfo *Name = MacroInfosToEmit[I].Name;
2116     MacroInfo *MI = MacroInfosToEmit[I].MI;
2117     MacroID ID = MacroInfosToEmit[I].ID;
2118 
2119     if (ID < FirstMacroID) {
2120       assert(0 && "Loaded MacroInfo entered MacroInfosToEmit ?");
2121       continue;
2122     }
2123 
2124     // Record the local offset of this macro.
2125     unsigned Index = ID - FirstMacroID;
2126     if (Index == MacroOffsets.size())
2127       MacroOffsets.push_back(Stream.GetCurrentBitNo());
2128     else {
2129       if (Index > MacroOffsets.size())
2130         MacroOffsets.resize(Index + 1);
2131 
2132       MacroOffsets[Index] = Stream.GetCurrentBitNo();
2133     }
2134 
2135     AddIdentifierRef(Name, Record);
2136     Record.push_back(inferSubmoduleIDFromLocation(MI->getDefinitionLoc()));
2137     AddSourceLocation(MI->getDefinitionLoc(), Record);
2138     AddSourceLocation(MI->getDefinitionEndLoc(), Record);
2139     Record.push_back(MI->isUsed());
2140     Record.push_back(MI->isUsedForHeaderGuard());
2141     unsigned Code;
2142     if (MI->isObjectLike()) {
2143       Code = PP_MACRO_OBJECT_LIKE;
2144     } else {
2145       Code = PP_MACRO_FUNCTION_LIKE;
2146 
2147       Record.push_back(MI->isC99Varargs());
2148       Record.push_back(MI->isGNUVarargs());
2149       Record.push_back(MI->hasCommaPasting());
2150       Record.push_back(MI->getNumArgs());
2151       for (const IdentifierInfo *Arg : MI->args())
2152         AddIdentifierRef(Arg, Record);
2153     }
2154 
2155     // If we have a detailed preprocessing record, record the macro definition
2156     // ID that corresponds to this macro.
2157     if (PPRec)
2158       Record.push_back(MacroDefinitions[PPRec->findMacroDefinition(MI)]);
2159 
2160     Stream.EmitRecord(Code, Record);
2161     Record.clear();
2162 
2163     // Emit the tokens array.
2164     for (unsigned TokNo = 0, e = MI->getNumTokens(); TokNo != e; ++TokNo) {
2165       // Note that we know that the preprocessor does not have any annotation
2166       // tokens in it because they are created by the parser, and thus can't
2167       // be in a macro definition.
2168       const Token &Tok = MI->getReplacementToken(TokNo);
2169       AddToken(Tok, Record);
2170       Stream.EmitRecord(PP_TOKEN, Record);
2171       Record.clear();
2172     }
2173     ++NumMacros;
2174   }
2175 
2176   Stream.ExitBlock();
2177 
2178   // Write the offsets table for macro IDs.
2179   using namespace llvm;
2180   auto *Abbrev = new BitCodeAbbrev();
2181   Abbrev->Add(BitCodeAbbrevOp(MACRO_OFFSET));
2182   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of macros
2183   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID
2184   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2185 
2186   unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2187   Record.clear();
2188   Record.push_back(MACRO_OFFSET);
2189   Record.push_back(MacroOffsets.size());
2190   Record.push_back(FirstMacroID - NUM_PREDEF_MACRO_IDS);
2191   Stream.EmitRecordWithBlob(MacroOffsetAbbrev, Record,
2192                             bytes(MacroOffsets));
2193 }
2194 
2195 void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) {
2196   if (PPRec.local_begin() == PPRec.local_end())
2197     return;
2198 
2199   SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets;
2200 
2201   // Enter the preprocessor block.
2202   Stream.EnterSubblock(PREPROCESSOR_DETAIL_BLOCK_ID, 3);
2203 
2204   // If the preprocessor has a preprocessing record, emit it.
2205   unsigned NumPreprocessingRecords = 0;
2206   using namespace llvm;
2207 
2208   // Set up the abbreviation for
2209   unsigned InclusionAbbrev = 0;
2210   {
2211     BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
2212     Abbrev->Add(BitCodeAbbrevOp(PPD_INCLUSION_DIRECTIVE));
2213     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // filename length
2214     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // in quotes
2215     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // kind
2216     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // imported module
2217     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2218     InclusionAbbrev = Stream.EmitAbbrev(Abbrev);
2219   }
2220 
2221   unsigned FirstPreprocessorEntityID
2222     = (Chain ? PPRec.getNumLoadedPreprocessedEntities() : 0)
2223     + NUM_PREDEF_PP_ENTITY_IDS;
2224   unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2225   RecordData Record;
2226   for (PreprocessingRecord::iterator E = PPRec.local_begin(),
2227                                   EEnd = PPRec.local_end();
2228        E != EEnd;
2229        (void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2230     Record.clear();
2231 
2232     PreprocessedEntityOffsets.push_back(
2233         PPEntityOffset((*E)->getSourceRange(), Stream.GetCurrentBitNo()));
2234 
2235     if (MacroDefinitionRecord *MD = dyn_cast<MacroDefinitionRecord>(*E)) {
2236       // Record this macro definition's ID.
2237       MacroDefinitions[MD] = NextPreprocessorEntityID;
2238 
2239       AddIdentifierRef(MD->getName(), Record);
2240       Stream.EmitRecord(PPD_MACRO_DEFINITION, Record);
2241       continue;
2242     }
2243 
2244     if (MacroExpansion *ME = dyn_cast<MacroExpansion>(*E)) {
2245       Record.push_back(ME->isBuiltinMacro());
2246       if (ME->isBuiltinMacro())
2247         AddIdentifierRef(ME->getName(), Record);
2248       else
2249         Record.push_back(MacroDefinitions[ME->getDefinition()]);
2250       Stream.EmitRecord(PPD_MACRO_EXPANSION, Record);
2251       continue;
2252     }
2253 
2254     if (InclusionDirective *ID = dyn_cast<InclusionDirective>(*E)) {
2255       Record.push_back(PPD_INCLUSION_DIRECTIVE);
2256       Record.push_back(ID->getFileName().size());
2257       Record.push_back(ID->wasInQuotes());
2258       Record.push_back(static_cast<unsigned>(ID->getKind()));
2259       Record.push_back(ID->importedModule());
2260       SmallString<64> Buffer;
2261       Buffer += ID->getFileName();
2262       // Check that the FileEntry is not null because it was not resolved and
2263       // we create a PCH even with compiler errors.
2264       if (ID->getFile())
2265         Buffer += ID->getFile()->getName();
2266       Stream.EmitRecordWithBlob(InclusionAbbrev, Record, Buffer);
2267       continue;
2268     }
2269 
2270     llvm_unreachable("Unhandled PreprocessedEntity in ASTWriter");
2271   }
2272   Stream.ExitBlock();
2273 
2274   // Write the offsets table for the preprocessing record.
2275   if (NumPreprocessingRecords > 0) {
2276     assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2277 
2278     // Write the offsets table for identifier IDs.
2279     using namespace llvm;
2280     BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
2281     Abbrev->Add(BitCodeAbbrevOp(PPD_ENTITIES_OFFSETS));
2282     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first pp entity
2283     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2284     unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2285 
2286     Record.clear();
2287     Record.push_back(PPD_ENTITIES_OFFSETS);
2288     Record.push_back(FirstPreprocessorEntityID - NUM_PREDEF_PP_ENTITY_IDS);
2289     Stream.EmitRecordWithBlob(PPEOffsetAbbrev, Record,
2290                               bytes(PreprocessedEntityOffsets));
2291   }
2292 }
2293 
2294 unsigned ASTWriter::getSubmoduleID(Module *Mod) {
2295   llvm::DenseMap<Module *, unsigned>::iterator Known = SubmoduleIDs.find(Mod);
2296   if (Known != SubmoduleIDs.end())
2297     return Known->second;
2298 
2299   return SubmoduleIDs[Mod] = NextSubmoduleID++;
2300 }
2301 
2302 unsigned ASTWriter::getExistingSubmoduleID(Module *Mod) const {
2303   if (!Mod)
2304     return 0;
2305 
2306   llvm::DenseMap<Module *, unsigned>::const_iterator
2307     Known = SubmoduleIDs.find(Mod);
2308   if (Known != SubmoduleIDs.end())
2309     return Known->second;
2310 
2311   return 0;
2312 }
2313 
2314 /// \brief Compute the number of modules within the given tree (including the
2315 /// given module).
2316 static unsigned getNumberOfModules(Module *Mod) {
2317   unsigned ChildModules = 0;
2318   for (Module::submodule_iterator Sub = Mod->submodule_begin(),
2319                                SubEnd = Mod->submodule_end();
2320        Sub != SubEnd; ++Sub)
2321     ChildModules += getNumberOfModules(*Sub);
2322 
2323   return ChildModules + 1;
2324 }
2325 
2326 void ASTWriter::WriteSubmodules(Module *WritingModule) {
2327   // Enter the submodule description block.
2328   Stream.EnterSubblock(SUBMODULE_BLOCK_ID, /*bits for abbreviations*/5);
2329 
2330   // Write the abbreviations needed for the submodules block.
2331   using namespace llvm;
2332   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
2333   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_DEFINITION));
2334   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ID
2335   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Parent
2336   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFramework
2337   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExplicit
2338   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsSystem
2339   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExternC
2340   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferSubmodules...
2341   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExplicit...
2342   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExportWild...
2343   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ConfigMacrosExh...
2344   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2345   unsigned DefinitionAbbrev = Stream.EmitAbbrev(Abbrev);
2346 
2347   Abbrev = new BitCodeAbbrev();
2348   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_UMBRELLA_HEADER));
2349   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2350   unsigned UmbrellaAbbrev = Stream.EmitAbbrev(Abbrev);
2351 
2352   Abbrev = new BitCodeAbbrev();
2353   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_HEADER));
2354   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2355   unsigned HeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2356 
2357   Abbrev = new BitCodeAbbrev();
2358   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_TOPHEADER));
2359   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2360   unsigned TopHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2361 
2362   Abbrev = new BitCodeAbbrev();
2363   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_UMBRELLA_DIR));
2364   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2365   unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(Abbrev);
2366 
2367   Abbrev = new BitCodeAbbrev();
2368   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_REQUIRES));
2369   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // State
2370   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));     // Feature
2371   unsigned RequiresAbbrev = Stream.EmitAbbrev(Abbrev);
2372 
2373   Abbrev = new BitCodeAbbrev();
2374   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_EXCLUDED_HEADER));
2375   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2376   unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2377 
2378   Abbrev = new BitCodeAbbrev();
2379   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_TEXTUAL_HEADER));
2380   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2381   unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2382 
2383   Abbrev = new BitCodeAbbrev();
2384   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_PRIVATE_HEADER));
2385   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2386   unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2387 
2388   Abbrev = new BitCodeAbbrev();
2389   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_PRIVATE_TEXTUAL_HEADER));
2390   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name
2391   unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(Abbrev);
2392 
2393   Abbrev = new BitCodeAbbrev();
2394   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_LINK_LIBRARY));
2395   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFramework
2396   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));     // Name
2397   unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(Abbrev);
2398 
2399   Abbrev = new BitCodeAbbrev();
2400   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_CONFIG_MACRO));
2401   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));    // Macro name
2402   unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(Abbrev);
2403 
2404   Abbrev = new BitCodeAbbrev();
2405   Abbrev->Add(BitCodeAbbrevOp(SUBMODULE_CONFLICT));
2406   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));  // Other module
2407   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));    // Message
2408   unsigned ConflictAbbrev = Stream.EmitAbbrev(Abbrev);
2409 
2410   // Write the submodule metadata block.
2411   RecordData Record;
2412   Record.push_back(getNumberOfModules(WritingModule));
2413   Record.push_back(FirstSubmoduleID - NUM_PREDEF_SUBMODULE_IDS);
2414   Stream.EmitRecord(SUBMODULE_METADATA, Record);
2415 
2416   // Write all of the submodules.
2417   std::queue<Module *> Q;
2418   Q.push(WritingModule);
2419   while (!Q.empty()) {
2420     Module *Mod = Q.front();
2421     Q.pop();
2422     unsigned ID = getSubmoduleID(Mod);
2423 
2424     // Emit the definition of the block.
2425     Record.clear();
2426     Record.push_back(SUBMODULE_DEFINITION);
2427     Record.push_back(ID);
2428     if (Mod->Parent) {
2429       assert(SubmoduleIDs[Mod->Parent] && "Submodule parent not written?");
2430       Record.push_back(SubmoduleIDs[Mod->Parent]);
2431     } else {
2432       Record.push_back(0);
2433     }
2434     Record.push_back(Mod->IsFramework);
2435     Record.push_back(Mod->IsExplicit);
2436     Record.push_back(Mod->IsSystem);
2437     Record.push_back(Mod->IsExternC);
2438     Record.push_back(Mod->InferSubmodules);
2439     Record.push_back(Mod->InferExplicitSubmodules);
2440     Record.push_back(Mod->InferExportWildcard);
2441     Record.push_back(Mod->ConfigMacrosExhaustive);
2442     Stream.EmitRecordWithBlob(DefinitionAbbrev, Record, Mod->Name);
2443 
2444     // Emit the requirements.
2445     for (unsigned I = 0, N = Mod->Requirements.size(); I != N; ++I) {
2446       Record.clear();
2447       Record.push_back(SUBMODULE_REQUIRES);
2448       Record.push_back(Mod->Requirements[I].second);
2449       Stream.EmitRecordWithBlob(RequiresAbbrev, Record,
2450                                 Mod->Requirements[I].first);
2451     }
2452 
2453     // Emit the umbrella header, if there is one.
2454     if (auto UmbrellaHeader = Mod->getUmbrellaHeader()) {
2455       Record.clear();
2456       Record.push_back(SUBMODULE_UMBRELLA_HEADER);
2457       Stream.EmitRecordWithBlob(UmbrellaAbbrev, Record,
2458                                 UmbrellaHeader.NameAsWritten);
2459     } else if (auto UmbrellaDir = Mod->getUmbrellaDir()) {
2460       Record.clear();
2461       Record.push_back(SUBMODULE_UMBRELLA_DIR);
2462       Stream.EmitRecordWithBlob(UmbrellaDirAbbrev, Record,
2463                                 UmbrellaDir.NameAsWritten);
2464     }
2465 
2466     // Emit the headers.
2467     struct {
2468       unsigned RecordKind;
2469       unsigned Abbrev;
2470       Module::HeaderKind HeaderKind;
2471     } HeaderLists[] = {
2472       {SUBMODULE_HEADER, HeaderAbbrev, Module::HK_Normal},
2473       {SUBMODULE_TEXTUAL_HEADER, TextualHeaderAbbrev, Module::HK_Textual},
2474       {SUBMODULE_PRIVATE_HEADER, PrivateHeaderAbbrev, Module::HK_Private},
2475       {SUBMODULE_PRIVATE_TEXTUAL_HEADER, PrivateTextualHeaderAbbrev,
2476         Module::HK_PrivateTextual},
2477       {SUBMODULE_EXCLUDED_HEADER, ExcludedHeaderAbbrev, Module::HK_Excluded}
2478     };
2479     for (auto &HL : HeaderLists) {
2480       Record.clear();
2481       Record.push_back(HL.RecordKind);
2482       for (auto &H : Mod->Headers[HL.HeaderKind])
2483         Stream.EmitRecordWithBlob(HL.Abbrev, Record, H.NameAsWritten);
2484     }
2485 
2486     // Emit the top headers.
2487     {
2488       auto TopHeaders = Mod->getTopHeaders(PP->getFileManager());
2489       Record.clear();
2490       Record.push_back(SUBMODULE_TOPHEADER);
2491       for (auto *H : TopHeaders)
2492         Stream.EmitRecordWithBlob(TopHeaderAbbrev, Record, H->getName());
2493     }
2494 
2495     // Emit the imports.
2496     if (!Mod->Imports.empty()) {
2497       Record.clear();
2498       for (unsigned I = 0, N = Mod->Imports.size(); I != N; ++I) {
2499         unsigned ImportedID = getSubmoduleID(Mod->Imports[I]);
2500         assert(ImportedID && "Unknown submodule!");
2501         Record.push_back(ImportedID);
2502       }
2503       Stream.EmitRecord(SUBMODULE_IMPORTS, Record);
2504     }
2505 
2506     // Emit the exports.
2507     if (!Mod->Exports.empty()) {
2508       Record.clear();
2509       for (unsigned I = 0, N = Mod->Exports.size(); I != N; ++I) {
2510         if (Module *Exported = Mod->Exports[I].getPointer()) {
2511           unsigned ExportedID = getSubmoduleID(Exported);
2512           Record.push_back(ExportedID);
2513         } else {
2514           Record.push_back(0);
2515         }
2516 
2517         Record.push_back(Mod->Exports[I].getInt());
2518       }
2519       Stream.EmitRecord(SUBMODULE_EXPORTS, Record);
2520     }
2521 
2522     //FIXME: How do we emit the 'use'd modules?  They may not be submodules.
2523     // Might be unnecessary as use declarations are only used to build the
2524     // module itself.
2525 
2526     // Emit the link libraries.
2527     for (unsigned I = 0, N = Mod->LinkLibraries.size(); I != N; ++I) {
2528       Record.clear();
2529       Record.push_back(SUBMODULE_LINK_LIBRARY);
2530       Record.push_back(Mod->LinkLibraries[I].IsFramework);
2531       Stream.EmitRecordWithBlob(LinkLibraryAbbrev, Record,
2532                                 Mod->LinkLibraries[I].Library);
2533     }
2534 
2535     // Emit the conflicts.
2536     for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
2537       Record.clear();
2538       Record.push_back(SUBMODULE_CONFLICT);
2539       unsigned OtherID = getSubmoduleID(Mod->Conflicts[I].Other);
2540       assert(OtherID && "Unknown submodule!");
2541       Record.push_back(OtherID);
2542       Stream.EmitRecordWithBlob(ConflictAbbrev, Record,
2543                                 Mod->Conflicts[I].Message);
2544     }
2545 
2546     // Emit the configuration macros.
2547     for (unsigned I = 0, N =  Mod->ConfigMacros.size(); I != N; ++I) {
2548       Record.clear();
2549       Record.push_back(SUBMODULE_CONFIG_MACRO);
2550       Stream.EmitRecordWithBlob(ConfigMacroAbbrev, Record,
2551                                 Mod->ConfigMacros[I]);
2552     }
2553 
2554     // Queue up the submodules of this module.
2555     for (Module::submodule_iterator Sub = Mod->submodule_begin(),
2556                                  SubEnd = Mod->submodule_end();
2557          Sub != SubEnd; ++Sub)
2558       Q.push(*Sub);
2559   }
2560 
2561   Stream.ExitBlock();
2562 
2563   // FIXME: This can easily happen, if we have a reference to a submodule that
2564   // did not result in us loading a module file for that submodule. For
2565   // instance, a cross-top-level-module 'conflict' declaration will hit this.
2566   assert((NextSubmoduleID - FirstSubmoduleID ==
2567           getNumberOfModules(WritingModule)) &&
2568          "Wrong # of submodules; found a reference to a non-local, "
2569          "non-imported submodule?");
2570 }
2571 
2572 serialization::SubmoduleID
2573 ASTWriter::inferSubmoduleIDFromLocation(SourceLocation Loc) {
2574   if (Loc.isInvalid() || !WritingModule)
2575     return 0; // No submodule
2576 
2577   // Find the module that owns this location.
2578   ModuleMap &ModMap = PP->getHeaderSearchInfo().getModuleMap();
2579   Module *OwningMod
2580     = ModMap.inferModuleFromLocation(FullSourceLoc(Loc,PP->getSourceManager()));
2581   if (!OwningMod)
2582     return 0;
2583 
2584   // Check whether this submodule is part of our own module.
2585   if (WritingModule != OwningMod && !OwningMod->isSubModuleOf(WritingModule))
2586     return 0;
2587 
2588   return getSubmoduleID(OwningMod);
2589 }
2590 
2591 void ASTWriter::WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag,
2592                                               bool isModule) {
2593   // Make sure set diagnostic pragmas don't affect the translation unit that
2594   // imports the module.
2595   // FIXME: Make diagnostic pragma sections work properly with modules.
2596   if (isModule)
2597     return;
2598 
2599   llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
2600       DiagStateIDMap;
2601   unsigned CurrID = 0;
2602   DiagStateIDMap[&Diag.DiagStates.front()] = ++CurrID; // the command-line one.
2603   RecordData Record;
2604   for (DiagnosticsEngine::DiagStatePointsTy::const_iterator
2605          I = Diag.DiagStatePoints.begin(), E = Diag.DiagStatePoints.end();
2606          I != E; ++I) {
2607     const DiagnosticsEngine::DiagStatePoint &point = *I;
2608     if (point.Loc.isInvalid())
2609       continue;
2610 
2611     Record.push_back(point.Loc.getRawEncoding());
2612     unsigned &DiagStateID = DiagStateIDMap[point.State];
2613     Record.push_back(DiagStateID);
2614 
2615     if (DiagStateID == 0) {
2616       DiagStateID = ++CurrID;
2617       for (DiagnosticsEngine::DiagState::const_iterator
2618              I = point.State->begin(), E = point.State->end(); I != E; ++I) {
2619         if (I->second.isPragma()) {
2620           Record.push_back(I->first);
2621           Record.push_back((unsigned)I->second.getSeverity());
2622         }
2623       }
2624       Record.push_back(-1); // mark the end of the diag/map pairs for this
2625                             // location.
2626     }
2627   }
2628 
2629   if (!Record.empty())
2630     Stream.EmitRecord(DIAG_PRAGMA_MAPPINGS, Record);
2631 }
2632 
2633 void ASTWriter::WriteCXXCtorInitializersOffsets() {
2634   if (CXXCtorInitializersOffsets.empty())
2635     return;
2636 
2637   RecordData Record;
2638 
2639   // Create a blob abbreviation for the C++ ctor initializer offsets.
2640   using namespace llvm;
2641 
2642   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
2643   Abbrev->Add(BitCodeAbbrevOp(CXX_CTOR_INITIALIZERS_OFFSETS));
2644   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // size
2645   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2646   unsigned CtorInitializersOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2647 
2648   // Write the base specifier offsets table.
2649   Record.clear();
2650   Record.push_back(CXX_CTOR_INITIALIZERS_OFFSETS);
2651   Record.push_back(CXXCtorInitializersOffsets.size());
2652   Stream.EmitRecordWithBlob(CtorInitializersOffsetAbbrev, Record,
2653                             bytes(CXXCtorInitializersOffsets));
2654 }
2655 
2656 void ASTWriter::WriteCXXBaseSpecifiersOffsets() {
2657   if (CXXBaseSpecifiersOffsets.empty())
2658     return;
2659 
2660   RecordData Record;
2661 
2662   // Create a blob abbreviation for the C++ base specifiers offsets.
2663   using namespace llvm;
2664 
2665   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
2666   Abbrev->Add(BitCodeAbbrevOp(CXX_BASE_SPECIFIER_OFFSETS));
2667   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // size
2668   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2669   unsigned BaseSpecifierOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2670 
2671   // Write the base specifier offsets table.
2672   Record.clear();
2673   Record.push_back(CXX_BASE_SPECIFIER_OFFSETS);
2674   Record.push_back(CXXBaseSpecifiersOffsets.size());
2675   Stream.EmitRecordWithBlob(BaseSpecifierOffsetAbbrev, Record,
2676                             bytes(CXXBaseSpecifiersOffsets));
2677 }
2678 
2679 //===----------------------------------------------------------------------===//
2680 // Type Serialization
2681 //===----------------------------------------------------------------------===//
2682 
2683 /// \brief Write the representation of a type to the AST stream.
2684 void ASTWriter::WriteType(QualType T) {
2685   TypeIdx &Idx = TypeIdxs[T];
2686   if (Idx.getIndex() == 0) // we haven't seen this type before.
2687     Idx = TypeIdx(NextTypeID++);
2688 
2689   assert(Idx.getIndex() >= FirstTypeID && "Re-writing a type from a prior AST");
2690 
2691   // Record the offset for this type.
2692   unsigned Index = Idx.getIndex() - FirstTypeID;
2693   if (TypeOffsets.size() == Index)
2694     TypeOffsets.push_back(Stream.GetCurrentBitNo());
2695   else if (TypeOffsets.size() < Index) {
2696     TypeOffsets.resize(Index + 1);
2697     TypeOffsets[Index] = Stream.GetCurrentBitNo();
2698   }
2699 
2700   RecordData Record;
2701 
2702   // Emit the type's representation.
2703   ASTTypeWriter W(*this, Record);
2704   W.AbbrevToUse = 0;
2705 
2706   if (T.hasLocalNonFastQualifiers()) {
2707     Qualifiers Qs = T.getLocalQualifiers();
2708     AddTypeRef(T.getLocalUnqualifiedType(), Record);
2709     Record.push_back(Qs.getAsOpaqueValue());
2710     W.Code = TYPE_EXT_QUAL;
2711     W.AbbrevToUse = TypeExtQualAbbrev;
2712   } else {
2713     switch (T->getTypeClass()) {
2714       // For all of the concrete, non-dependent types, call the
2715       // appropriate visitor function.
2716 #define TYPE(Class, Base) \
2717     case Type::Class: W.Visit##Class##Type(cast<Class##Type>(T)); break;
2718 #define ABSTRACT_TYPE(Class, Base)
2719 #include "clang/AST/TypeNodes.def"
2720     }
2721   }
2722 
2723   // Emit the serialized record.
2724   Stream.EmitRecord(W.Code, Record, W.AbbrevToUse);
2725 
2726   // Flush any expressions that were written as part of this type.
2727   FlushStmts();
2728 }
2729 
2730 //===----------------------------------------------------------------------===//
2731 // Declaration Serialization
2732 //===----------------------------------------------------------------------===//
2733 
2734 /// \brief Write the block containing all of the declaration IDs
2735 /// lexically declared within the given DeclContext.
2736 ///
2737 /// \returns the offset of the DECL_CONTEXT_LEXICAL block within the
2738 /// bistream, or 0 if no block was written.
2739 uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
2740                                                  DeclContext *DC) {
2741   if (DC->decls_empty())
2742     return 0;
2743 
2744   uint64_t Offset = Stream.GetCurrentBitNo();
2745   RecordData Record;
2746   Record.push_back(DECL_CONTEXT_LEXICAL);
2747   SmallVector<KindDeclIDPair, 64> Decls;
2748   for (const auto *D : DC->decls())
2749     Decls.push_back(std::make_pair(D->getKind(), GetDeclRef(D)));
2750 
2751   ++NumLexicalDeclContexts;
2752   Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev, Record, bytes(Decls));
2753   return Offset;
2754 }
2755 
2756 void ASTWriter::WriteTypeDeclOffsets() {
2757   using namespace llvm;
2758   RecordData Record;
2759 
2760   // Write the type offsets array
2761   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
2762   Abbrev->Add(BitCodeAbbrevOp(TYPE_OFFSET));
2763   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of types
2764   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base type index
2765   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // types block
2766   unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2767   Record.clear();
2768   Record.push_back(TYPE_OFFSET);
2769   Record.push_back(TypeOffsets.size());
2770   Record.push_back(FirstTypeID - NUM_PREDEF_TYPE_IDS);
2771   Stream.EmitRecordWithBlob(TypeOffsetAbbrev, Record, bytes(TypeOffsets));
2772 
2773   // Write the declaration offsets array
2774   Abbrev = new BitCodeAbbrev();
2775   Abbrev->Add(BitCodeAbbrevOp(DECL_OFFSET));
2776   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of declarations
2777   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base decl ID
2778   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // declarations block
2779   unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
2780   Record.clear();
2781   Record.push_back(DECL_OFFSET);
2782   Record.push_back(DeclOffsets.size());
2783   Record.push_back(FirstDeclID - NUM_PREDEF_DECL_IDS);
2784   Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record, bytes(DeclOffsets));
2785 }
2786 
2787 void ASTWriter::WriteFileDeclIDsMap() {
2788   using namespace llvm;
2789   RecordData Record;
2790 
2791   SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs(
2792       FileDeclIDs.begin(), FileDeclIDs.end());
2793   std::sort(SortedFileDeclIDs.begin(), SortedFileDeclIDs.end(),
2794             llvm::less_first());
2795 
2796   // Join the vectors of DeclIDs from all files.
2797   SmallVector<DeclID, 256> FileGroupedDeclIDs;
2798   for (auto &FileDeclEntry : SortedFileDeclIDs) {
2799     DeclIDInFileInfo &Info = *FileDeclEntry.second;
2800     Info.FirstDeclIndex = FileGroupedDeclIDs.size();
2801     for (auto &LocDeclEntry : Info.DeclIDs)
2802       FileGroupedDeclIDs.push_back(LocDeclEntry.second);
2803   }
2804 
2805   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
2806   Abbrev->Add(BitCodeAbbrevOp(FILE_SORTED_DECLS));
2807   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2808   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2809   unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);
2810   Record.push_back(FILE_SORTED_DECLS);
2811   Record.push_back(FileGroupedDeclIDs.size());
2812   Stream.EmitRecordWithBlob(AbbrevCode, Record, bytes(FileGroupedDeclIDs));
2813 }
2814 
2815 void ASTWriter::WriteComments() {
2816   Stream.EnterSubblock(COMMENTS_BLOCK_ID, 3);
2817   ArrayRef<RawComment *> RawComments = Context->Comments.getComments();
2818   RecordData Record;
2819   for (ArrayRef<RawComment *>::iterator I = RawComments.begin(),
2820                                         E = RawComments.end();
2821        I != E; ++I) {
2822     Record.clear();
2823     AddSourceRange((*I)->getSourceRange(), Record);
2824     Record.push_back((*I)->getKind());
2825     Record.push_back((*I)->isTrailingComment());
2826     Record.push_back((*I)->isAlmostTrailingComment());
2827     Stream.EmitRecord(COMMENTS_RAW_COMMENT, Record);
2828   }
2829   Stream.ExitBlock();
2830 }
2831 
2832 //===----------------------------------------------------------------------===//
2833 // Global Method Pool and Selector Serialization
2834 //===----------------------------------------------------------------------===//
2835 
2836 namespace {
2837 // Trait used for the on-disk hash table used in the method pool.
2838 class ASTMethodPoolTrait {
2839   ASTWriter &Writer;
2840 
2841 public:
2842   typedef Selector key_type;
2843   typedef key_type key_type_ref;
2844 
2845   struct data_type {
2846     SelectorID ID;
2847     ObjCMethodList Instance, Factory;
2848   };
2849   typedef const data_type& data_type_ref;
2850 
2851   typedef unsigned hash_value_type;
2852   typedef unsigned offset_type;
2853 
2854   explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) { }
2855 
2856   static hash_value_type ComputeHash(Selector Sel) {
2857     return serialization::ComputeHash(Sel);
2858   }
2859 
2860   std::pair<unsigned,unsigned>
2861     EmitKeyDataLength(raw_ostream& Out, Selector Sel,
2862                       data_type_ref Methods) {
2863     using namespace llvm::support;
2864     endian::Writer<little> LE(Out);
2865     unsigned KeyLen = 2 + (Sel.getNumArgs()? Sel.getNumArgs() * 4 : 4);
2866     LE.write<uint16_t>(KeyLen);
2867     unsigned DataLen = 4 + 2 + 2; // 2 bytes for each of the method counts
2868     for (const ObjCMethodList *Method = &Methods.Instance; Method;
2869          Method = Method->getNext())
2870       if (Method->getMethod())
2871         DataLen += 4;
2872     for (const ObjCMethodList *Method = &Methods.Factory; Method;
2873          Method = Method->getNext())
2874       if (Method->getMethod())
2875         DataLen += 4;
2876     LE.write<uint16_t>(DataLen);
2877     return std::make_pair(KeyLen, DataLen);
2878   }
2879 
2880   void EmitKey(raw_ostream& Out, Selector Sel, unsigned) {
2881     using namespace llvm::support;
2882     endian::Writer<little> LE(Out);
2883     uint64_t Start = Out.tell();
2884     assert((Start >> 32) == 0 && "Selector key offset too large");
2885     Writer.SetSelectorOffset(Sel, Start);
2886     unsigned N = Sel.getNumArgs();
2887     LE.write<uint16_t>(N);
2888     if (N == 0)
2889       N = 1;
2890     for (unsigned I = 0; I != N; ++I)
2891       LE.write<uint32_t>(
2892           Writer.getIdentifierRef(Sel.getIdentifierInfoForSlot(I)));
2893   }
2894 
2895   void EmitData(raw_ostream& Out, key_type_ref,
2896                 data_type_ref Methods, unsigned DataLen) {
2897     using namespace llvm::support;
2898     endian::Writer<little> LE(Out);
2899     uint64_t Start = Out.tell(); (void)Start;
2900     LE.write<uint32_t>(Methods.ID);
2901     unsigned NumInstanceMethods = 0;
2902     for (const ObjCMethodList *Method = &Methods.Instance; Method;
2903          Method = Method->getNext())
2904       if (Method->getMethod())
2905         ++NumInstanceMethods;
2906 
2907     unsigned NumFactoryMethods = 0;
2908     for (const ObjCMethodList *Method = &Methods.Factory; Method;
2909          Method = Method->getNext())
2910       if (Method->getMethod())
2911         ++NumFactoryMethods;
2912 
2913     unsigned InstanceBits = Methods.Instance.getBits();
2914     assert(InstanceBits < 4);
2915     unsigned InstanceHasMoreThanOneDeclBit =
2916         Methods.Instance.hasMoreThanOneDecl();
2917     unsigned FullInstanceBits = (NumInstanceMethods << 3) |
2918                                 (InstanceHasMoreThanOneDeclBit << 2) |
2919                                 InstanceBits;
2920     unsigned FactoryBits = Methods.Factory.getBits();
2921     assert(FactoryBits < 4);
2922     unsigned FactoryHasMoreThanOneDeclBit =
2923         Methods.Factory.hasMoreThanOneDecl();
2924     unsigned FullFactoryBits = (NumFactoryMethods << 3) |
2925                                (FactoryHasMoreThanOneDeclBit << 2) |
2926                                FactoryBits;
2927     LE.write<uint16_t>(FullInstanceBits);
2928     LE.write<uint16_t>(FullFactoryBits);
2929     for (const ObjCMethodList *Method = &Methods.Instance; Method;
2930          Method = Method->getNext())
2931       if (Method->getMethod())
2932         LE.write<uint32_t>(Writer.getDeclID(Method->getMethod()));
2933     for (const ObjCMethodList *Method = &Methods.Factory; Method;
2934          Method = Method->getNext())
2935       if (Method->getMethod())
2936         LE.write<uint32_t>(Writer.getDeclID(Method->getMethod()));
2937 
2938     assert(Out.tell() - Start == DataLen && "Data length is wrong");
2939   }
2940 };
2941 } // end anonymous namespace
2942 
2943 /// \brief Write ObjC data: selectors and the method pool.
2944 ///
2945 /// The method pool contains both instance and factory methods, stored
2946 /// in an on-disk hash table indexed by the selector. The hash table also
2947 /// contains an empty entry for every other selector known to Sema.
2948 void ASTWriter::WriteSelectors(Sema &SemaRef) {
2949   using namespace llvm;
2950 
2951   // Do we have to do anything at all?
2952   if (SemaRef.MethodPool.empty() && SelectorIDs.empty())
2953     return;
2954   unsigned NumTableEntries = 0;
2955   // Create and write out the blob that contains selectors and the method pool.
2956   {
2957     llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait> Generator;
2958     ASTMethodPoolTrait Trait(*this);
2959 
2960     // Create the on-disk hash table representation. We walk through every
2961     // selector we've seen and look it up in the method pool.
2962     SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
2963     for (auto &SelectorAndID : SelectorIDs) {
2964       Selector S = SelectorAndID.first;
2965       SelectorID ID = SelectorAndID.second;
2966       Sema::GlobalMethodPool::iterator F = SemaRef.MethodPool.find(S);
2967       ASTMethodPoolTrait::data_type Data = {
2968         ID,
2969         ObjCMethodList(),
2970         ObjCMethodList()
2971       };
2972       if (F != SemaRef.MethodPool.end()) {
2973         Data.Instance = F->second.first;
2974         Data.Factory = F->second.second;
2975       }
2976       // Only write this selector if it's not in an existing AST or something
2977       // changed.
2978       if (Chain && ID < FirstSelectorID) {
2979         // Selector already exists. Did it change?
2980         bool changed = false;
2981         for (ObjCMethodList *M = &Data.Instance;
2982              !changed && M && M->getMethod(); M = M->getNext()) {
2983           if (!M->getMethod()->isFromASTFile())
2984             changed = true;
2985         }
2986         for (ObjCMethodList *M = &Data.Factory; !changed && M && M->getMethod();
2987              M = M->getNext()) {
2988           if (!M->getMethod()->isFromASTFile())
2989             changed = true;
2990         }
2991         if (!changed)
2992           continue;
2993       } else if (Data.Instance.getMethod() || Data.Factory.getMethod()) {
2994         // A new method pool entry.
2995         ++NumTableEntries;
2996       }
2997       Generator.insert(S, Data, Trait);
2998     }
2999 
3000     // Create the on-disk hash table in a buffer.
3001     SmallString<4096> MethodPool;
3002     uint32_t BucketOffset;
3003     {
3004       using namespace llvm::support;
3005       ASTMethodPoolTrait Trait(*this);
3006       llvm::raw_svector_ostream Out(MethodPool);
3007       // Make sure that no bucket is at offset 0
3008       endian::Writer<little>(Out).write<uint32_t>(0);
3009       BucketOffset = Generator.Emit(Out, Trait);
3010     }
3011 
3012     // Create a blob abbreviation
3013     BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
3014     Abbrev->Add(BitCodeAbbrevOp(METHOD_POOL));
3015     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3016     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3017     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3018     unsigned MethodPoolAbbrev = Stream.EmitAbbrev(Abbrev);
3019 
3020     // Write the method pool
3021     RecordData Record;
3022     Record.push_back(METHOD_POOL);
3023     Record.push_back(BucketOffset);
3024     Record.push_back(NumTableEntries);
3025     Stream.EmitRecordWithBlob(MethodPoolAbbrev, Record, MethodPool);
3026 
3027     // Create a blob abbreviation for the selector table offsets.
3028     Abbrev = new BitCodeAbbrev();
3029     Abbrev->Add(BitCodeAbbrevOp(SELECTOR_OFFSETS));
3030     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // size
3031     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID
3032     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3033     unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
3034 
3035     // Write the selector offsets table.
3036     Record.clear();
3037     Record.push_back(SELECTOR_OFFSETS);
3038     Record.push_back(SelectorOffsets.size());
3039     Record.push_back(FirstSelectorID - NUM_PREDEF_SELECTOR_IDS);
3040     Stream.EmitRecordWithBlob(SelectorOffsetAbbrev, Record,
3041                               bytes(SelectorOffsets));
3042   }
3043 }
3044 
3045 /// \brief Write the selectors referenced in @selector expression into AST file.
3046 void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) {
3047   using namespace llvm;
3048   if (SemaRef.ReferencedSelectors.empty())
3049     return;
3050 
3051   RecordData Record;
3052 
3053   // Note: this writes out all references even for a dependent AST. But it is
3054   // very tricky to fix, and given that @selector shouldn't really appear in
3055   // headers, probably not worth it. It's not a correctness issue.
3056   for (auto &SelectorAndLocation : SemaRef.ReferencedSelectors) {
3057     Selector Sel = SelectorAndLocation.first;
3058     SourceLocation Loc = SelectorAndLocation.second;
3059     AddSelectorRef(Sel, Record);
3060     AddSourceLocation(Loc, Record);
3061   }
3062   Stream.EmitRecord(REFERENCED_SELECTOR_POOL, Record);
3063 }
3064 
3065 //===----------------------------------------------------------------------===//
3066 // Identifier Table Serialization
3067 //===----------------------------------------------------------------------===//
3068 
3069 /// Determine the declaration that should be put into the name lookup table to
3070 /// represent the given declaration in this module. This is usually D itself,
3071 /// but if D was imported and merged into a local declaration, we want the most
3072 /// recent local declaration instead. The chosen declaration will be the most
3073 /// recent declaration in any module that imports this one.
3074 static NamedDecl *getDeclForLocalLookup(const LangOptions &LangOpts,
3075                                         NamedDecl *D) {
3076   if (!LangOpts.Modules || !D->isFromASTFile())
3077     return D;
3078 
3079   if (Decl *Redecl = D->getPreviousDecl()) {
3080     // For Redeclarable decls, a prior declaration might be local.
3081     for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3082       if (!Redecl->isFromASTFile())
3083         return cast<NamedDecl>(Redecl);
3084       // If we find a decl from a (chained-)PCH stop since we won't find a
3085       // local one.
3086       if (D->getOwningModuleID() == 0)
3087         break;
3088     }
3089   } else if (Decl *First = D->getCanonicalDecl()) {
3090     // For Mergeable decls, the first decl might be local.
3091     if (!First->isFromASTFile())
3092       return cast<NamedDecl>(First);
3093   }
3094 
3095   // All declarations are imported. Our most recent declaration will also be
3096   // the most recent one in anyone who imports us.
3097   return D;
3098 }
3099 
3100 namespace {
3101 class ASTIdentifierTableTrait {
3102   ASTWriter &Writer;
3103   Preprocessor &PP;
3104   IdentifierResolver &IdResolver;
3105   bool IsModule;
3106   bool NeedDecls;
3107   ASTWriter::RecordData *InterestingIdentifierOffsets;
3108 
3109   /// \brief Determines whether this is an "interesting" identifier that needs a
3110   /// full IdentifierInfo structure written into the hash table. Notably, this
3111   /// doesn't check whether the name has macros defined; use PublicMacroIterator
3112   /// to check that.
3113   bool isInterestingIdentifier(const IdentifierInfo *II, uint64_t MacroOffset) {
3114     if (MacroOffset ||
3115         II->isPoisoned() ||
3116         (IsModule ? II->hasRevertedBuiltin() : II->getObjCOrBuiltinID()) ||
3117         II->hasRevertedTokenIDToIdentifier() ||
3118         (NeedDecls && II->getFETokenInfo<void>()))
3119       return true;
3120 
3121     return false;
3122   }
3123 
3124 public:
3125   typedef IdentifierInfo* key_type;
3126   typedef key_type  key_type_ref;
3127 
3128   typedef IdentID data_type;
3129   typedef data_type data_type_ref;
3130 
3131   typedef unsigned hash_value_type;
3132   typedef unsigned offset_type;
3133 
3134   ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP,
3135                           IdentifierResolver &IdResolver, bool IsModule,
3136                           ASTWriter::RecordData *InterestingIdentifierOffsets)
3137       : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3138         NeedDecls(!IsModule || !Writer.getLangOpts().CPlusPlus),
3139         InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3140 
3141   static hash_value_type ComputeHash(const IdentifierInfo* II) {
3142     return llvm::HashString(II->getName());
3143   }
3144 
3145   bool isInterestingIdentifier(const IdentifierInfo *II) {
3146     auto MacroOffset = Writer.getMacroDirectivesOffset(II);
3147     return isInterestingIdentifier(II, MacroOffset);
3148   }
3149   bool isInterestingNonMacroIdentifier(const IdentifierInfo *II) {
3150     return isInterestingIdentifier(II, 0);
3151   }
3152 
3153   std::pair<unsigned,unsigned>
3154   EmitKeyDataLength(raw_ostream& Out, IdentifierInfo* II, IdentID ID) {
3155     unsigned KeyLen = II->getLength() + 1;
3156     unsigned DataLen = 4; // 4 bytes for the persistent ID << 1
3157     auto MacroOffset = Writer.getMacroDirectivesOffset(II);
3158     if (isInterestingIdentifier(II, MacroOffset)) {
3159       DataLen += 2; // 2 bytes for builtin ID
3160       DataLen += 2; // 2 bytes for flags
3161       if (MacroOffset)
3162         DataLen += 4; // MacroDirectives offset.
3163 
3164       if (NeedDecls) {
3165         for (IdentifierResolver::iterator D = IdResolver.begin(II),
3166                                        DEnd = IdResolver.end();
3167              D != DEnd; ++D)
3168           DataLen += 4;
3169       }
3170     }
3171     using namespace llvm::support;
3172     endian::Writer<little> LE(Out);
3173 
3174     assert((uint16_t)DataLen == DataLen && (uint16_t)KeyLen == KeyLen);
3175     LE.write<uint16_t>(DataLen);
3176     // We emit the key length after the data length so that every
3177     // string is preceded by a 16-bit length. This matches the PTH
3178     // format for storing identifiers.
3179     LE.write<uint16_t>(KeyLen);
3180     return std::make_pair(KeyLen, DataLen);
3181   }
3182 
3183   void EmitKey(raw_ostream& Out, const IdentifierInfo* II,
3184                unsigned KeyLen) {
3185     // Record the location of the key data.  This is used when generating
3186     // the mapping from persistent IDs to strings.
3187     Writer.SetIdentifierOffset(II, Out.tell());
3188 
3189     // Emit the offset of the key/data length information to the interesting
3190     // identifiers table if necessary.
3191     if (InterestingIdentifierOffsets && isInterestingIdentifier(II))
3192       InterestingIdentifierOffsets->push_back(Out.tell() - 4);
3193 
3194     Out.write(II->getNameStart(), KeyLen);
3195   }
3196 
3197   void EmitData(raw_ostream& Out, IdentifierInfo* II,
3198                 IdentID ID, unsigned) {
3199     using namespace llvm::support;
3200     endian::Writer<little> LE(Out);
3201 
3202     auto MacroOffset = Writer.getMacroDirectivesOffset(II);
3203     if (!isInterestingIdentifier(II, MacroOffset)) {
3204       LE.write<uint32_t>(ID << 1);
3205       return;
3206     }
3207 
3208     LE.write<uint32_t>((ID << 1) | 0x01);
3209     uint32_t Bits = (uint32_t)II->getObjCOrBuiltinID();
3210     assert((Bits & 0xffff) == Bits && "ObjCOrBuiltinID too big for ASTReader.");
3211     LE.write<uint16_t>(Bits);
3212     Bits = 0;
3213     bool HadMacroDefinition = MacroOffset != 0;
3214     Bits = (Bits << 1) | unsigned(HadMacroDefinition);
3215     Bits = (Bits << 1) | unsigned(II->isExtensionToken());
3216     Bits = (Bits << 1) | unsigned(II->isPoisoned());
3217     Bits = (Bits << 1) | unsigned(II->hasRevertedBuiltin());
3218     Bits = (Bits << 1) | unsigned(II->hasRevertedTokenIDToIdentifier());
3219     Bits = (Bits << 1) | unsigned(II->isCPlusPlusOperatorKeyword());
3220     LE.write<uint16_t>(Bits);
3221 
3222     if (HadMacroDefinition)
3223       LE.write<uint32_t>(MacroOffset);
3224 
3225     if (NeedDecls) {
3226       // Emit the declaration IDs in reverse order, because the
3227       // IdentifierResolver provides the declarations as they would be
3228       // visible (e.g., the function "stat" would come before the struct
3229       // "stat"), but the ASTReader adds declarations to the end of the list
3230       // (so we need to see the struct "stat" before the function "stat").
3231       // Only emit declarations that aren't from a chained PCH, though.
3232       SmallVector<NamedDecl *, 16> Decls(IdResolver.begin(II),
3233                                          IdResolver.end());
3234       for (SmallVectorImpl<NamedDecl *>::reverse_iterator D = Decls.rbegin(),
3235                                                           DEnd = Decls.rend();
3236            D != DEnd; ++D)
3237         LE.write<uint32_t>(
3238             Writer.getDeclID(getDeclForLocalLookup(PP.getLangOpts(), *D)));
3239     }
3240   }
3241 };
3242 } // end anonymous namespace
3243 
3244 /// \brief Write the identifier table into the AST file.
3245 ///
3246 /// The identifier table consists of a blob containing string data
3247 /// (the actual identifiers themselves) and a separate "offsets" index
3248 /// that maps identifier IDs to locations within the blob.
3249 void ASTWriter::WriteIdentifierTable(Preprocessor &PP,
3250                                      IdentifierResolver &IdResolver,
3251                                      bool IsModule) {
3252   using namespace llvm;
3253 
3254   RecordData InterestingIdents;
3255 
3256   // Create and write out the blob that contains the identifier
3257   // strings.
3258   {
3259     llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait> Generator;
3260     ASTIdentifierTableTrait Trait(
3261         *this, PP, IdResolver, IsModule,
3262         (getLangOpts().CPlusPlus && IsModule) ? &InterestingIdents : nullptr);
3263 
3264     // Look for any identifiers that were named while processing the
3265     // headers, but are otherwise not needed. We add these to the hash
3266     // table to enable checking of the predefines buffer in the case
3267     // where the user adds new macro definitions when building the AST
3268     // file.
3269     SmallVector<const IdentifierInfo *, 128> IIs;
3270     for (IdentifierTable::iterator ID = PP.getIdentifierTable().begin(),
3271                                 IDEnd = PP.getIdentifierTable().end();
3272          ID != IDEnd; ++ID)
3273       IIs.push_back(ID->second);
3274     // Sort the identifiers lexicographically before getting them references so
3275     // that their order is stable.
3276     std::sort(IIs.begin(), IIs.end(), llvm::less_ptr<IdentifierInfo>());
3277     for (const IdentifierInfo *II : IIs)
3278       if (Trait.isInterestingNonMacroIdentifier(II))
3279         getIdentifierRef(II);
3280 
3281     // Create the on-disk hash table representation. We only store offsets
3282     // for identifiers that appear here for the first time.
3283     IdentifierOffsets.resize(NextIdentID - FirstIdentID);
3284     for (auto IdentIDPair : IdentifierIDs) {
3285       IdentifierInfo *II = const_cast<IdentifierInfo *>(IdentIDPair.first);
3286       IdentID ID = IdentIDPair.second;
3287       assert(II && "NULL identifier in identifier table");
3288       if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization())
3289         Generator.insert(II, ID, Trait);
3290     }
3291 
3292     // Create the on-disk hash table in a buffer.
3293     SmallString<4096> IdentifierTable;
3294     uint32_t BucketOffset;
3295     {
3296       using namespace llvm::support;
3297       llvm::raw_svector_ostream Out(IdentifierTable);
3298       // Make sure that no bucket is at offset 0
3299       endian::Writer<little>(Out).write<uint32_t>(0);
3300       BucketOffset = Generator.Emit(Out, Trait);
3301     }
3302 
3303     // Create a blob abbreviation
3304     BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
3305     Abbrev->Add(BitCodeAbbrevOp(IDENTIFIER_TABLE));
3306     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3307     Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3308     unsigned IDTableAbbrev = Stream.EmitAbbrev(Abbrev);
3309 
3310     // Write the identifier table
3311     RecordData Record;
3312     Record.push_back(IDENTIFIER_TABLE);
3313     Record.push_back(BucketOffset);
3314     Stream.EmitRecordWithBlob(IDTableAbbrev, Record, IdentifierTable);
3315   }
3316 
3317   // Write the offsets table for identifier IDs.
3318   BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
3319   Abbrev->Add(BitCodeAbbrevOp(IDENTIFIER_OFFSET));
3320   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of identifiers
3321   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID
3322   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3323   unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(Abbrev);
3324 
3325 #ifndef NDEBUG
3326   for (unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
3327     assert(IdentifierOffsets[I] && "Missing identifier offset?");
3328 #endif
3329 
3330   RecordData Record;
3331   Record.push_back(IDENTIFIER_OFFSET);
3332   Record.push_back(IdentifierOffsets.size());
3333   Record.push_back(FirstIdentID - NUM_PREDEF_IDENT_IDS);
3334   Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev, Record,
3335                             bytes(IdentifierOffsets));
3336 
3337   // In C++, write the list of interesting identifiers (those that are
3338   // defined as macros, poisoned, or similar unusual things).
3339   if (!InterestingIdents.empty())
3340     Stream.EmitRecord(INTERESTING_IDENTIFIERS, InterestingIdents);
3341 }
3342 
3343 //===----------------------------------------------------------------------===//
3344 // DeclContext's Name Lookup Table Serialization
3345 //===----------------------------------------------------------------------===//
3346 
3347 namespace {
3348 // Trait used for the on-disk hash table used in the method pool.
3349 class ASTDeclContextNameLookupTrait {
3350   ASTWriter &Writer;
3351 
3352 public:
3353   typedef DeclarationName key_type;
3354   typedef key_type key_type_ref;
3355 
3356   typedef DeclContext::lookup_result data_type;
3357   typedef const data_type& data_type_ref;
3358 
3359   typedef unsigned hash_value_type;
3360   typedef unsigned offset_type;
3361 
3362   explicit ASTDeclContextNameLookupTrait(ASTWriter &Writer) : Writer(Writer) { }
3363 
3364   hash_value_type ComputeHash(DeclarationName Name) {
3365     llvm::FoldingSetNodeID ID;
3366     ID.AddInteger(Name.getNameKind());
3367 
3368     switch (Name.getNameKind()) {
3369     case DeclarationName::Identifier:
3370       ID.AddString(Name.getAsIdentifierInfo()->getName());
3371       break;
3372     case DeclarationName::ObjCZeroArgSelector:
3373     case DeclarationName::ObjCOneArgSelector:
3374     case DeclarationName::ObjCMultiArgSelector:
3375       ID.AddInteger(serialization::ComputeHash(Name.getObjCSelector()));
3376       break;
3377     case DeclarationName::CXXConstructorName:
3378     case DeclarationName::CXXDestructorName:
3379     case DeclarationName::CXXConversionFunctionName:
3380       break;
3381     case DeclarationName::CXXOperatorName:
3382       ID.AddInteger(Name.getCXXOverloadedOperator());
3383       break;
3384     case DeclarationName::CXXLiteralOperatorName:
3385       ID.AddString(Name.getCXXLiteralIdentifier()->getName());
3386     case DeclarationName::CXXUsingDirective:
3387       break;
3388     }
3389 
3390     return ID.ComputeHash();
3391   }
3392 
3393   std::pair<unsigned,unsigned>
3394     EmitKeyDataLength(raw_ostream& Out, DeclarationName Name,
3395                       data_type_ref Lookup) {
3396     using namespace llvm::support;
3397     endian::Writer<little> LE(Out);
3398     unsigned KeyLen = 1;
3399     switch (Name.getNameKind()) {
3400     case DeclarationName::Identifier:
3401     case DeclarationName::ObjCZeroArgSelector:
3402     case DeclarationName::ObjCOneArgSelector:
3403     case DeclarationName::ObjCMultiArgSelector:
3404     case DeclarationName::CXXLiteralOperatorName:
3405       KeyLen += 4;
3406       break;
3407     case DeclarationName::CXXOperatorName:
3408       KeyLen += 1;
3409       break;
3410     case DeclarationName::CXXConstructorName:
3411     case DeclarationName::CXXDestructorName:
3412     case DeclarationName::CXXConversionFunctionName:
3413     case DeclarationName::CXXUsingDirective:
3414       break;
3415     }
3416     LE.write<uint16_t>(KeyLen);
3417 
3418     // 2 bytes for num of decls and 4 for each DeclID.
3419     unsigned DataLen = 2 + 4 * Lookup.size();
3420     LE.write<uint16_t>(DataLen);
3421 
3422     return std::make_pair(KeyLen, DataLen);
3423   }
3424 
3425   void EmitKey(raw_ostream& Out, DeclarationName Name, unsigned) {
3426     using namespace llvm::support;
3427     endian::Writer<little> LE(Out);
3428     LE.write<uint8_t>(Name.getNameKind());
3429     switch (Name.getNameKind()) {
3430     case DeclarationName::Identifier:
3431       LE.write<uint32_t>(Writer.getIdentifierRef(Name.getAsIdentifierInfo()));
3432       return;
3433     case DeclarationName::ObjCZeroArgSelector:
3434     case DeclarationName::ObjCOneArgSelector:
3435     case DeclarationName::ObjCMultiArgSelector:
3436       LE.write<uint32_t>(Writer.getSelectorRef(Name.getObjCSelector()));
3437       return;
3438     case DeclarationName::CXXOperatorName:
3439       assert(Name.getCXXOverloadedOperator() < NUM_OVERLOADED_OPERATORS &&
3440              "Invalid operator?");
3441       LE.write<uint8_t>(Name.getCXXOverloadedOperator());
3442       return;
3443     case DeclarationName::CXXLiteralOperatorName:
3444       LE.write<uint32_t>(Writer.getIdentifierRef(Name.getCXXLiteralIdentifier()));
3445       return;
3446     case DeclarationName::CXXConstructorName:
3447     case DeclarationName::CXXDestructorName:
3448     case DeclarationName::CXXConversionFunctionName:
3449     case DeclarationName::CXXUsingDirective:
3450       return;
3451     }
3452 
3453     llvm_unreachable("Invalid name kind?");
3454   }
3455 
3456   void EmitData(raw_ostream& Out, key_type_ref,
3457                 data_type Lookup, unsigned DataLen) {
3458     using namespace llvm::support;
3459     endian::Writer<little> LE(Out);
3460     uint64_t Start = Out.tell(); (void)Start;
3461     LE.write<uint16_t>(Lookup.size());
3462     for (DeclContext::lookup_iterator I = Lookup.begin(), E = Lookup.end();
3463          I != E; ++I)
3464       LE.write<uint32_t>(
3465           Writer.GetDeclRef(getDeclForLocalLookup(Writer.getLangOpts(), *I)));
3466 
3467     assert(Out.tell() - Start == DataLen && "Data length is wrong");
3468   }
3469 };
3470 } // end anonymous namespace
3471 
3472 bool ASTWriter::isLookupResultExternal(StoredDeclsList &Result,
3473                                        DeclContext *DC) {
3474   return Result.hasExternalDecls() && DC->NeedToReconcileExternalVisibleStorage;
3475 }
3476 
3477 bool ASTWriter::isLookupResultEntirelyExternal(StoredDeclsList &Result,
3478                                                DeclContext *DC) {
3479   for (auto *D : Result.getLookupResult())
3480     if (!getDeclForLocalLookup(getLangOpts(), D)->isFromASTFile())
3481       return false;
3482 
3483   return true;
3484 }
3485 
3486 uint32_t
3487 ASTWriter::GenerateNameLookupTable(const DeclContext *ConstDC,
3488                                    llvm::SmallVectorImpl<char> &LookupTable) {
3489   assert(!ConstDC->HasLazyLocalLexicalLookups &&
3490          !ConstDC->HasLazyExternalLexicalLookups &&
3491          "must call buildLookups first");
3492 
3493   // FIXME: We need to build the lookups table, which is logically const.
3494   DeclContext *DC = const_cast<DeclContext*>(ConstDC);
3495   assert(DC == DC->getPrimaryContext() && "only primary DC has lookup table");
3496 
3497   // Create the on-disk hash table representation.
3498   llvm::OnDiskChainedHashTableGenerator<ASTDeclContextNameLookupTrait>
3499       Generator;
3500   ASTDeclContextNameLookupTrait Trait(*this);
3501 
3502   // The first step is to collect the declaration names which we need to
3503   // serialize into the name lookup table, and to collect them in a stable
3504   // order.
3505   SmallVector<DeclarationName, 16> Names;
3506 
3507   // We also build up small sets of the constructor and conversion function
3508   // names which are visible.
3509   llvm::SmallSet<DeclarationName, 8> ConstructorNameSet, ConversionNameSet;
3510 
3511   for (auto &Lookup : *DC->buildLookup()) {
3512     auto &Name = Lookup.first;
3513     auto &Result = Lookup.second;
3514 
3515     // If there are no local declarations in our lookup result, we don't
3516     // need to write an entry for the name at all unless we're rewriting
3517     // the decl context. If we can't write out a lookup set without
3518     // performing more deserialization, just skip this entry.
3519     if (isLookupResultExternal(Result, DC) && !isRewritten(cast<Decl>(DC)) &&
3520         isLookupResultEntirelyExternal(Result, DC))
3521       continue;
3522 
3523     // We also skip empty results. If any of the results could be external and
3524     // the currently available results are empty, then all of the results are
3525     // external and we skip it above. So the only way we get here with an empty
3526     // results is when no results could have been external *and* we have
3527     // external results.
3528     //
3529     // FIXME: While we might want to start emitting on-disk entries for negative
3530     // lookups into a decl context as an optimization, today we *have* to skip
3531     // them because there are names with empty lookup results in decl contexts
3532     // which we can't emit in any stable ordering: we lookup constructors and
3533     // conversion functions in the enclosing namespace scope creating empty
3534     // results for them. This in almost certainly a bug in Clang's name lookup,
3535     // but that is likely to be hard or impossible to fix and so we tolerate it
3536     // here by omitting lookups with empty results.
3537     if (Lookup.second.getLookupResult().empty())
3538       continue;
3539 
3540     switch (Lookup.first.getNameKind()) {
3541     default:
3542       Names.push_back(Lookup.first);
3543       break;
3544 
3545     case DeclarationName::CXXConstructorName:
3546       assert(isa<CXXRecordDecl>(DC) &&
3547              "Cannot have a constructor name outside of a class!");
3548       ConstructorNameSet.insert(Name);
3549       break;
3550 
3551     case DeclarationName::CXXConversionFunctionName:
3552       assert(isa<CXXRecordDecl>(DC) &&
3553              "Cannot have a conversion function name outside of a class!");
3554       ConversionNameSet.insert(Name);
3555       break;
3556     }
3557   }
3558 
3559   // Sort the names into a stable order.
3560   std::sort(Names.begin(), Names.end());
3561 
3562   if (auto *D = dyn_cast<CXXRecordDecl>(DC)) {
3563     // We need to establish an ordering of constructor and conversion function
3564     // names, and they don't have an intrinsic ordering.
3565 
3566     // First we try the easy case by forming the current context's constructor
3567     // name and adding that name first. This is a very useful optimization to
3568     // avoid walking the lexical declarations in many cases, and it also
3569     // handles the only case where a constructor name can come from some other
3570     // lexical context -- when that name is an implicit constructor merged from
3571     // another declaration in the redecl chain. Any non-implicit constructor or
3572     // conversion function which doesn't occur in all the lexical contexts
3573     // would be an ODR violation.
3574     auto ImplicitCtorName = Context->DeclarationNames.getCXXConstructorName(
3575         Context->getCanonicalType(Context->getRecordType(D)));
3576     if (ConstructorNameSet.erase(ImplicitCtorName))
3577       Names.push_back(ImplicitCtorName);
3578 
3579     // If we still have constructors or conversion functions, we walk all the
3580     // names in the decl and add the constructors and conversion functions
3581     // which are visible in the order they lexically occur within the context.
3582     if (!ConstructorNameSet.empty() || !ConversionNameSet.empty())
3583       for (Decl *ChildD : cast<CXXRecordDecl>(DC)->decls())
3584         if (auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
3585           auto Name = ChildND->getDeclName();
3586           switch (Name.getNameKind()) {
3587           default:
3588             continue;
3589 
3590           case DeclarationName::CXXConstructorName:
3591             if (ConstructorNameSet.erase(Name))
3592               Names.push_back(Name);
3593             break;
3594 
3595           case DeclarationName::CXXConversionFunctionName:
3596             if (ConversionNameSet.erase(Name))
3597               Names.push_back(Name);
3598             break;
3599           }
3600 
3601           if (ConstructorNameSet.empty() && ConversionNameSet.empty())
3602             break;
3603         }
3604 
3605     assert(ConstructorNameSet.empty() && "Failed to find all of the visible "
3606                                          "constructors by walking all the "
3607                                          "lexical members of the context.");
3608     assert(ConversionNameSet.empty() && "Failed to find all of the visible "
3609                                         "conversion functions by walking all "
3610                                         "the lexical members of the context.");
3611   }
3612 
3613   // Next we need to do a lookup with each name into this decl context to fully
3614   // populate any results from external sources. We don't actually use the
3615   // results of these lookups because we only want to use the results after all
3616   // results have been loaded and the pointers into them will be stable.
3617   for (auto &Name : Names)
3618     DC->lookup(Name);
3619 
3620   // Now we need to insert the results for each name into the hash table. For
3621   // constructor names and conversion function names, we actually need to merge
3622   // all of the results for them into one list of results each and insert
3623   // those.
3624   SmallVector<NamedDecl *, 8> ConstructorDecls;
3625   SmallVector<NamedDecl *, 8> ConversionDecls;
3626 
3627   // Now loop over the names, either inserting them or appending for the two
3628   // special cases.
3629   for (auto &Name : Names) {
3630     DeclContext::lookup_result Result = DC->noload_lookup(Name);
3631 
3632     switch (Name.getNameKind()) {
3633     default:
3634       Generator.insert(Name, Result, Trait);
3635       break;
3636 
3637     case DeclarationName::CXXConstructorName:
3638       ConstructorDecls.append(Result.begin(), Result.end());
3639       break;
3640 
3641     case DeclarationName::CXXConversionFunctionName:
3642       ConversionDecls.append(Result.begin(), Result.end());
3643       break;
3644     }
3645   }
3646 
3647   // Handle our two special cases if we ended up having any. We arbitrarily use
3648   // the first declaration's name here because the name itself isn't part of
3649   // the key, only the kind of name is used.
3650   if (!ConstructorDecls.empty())
3651     Generator.insert(ConstructorDecls.front()->getDeclName(),
3652                      DeclContext::lookup_result(ConstructorDecls), Trait);
3653   if (!ConversionDecls.empty())
3654     Generator.insert(ConversionDecls.front()->getDeclName(),
3655                      DeclContext::lookup_result(ConversionDecls), Trait);
3656 
3657   // Create the on-disk hash table in a buffer.
3658   llvm::raw_svector_ostream Out(LookupTable);
3659   // Make sure that no bucket is at offset 0
3660   using namespace llvm::support;
3661   endian::Writer<little>(Out).write<uint32_t>(0);
3662   return Generator.Emit(Out, Trait);
3663 }
3664 
3665 /// \brief Write the block containing all of the declaration IDs
3666 /// visible from the given DeclContext.
3667 ///
3668 /// \returns the offset of the DECL_CONTEXT_VISIBLE block within the
3669 /// bitstream, or 0 if no block was written.
3670 uint64_t ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context,
3671                                                  DeclContext *DC) {
3672   // If we imported a key declaration of this namespace, write the visible
3673   // lookup results as an update record for it rather than including them
3674   // on this declaration. We will only look at key declarations on reload.
3675   if (isa<NamespaceDecl>(DC) && Chain &&
3676       Chain->getKeyDeclaration(cast<Decl>(DC))->isFromASTFile()) {
3677     // Only do this once, for the first local declaration of the namespace.
3678     for (NamespaceDecl *Prev = cast<NamespaceDecl>(DC)->getPreviousDecl(); Prev;
3679          Prev = Prev->getPreviousDecl())
3680       if (!Prev->isFromASTFile())
3681         return 0;
3682 
3683     // Note that we need to emit an update record for the primary context.
3684     UpdatedDeclContexts.insert(DC->getPrimaryContext());
3685 
3686     // Make sure all visible decls are written. They will be recorded later. We
3687     // do this using a side data structure so we can sort the names into
3688     // a deterministic order.
3689     StoredDeclsMap *Map = DC->getPrimaryContext()->buildLookup();
3690     SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
3691         LookupResults;
3692     if (Map) {
3693       LookupResults.reserve(Map->size());
3694       for (auto &Entry : *Map)
3695         LookupResults.push_back(
3696             std::make_pair(Entry.first, Entry.second.getLookupResult()));
3697     }
3698 
3699     std::sort(LookupResults.begin(), LookupResults.end(), llvm::less_first());
3700     for (auto &NameAndResult : LookupResults) {
3701       DeclarationName Name = NameAndResult.first;
3702       DeclContext::lookup_result Result = NameAndResult.second;
3703       if (Name.getNameKind() == DeclarationName::CXXConstructorName ||
3704           Name.getNameKind() == DeclarationName::CXXConversionFunctionName) {
3705         // We have to work around a name lookup bug here where negative lookup
3706         // results for these names get cached in namespace lookup tables (these
3707         // names should never be looked up in a namespace).
3708         assert(Result.empty() && "Cannot have a constructor or conversion "
3709                                  "function name in a namespace!");
3710         continue;
3711       }
3712 
3713       for (NamedDecl *ND : Result)
3714         if (!ND->isFromASTFile())
3715           GetDeclRef(ND);
3716     }
3717 
3718     return 0;
3719   }
3720 
3721   if (DC->getPrimaryContext() != DC)
3722     return 0;
3723 
3724   // Skip contexts which don't support name lookup.
3725   if (!DC->isLookupContext())
3726     return 0;
3727 
3728   // If not in C++, we perform name lookup for the translation unit via the
3729   // IdentifierInfo chains, don't bother to build a visible-declarations table.
3730   if (DC->isTranslationUnit() && !Context.getLangOpts().CPlusPlus)
3731     return 0;
3732 
3733   // Serialize the contents of the mapping used for lookup. Note that,
3734   // although we have two very different code paths, the serialized
3735   // representation is the same for both cases: a declaration name,
3736   // followed by a size, followed by references to the visible
3737   // declarations that have that name.
3738   uint64_t Offset = Stream.GetCurrentBitNo();
3739   StoredDeclsMap *Map = DC->buildLookup();
3740   if (!Map || Map->empty())
3741     return 0;
3742 
3743   // Create the on-disk hash table in a buffer.
3744   SmallString<4096> LookupTable;
3745   uint32_t BucketOffset = GenerateNameLookupTable(DC, LookupTable);
3746 
3747   // Write the lookup table
3748   RecordData Record;
3749   Record.push_back(DECL_CONTEXT_VISIBLE);
3750   Record.push_back(BucketOffset);
3751   Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev, Record,
3752                             LookupTable);
3753   ++NumVisibleDeclContexts;
3754   return Offset;
3755 }
3756 
3757 /// \brief Write an UPDATE_VISIBLE block for the given context.
3758 ///
3759 /// UPDATE_VISIBLE blocks contain the declarations that are added to an existing
3760 /// DeclContext in a dependent AST file. As such, they only exist for the TU
3761 /// (in C++), for namespaces, and for classes with forward-declared unscoped
3762 /// enumeration members (in C++11).
3763 void ASTWriter::WriteDeclContextVisibleUpdate(const DeclContext *DC) {
3764   StoredDeclsMap *Map = DC->getLookupPtr();
3765   if (!Map || Map->empty())
3766     return;
3767 
3768   // Create the on-disk hash table in a buffer.
3769   SmallString<4096> LookupTable;
3770   uint32_t BucketOffset = GenerateNameLookupTable(DC, LookupTable);
3771 
3772   // If we're updating a namespace, select a key declaration as the key for the
3773   // update record; those are the only ones that will be checked on reload.
3774   if (isa<NamespaceDecl>(DC))
3775     DC = cast<DeclContext>(Chain->getKeyDeclaration(cast<Decl>(DC)));
3776 
3777   // Write the lookup table
3778   RecordData Record;
3779   Record.push_back(UPDATE_VISIBLE);
3780   Record.push_back(getDeclID(cast<Decl>(DC)));
3781   Record.push_back(BucketOffset);
3782   Stream.EmitRecordWithBlob(UpdateVisibleAbbrev, Record, LookupTable);
3783 }
3784 
3785 /// \brief Write an FP_PRAGMA_OPTIONS block for the given FPOptions.
3786 void ASTWriter::WriteFPPragmaOptions(const FPOptions &Opts) {
3787   RecordData Record;
3788   Record.push_back(Opts.fp_contract);
3789   Stream.EmitRecord(FP_PRAGMA_OPTIONS, Record);
3790 }
3791 
3792 /// \brief Write an OPENCL_EXTENSIONS block for the given OpenCLOptions.
3793 void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) {
3794   if (!SemaRef.Context.getLangOpts().OpenCL)
3795     return;
3796 
3797   const OpenCLOptions &Opts = SemaRef.getOpenCLOptions();
3798   RecordData Record;
3799 #define OPENCLEXT(nm)  Record.push_back(Opts.nm);
3800 #include "clang/Basic/OpenCLExtensions.def"
3801   Stream.EmitRecord(OPENCL_EXTENSIONS, Record);
3802 }
3803 
3804 void ASTWriter::WriteRedeclarations() {
3805   RecordData LocalRedeclChains;
3806   SmallVector<serialization::LocalRedeclarationsInfo, 2> LocalRedeclsMap;
3807 
3808   for (unsigned I = 0, N = Redeclarations.size(); I != N; ++I) {
3809     const Decl *Key = Redeclarations[I];
3810     assert((Chain ? Chain->getKeyDeclaration(Key) == Key
3811                   : Key->isFirstDecl()) &&
3812            "not the key declaration");
3813 
3814     const Decl *First = Key->getCanonicalDecl();
3815     const Decl *MostRecent = First->getMostRecentDecl();
3816 
3817     assert((getDeclID(First) >= NUM_PREDEF_DECL_IDS || First == Key) &&
3818            "should not have imported key decls for predefined decl");
3819 
3820     // If we only have a single declaration, there is no point in storing
3821     // a redeclaration chain.
3822     if (First == MostRecent)
3823       continue;
3824 
3825     unsigned Offset = LocalRedeclChains.size();
3826     unsigned Size = 0;
3827     LocalRedeclChains.push_back(0); // Placeholder for the size.
3828 
3829     // Collect the set of local redeclarations of this declaration, from newest
3830     // to oldest.
3831     for (const Decl *Prev = MostRecent; Prev;
3832          Prev = Prev->getPreviousDecl()) {
3833       if (!Prev->isFromASTFile() && Prev != Key) {
3834         AddDeclRef(Prev, LocalRedeclChains);
3835         ++Size;
3836       }
3837     }
3838 
3839     LocalRedeclChains[Offset] = Size;
3840 
3841     // Add the mapping from the first ID from the AST to the set of local
3842     // declarations.
3843     LocalRedeclarationsInfo Info = { getDeclID(Key), Offset };
3844     LocalRedeclsMap.push_back(Info);
3845 
3846     assert(N == Redeclarations.size() &&
3847            "Deserialized a declaration we shouldn't have");
3848   }
3849 
3850   if (LocalRedeclChains.empty())
3851     return;
3852 
3853   // Sort the local redeclarations map by the first declaration ID,
3854   // since the reader will be performing binary searches on this information.
3855   llvm::array_pod_sort(LocalRedeclsMap.begin(), LocalRedeclsMap.end());
3856 
3857   // Emit the local redeclarations map.
3858   using namespace llvm;
3859   llvm::BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
3860   Abbrev->Add(BitCodeAbbrevOp(LOCAL_REDECLARATIONS_MAP));
3861   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of entries
3862   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3863   unsigned AbbrevID = Stream.EmitAbbrev(Abbrev);
3864 
3865   RecordData Record;
3866   Record.push_back(LOCAL_REDECLARATIONS_MAP);
3867   Record.push_back(LocalRedeclsMap.size());
3868   Stream.EmitRecordWithBlob(AbbrevID, Record,
3869     reinterpret_cast<char*>(LocalRedeclsMap.data()),
3870     LocalRedeclsMap.size() * sizeof(LocalRedeclarationsInfo));
3871 
3872   // Emit the redeclaration chains.
3873   Stream.EmitRecord(LOCAL_REDECLARATIONS, LocalRedeclChains);
3874 }
3875 
3876 void ASTWriter::WriteObjCCategories() {
3877   SmallVector<ObjCCategoriesInfo, 2> CategoriesMap;
3878   RecordData Categories;
3879 
3880   for (unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
3881     unsigned Size = 0;
3882     unsigned StartIndex = Categories.size();
3883 
3884     ObjCInterfaceDecl *Class = ObjCClassesWithCategories[I];
3885 
3886     // Allocate space for the size.
3887     Categories.push_back(0);
3888 
3889     // Add the categories.
3890     for (ObjCInterfaceDecl::known_categories_iterator
3891            Cat = Class->known_categories_begin(),
3892            CatEnd = Class->known_categories_end();
3893          Cat != CatEnd; ++Cat, ++Size) {
3894       assert(getDeclID(*Cat) != 0 && "Bogus category");
3895       AddDeclRef(*Cat, Categories);
3896     }
3897 
3898     // Update the size.
3899     Categories[StartIndex] = Size;
3900 
3901     // Record this interface -> category map.
3902     ObjCCategoriesInfo CatInfo = { getDeclID(Class), StartIndex };
3903     CategoriesMap.push_back(CatInfo);
3904   }
3905 
3906   // Sort the categories map by the definition ID, since the reader will be
3907   // performing binary searches on this information.
3908   llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
3909 
3910   // Emit the categories map.
3911   using namespace llvm;
3912   llvm::BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
3913   Abbrev->Add(BitCodeAbbrevOp(OBJC_CATEGORIES_MAP));
3914   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of entries
3915   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3916   unsigned AbbrevID = Stream.EmitAbbrev(Abbrev);
3917 
3918   RecordData Record;
3919   Record.push_back(OBJC_CATEGORIES_MAP);
3920   Record.push_back(CategoriesMap.size());
3921   Stream.EmitRecordWithBlob(AbbrevID, Record,
3922                             reinterpret_cast<char*>(CategoriesMap.data()),
3923                             CategoriesMap.size() * sizeof(ObjCCategoriesInfo));
3924 
3925   // Emit the category lists.
3926   Stream.EmitRecord(OBJC_CATEGORIES, Categories);
3927 }
3928 
3929 void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) {
3930   Sema::LateParsedTemplateMapT &LPTMap = SemaRef.LateParsedTemplateMap;
3931 
3932   if (LPTMap.empty())
3933     return;
3934 
3935   RecordData Record;
3936   for (auto LPTMapEntry : LPTMap) {
3937     const FunctionDecl *FD = LPTMapEntry.first;
3938     LateParsedTemplate *LPT = LPTMapEntry.second;
3939     AddDeclRef(FD, Record);
3940     AddDeclRef(LPT->D, Record);
3941     Record.push_back(LPT->Toks.size());
3942 
3943     for (CachedTokens::iterator TokIt = LPT->Toks.begin(),
3944                                 TokEnd = LPT->Toks.end();
3945          TokIt != TokEnd; ++TokIt) {
3946       AddToken(*TokIt, Record);
3947     }
3948   }
3949   Stream.EmitRecord(LATE_PARSED_TEMPLATE, Record);
3950 }
3951 
3952 /// \brief Write the state of 'pragma clang optimize' at the end of the module.
3953 void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) {
3954   RecordData Record;
3955   SourceLocation PragmaLoc = SemaRef.getOptimizeOffPragmaLocation();
3956   AddSourceLocation(PragmaLoc, Record);
3957   Stream.EmitRecord(OPTIMIZE_PRAGMA_OPTIONS, Record);
3958 }
3959 
3960 //===----------------------------------------------------------------------===//
3961 // General Serialization Routines
3962 //===----------------------------------------------------------------------===//
3963 
3964 /// \brief Write a record containing the given attributes.
3965 void ASTWriter::WriteAttributes(ArrayRef<const Attr*> Attrs,
3966                                 RecordDataImpl &Record) {
3967   Record.push_back(Attrs.size());
3968   for (ArrayRef<const Attr *>::iterator i = Attrs.begin(),
3969                                         e = Attrs.end(); i != e; ++i){
3970     const Attr *A = *i;
3971     Record.push_back(A->getKind()); // FIXME: stable encoding, target attrs
3972     AddSourceRange(A->getRange(), Record);
3973 
3974 #include "clang/Serialization/AttrPCHWrite.inc"
3975 
3976   }
3977 }
3978 
3979 void ASTWriter::AddToken(const Token &Tok, RecordDataImpl &Record) {
3980   AddSourceLocation(Tok.getLocation(), Record);
3981   Record.push_back(Tok.getLength());
3982 
3983   // FIXME: When reading literal tokens, reconstruct the literal pointer
3984   // if it is needed.
3985   AddIdentifierRef(Tok.getIdentifierInfo(), Record);
3986   // FIXME: Should translate token kind to a stable encoding.
3987   Record.push_back(Tok.getKind());
3988   // FIXME: Should translate token flags to a stable encoding.
3989   Record.push_back(Tok.getFlags());
3990 }
3991 
3992 void ASTWriter::AddString(StringRef Str, RecordDataImpl &Record) {
3993   Record.push_back(Str.size());
3994   Record.insert(Record.end(), Str.begin(), Str.end());
3995 }
3996 
3997 bool ASTWriter::PreparePathForOutput(SmallVectorImpl<char> &Path) {
3998   assert(Context && "should have context when outputting path");
3999 
4000   bool Changed =
4001       cleanPathForOutput(Context->getSourceManager().getFileManager(), Path);
4002 
4003   // Remove a prefix to make the path relative, if relevant.
4004   const char *PathBegin = Path.data();
4005   const char *PathPtr =
4006       adjustFilenameForRelocatableAST(PathBegin, BaseDirectory);
4007   if (PathPtr != PathBegin) {
4008     Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin));
4009     Changed = true;
4010   }
4011 
4012   return Changed;
4013 }
4014 
4015 void ASTWriter::AddPath(StringRef Path, RecordDataImpl &Record) {
4016   SmallString<128> FilePath(Path);
4017   PreparePathForOutput(FilePath);
4018   AddString(FilePath, Record);
4019 }
4020 
4021 void ASTWriter::EmitRecordWithPath(unsigned Abbrev, RecordDataImpl &Record,
4022                                    StringRef Path) {
4023   SmallString<128> FilePath(Path);
4024   PreparePathForOutput(FilePath);
4025   Stream.EmitRecordWithBlob(Abbrev, Record, FilePath);
4026 }
4027 
4028 void ASTWriter::AddVersionTuple(const VersionTuple &Version,
4029                                 RecordDataImpl &Record) {
4030   Record.push_back(Version.getMajor());
4031   if (Optional<unsigned> Minor = Version.getMinor())
4032     Record.push_back(*Minor + 1);
4033   else
4034     Record.push_back(0);
4035   if (Optional<unsigned> Subminor = Version.getSubminor())
4036     Record.push_back(*Subminor + 1);
4037   else
4038     Record.push_back(0);
4039 }
4040 
4041 /// \brief Note that the identifier II occurs at the given offset
4042 /// within the identifier table.
4043 void ASTWriter::SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset) {
4044   IdentID ID = IdentifierIDs[II];
4045   // Only store offsets new to this AST file. Other identifier names are looked
4046   // up earlier in the chain and thus don't need an offset.
4047   if (ID >= FirstIdentID)
4048     IdentifierOffsets[ID - FirstIdentID] = Offset;
4049 }
4050 
4051 /// \brief Note that the selector Sel occurs at the given offset
4052 /// within the method pool/selector table.
4053 void ASTWriter::SetSelectorOffset(Selector Sel, uint32_t Offset) {
4054   unsigned ID = SelectorIDs[Sel];
4055   assert(ID && "Unknown selector");
4056   // Don't record offsets for selectors that are also available in a different
4057   // file.
4058   if (ID < FirstSelectorID)
4059     return;
4060   SelectorOffsets[ID - FirstSelectorID] = Offset;
4061 }
4062 
4063 ASTWriter::ASTWriter(llvm::BitstreamWriter &Stream)
4064     : Stream(Stream), Context(nullptr), PP(nullptr), Chain(nullptr),
4065       WritingModule(nullptr), WritingAST(false),
4066       DoneWritingDeclsAndTypes(false), ASTHasCompilerErrors(false),
4067       FirstDeclID(NUM_PREDEF_DECL_IDS), NextDeclID(FirstDeclID),
4068       FirstTypeID(NUM_PREDEF_TYPE_IDS), NextTypeID(FirstTypeID),
4069       FirstIdentID(NUM_PREDEF_IDENT_IDS), NextIdentID(FirstIdentID),
4070       FirstMacroID(NUM_PREDEF_MACRO_IDS), NextMacroID(FirstMacroID),
4071       FirstSubmoduleID(NUM_PREDEF_SUBMODULE_IDS),
4072       NextSubmoduleID(FirstSubmoduleID),
4073       FirstSelectorID(NUM_PREDEF_SELECTOR_IDS), NextSelectorID(FirstSelectorID),
4074       CollectedStmts(&StmtsToEmit), NumStatements(0), NumMacros(0),
4075       NumLexicalDeclContexts(0), NumVisibleDeclContexts(0),
4076       NextCXXBaseSpecifiersID(1), NextCXXCtorInitializersID(1),
4077       TypeExtQualAbbrev(0),
4078       TypeFunctionProtoAbbrev(0), DeclParmVarAbbrev(0),
4079       DeclContextLexicalAbbrev(0), DeclContextVisibleLookupAbbrev(0),
4080       UpdateVisibleAbbrev(0), DeclRecordAbbrev(0), DeclTypedefAbbrev(0),
4081       DeclVarAbbrev(0), DeclFieldAbbrev(0), DeclEnumAbbrev(0),
4082       DeclObjCIvarAbbrev(0), DeclCXXMethodAbbrev(0), DeclRefExprAbbrev(0),
4083       CharacterLiteralAbbrev(0), IntegerLiteralAbbrev(0),
4084       ExprImplicitCastAbbrev(0) {}
4085 
4086 ASTWriter::~ASTWriter() {
4087   llvm::DeleteContainerSeconds(FileDeclIDs);
4088 }
4089 
4090 const LangOptions &ASTWriter::getLangOpts() const {
4091   assert(WritingAST && "can't determine lang opts when not writing AST");
4092   return Context->getLangOpts();
4093 }
4094 
4095 void ASTWriter::WriteAST(Sema &SemaRef,
4096                          const std::string &OutputFile,
4097                          Module *WritingModule, StringRef isysroot,
4098                          bool hasErrors) {
4099   WritingAST = true;
4100 
4101   ASTHasCompilerErrors = hasErrors;
4102 
4103   // Emit the file header.
4104   Stream.Emit((unsigned)'C', 8);
4105   Stream.Emit((unsigned)'P', 8);
4106   Stream.Emit((unsigned)'C', 8);
4107   Stream.Emit((unsigned)'H', 8);
4108 
4109   WriteBlockInfoBlock();
4110 
4111   Context = &SemaRef.Context;
4112   PP = &SemaRef.PP;
4113   this->WritingModule = WritingModule;
4114   WriteASTCore(SemaRef, isysroot, OutputFile, WritingModule);
4115   Context = nullptr;
4116   PP = nullptr;
4117   this->WritingModule = nullptr;
4118   this->BaseDirectory.clear();
4119 
4120   WritingAST = false;
4121 }
4122 
4123 template<typename Vector>
4124 static void AddLazyVectorDecls(ASTWriter &Writer, Vector &Vec,
4125                                ASTWriter::RecordData &Record) {
4126   for (typename Vector::iterator I = Vec.begin(nullptr, true), E = Vec.end();
4127        I != E; ++I) {
4128     Writer.AddDeclRef(*I, Record);
4129   }
4130 }
4131 
4132 void ASTWriter::WriteASTCore(Sema &SemaRef,
4133                              StringRef isysroot,
4134                              const std::string &OutputFile,
4135                              Module *WritingModule) {
4136   using namespace llvm;
4137 
4138   bool isModule = WritingModule != nullptr;
4139 
4140   // Make sure that the AST reader knows to finalize itself.
4141   if (Chain)
4142     Chain->finalizeForWriting();
4143 
4144   ASTContext &Context = SemaRef.Context;
4145   Preprocessor &PP = SemaRef.PP;
4146 
4147   // Set up predefined declaration IDs.
4148   auto RegisterPredefDecl = [&] (Decl *D, PredefinedDeclIDs ID) {
4149     if (D) {
4150       assert(D->isCanonicalDecl() && "predefined decl is not canonical");
4151       DeclIDs[D] = ID;
4152       if (D->getMostRecentDecl() != D)
4153         Redeclarations.push_back(D);
4154     }
4155   };
4156   RegisterPredefDecl(Context.getTranslationUnitDecl(),
4157                      PREDEF_DECL_TRANSLATION_UNIT_ID);
4158   RegisterPredefDecl(Context.ObjCIdDecl, PREDEF_DECL_OBJC_ID_ID);
4159   RegisterPredefDecl(Context.ObjCSelDecl, PREDEF_DECL_OBJC_SEL_ID);
4160   RegisterPredefDecl(Context.ObjCClassDecl, PREDEF_DECL_OBJC_CLASS_ID);
4161   RegisterPredefDecl(Context.ObjCProtocolClassDecl,
4162                      PREDEF_DECL_OBJC_PROTOCOL_ID);
4163   RegisterPredefDecl(Context.Int128Decl, PREDEF_DECL_INT_128_ID);
4164   RegisterPredefDecl(Context.UInt128Decl, PREDEF_DECL_UNSIGNED_INT_128_ID);
4165   RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
4166                      PREDEF_DECL_OBJC_INSTANCETYPE_ID);
4167   RegisterPredefDecl(Context.BuiltinVaListDecl, PREDEF_DECL_BUILTIN_VA_LIST_ID);
4168   RegisterPredefDecl(Context.VaListTagDecl, PREDEF_DECL_VA_LIST_TAG);
4169   RegisterPredefDecl(Context.ExternCContext, PREDEF_DECL_EXTERN_C_CONTEXT_ID);
4170 
4171   // Build a record containing all of the tentative definitions in this file, in
4172   // TentativeDefinitions order.  Generally, this record will be empty for
4173   // headers.
4174   RecordData TentativeDefinitions;
4175   AddLazyVectorDecls(*this, SemaRef.TentativeDefinitions, TentativeDefinitions);
4176 
4177   // Build a record containing all of the file scoped decls in this file.
4178   RecordData UnusedFileScopedDecls;
4179   if (!isModule)
4180     AddLazyVectorDecls(*this, SemaRef.UnusedFileScopedDecls,
4181                        UnusedFileScopedDecls);
4182 
4183   // Build a record containing all of the delegating constructors we still need
4184   // to resolve.
4185   RecordData DelegatingCtorDecls;
4186   if (!isModule)
4187     AddLazyVectorDecls(*this, SemaRef.DelegatingCtorDecls, DelegatingCtorDecls);
4188 
4189   // Write the set of weak, undeclared identifiers. We always write the
4190   // entire table, since later PCH files in a PCH chain are only interested in
4191   // the results at the end of the chain.
4192   RecordData WeakUndeclaredIdentifiers;
4193   for (auto &WeakUndeclaredIdentifier : SemaRef.WeakUndeclaredIdentifiers) {
4194     IdentifierInfo *II = WeakUndeclaredIdentifier.first;
4195     WeakInfo &WI = WeakUndeclaredIdentifier.second;
4196     AddIdentifierRef(II, WeakUndeclaredIdentifiers);
4197     AddIdentifierRef(WI.getAlias(), WeakUndeclaredIdentifiers);
4198     AddSourceLocation(WI.getLocation(), WeakUndeclaredIdentifiers);
4199     WeakUndeclaredIdentifiers.push_back(WI.getUsed());
4200   }
4201 
4202   // Build a record containing all of the ext_vector declarations.
4203   RecordData ExtVectorDecls;
4204   AddLazyVectorDecls(*this, SemaRef.ExtVectorDecls, ExtVectorDecls);
4205 
4206   // Build a record containing all of the VTable uses information.
4207   RecordData VTableUses;
4208   if (!SemaRef.VTableUses.empty()) {
4209     for (unsigned I = 0, N = SemaRef.VTableUses.size(); I != N; ++I) {
4210       AddDeclRef(SemaRef.VTableUses[I].first, VTableUses);
4211       AddSourceLocation(SemaRef.VTableUses[I].second, VTableUses);
4212       VTableUses.push_back(SemaRef.VTablesUsed[SemaRef.VTableUses[I].first]);
4213     }
4214   }
4215 
4216   // Build a record containing all of the UnusedLocalTypedefNameCandidates.
4217   RecordData UnusedLocalTypedefNameCandidates;
4218   for (const TypedefNameDecl *TD : SemaRef.UnusedLocalTypedefNameCandidates)
4219     AddDeclRef(TD, UnusedLocalTypedefNameCandidates);
4220 
4221   // Build a record containing all of pending implicit instantiations.
4222   RecordData PendingInstantiations;
4223   for (std::deque<Sema::PendingImplicitInstantiation>::iterator
4224          I = SemaRef.PendingInstantiations.begin(),
4225          N = SemaRef.PendingInstantiations.end(); I != N; ++I) {
4226     AddDeclRef(I->first, PendingInstantiations);
4227     AddSourceLocation(I->second, PendingInstantiations);
4228   }
4229   assert(SemaRef.PendingLocalImplicitInstantiations.empty() &&
4230          "There are local ones at end of translation unit!");
4231 
4232   // Build a record containing some declaration references.
4233   RecordData SemaDeclRefs;
4234   if (SemaRef.StdNamespace || SemaRef.StdBadAlloc) {
4235     AddDeclRef(SemaRef.getStdNamespace(), SemaDeclRefs);
4236     AddDeclRef(SemaRef.getStdBadAlloc(), SemaDeclRefs);
4237   }
4238 
4239   RecordData CUDASpecialDeclRefs;
4240   if (Context.getcudaConfigureCallDecl()) {
4241     AddDeclRef(Context.getcudaConfigureCallDecl(), CUDASpecialDeclRefs);
4242   }
4243 
4244   // Build a record containing all of the known namespaces.
4245   RecordData KnownNamespaces;
4246   for (llvm::MapVector<NamespaceDecl*, bool>::iterator
4247             I = SemaRef.KnownNamespaces.begin(),
4248          IEnd = SemaRef.KnownNamespaces.end();
4249        I != IEnd; ++I) {
4250     if (!I->second)
4251       AddDeclRef(I->first, KnownNamespaces);
4252   }
4253 
4254   // Build a record of all used, undefined objects that require definitions.
4255   RecordData UndefinedButUsed;
4256 
4257   SmallVector<std::pair<NamedDecl *, SourceLocation>, 16> Undefined;
4258   SemaRef.getUndefinedButUsed(Undefined);
4259   for (SmallVectorImpl<std::pair<NamedDecl *, SourceLocation> >::iterator
4260          I = Undefined.begin(), E = Undefined.end(); I != E; ++I) {
4261     AddDeclRef(I->first, UndefinedButUsed);
4262     AddSourceLocation(I->second, UndefinedButUsed);
4263   }
4264 
4265   // Build a record containing all delete-expressions that we would like to
4266   // analyze later in AST.
4267   RecordData DeleteExprsToAnalyze;
4268 
4269   for (const auto &DeleteExprsInfo :
4270        SemaRef.getMismatchingDeleteExpressions()) {
4271     AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
4272     DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
4273     for (const auto &DeleteLoc : DeleteExprsInfo.second) {
4274       AddSourceLocation(DeleteLoc.first, DeleteExprsToAnalyze);
4275       DeleteExprsToAnalyze.push_back(DeleteLoc.second);
4276     }
4277   }
4278 
4279   // Write the control block
4280   WriteControlBlock(PP, Context, isysroot, OutputFile);
4281 
4282   // Write the remaining AST contents.
4283   RecordData Record;
4284   Stream.EnterSubblock(AST_BLOCK_ID, 5);
4285 
4286   // This is so that older clang versions, before the introduction
4287   // of the control block, can read and reject the newer PCH format.
4288   Record.clear();
4289   Record.push_back(VERSION_MAJOR);
4290   Stream.EmitRecord(METADATA_OLD_FORMAT, Record);
4291 
4292   // Create a lexical update block containing all of the declarations in the
4293   // translation unit that do not come from other AST files.
4294   const TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
4295   SmallVector<KindDeclIDPair, 64> NewGlobalDecls;
4296   for (const auto *I : TU->noload_decls()) {
4297     if (!I->isFromASTFile())
4298       NewGlobalDecls.push_back(std::make_pair(I->getKind(), GetDeclRef(I)));
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(NewGlobalDecls));
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(!getDefinitiveDeclContext(DC) && "DeclContext not definitive!");
5716   assert(!WritingAST && "Already writing the AST!");
5717   UpdatedDeclContexts.insert(DC);
5718   UpdatingVisibleDecls.push_back(D);
5719 }
5720 
5721 void ASTWriter::AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) {
5722   assert(D->isImplicit());
5723   if (!(!D->isFromASTFile() && RD->isFromASTFile()))
5724     return; // Not a source member added to a class from PCH.
5725   if (!isa<CXXMethodDecl>(D))
5726     return; // We are interested in lazily declared implicit methods.
5727 
5728   // A decl coming from PCH was modified.
5729   assert(RD->isCompleteDefinition());
5730   assert(!WritingAST && "Already writing the AST!");
5731   DeclUpdates[RD].push_back(DeclUpdate(UPD_CXX_ADDED_IMPLICIT_MEMBER, D));
5732 }
5733 
5734 void ASTWriter::AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD,
5735                                      const ClassTemplateSpecializationDecl *D) {
5736   // The specializations set is kept in the canonical template.
5737   TD = TD->getCanonicalDecl();
5738   if (!(!D->isFromASTFile() && TD->isFromASTFile()))
5739     return; // Not a source specialization added to a template from PCH.
5740 
5741   assert(!WritingAST && "Already writing the AST!");
5742   DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,
5743                                        D));
5744 }
5745 
5746 void ASTWriter::AddedCXXTemplateSpecialization(
5747     const VarTemplateDecl *TD, const VarTemplateSpecializationDecl *D) {
5748   // The specializations set is kept in the canonical template.
5749   TD = TD->getCanonicalDecl();
5750   if (!(!D->isFromASTFile() && TD->isFromASTFile()))
5751     return; // Not a source specialization added to a template from PCH.
5752 
5753   assert(!WritingAST && "Already writing the AST!");
5754   DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,
5755                                        D));
5756 }
5757 
5758 void ASTWriter::AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD,
5759                                                const FunctionDecl *D) {
5760   // The specializations set is kept in the canonical template.
5761   TD = TD->getCanonicalDecl();
5762   if (!(!D->isFromASTFile() && TD->isFromASTFile()))
5763     return; // Not a source specialization added to a template from PCH.
5764 
5765   assert(!WritingAST && "Already writing the AST!");
5766   DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,
5767                                        D));
5768 }
5769 
5770 void ASTWriter::ResolvedExceptionSpec(const FunctionDecl *FD) {
5771   assert(!DoneWritingDeclsAndTypes && "Already done writing updates!");
5772   if (!Chain) return;
5773   Chain->forEachImportedKeyDecl(FD, [&](const Decl *D) {
5774     // If we don't already know the exception specification for this redecl
5775     // chain, add an update record for it.
5776     if (isUnresolvedExceptionSpec(cast<FunctionDecl>(D)
5777                                       ->getType()
5778                                       ->castAs<FunctionProtoType>()
5779                                       ->getExceptionSpecType()))
5780       DeclUpdates[D].push_back(UPD_CXX_RESOLVED_EXCEPTION_SPEC);
5781   });
5782 }
5783 
5784 void ASTWriter::DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) {
5785   assert(!WritingAST && "Already writing the AST!");
5786   if (!Chain) return;
5787   Chain->forEachImportedKeyDecl(FD, [&](const Decl *D) {
5788     DeclUpdates[D].push_back(
5789         DeclUpdate(UPD_CXX_DEDUCED_RETURN_TYPE, ReturnType));
5790   });
5791 }
5792 
5793 void ASTWriter::ResolvedOperatorDelete(const CXXDestructorDecl *DD,
5794                                        const FunctionDecl *Delete) {
5795   assert(!WritingAST && "Already writing the AST!");
5796   assert(Delete && "Not given an operator delete");
5797   if (!Chain) return;
5798   Chain->forEachImportedKeyDecl(DD, [&](const Decl *D) {
5799     DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_RESOLVED_DTOR_DELETE, Delete));
5800   });
5801 }
5802 
5803 void ASTWriter::CompletedImplicitDefinition(const FunctionDecl *D) {
5804   assert(!WritingAST && "Already writing the AST!");
5805   if (!D->isFromASTFile())
5806     return; // Declaration not imported from PCH.
5807 
5808   // Implicit function decl from a PCH was defined.
5809   DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_ADDED_FUNCTION_DEFINITION));
5810 }
5811 
5812 void ASTWriter::FunctionDefinitionInstantiated(const FunctionDecl *D) {
5813   assert(!WritingAST && "Already writing the AST!");
5814   if (!D->isFromASTFile())
5815     return;
5816 
5817   DeclUpdates[D].push_back(DeclUpdate(UPD_CXX_ADDED_FUNCTION_DEFINITION));
5818 }
5819 
5820 void ASTWriter::StaticDataMemberInstantiated(const VarDecl *D) {
5821   assert(!WritingAST && "Already writing the AST!");
5822   if (!D->isFromASTFile())
5823     return;
5824 
5825   // Since the actual instantiation is delayed, this really means that we need
5826   // to update the instantiation location.
5827   DeclUpdates[D].push_back(
5828       DeclUpdate(UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER,
5829        D->getMemberSpecializationInfo()->getPointOfInstantiation()));
5830 }
5831 
5832 void ASTWriter::AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
5833                                              const ObjCInterfaceDecl *IFD) {
5834   assert(!WritingAST && "Already writing the AST!");
5835   if (!IFD->isFromASTFile())
5836     return; // Declaration not imported from PCH.
5837 
5838   assert(IFD->getDefinition() && "Category on a class without a definition?");
5839   ObjCClassesWithCategories.insert(
5840     const_cast<ObjCInterfaceDecl *>(IFD->getDefinition()));
5841 }
5842 
5843 
5844 void ASTWriter::AddedObjCPropertyInClassExtension(const ObjCPropertyDecl *Prop,
5845                                           const ObjCPropertyDecl *OrigProp,
5846                                           const ObjCCategoryDecl *ClassExt) {
5847   const ObjCInterfaceDecl *D = ClassExt->getClassInterface();
5848   if (!D)
5849     return;
5850 
5851   assert(!WritingAST && "Already writing the AST!");
5852   if (!D->isFromASTFile())
5853     return; // Declaration not imported from PCH.
5854 
5855   RewriteDecl(D);
5856 }
5857 
5858 void ASTWriter::DeclarationMarkedUsed(const Decl *D) {
5859   assert(!WritingAST && "Already writing the AST!");
5860   if (!D->isFromASTFile())
5861     return;
5862 
5863   DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_USED));
5864 }
5865 
5866 void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(const Decl *D) {
5867   assert(!WritingAST && "Already writing the AST!");
5868   if (!D->isFromASTFile())
5869     return;
5870 
5871   DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_OPENMP_THREADPRIVATE));
5872 }
5873 
5874 void ASTWriter::RedefinedHiddenDefinition(const NamedDecl *D, Module *M) {
5875   assert(!WritingAST && "Already writing the AST!");
5876   assert(D->isHidden() && "expected a hidden declaration");
5877   DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_EXPORTED, M));
5878 }
5879 
5880 void ASTWriter::AddedAttributeToRecord(const Attr *Attr,
5881                                        const RecordDecl *Record) {
5882   assert(!WritingAST && "Already writing the AST!");
5883   if (!Record->isFromASTFile())
5884     return;
5885   DeclUpdates[Record].push_back(DeclUpdate(UPD_ADDED_ATTR_TO_RECORD, Attr));
5886 }
5887