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