1 //===- ClangAttrEmitter.cpp - Generate Clang attribute handling =-*- C++ -*--=//
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 // These tablegen backends emit Clang attribute processing code
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "llvm/ADT/SmallString.h"
15 #include "llvm/ADT/SmallSet.h"
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/ADT/StringSwitch.h"
19 #include "llvm/TableGen/Error.h"
20 #include "llvm/TableGen/Record.h"
21 #include "llvm/TableGen/StringMatcher.h"
22 #include "llvm/TableGen/TableGenBackend.h"
23 #include <algorithm>
24 #include <cctype>
25 #include <memory>
26 #include <set>
27 #include <sstream>
28 
29 using namespace llvm;
30 
31 class FlattenedSpelling {
32   std::string V, N, NS;
33   bool K;
34 
35 public:
36   FlattenedSpelling(const std::string &Variety, const std::string &Name,
37                     const std::string &Namespace, bool KnownToGCC) :
38     V(Variety), N(Name), NS(Namespace), K(KnownToGCC) {}
39   explicit FlattenedSpelling(const Record &Spelling) :
40     V(Spelling.getValueAsString("Variety")),
41     N(Spelling.getValueAsString("Name")) {
42 
43     assert(V != "GCC" && "Given a GCC spelling, which means this hasn't been"
44            "flattened!");
45     if (V == "CXX11" || V == "Pragma")
46       NS = Spelling.getValueAsString("Namespace");
47     bool Unset;
48     K = Spelling.getValueAsBitOrUnset("KnownToGCC", Unset);
49   }
50 
51   const std::string &variety() const { return V; }
52   const std::string &name() const { return N; }
53   const std::string &nameSpace() const { return NS; }
54   bool knownToGCC() const { return K; }
55 };
56 
57 std::vector<FlattenedSpelling> GetFlattenedSpellings(const Record &Attr) {
58   std::vector<Record *> Spellings = Attr.getValueAsListOfDefs("Spellings");
59   std::vector<FlattenedSpelling> Ret;
60 
61   for (const auto &Spelling : Spellings) {
62     if (Spelling->getValueAsString("Variety") == "GCC") {
63       // Gin up two new spelling objects to add into the list.
64       Ret.push_back(FlattenedSpelling("GNU", Spelling->getValueAsString("Name"),
65                                       "", true));
66       Ret.push_back(FlattenedSpelling(
67           "CXX11", Spelling->getValueAsString("Name"), "gnu", true));
68     } else
69       Ret.push_back(FlattenedSpelling(*Spelling));
70   }
71 
72   return Ret;
73 }
74 
75 static std::string ReadPCHRecord(StringRef type) {
76   return StringSwitch<std::string>(type)
77     .EndsWith("Decl *", "GetLocalDeclAs<"
78               + std::string(type, 0, type.size()-1) + ">(F, Record[Idx++])")
79     .Case("TypeSourceInfo *", "GetTypeSourceInfo(F, Record, Idx)")
80     .Case("Expr *", "ReadExpr(F)")
81     .Case("IdentifierInfo *", "GetIdentifierInfo(F, Record, Idx)")
82     .Default("Record[Idx++]");
83 }
84 
85 // Assumes that the way to get the value is SA->getname()
86 static std::string WritePCHRecord(StringRef type, StringRef name) {
87   return StringSwitch<std::string>(type)
88     .EndsWith("Decl *", "AddDeclRef(" + std::string(name) +
89                         ", Record);\n")
90     .Case("TypeSourceInfo *",
91           "AddTypeSourceInfo(" + std::string(name) + ", Record);\n")
92     .Case("Expr *", "AddStmt(" + std::string(name) + ");\n")
93     .Case("IdentifierInfo *",
94           "AddIdentifierRef(" + std::string(name) + ", Record);\n")
95     .Default("Record.push_back(" + std::string(name) + ");\n");
96 }
97 
98 // Normalize attribute name by removing leading and trailing
99 // underscores. For example, __foo, foo__, __foo__ would
100 // become foo.
101 static StringRef NormalizeAttrName(StringRef AttrName) {
102   if (AttrName.startswith("__"))
103     AttrName = AttrName.substr(2, AttrName.size());
104 
105   if (AttrName.endswith("__"))
106     AttrName = AttrName.substr(0, AttrName.size() - 2);
107 
108   return AttrName;
109 }
110 
111 // Normalize the name by removing any and all leading and trailing underscores.
112 // This is different from NormalizeAttrName in that it also handles names like
113 // _pascal and __pascal.
114 static StringRef NormalizeNameForSpellingComparison(StringRef Name) {
115   while (Name.startswith("_"))
116     Name = Name.substr(1, Name.size());
117   while (Name.endswith("_"))
118     Name = Name.substr(0, Name.size() - 1);
119   return Name;
120 }
121 
122 // Normalize attribute spelling only if the spelling has both leading
123 // and trailing underscores. For example, __ms_struct__ will be
124 // normalized to "ms_struct"; __cdecl will remain intact.
125 static StringRef NormalizeAttrSpelling(StringRef AttrSpelling) {
126   if (AttrSpelling.startswith("__") && AttrSpelling.endswith("__")) {
127     AttrSpelling = AttrSpelling.substr(2, AttrSpelling.size() - 4);
128   }
129 
130   return AttrSpelling;
131 }
132 
133 typedef std::vector<std::pair<std::string, const Record *>> ParsedAttrMap;
134 
135 static ParsedAttrMap getParsedAttrList(const RecordKeeper &Records,
136                                        ParsedAttrMap *Dupes = nullptr) {
137   std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
138   std::set<std::string> Seen;
139   ParsedAttrMap R;
140   for (const auto *Attr : Attrs) {
141     if (Attr->getValueAsBit("SemaHandler")) {
142       std::string AN;
143       if (Attr->isSubClassOf("TargetSpecificAttr") &&
144           !Attr->isValueUnset("ParseKind")) {
145         AN = Attr->getValueAsString("ParseKind");
146 
147         // If this attribute has already been handled, it does not need to be
148         // handled again.
149         if (Seen.find(AN) != Seen.end()) {
150           if (Dupes)
151             Dupes->push_back(std::make_pair(AN, Attr));
152           continue;
153         }
154         Seen.insert(AN);
155       } else
156         AN = NormalizeAttrName(Attr->getName()).str();
157 
158       R.push_back(std::make_pair(AN, Attr));
159     }
160   }
161   return R;
162 }
163 
164 namespace {
165   class Argument {
166     std::string lowerName, upperName;
167     StringRef attrName;
168     bool isOpt;
169 
170   public:
171     Argument(const Record &Arg, StringRef Attr)
172       : lowerName(Arg.getValueAsString("Name")), upperName(lowerName),
173         attrName(Attr), isOpt(false) {
174       if (!lowerName.empty()) {
175         lowerName[0] = std::tolower(lowerName[0]);
176         upperName[0] = std::toupper(upperName[0]);
177       }
178     }
179     virtual ~Argument() {}
180 
181     StringRef getLowerName() const { return lowerName; }
182     StringRef getUpperName() const { return upperName; }
183     StringRef getAttrName() const { return attrName; }
184 
185     bool isOptional() const { return isOpt; }
186     void setOptional(bool set) { isOpt = set; }
187 
188     // These functions print the argument contents formatted in different ways.
189     virtual void writeAccessors(raw_ostream &OS) const = 0;
190     virtual void writeAccessorDefinitions(raw_ostream &OS) const {}
191     virtual void writeASTVisitorTraversal(raw_ostream &OS) const {}
192     virtual void writeCloneArgs(raw_ostream &OS) const = 0;
193     virtual void writeTemplateInstantiationArgs(raw_ostream &OS) const = 0;
194     virtual void writeTemplateInstantiation(raw_ostream &OS) const {}
195     virtual void writeCtorBody(raw_ostream &OS) const {}
196     virtual void writeCtorInitializers(raw_ostream &OS) const = 0;
197     virtual void writeCtorDefaultInitializers(raw_ostream &OS) const = 0;
198     virtual void writeCtorParameters(raw_ostream &OS) const = 0;
199     virtual void writeDeclarations(raw_ostream &OS) const = 0;
200     virtual void writePCHReadArgs(raw_ostream &OS) const = 0;
201     virtual void writePCHReadDecls(raw_ostream &OS) const = 0;
202     virtual void writePCHWrite(raw_ostream &OS) const = 0;
203     virtual void writeValue(raw_ostream &OS) const = 0;
204     virtual void writeDump(raw_ostream &OS) const = 0;
205     virtual void writeDumpChildren(raw_ostream &OS) const {}
206     virtual void writeHasChildren(raw_ostream &OS) const { OS << "false"; }
207 
208     virtual bool isEnumArg() const { return false; }
209     virtual bool isVariadicEnumArg() const { return false; }
210     virtual bool isVariadic() const { return false; }
211 
212     virtual void writeImplicitCtorArgs(raw_ostream &OS) const {
213       OS << getUpperName();
214     }
215   };
216 
217   class SimpleArgument : public Argument {
218     std::string type;
219 
220   public:
221     SimpleArgument(const Record &Arg, StringRef Attr, std::string T)
222       : Argument(Arg, Attr), type(T)
223     {}
224 
225     std::string getType() const { return type; }
226 
227     void writeAccessors(raw_ostream &OS) const override {
228       OS << "  " << type << " get" << getUpperName() << "() const {\n";
229       OS << "    return " << getLowerName() << ";\n";
230       OS << "  }";
231     }
232     void writeCloneArgs(raw_ostream &OS) const override {
233       OS << getLowerName();
234     }
235     void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
236       OS << "A->get" << getUpperName() << "()";
237     }
238     void writeCtorInitializers(raw_ostream &OS) const override {
239       OS << getLowerName() << "(" << getUpperName() << ")";
240     }
241     void writeCtorDefaultInitializers(raw_ostream &OS) const override {
242       OS << getLowerName() << "()";
243     }
244     void writeCtorParameters(raw_ostream &OS) const override {
245       OS << type << " " << getUpperName();
246     }
247     void writeDeclarations(raw_ostream &OS) const override {
248       OS << type << " " << getLowerName() << ";";
249     }
250     void writePCHReadDecls(raw_ostream &OS) const override {
251       std::string read = ReadPCHRecord(type);
252       OS << "    " << type << " " << getLowerName() << " = " << read << ";\n";
253     }
254     void writePCHReadArgs(raw_ostream &OS) const override {
255       OS << getLowerName();
256     }
257     void writePCHWrite(raw_ostream &OS) const override {
258       OS << "    " << WritePCHRecord(type, "SA->get" +
259                                            std::string(getUpperName()) + "()");
260     }
261     void writeValue(raw_ostream &OS) const override {
262       if (type == "FunctionDecl *") {
263         OS << "\" << get" << getUpperName()
264            << "()->getNameInfo().getAsString() << \"";
265       } else if (type == "IdentifierInfo *") {
266         OS << "\" << get" << getUpperName() << "()->getName() << \"";
267       } else if (type == "TypeSourceInfo *") {
268         OS << "\" << get" << getUpperName() << "().getAsString() << \"";
269       } else {
270         OS << "\" << get" << getUpperName() << "() << \"";
271       }
272     }
273     void writeDump(raw_ostream &OS) const override {
274       if (type == "FunctionDecl *") {
275         OS << "    OS << \" \";\n";
276         OS << "    dumpBareDeclRef(SA->get" << getUpperName() << "());\n";
277       } else if (type == "IdentifierInfo *") {
278         OS << "    OS << \" \" << SA->get" << getUpperName()
279            << "()->getName();\n";
280       } else if (type == "TypeSourceInfo *") {
281         OS << "    OS << \" \" << SA->get" << getUpperName()
282            << "().getAsString();\n";
283       } else if (type == "bool") {
284         OS << "    if (SA->get" << getUpperName() << "()) OS << \" "
285            << getUpperName() << "\";\n";
286       } else if (type == "int" || type == "unsigned") {
287         OS << "    OS << \" \" << SA->get" << getUpperName() << "();\n";
288       } else {
289         llvm_unreachable("Unknown SimpleArgument type!");
290       }
291     }
292   };
293 
294   class DefaultSimpleArgument : public SimpleArgument {
295     int64_t Default;
296 
297   public:
298     DefaultSimpleArgument(const Record &Arg, StringRef Attr,
299                           std::string T, int64_t Default)
300       : SimpleArgument(Arg, Attr, T), Default(Default) {}
301 
302     void writeAccessors(raw_ostream &OS) const override {
303       SimpleArgument::writeAccessors(OS);
304 
305       OS << "\n\n  static const " << getType() << " Default" << getUpperName()
306          << " = " << Default << ";";
307     }
308   };
309 
310   class StringArgument : public Argument {
311   public:
312     StringArgument(const Record &Arg, StringRef Attr)
313       : Argument(Arg, Attr)
314     {}
315 
316     void writeAccessors(raw_ostream &OS) const override {
317       OS << "  llvm::StringRef get" << getUpperName() << "() const {\n";
318       OS << "    return llvm::StringRef(" << getLowerName() << ", "
319          << getLowerName() << "Length);\n";
320       OS << "  }\n";
321       OS << "  unsigned get" << getUpperName() << "Length() const {\n";
322       OS << "    return " << getLowerName() << "Length;\n";
323       OS << "  }\n";
324       OS << "  void set" << getUpperName()
325          << "(ASTContext &C, llvm::StringRef S) {\n";
326       OS << "    " << getLowerName() << "Length = S.size();\n";
327       OS << "    this->" << getLowerName() << " = new (C, 1) char ["
328          << getLowerName() << "Length];\n";
329       OS << "    std::memcpy(this->" << getLowerName() << ", S.data(), "
330          << getLowerName() << "Length);\n";
331       OS << "  }";
332     }
333     void writeCloneArgs(raw_ostream &OS) const override {
334       OS << "get" << getUpperName() << "()";
335     }
336     void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
337       OS << "A->get" << getUpperName() << "()";
338     }
339     void writeCtorBody(raw_ostream &OS) const override {
340       OS << "      std::memcpy(" << getLowerName() << ", " << getUpperName()
341          << ".data(), " << getLowerName() << "Length);";
342     }
343     void writeCtorInitializers(raw_ostream &OS) const override {
344       OS << getLowerName() << "Length(" << getUpperName() << ".size()),"
345          << getLowerName() << "(new (Ctx, 1) char[" << getLowerName()
346          << "Length])";
347     }
348     void writeCtorDefaultInitializers(raw_ostream &OS) const override {
349       OS << getLowerName() << "Length(0)," << getLowerName() << "(0)";
350     }
351     void writeCtorParameters(raw_ostream &OS) const override {
352       OS << "llvm::StringRef " << getUpperName();
353     }
354     void writeDeclarations(raw_ostream &OS) const override {
355       OS << "unsigned " << getLowerName() << "Length;\n";
356       OS << "char *" << getLowerName() << ";";
357     }
358     void writePCHReadDecls(raw_ostream &OS) const override {
359       OS << "    std::string " << getLowerName()
360          << "= ReadString(Record, Idx);\n";
361     }
362     void writePCHReadArgs(raw_ostream &OS) const override {
363       OS << getLowerName();
364     }
365     void writePCHWrite(raw_ostream &OS) const override {
366       OS << "    AddString(SA->get" << getUpperName() << "(), Record);\n";
367     }
368     void writeValue(raw_ostream &OS) const override {
369       OS << "\\\"\" << get" << getUpperName() << "() << \"\\\"";
370     }
371     void writeDump(raw_ostream &OS) const override {
372       OS << "    OS << \" \\\"\" << SA->get" << getUpperName()
373          << "() << \"\\\"\";\n";
374     }
375   };
376 
377   class AlignedArgument : public Argument {
378   public:
379     AlignedArgument(const Record &Arg, StringRef Attr)
380       : Argument(Arg, Attr)
381     {}
382 
383     void writeAccessors(raw_ostream &OS) const override {
384       OS << "  bool is" << getUpperName() << "Dependent() const;\n";
385 
386       OS << "  unsigned get" << getUpperName() << "(ASTContext &Ctx) const;\n";
387 
388       OS << "  bool is" << getUpperName() << "Expr() const {\n";
389       OS << "    return is" << getLowerName() << "Expr;\n";
390       OS << "  }\n";
391 
392       OS << "  Expr *get" << getUpperName() << "Expr() const {\n";
393       OS << "    assert(is" << getLowerName() << "Expr);\n";
394       OS << "    return " << getLowerName() << "Expr;\n";
395       OS << "  }\n";
396 
397       OS << "  TypeSourceInfo *get" << getUpperName() << "Type() const {\n";
398       OS << "    assert(!is" << getLowerName() << "Expr);\n";
399       OS << "    return " << getLowerName() << "Type;\n";
400       OS << "  }";
401     }
402     void writeAccessorDefinitions(raw_ostream &OS) const override {
403       OS << "bool " << getAttrName() << "Attr::is" << getUpperName()
404          << "Dependent() const {\n";
405       OS << "  if (is" << getLowerName() << "Expr)\n";
406       OS << "    return " << getLowerName() << "Expr && (" << getLowerName()
407          << "Expr->isValueDependent() || " << getLowerName()
408          << "Expr->isTypeDependent());\n";
409       OS << "  else\n";
410       OS << "    return " << getLowerName()
411          << "Type->getType()->isDependentType();\n";
412       OS << "}\n";
413 
414       // FIXME: Do not do the calculation here
415       // FIXME: Handle types correctly
416       // A null pointer means maximum alignment
417       // FIXME: Load the platform-specific maximum alignment, rather than
418       //        16, the x86 max.
419       OS << "unsigned " << getAttrName() << "Attr::get" << getUpperName()
420          << "(ASTContext &Ctx) const {\n";
421       OS << "  assert(!is" << getUpperName() << "Dependent());\n";
422       OS << "  if (is" << getLowerName() << "Expr)\n";
423       OS << "    return (" << getLowerName() << "Expr ? " << getLowerName()
424          << "Expr->EvaluateKnownConstInt(Ctx).getZExtValue() : 16)"
425          << "* Ctx.getCharWidth();\n";
426       OS << "  else\n";
427       OS << "    return 0; // FIXME\n";
428       OS << "}\n";
429     }
430     void writeCloneArgs(raw_ostream &OS) const override {
431       OS << "is" << getLowerName() << "Expr, is" << getLowerName()
432          << "Expr ? static_cast<void*>(" << getLowerName()
433          << "Expr) : " << getLowerName()
434          << "Type";
435     }
436     void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
437       // FIXME: move the definition in Sema::InstantiateAttrs to here.
438       // In the meantime, aligned attributes are cloned.
439     }
440     void writeCtorBody(raw_ostream &OS) const override {
441       OS << "    if (is" << getLowerName() << "Expr)\n";
442       OS << "       " << getLowerName() << "Expr = reinterpret_cast<Expr *>("
443          << getUpperName() << ");\n";
444       OS << "    else\n";
445       OS << "       " << getLowerName()
446          << "Type = reinterpret_cast<TypeSourceInfo *>(" << getUpperName()
447          << ");";
448     }
449     void writeCtorInitializers(raw_ostream &OS) const override {
450       OS << "is" << getLowerName() << "Expr(Is" << getUpperName() << "Expr)";
451     }
452     void writeCtorDefaultInitializers(raw_ostream &OS) const override {
453       OS << "is" << getLowerName() << "Expr(false)";
454     }
455     void writeCtorParameters(raw_ostream &OS) const override {
456       OS << "bool Is" << getUpperName() << "Expr, void *" << getUpperName();
457     }
458     void writeImplicitCtorArgs(raw_ostream &OS) const override {
459       OS << "Is" << getUpperName() << "Expr, " << getUpperName();
460     }
461     void writeDeclarations(raw_ostream &OS) const override {
462       OS << "bool is" << getLowerName() << "Expr;\n";
463       OS << "union {\n";
464       OS << "Expr *" << getLowerName() << "Expr;\n";
465       OS << "TypeSourceInfo *" << getLowerName() << "Type;\n";
466       OS << "};";
467     }
468     void writePCHReadArgs(raw_ostream &OS) const override {
469       OS << "is" << getLowerName() << "Expr, " << getLowerName() << "Ptr";
470     }
471     void writePCHReadDecls(raw_ostream &OS) const override {
472       OS << "    bool is" << getLowerName() << "Expr = Record[Idx++];\n";
473       OS << "    void *" << getLowerName() << "Ptr;\n";
474       OS << "    if (is" << getLowerName() << "Expr)\n";
475       OS << "      " << getLowerName() << "Ptr = ReadExpr(F);\n";
476       OS << "    else\n";
477       OS << "      " << getLowerName()
478          << "Ptr = GetTypeSourceInfo(F, Record, Idx);\n";
479     }
480     void writePCHWrite(raw_ostream &OS) const override {
481       OS << "    Record.push_back(SA->is" << getUpperName() << "Expr());\n";
482       OS << "    if (SA->is" << getUpperName() << "Expr())\n";
483       OS << "      AddStmt(SA->get" << getUpperName() << "Expr());\n";
484       OS << "    else\n";
485       OS << "      AddTypeSourceInfo(SA->get" << getUpperName()
486          << "Type(), Record);\n";
487     }
488     void writeValue(raw_ostream &OS) const override {
489       OS << "\";\n";
490       // The aligned attribute argument expression is optional.
491       OS << "    if (is" << getLowerName() << "Expr && "
492          << getLowerName() << "Expr)\n";
493       OS << "      " << getLowerName() << "Expr->printPretty(OS, 0, Policy);\n";
494       OS << "    OS << \"";
495     }
496     void writeDump(raw_ostream &OS) const override {
497     }
498     void writeDumpChildren(raw_ostream &OS) const override {
499       OS << "    if (SA->is" << getUpperName() << "Expr())\n";
500       OS << "      dumpStmt(SA->get" << getUpperName() << "Expr());\n";
501       OS << "    else\n";
502       OS << "      dumpType(SA->get" << getUpperName()
503          << "Type()->getType());\n";
504     }
505     void writeHasChildren(raw_ostream &OS) const override {
506       OS << "SA->is" << getUpperName() << "Expr()";
507     }
508   };
509 
510   class VariadicArgument : public Argument {
511     std::string Type, ArgName, ArgSizeName, RangeName;
512 
513   protected:
514     // Assumed to receive a parameter: raw_ostream OS.
515     virtual void writeValueImpl(raw_ostream &OS) const {
516       OS << "    OS << Val;\n";
517     }
518 
519   public:
520     VariadicArgument(const Record &Arg, StringRef Attr, std::string T)
521         : Argument(Arg, Attr), Type(T), ArgName(getLowerName().str() + "_"),
522           ArgSizeName(ArgName + "Size"), RangeName(getLowerName()) {}
523 
524     std::string getType() const { return Type; }
525     bool isVariadic() const override { return true; }
526 
527     void writeAccessors(raw_ostream &OS) const override {
528       std::string IteratorType = getLowerName().str() + "_iterator";
529       std::string BeginFn = getLowerName().str() + "_begin()";
530       std::string EndFn = getLowerName().str() + "_end()";
531 
532       OS << "  typedef " << Type << "* " << IteratorType << ";\n";
533       OS << "  " << IteratorType << " " << BeginFn << " const {"
534          << " return " << ArgName << "; }\n";
535       OS << "  " << IteratorType << " " << EndFn << " const {"
536          << " return " << ArgName << " + " << ArgSizeName << "; }\n";
537       OS << "  unsigned " << getLowerName() << "_size() const {"
538          << " return " << ArgSizeName << "; }\n";
539       OS << "  llvm::iterator_range<" << IteratorType << "> " << RangeName
540          << "() const { return llvm::make_range(" << BeginFn << ", " << EndFn
541          << "); }\n";
542     }
543     void writeCloneArgs(raw_ostream &OS) const override {
544       OS << ArgName << ", " << ArgSizeName;
545     }
546     void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
547       // This isn't elegant, but we have to go through public methods...
548       OS << "A->" << getLowerName() << "_begin(), "
549          << "A->" << getLowerName() << "_size()";
550     }
551     void writeCtorBody(raw_ostream &OS) const override {
552       OS << "    std::copy(" << getUpperName() << ", " << getUpperName()
553          << " + " << ArgSizeName << ", " << ArgName << ");";
554     }
555     void writeCtorInitializers(raw_ostream &OS) const override {
556       OS << ArgSizeName << "(" << getUpperName() << "Size), "
557          << ArgName << "(new (Ctx, 16) " << getType() << "["
558          << ArgSizeName << "])";
559     }
560     void writeCtorDefaultInitializers(raw_ostream &OS) const override {
561       OS << ArgSizeName << "(0), " << ArgName << "(nullptr)";
562     }
563     void writeCtorParameters(raw_ostream &OS) const override {
564       OS << getType() << " *" << getUpperName() << ", unsigned "
565          << getUpperName() << "Size";
566     }
567     void writeImplicitCtorArgs(raw_ostream &OS) const override {
568       OS << getUpperName() << ", " << getUpperName() << "Size";
569     }
570     void writeDeclarations(raw_ostream &OS) const override {
571       OS << "  unsigned " << ArgSizeName << ";\n";
572       OS << "  " << getType() << " *" << ArgName << ";";
573     }
574     void writePCHReadDecls(raw_ostream &OS) const override {
575       OS << "  unsigned " << getLowerName() << "Size = Record[Idx++];\n";
576       OS << "  SmallVector<" << Type << ", 4> " << getLowerName()
577          << ";\n";
578       OS << "  " << getLowerName() << ".reserve(" << getLowerName()
579          << "Size);\n";
580       OS << "    for (unsigned i = " << getLowerName() << "Size; i; --i)\n";
581 
582       std::string read = ReadPCHRecord(Type);
583       OS << "    " << getLowerName() << ".push_back(" << read << ");\n";
584     }
585     void writePCHReadArgs(raw_ostream &OS) const override {
586       OS << getLowerName() << ".data(), " << getLowerName() << "Size";
587     }
588     void writePCHWrite(raw_ostream &OS) const override {
589       OS << "    Record.push_back(SA->" << getLowerName() << "_size());\n";
590       OS << "    for (auto &Val : SA->" << RangeName << "())\n";
591       OS << "      " << WritePCHRecord(Type, "Val");
592     }
593     void writeValue(raw_ostream &OS) const override {
594       OS << "\";\n";
595       OS << "  bool isFirst = true;\n"
596          << "  for (const auto &Val : " << RangeName << "()) {\n"
597          << "    if (isFirst) isFirst = false;\n"
598          << "    else OS << \", \";\n";
599       writeValueImpl(OS);
600       OS << "  }\n";
601       OS << "  OS << \"";
602     }
603     void writeDump(raw_ostream &OS) const override {
604       OS << "    for (const auto &Val : SA->" << RangeName << "())\n";
605       OS << "      OS << \" \" << Val;\n";
606     }
607   };
608 
609   // Unique the enums, but maintain the original declaration ordering.
610   std::vector<std::string>
611   uniqueEnumsInOrder(const std::vector<std::string> &enums) {
612     std::vector<std::string> uniques;
613     std::set<std::string> unique_set(enums.begin(), enums.end());
614     for (const auto &i : enums) {
615       std::set<std::string>::iterator set_i = unique_set.find(i);
616       if (set_i != unique_set.end()) {
617         uniques.push_back(i);
618         unique_set.erase(set_i);
619       }
620     }
621     return uniques;
622   }
623 
624   class EnumArgument : public Argument {
625     std::string type;
626     std::vector<std::string> values, enums, uniques;
627   public:
628     EnumArgument(const Record &Arg, StringRef Attr)
629       : Argument(Arg, Attr), type(Arg.getValueAsString("Type")),
630         values(Arg.getValueAsListOfStrings("Values")),
631         enums(Arg.getValueAsListOfStrings("Enums")),
632         uniques(uniqueEnumsInOrder(enums))
633     {
634       // FIXME: Emit a proper error
635       assert(!uniques.empty());
636     }
637 
638     bool isEnumArg() const override { return true; }
639 
640     void writeAccessors(raw_ostream &OS) const override {
641       OS << "  " << type << " get" << getUpperName() << "() const {\n";
642       OS << "    return " << getLowerName() << ";\n";
643       OS << "  }";
644     }
645     void writeCloneArgs(raw_ostream &OS) const override {
646       OS << getLowerName();
647     }
648     void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
649       OS << "A->get" << getUpperName() << "()";
650     }
651     void writeCtorInitializers(raw_ostream &OS) const override {
652       OS << getLowerName() << "(" << getUpperName() << ")";
653     }
654     void writeCtorDefaultInitializers(raw_ostream &OS) const override {
655       OS << getLowerName() << "(" << type << "(0))";
656     }
657     void writeCtorParameters(raw_ostream &OS) const override {
658       OS << type << " " << getUpperName();
659     }
660     void writeDeclarations(raw_ostream &OS) const override {
661       std::vector<std::string>::const_iterator i = uniques.begin(),
662                                                e = uniques.end();
663       // The last one needs to not have a comma.
664       --e;
665 
666       OS << "public:\n";
667       OS << "  enum " << type << " {\n";
668       for (; i != e; ++i)
669         OS << "    " << *i << ",\n";
670       OS << "    " << *e << "\n";
671       OS << "  };\n";
672       OS << "private:\n";
673       OS << "  " << type << " " << getLowerName() << ";";
674     }
675     void writePCHReadDecls(raw_ostream &OS) const override {
676       OS << "    " << getAttrName() << "Attr::" << type << " " << getLowerName()
677          << "(static_cast<" << getAttrName() << "Attr::" << type
678          << ">(Record[Idx++]));\n";
679     }
680     void writePCHReadArgs(raw_ostream &OS) const override {
681       OS << getLowerName();
682     }
683     void writePCHWrite(raw_ostream &OS) const override {
684       OS << "Record.push_back(SA->get" << getUpperName() << "());\n";
685     }
686     void writeValue(raw_ostream &OS) const override {
687       // FIXME: this isn't 100% correct -- some enum arguments require printing
688       // as a string literal, while others require printing as an identifier.
689       // Tablegen currently does not distinguish between the two forms.
690       OS << "\\\"\" << " << getAttrName() << "Attr::Convert" << type << "ToStr(get"
691          << getUpperName() << "()) << \"\\\"";
692     }
693     void writeDump(raw_ostream &OS) const override {
694       OS << "    switch(SA->get" << getUpperName() << "()) {\n";
695       for (const auto &I : uniques) {
696         OS << "    case " << getAttrName() << "Attr::" << I << ":\n";
697         OS << "      OS << \" " << I << "\";\n";
698         OS << "      break;\n";
699       }
700       OS << "    }\n";
701     }
702 
703     void writeConversion(raw_ostream &OS) const {
704       OS << "  static bool ConvertStrTo" << type << "(StringRef Val, ";
705       OS << type << " &Out) {\n";
706       OS << "    Optional<" << type << "> R = llvm::StringSwitch<Optional<";
707       OS << type << ">>(Val)\n";
708       for (size_t I = 0; I < enums.size(); ++I) {
709         OS << "      .Case(\"" << values[I] << "\", ";
710         OS << getAttrName() << "Attr::" << enums[I] << ")\n";
711       }
712       OS << "      .Default(Optional<" << type << ">());\n";
713       OS << "    if (R) {\n";
714       OS << "      Out = *R;\n      return true;\n    }\n";
715       OS << "    return false;\n";
716       OS << "  }\n\n";
717 
718       // Mapping from enumeration values back to enumeration strings isn't
719       // trivial because some enumeration values have multiple named
720       // enumerators, such as type_visibility(internal) and
721       // type_visibility(hidden) both mapping to TypeVisibilityAttr::Hidden.
722       OS << "  static const char *Convert" << type << "ToStr("
723          << type << " Val) {\n"
724          << "    switch(Val) {\n";
725       std::set<std::string> Uniques;
726       for (size_t I = 0; I < enums.size(); ++I) {
727         if (Uniques.insert(enums[I]).second)
728           OS << "    case " << getAttrName() << "Attr::" << enums[I]
729              << ": return \"" << values[I] << "\";\n";
730       }
731       OS << "    }\n"
732          << "    llvm_unreachable(\"No enumerator with that value\");\n"
733          << "  }\n";
734     }
735   };
736 
737   class VariadicEnumArgument: public VariadicArgument {
738     std::string type, QualifiedTypeName;
739     std::vector<std::string> values, enums, uniques;
740 
741   protected:
742     void writeValueImpl(raw_ostream &OS) const override {
743       // FIXME: this isn't 100% correct -- some enum arguments require printing
744       // as a string literal, while others require printing as an identifier.
745       // Tablegen currently does not distinguish between the two forms.
746       OS << "    OS << \"\\\"\" << " << getAttrName() << "Attr::Convert" << type
747          << "ToStr(Val)" << "<< \"\\\"\";\n";
748     }
749 
750   public:
751     VariadicEnumArgument(const Record &Arg, StringRef Attr)
752       : VariadicArgument(Arg, Attr, Arg.getValueAsString("Type")),
753         type(Arg.getValueAsString("Type")),
754         values(Arg.getValueAsListOfStrings("Values")),
755         enums(Arg.getValueAsListOfStrings("Enums")),
756         uniques(uniqueEnumsInOrder(enums))
757     {
758       QualifiedTypeName = getAttrName().str() + "Attr::" + type;
759 
760       // FIXME: Emit a proper error
761       assert(!uniques.empty());
762     }
763 
764     bool isVariadicEnumArg() const override { return true; }
765 
766     void writeDeclarations(raw_ostream &OS) const override {
767       std::vector<std::string>::const_iterator i = uniques.begin(),
768                                                e = uniques.end();
769       // The last one needs to not have a comma.
770       --e;
771 
772       OS << "public:\n";
773       OS << "  enum " << type << " {\n";
774       for (; i != e; ++i)
775         OS << "    " << *i << ",\n";
776       OS << "    " << *e << "\n";
777       OS << "  };\n";
778       OS << "private:\n";
779 
780       VariadicArgument::writeDeclarations(OS);
781     }
782     void writeDump(raw_ostream &OS) const override {
783       OS << "    for (" << getAttrName() << "Attr::" << getLowerName()
784          << "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->"
785          << getLowerName() << "_end(); I != E; ++I) {\n";
786       OS << "      switch(*I) {\n";
787       for (const auto &UI : uniques) {
788         OS << "    case " << getAttrName() << "Attr::" << UI << ":\n";
789         OS << "      OS << \" " << UI << "\";\n";
790         OS << "      break;\n";
791       }
792       OS << "      }\n";
793       OS << "    }\n";
794     }
795     void writePCHReadDecls(raw_ostream &OS) const override {
796       OS << "    unsigned " << getLowerName() << "Size = Record[Idx++];\n";
797       OS << "    SmallVector<" << QualifiedTypeName << ", 4> " << getLowerName()
798          << ";\n";
799       OS << "    " << getLowerName() << ".reserve(" << getLowerName()
800          << "Size);\n";
801       OS << "    for (unsigned i = " << getLowerName() << "Size; i; --i)\n";
802       OS << "      " << getLowerName() << ".push_back(" << "static_cast<"
803          << QualifiedTypeName << ">(Record[Idx++]));\n";
804     }
805     void writePCHWrite(raw_ostream &OS) const override {
806       OS << "    Record.push_back(SA->" << getLowerName() << "_size());\n";
807       OS << "    for (" << getAttrName() << "Attr::" << getLowerName()
808          << "_iterator i = SA->" << getLowerName() << "_begin(), e = SA->"
809          << getLowerName() << "_end(); i != e; ++i)\n";
810       OS << "      " << WritePCHRecord(QualifiedTypeName, "(*i)");
811     }
812     void writeConversion(raw_ostream &OS) const {
813       OS << "  static bool ConvertStrTo" << type << "(StringRef Val, ";
814       OS << type << " &Out) {\n";
815       OS << "    Optional<" << type << "> R = llvm::StringSwitch<Optional<";
816       OS << type << ">>(Val)\n";
817       for (size_t I = 0; I < enums.size(); ++I) {
818         OS << "      .Case(\"" << values[I] << "\", ";
819         OS << getAttrName() << "Attr::" << enums[I] << ")\n";
820       }
821       OS << "      .Default(Optional<" << type << ">());\n";
822       OS << "    if (R) {\n";
823       OS << "      Out = *R;\n      return true;\n    }\n";
824       OS << "    return false;\n";
825       OS << "  }\n\n";
826 
827       OS << "  static const char *Convert" << type << "ToStr("
828         << type << " Val) {\n"
829         << "    switch(Val) {\n";
830       std::set<std::string> Uniques;
831       for (size_t I = 0; I < enums.size(); ++I) {
832         if (Uniques.insert(enums[I]).second)
833           OS << "    case " << getAttrName() << "Attr::" << enums[I]
834           << ": return \"" << values[I] << "\";\n";
835       }
836       OS << "    }\n"
837         << "    llvm_unreachable(\"No enumerator with that value\");\n"
838         << "  }\n";
839     }
840   };
841 
842   class VersionArgument : public Argument {
843   public:
844     VersionArgument(const Record &Arg, StringRef Attr)
845       : Argument(Arg, Attr)
846     {}
847 
848     void writeAccessors(raw_ostream &OS) const override {
849       OS << "  VersionTuple get" << getUpperName() << "() const {\n";
850       OS << "    return " << getLowerName() << ";\n";
851       OS << "  }\n";
852       OS << "  void set" << getUpperName()
853          << "(ASTContext &C, VersionTuple V) {\n";
854       OS << "    " << getLowerName() << " = V;\n";
855       OS << "  }";
856     }
857     void writeCloneArgs(raw_ostream &OS) const override {
858       OS << "get" << getUpperName() << "()";
859     }
860     void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
861       OS << "A->get" << getUpperName() << "()";
862     }
863     void writeCtorInitializers(raw_ostream &OS) const override {
864       OS << getLowerName() << "(" << getUpperName() << ")";
865     }
866     void writeCtorDefaultInitializers(raw_ostream &OS) const override {
867       OS << getLowerName() << "()";
868     }
869     void writeCtorParameters(raw_ostream &OS) const override {
870       OS << "VersionTuple " << getUpperName();
871     }
872     void writeDeclarations(raw_ostream &OS) const override {
873       OS << "VersionTuple " << getLowerName() << ";\n";
874     }
875     void writePCHReadDecls(raw_ostream &OS) const override {
876       OS << "    VersionTuple " << getLowerName()
877          << "= ReadVersionTuple(Record, Idx);\n";
878     }
879     void writePCHReadArgs(raw_ostream &OS) const override {
880       OS << getLowerName();
881     }
882     void writePCHWrite(raw_ostream &OS) const override {
883       OS << "    AddVersionTuple(SA->get" << getUpperName() << "(), Record);\n";
884     }
885     void writeValue(raw_ostream &OS) const override {
886       OS << getLowerName() << "=\" << get" << getUpperName() << "() << \"";
887     }
888     void writeDump(raw_ostream &OS) const override {
889       OS << "    OS << \" \" << SA->get" << getUpperName() << "();\n";
890     }
891   };
892 
893   class ExprArgument : public SimpleArgument {
894   public:
895     ExprArgument(const Record &Arg, StringRef Attr)
896       : SimpleArgument(Arg, Attr, "Expr *")
897     {}
898 
899     void writeASTVisitorTraversal(raw_ostream &OS) const override {
900       OS << "  if (!"
901          << "getDerived().TraverseStmt(A->get" << getUpperName() << "()))\n";
902       OS << "    return false;\n";
903     }
904 
905     void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
906       OS << "tempInst" << getUpperName();
907     }
908 
909     void writeTemplateInstantiation(raw_ostream &OS) const override {
910       OS << "      " << getType() << " tempInst" << getUpperName() << ";\n";
911       OS << "      {\n";
912       OS << "        EnterExpressionEvaluationContext "
913          << "Unevaluated(S, Sema::Unevaluated);\n";
914       OS << "        ExprResult " << "Result = S.SubstExpr("
915          << "A->get" << getUpperName() << "(), TemplateArgs);\n";
916       OS << "        tempInst" << getUpperName() << " = "
917          << "Result.getAs<Expr>();\n";
918       OS << "      }\n";
919     }
920 
921     void writeDump(raw_ostream &OS) const override {}
922 
923     void writeDumpChildren(raw_ostream &OS) const override {
924       OS << "    dumpStmt(SA->get" << getUpperName() << "());\n";
925     }
926     void writeHasChildren(raw_ostream &OS) const override { OS << "true"; }
927   };
928 
929   class VariadicExprArgument : public VariadicArgument {
930   public:
931     VariadicExprArgument(const Record &Arg, StringRef Attr)
932       : VariadicArgument(Arg, Attr, "Expr *")
933     {}
934 
935     void writeASTVisitorTraversal(raw_ostream &OS) const override {
936       OS << "  {\n";
937       OS << "    " << getType() << " *I = A->" << getLowerName()
938          << "_begin();\n";
939       OS << "    " << getType() << " *E = A->" << getLowerName()
940          << "_end();\n";
941       OS << "    for (; I != E; ++I) {\n";
942       OS << "      if (!getDerived().TraverseStmt(*I))\n";
943       OS << "        return false;\n";
944       OS << "    }\n";
945       OS << "  }\n";
946     }
947 
948     void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
949       OS << "tempInst" << getUpperName() << ", "
950          << "A->" << getLowerName() << "_size()";
951     }
952 
953     void writeTemplateInstantiation(raw_ostream &OS) const override {
954       OS << "      " << getType() << " *tempInst" << getUpperName()
955          << " = new (C, 16) " << getType()
956          << "[A->" << getLowerName() << "_size()];\n";
957       OS << "      {\n";
958       OS << "        EnterExpressionEvaluationContext "
959          << "Unevaluated(S, Sema::Unevaluated);\n";
960       OS << "        " << getType() << " *TI = tempInst" << getUpperName()
961          << ";\n";
962       OS << "        " << getType() << " *I = A->" << getLowerName()
963          << "_begin();\n";
964       OS << "        " << getType() << " *E = A->" << getLowerName()
965          << "_end();\n";
966       OS << "        for (; I != E; ++I, ++TI) {\n";
967       OS << "          ExprResult Result = S.SubstExpr(*I, TemplateArgs);\n";
968       OS << "          *TI = Result.getAs<Expr>();\n";
969       OS << "        }\n";
970       OS << "      }\n";
971     }
972 
973     void writeDump(raw_ostream &OS) const override {}
974 
975     void writeDumpChildren(raw_ostream &OS) const override {
976       OS << "    for (" << getAttrName() << "Attr::" << getLowerName()
977          << "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->"
978          << getLowerName() << "_end(); I != E; ++I)\n";
979       OS << "      dumpStmt(*I);\n";
980     }
981 
982     void writeHasChildren(raw_ostream &OS) const override {
983       OS << "SA->" << getLowerName() << "_begin() != "
984          << "SA->" << getLowerName() << "_end()";
985     }
986   };
987 
988   class TypeArgument : public SimpleArgument {
989   public:
990     TypeArgument(const Record &Arg, StringRef Attr)
991       : SimpleArgument(Arg, Attr, "TypeSourceInfo *")
992     {}
993 
994     void writeAccessors(raw_ostream &OS) const override {
995       OS << "  QualType get" << getUpperName() << "() const {\n";
996       OS << "    return " << getLowerName() << "->getType();\n";
997       OS << "  }";
998       OS << "  " << getType() << " get" << getUpperName() << "Loc() const {\n";
999       OS << "    return " << getLowerName() << ";\n";
1000       OS << "  }";
1001     }
1002     void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1003       OS << "A->get" << getUpperName() << "Loc()";
1004     }
1005     void writePCHWrite(raw_ostream &OS) const override {
1006       OS << "    " << WritePCHRecord(
1007           getType(), "SA->get" + std::string(getUpperName()) + "Loc()");
1008     }
1009   };
1010 }
1011 
1012 static std::unique_ptr<Argument>
1013 createArgument(const Record &Arg, StringRef Attr,
1014                const Record *Search = nullptr) {
1015   if (!Search)
1016     Search = &Arg;
1017 
1018   std::unique_ptr<Argument> Ptr;
1019   llvm::StringRef ArgName = Search->getName();
1020 
1021   if (ArgName == "AlignedArgument")
1022     Ptr = llvm::make_unique<AlignedArgument>(Arg, Attr);
1023   else if (ArgName == "EnumArgument")
1024     Ptr = llvm::make_unique<EnumArgument>(Arg, Attr);
1025   else if (ArgName == "ExprArgument")
1026     Ptr = llvm::make_unique<ExprArgument>(Arg, Attr);
1027   else if (ArgName == "FunctionArgument")
1028     Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "FunctionDecl *");
1029   else if (ArgName == "IdentifierArgument")
1030     Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "IdentifierInfo *");
1031   else if (ArgName == "DefaultBoolArgument")
1032     Ptr = llvm::make_unique<DefaultSimpleArgument>(
1033         Arg, Attr, "bool", Arg.getValueAsBit("Default"));
1034   else if (ArgName == "BoolArgument")
1035     Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "bool");
1036   else if (ArgName == "DefaultIntArgument")
1037     Ptr = llvm::make_unique<DefaultSimpleArgument>(
1038         Arg, Attr, "int", Arg.getValueAsInt("Default"));
1039   else if (ArgName == "IntArgument")
1040     Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "int");
1041   else if (ArgName == "StringArgument")
1042     Ptr = llvm::make_unique<StringArgument>(Arg, Attr);
1043   else if (ArgName == "TypeArgument")
1044     Ptr = llvm::make_unique<TypeArgument>(Arg, Attr);
1045   else if (ArgName == "UnsignedArgument")
1046     Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "unsigned");
1047   else if (ArgName == "VariadicUnsignedArgument")
1048     Ptr = llvm::make_unique<VariadicArgument>(Arg, Attr, "unsigned");
1049   else if (ArgName == "VariadicEnumArgument")
1050     Ptr = llvm::make_unique<VariadicEnumArgument>(Arg, Attr);
1051   else if (ArgName == "VariadicExprArgument")
1052     Ptr = llvm::make_unique<VariadicExprArgument>(Arg, Attr);
1053   else if (ArgName == "VersionArgument")
1054     Ptr = llvm::make_unique<VersionArgument>(Arg, Attr);
1055 
1056   if (!Ptr) {
1057     // Search in reverse order so that the most-derived type is handled first.
1058     std::vector<Record*> Bases = Search->getSuperClasses();
1059     for (const auto *Base : llvm::make_range(Bases.rbegin(), Bases.rend())) {
1060       if ((Ptr = createArgument(Arg, Attr, Base)))
1061         break;
1062     }
1063   }
1064 
1065   if (Ptr && Arg.getValueAsBit("Optional"))
1066     Ptr->setOptional(true);
1067 
1068   return Ptr;
1069 }
1070 
1071 static void writeAvailabilityValue(raw_ostream &OS) {
1072   OS << "\" << getPlatform()->getName();\n"
1073      << "  if (!getIntroduced().empty()) OS << \", introduced=\" << getIntroduced();\n"
1074      << "  if (!getDeprecated().empty()) OS << \", deprecated=\" << getDeprecated();\n"
1075      << "  if (!getObsoleted().empty()) OS << \", obsoleted=\" << getObsoleted();\n"
1076      << "  if (getUnavailable()) OS << \", unavailable\";\n"
1077      << "  OS << \"";
1078 }
1079 
1080 static void writeGetSpellingFunction(Record &R, raw_ostream &OS) {
1081   std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
1082 
1083   OS << "const char *" << R.getName() << "Attr::getSpelling() const {\n";
1084   if (Spellings.empty()) {
1085     OS << "  return \"(No spelling)\";\n}\n\n";
1086     return;
1087   }
1088 
1089   OS << "  switch (SpellingListIndex) {\n"
1090         "  default:\n"
1091         "    llvm_unreachable(\"Unknown attribute spelling!\");\n"
1092         "    return \"(No spelling)\";\n";
1093 
1094   for (unsigned I = 0; I < Spellings.size(); ++I)
1095     OS << "  case " << I << ":\n"
1096           "    return \"" << Spellings[I].name() << "\";\n";
1097   // End of the switch statement.
1098   OS << "  }\n";
1099   // End of the getSpelling function.
1100   OS << "}\n\n";
1101 }
1102 
1103 static void
1104 writePrettyPrintFunction(Record &R,
1105                          const std::vector<std::unique_ptr<Argument>> &Args,
1106                          raw_ostream &OS) {
1107   std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
1108 
1109   OS << "void " << R.getName() << "Attr::printPretty("
1110     << "raw_ostream &OS, const PrintingPolicy &Policy) const {\n";
1111 
1112   if (Spellings.empty()) {
1113     OS << "}\n\n";
1114     return;
1115   }
1116 
1117   OS <<
1118     "  switch (SpellingListIndex) {\n"
1119     "  default:\n"
1120     "    llvm_unreachable(\"Unknown attribute spelling!\");\n"
1121     "    break;\n";
1122 
1123   for (unsigned I = 0; I < Spellings.size(); ++ I) {
1124     llvm::SmallString<16> Prefix;
1125     llvm::SmallString<8> Suffix;
1126     // The actual spelling of the name and namespace (if applicable)
1127     // of an attribute without considering prefix and suffix.
1128     llvm::SmallString<64> Spelling;
1129     std::string Name = Spellings[I].name();
1130     std::string Variety = Spellings[I].variety();
1131 
1132     if (Variety == "GNU") {
1133       Prefix = " __attribute__((";
1134       Suffix = "))";
1135     } else if (Variety == "CXX11") {
1136       Prefix = " [[";
1137       Suffix = "]]";
1138       std::string Namespace = Spellings[I].nameSpace();
1139       if (!Namespace.empty()) {
1140         Spelling += Namespace;
1141         Spelling += "::";
1142       }
1143     } else if (Variety == "Declspec") {
1144       Prefix = " __declspec(";
1145       Suffix = ")";
1146     } else if (Variety == "Keyword") {
1147       Prefix = " ";
1148       Suffix = "";
1149     } else if (Variety == "Pragma") {
1150       Prefix = "#pragma ";
1151       Suffix = "\n";
1152       std::string Namespace = Spellings[I].nameSpace();
1153       if (!Namespace.empty()) {
1154         Spelling += Namespace;
1155         Spelling += " ";
1156       }
1157     } else {
1158       llvm_unreachable("Unknown attribute syntax variety!");
1159     }
1160 
1161     Spelling += Name;
1162 
1163     OS <<
1164       "  case " << I << " : {\n"
1165       "    OS << \"" + Prefix.str() + Spelling.str();
1166 
1167     if (Variety == "Pragma") {
1168       OS << " \";\n";
1169       OS << "    printPrettyPragma(OS, Policy);\n";
1170       OS << "    break;\n";
1171       OS << "  }\n";
1172       continue;
1173     }
1174 
1175     // FIXME: always printing the parenthesis isn't the correct behavior for
1176     // attributes which have optional arguments that were not provided. For
1177     // instance: __attribute__((aligned)) will be pretty printed as
1178     // __attribute__((aligned())). The logic should check whether there is only
1179     // a single argument, and if it is optional, whether it has been provided.
1180     if (!Args.empty())
1181       OS << "(";
1182     if (Spelling == "availability") {
1183       writeAvailabilityValue(OS);
1184     } else {
1185       for (auto I = Args.begin(), E = Args.end(); I != E; ++ I) {
1186         if (I != Args.begin()) OS << ", ";
1187         (*I)->writeValue(OS);
1188       }
1189     }
1190 
1191     if (!Args.empty())
1192       OS << ")";
1193     OS << Suffix.str() + "\";\n";
1194 
1195     OS <<
1196       "    break;\n"
1197       "  }\n";
1198   }
1199 
1200   // End of the switch statement.
1201   OS << "}\n";
1202   // End of the print function.
1203   OS << "}\n\n";
1204 }
1205 
1206 /// \brief Return the index of a spelling in a spelling list.
1207 static unsigned
1208 getSpellingListIndex(const std::vector<FlattenedSpelling> &SpellingList,
1209                      const FlattenedSpelling &Spelling) {
1210   assert(SpellingList.size() && "Spelling list is empty!");
1211 
1212   for (unsigned Index = 0; Index < SpellingList.size(); ++Index) {
1213     const FlattenedSpelling &S = SpellingList[Index];
1214     if (S.variety() != Spelling.variety())
1215       continue;
1216     if (S.nameSpace() != Spelling.nameSpace())
1217       continue;
1218     if (S.name() != Spelling.name())
1219       continue;
1220 
1221     return Index;
1222   }
1223 
1224   llvm_unreachable("Unknown spelling!");
1225 }
1226 
1227 static void writeAttrAccessorDefinition(const Record &R, raw_ostream &OS) {
1228   std::vector<Record*> Accessors = R.getValueAsListOfDefs("Accessors");
1229   for (const auto *Accessor : Accessors) {
1230     std::string Name = Accessor->getValueAsString("Name");
1231     std::vector<FlattenedSpelling> Spellings =
1232       GetFlattenedSpellings(*Accessor);
1233     std::vector<FlattenedSpelling> SpellingList = GetFlattenedSpellings(R);
1234     assert(SpellingList.size() &&
1235            "Attribute with empty spelling list can't have accessors!");
1236 
1237     OS << "  bool " << Name << "() const { return SpellingListIndex == ";
1238     for (unsigned Index = 0; Index < Spellings.size(); ++Index) {
1239       OS << getSpellingListIndex(SpellingList, Spellings[Index]);
1240       if (Index != Spellings.size() -1)
1241         OS << " ||\n    SpellingListIndex == ";
1242       else
1243         OS << "; }\n";
1244     }
1245   }
1246 }
1247 
1248 static bool
1249 SpellingNamesAreCommon(const std::vector<FlattenedSpelling>& Spellings) {
1250   assert(!Spellings.empty() && "An empty list of spellings was provided");
1251   std::string FirstName = NormalizeNameForSpellingComparison(
1252     Spellings.front().name());
1253   for (const auto &Spelling :
1254        llvm::make_range(std::next(Spellings.begin()), Spellings.end())) {
1255     std::string Name = NormalizeNameForSpellingComparison(Spelling.name());
1256     if (Name != FirstName)
1257       return false;
1258   }
1259   return true;
1260 }
1261 
1262 typedef std::map<unsigned, std::string> SemanticSpellingMap;
1263 static std::string
1264 CreateSemanticSpellings(const std::vector<FlattenedSpelling> &Spellings,
1265                         SemanticSpellingMap &Map) {
1266   // The enumerants are automatically generated based on the variety,
1267   // namespace (if present) and name for each attribute spelling. However,
1268   // care is taken to avoid trampling on the reserved namespace due to
1269   // underscores.
1270   std::string Ret("  enum Spelling {\n");
1271   std::set<std::string> Uniques;
1272   unsigned Idx = 0;
1273   for (auto I = Spellings.begin(), E = Spellings.end(); I != E; ++I, ++Idx) {
1274     const FlattenedSpelling &S = *I;
1275     std::string Variety = S.variety();
1276     std::string Spelling = S.name();
1277     std::string Namespace = S.nameSpace();
1278     std::string EnumName = "";
1279 
1280     EnumName += (Variety + "_");
1281     if (!Namespace.empty())
1282       EnumName += (NormalizeNameForSpellingComparison(Namespace).str() +
1283       "_");
1284     EnumName += NormalizeNameForSpellingComparison(Spelling);
1285 
1286     // Even if the name is not unique, this spelling index corresponds to a
1287     // particular enumerant name that we've calculated.
1288     Map[Idx] = EnumName;
1289 
1290     // Since we have been stripping underscores to avoid trampling on the
1291     // reserved namespace, we may have inadvertently created duplicate
1292     // enumerant names. These duplicates are not considered part of the
1293     // semantic spelling, and can be elided.
1294     if (Uniques.find(EnumName) != Uniques.end())
1295       continue;
1296 
1297     Uniques.insert(EnumName);
1298     if (I != Spellings.begin())
1299       Ret += ",\n";
1300     Ret += "    " + EnumName;
1301   }
1302   Ret += "\n  };\n\n";
1303   return Ret;
1304 }
1305 
1306 void WriteSemanticSpellingSwitch(const std::string &VarName,
1307                                  const SemanticSpellingMap &Map,
1308                                  raw_ostream &OS) {
1309   OS << "  switch (" << VarName << ") {\n    default: "
1310     << "llvm_unreachable(\"Unknown spelling list index\");\n";
1311   for (const auto &I : Map)
1312     OS << "    case " << I.first << ": return " << I.second << ";\n";
1313   OS << "  }\n";
1314 }
1315 
1316 // Emits the LateParsed property for attributes.
1317 static void emitClangAttrLateParsedList(RecordKeeper &Records, raw_ostream &OS) {
1318   OS << "#if defined(CLANG_ATTR_LATE_PARSED_LIST)\n";
1319   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
1320 
1321   for (const auto *Attr : Attrs) {
1322     bool LateParsed = Attr->getValueAsBit("LateParsed");
1323 
1324     if (LateParsed) {
1325       std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr);
1326 
1327       // FIXME: Handle non-GNU attributes
1328       for (const auto &I : Spellings) {
1329         if (I.variety() != "GNU")
1330           continue;
1331         OS << ".Case(\"" << I.name() << "\", " << LateParsed << ")\n";
1332       }
1333     }
1334   }
1335   OS << "#endif // CLANG_ATTR_LATE_PARSED_LIST\n\n";
1336 }
1337 
1338 /// \brief Emits the first-argument-is-type property for attributes.
1339 static void emitClangAttrTypeArgList(RecordKeeper &Records, raw_ostream &OS) {
1340   OS << "#if defined(CLANG_ATTR_TYPE_ARG_LIST)\n";
1341   std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
1342 
1343   for (const auto *Attr : Attrs) {
1344     // Determine whether the first argument is a type.
1345     std::vector<Record *> Args = Attr->getValueAsListOfDefs("Args");
1346     if (Args.empty())
1347       continue;
1348 
1349     if (Args[0]->getSuperClasses().back()->getName() != "TypeArgument")
1350       continue;
1351 
1352     // All these spellings take a single type argument.
1353     std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr);
1354     std::set<std::string> Emitted;
1355     for (const auto &S : Spellings) {
1356       if (Emitted.insert(S.name()).second)
1357         OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
1358     }
1359   }
1360   OS << "#endif // CLANG_ATTR_TYPE_ARG_LIST\n\n";
1361 }
1362 
1363 /// \brief Emits the parse-arguments-in-unevaluated-context property for
1364 /// attributes.
1365 static void emitClangAttrArgContextList(RecordKeeper &Records, raw_ostream &OS) {
1366   OS << "#if defined(CLANG_ATTR_ARG_CONTEXT_LIST)\n";
1367   ParsedAttrMap Attrs = getParsedAttrList(Records);
1368   for (const auto &I : Attrs) {
1369     const Record &Attr = *I.second;
1370 
1371     if (!Attr.getValueAsBit("ParseArgumentsAsUnevaluated"))
1372       continue;
1373 
1374     // All these spellings take are parsed unevaluated.
1375     std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
1376     std::set<std::string> Emitted;
1377     for (const auto &S : Spellings) {
1378       if (Emitted.insert(S.name()).second)
1379         OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
1380     }
1381   }
1382   OS << "#endif // CLANG_ATTR_ARG_CONTEXT_LIST\n\n";
1383 }
1384 
1385 static bool isIdentifierArgument(Record *Arg) {
1386   return !Arg->getSuperClasses().empty() &&
1387     llvm::StringSwitch<bool>(Arg->getSuperClasses().back()->getName())
1388     .Case("IdentifierArgument", true)
1389     .Case("EnumArgument", true)
1390     .Default(false);
1391 }
1392 
1393 // Emits the first-argument-is-identifier property for attributes.
1394 static void emitClangAttrIdentifierArgList(RecordKeeper &Records, raw_ostream &OS) {
1395   OS << "#if defined(CLANG_ATTR_IDENTIFIER_ARG_LIST)\n";
1396   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
1397 
1398   for (const auto *Attr : Attrs) {
1399     // Determine whether the first argument is an identifier.
1400     std::vector<Record *> Args = Attr->getValueAsListOfDefs("Args");
1401     if (Args.empty() || !isIdentifierArgument(Args[0]))
1402       continue;
1403 
1404     // All these spellings take an identifier argument.
1405     std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr);
1406     std::set<std::string> Emitted;
1407     for (const auto &S : Spellings) {
1408       if (Emitted.insert(S.name()).second)
1409         OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
1410     }
1411   }
1412   OS << "#endif // CLANG_ATTR_IDENTIFIER_ARG_LIST\n\n";
1413 }
1414 
1415 namespace clang {
1416 
1417 // Emits the class definitions for attributes.
1418 void EmitClangAttrClass(RecordKeeper &Records, raw_ostream &OS) {
1419   emitSourceFileHeader("Attribute classes' definitions", OS);
1420 
1421   OS << "#ifndef LLVM_CLANG_ATTR_CLASSES_INC\n";
1422   OS << "#define LLVM_CLANG_ATTR_CLASSES_INC\n\n";
1423 
1424   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
1425 
1426   for (const auto *Attr : Attrs) {
1427     const Record &R = *Attr;
1428 
1429     // FIXME: Currently, documentation is generated as-needed due to the fact
1430     // that there is no way to allow a generated project "reach into" the docs
1431     // directory (for instance, it may be an out-of-tree build). However, we want
1432     // to ensure that every attribute has a Documentation field, and produce an
1433     // error if it has been neglected. Otherwise, the on-demand generation which
1434     // happens server-side will fail. This code is ensuring that functionality,
1435     // even though this Emitter doesn't technically need the documentation.
1436     // When attribute documentation can be generated as part of the build
1437     // itself, this code can be removed.
1438     (void)R.getValueAsListOfDefs("Documentation");
1439 
1440     if (!R.getValueAsBit("ASTNode"))
1441       continue;
1442 
1443     const std::vector<Record *> Supers = R.getSuperClasses();
1444     assert(!Supers.empty() && "Forgot to specify a superclass for the attr");
1445     std::string SuperName;
1446     for (const auto *Super : llvm::make_range(Supers.rbegin(), Supers.rend())) {
1447       const Record &R = *Super;
1448       if (R.getName() != "TargetSpecificAttr" && SuperName.empty())
1449         SuperName = R.getName();
1450     }
1451 
1452     OS << "class " << R.getName() << "Attr : public " << SuperName << " {\n";
1453 
1454     std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
1455     std::vector<std::unique_ptr<Argument>> Args;
1456     Args.reserve(ArgRecords.size());
1457 
1458     for (const auto *ArgRecord : ArgRecords) {
1459       Args.emplace_back(createArgument(*ArgRecord, R.getName()));
1460       Args.back()->writeDeclarations(OS);
1461       OS << "\n\n";
1462     }
1463 
1464     OS << "\npublic:\n";
1465 
1466     std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
1467 
1468     // If there are zero or one spellings, all spelling-related functionality
1469     // can be elided. If all of the spellings share the same name, the spelling
1470     // functionality can also be elided.
1471     bool ElideSpelling = (Spellings.size() <= 1) ||
1472                          SpellingNamesAreCommon(Spellings);
1473 
1474     // This maps spelling index values to semantic Spelling enumerants.
1475     SemanticSpellingMap SemanticToSyntacticMap;
1476 
1477     if (!ElideSpelling)
1478       OS << CreateSemanticSpellings(Spellings, SemanticToSyntacticMap);
1479 
1480     OS << "  static " << R.getName() << "Attr *CreateImplicit(";
1481     OS << "ASTContext &Ctx";
1482     if (!ElideSpelling)
1483       OS << ", Spelling S";
1484     for (auto const &ai : Args) {
1485       OS << ", ";
1486       ai->writeCtorParameters(OS);
1487     }
1488     OS << ", SourceRange Loc = SourceRange()";
1489     OS << ") {\n";
1490     OS << "    " << R.getName() << "Attr *A = new (Ctx) " << R.getName();
1491     OS << "Attr(Loc, Ctx, ";
1492     for (auto const &ai : Args) {
1493       ai->writeImplicitCtorArgs(OS);
1494       OS << ", ";
1495     }
1496     OS << (ElideSpelling ? "0" : "S") << ");\n";
1497     OS << "    A->setImplicit(true);\n";
1498     OS << "    return A;\n  }\n\n";
1499 
1500     OS << "  " << R.getName() << "Attr(SourceRange R, ASTContext &Ctx\n";
1501 
1502     bool HasOpt = false;
1503     for (auto const &ai : Args) {
1504       OS << "              , ";
1505       ai->writeCtorParameters(OS);
1506       OS << "\n";
1507       if (ai->isOptional())
1508         HasOpt = true;
1509     }
1510 
1511     OS << "              , ";
1512     OS << "unsigned SI\n";
1513 
1514     OS << "             )\n";
1515     OS << "    : " << SuperName << "(attr::" << R.getName() << ", R, SI)\n";
1516 
1517     for (auto const &ai : Args) {
1518       OS << "              , ";
1519       ai->writeCtorInitializers(OS);
1520       OS << "\n";
1521     }
1522 
1523     OS << "  {\n";
1524 
1525     for (auto const &ai : Args) {
1526       ai->writeCtorBody(OS);
1527       OS << "\n";
1528     }
1529     OS << "  }\n\n";
1530 
1531     // If there are optional arguments, write out a constructor that elides the
1532     // optional arguments as well.
1533     if (HasOpt) {
1534       OS << "  " << R.getName() << "Attr(SourceRange R, ASTContext &Ctx\n";
1535       for (auto const &ai : Args) {
1536         if (!ai->isOptional()) {
1537           OS << "              , ";
1538           ai->writeCtorParameters(OS);
1539           OS << "\n";
1540         }
1541       }
1542 
1543       OS << "              , ";
1544       OS << "unsigned SI\n";
1545 
1546       OS << "             )\n";
1547       OS << "    : " << SuperName << "(attr::" << R.getName() << ", R, SI)\n";
1548 
1549       for (auto const &ai : Args) {
1550         OS << "              , ";
1551         ai->writeCtorDefaultInitializers(OS);
1552         OS << "\n";
1553       }
1554 
1555       OS << "  {\n";
1556 
1557       for (auto const &ai : Args) {
1558         if (!ai->isOptional()) {
1559           ai->writeCtorBody(OS);
1560           OS << "\n";
1561         }
1562       }
1563       OS << "  }\n\n";
1564     }
1565 
1566     OS << "  " << R.getName() << "Attr *clone(ASTContext &C) const override;\n";
1567     OS << "  void printPretty(raw_ostream &OS,\n"
1568        << "                   const PrintingPolicy &Policy) const override;\n";
1569     OS << "  const char *getSpelling() const override;\n";
1570 
1571     if (!ElideSpelling) {
1572       assert(!SemanticToSyntacticMap.empty() && "Empty semantic mapping list");
1573       OS << "  Spelling getSemanticSpelling() const {\n";
1574       WriteSemanticSpellingSwitch("SpellingListIndex", SemanticToSyntacticMap,
1575                                   OS);
1576       OS << "  }\n";
1577     }
1578 
1579     writeAttrAccessorDefinition(R, OS);
1580 
1581     for (auto const &ai : Args) {
1582       ai->writeAccessors(OS);
1583       OS << "\n\n";
1584 
1585       if (ai->isEnumArg())
1586         static_cast<const EnumArgument *>(ai.get())->writeConversion(OS);
1587       else if (ai->isVariadicEnumArg())
1588         static_cast<const VariadicEnumArgument *>(ai.get())
1589             ->writeConversion(OS);
1590     }
1591 
1592     OS << R.getValueAsString("AdditionalMembers");
1593     OS << "\n\n";
1594 
1595     OS << "  static bool classof(const Attr *A) { return A->getKind() == "
1596        << "attr::" << R.getName() << "; }\n";
1597 
1598     bool LateParsed = R.getValueAsBit("LateParsed");
1599     OS << "  bool isLateParsed() const override { return "
1600        << LateParsed << "; }\n";
1601 
1602     if (R.getValueAsBit("DuplicatesAllowedWhileMerging"))
1603       OS << "  bool duplicatesAllowed() const override { return true; }\n\n";
1604 
1605     OS << "};\n\n";
1606   }
1607 
1608   OS << "#endif\n";
1609 }
1610 
1611 // Emits the class method definitions for attributes.
1612 void EmitClangAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
1613   emitSourceFileHeader("Attribute classes' member function definitions", OS);
1614 
1615   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
1616 
1617   for (auto *Attr : Attrs) {
1618     Record &R = *Attr;
1619 
1620     if (!R.getValueAsBit("ASTNode"))
1621       continue;
1622 
1623     std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
1624     std::vector<std::unique_ptr<Argument>> Args;
1625     for (const auto *Arg : ArgRecords)
1626       Args.emplace_back(createArgument(*Arg, R.getName()));
1627 
1628     for (auto const &ai : Args)
1629       ai->writeAccessorDefinitions(OS);
1630 
1631     OS << R.getName() << "Attr *" << R.getName()
1632        << "Attr::clone(ASTContext &C) const {\n";
1633     OS << "  auto *A = new (C) " << R.getName() << "Attr(getLocation(), C";
1634     for (auto const &ai : Args) {
1635       OS << ", ";
1636       ai->writeCloneArgs(OS);
1637     }
1638     OS << ", getSpellingListIndex());\n";
1639     OS << "  A->Inherited = Inherited;\n";
1640     OS << "  A->IsPackExpansion = IsPackExpansion;\n";
1641     OS << "  A->Implicit = Implicit;\n";
1642     OS << "  return A;\n}\n\n";
1643 
1644     writePrettyPrintFunction(R, Args, OS);
1645     writeGetSpellingFunction(R, OS);
1646   }
1647 }
1648 
1649 } // end namespace clang
1650 
1651 static void EmitAttrList(raw_ostream &OS, StringRef Class,
1652                          const std::vector<Record*> &AttrList) {
1653   std::vector<Record*>::const_iterator i = AttrList.begin(), e = AttrList.end();
1654 
1655   if (i != e) {
1656     // Move the end iterator back to emit the last attribute.
1657     for(--e; i != e; ++i) {
1658       if (!(*i)->getValueAsBit("ASTNode"))
1659         continue;
1660 
1661       OS << Class << "(" << (*i)->getName() << ")\n";
1662     }
1663 
1664     OS << "LAST_" << Class << "(" << (*i)->getName() << ")\n\n";
1665   }
1666 }
1667 
1668 // Determines if an attribute has a Pragma spelling.
1669 static bool AttrHasPragmaSpelling(const Record *R) {
1670   std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*R);
1671   return std::find_if(Spellings.begin(), Spellings.end(),
1672                       [](const FlattenedSpelling &S) {
1673            return S.variety() == "Pragma";
1674          }) != Spellings.end();
1675 }
1676 
1677 namespace clang {
1678 // Emits the enumeration list for attributes.
1679 void EmitClangAttrList(RecordKeeper &Records, raw_ostream &OS) {
1680   emitSourceFileHeader("List of all attributes that Clang recognizes", OS);
1681 
1682   OS << "#ifndef LAST_ATTR\n";
1683   OS << "#define LAST_ATTR(NAME) ATTR(NAME)\n";
1684   OS << "#endif\n\n";
1685 
1686   OS << "#ifndef INHERITABLE_ATTR\n";
1687   OS << "#define INHERITABLE_ATTR(NAME) ATTR(NAME)\n";
1688   OS << "#endif\n\n";
1689 
1690   OS << "#ifndef LAST_INHERITABLE_ATTR\n";
1691   OS << "#define LAST_INHERITABLE_ATTR(NAME) INHERITABLE_ATTR(NAME)\n";
1692   OS << "#endif\n\n";
1693 
1694   OS << "#ifndef INHERITABLE_PARAM_ATTR\n";
1695   OS << "#define INHERITABLE_PARAM_ATTR(NAME) ATTR(NAME)\n";
1696   OS << "#endif\n\n";
1697 
1698   OS << "#ifndef LAST_INHERITABLE_PARAM_ATTR\n";
1699   OS << "#define LAST_INHERITABLE_PARAM_ATTR(NAME)"
1700         " INHERITABLE_PARAM_ATTR(NAME)\n";
1701   OS << "#endif\n\n";
1702 
1703   OS << "#ifndef PRAGMA_SPELLING_ATTR\n";
1704   OS << "#define PRAGMA_SPELLING_ATTR(NAME)\n";
1705   OS << "#endif\n\n";
1706 
1707   OS << "#ifndef LAST_PRAGMA_SPELLING_ATTR\n";
1708   OS << "#define LAST_PRAGMA_SPELLING_ATTR(NAME) PRAGMA_SPELLING_ATTR(NAME)\n";
1709   OS << "#endif\n\n";
1710 
1711   Record *InhClass = Records.getClass("InheritableAttr");
1712   Record *InhParamClass = Records.getClass("InheritableParamAttr");
1713   std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"),
1714                         NonInhAttrs, InhAttrs, InhParamAttrs, PragmaAttrs;
1715   for (auto *Attr : Attrs) {
1716     if (!Attr->getValueAsBit("ASTNode"))
1717       continue;
1718 
1719     if (AttrHasPragmaSpelling(Attr))
1720       PragmaAttrs.push_back(Attr);
1721 
1722     if (Attr->isSubClassOf(InhParamClass))
1723       InhParamAttrs.push_back(Attr);
1724     else if (Attr->isSubClassOf(InhClass))
1725       InhAttrs.push_back(Attr);
1726     else
1727       NonInhAttrs.push_back(Attr);
1728   }
1729 
1730   EmitAttrList(OS, "PRAGMA_SPELLING_ATTR", PragmaAttrs);
1731   EmitAttrList(OS, "INHERITABLE_PARAM_ATTR", InhParamAttrs);
1732   EmitAttrList(OS, "INHERITABLE_ATTR", InhAttrs);
1733   EmitAttrList(OS, "ATTR", NonInhAttrs);
1734 
1735   OS << "#undef LAST_ATTR\n";
1736   OS << "#undef INHERITABLE_ATTR\n";
1737   OS << "#undef LAST_INHERITABLE_ATTR\n";
1738   OS << "#undef LAST_INHERITABLE_PARAM_ATTR\n";
1739   OS << "#undef LAST_PRAGMA_ATTR\n";
1740   OS << "#undef PRAGMA_SPELLING_ATTR\n";
1741   OS << "#undef ATTR\n";
1742 }
1743 
1744 // Emits the code to read an attribute from a precompiled header.
1745 void EmitClangAttrPCHRead(RecordKeeper &Records, raw_ostream &OS) {
1746   emitSourceFileHeader("Attribute deserialization code", OS);
1747 
1748   Record *InhClass = Records.getClass("InheritableAttr");
1749   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"),
1750                        ArgRecords;
1751   std::vector<std::unique_ptr<Argument>> Args;
1752 
1753   OS << "  switch (Kind) {\n";
1754   OS << "  default:\n";
1755   OS << "    llvm_unreachable(\"Unknown attribute!\");\n";
1756   for (const auto *Attr : Attrs) {
1757     const Record &R = *Attr;
1758     if (!R.getValueAsBit("ASTNode"))
1759       continue;
1760 
1761     OS << "  case attr::" << R.getName() << ": {\n";
1762     if (R.isSubClassOf(InhClass))
1763       OS << "    bool isInherited = Record[Idx++];\n";
1764     OS << "    bool isImplicit = Record[Idx++];\n";
1765     OS << "    unsigned Spelling = Record[Idx++];\n";
1766     ArgRecords = R.getValueAsListOfDefs("Args");
1767     Args.clear();
1768     for (const auto *Arg : ArgRecords) {
1769       Args.emplace_back(createArgument(*Arg, R.getName()));
1770       Args.back()->writePCHReadDecls(OS);
1771     }
1772     OS << "    New = new (Context) " << R.getName() << "Attr(Range, Context";
1773     for (auto const &ri : Args) {
1774       OS << ", ";
1775       ri->writePCHReadArgs(OS);
1776     }
1777     OS << ", Spelling);\n";
1778     if (R.isSubClassOf(InhClass))
1779       OS << "    cast<InheritableAttr>(New)->setInherited(isInherited);\n";
1780     OS << "    New->setImplicit(isImplicit);\n";
1781     OS << "    break;\n";
1782     OS << "  }\n";
1783   }
1784   OS << "  }\n";
1785 }
1786 
1787 // Emits the code to write an attribute to a precompiled header.
1788 void EmitClangAttrPCHWrite(RecordKeeper &Records, raw_ostream &OS) {
1789   emitSourceFileHeader("Attribute serialization code", OS);
1790 
1791   Record *InhClass = Records.getClass("InheritableAttr");
1792   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args;
1793 
1794   OS << "  switch (A->getKind()) {\n";
1795   OS << "  default:\n";
1796   OS << "    llvm_unreachable(\"Unknown attribute kind!\");\n";
1797   OS << "    break;\n";
1798   for (const auto *Attr : Attrs) {
1799     const Record &R = *Attr;
1800     if (!R.getValueAsBit("ASTNode"))
1801       continue;
1802     OS << "  case attr::" << R.getName() << ": {\n";
1803     Args = R.getValueAsListOfDefs("Args");
1804     if (R.isSubClassOf(InhClass) || !Args.empty())
1805       OS << "    const " << R.getName() << "Attr *SA = cast<" << R.getName()
1806          << "Attr>(A);\n";
1807     if (R.isSubClassOf(InhClass))
1808       OS << "    Record.push_back(SA->isInherited());\n";
1809     OS << "    Record.push_back(A->isImplicit());\n";
1810     OS << "    Record.push_back(A->getSpellingListIndex());\n";
1811 
1812     for (const auto *Arg : Args)
1813       createArgument(*Arg, R.getName())->writePCHWrite(OS);
1814     OS << "    break;\n";
1815     OS << "  }\n";
1816   }
1817   OS << "  }\n";
1818 }
1819 
1820 static void GenerateHasAttrSpellingStringSwitch(
1821     const std::vector<Record *> &Attrs, raw_ostream &OS,
1822     const std::string &Variety = "", const std::string &Scope = "") {
1823   for (const auto *Attr : Attrs) {
1824     // C++11-style attributes have specific version information associated with
1825     // them. If the attribute has no scope, the version information must not
1826     // have the default value (1), as that's incorrect. Instead, the unscoped
1827     // attribute version information should be taken from the SD-6 standing
1828     // document, which can be found at:
1829     // https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations
1830     int Version = 1;
1831 
1832     if (Variety == "CXX11") {
1833         std::vector<Record *> Spellings = Attr->getValueAsListOfDefs("Spellings");
1834         for (const auto &Spelling : Spellings) {
1835           if (Spelling->getValueAsString("Variety") == "CXX11") {
1836             Version = static_cast<int>(Spelling->getValueAsInt("Version"));
1837             if (Scope.empty() && Version == 1)
1838               PrintError(Spelling->getLoc(), "C++ standard attributes must "
1839               "have valid version information.");
1840             break;
1841           }
1842       }
1843     }
1844 
1845     // It is assumed that there will be an llvm::Triple object named T within
1846     // scope that can be used to determine whether the attribute exists in
1847     // a given target.
1848     std::string Test;
1849     if (Attr->isSubClassOf("TargetSpecificAttr")) {
1850       const Record *R = Attr->getValueAsDef("Target");
1851       std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches");
1852 
1853       Test += "(";
1854       for (auto AI = Arches.begin(), AE = Arches.end(); AI != AE; ++AI) {
1855         std::string Part = *AI;
1856         Test += "T.getArch() == llvm::Triple::" + Part;
1857         if (AI + 1 != AE)
1858           Test += " || ";
1859       }
1860       Test += ")";
1861 
1862       std::vector<std::string> OSes;
1863       if (!R->isValueUnset("OSes")) {
1864         Test += " && (";
1865         std::vector<std::string> OSes = R->getValueAsListOfStrings("OSes");
1866         for (auto AI = OSes.begin(), AE = OSes.end(); AI != AE; ++AI) {
1867           std::string Part = *AI;
1868 
1869           Test += "T.getOS() == llvm::Triple::" + Part;
1870           if (AI + 1 != AE)
1871             Test += " || ";
1872         }
1873         Test += ")";
1874       }
1875 
1876       // If this is the C++11 variety, also add in the LangOpts test.
1877       if (Variety == "CXX11")
1878         Test += " && LangOpts.CPlusPlus11";
1879     } else if (Variety == "CXX11")
1880       // C++11 mode should be checked against LangOpts, which is presumed to be
1881       // present in the caller.
1882       Test = "LangOpts.CPlusPlus11";
1883 
1884     std::string TestStr =
1885         !Test.empty() ? Test + " ? " + llvm::itostr(Version) + " : 0" : "1";
1886     std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr);
1887     for (const auto &S : Spellings)
1888       if (Variety.empty() || (Variety == S.variety() &&
1889                               (Scope.empty() || Scope == S.nameSpace())))
1890         OS << "    .Case(\"" << S.name() << "\", " << TestStr << ")\n";
1891   }
1892   OS << "    .Default(0);\n";
1893 }
1894 
1895 // Emits the list of spellings for attributes.
1896 void EmitClangAttrHasAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
1897   emitSourceFileHeader("Code to implement the __has_attribute logic", OS);
1898 
1899   // Separate all of the attributes out into four group: generic, C++11, GNU,
1900   // and declspecs. Then generate a big switch statement for each of them.
1901   std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
1902   std::vector<Record *> Declspec, GNU, Pragma;
1903   std::map<std::string, std::vector<Record *>> CXX;
1904 
1905   // Walk over the list of all attributes, and split them out based on the
1906   // spelling variety.
1907   for (auto *R : Attrs) {
1908     std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*R);
1909     for (const auto &SI : Spellings) {
1910       std::string Variety = SI.variety();
1911       if (Variety == "GNU")
1912         GNU.push_back(R);
1913       else if (Variety == "Declspec")
1914         Declspec.push_back(R);
1915       else if (Variety == "CXX11")
1916         CXX[SI.nameSpace()].push_back(R);
1917       else if (Variety == "Pragma")
1918         Pragma.push_back(R);
1919     }
1920   }
1921 
1922   OS << "switch (Syntax) {\n";
1923   OS << "case AttrSyntax::GNU:\n";
1924   OS << "  return llvm::StringSwitch<int>(Name)\n";
1925   GenerateHasAttrSpellingStringSwitch(GNU, OS, "GNU");
1926   OS << "case AttrSyntax::Declspec:\n";
1927   OS << "  return llvm::StringSwitch<int>(Name)\n";
1928   GenerateHasAttrSpellingStringSwitch(Declspec, OS, "Declspec");
1929   OS << "case AttrSyntax::Pragma:\n";
1930   OS << "  return llvm::StringSwitch<int>(Name)\n";
1931   GenerateHasAttrSpellingStringSwitch(Pragma, OS, "Pragma");
1932   OS << "case AttrSyntax::CXX: {\n";
1933   // C++11-style attributes are further split out based on the Scope.
1934   for (std::map<std::string, std::vector<Record *>>::iterator I = CXX.begin(),
1935                                                               E = CXX.end();
1936        I != E; ++I) {
1937     if (I != CXX.begin())
1938       OS << " else ";
1939     if (I->first.empty())
1940       OS << "if (!Scope || Scope->getName() == \"\") {\n";
1941     else
1942       OS << "if (Scope->getName() == \"" << I->first << "\") {\n";
1943     OS << "  return llvm::StringSwitch<int>(Name)\n";
1944     GenerateHasAttrSpellingStringSwitch(I->second, OS, "CXX11", I->first);
1945     OS << "}";
1946   }
1947   OS << "\n}\n";
1948   OS << "}\n";
1949 }
1950 
1951 void EmitClangAttrSpellingListIndex(RecordKeeper &Records, raw_ostream &OS) {
1952   emitSourceFileHeader("Code to translate different attribute spellings "
1953                        "into internal identifiers", OS);
1954 
1955   OS <<
1956     "  switch (AttrKind) {\n"
1957     "  default:\n"
1958     "    llvm_unreachable(\"Unknown attribute kind!\");\n"
1959     "    break;\n";
1960 
1961   ParsedAttrMap Attrs = getParsedAttrList(Records);
1962   for (const auto &I : Attrs) {
1963     const Record &R = *I.second;
1964     std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
1965     OS << "  case AT_" << I.first << ": {\n";
1966     for (unsigned I = 0; I < Spellings.size(); ++ I) {
1967       OS << "    if (Name == \"" << Spellings[I].name() << "\" && "
1968          << "SyntaxUsed == "
1969          << StringSwitch<unsigned>(Spellings[I].variety())
1970                 .Case("GNU", 0)
1971                 .Case("CXX11", 1)
1972                 .Case("Declspec", 2)
1973                 .Case("Keyword", 3)
1974                 .Case("Pragma", 4)
1975                 .Default(0)
1976          << " && Scope == \"" << Spellings[I].nameSpace() << "\")\n"
1977          << "        return " << I << ";\n";
1978     }
1979 
1980     OS << "    break;\n";
1981     OS << "  }\n";
1982   }
1983 
1984   OS << "  }\n";
1985   OS << "  return 0;\n";
1986 }
1987 
1988 // Emits code used by RecursiveASTVisitor to visit attributes
1989 void EmitClangAttrASTVisitor(RecordKeeper &Records, raw_ostream &OS) {
1990   emitSourceFileHeader("Used by RecursiveASTVisitor to visit attributes.", OS);
1991 
1992   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
1993 
1994   // Write method declarations for Traverse* methods.
1995   // We emit this here because we only generate methods for attributes that
1996   // are declared as ASTNodes.
1997   OS << "#ifdef ATTR_VISITOR_DECLS_ONLY\n\n";
1998   for (const auto *Attr : Attrs) {
1999     const Record &R = *Attr;
2000     if (!R.getValueAsBit("ASTNode"))
2001       continue;
2002     OS << "  bool Traverse"
2003        << R.getName() << "Attr(" << R.getName() << "Attr *A);\n";
2004     OS << "  bool Visit"
2005        << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n"
2006        << "    return true; \n"
2007        << "  };\n";
2008   }
2009   OS << "\n#else // ATTR_VISITOR_DECLS_ONLY\n\n";
2010 
2011   // Write individual Traverse* methods for each attribute class.
2012   for (const auto *Attr : Attrs) {
2013     const Record &R = *Attr;
2014     if (!R.getValueAsBit("ASTNode"))
2015       continue;
2016 
2017     OS << "template <typename Derived>\n"
2018        << "bool VISITORCLASS<Derived>::Traverse"
2019        << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n"
2020        << "  if (!getDerived().VisitAttr(A))\n"
2021        << "    return false;\n"
2022        << "  if (!getDerived().Visit" << R.getName() << "Attr(A))\n"
2023        << "    return false;\n";
2024 
2025     std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
2026     for (const auto *Arg : ArgRecords)
2027       createArgument(*Arg, R.getName())->writeASTVisitorTraversal(OS);
2028 
2029     OS << "  return true;\n";
2030     OS << "}\n\n";
2031   }
2032 
2033   // Write generic Traverse routine
2034   OS << "template <typename Derived>\n"
2035      << "bool VISITORCLASS<Derived>::TraverseAttr(Attr *A) {\n"
2036      << "  if (!A)\n"
2037      << "    return true;\n"
2038      << "\n"
2039      << "  switch (A->getKind()) {\n"
2040      << "    default:\n"
2041      << "      return true;\n";
2042 
2043   for (const auto *Attr : Attrs) {
2044     const Record &R = *Attr;
2045     if (!R.getValueAsBit("ASTNode"))
2046       continue;
2047 
2048     OS << "    case attr::" << R.getName() << ":\n"
2049        << "      return getDerived().Traverse" << R.getName() << "Attr("
2050        << "cast<" << R.getName() << "Attr>(A));\n";
2051   }
2052   OS << "  }\n";  // end case
2053   OS << "}\n";  // end function
2054   OS << "#endif  // ATTR_VISITOR_DECLS_ONLY\n";
2055 }
2056 
2057 // Emits code to instantiate dependent attributes on templates.
2058 void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS) {
2059   emitSourceFileHeader("Template instantiation code for attributes", OS);
2060 
2061   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
2062 
2063   OS << "namespace clang {\n"
2064      << "namespace sema {\n\n"
2065      << "Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, "
2066      << "Sema &S,\n"
2067      << "        const MultiLevelTemplateArgumentList &TemplateArgs) {\n"
2068      << "  switch (At->getKind()) {\n"
2069      << "    default:\n"
2070      << "      break;\n";
2071 
2072   for (const auto *Attr : Attrs) {
2073     const Record &R = *Attr;
2074     if (!R.getValueAsBit("ASTNode"))
2075       continue;
2076 
2077     OS << "    case attr::" << R.getName() << ": {\n";
2078     bool ShouldClone = R.getValueAsBit("Clone");
2079 
2080     if (!ShouldClone) {
2081       OS << "      return NULL;\n";
2082       OS << "    }\n";
2083       continue;
2084     }
2085 
2086     OS << "      const " << R.getName() << "Attr *A = cast<"
2087        << R.getName() << "Attr>(At);\n";
2088     bool TDependent = R.getValueAsBit("TemplateDependent");
2089 
2090     if (!TDependent) {
2091       OS << "      return A->clone(C);\n";
2092       OS << "    }\n";
2093       continue;
2094     }
2095 
2096     std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
2097     std::vector<std::unique_ptr<Argument>> Args;
2098     Args.reserve(ArgRecords.size());
2099 
2100     for (const auto *ArgRecord : ArgRecords)
2101       Args.emplace_back(createArgument(*ArgRecord, R.getName()));
2102 
2103     for (auto const &ai : Args)
2104       ai->writeTemplateInstantiation(OS);
2105 
2106     OS << "      return new (C) " << R.getName() << "Attr(A->getLocation(), C";
2107     for (auto const &ai : Args) {
2108       OS << ", ";
2109       ai->writeTemplateInstantiationArgs(OS);
2110     }
2111     OS << ", A->getSpellingListIndex());\n    }\n";
2112   }
2113   OS << "  } // end switch\n"
2114      << "  llvm_unreachable(\"Unknown attribute!\");\n"
2115      << "  return 0;\n"
2116      << "}\n\n"
2117      << "} // end namespace sema\n"
2118      << "} // end namespace clang\n";
2119 }
2120 
2121 // Emits the list of parsed attributes.
2122 void EmitClangAttrParsedAttrList(RecordKeeper &Records, raw_ostream &OS) {
2123   emitSourceFileHeader("List of all attributes that Clang recognizes", OS);
2124 
2125   OS << "#ifndef PARSED_ATTR\n";
2126   OS << "#define PARSED_ATTR(NAME) NAME\n";
2127   OS << "#endif\n\n";
2128 
2129   ParsedAttrMap Names = getParsedAttrList(Records);
2130   for (const auto &I : Names) {
2131     OS << "PARSED_ATTR(" << I.first << ")\n";
2132   }
2133 }
2134 
2135 static bool isArgVariadic(const Record &R, StringRef AttrName) {
2136   return createArgument(R, AttrName)->isVariadic();
2137 }
2138 
2139 static void emitArgInfo(const Record &R, std::stringstream &OS) {
2140   // This function will count the number of arguments specified for the
2141   // attribute and emit the number of required arguments followed by the
2142   // number of optional arguments.
2143   std::vector<Record *> Args = R.getValueAsListOfDefs("Args");
2144   unsigned ArgCount = 0, OptCount = 0;
2145   bool HasVariadic = false;
2146   for (const auto *Arg : Args) {
2147     Arg->getValueAsBit("Optional") ? ++OptCount : ++ArgCount;
2148     if (!HasVariadic && isArgVariadic(*Arg, R.getName()))
2149       HasVariadic = true;
2150   }
2151 
2152   // If there is a variadic argument, we will set the optional argument count
2153   // to its largest value. Since it's currently a 4-bit number, we set it to 15.
2154   OS << ArgCount << ", " << (HasVariadic ? 15 : OptCount);
2155 }
2156 
2157 static void GenerateDefaultAppertainsTo(raw_ostream &OS) {
2158   OS << "static bool defaultAppertainsTo(Sema &, const AttributeList &,";
2159   OS << "const Decl *) {\n";
2160   OS << "  return true;\n";
2161   OS << "}\n\n";
2162 }
2163 
2164 static std::string CalculateDiagnostic(const Record &S) {
2165   // If the SubjectList object has a custom diagnostic associated with it,
2166   // return that directly.
2167   std::string CustomDiag = S.getValueAsString("CustomDiag");
2168   if (!CustomDiag.empty())
2169     return CustomDiag;
2170 
2171   // Given the list of subjects, determine what diagnostic best fits.
2172   enum {
2173     Func = 1U << 0,
2174     Var = 1U << 1,
2175     ObjCMethod = 1U << 2,
2176     Param = 1U << 3,
2177     Class = 1U << 4,
2178     GenericRecord = 1U << 5,
2179     Type = 1U << 6,
2180     ObjCIVar = 1U << 7,
2181     ObjCProp = 1U << 8,
2182     ObjCInterface = 1U << 9,
2183     Block = 1U << 10,
2184     Namespace = 1U << 11,
2185     Field = 1U << 12,
2186     CXXMethod = 1U << 13,
2187     ObjCProtocol = 1U << 14,
2188     Enum = 1U << 15
2189   };
2190   uint32_t SubMask = 0;
2191 
2192   std::vector<Record *> Subjects = S.getValueAsListOfDefs("Subjects");
2193   for (const auto *Subject : Subjects) {
2194     const Record &R = *Subject;
2195     std::string Name;
2196 
2197     if (R.isSubClassOf("SubsetSubject")) {
2198       PrintError(R.getLoc(), "SubsetSubjects should use a custom diagnostic");
2199       // As a fallback, look through the SubsetSubject to see what its base
2200       // type is, and use that. This needs to be updated if SubsetSubjects
2201       // are allowed within other SubsetSubjects.
2202       Name = R.getValueAsDef("Base")->getName();
2203     } else
2204       Name = R.getName();
2205 
2206     uint32_t V = StringSwitch<uint32_t>(Name)
2207                    .Case("Function", Func)
2208                    .Case("Var", Var)
2209                    .Case("ObjCMethod", ObjCMethod)
2210                    .Case("ParmVar", Param)
2211                    .Case("TypedefName", Type)
2212                    .Case("ObjCIvar", ObjCIVar)
2213                    .Case("ObjCProperty", ObjCProp)
2214                    .Case("Record", GenericRecord)
2215                    .Case("ObjCInterface", ObjCInterface)
2216                    .Case("ObjCProtocol", ObjCProtocol)
2217                    .Case("Block", Block)
2218                    .Case("CXXRecord", Class)
2219                    .Case("Namespace", Namespace)
2220                    .Case("Field", Field)
2221                    .Case("CXXMethod", CXXMethod)
2222                    .Case("Enum", Enum)
2223                    .Default(0);
2224     if (!V) {
2225       // Something wasn't in our mapping, so be helpful and let the developer
2226       // know about it.
2227       PrintFatalError(R.getLoc(), "Unknown subject type: " + R.getName());
2228       return "";
2229     }
2230 
2231     SubMask |= V;
2232   }
2233 
2234   switch (SubMask) {
2235     // For the simple cases where there's only a single entry in the mask, we
2236     // don't have to resort to bit fiddling.
2237     case Func:  return "ExpectedFunction";
2238     case Var:   return "ExpectedVariable";
2239     case Param: return "ExpectedParameter";
2240     case Class: return "ExpectedClass";
2241     case Enum:  return "ExpectedEnum";
2242     case CXXMethod:
2243       // FIXME: Currently, this maps to ExpectedMethod based on existing code,
2244       // but should map to something a bit more accurate at some point.
2245     case ObjCMethod:  return "ExpectedMethod";
2246     case Type:  return "ExpectedType";
2247     case ObjCInterface: return "ExpectedObjectiveCInterface";
2248     case ObjCProtocol: return "ExpectedObjectiveCProtocol";
2249 
2250     // "GenericRecord" means struct, union or class; check the language options
2251     // and if not compiling for C++, strip off the class part. Note that this
2252     // relies on the fact that the context for this declares "Sema &S".
2253     case GenericRecord:
2254       return "(S.getLangOpts().CPlusPlus ? ExpectedStructOrUnionOrClass : "
2255                                            "ExpectedStructOrUnion)";
2256     case Func | ObjCMethod | Block: return "ExpectedFunctionMethodOrBlock";
2257     case Func | ObjCMethod | Class: return "ExpectedFunctionMethodOrClass";
2258     case Func | Param:
2259     case Func | ObjCMethod | Param: return "ExpectedFunctionMethodOrParameter";
2260     case Func | ObjCMethod: return "ExpectedFunctionOrMethod";
2261     case Func | Var: return "ExpectedVariableOrFunction";
2262 
2263     // If not compiling for C++, the class portion does not apply.
2264     case Func | Var | Class:
2265       return "(S.getLangOpts().CPlusPlus ? ExpectedFunctionVariableOrClass : "
2266                                            "ExpectedVariableOrFunction)";
2267 
2268     case ObjCMethod | ObjCProp: return "ExpectedMethodOrProperty";
2269     case ObjCProtocol | ObjCInterface:
2270       return "ExpectedObjectiveCInterfaceOrProtocol";
2271     case Field | Var: return "ExpectedFieldOrGlobalVar";
2272   }
2273 
2274   PrintFatalError(S.getLoc(),
2275                   "Could not deduce diagnostic argument for Attr subjects");
2276 
2277   return "";
2278 }
2279 
2280 static std::string GetSubjectWithSuffix(const Record *R) {
2281   std::string B = R->getName();
2282   if (B == "DeclBase")
2283     return "Decl";
2284   return B + "Decl";
2285 }
2286 static std::string GenerateCustomAppertainsTo(const Record &Subject,
2287                                               raw_ostream &OS) {
2288   std::string FnName = "is" + Subject.getName();
2289 
2290   // If this code has already been generated, simply return the previous
2291   // instance of it.
2292   static std::set<std::string> CustomSubjectSet;
2293   std::set<std::string>::iterator I = CustomSubjectSet.find(FnName);
2294   if (I != CustomSubjectSet.end())
2295     return *I;
2296 
2297   Record *Base = Subject.getValueAsDef("Base");
2298 
2299   // Not currently support custom subjects within custom subjects.
2300   if (Base->isSubClassOf("SubsetSubject")) {
2301     PrintFatalError(Subject.getLoc(),
2302                     "SubsetSubjects within SubsetSubjects is not supported");
2303     return "";
2304   }
2305 
2306   OS << "static bool " << FnName << "(const Decl *D) {\n";
2307   OS << "  if (const " << GetSubjectWithSuffix(Base) << " *S = dyn_cast<";
2308   OS << GetSubjectWithSuffix(Base);
2309   OS << ">(D))\n";
2310   OS << "    return " << Subject.getValueAsString("CheckCode") << ";\n";
2311   OS << "  return false;\n";
2312   OS << "}\n\n";
2313 
2314   CustomSubjectSet.insert(FnName);
2315   return FnName;
2316 }
2317 
2318 static std::string GenerateAppertainsTo(const Record &Attr, raw_ostream &OS) {
2319   // If the attribute does not contain a Subjects definition, then use the
2320   // default appertainsTo logic.
2321   if (Attr.isValueUnset("Subjects"))
2322     return "defaultAppertainsTo";
2323 
2324   const Record *SubjectObj = Attr.getValueAsDef("Subjects");
2325   std::vector<Record*> Subjects = SubjectObj->getValueAsListOfDefs("Subjects");
2326 
2327   // If the list of subjects is empty, it is assumed that the attribute
2328   // appertains to everything.
2329   if (Subjects.empty())
2330     return "defaultAppertainsTo";
2331 
2332   bool Warn = SubjectObj->getValueAsDef("Diag")->getValueAsBit("Warn");
2333 
2334   // Otherwise, generate an appertainsTo check specific to this attribute which
2335   // checks all of the given subjects against the Decl passed in. Return the
2336   // name of that check to the caller.
2337   std::string FnName = "check" + Attr.getName() + "AppertainsTo";
2338   std::stringstream SS;
2339   SS << "static bool " << FnName << "(Sema &S, const AttributeList &Attr, ";
2340   SS << "const Decl *D) {\n";
2341   SS << "  if (";
2342   for (auto I = Subjects.begin(), E = Subjects.end(); I != E; ++I) {
2343     // If the subject has custom code associated with it, generate a function
2344     // for it. The function cannot be inlined into this check (yet) because it
2345     // requires the subject to be of a specific type, and were that information
2346     // inlined here, it would not support an attribute with multiple custom
2347     // subjects.
2348     if ((*I)->isSubClassOf("SubsetSubject")) {
2349       SS << "!" << GenerateCustomAppertainsTo(**I, OS) << "(D)";
2350     } else {
2351       SS << "!isa<" << GetSubjectWithSuffix(*I) << ">(D)";
2352     }
2353 
2354     if (I + 1 != E)
2355       SS << " && ";
2356   }
2357   SS << ") {\n";
2358   SS << "    S.Diag(Attr.getLoc(), diag::";
2359   SS << (Warn ? "warn_attribute_wrong_decl_type" :
2360                "err_attribute_wrong_decl_type");
2361   SS << ")\n";
2362   SS << "      << Attr.getName() << ";
2363   SS << CalculateDiagnostic(*SubjectObj) << ";\n";
2364   SS << "    return false;\n";
2365   SS << "  }\n";
2366   SS << "  return true;\n";
2367   SS << "}\n\n";
2368 
2369   OS << SS.str();
2370   return FnName;
2371 }
2372 
2373 static void GenerateDefaultLangOptRequirements(raw_ostream &OS) {
2374   OS << "static bool defaultDiagnoseLangOpts(Sema &, ";
2375   OS << "const AttributeList &) {\n";
2376   OS << "  return true;\n";
2377   OS << "}\n\n";
2378 }
2379 
2380 static std::string GenerateLangOptRequirements(const Record &R,
2381                                                raw_ostream &OS) {
2382   // If the attribute has an empty or unset list of language requirements,
2383   // return the default handler.
2384   std::vector<Record *> LangOpts = R.getValueAsListOfDefs("LangOpts");
2385   if (LangOpts.empty())
2386     return "defaultDiagnoseLangOpts";
2387 
2388   // Generate the test condition, as well as a unique function name for the
2389   // diagnostic test. The list of options should usually be short (one or two
2390   // options), and the uniqueness isn't strictly necessary (it is just for
2391   // codegen efficiency).
2392   std::string FnName = "check", Test;
2393   for (auto I = LangOpts.begin(), E = LangOpts.end(); I != E; ++I) {
2394     std::string Part = (*I)->getValueAsString("Name");
2395     if ((*I)->getValueAsBit("Negated"))
2396       Test += "!";
2397     Test += "S.LangOpts." + Part;
2398     if (I + 1 != E)
2399       Test += " || ";
2400     FnName += Part;
2401   }
2402   FnName += "LangOpts";
2403 
2404   // If this code has already been generated, simply return the previous
2405   // instance of it.
2406   static std::set<std::string> CustomLangOptsSet;
2407   std::set<std::string>::iterator I = CustomLangOptsSet.find(FnName);
2408   if (I != CustomLangOptsSet.end())
2409     return *I;
2410 
2411   OS << "static bool " << FnName << "(Sema &S, const AttributeList &Attr) {\n";
2412   OS << "  if (" << Test << ")\n";
2413   OS << "    return true;\n\n";
2414   OS << "  S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) ";
2415   OS << "<< Attr.getName();\n";
2416   OS << "  return false;\n";
2417   OS << "}\n\n";
2418 
2419   CustomLangOptsSet.insert(FnName);
2420   return FnName;
2421 }
2422 
2423 static void GenerateDefaultTargetRequirements(raw_ostream &OS) {
2424   OS << "static bool defaultTargetRequirements(const llvm::Triple &) {\n";
2425   OS << "  return true;\n";
2426   OS << "}\n\n";
2427 }
2428 
2429 static std::string GenerateTargetRequirements(const Record &Attr,
2430                                               const ParsedAttrMap &Dupes,
2431                                               raw_ostream &OS) {
2432   // If the attribute is not a target specific attribute, return the default
2433   // target handler.
2434   if (!Attr.isSubClassOf("TargetSpecificAttr"))
2435     return "defaultTargetRequirements";
2436 
2437   // Get the list of architectures to be tested for.
2438   const Record *R = Attr.getValueAsDef("Target");
2439   std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches");
2440   if (Arches.empty()) {
2441     PrintError(Attr.getLoc(), "Empty list of target architectures for a "
2442                               "target-specific attr");
2443     return "defaultTargetRequirements";
2444   }
2445 
2446   // If there are other attributes which share the same parsed attribute kind,
2447   // such as target-specific attributes with a shared spelling, collapse the
2448   // duplicate architectures. This is required because a shared target-specific
2449   // attribute has only one AttributeList::Kind enumeration value, but it
2450   // applies to multiple target architectures. In order for the attribute to be
2451   // considered valid, all of its architectures need to be included.
2452   if (!Attr.isValueUnset("ParseKind")) {
2453     std::string APK = Attr.getValueAsString("ParseKind");
2454     for (const auto &I : Dupes) {
2455       if (I.first == APK) {
2456         std::vector<std::string> DA = I.second->getValueAsDef("Target")
2457                                           ->getValueAsListOfStrings("Arches");
2458         std::copy(DA.begin(), DA.end(), std::back_inserter(Arches));
2459       }
2460     }
2461   }
2462 
2463   std::string FnName = "isTarget", Test = "(";
2464   for (auto I = Arches.begin(), E = Arches.end(); I != E; ++I) {
2465     std::string Part = *I;
2466     Test += "Arch == llvm::Triple::" + Part;
2467     if (I + 1 != E)
2468       Test += " || ";
2469     FnName += Part;
2470   }
2471   Test += ")";
2472 
2473   // If the target also requires OS testing, generate those tests as well.
2474   bool UsesOS = false;
2475   if (!R->isValueUnset("OSes")) {
2476     UsesOS = true;
2477 
2478     // We know that there was at least one arch test, so we need to and in the
2479     // OS tests.
2480     Test += " && (";
2481     std::vector<std::string> OSes = R->getValueAsListOfStrings("OSes");
2482     for (auto I = OSes.begin(), E = OSes.end(); I != E; ++I) {
2483       std::string Part = *I;
2484 
2485       Test += "OS == llvm::Triple::" + Part;
2486       if (I + 1 != E)
2487         Test += " || ";
2488       FnName += Part;
2489     }
2490     Test += ")";
2491   }
2492 
2493   // If this code has already been generated, simply return the previous
2494   // instance of it.
2495   static std::set<std::string> CustomTargetSet;
2496   std::set<std::string>::iterator I = CustomTargetSet.find(FnName);
2497   if (I != CustomTargetSet.end())
2498     return *I;
2499 
2500   OS << "static bool " << FnName << "(const llvm::Triple &T) {\n";
2501   OS << "  llvm::Triple::ArchType Arch = T.getArch();\n";
2502   if (UsesOS)
2503     OS << "  llvm::Triple::OSType OS = T.getOS();\n";
2504   OS << "  return " << Test << ";\n";
2505   OS << "}\n\n";
2506 
2507   CustomTargetSet.insert(FnName);
2508   return FnName;
2509 }
2510 
2511 static void GenerateDefaultSpellingIndexToSemanticSpelling(raw_ostream &OS) {
2512   OS << "static unsigned defaultSpellingIndexToSemanticSpelling("
2513      << "const AttributeList &Attr) {\n";
2514   OS << "  return UINT_MAX;\n";
2515   OS << "}\n\n";
2516 }
2517 
2518 static std::string GenerateSpellingIndexToSemanticSpelling(const Record &Attr,
2519                                                            raw_ostream &OS) {
2520   // If the attribute does not have a semantic form, we can bail out early.
2521   if (!Attr.getValueAsBit("ASTNode"))
2522     return "defaultSpellingIndexToSemanticSpelling";
2523 
2524   std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
2525 
2526   // If there are zero or one spellings, or all of the spellings share the same
2527   // name, we can also bail out early.
2528   if (Spellings.size() <= 1 || SpellingNamesAreCommon(Spellings))
2529     return "defaultSpellingIndexToSemanticSpelling";
2530 
2531   // Generate the enumeration we will use for the mapping.
2532   SemanticSpellingMap SemanticToSyntacticMap;
2533   std::string Enum = CreateSemanticSpellings(Spellings, SemanticToSyntacticMap);
2534   std::string Name = Attr.getName() + "AttrSpellingMap";
2535 
2536   OS << "static unsigned " << Name << "(const AttributeList &Attr) {\n";
2537   OS << Enum;
2538   OS << "  unsigned Idx = Attr.getAttributeSpellingListIndex();\n";
2539   WriteSemanticSpellingSwitch("Idx", SemanticToSyntacticMap, OS);
2540   OS << "}\n\n";
2541 
2542   return Name;
2543 }
2544 
2545 static bool IsKnownToGCC(const Record &Attr) {
2546   // Look at the spellings for this subject; if there are any spellings which
2547   // claim to be known to GCC, the attribute is known to GCC.
2548   std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
2549   for (const auto &I : Spellings) {
2550     if (I.knownToGCC())
2551       return true;
2552   }
2553   return false;
2554 }
2555 
2556 /// Emits the parsed attribute helpers
2557 void EmitClangAttrParsedAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
2558   emitSourceFileHeader("Parsed attribute helpers", OS);
2559 
2560   // Get the list of parsed attributes, and accept the optional list of
2561   // duplicates due to the ParseKind.
2562   ParsedAttrMap Dupes;
2563   ParsedAttrMap Attrs = getParsedAttrList(Records, &Dupes);
2564 
2565   // Generate the default appertainsTo, target and language option diagnostic,
2566   // and spelling list index mapping methods.
2567   GenerateDefaultAppertainsTo(OS);
2568   GenerateDefaultLangOptRequirements(OS);
2569   GenerateDefaultTargetRequirements(OS);
2570   GenerateDefaultSpellingIndexToSemanticSpelling(OS);
2571 
2572   // Generate the appertainsTo diagnostic methods and write their names into
2573   // another mapping. At the same time, generate the AttrInfoMap object
2574   // contents. Due to the reliance on generated code, use separate streams so
2575   // that code will not be interleaved.
2576   std::stringstream SS;
2577   for (auto I = Attrs.begin(), E = Attrs.end(); I != E; ++I) {
2578     // TODO: If the attribute's kind appears in the list of duplicates, that is
2579     // because it is a target-specific attribute that appears multiple times.
2580     // It would be beneficial to test whether the duplicates are "similar
2581     // enough" to each other to not cause problems. For instance, check that
2582     // the spellings are identical, and custom parsing rules match, etc.
2583 
2584     // We need to generate struct instances based off ParsedAttrInfo from
2585     // AttributeList.cpp.
2586     SS << "  { ";
2587     emitArgInfo(*I->second, SS);
2588     SS << ", " << I->second->getValueAsBit("HasCustomParsing");
2589     SS << ", " << I->second->isSubClassOf("TargetSpecificAttr");
2590     SS << ", " << I->second->isSubClassOf("TypeAttr");
2591     SS << ", " << IsKnownToGCC(*I->second);
2592     SS << ", " << GenerateAppertainsTo(*I->second, OS);
2593     SS << ", " << GenerateLangOptRequirements(*I->second, OS);
2594     SS << ", " << GenerateTargetRequirements(*I->second, Dupes, OS);
2595     SS << ", " << GenerateSpellingIndexToSemanticSpelling(*I->second, OS);
2596     SS << " }";
2597 
2598     if (I + 1 != E)
2599       SS << ",";
2600 
2601     SS << "  // AT_" << I->first << "\n";
2602   }
2603 
2604   OS << "static const ParsedAttrInfo AttrInfoMap[AttributeList::UnknownAttribute + 1] = {\n";
2605   OS << SS.str();
2606   OS << "};\n\n";
2607 }
2608 
2609 // Emits the kind list of parsed attributes
2610 void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream &OS) {
2611   emitSourceFileHeader("Attribute name matcher", OS);
2612 
2613   std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
2614   std::vector<StringMatcher::StringPair> GNU, Declspec, CXX11, Keywords, Pragma;
2615   std::set<std::string> Seen;
2616   for (const auto *A : Attrs) {
2617     const Record &Attr = *A;
2618 
2619     bool SemaHandler = Attr.getValueAsBit("SemaHandler");
2620     bool Ignored = Attr.getValueAsBit("Ignored");
2621     if (SemaHandler || Ignored) {
2622       // Attribute spellings can be shared between target-specific attributes,
2623       // and can be shared between syntaxes for the same attribute. For
2624       // instance, an attribute can be spelled GNU<"interrupt"> for an ARM-
2625       // specific attribute, or MSP430-specific attribute. Additionally, an
2626       // attribute can be spelled GNU<"dllexport"> and Declspec<"dllexport">
2627       // for the same semantic attribute. Ultimately, we need to map each of
2628       // these to a single AttributeList::Kind value, but the StringMatcher
2629       // class cannot handle duplicate match strings. So we generate a list of
2630       // string to match based on the syntax, and emit multiple string matchers
2631       // depending on the syntax used.
2632       std::string AttrName;
2633       if (Attr.isSubClassOf("TargetSpecificAttr") &&
2634           !Attr.isValueUnset("ParseKind")) {
2635         AttrName = Attr.getValueAsString("ParseKind");
2636         if (Seen.find(AttrName) != Seen.end())
2637           continue;
2638         Seen.insert(AttrName);
2639       } else
2640         AttrName = NormalizeAttrName(StringRef(Attr.getName())).str();
2641 
2642       std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
2643       for (const auto &S : Spellings) {
2644         std::string RawSpelling = S.name();
2645         std::vector<StringMatcher::StringPair> *Matches = nullptr;
2646         std::string Spelling, Variety = S.variety();
2647         if (Variety == "CXX11") {
2648           Matches = &CXX11;
2649           Spelling += S.nameSpace();
2650           Spelling += "::";
2651         } else if (Variety == "GNU")
2652           Matches = &GNU;
2653         else if (Variety == "Declspec")
2654           Matches = &Declspec;
2655         else if (Variety == "Keyword")
2656           Matches = &Keywords;
2657         else if (Variety == "Pragma")
2658           Matches = &Pragma;
2659 
2660         assert(Matches && "Unsupported spelling variety found");
2661 
2662         Spelling += NormalizeAttrSpelling(RawSpelling);
2663         if (SemaHandler)
2664           Matches->push_back(StringMatcher::StringPair(Spelling,
2665                               "return AttributeList::AT_" + AttrName + ";"));
2666         else
2667           Matches->push_back(StringMatcher::StringPair(Spelling,
2668                               "return AttributeList::IgnoredAttribute;"));
2669       }
2670     }
2671   }
2672 
2673   OS << "static AttributeList::Kind getAttrKind(StringRef Name, ";
2674   OS << "AttributeList::Syntax Syntax) {\n";
2675   OS << "  if (AttributeList::AS_GNU == Syntax) {\n";
2676   StringMatcher("Name", GNU, OS).Emit();
2677   OS << "  } else if (AttributeList::AS_Declspec == Syntax) {\n";
2678   StringMatcher("Name", Declspec, OS).Emit();
2679   OS << "  } else if (AttributeList::AS_CXX11 == Syntax) {\n";
2680   StringMatcher("Name", CXX11, OS).Emit();
2681   OS << "  } else if (AttributeList::AS_Keyword == Syntax) {\n";
2682   StringMatcher("Name", Keywords, OS).Emit();
2683   OS << "  } else if (AttributeList::AS_Pragma == Syntax) {\n";
2684   StringMatcher("Name", Pragma, OS).Emit();
2685   OS << "  }\n";
2686   OS << "  return AttributeList::UnknownAttribute;\n"
2687      << "}\n";
2688 }
2689 
2690 // Emits the code to dump an attribute.
2691 void EmitClangAttrDump(RecordKeeper &Records, raw_ostream &OS) {
2692   emitSourceFileHeader("Attribute dumper", OS);
2693 
2694   OS <<
2695     "  switch (A->getKind()) {\n"
2696     "  default:\n"
2697     "    llvm_unreachable(\"Unknown attribute kind!\");\n"
2698     "    break;\n";
2699   std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args;
2700   for (const auto *Attr : Attrs) {
2701     const Record &R = *Attr;
2702     if (!R.getValueAsBit("ASTNode"))
2703       continue;
2704     OS << "  case attr::" << R.getName() << ": {\n";
2705 
2706     // If the attribute has a semantically-meaningful name (which is determined
2707     // by whether there is a Spelling enumeration for it), then write out the
2708     // spelling used for the attribute.
2709     std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
2710     if (Spellings.size() > 1 && !SpellingNamesAreCommon(Spellings))
2711       OS << "    OS << \" \" << A->getSpelling();\n";
2712 
2713     Args = R.getValueAsListOfDefs("Args");
2714     if (!Args.empty()) {
2715       OS << "    const " << R.getName() << "Attr *SA = cast<" << R.getName()
2716          << "Attr>(A);\n";
2717       for (const auto *Arg : Args)
2718         createArgument(*Arg, R.getName())->writeDump(OS);
2719 
2720       for (auto AI = Args.begin(), AE = Args.end(); AI != AE; ++AI)
2721         createArgument(**AI, R.getName())->writeDumpChildren(OS);
2722     }
2723     OS <<
2724       "    break;\n"
2725       "  }\n";
2726   }
2727   OS << "  }\n";
2728 }
2729 
2730 void EmitClangAttrParserStringSwitches(RecordKeeper &Records,
2731                                        raw_ostream &OS) {
2732   emitSourceFileHeader("Parser-related llvm::StringSwitch cases", OS);
2733   emitClangAttrArgContextList(Records, OS);
2734   emitClangAttrIdentifierArgList(Records, OS);
2735   emitClangAttrTypeArgList(Records, OS);
2736   emitClangAttrLateParsedList(Records, OS);
2737 }
2738 
2739 class DocumentationData {
2740 public:
2741   const Record *Documentation;
2742   const Record *Attribute;
2743 
2744   DocumentationData(const Record &Documentation, const Record &Attribute)
2745       : Documentation(&Documentation), Attribute(&Attribute) {}
2746 };
2747 
2748 static void WriteCategoryHeader(const Record *DocCategory,
2749                                 raw_ostream &OS) {
2750   const std::string &Name = DocCategory->getValueAsString("Name");
2751   OS << Name << "\n" << std::string(Name.length(), '=') << "\n";
2752 
2753   // If there is content, print that as well.
2754   std::string ContentStr = DocCategory->getValueAsString("Content");
2755   if (!ContentStr.empty()) {
2756     // Trim leading and trailing newlines and spaces.
2757     StringRef Content(ContentStr);
2758     while (Content.startswith("\r") || Content.startswith("\n") ||
2759            Content.startswith(" ") || Content.startswith("\t"))
2760            Content = Content.substr(1);
2761     while (Content.endswith("\r") || Content.endswith("\n") ||
2762            Content.endswith(" ") || Content.endswith("\t"))
2763            Content = Content.substr(0, Content.size() - 1);
2764     OS << Content;
2765   }
2766   OS << "\n\n";
2767 }
2768 
2769 enum SpellingKind {
2770   GNU = 1 << 0,
2771   CXX11 = 1 << 1,
2772   Declspec = 1 << 2,
2773   Keyword = 1 << 3,
2774   Pragma = 1 << 4
2775 };
2776 
2777 static void WriteDocumentation(const DocumentationData &Doc,
2778                                raw_ostream &OS) {
2779   // FIXME: there is no way to have a per-spelling category for the attribute
2780   // documentation. This may not be a limiting factor since the spellings
2781   // should generally be consistently applied across the category.
2782 
2783   std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Doc.Attribute);
2784 
2785   // Determine the heading to be used for this attribute.
2786   std::string Heading = Doc.Documentation->getValueAsString("Heading");
2787   bool CustomHeading = !Heading.empty();
2788   if (Heading.empty()) {
2789     // If there's only one spelling, we can simply use that.
2790     if (Spellings.size() == 1)
2791       Heading = Spellings.begin()->name();
2792     else {
2793       std::set<std::string> Uniques;
2794       for (auto I = Spellings.begin(), E = Spellings.end();
2795            I != E && Uniques.size() <= 1; ++I) {
2796         std::string Spelling = NormalizeNameForSpellingComparison(I->name());
2797         Uniques.insert(Spelling);
2798       }
2799       // If the semantic map has only one spelling, that is sufficient for our
2800       // needs.
2801       if (Uniques.size() == 1)
2802         Heading = *Uniques.begin();
2803     }
2804   }
2805 
2806   // If the heading is still empty, it is an error.
2807   if (Heading.empty())
2808     PrintFatalError(Doc.Attribute->getLoc(),
2809                     "This attribute requires a heading to be specified");
2810 
2811   // Gather a list of unique spellings; this is not the same as the semantic
2812   // spelling for the attribute. Variations in underscores and other non-
2813   // semantic characters are still acceptable.
2814   std::vector<std::string> Names;
2815 
2816   unsigned SupportedSpellings = 0;
2817   for (const auto &I : Spellings) {
2818     SpellingKind Kind = StringSwitch<SpellingKind>(I.variety())
2819                             .Case("GNU", GNU)
2820                             .Case("CXX11", CXX11)
2821                             .Case("Declspec", Declspec)
2822                             .Case("Keyword", Keyword)
2823                             .Case("Pragma", Pragma);
2824 
2825     // Mask in the supported spelling.
2826     SupportedSpellings |= Kind;
2827 
2828     std::string Name;
2829     if (Kind == CXX11 && !I.nameSpace().empty())
2830       Name = I.nameSpace() + "::";
2831     Name += I.name();
2832 
2833     // If this name is the same as the heading, do not add it.
2834     if (Name != Heading)
2835       Names.push_back(Name);
2836   }
2837 
2838   // Print out the heading for the attribute. If there are alternate spellings,
2839   // then display those after the heading.
2840   if (!CustomHeading && !Names.empty()) {
2841     Heading += " (";
2842     for (auto I = Names.begin(), E = Names.end(); I != E; ++I) {
2843       if (I != Names.begin())
2844         Heading += ", ";
2845       Heading += *I;
2846     }
2847     Heading += ")";
2848   }
2849   OS << Heading << "\n" << std::string(Heading.length(), '-') << "\n";
2850 
2851   if (!SupportedSpellings)
2852     PrintFatalError(Doc.Attribute->getLoc(),
2853                     "Attribute has no supported spellings; cannot be "
2854                     "documented");
2855 
2856   // List what spelling syntaxes the attribute supports.
2857   OS << ".. csv-table:: Supported Syntaxes\n";
2858   OS << "   :header: \"GNU\", \"C++11\", \"__declspec\", \"Keyword\",";
2859   OS << " \"Pragma\"\n\n";
2860   OS << "   \"";
2861   if (SupportedSpellings & GNU) OS << "X";
2862   OS << "\",\"";
2863   if (SupportedSpellings & CXX11) OS << "X";
2864   OS << "\",\"";
2865   if (SupportedSpellings & Declspec) OS << "X";
2866   OS << "\",\"";
2867   if (SupportedSpellings & Keyword) OS << "X";
2868   OS << "\", \"";
2869   if (SupportedSpellings & Pragma) OS << "X";
2870   OS << "\"\n\n";
2871 
2872   // If the attribute is deprecated, print a message about it, and possibly
2873   // provide a replacement attribute.
2874   if (!Doc.Documentation->isValueUnset("Deprecated")) {
2875     OS << "This attribute has been deprecated, and may be removed in a future "
2876        << "version of Clang.";
2877     const Record &Deprecated = *Doc.Documentation->getValueAsDef("Deprecated");
2878     std::string Replacement = Deprecated.getValueAsString("Replacement");
2879     if (!Replacement.empty())
2880       OS << "  This attribute has been superseded by ``"
2881          << Replacement << "``.";
2882     OS << "\n\n";
2883   }
2884 
2885   std::string ContentStr = Doc.Documentation->getValueAsString("Content");
2886   // Trim leading and trailing newlines and spaces.
2887   StringRef Content(ContentStr);
2888   while (Content.startswith("\r") || Content.startswith("\n") ||
2889          Content.startswith(" ") || Content.startswith("\t"))
2890     Content = Content.substr(1);
2891   while (Content.endswith("\r") || Content.endswith("\n") ||
2892          Content.endswith(" ") || Content.endswith("\t"))
2893     Content = Content.substr(0, Content.size() - 1);
2894   OS << Content;
2895 
2896   OS << "\n\n\n";
2897 }
2898 
2899 void EmitClangAttrDocs(RecordKeeper &Records, raw_ostream &OS) {
2900   // Get the documentation introduction paragraph.
2901   const Record *Documentation = Records.getDef("GlobalDocumentation");
2902   if (!Documentation) {
2903     PrintFatalError("The Documentation top-level definition is missing, "
2904                     "no documentation will be generated.");
2905     return;
2906   }
2907 
2908   OS << Documentation->getValueAsString("Intro") << "\n";
2909 
2910   // Gather the Documentation lists from each of the attributes, based on the
2911   // category provided.
2912   std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
2913   std::map<const Record *, std::vector<DocumentationData>> SplitDocs;
2914   for (const auto *A : Attrs) {
2915     const Record &Attr = *A;
2916     std::vector<Record *> Docs = Attr.getValueAsListOfDefs("Documentation");
2917     for (const auto *D : Docs) {
2918       const Record &Doc = *D;
2919       const Record *Category = Doc.getValueAsDef("Category");
2920       // If the category is "undocumented", then there cannot be any other
2921       // documentation categories (otherwise, the attribute would become
2922       // documented).
2923       std::string Cat = Category->getValueAsString("Name");
2924       bool Undocumented = Cat == "Undocumented";
2925       if (Undocumented && Docs.size() > 1)
2926         PrintFatalError(Doc.getLoc(),
2927                         "Attribute is \"Undocumented\", but has multiple "
2928                         "documentation categories");
2929 
2930       if (!Undocumented)
2931         SplitDocs[Category].push_back(DocumentationData(Doc, Attr));
2932     }
2933   }
2934 
2935   // Having split the attributes out based on what documentation goes where,
2936   // we can begin to generate sections of documentation.
2937   for (const auto &I : SplitDocs) {
2938     WriteCategoryHeader(I.first, OS);
2939 
2940     // Walk over each of the attributes in the category and write out their
2941     // documentation.
2942     for (const auto &Doc : I.second)
2943       WriteDocumentation(Doc, OS);
2944   }
2945 }
2946 
2947 } // end namespace clang
2948