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