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