1 //===- ClangAttrEmitter.cpp - Generate Clang attribute handling =-*- C++ -*--=//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // These tablegen backends emit Clang attribute processing code
12 //===----------------------------------------------------------------------===//
14 #include "llvm/ADT/ArrayRef.h"
15 #include "llvm/ADT/DenseMap.h"
16 #include "llvm/ADT/DenseSet.h"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/ADT/SmallString.h"
19 #include "llvm/ADT/StringExtras.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/ADT/StringSet.h"
22 #include "llvm/ADT/StringSwitch.h"
23 #include "llvm/ADT/iterator_range.h"
24 #include "llvm/Support/ErrorHandling.h"
25 #include "llvm/Support/raw_ostream.h"
26 #include "llvm/TableGen/Error.h"
27 #include "llvm/TableGen/Record.h"
28 #include "llvm/TableGen/StringMatcher.h"
29 #include "llvm/TableGen/TableGenBackend.h"
47 class FlattenedSpelling {
52 FlattenedSpelling(const std::string &Variety, const std::string &Name,
53 const std::string &Namespace, bool KnownToGCC) :
54 V(Variety), N(Name), NS(Namespace), K(KnownToGCC) {}
55 explicit FlattenedSpelling(const Record &Spelling) :
56 V(Spelling.getValueAsString("Variety")),
57 N(Spelling.getValueAsString("Name")) {
59 assert(V != "GCC" && "Given a GCC spelling, which means this hasn't been"
61 if (V == "CXX11" || V == "Pragma")
62 NS = Spelling.getValueAsString("Namespace");
64 K = Spelling.getValueAsBitOrUnset("KnownToGCC", Unset);
67 const std::string &variety() const { return V; }
68 const std::string &name() const { return N; }
69 const std::string &nameSpace() const { return NS; }
70 bool knownToGCC() const { return K; }
73 } // end anonymous namespace
75 static std::vector<FlattenedSpelling>
76 GetFlattenedSpellings(const Record &Attr) {
77 std::vector<Record *> Spellings = Attr.getValueAsListOfDefs("Spellings");
78 std::vector<FlattenedSpelling> Ret;
80 for (const auto &Spelling : Spellings) {
81 if (Spelling->getValueAsString("Variety") == "GCC") {
82 // Gin up two new spelling objects to add into the list.
83 Ret.emplace_back("GNU", Spelling->getValueAsString("Name"), "", true);
84 Ret.emplace_back("CXX11", Spelling->getValueAsString("Name"), "gnu",
87 Ret.push_back(FlattenedSpelling(*Spelling));
93 static std::string ReadPCHRecord(StringRef type) {
94 return StringSwitch<std::string>(type)
95 .EndsWith("Decl *", "Record.GetLocalDeclAs<"
96 + std::string(type, 0, type.size()-1) + ">(Record.readInt())")
97 .Case("TypeSourceInfo *", "Record.getTypeSourceInfo()")
98 .Case("Expr *", "Record.readExpr()")
99 .Case("IdentifierInfo *", "Record.getIdentifierInfo()")
100 .Case("StringRef", "Record.readString()")
101 .Default("Record.readInt()");
104 // Get a type that is suitable for storing an object of the specified type.
105 static StringRef getStorageType(StringRef type) {
106 return StringSwitch<StringRef>(type)
107 .Case("StringRef", "std::string")
111 // Assumes that the way to get the value is SA->getname()
112 static std::string WritePCHRecord(StringRef type, StringRef name) {
113 return "Record." + StringSwitch<std::string>(type)
114 .EndsWith("Decl *", "AddDeclRef(" + std::string(name) + ");\n")
115 .Case("TypeSourceInfo *", "AddTypeSourceInfo(" + std::string(name) + ");\n")
116 .Case("Expr *", "AddStmt(" + std::string(name) + ");\n")
117 .Case("IdentifierInfo *", "AddIdentifierRef(" + std::string(name) + ");\n")
118 .Case("StringRef", "AddString(" + std::string(name) + ");\n")
119 .Default("push_back(" + std::string(name) + ");\n");
122 // Normalize attribute name by removing leading and trailing
123 // underscores. For example, __foo, foo__, __foo__ would
125 static StringRef NormalizeAttrName(StringRef AttrName) {
126 AttrName.consume_front("__");
127 AttrName.consume_back("__");
131 // Normalize the name by removing any and all leading and trailing underscores.
132 // This is different from NormalizeAttrName in that it also handles names like
133 // _pascal and __pascal.
134 static StringRef NormalizeNameForSpellingComparison(StringRef Name) {
135 return Name.trim("_");
138 // Normalize the spelling of a GNU attribute (i.e. "x" in "__attribute__((x))"),
139 // removing "__" if it appears at the beginning and end of the attribute's name.
140 static StringRef NormalizeGNUAttrSpelling(StringRef AttrSpelling) {
141 if (AttrSpelling.startswith("__") && AttrSpelling.endswith("__")) {
142 AttrSpelling = AttrSpelling.substr(2, AttrSpelling.size() - 4);
148 typedef std::vector<std::pair<std::string, const Record *>> ParsedAttrMap;
150 static ParsedAttrMap getParsedAttrList(const RecordKeeper &Records,
151 ParsedAttrMap *Dupes = nullptr) {
152 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
153 std::set<std::string> Seen;
155 for (const auto *Attr : Attrs) {
156 if (Attr->getValueAsBit("SemaHandler")) {
158 if (Attr->isSubClassOf("TargetSpecificAttr") &&
159 !Attr->isValueUnset("ParseKind")) {
160 AN = Attr->getValueAsString("ParseKind");
162 // If this attribute has already been handled, it does not need to be
164 if (Seen.find(AN) != Seen.end()) {
166 Dupes->push_back(std::make_pair(AN, Attr));
171 AN = NormalizeAttrName(Attr->getName()).str();
173 R.push_back(std::make_pair(AN, Attr));
182 std::string lowerName, upperName;
188 Argument(const Record &Arg, StringRef Attr)
189 : lowerName(Arg.getValueAsString("Name")), upperName(lowerName),
190 attrName(Attr), isOpt(false), Fake(false) {
191 if (!lowerName.empty()) {
192 lowerName[0] = std::tolower(lowerName[0]);
193 upperName[0] = std::toupper(upperName[0]);
195 // Work around MinGW's macro definition of 'interface' to 'struct'. We
196 // have an attribute argument called 'Interface', so only the lower case
197 // name conflicts with the macro definition.
198 if (lowerName == "interface")
199 lowerName = "interface_";
201 virtual ~Argument() = default;
203 StringRef getLowerName() const { return lowerName; }
204 StringRef getUpperName() const { return upperName; }
205 StringRef getAttrName() const { return attrName; }
207 bool isOptional() const { return isOpt; }
208 void setOptional(bool set) { isOpt = set; }
210 bool isFake() const { return Fake; }
211 void setFake(bool fake) { Fake = fake; }
213 // These functions print the argument contents formatted in different ways.
214 virtual void writeAccessors(raw_ostream &OS) const = 0;
215 virtual void writeAccessorDefinitions(raw_ostream &OS) const {}
216 virtual void writeASTVisitorTraversal(raw_ostream &OS) const {}
217 virtual void writeCloneArgs(raw_ostream &OS) const = 0;
218 virtual void writeTemplateInstantiationArgs(raw_ostream &OS) const = 0;
219 virtual void writeTemplateInstantiation(raw_ostream &OS) const {}
220 virtual void writeCtorBody(raw_ostream &OS) const {}
221 virtual void writeCtorInitializers(raw_ostream &OS) const = 0;
222 virtual void writeCtorDefaultInitializers(raw_ostream &OS) const = 0;
223 virtual void writeCtorParameters(raw_ostream &OS) const = 0;
224 virtual void writeDeclarations(raw_ostream &OS) const = 0;
225 virtual void writePCHReadArgs(raw_ostream &OS) const = 0;
226 virtual void writePCHReadDecls(raw_ostream &OS) const = 0;
227 virtual void writePCHWrite(raw_ostream &OS) const = 0;
228 virtual void writeValue(raw_ostream &OS) const = 0;
229 virtual void writeDump(raw_ostream &OS) const = 0;
230 virtual void writeDumpChildren(raw_ostream &OS) const {}
231 virtual void writeHasChildren(raw_ostream &OS) const { OS << "false"; }
233 virtual bool isEnumArg() const { return false; }
234 virtual bool isVariadicEnumArg() const { return false; }
235 virtual bool isVariadic() const { return false; }
237 virtual void writeImplicitCtorArgs(raw_ostream &OS) const {
238 OS << getUpperName();
242 class SimpleArgument : public Argument {
246 SimpleArgument(const Record &Arg, StringRef Attr, std::string T)
247 : Argument(Arg, Attr), type(std::move(T)) {}
249 std::string getType() const { return type; }
251 void writeAccessors(raw_ostream &OS) const override {
252 OS << " " << type << " get" << getUpperName() << "() const {\n";
253 OS << " return " << getLowerName() << ";\n";
257 void writeCloneArgs(raw_ostream &OS) const override {
258 OS << getLowerName();
261 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
262 OS << "A->get" << getUpperName() << "()";
265 void writeCtorInitializers(raw_ostream &OS) const override {
266 OS << getLowerName() << "(" << getUpperName() << ")";
269 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
270 OS << getLowerName() << "()";
273 void writeCtorParameters(raw_ostream &OS) const override {
274 OS << type << " " << getUpperName();
277 void writeDeclarations(raw_ostream &OS) const override {
278 OS << type << " " << getLowerName() << ";";
281 void writePCHReadDecls(raw_ostream &OS) const override {
282 std::string read = ReadPCHRecord(type);
283 OS << " " << type << " " << getLowerName() << " = " << read << ";\n";
286 void writePCHReadArgs(raw_ostream &OS) const override {
287 OS << getLowerName();
290 void writePCHWrite(raw_ostream &OS) const override {
291 OS << " " << WritePCHRecord(type, "SA->get" +
292 std::string(getUpperName()) + "()");
295 void writeValue(raw_ostream &OS) const override {
296 if (type == "FunctionDecl *") {
297 OS << "\" << get" << getUpperName()
298 << "()->getNameInfo().getAsString() << \"";
299 } else if (type == "IdentifierInfo *") {
302 OS << " if (get" << getUpperName() << "()) ";
305 OS << "OS << get" << getUpperName() << "()->getName();\n";
307 } else if (type == "TypeSourceInfo *") {
308 OS << "\" << get" << getUpperName() << "().getAsString() << \"";
310 OS << "\" << get" << getUpperName() << "() << \"";
314 void writeDump(raw_ostream &OS) const override {
315 if (type == "FunctionDecl *") {
316 OS << " OS << \" \";\n";
317 OS << " dumpBareDeclRef(SA->get" << getUpperName() << "());\n";
318 } else if (type == "IdentifierInfo *") {
320 OS << " if (SA->get" << getUpperName() << "())\n ";
321 OS << " OS << \" \" << SA->get" << getUpperName()
322 << "()->getName();\n";
323 } else if (type == "TypeSourceInfo *") {
324 OS << " OS << \" \" << SA->get" << getUpperName()
325 << "().getAsString();\n";
326 } else if (type == "bool") {
327 OS << " if (SA->get" << getUpperName() << "()) OS << \" "
328 << getUpperName() << "\";\n";
329 } else if (type == "int" || type == "unsigned") {
330 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
332 llvm_unreachable("Unknown SimpleArgument type!");
337 class DefaultSimpleArgument : public SimpleArgument {
341 DefaultSimpleArgument(const Record &Arg, StringRef Attr,
342 std::string T, int64_t Default)
343 : SimpleArgument(Arg, Attr, T), Default(Default) {}
345 void writeAccessors(raw_ostream &OS) const override {
346 SimpleArgument::writeAccessors(OS);
348 OS << "\n\n static const " << getType() << " Default" << getUpperName()
350 if (getType() == "bool")
351 OS << (Default != 0 ? "true" : "false");
358 class StringArgument : public Argument {
360 StringArgument(const Record &Arg, StringRef Attr)
361 : Argument(Arg, Attr)
364 void writeAccessors(raw_ostream &OS) const override {
365 OS << " llvm::StringRef get" << getUpperName() << "() const {\n";
366 OS << " return llvm::StringRef(" << getLowerName() << ", "
367 << getLowerName() << "Length);\n";
369 OS << " unsigned get" << getUpperName() << "Length() const {\n";
370 OS << " return " << getLowerName() << "Length;\n";
372 OS << " void set" << getUpperName()
373 << "(ASTContext &C, llvm::StringRef S) {\n";
374 OS << " " << getLowerName() << "Length = S.size();\n";
375 OS << " this->" << getLowerName() << " = new (C, 1) char ["
376 << getLowerName() << "Length];\n";
377 OS << " if (!S.empty())\n";
378 OS << " std::memcpy(this->" << getLowerName() << ", S.data(), "
379 << getLowerName() << "Length);\n";
383 void writeCloneArgs(raw_ostream &OS) const override {
384 OS << "get" << getUpperName() << "()";
387 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
388 OS << "A->get" << getUpperName() << "()";
391 void writeCtorBody(raw_ostream &OS) const override {
392 OS << " if (!" << getUpperName() << ".empty())\n";
393 OS << " std::memcpy(" << getLowerName() << ", " << getUpperName()
394 << ".data(), " << getLowerName() << "Length);\n";
397 void writeCtorInitializers(raw_ostream &OS) const override {
398 OS << getLowerName() << "Length(" << getUpperName() << ".size()),"
399 << getLowerName() << "(new (Ctx, 1) char[" << getLowerName()
403 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
404 OS << getLowerName() << "Length(0)," << getLowerName() << "(nullptr)";
407 void writeCtorParameters(raw_ostream &OS) const override {
408 OS << "llvm::StringRef " << getUpperName();
411 void writeDeclarations(raw_ostream &OS) const override {
412 OS << "unsigned " << getLowerName() << "Length;\n";
413 OS << "char *" << getLowerName() << ";";
416 void writePCHReadDecls(raw_ostream &OS) const override {
417 OS << " std::string " << getLowerName()
418 << "= Record.readString();\n";
421 void writePCHReadArgs(raw_ostream &OS) const override {
422 OS << getLowerName();
425 void writePCHWrite(raw_ostream &OS) const override {
426 OS << " Record.AddString(SA->get" << getUpperName() << "());\n";
429 void writeValue(raw_ostream &OS) const override {
430 OS << "\\\"\" << get" << getUpperName() << "() << \"\\\"";
433 void writeDump(raw_ostream &OS) const override {
434 OS << " OS << \" \\\"\" << SA->get" << getUpperName()
435 << "() << \"\\\"\";\n";
439 class AlignedArgument : public Argument {
441 AlignedArgument(const Record &Arg, StringRef Attr)
442 : Argument(Arg, Attr)
445 void writeAccessors(raw_ostream &OS) const override {
446 OS << " bool is" << getUpperName() << "Dependent() const;\n";
448 OS << " unsigned get" << getUpperName() << "(ASTContext &Ctx) const;\n";
450 OS << " bool is" << getUpperName() << "Expr() const {\n";
451 OS << " return is" << getLowerName() << "Expr;\n";
454 OS << " Expr *get" << getUpperName() << "Expr() const {\n";
455 OS << " assert(is" << getLowerName() << "Expr);\n";
456 OS << " return " << getLowerName() << "Expr;\n";
459 OS << " TypeSourceInfo *get" << getUpperName() << "Type() const {\n";
460 OS << " assert(!is" << getLowerName() << "Expr);\n";
461 OS << " return " << getLowerName() << "Type;\n";
465 void writeAccessorDefinitions(raw_ostream &OS) const override {
466 OS << "bool " << getAttrName() << "Attr::is" << getUpperName()
467 << "Dependent() const {\n";
468 OS << " if (is" << getLowerName() << "Expr)\n";
469 OS << " return " << getLowerName() << "Expr && (" << getLowerName()
470 << "Expr->isValueDependent() || " << getLowerName()
471 << "Expr->isTypeDependent());\n";
473 OS << " return " << getLowerName()
474 << "Type->getType()->isDependentType();\n";
477 // FIXME: Do not do the calculation here
478 // FIXME: Handle types correctly
479 // A null pointer means maximum alignment
480 OS << "unsigned " << getAttrName() << "Attr::get" << getUpperName()
481 << "(ASTContext &Ctx) const {\n";
482 OS << " assert(!is" << getUpperName() << "Dependent());\n";
483 OS << " if (is" << getLowerName() << "Expr)\n";
484 OS << " return " << getLowerName() << "Expr ? " << getLowerName()
485 << "Expr->EvaluateKnownConstInt(Ctx).getZExtValue()"
486 << " * Ctx.getCharWidth() : "
487 << "Ctx.getTargetDefaultAlignForAttributeAligned();\n";
489 OS << " return 0; // FIXME\n";
493 void writeCloneArgs(raw_ostream &OS) const override {
494 OS << "is" << getLowerName() << "Expr, is" << getLowerName()
495 << "Expr ? static_cast<void*>(" << getLowerName()
496 << "Expr) : " << getLowerName()
500 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
501 // FIXME: move the definition in Sema::InstantiateAttrs to here.
502 // In the meantime, aligned attributes are cloned.
505 void writeCtorBody(raw_ostream &OS) const override {
506 OS << " if (is" << getLowerName() << "Expr)\n";
507 OS << " " << getLowerName() << "Expr = reinterpret_cast<Expr *>("
508 << getUpperName() << ");\n";
510 OS << " " << getLowerName()
511 << "Type = reinterpret_cast<TypeSourceInfo *>(" << getUpperName()
515 void writeCtorInitializers(raw_ostream &OS) const override {
516 OS << "is" << getLowerName() << "Expr(Is" << getUpperName() << "Expr)";
519 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
520 OS << "is" << getLowerName() << "Expr(false)";
523 void writeCtorParameters(raw_ostream &OS) const override {
524 OS << "bool Is" << getUpperName() << "Expr, void *" << getUpperName();
527 void writeImplicitCtorArgs(raw_ostream &OS) const override {
528 OS << "Is" << getUpperName() << "Expr, " << getUpperName();
531 void writeDeclarations(raw_ostream &OS) const override {
532 OS << "bool is" << getLowerName() << "Expr;\n";
534 OS << "Expr *" << getLowerName() << "Expr;\n";
535 OS << "TypeSourceInfo *" << getLowerName() << "Type;\n";
539 void writePCHReadArgs(raw_ostream &OS) const override {
540 OS << "is" << getLowerName() << "Expr, " << getLowerName() << "Ptr";
543 void writePCHReadDecls(raw_ostream &OS) const override {
544 OS << " bool is" << getLowerName() << "Expr = Record.readInt();\n";
545 OS << " void *" << getLowerName() << "Ptr;\n";
546 OS << " if (is" << getLowerName() << "Expr)\n";
547 OS << " " << getLowerName() << "Ptr = Record.readExpr();\n";
549 OS << " " << getLowerName()
550 << "Ptr = Record.getTypeSourceInfo();\n";
553 void writePCHWrite(raw_ostream &OS) const override {
554 OS << " Record.push_back(SA->is" << getUpperName() << "Expr());\n";
555 OS << " if (SA->is" << getUpperName() << "Expr())\n";
556 OS << " Record.AddStmt(SA->get" << getUpperName() << "Expr());\n";
558 OS << " Record.AddTypeSourceInfo(SA->get" << getUpperName()
562 void writeValue(raw_ostream &OS) const override {
564 // The aligned attribute argument expression is optional.
565 OS << " if (is" << getLowerName() << "Expr && "
566 << getLowerName() << "Expr)\n";
567 OS << " " << getLowerName() << "Expr->printPretty(OS, nullptr, Policy);\n";
571 void writeDump(raw_ostream &OS) const override {}
573 void writeDumpChildren(raw_ostream &OS) const override {
574 OS << " if (SA->is" << getUpperName() << "Expr())\n";
575 OS << " dumpStmt(SA->get" << getUpperName() << "Expr());\n";
577 OS << " dumpType(SA->get" << getUpperName()
578 << "Type()->getType());\n";
581 void writeHasChildren(raw_ostream &OS) const override {
582 OS << "SA->is" << getUpperName() << "Expr()";
586 class VariadicArgument : public Argument {
587 std::string Type, ArgName, ArgSizeName, RangeName;
590 // Assumed to receive a parameter: raw_ostream OS.
591 virtual void writeValueImpl(raw_ostream &OS) const {
592 OS << " OS << Val;\n";
596 VariadicArgument(const Record &Arg, StringRef Attr, std::string T)
597 : Argument(Arg, Attr), Type(std::move(T)),
598 ArgName(getLowerName().str() + "_"), ArgSizeName(ArgName + "Size"),
599 RangeName(getLowerName()) {}
601 const std::string &getType() const { return Type; }
602 const std::string &getArgName() const { return ArgName; }
603 const std::string &getArgSizeName() const { return ArgSizeName; }
604 bool isVariadic() const override { return true; }
606 void writeAccessors(raw_ostream &OS) const override {
607 std::string IteratorType = getLowerName().str() + "_iterator";
608 std::string BeginFn = getLowerName().str() + "_begin()";
609 std::string EndFn = getLowerName().str() + "_end()";
611 OS << " typedef " << Type << "* " << IteratorType << ";\n";
612 OS << " " << IteratorType << " " << BeginFn << " const {"
613 << " return " << ArgName << "; }\n";
614 OS << " " << IteratorType << " " << EndFn << " const {"
615 << " return " << ArgName << " + " << ArgSizeName << "; }\n";
616 OS << " unsigned " << getLowerName() << "_size() const {"
617 << " return " << ArgSizeName << "; }\n";
618 OS << " llvm::iterator_range<" << IteratorType << "> " << RangeName
619 << "() const { return llvm::make_range(" << BeginFn << ", " << EndFn
623 void writeCloneArgs(raw_ostream &OS) const override {
624 OS << ArgName << ", " << ArgSizeName;
627 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
628 // This isn't elegant, but we have to go through public methods...
629 OS << "A->" << getLowerName() << "_begin(), "
630 << "A->" << getLowerName() << "_size()";
633 void writeCtorBody(raw_ostream &OS) const override {
634 OS << " std::copy(" << getUpperName() << ", " << getUpperName()
635 << " + " << ArgSizeName << ", " << ArgName << ");\n";
638 void writeCtorInitializers(raw_ostream &OS) const override {
639 OS << ArgSizeName << "(" << getUpperName() << "Size), "
640 << ArgName << "(new (Ctx, 16) " << getType() << "["
641 << ArgSizeName << "])";
644 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
645 OS << ArgSizeName << "(0), " << ArgName << "(nullptr)";
648 void writeCtorParameters(raw_ostream &OS) const override {
649 OS << getType() << " *" << getUpperName() << ", unsigned "
650 << getUpperName() << "Size";
653 void writeImplicitCtorArgs(raw_ostream &OS) const override {
654 OS << getUpperName() << ", " << getUpperName() << "Size";
657 void writeDeclarations(raw_ostream &OS) const override {
658 OS << " unsigned " << ArgSizeName << ";\n";
659 OS << " " << getType() << " *" << ArgName << ";";
662 void writePCHReadDecls(raw_ostream &OS) const override {
663 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
664 OS << " SmallVector<" << getType() << ", 4> "
665 << getLowerName() << ";\n";
666 OS << " " << getLowerName() << ".reserve(" << getLowerName()
669 // If we can't store the values in the current type (if it's something
670 // like StringRef), store them in a different type and convert the
671 // container afterwards.
672 std::string StorageType = getStorageType(getType());
673 std::string StorageName = getLowerName();
674 if (StorageType != getType()) {
675 StorageName += "Storage";
676 OS << " SmallVector<" << StorageType << ", 4> "
677 << StorageName << ";\n";
678 OS << " " << StorageName << ".reserve(" << getLowerName()
682 OS << " for (unsigned i = 0; i != " << getLowerName() << "Size; ++i)\n";
683 std::string read = ReadPCHRecord(Type);
684 OS << " " << StorageName << ".push_back(" << read << ");\n";
686 if (StorageType != getType()) {
687 OS << " for (unsigned i = 0; i != " << getLowerName() << "Size; ++i)\n";
688 OS << " " << getLowerName() << ".push_back("
689 << StorageName << "[i]);\n";
693 void writePCHReadArgs(raw_ostream &OS) const override {
694 OS << getLowerName() << ".data(), " << getLowerName() << "Size";
697 void writePCHWrite(raw_ostream &OS) const override {
698 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
699 OS << " for (auto &Val : SA->" << RangeName << "())\n";
700 OS << " " << WritePCHRecord(Type, "Val");
703 void writeValue(raw_ostream &OS) const override {
705 OS << " bool isFirst = true;\n"
706 << " for (const auto &Val : " << RangeName << "()) {\n"
707 << " if (isFirst) isFirst = false;\n"
708 << " else OS << \", \";\n";
714 void writeDump(raw_ostream &OS) const override {
715 OS << " for (const auto &Val : SA->" << RangeName << "())\n";
716 OS << " OS << \" \" << Val;\n";
720 // Unique the enums, but maintain the original declaration ordering.
721 std::vector<std::string>
722 uniqueEnumsInOrder(const std::vector<std::string> &enums) {
723 std::vector<std::string> uniques;
724 SmallDenseSet<StringRef, 8> unique_set;
725 for (const auto &i : enums) {
726 if (unique_set.insert(i).second)
727 uniques.push_back(i);
732 class EnumArgument : public Argument {
734 std::vector<std::string> values, enums, uniques;
736 EnumArgument(const Record &Arg, StringRef Attr)
737 : Argument(Arg, Attr), type(Arg.getValueAsString("Type")),
738 values(Arg.getValueAsListOfStrings("Values")),
739 enums(Arg.getValueAsListOfStrings("Enums")),
740 uniques(uniqueEnumsInOrder(enums))
742 // FIXME: Emit a proper error
743 assert(!uniques.empty());
746 bool isEnumArg() const override { return true; }
748 void writeAccessors(raw_ostream &OS) const override {
749 OS << " " << type << " get" << getUpperName() << "() const {\n";
750 OS << " return " << getLowerName() << ";\n";
754 void writeCloneArgs(raw_ostream &OS) const override {
755 OS << getLowerName();
758 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
759 OS << "A->get" << getUpperName() << "()";
761 void writeCtorInitializers(raw_ostream &OS) const override {
762 OS << getLowerName() << "(" << getUpperName() << ")";
764 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
765 OS << getLowerName() << "(" << type << "(0))";
767 void writeCtorParameters(raw_ostream &OS) const override {
768 OS << type << " " << getUpperName();
770 void writeDeclarations(raw_ostream &OS) const override {
771 auto i = uniques.cbegin(), e = uniques.cend();
772 // The last one needs to not have a comma.
776 OS << " enum " << type << " {\n";
778 OS << " " << *i << ",\n";
779 OS << " " << *e << "\n";
782 OS << " " << type << " " << getLowerName() << ";";
785 void writePCHReadDecls(raw_ostream &OS) const override {
786 OS << " " << getAttrName() << "Attr::" << type << " " << getLowerName()
787 << "(static_cast<" << getAttrName() << "Attr::" << type
788 << ">(Record.readInt()));\n";
791 void writePCHReadArgs(raw_ostream &OS) const override {
792 OS << getLowerName();
795 void writePCHWrite(raw_ostream &OS) const override {
796 OS << "Record.push_back(SA->get" << getUpperName() << "());\n";
799 void writeValue(raw_ostream &OS) const override {
800 // FIXME: this isn't 100% correct -- some enum arguments require printing
801 // as a string literal, while others require printing as an identifier.
802 // Tablegen currently does not distinguish between the two forms.
803 OS << "\\\"\" << " << getAttrName() << "Attr::Convert" << type << "ToStr(get"
804 << getUpperName() << "()) << \"\\\"";
807 void writeDump(raw_ostream &OS) const override {
808 OS << " switch(SA->get" << getUpperName() << "()) {\n";
809 for (const auto &I : uniques) {
810 OS << " case " << getAttrName() << "Attr::" << I << ":\n";
811 OS << " OS << \" " << I << "\";\n";
817 void writeConversion(raw_ostream &OS) const {
818 OS << " static bool ConvertStrTo" << type << "(StringRef Val, ";
819 OS << type << " &Out) {\n";
820 OS << " Optional<" << type << "> R = llvm::StringSwitch<Optional<";
821 OS << type << ">>(Val)\n";
822 for (size_t I = 0; I < enums.size(); ++I) {
823 OS << " .Case(\"" << values[I] << "\", ";
824 OS << getAttrName() << "Attr::" << enums[I] << ")\n";
826 OS << " .Default(Optional<" << type << ">());\n";
828 OS << " Out = *R;\n return true;\n }\n";
829 OS << " return false;\n";
832 // Mapping from enumeration values back to enumeration strings isn't
833 // trivial because some enumeration values have multiple named
834 // enumerators, such as type_visibility(internal) and
835 // type_visibility(hidden) both mapping to TypeVisibilityAttr::Hidden.
836 OS << " static const char *Convert" << type << "ToStr("
837 << type << " Val) {\n"
838 << " switch(Val) {\n";
839 SmallDenseSet<StringRef, 8> Uniques;
840 for (size_t I = 0; I < enums.size(); ++I) {
841 if (Uniques.insert(enums[I]).second)
842 OS << " case " << getAttrName() << "Attr::" << enums[I]
843 << ": return \"" << values[I] << "\";\n";
846 << " llvm_unreachable(\"No enumerator with that value\");\n"
851 class VariadicEnumArgument: public VariadicArgument {
852 std::string type, QualifiedTypeName;
853 std::vector<std::string> values, enums, uniques;
856 void writeValueImpl(raw_ostream &OS) const override {
857 // FIXME: this isn't 100% correct -- some enum arguments require printing
858 // as a string literal, while others require printing as an identifier.
859 // Tablegen currently does not distinguish between the two forms.
860 OS << " OS << \"\\\"\" << " << getAttrName() << "Attr::Convert" << type
861 << "ToStr(Val)" << "<< \"\\\"\";\n";
865 VariadicEnumArgument(const Record &Arg, StringRef Attr)
866 : VariadicArgument(Arg, Attr, Arg.getValueAsString("Type")),
867 type(Arg.getValueAsString("Type")),
868 values(Arg.getValueAsListOfStrings("Values")),
869 enums(Arg.getValueAsListOfStrings("Enums")),
870 uniques(uniqueEnumsInOrder(enums))
872 QualifiedTypeName = getAttrName().str() + "Attr::" + type;
874 // FIXME: Emit a proper error
875 assert(!uniques.empty());
878 bool isVariadicEnumArg() const override { return true; }
880 void writeDeclarations(raw_ostream &OS) const override {
881 auto i = uniques.cbegin(), e = uniques.cend();
882 // The last one needs to not have a comma.
886 OS << " enum " << type << " {\n";
888 OS << " " << *i << ",\n";
889 OS << " " << *e << "\n";
893 VariadicArgument::writeDeclarations(OS);
896 void writeDump(raw_ostream &OS) const override {
897 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
898 << "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->"
899 << getLowerName() << "_end(); I != E; ++I) {\n";
900 OS << " switch(*I) {\n";
901 for (const auto &UI : uniques) {
902 OS << " case " << getAttrName() << "Attr::" << UI << ":\n";
903 OS << " OS << \" " << UI << "\";\n";
910 void writePCHReadDecls(raw_ostream &OS) const override {
911 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
912 OS << " SmallVector<" << QualifiedTypeName << ", 4> " << getLowerName()
914 OS << " " << getLowerName() << ".reserve(" << getLowerName()
916 OS << " for (unsigned i = " << getLowerName() << "Size; i; --i)\n";
917 OS << " " << getLowerName() << ".push_back(" << "static_cast<"
918 << QualifiedTypeName << ">(Record.readInt()));\n";
921 void writePCHWrite(raw_ostream &OS) const override {
922 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
923 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
924 << "_iterator i = SA->" << getLowerName() << "_begin(), e = SA->"
925 << getLowerName() << "_end(); i != e; ++i)\n";
926 OS << " " << WritePCHRecord(QualifiedTypeName, "(*i)");
929 void writeConversion(raw_ostream &OS) const {
930 OS << " static bool ConvertStrTo" << type << "(StringRef Val, ";
931 OS << type << " &Out) {\n";
932 OS << " Optional<" << type << "> R = llvm::StringSwitch<Optional<";
933 OS << type << ">>(Val)\n";
934 for (size_t I = 0; I < enums.size(); ++I) {
935 OS << " .Case(\"" << values[I] << "\", ";
936 OS << getAttrName() << "Attr::" << enums[I] << ")\n";
938 OS << " .Default(Optional<" << type << ">());\n";
940 OS << " Out = *R;\n return true;\n }\n";
941 OS << " return false;\n";
944 OS << " static const char *Convert" << type << "ToStr("
945 << type << " Val) {\n"
946 << " switch(Val) {\n";
947 SmallDenseSet<StringRef, 8> Uniques;
948 for (size_t I = 0; I < enums.size(); ++I) {
949 if (Uniques.insert(enums[I]).second)
950 OS << " case " << getAttrName() << "Attr::" << enums[I]
951 << ": return \"" << values[I] << "\";\n";
954 << " llvm_unreachable(\"No enumerator with that value\");\n"
959 class VersionArgument : public Argument {
961 VersionArgument(const Record &Arg, StringRef Attr)
962 : Argument(Arg, Attr)
965 void writeAccessors(raw_ostream &OS) const override {
966 OS << " VersionTuple get" << getUpperName() << "() const {\n";
967 OS << " return " << getLowerName() << ";\n";
969 OS << " void set" << getUpperName()
970 << "(ASTContext &C, VersionTuple V) {\n";
971 OS << " " << getLowerName() << " = V;\n";
975 void writeCloneArgs(raw_ostream &OS) const override {
976 OS << "get" << getUpperName() << "()";
979 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
980 OS << "A->get" << getUpperName() << "()";
983 void writeCtorInitializers(raw_ostream &OS) const override {
984 OS << getLowerName() << "(" << getUpperName() << ")";
987 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
988 OS << getLowerName() << "()";
991 void writeCtorParameters(raw_ostream &OS) const override {
992 OS << "VersionTuple " << getUpperName();
995 void writeDeclarations(raw_ostream &OS) const override {
996 OS << "VersionTuple " << getLowerName() << ";\n";
999 void writePCHReadDecls(raw_ostream &OS) const override {
1000 OS << " VersionTuple " << getLowerName()
1001 << "= Record.readVersionTuple();\n";
1004 void writePCHReadArgs(raw_ostream &OS) const override {
1005 OS << getLowerName();
1008 void writePCHWrite(raw_ostream &OS) const override {
1009 OS << " Record.AddVersionTuple(SA->get" << getUpperName() << "());\n";
1012 void writeValue(raw_ostream &OS) const override {
1013 OS << getLowerName() << "=\" << get" << getUpperName() << "() << \"";
1016 void writeDump(raw_ostream &OS) const override {
1017 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
1021 class ExprArgument : public SimpleArgument {
1023 ExprArgument(const Record &Arg, StringRef Attr)
1024 : SimpleArgument(Arg, Attr, "Expr *")
1027 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1029 << "getDerived().TraverseStmt(A->get" << getUpperName() << "()))\n";
1030 OS << " return false;\n";
1033 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1034 OS << "tempInst" << getUpperName();
1037 void writeTemplateInstantiation(raw_ostream &OS) const override {
1038 OS << " " << getType() << " tempInst" << getUpperName() << ";\n";
1040 OS << " EnterExpressionEvaluationContext "
1041 << "Unevaluated(S, Sema::ExpressionEvaluationContext::Unevaluated);\n";
1042 OS << " ExprResult " << "Result = S.SubstExpr("
1043 << "A->get" << getUpperName() << "(), TemplateArgs);\n";
1044 OS << " tempInst" << getUpperName() << " = "
1045 << "Result.getAs<Expr>();\n";
1049 void writeDump(raw_ostream &OS) const override {}
1051 void writeDumpChildren(raw_ostream &OS) const override {
1052 OS << " dumpStmt(SA->get" << getUpperName() << "());\n";
1055 void writeHasChildren(raw_ostream &OS) const override { OS << "true"; }
1058 class VariadicExprArgument : public VariadicArgument {
1060 VariadicExprArgument(const Record &Arg, StringRef Attr)
1061 : VariadicArgument(Arg, Attr, "Expr *")
1064 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1066 OS << " " << getType() << " *I = A->" << getLowerName()
1068 OS << " " << getType() << " *E = A->" << getLowerName()
1070 OS << " for (; I != E; ++I) {\n";
1071 OS << " if (!getDerived().TraverseStmt(*I))\n";
1072 OS << " return false;\n";
1077 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1078 OS << "tempInst" << getUpperName() << ", "
1079 << "A->" << getLowerName() << "_size()";
1082 void writeTemplateInstantiation(raw_ostream &OS) const override {
1083 OS << " auto *tempInst" << getUpperName()
1084 << " = new (C, 16) " << getType()
1085 << "[A->" << getLowerName() << "_size()];\n";
1087 OS << " EnterExpressionEvaluationContext "
1088 << "Unevaluated(S, Sema::ExpressionEvaluationContext::Unevaluated);\n";
1089 OS << " " << getType() << " *TI = tempInst" << getUpperName()
1091 OS << " " << getType() << " *I = A->" << getLowerName()
1093 OS << " " << getType() << " *E = A->" << getLowerName()
1095 OS << " for (; I != E; ++I, ++TI) {\n";
1096 OS << " ExprResult Result = S.SubstExpr(*I, TemplateArgs);\n";
1097 OS << " *TI = Result.getAs<Expr>();\n";
1102 void writeDump(raw_ostream &OS) const override {}
1104 void writeDumpChildren(raw_ostream &OS) const override {
1105 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
1106 << "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->"
1107 << getLowerName() << "_end(); I != E; ++I)\n";
1108 OS << " dumpStmt(*I);\n";
1111 void writeHasChildren(raw_ostream &OS) const override {
1112 OS << "SA->" << getLowerName() << "_begin() != "
1113 << "SA->" << getLowerName() << "_end()";
1117 class VariadicStringArgument : public VariadicArgument {
1119 VariadicStringArgument(const Record &Arg, StringRef Attr)
1120 : VariadicArgument(Arg, Attr, "StringRef")
1123 void writeCtorBody(raw_ostream &OS) const override {
1124 OS << " for (size_t I = 0, E = " << getArgSizeName() << "; I != E;\n"
1126 " StringRef Ref = " << getUpperName() << "[I];\n"
1127 " if (!Ref.empty()) {\n"
1128 " char *Mem = new (Ctx, 1) char[Ref.size()];\n"
1129 " std::memcpy(Mem, Ref.data(), Ref.size());\n"
1130 " " << getArgName() << "[I] = StringRef(Mem, Ref.size());\n"
1135 void writeValueImpl(raw_ostream &OS) const override {
1136 OS << " OS << \"\\\"\" << Val << \"\\\"\";\n";
1140 class TypeArgument : public SimpleArgument {
1142 TypeArgument(const Record &Arg, StringRef Attr)
1143 : SimpleArgument(Arg, Attr, "TypeSourceInfo *")
1146 void writeAccessors(raw_ostream &OS) const override {
1147 OS << " QualType get" << getUpperName() << "() const {\n";
1148 OS << " return " << getLowerName() << "->getType();\n";
1150 OS << " " << getType() << " get" << getUpperName() << "Loc() const {\n";
1151 OS << " return " << getLowerName() << ";\n";
1155 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1156 OS << "A->get" << getUpperName() << "Loc()";
1159 void writePCHWrite(raw_ostream &OS) const override {
1160 OS << " " << WritePCHRecord(
1161 getType(), "SA->get" + std::string(getUpperName()) + "Loc()");
1165 } // end anonymous namespace
1167 static std::unique_ptr<Argument>
1168 createArgument(const Record &Arg, StringRef Attr,
1169 const Record *Search = nullptr) {
1173 std::unique_ptr<Argument> Ptr;
1174 llvm::StringRef ArgName = Search->getName();
1176 if (ArgName == "AlignedArgument")
1177 Ptr = llvm::make_unique<AlignedArgument>(Arg, Attr);
1178 else if (ArgName == "EnumArgument")
1179 Ptr = llvm::make_unique<EnumArgument>(Arg, Attr);
1180 else if (ArgName == "ExprArgument")
1181 Ptr = llvm::make_unique<ExprArgument>(Arg, Attr);
1182 else if (ArgName == "FunctionArgument")
1183 Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "FunctionDecl *");
1184 else if (ArgName == "IdentifierArgument")
1185 Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "IdentifierInfo *");
1186 else if (ArgName == "DefaultBoolArgument")
1187 Ptr = llvm::make_unique<DefaultSimpleArgument>(
1188 Arg, Attr, "bool", Arg.getValueAsBit("Default"));
1189 else if (ArgName == "BoolArgument")
1190 Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "bool");
1191 else if (ArgName == "DefaultIntArgument")
1192 Ptr = llvm::make_unique<DefaultSimpleArgument>(
1193 Arg, Attr, "int", Arg.getValueAsInt("Default"));
1194 else if (ArgName == "IntArgument")
1195 Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "int");
1196 else if (ArgName == "StringArgument")
1197 Ptr = llvm::make_unique<StringArgument>(Arg, Attr);
1198 else if (ArgName == "TypeArgument")
1199 Ptr = llvm::make_unique<TypeArgument>(Arg, Attr);
1200 else if (ArgName == "UnsignedArgument")
1201 Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "unsigned");
1202 else if (ArgName == "VariadicUnsignedArgument")
1203 Ptr = llvm::make_unique<VariadicArgument>(Arg, Attr, "unsigned");
1204 else if (ArgName == "VariadicStringArgument")
1205 Ptr = llvm::make_unique<VariadicStringArgument>(Arg, Attr);
1206 else if (ArgName == "VariadicEnumArgument")
1207 Ptr = llvm::make_unique<VariadicEnumArgument>(Arg, Attr);
1208 else if (ArgName == "VariadicExprArgument")
1209 Ptr = llvm::make_unique<VariadicExprArgument>(Arg, Attr);
1210 else if (ArgName == "VersionArgument")
1211 Ptr = llvm::make_unique<VersionArgument>(Arg, Attr);
1214 // Search in reverse order so that the most-derived type is handled first.
1215 ArrayRef<std::pair<Record*, SMRange>> Bases = Search->getSuperClasses();
1216 for (const auto &Base : llvm::reverse(Bases)) {
1217 if ((Ptr = createArgument(Arg, Attr, Base.first)))
1222 if (Ptr && Arg.getValueAsBit("Optional"))
1223 Ptr->setOptional(true);
1225 if (Ptr && Arg.getValueAsBit("Fake"))
1231 static void writeAvailabilityValue(raw_ostream &OS) {
1232 OS << "\" << getPlatform()->getName();\n"
1233 << " if (getStrict()) OS << \", strict\";\n"
1234 << " if (!getIntroduced().empty()) OS << \", introduced=\" << getIntroduced();\n"
1235 << " if (!getDeprecated().empty()) OS << \", deprecated=\" << getDeprecated();\n"
1236 << " if (!getObsoleted().empty()) OS << \", obsoleted=\" << getObsoleted();\n"
1237 << " if (getUnavailable()) OS << \", unavailable\";\n"
1241 static void writeDeprecatedAttrValue(raw_ostream &OS, std::string &Variety) {
1242 OS << "\\\"\" << getMessage() << \"\\\"\";\n";
1243 // Only GNU deprecated has an optional fixit argument at the second position.
1244 if (Variety == "GNU")
1245 OS << " if (!getReplacement().empty()) OS << \", \\\"\""
1246 " << getReplacement() << \"\\\"\";\n";
1250 static void writeGetSpellingFunction(Record &R, raw_ostream &OS) {
1251 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
1253 OS << "const char *" << R.getName() << "Attr::getSpelling() const {\n";
1254 if (Spellings.empty()) {
1255 OS << " return \"(No spelling)\";\n}\n\n";
1259 OS << " switch (SpellingListIndex) {\n"
1261 " llvm_unreachable(\"Unknown attribute spelling!\");\n"
1262 " return \"(No spelling)\";\n";
1264 for (unsigned I = 0; I < Spellings.size(); ++I)
1265 OS << " case " << I << ":\n"
1266 " return \"" << Spellings[I].name() << "\";\n";
1267 // End of the switch statement.
1269 // End of the getSpelling function.
1274 writePrettyPrintFunction(Record &R,
1275 const std::vector<std::unique_ptr<Argument>> &Args,
1277 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
1279 OS << "void " << R.getName() << "Attr::printPretty("
1280 << "raw_ostream &OS, const PrintingPolicy &Policy) const {\n";
1282 if (Spellings.empty()) {
1288 " switch (SpellingListIndex) {\n"
1290 " llvm_unreachable(\"Unknown attribute spelling!\");\n"
1293 for (unsigned I = 0; I < Spellings.size(); ++ I) {
1294 llvm::SmallString<16> Prefix;
1295 llvm::SmallString<8> Suffix;
1296 // The actual spelling of the name and namespace (if applicable)
1297 // of an attribute without considering prefix and suffix.
1298 llvm::SmallString<64> Spelling;
1299 std::string Name = Spellings[I].name();
1300 std::string Variety = Spellings[I].variety();
1302 if (Variety == "GNU") {
1303 Prefix = " __attribute__((";
1305 } else if (Variety == "CXX11") {
1308 std::string Namespace = Spellings[I].nameSpace();
1309 if (!Namespace.empty()) {
1310 Spelling += Namespace;
1313 } else if (Variety == "Declspec") {
1314 Prefix = " __declspec(";
1316 } else if (Variety == "Microsoft") {
1319 } else if (Variety == "Keyword") {
1322 } else if (Variety == "Pragma") {
1323 Prefix = "#pragma ";
1325 std::string Namespace = Spellings[I].nameSpace();
1326 if (!Namespace.empty()) {
1327 Spelling += Namespace;
1331 llvm_unreachable("Unknown attribute syntax variety!");
1337 " case " << I << " : {\n"
1338 " OS << \"" << Prefix << Spelling;
1340 if (Variety == "Pragma") {
1342 OS << " printPrettyPragma(OS, Policy);\n";
1343 OS << " OS << \"\\n\";";
1349 // Fake arguments aren't part of the parsed form and should not be
1351 bool hasNonFakeArgs = llvm::any_of(
1352 Args, [](const std::unique_ptr<Argument> &A) { return !A->isFake(); });
1354 // FIXME: always printing the parenthesis isn't the correct behavior for
1355 // attributes which have optional arguments that were not provided. For
1356 // instance: __attribute__((aligned)) will be pretty printed as
1357 // __attribute__((aligned())). The logic should check whether there is only
1358 // a single argument, and if it is optional, whether it has been provided.
1361 if (Spelling == "availability") {
1362 writeAvailabilityValue(OS);
1363 } else if (Spelling == "deprecated" || Spelling == "gnu::deprecated") {
1364 writeDeprecatedAttrValue(OS, Variety);
1367 for (const auto &arg : Args) {
1368 if (arg->isFake()) continue;
1369 if (index++) OS << ", ";
1370 arg->writeValue(OS);
1376 OS << Suffix + "\";\n";
1383 // End of the switch statement.
1385 // End of the print function.
1389 /// \brief Return the index of a spelling in a spelling list.
1391 getSpellingListIndex(const std::vector<FlattenedSpelling> &SpellingList,
1392 const FlattenedSpelling &Spelling) {
1393 assert(!SpellingList.empty() && "Spelling list is empty!");
1395 for (unsigned Index = 0; Index < SpellingList.size(); ++Index) {
1396 const FlattenedSpelling &S = SpellingList[Index];
1397 if (S.variety() != Spelling.variety())
1399 if (S.nameSpace() != Spelling.nameSpace())
1401 if (S.name() != Spelling.name())
1407 llvm_unreachable("Unknown spelling!");
1410 static void writeAttrAccessorDefinition(const Record &R, raw_ostream &OS) {
1411 std::vector<Record*> Accessors = R.getValueAsListOfDefs("Accessors");
1412 if (Accessors.empty())
1415 const std::vector<FlattenedSpelling> SpellingList = GetFlattenedSpellings(R);
1416 assert(!SpellingList.empty() &&
1417 "Attribute with empty spelling list can't have accessors!");
1418 for (const auto *Accessor : Accessors) {
1419 std::string Name = Accessor->getValueAsString("Name");
1420 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Accessor);
1422 OS << " bool " << Name << "() const { return SpellingListIndex == ";
1423 for (unsigned Index = 0; Index < Spellings.size(); ++Index) {
1424 OS << getSpellingListIndex(SpellingList, Spellings[Index]);
1425 if (Index != Spellings.size() - 1)
1426 OS << " ||\n SpellingListIndex == ";
1434 SpellingNamesAreCommon(const std::vector<FlattenedSpelling>& Spellings) {
1435 assert(!Spellings.empty() && "An empty list of spellings was provided");
1436 std::string FirstName = NormalizeNameForSpellingComparison(
1437 Spellings.front().name());
1438 for (const auto &Spelling :
1439 llvm::make_range(std::next(Spellings.begin()), Spellings.end())) {
1440 std::string Name = NormalizeNameForSpellingComparison(Spelling.name());
1441 if (Name != FirstName)
1447 typedef std::map<unsigned, std::string> SemanticSpellingMap;
1449 CreateSemanticSpellings(const std::vector<FlattenedSpelling> &Spellings,
1450 SemanticSpellingMap &Map) {
1451 // The enumerants are automatically generated based on the variety,
1452 // namespace (if present) and name for each attribute spelling. However,
1453 // care is taken to avoid trampling on the reserved namespace due to
1455 std::string Ret(" enum Spelling {\n");
1456 std::set<std::string> Uniques;
1458 for (auto I = Spellings.begin(), E = Spellings.end(); I != E; ++I, ++Idx) {
1459 const FlattenedSpelling &S = *I;
1460 const std::string &Variety = S.variety();
1461 const std::string &Spelling = S.name();
1462 const std::string &Namespace = S.nameSpace();
1463 std::string EnumName;
1465 EnumName += (Variety + "_");
1466 if (!Namespace.empty())
1467 EnumName += (NormalizeNameForSpellingComparison(Namespace).str() +
1469 EnumName += NormalizeNameForSpellingComparison(Spelling);
1471 // Even if the name is not unique, this spelling index corresponds to a
1472 // particular enumerant name that we've calculated.
1473 Map[Idx] = EnumName;
1475 // Since we have been stripping underscores to avoid trampling on the
1476 // reserved namespace, we may have inadvertently created duplicate
1477 // enumerant names. These duplicates are not considered part of the
1478 // semantic spelling, and can be elided.
1479 if (Uniques.find(EnumName) != Uniques.end())
1482 Uniques.insert(EnumName);
1483 if (I != Spellings.begin())
1485 // Duplicate spellings are not considered part of the semantic spelling
1486 // enumeration, but the spelling index and semantic spelling values are
1487 // meant to be equivalent, so we must specify a concrete value for each
1489 Ret += " " + EnumName + " = " + llvm::utostr(Idx);
1495 void WriteSemanticSpellingSwitch(const std::string &VarName,
1496 const SemanticSpellingMap &Map,
1498 OS << " switch (" << VarName << ") {\n default: "
1499 << "llvm_unreachable(\"Unknown spelling list index\");\n";
1500 for (const auto &I : Map)
1501 OS << " case " << I.first << ": return " << I.second << ";\n";
1505 // Emits the LateParsed property for attributes.
1506 static void emitClangAttrLateParsedList(RecordKeeper &Records, raw_ostream &OS) {
1507 OS << "#if defined(CLANG_ATTR_LATE_PARSED_LIST)\n";
1508 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
1510 for (const auto *Attr : Attrs) {
1511 bool LateParsed = Attr->getValueAsBit("LateParsed");
1514 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr);
1516 // FIXME: Handle non-GNU attributes
1517 for (const auto &I : Spellings) {
1518 if (I.variety() != "GNU")
1520 OS << ".Case(\"" << I.name() << "\", " << LateParsed << ")\n";
1524 OS << "#endif // CLANG_ATTR_LATE_PARSED_LIST\n\n";
1527 static bool hasGNUorCXX11Spelling(const Record &Attribute) {
1528 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attribute);
1529 for (const auto &I : Spellings) {
1530 if (I.variety() == "GNU" || I.variety() == "CXX11")
1538 struct AttributeSubjectMatchRule {
1539 const Record *MetaSubject;
1540 const Record *Constraint;
1542 AttributeSubjectMatchRule(const Record *MetaSubject, const Record *Constraint)
1543 : MetaSubject(MetaSubject), Constraint(Constraint) {
1544 assert(MetaSubject && "Missing subject");
1547 bool isSubRule() const { return Constraint != nullptr; }
1549 std::vector<Record *> getSubjects() const {
1550 return (Constraint ? Constraint : MetaSubject)
1551 ->getValueAsListOfDefs("Subjects");
1554 std::vector<Record *> getLangOpts() const {
1556 // Lookup the options in the sub-rule first, in case the sub-rule
1557 // overrides the rules options.
1558 std::vector<Record *> Opts = Constraint->getValueAsListOfDefs("LangOpts");
1562 return MetaSubject->getValueAsListOfDefs("LangOpts");
1565 // Abstract rules are used only for sub-rules
1566 bool isAbstractRule() const { return getSubjects().empty(); }
1568 std::string getName() const {
1569 return (Constraint ? Constraint : MetaSubject)->getValueAsString("Name");
1572 bool isNegatedSubRule() const {
1573 assert(isSubRule() && "Not a sub-rule");
1574 return Constraint->getValueAsBit("Negated");
1577 std::string getSpelling() const {
1578 std::string Result = MetaSubject->getValueAsString("Name");
1581 if (isNegatedSubRule())
1582 Result += "unless(";
1583 Result += getName();
1584 if (isNegatedSubRule())
1591 std::string getEnumValueName() const {
1592 std::string Result =
1593 "SubjectMatchRule_" + MetaSubject->getValueAsString("Name");
1596 if (isNegatedSubRule())
1598 Result += Constraint->getValueAsString("Name");
1600 if (isAbstractRule())
1601 Result += "_abstract";
1605 std::string getEnumValue() const { return "attr::" + getEnumValueName(); }
1607 static const char *EnumName;
1610 const char *AttributeSubjectMatchRule::EnumName = "attr::SubjectMatchRule";
1612 struct PragmaClangAttributeSupport {
1613 std::vector<AttributeSubjectMatchRule> Rules;
1615 class RuleOrAggregateRuleSet {
1616 std::vector<AttributeSubjectMatchRule> Rules;
1618 RuleOrAggregateRuleSet(ArrayRef<AttributeSubjectMatchRule> Rules,
1620 : Rules(Rules), IsRule(IsRule) {}
1623 bool isRule() const { return IsRule; }
1625 const AttributeSubjectMatchRule &getRule() const {
1626 assert(IsRule && "not a rule!");
1630 ArrayRef<AttributeSubjectMatchRule> getAggregateRuleSet() const {
1634 static RuleOrAggregateRuleSet
1635 getRule(const AttributeSubjectMatchRule &Rule) {
1636 return RuleOrAggregateRuleSet(Rule, /*IsRule=*/true);
1638 static RuleOrAggregateRuleSet
1639 getAggregateRuleSet(ArrayRef<AttributeSubjectMatchRule> Rules) {
1640 return RuleOrAggregateRuleSet(Rules, /*IsRule=*/false);
1643 llvm::DenseMap<const Record *, RuleOrAggregateRuleSet> SubjectsToRules;
1645 PragmaClangAttributeSupport(RecordKeeper &Records);
1647 bool isAttributedSupported(const Record &Attribute);
1649 void emitMatchRuleList(raw_ostream &OS);
1651 std::string generateStrictConformsTo(const Record &Attr, raw_ostream &OS);
1653 void generateParsingHelpers(raw_ostream &OS);
1656 } // end anonymous namespace
1658 static bool doesDeclDeriveFrom(const Record *D, const Record *Base) {
1659 const Record *CurrentBase = D->getValueAsDef("Base");
1662 if (CurrentBase == Base)
1664 return doesDeclDeriveFrom(CurrentBase, Base);
1667 PragmaClangAttributeSupport::PragmaClangAttributeSupport(
1668 RecordKeeper &Records) {
1669 std::vector<Record *> MetaSubjects =
1670 Records.getAllDerivedDefinitions("AttrSubjectMatcherRule");
1671 auto MapFromSubjectsToRules = [this](const Record *SubjectContainer,
1672 const Record *MetaSubject,
1673 const Record *Constraint = nullptr) {
1674 Rules.emplace_back(MetaSubject, Constraint);
1675 std::vector<Record *> ApplicableSubjects =
1676 SubjectContainer->getValueAsListOfDefs("Subjects");
1677 for (const auto *Subject : ApplicableSubjects) {
1680 .try_emplace(Subject, RuleOrAggregateRuleSet::getRule(
1681 AttributeSubjectMatchRule(MetaSubject,
1685 PrintFatalError("Attribute subject match rules should not represent"
1686 "same attribute subjects.");
1690 for (const auto *MetaSubject : MetaSubjects) {
1691 MapFromSubjectsToRules(MetaSubject, MetaSubject);
1692 std::vector<Record *> Constraints =
1693 MetaSubject->getValueAsListOfDefs("Constraints");
1694 for (const auto *Constraint : Constraints)
1695 MapFromSubjectsToRules(Constraint, MetaSubject, Constraint);
1698 std::vector<Record *> Aggregates =
1699 Records.getAllDerivedDefinitions("AttrSubjectMatcherAggregateRule");
1700 std::vector<Record *> DeclNodes = Records.getAllDerivedDefinitions("DDecl");
1701 for (const auto *Aggregate : Aggregates) {
1702 Record *SubjectDecl = Aggregate->getValueAsDef("Subject");
1704 // Gather sub-classes of the aggregate subject that act as attribute
1706 std::vector<AttributeSubjectMatchRule> Rules;
1707 for (const auto *D : DeclNodes) {
1708 if (doesDeclDeriveFrom(D, SubjectDecl)) {
1709 auto It = SubjectsToRules.find(D);
1710 if (It == SubjectsToRules.end())
1712 if (!It->second.isRule() || It->second.getRule().isSubRule())
1713 continue; // Assume that the rule will be included as well.
1714 Rules.push_back(It->second.getRule());
1720 .try_emplace(SubjectDecl,
1721 RuleOrAggregateRuleSet::getAggregateRuleSet(Rules))
1724 PrintFatalError("Attribute subject match rules should not represent"
1725 "same attribute subjects.");
1730 static PragmaClangAttributeSupport &
1731 getPragmaAttributeSupport(RecordKeeper &Records) {
1732 static PragmaClangAttributeSupport Instance(Records);
1736 void PragmaClangAttributeSupport::emitMatchRuleList(raw_ostream &OS) {
1737 OS << "#ifndef ATTR_MATCH_SUB_RULE\n";
1738 OS << "#define ATTR_MATCH_SUB_RULE(Value, Spelling, IsAbstract, Parent, "
1740 << "ATTR_MATCH_RULE(Value, Spelling, IsAbstract)\n";
1742 for (const auto &Rule : Rules) {
1743 OS << (Rule.isSubRule() ? "ATTR_MATCH_SUB_RULE" : "ATTR_MATCH_RULE") << '(';
1744 OS << Rule.getEnumValueName() << ", \"" << Rule.getSpelling() << "\", "
1745 << Rule.isAbstractRule();
1746 if (Rule.isSubRule())
1748 << AttributeSubjectMatchRule(Rule.MetaSubject, nullptr).getEnumValue()
1749 << ", " << Rule.isNegatedSubRule();
1752 OS << "#undef ATTR_MATCH_SUB_RULE\n";
1755 bool PragmaClangAttributeSupport::isAttributedSupported(
1756 const Record &Attribute) {
1757 if (Attribute.getValueAsBit("ForcePragmaAttributeSupport"))
1760 // FIXME: The documentation check should be moved before
1761 // the ForcePragmaAttributeSupport check after annotate is documented.
1762 // No documentation present.
1763 if (Attribute.isValueUnset("Documentation"))
1765 std::vector<Record *> Docs = Attribute.getValueAsListOfDefs("Documentation");
1768 if (Docs.size() == 1 && Docs[0]->getName() == "Undocumented")
1770 // An attribute requires delayed parsing (LateParsed is on)
1771 if (Attribute.getValueAsBit("LateParsed"))
1773 // An attribute has no GNU/CXX11 spelling
1774 if (!hasGNUorCXX11Spelling(Attribute))
1776 // An attribute subject list has a subject that isn't covered by one of the
1777 // subject match rules or has no subjects at all.
1778 if (Attribute.isValueUnset("Subjects"))
1780 const Record *SubjectObj = Attribute.getValueAsDef("Subjects");
1781 std::vector<Record *> Subjects = SubjectObj->getValueAsListOfDefs("Subjects");
1782 if (Subjects.empty())
1784 for (const auto *Subject : Subjects) {
1785 if (SubjectsToRules.find(Subject) == SubjectsToRules.end())
1792 PragmaClangAttributeSupport::generateStrictConformsTo(const Record &Attr,
1794 if (!isAttributedSupported(Attr))
1796 // Generate a function that constructs a set of matching rules that describe
1797 // to which declarations the attribute should apply to.
1798 std::string FnName = "matchRulesFor" + Attr.getName().str();
1799 std::stringstream SS;
1800 SS << "static void " << FnName << "(llvm::SmallVectorImpl<std::pair<"
1801 << AttributeSubjectMatchRule::EnumName
1802 << ", bool>> &MatchRules, const LangOptions &LangOpts) {\n";
1803 if (Attr.isValueUnset("Subjects")) {
1808 const Record *SubjectObj = Attr.getValueAsDef("Subjects");
1809 std::vector<Record *> Subjects = SubjectObj->getValueAsListOfDefs("Subjects");
1810 for (const auto *Subject : Subjects) {
1811 auto It = SubjectsToRules.find(Subject);
1812 assert(It != SubjectsToRules.end() &&
1813 "This attribute is unsupported by #pragma clang attribute");
1814 for (const auto &Rule : It->getSecond().getAggregateRuleSet()) {
1815 // The rule might be language specific, so only subtract it from the given
1816 // rules if the specific language options are specified.
1817 std::vector<Record *> LangOpts = Rule.getLangOpts();
1818 SS << " MatchRules.push_back(std::make_pair(" << Rule.getEnumValue()
1819 << ", /*IsSupported=*/";
1820 if (!LangOpts.empty()) {
1821 for (auto I = LangOpts.begin(), E = LangOpts.end(); I != E; ++I) {
1822 std::string Part = (*I)->getValueAsString("Name");
1823 if ((*I)->getValueAsBit("Negated"))
1825 SS << "LangOpts." + Part;
1839 void PragmaClangAttributeSupport::generateParsingHelpers(raw_ostream &OS) {
1840 // Generate routines that check the names of sub-rules.
1841 OS << "Optional<attr::SubjectMatchRule> "
1842 "defaultIsAttributeSubjectMatchSubRuleFor(StringRef, bool) {\n";
1843 OS << " return None;\n";
1846 std::map<const Record *, std::vector<AttributeSubjectMatchRule>>
1848 for (const auto &Rule : Rules) {
1849 if (!Rule.isSubRule())
1851 SubMatchRules[Rule.MetaSubject].push_back(Rule);
1854 for (const auto &SubMatchRule : SubMatchRules) {
1855 OS << "Optional<attr::SubjectMatchRule> isAttributeSubjectMatchSubRuleFor_"
1856 << SubMatchRule.first->getValueAsString("Name")
1857 << "(StringRef Name, bool IsUnless) {\n";
1858 OS << " if (IsUnless)\n";
1860 "llvm::StringSwitch<Optional<attr::SubjectMatchRule>>(Name).\n";
1861 for (const auto &Rule : SubMatchRule.second) {
1862 if (Rule.isNegatedSubRule())
1863 OS << " Case(\"" << Rule.getName() << "\", " << Rule.getEnumValue()
1866 OS << " Default(None);\n";
1868 "llvm::StringSwitch<Optional<attr::SubjectMatchRule>>(Name).\n";
1869 for (const auto &Rule : SubMatchRule.second) {
1870 if (!Rule.isNegatedSubRule())
1871 OS << " Case(\"" << Rule.getName() << "\", " << Rule.getEnumValue()
1874 OS << " Default(None);\n";
1878 // Generate the function that checks for the top-level rules.
1879 OS << "std::pair<Optional<attr::SubjectMatchRule>, "
1880 "Optional<attr::SubjectMatchRule> (*)(StringRef, "
1881 "bool)> isAttributeSubjectMatchRule(StringRef Name) {\n";
1883 "llvm::StringSwitch<std::pair<Optional<attr::SubjectMatchRule>, "
1884 "Optional<attr::SubjectMatchRule> (*) (StringRef, "
1886 for (const auto &Rule : Rules) {
1887 if (Rule.isSubRule())
1889 std::string SubRuleFunction;
1890 if (SubMatchRules.count(Rule.MetaSubject))
1891 SubRuleFunction = "isAttributeSubjectMatchSubRuleFor_" + Rule.getName();
1893 SubRuleFunction = "defaultIsAttributeSubjectMatchSubRuleFor";
1894 OS << " Case(\"" << Rule.getName() << "\", std::make_pair("
1895 << Rule.getEnumValue() << ", " << SubRuleFunction << ")).\n";
1897 OS << " Default(std::make_pair(None, "
1898 "defaultIsAttributeSubjectMatchSubRuleFor));\n";
1901 // Generate the function that checks for the submatch rules.
1902 OS << "const char *validAttributeSubjectMatchSubRules("
1903 << AttributeSubjectMatchRule::EnumName << " Rule) {\n";
1904 OS << " switch (Rule) {\n";
1905 for (const auto &SubMatchRule : SubMatchRules) {
1907 << AttributeSubjectMatchRule(SubMatchRule.first, nullptr).getEnumValue()
1909 OS << " return \"'";
1910 bool IsFirst = true;
1911 for (const auto &Rule : SubMatchRule.second) {
1915 if (Rule.isNegatedSubRule())
1917 OS << Rule.getName();
1918 if (Rule.isNegatedSubRule())
1924 OS << " default: return nullptr;\n";
1929 template <typename Fn>
1930 static void forEachUniqueSpelling(const Record &Attr, Fn &&F) {
1931 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
1932 SmallDenseSet<StringRef, 8> Seen;
1933 for (const FlattenedSpelling &S : Spellings) {
1934 if (Seen.insert(S.name()).second)
1939 /// \brief Emits the first-argument-is-type property for attributes.
1940 static void emitClangAttrTypeArgList(RecordKeeper &Records, raw_ostream &OS) {
1941 OS << "#if defined(CLANG_ATTR_TYPE_ARG_LIST)\n";
1942 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
1944 for (const auto *Attr : Attrs) {
1945 // Determine whether the first argument is a type.
1946 std::vector<Record *> Args = Attr->getValueAsListOfDefs("Args");
1950 if (Args[0]->getSuperClasses().back().first->getName() != "TypeArgument")
1953 // All these spellings take a single type argument.
1954 forEachUniqueSpelling(*Attr, [&](const FlattenedSpelling &S) {
1955 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
1958 OS << "#endif // CLANG_ATTR_TYPE_ARG_LIST\n\n";
1961 /// \brief Emits the parse-arguments-in-unevaluated-context property for
1963 static void emitClangAttrArgContextList(RecordKeeper &Records, raw_ostream &OS) {
1964 OS << "#if defined(CLANG_ATTR_ARG_CONTEXT_LIST)\n";
1965 ParsedAttrMap Attrs = getParsedAttrList(Records);
1966 for (const auto &I : Attrs) {
1967 const Record &Attr = *I.second;
1969 if (!Attr.getValueAsBit("ParseArgumentsAsUnevaluated"))
1972 // All these spellings take are parsed unevaluated.
1973 forEachUniqueSpelling(Attr, [&](const FlattenedSpelling &S) {
1974 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
1977 OS << "#endif // CLANG_ATTR_ARG_CONTEXT_LIST\n\n";
1980 static bool isIdentifierArgument(Record *Arg) {
1981 return !Arg->getSuperClasses().empty() &&
1982 llvm::StringSwitch<bool>(Arg->getSuperClasses().back().first->getName())
1983 .Case("IdentifierArgument", true)
1984 .Case("EnumArgument", true)
1985 .Case("VariadicEnumArgument", true)
1989 // Emits the first-argument-is-identifier property for attributes.
1990 static void emitClangAttrIdentifierArgList(RecordKeeper &Records, raw_ostream &OS) {
1991 OS << "#if defined(CLANG_ATTR_IDENTIFIER_ARG_LIST)\n";
1992 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
1994 for (const auto *Attr : Attrs) {
1995 // Determine whether the first argument is an identifier.
1996 std::vector<Record *> Args = Attr->getValueAsListOfDefs("Args");
1997 if (Args.empty() || !isIdentifierArgument(Args[0]))
2000 // All these spellings take an identifier argument.
2001 forEachUniqueSpelling(*Attr, [&](const FlattenedSpelling &S) {
2002 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
2005 OS << "#endif // CLANG_ATTR_IDENTIFIER_ARG_LIST\n\n";
2010 // Emits the class definitions for attributes.
2011 void EmitClangAttrClass(RecordKeeper &Records, raw_ostream &OS) {
2012 emitSourceFileHeader("Attribute classes' definitions", OS);
2014 OS << "#ifndef LLVM_CLANG_ATTR_CLASSES_INC\n";
2015 OS << "#define LLVM_CLANG_ATTR_CLASSES_INC\n\n";
2017 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
2019 for (const auto *Attr : Attrs) {
2020 const Record &R = *Attr;
2022 // FIXME: Currently, documentation is generated as-needed due to the fact
2023 // that there is no way to allow a generated project "reach into" the docs
2024 // directory (for instance, it may be an out-of-tree build). However, we want
2025 // to ensure that every attribute has a Documentation field, and produce an
2026 // error if it has been neglected. Otherwise, the on-demand generation which
2027 // happens server-side will fail. This code is ensuring that functionality,
2028 // even though this Emitter doesn't technically need the documentation.
2029 // When attribute documentation can be generated as part of the build
2030 // itself, this code can be removed.
2031 (void)R.getValueAsListOfDefs("Documentation");
2033 if (!R.getValueAsBit("ASTNode"))
2036 ArrayRef<std::pair<Record *, SMRange>> Supers = R.getSuperClasses();
2037 assert(!Supers.empty() && "Forgot to specify a superclass for the attr");
2038 std::string SuperName;
2039 for (const auto &Super : llvm::reverse(Supers)) {
2040 const Record *R = Super.first;
2041 if (R->getName() != "TargetSpecificAttr" && SuperName.empty())
2042 SuperName = R->getName();
2045 OS << "class " << R.getName() << "Attr : public " << SuperName << " {\n";
2047 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
2048 std::vector<std::unique_ptr<Argument>> Args;
2049 Args.reserve(ArgRecords.size());
2051 bool HasOptArg = false;
2052 bool HasFakeArg = false;
2053 for (const auto *ArgRecord : ArgRecords) {
2054 Args.emplace_back(createArgument(*ArgRecord, R.getName()));
2055 Args.back()->writeDeclarations(OS);
2058 // For these purposes, fake takes priority over optional.
2059 if (Args.back()->isFake()) {
2061 } else if (Args.back()->isOptional()) {
2068 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
2070 // If there are zero or one spellings, all spelling-related functionality
2071 // can be elided. If all of the spellings share the same name, the spelling
2072 // functionality can also be elided.
2073 bool ElideSpelling = (Spellings.size() <= 1) ||
2074 SpellingNamesAreCommon(Spellings);
2076 // This maps spelling index values to semantic Spelling enumerants.
2077 SemanticSpellingMap SemanticToSyntacticMap;
2080 OS << CreateSemanticSpellings(Spellings, SemanticToSyntacticMap);
2082 // Emit CreateImplicit factory methods.
2083 auto emitCreateImplicit = [&](bool emitFake) {
2084 OS << " static " << R.getName() << "Attr *CreateImplicit(";
2085 OS << "ASTContext &Ctx";
2087 OS << ", Spelling S";
2088 for (auto const &ai : Args) {
2089 if (ai->isFake() && !emitFake) continue;
2091 ai->writeCtorParameters(OS);
2093 OS << ", SourceRange Loc = SourceRange()";
2095 OS << " auto *A = new (Ctx) " << R.getName();
2096 OS << "Attr(Loc, Ctx, ";
2097 for (auto const &ai : Args) {
2098 if (ai->isFake() && !emitFake) continue;
2099 ai->writeImplicitCtorArgs(OS);
2102 OS << (ElideSpelling ? "0" : "S") << ");\n";
2103 OS << " A->setImplicit(true);\n";
2104 OS << " return A;\n }\n\n";
2107 // Emit a CreateImplicit that takes all the arguments.
2108 emitCreateImplicit(true);
2110 // Emit a CreateImplicit that takes all the non-fake arguments.
2112 emitCreateImplicit(false);
2115 // Emit constructors.
2116 auto emitCtor = [&](bool emitOpt, bool emitFake) {
2117 auto shouldEmitArg = [=](const std::unique_ptr<Argument> &arg) {
2118 if (arg->isFake()) return emitFake;
2119 if (arg->isOptional()) return emitOpt;
2123 OS << " " << R.getName() << "Attr(SourceRange R, ASTContext &Ctx\n";
2124 for (auto const &ai : Args) {
2125 if (!shouldEmitArg(ai)) continue;
2127 ai->writeCtorParameters(OS);
2132 OS << "unsigned SI\n";
2135 OS << " : " << SuperName << "(attr::" << R.getName() << ", R, SI, "
2136 << ( R.getValueAsBit("LateParsed") ? "true" : "false" ) << ", "
2137 << ( R.getValueAsBit("DuplicatesAllowedWhileMerging") ? "true" : "false" ) << ")\n";
2139 for (auto const &ai : Args) {
2141 if (!shouldEmitArg(ai)) {
2142 ai->writeCtorDefaultInitializers(OS);
2144 ai->writeCtorInitializers(OS);
2151 for (auto const &ai : Args) {
2152 if (!shouldEmitArg(ai)) continue;
2153 ai->writeCtorBody(OS);
2158 // Emit a constructor that includes all the arguments.
2159 // This is necessary for cloning.
2160 emitCtor(true, true);
2162 // Emit a constructor that takes all the non-fake arguments.
2164 emitCtor(true, false);
2167 // Emit a constructor that takes all the non-fake, non-optional arguments.
2169 emitCtor(false, false);
2172 OS << " " << R.getName() << "Attr *clone(ASTContext &C) const;\n";
2173 OS << " void printPretty(raw_ostream &OS,\n"
2174 << " const PrintingPolicy &Policy) const;\n";
2175 OS << " const char *getSpelling() const;\n";
2177 if (!ElideSpelling) {
2178 assert(!SemanticToSyntacticMap.empty() && "Empty semantic mapping list");
2179 OS << " Spelling getSemanticSpelling() const {\n";
2180 WriteSemanticSpellingSwitch("SpellingListIndex", SemanticToSyntacticMap,
2185 writeAttrAccessorDefinition(R, OS);
2187 for (auto const &ai : Args) {
2188 ai->writeAccessors(OS);
2191 // Don't write conversion routines for fake arguments.
2192 if (ai->isFake()) continue;
2194 if (ai->isEnumArg())
2195 static_cast<const EnumArgument *>(ai.get())->writeConversion(OS);
2196 else if (ai->isVariadicEnumArg())
2197 static_cast<const VariadicEnumArgument *>(ai.get())
2198 ->writeConversion(OS);
2201 OS << R.getValueAsString("AdditionalMembers");
2204 OS << " static bool classof(const Attr *A) { return A->getKind() == "
2205 << "attr::" << R.getName() << "; }\n";
2210 OS << "#endif // LLVM_CLANG_ATTR_CLASSES_INC\n";
2213 // Emits the class method definitions for attributes.
2214 void EmitClangAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
2215 emitSourceFileHeader("Attribute classes' member function definitions", OS);
2217 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
2219 for (auto *Attr : Attrs) {
2222 if (!R.getValueAsBit("ASTNode"))
2225 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
2226 std::vector<std::unique_ptr<Argument>> Args;
2227 for (const auto *Arg : ArgRecords)
2228 Args.emplace_back(createArgument(*Arg, R.getName()));
2230 for (auto const &ai : Args)
2231 ai->writeAccessorDefinitions(OS);
2233 OS << R.getName() << "Attr *" << R.getName()
2234 << "Attr::clone(ASTContext &C) const {\n";
2235 OS << " auto *A = new (C) " << R.getName() << "Attr(getLocation(), C";
2236 for (auto const &ai : Args) {
2238 ai->writeCloneArgs(OS);
2240 OS << ", getSpellingListIndex());\n";
2241 OS << " A->Inherited = Inherited;\n";
2242 OS << " A->IsPackExpansion = IsPackExpansion;\n";
2243 OS << " A->Implicit = Implicit;\n";
2244 OS << " return A;\n}\n\n";
2246 writePrettyPrintFunction(R, Args, OS);
2247 writeGetSpellingFunction(R, OS);
2250 // Instead of relying on virtual dispatch we just create a huge dispatch
2251 // switch. This is both smaller and faster than virtual functions.
2252 auto EmitFunc = [&](const char *Method) {
2253 OS << " switch (getKind()) {\n";
2254 for (const auto *Attr : Attrs) {
2255 const Record &R = *Attr;
2256 if (!R.getValueAsBit("ASTNode"))
2259 OS << " case attr::" << R.getName() << ":\n";
2260 OS << " return cast<" << R.getName() << "Attr>(this)->" << Method
2264 OS << " llvm_unreachable(\"Unexpected attribute kind!\");\n";
2268 OS << "const char *Attr::getSpelling() const {\n";
2269 EmitFunc("getSpelling()");
2271 OS << "Attr *Attr::clone(ASTContext &C) const {\n";
2272 EmitFunc("clone(C)");
2274 OS << "void Attr::printPretty(raw_ostream &OS, "
2275 "const PrintingPolicy &Policy) const {\n";
2276 EmitFunc("printPretty(OS, Policy)");
2279 } // end namespace clang
2281 static void emitAttrList(raw_ostream &OS, StringRef Class,
2282 const std::vector<Record*> &AttrList) {
2283 for (auto Cur : AttrList) {
2284 OS << Class << "(" << Cur->getName() << ")\n";
2288 // Determines if an attribute has a Pragma spelling.
2289 static bool AttrHasPragmaSpelling(const Record *R) {
2290 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*R);
2291 return llvm::find_if(Spellings, [](const FlattenedSpelling &S) {
2292 return S.variety() == "Pragma";
2293 }) != Spellings.end();
2298 struct AttrClassDescriptor {
2299 const char * const MacroName;
2300 const char * const TableGenName;
2303 } // end anonymous namespace
2305 static const AttrClassDescriptor AttrClassDescriptors[] = {
2307 { "STMT_ATTR", "StmtAttr" },
2308 { "INHERITABLE_ATTR", "InheritableAttr" },
2309 { "INHERITABLE_PARAM_ATTR", "InheritableParamAttr" },
2310 { "PARAMETER_ABI_ATTR", "ParameterABIAttr" }
2313 static void emitDefaultDefine(raw_ostream &OS, StringRef name,
2314 const char *superName) {
2315 OS << "#ifndef " << name << "\n";
2316 OS << "#define " << name << "(NAME) ";
2317 if (superName) OS << superName << "(NAME)";
2318 OS << "\n#endif\n\n";
2323 /// A class of attributes.
2325 const AttrClassDescriptor &Descriptor;
2327 AttrClass *SuperClass = nullptr;
2328 std::vector<AttrClass*> SubClasses;
2329 std::vector<Record*> Attrs;
2331 AttrClass(const AttrClassDescriptor &Descriptor, Record *R)
2332 : Descriptor(Descriptor), TheRecord(R) {}
2334 void emitDefaultDefines(raw_ostream &OS) const {
2335 // Default the macro unless this is a root class (i.e. Attr).
2337 emitDefaultDefine(OS, Descriptor.MacroName,
2338 SuperClass->Descriptor.MacroName);
2342 void emitUndefs(raw_ostream &OS) const {
2343 OS << "#undef " << Descriptor.MacroName << "\n";
2346 void emitAttrList(raw_ostream &OS) const {
2347 for (auto SubClass : SubClasses) {
2348 SubClass->emitAttrList(OS);
2351 ::emitAttrList(OS, Descriptor.MacroName, Attrs);
2354 void classifyAttrOnRoot(Record *Attr) {
2355 bool result = classifyAttr(Attr);
2356 assert(result && "failed to classify on root"); (void) result;
2359 void emitAttrRange(raw_ostream &OS) const {
2360 OS << "ATTR_RANGE(" << Descriptor.TableGenName
2361 << ", " << getFirstAttr()->getName()
2362 << ", " << getLastAttr()->getName() << ")\n";
2366 bool classifyAttr(Record *Attr) {
2367 // Check all the subclasses.
2368 for (auto SubClass : SubClasses) {
2369 if (SubClass->classifyAttr(Attr))
2373 // It's not more specific than this class, but it might still belong here.
2374 if (Attr->isSubClassOf(TheRecord)) {
2375 Attrs.push_back(Attr);
2382 Record *getFirstAttr() const {
2383 if (!SubClasses.empty())
2384 return SubClasses.front()->getFirstAttr();
2385 return Attrs.front();
2388 Record *getLastAttr() const {
2390 return Attrs.back();
2391 return SubClasses.back()->getLastAttr();
2395 /// The entire hierarchy of attribute classes.
2396 class AttrClassHierarchy {
2397 std::vector<std::unique_ptr<AttrClass>> Classes;
2400 AttrClassHierarchy(RecordKeeper &Records) {
2401 // Find records for all the classes.
2402 for (auto &Descriptor : AttrClassDescriptors) {
2403 Record *ClassRecord = Records.getClass(Descriptor.TableGenName);
2404 AttrClass *Class = new AttrClass(Descriptor, ClassRecord);
2405 Classes.emplace_back(Class);
2408 // Link up the hierarchy.
2409 for (auto &Class : Classes) {
2410 if (AttrClass *SuperClass = findSuperClass(Class->TheRecord)) {
2411 Class->SuperClass = SuperClass;
2412 SuperClass->SubClasses.push_back(Class.get());
2417 for (auto i = Classes.begin(), e = Classes.end(); i != e; ++i) {
2418 assert((i == Classes.begin()) == ((*i)->SuperClass == nullptr) &&
2419 "only the first class should be a root class!");
2424 void emitDefaultDefines(raw_ostream &OS) const {
2425 for (auto &Class : Classes) {
2426 Class->emitDefaultDefines(OS);
2430 void emitUndefs(raw_ostream &OS) const {
2431 for (auto &Class : Classes) {
2432 Class->emitUndefs(OS);
2436 void emitAttrLists(raw_ostream &OS) const {
2437 // Just start from the root class.
2438 Classes[0]->emitAttrList(OS);
2441 void emitAttrRanges(raw_ostream &OS) const {
2442 for (auto &Class : Classes)
2443 Class->emitAttrRange(OS);
2446 void classifyAttr(Record *Attr) {
2447 // Add the attribute to the root class.
2448 Classes[0]->classifyAttrOnRoot(Attr);
2452 AttrClass *findClassByRecord(Record *R) const {
2453 for (auto &Class : Classes) {
2454 if (Class->TheRecord == R)
2460 AttrClass *findSuperClass(Record *R) const {
2461 // TableGen flattens the superclass list, so we just need to walk it
2463 auto SuperClasses = R->getSuperClasses();
2464 for (signed i = 0, e = SuperClasses.size(); i != e; ++i) {
2465 auto SuperClass = findClassByRecord(SuperClasses[e - i - 1].first);
2466 if (SuperClass) return SuperClass;
2472 } // end anonymous namespace
2476 // Emits the enumeration list for attributes.
2477 void EmitClangAttrList(RecordKeeper &Records, raw_ostream &OS) {
2478 emitSourceFileHeader("List of all attributes that Clang recognizes", OS);
2480 AttrClassHierarchy Hierarchy(Records);
2482 // Add defaulting macro definitions.
2483 Hierarchy.emitDefaultDefines(OS);
2484 emitDefaultDefine(OS, "PRAGMA_SPELLING_ATTR", nullptr);
2486 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
2487 std::vector<Record *> PragmaAttrs;
2488 for (auto *Attr : Attrs) {
2489 if (!Attr->getValueAsBit("ASTNode"))
2492 // Add the attribute to the ad-hoc groups.
2493 if (AttrHasPragmaSpelling(Attr))
2494 PragmaAttrs.push_back(Attr);
2496 // Place it in the hierarchy.
2497 Hierarchy.classifyAttr(Attr);
2500 // Emit the main attribute list.
2501 Hierarchy.emitAttrLists(OS);
2503 // Emit the ad hoc groups.
2504 emitAttrList(OS, "PRAGMA_SPELLING_ATTR", PragmaAttrs);
2506 // Emit the attribute ranges.
2507 OS << "#ifdef ATTR_RANGE\n";
2508 Hierarchy.emitAttrRanges(OS);
2509 OS << "#undef ATTR_RANGE\n";
2512 Hierarchy.emitUndefs(OS);
2513 OS << "#undef PRAGMA_SPELLING_ATTR\n";
2516 // Emits the enumeration list for attributes.
2517 void EmitClangAttrSubjectMatchRuleList(RecordKeeper &Records, raw_ostream &OS) {
2518 emitSourceFileHeader(
2519 "List of all attribute subject matching rules that Clang recognizes", OS);
2520 PragmaClangAttributeSupport &PragmaAttributeSupport =
2521 getPragmaAttributeSupport(Records);
2522 emitDefaultDefine(OS, "ATTR_MATCH_RULE", nullptr);
2523 PragmaAttributeSupport.emitMatchRuleList(OS);
2524 OS << "#undef ATTR_MATCH_RULE\n";
2527 // Emits the code to read an attribute from a precompiled header.
2528 void EmitClangAttrPCHRead(RecordKeeper &Records, raw_ostream &OS) {
2529 emitSourceFileHeader("Attribute deserialization code", OS);
2531 Record *InhClass = Records.getClass("InheritableAttr");
2532 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"),
2534 std::vector<std::unique_ptr<Argument>> Args;
2536 OS << " switch (Kind) {\n";
2537 for (const auto *Attr : Attrs) {
2538 const Record &R = *Attr;
2539 if (!R.getValueAsBit("ASTNode"))
2542 OS << " case attr::" << R.getName() << ": {\n";
2543 if (R.isSubClassOf(InhClass))
2544 OS << " bool isInherited = Record.readInt();\n";
2545 OS << " bool isImplicit = Record.readInt();\n";
2546 OS << " unsigned Spelling = Record.readInt();\n";
2547 ArgRecords = R.getValueAsListOfDefs("Args");
2549 for (const auto *Arg : ArgRecords) {
2550 Args.emplace_back(createArgument(*Arg, R.getName()));
2551 Args.back()->writePCHReadDecls(OS);
2553 OS << " New = new (Context) " << R.getName() << "Attr(Range, Context";
2554 for (auto const &ri : Args) {
2556 ri->writePCHReadArgs(OS);
2558 OS << ", Spelling);\n";
2559 if (R.isSubClassOf(InhClass))
2560 OS << " cast<InheritableAttr>(New)->setInherited(isInherited);\n";
2561 OS << " New->setImplicit(isImplicit);\n";
2568 // Emits the code to write an attribute to a precompiled header.
2569 void EmitClangAttrPCHWrite(RecordKeeper &Records, raw_ostream &OS) {
2570 emitSourceFileHeader("Attribute serialization code", OS);
2572 Record *InhClass = Records.getClass("InheritableAttr");
2573 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args;
2575 OS << " switch (A->getKind()) {\n";
2576 for (const auto *Attr : Attrs) {
2577 const Record &R = *Attr;
2578 if (!R.getValueAsBit("ASTNode"))
2580 OS << " case attr::" << R.getName() << ": {\n";
2581 Args = R.getValueAsListOfDefs("Args");
2582 if (R.isSubClassOf(InhClass) || !Args.empty())
2583 OS << " const auto *SA = cast<" << R.getName()
2585 if (R.isSubClassOf(InhClass))
2586 OS << " Record.push_back(SA->isInherited());\n";
2587 OS << " Record.push_back(A->isImplicit());\n";
2588 OS << " Record.push_back(A->getSpellingListIndex());\n";
2590 for (const auto *Arg : Args)
2591 createArgument(*Arg, R.getName())->writePCHWrite(OS);
2598 // Generate a conditional expression to check if the current target satisfies
2599 // the conditions for a TargetSpecificAttr record, and append the code for
2600 // those checks to the Test string. If the FnName string pointer is non-null,
2601 // append a unique suffix to distinguish this set of target checks from other
2602 // TargetSpecificAttr records.
2603 static void GenerateTargetSpecificAttrChecks(const Record *R,
2604 std::vector<std::string> &Arches,
2606 std::string *FnName) {
2607 // It is assumed that there will be an llvm::Triple object
2608 // named "T" and a TargetInfo object named "Target" within
2609 // scope that can be used to determine whether the attribute exists in
2613 for (auto I = Arches.begin(), E = Arches.end(); I != E; ++I) {
2614 std::string Part = *I;
2615 Test += "T.getArch() == llvm::Triple::" + Part;
2623 // If the attribute is specific to particular OSes, check those.
2624 if (!R->isValueUnset("OSes")) {
2625 // We know that there was at least one arch test, so we need to and in the
2628 std::vector<std::string> OSes = R->getValueAsListOfStrings("OSes");
2629 for (auto I = OSes.begin(), E = OSes.end(); I != E; ++I) {
2630 std::string Part = *I;
2632 Test += "T.getOS() == llvm::Triple::" + Part;
2641 // If one or more CXX ABIs are specified, check those as well.
2642 if (!R->isValueUnset("CXXABIs")) {
2644 std::vector<std::string> CXXABIs = R->getValueAsListOfStrings("CXXABIs");
2645 for (auto I = CXXABIs.begin(), E = CXXABIs.end(); I != E; ++I) {
2646 std::string Part = *I;
2647 Test += "Target.getCXXABI().getKind() == TargetCXXABI::" + Part;
2657 static void GenerateHasAttrSpellingStringSwitch(
2658 const std::vector<Record *> &Attrs, raw_ostream &OS,
2659 const std::string &Variety = "", const std::string &Scope = "") {
2660 for (const auto *Attr : Attrs) {
2661 // C++11-style attributes have specific version information associated with
2662 // them. If the attribute has no scope, the version information must not
2663 // have the default value (1), as that's incorrect. Instead, the unscoped
2664 // attribute version information should be taken from the SD-6 standing
2665 // document, which can be found at:
2666 // https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations
2669 if (Variety == "CXX11") {
2670 std::vector<Record *> Spellings = Attr->getValueAsListOfDefs("Spellings");
2671 for (const auto &Spelling : Spellings) {
2672 if (Spelling->getValueAsString("Variety") == "CXX11") {
2673 Version = static_cast<int>(Spelling->getValueAsInt("Version"));
2674 if (Scope.empty() && Version == 1)
2675 PrintError(Spelling->getLoc(), "C++ standard attributes must "
2676 "have valid version information.");
2683 if (Attr->isSubClassOf("TargetSpecificAttr")) {
2684 const Record *R = Attr->getValueAsDef("Target");
2685 std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches");
2686 GenerateTargetSpecificAttrChecks(R, Arches, Test, nullptr);
2688 // If this is the C++11 variety, also add in the LangOpts test.
2689 if (Variety == "CXX11")
2690 Test += " && LangOpts.CPlusPlus11";
2691 } else if (Variety == "CXX11")
2692 // C++11 mode should be checked against LangOpts, which is presumed to be
2693 // present in the caller.
2694 Test = "LangOpts.CPlusPlus11";
2696 std::string TestStr =
2697 !Test.empty() ? Test + " ? " + llvm::itostr(Version) + " : 0" : "1";
2698 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr);
2699 for (const auto &S : Spellings)
2700 if (Variety.empty() || (Variety == S.variety() &&
2701 (Scope.empty() || Scope == S.nameSpace())))
2702 OS << " .Case(\"" << S.name() << "\", " << TestStr << ")\n";
2704 OS << " .Default(0);\n";
2707 // Emits the list of spellings for attributes.
2708 void EmitClangAttrHasAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
2709 emitSourceFileHeader("Code to implement the __has_attribute logic", OS);
2711 // Separate all of the attributes out into four group: generic, C++11, GNU,
2712 // and declspecs. Then generate a big switch statement for each of them.
2713 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
2714 std::vector<Record *> Declspec, Microsoft, GNU, Pragma;
2715 std::map<std::string, std::vector<Record *>> CXX;
2717 // Walk over the list of all attributes, and split them out based on the
2718 // spelling variety.
2719 for (auto *R : Attrs) {
2720 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*R);
2721 for (const auto &SI : Spellings) {
2722 const std::string &Variety = SI.variety();
2723 if (Variety == "GNU")
2725 else if (Variety == "Declspec")
2726 Declspec.push_back(R);
2727 else if (Variety == "Microsoft")
2728 Microsoft.push_back(R);
2729 else if (Variety == "CXX11")
2730 CXX[SI.nameSpace()].push_back(R);
2731 else if (Variety == "Pragma")
2732 Pragma.push_back(R);
2736 OS << "const llvm::Triple &T = Target.getTriple();\n";
2737 OS << "switch (Syntax) {\n";
2738 OS << "case AttrSyntax::GNU:\n";
2739 OS << " return llvm::StringSwitch<int>(Name)\n";
2740 GenerateHasAttrSpellingStringSwitch(GNU, OS, "GNU");
2741 OS << "case AttrSyntax::Declspec:\n";
2742 OS << " return llvm::StringSwitch<int>(Name)\n";
2743 GenerateHasAttrSpellingStringSwitch(Declspec, OS, "Declspec");
2744 OS << "case AttrSyntax::Microsoft:\n";
2745 OS << " return llvm::StringSwitch<int>(Name)\n";
2746 GenerateHasAttrSpellingStringSwitch(Microsoft, OS, "Microsoft");
2747 OS << "case AttrSyntax::Pragma:\n";
2748 OS << " return llvm::StringSwitch<int>(Name)\n";
2749 GenerateHasAttrSpellingStringSwitch(Pragma, OS, "Pragma");
2750 OS << "case AttrSyntax::CXX: {\n";
2751 // C++11-style attributes are further split out based on the Scope.
2752 for (auto I = CXX.cbegin(), E = CXX.cend(); I != E; ++I) {
2753 if (I != CXX.begin())
2755 if (I->first.empty())
2756 OS << "if (!Scope || Scope->getName() == \"\") {\n";
2758 OS << "if (Scope->getName() == \"" << I->first << "\") {\n";
2759 OS << " return llvm::StringSwitch<int>(Name)\n";
2760 GenerateHasAttrSpellingStringSwitch(I->second, OS, "CXX11", I->first);
2767 void EmitClangAttrSpellingListIndex(RecordKeeper &Records, raw_ostream &OS) {
2768 emitSourceFileHeader("Code to translate different attribute spellings "
2769 "into internal identifiers", OS);
2771 OS << " switch (AttrKind) {\n";
2773 ParsedAttrMap Attrs = getParsedAttrList(Records);
2774 for (const auto &I : Attrs) {
2775 const Record &R = *I.second;
2776 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
2777 OS << " case AT_" << I.first << ": {\n";
2778 for (unsigned I = 0; I < Spellings.size(); ++ I) {
2779 OS << " if (Name == \"" << Spellings[I].name() << "\" && "
2781 << StringSwitch<unsigned>(Spellings[I].variety())
2784 .Case("Declspec", 2)
2785 .Case("Microsoft", 3)
2789 << " && Scope == \"" << Spellings[I].nameSpace() << "\")\n"
2790 << " return " << I << ";\n";
2798 OS << " return 0;\n";
2801 // Emits code used by RecursiveASTVisitor to visit attributes
2802 void EmitClangAttrASTVisitor(RecordKeeper &Records, raw_ostream &OS) {
2803 emitSourceFileHeader("Used by RecursiveASTVisitor to visit attributes.", OS);
2805 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
2807 // Write method declarations for Traverse* methods.
2808 // We emit this here because we only generate methods for attributes that
2809 // are declared as ASTNodes.
2810 OS << "#ifdef ATTR_VISITOR_DECLS_ONLY\n\n";
2811 for (const auto *Attr : Attrs) {
2812 const Record &R = *Attr;
2813 if (!R.getValueAsBit("ASTNode"))
2815 OS << " bool Traverse"
2816 << R.getName() << "Attr(" << R.getName() << "Attr *A);\n";
2818 << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n"
2819 << " return true; \n"
2822 OS << "\n#else // ATTR_VISITOR_DECLS_ONLY\n\n";
2824 // Write individual Traverse* methods for each attribute class.
2825 for (const auto *Attr : Attrs) {
2826 const Record &R = *Attr;
2827 if (!R.getValueAsBit("ASTNode"))
2830 OS << "template <typename Derived>\n"
2831 << "bool VISITORCLASS<Derived>::Traverse"
2832 << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n"
2833 << " if (!getDerived().VisitAttr(A))\n"
2834 << " return false;\n"
2835 << " if (!getDerived().Visit" << R.getName() << "Attr(A))\n"
2836 << " return false;\n";
2838 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
2839 for (const auto *Arg : ArgRecords)
2840 createArgument(*Arg, R.getName())->writeASTVisitorTraversal(OS);
2842 OS << " return true;\n";
2846 // Write generic Traverse routine
2847 OS << "template <typename Derived>\n"
2848 << "bool VISITORCLASS<Derived>::TraverseAttr(Attr *A) {\n"
2850 << " return true;\n"
2852 << " switch (A->getKind()) {\n";
2854 for (const auto *Attr : Attrs) {
2855 const Record &R = *Attr;
2856 if (!R.getValueAsBit("ASTNode"))
2859 OS << " case attr::" << R.getName() << ":\n"
2860 << " return getDerived().Traverse" << R.getName() << "Attr("
2861 << "cast<" << R.getName() << "Attr>(A));\n";
2863 OS << " }\n"; // end switch
2864 OS << " llvm_unreachable(\"bad attribute kind\");\n";
2865 OS << "}\n"; // end function
2866 OS << "#endif // ATTR_VISITOR_DECLS_ONLY\n";
2869 void EmitClangAttrTemplateInstantiateHelper(const std::vector<Record *> &Attrs,
2871 bool AppliesToDecl) {
2873 OS << " switch (At->getKind()) {\n";
2874 for (const auto *Attr : Attrs) {
2875 const Record &R = *Attr;
2876 if (!R.getValueAsBit("ASTNode"))
2878 OS << " case attr::" << R.getName() << ": {\n";
2879 bool ShouldClone = R.getValueAsBit("Clone") &&
2881 R.getValueAsBit("MeaningfulToClassTemplateDefinition"));
2884 OS << " return nullptr;\n";
2889 OS << " const auto *A = cast<"
2890 << R.getName() << "Attr>(At);\n";
2891 bool TDependent = R.getValueAsBit("TemplateDependent");
2894 OS << " return A->clone(C);\n";
2899 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
2900 std::vector<std::unique_ptr<Argument>> Args;
2901 Args.reserve(ArgRecords.size());
2903 for (const auto *ArgRecord : ArgRecords)
2904 Args.emplace_back(createArgument(*ArgRecord, R.getName()));
2906 for (auto const &ai : Args)
2907 ai->writeTemplateInstantiation(OS);
2909 OS << " return new (C) " << R.getName() << "Attr(A->getLocation(), C";
2910 for (auto const &ai : Args) {
2912 ai->writeTemplateInstantiationArgs(OS);
2914 OS << ", A->getSpellingListIndex());\n }\n";
2916 OS << " } // end switch\n"
2917 << " llvm_unreachable(\"Unknown attribute!\");\n"
2918 << " return nullptr;\n";
2921 // Emits code to instantiate dependent attributes on templates.
2922 void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS) {
2923 emitSourceFileHeader("Template instantiation code for attributes", OS);
2925 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
2927 OS << "namespace clang {\n"
2928 << "namespace sema {\n\n"
2929 << "Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, "
2931 << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n";
2932 EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/false);
2934 << "Attr *instantiateTemplateAttributeForDecl(const Attr *At,\n"
2935 << " ASTContext &C, Sema &S,\n"
2936 << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n";
2937 EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/true);
2939 << "} // end namespace sema\n"
2940 << "} // end namespace clang\n";
2943 // Emits the list of parsed attributes.
2944 void EmitClangAttrParsedAttrList(RecordKeeper &Records, raw_ostream &OS) {
2945 emitSourceFileHeader("List of all attributes that Clang recognizes", OS);
2947 OS << "#ifndef PARSED_ATTR\n";
2948 OS << "#define PARSED_ATTR(NAME) NAME\n";
2951 ParsedAttrMap Names = getParsedAttrList(Records);
2952 for (const auto &I : Names) {
2953 OS << "PARSED_ATTR(" << I.first << ")\n";
2957 static bool isArgVariadic(const Record &R, StringRef AttrName) {
2958 return createArgument(R, AttrName)->isVariadic();
2961 static void emitArgInfo(const Record &R, std::stringstream &OS) {
2962 // This function will count the number of arguments specified for the
2963 // attribute and emit the number of required arguments followed by the
2964 // number of optional arguments.
2965 std::vector<Record *> Args = R.getValueAsListOfDefs("Args");
2966 unsigned ArgCount = 0, OptCount = 0;
2967 bool HasVariadic = false;
2968 for (const auto *Arg : Args) {
2969 // If the arg is fake, it's the user's job to supply it: general parsing
2970 // logic shouldn't need to know anything about it.
2971 if (Arg->getValueAsBit("Fake"))
2973 Arg->getValueAsBit("Optional") ? ++OptCount : ++ArgCount;
2974 if (!HasVariadic && isArgVariadic(*Arg, R.getName()))
2978 // If there is a variadic argument, we will set the optional argument count
2979 // to its largest value. Since it's currently a 4-bit number, we set it to 15.
2980 OS << ArgCount << ", " << (HasVariadic ? 15 : OptCount);
2983 static void GenerateDefaultAppertainsTo(raw_ostream &OS) {
2984 OS << "static bool defaultAppertainsTo(Sema &, const AttributeList &,";
2985 OS << "const Decl *) {\n";
2986 OS << " return true;\n";
2990 static std::string CalculateDiagnostic(const Record &S) {
2991 // If the SubjectList object has a custom diagnostic associated with it,
2992 // return that directly.
2993 std::string CustomDiag = S.getValueAsString("CustomDiag");
2994 if (!CustomDiag.empty())
2997 // Given the list of subjects, determine what diagnostic best fits.
3001 ObjCMethod = 1U << 2,
3004 GenericRecord = 1U << 5,
3008 ObjCInterface = 1U << 9,
3010 Namespace = 1U << 11,
3012 CXXMethod = 1U << 13,
3013 ObjCProtocol = 1U << 14,
3017 uint32_t SubMask = 0;
3019 std::vector<Record *> Subjects = S.getValueAsListOfDefs("Subjects");
3020 for (const auto *Subject : Subjects) {
3021 const Record &R = *Subject;
3024 if (R.isSubClassOf("SubsetSubject")) {
3025 PrintError(R.getLoc(), "SubsetSubjects should use a custom diagnostic");
3026 // As a fallback, look through the SubsetSubject to see what its base
3027 // type is, and use that. This needs to be updated if SubsetSubjects
3028 // are allowed within other SubsetSubjects.
3029 Name = R.getValueAsDef("Base")->getName();
3033 uint32_t V = StringSwitch<uint32_t>(Name)
3034 .Case("Function", Func)
3036 .Case("ObjCMethod", ObjCMethod)
3037 .Case("ParmVar", Param)
3038 .Case("TypedefName", Type)
3039 .Case("ObjCIvar", ObjCIVar)
3040 .Case("ObjCProperty", ObjCProp)
3041 .Case("Record", GenericRecord)
3042 .Case("ObjCInterface", ObjCInterface)
3043 .Case("ObjCProtocol", ObjCProtocol)
3044 .Case("Block", Block)
3045 .Case("CXXRecord", Class)
3046 .Case("Namespace", Namespace)
3047 .Case("Field", Field)
3048 .Case("CXXMethod", CXXMethod)
3050 .Case("Named", Named)
3053 // Something wasn't in our mapping, so be helpful and let the developer
3055 PrintFatalError(R.getLoc(), "Unknown subject type: " + R.getName());
3063 // For the simple cases where there's only a single entry in the mask, we
3064 // don't have to resort to bit fiddling.
3065 case Func: return "ExpectedFunction";
3066 case Var: return "ExpectedVariable";
3067 case Param: return "ExpectedParameter";
3068 case Class: return "ExpectedClass";
3069 case Enum: return "ExpectedEnum";
3071 // FIXME: Currently, this maps to ExpectedMethod based on existing code,
3072 // but should map to something a bit more accurate at some point.
3073 case ObjCMethod: return "ExpectedMethod";
3074 case Type: return "ExpectedType";
3075 case ObjCInterface: return "ExpectedObjectiveCInterface";
3076 case ObjCProtocol: return "ExpectedObjectiveCProtocol";
3078 // "GenericRecord" means struct, union or class; check the language options
3079 // and if not compiling for C++, strip off the class part. Note that this
3080 // relies on the fact that the context for this declares "Sema &S".
3082 return "(S.getLangOpts().CPlusPlus ? ExpectedStructOrUnionOrClass : "
3083 "ExpectedStructOrUnion)";
3084 case Func | ObjCMethod | Block: return "ExpectedFunctionMethodOrBlock";
3085 case Func | ObjCMethod | Class: return "ExpectedFunctionMethodOrClass";
3087 case Func | ObjCMethod | Param: return "ExpectedFunctionMethodOrParameter";
3088 case Func | ObjCMethod: return "ExpectedFunctionOrMethod";
3089 case Func | Var: return "ExpectedVariableOrFunction";
3091 // If not compiling for C++, the class portion does not apply.
3092 case Func | Var | Class:
3093 return "(S.getLangOpts().CPlusPlus ? ExpectedFunctionVariableOrClass : "
3094 "ExpectedVariableOrFunction)";
3096 case Func | Var | Class | ObjCInterface:
3097 return "(S.getLangOpts().CPlusPlus"
3098 " ? ((S.getLangOpts().ObjC1 || S.getLangOpts().ObjC2)"
3099 " ? ExpectedFunctionVariableClassOrObjCInterface"
3100 " : ExpectedFunctionVariableOrClass)"
3101 " : ((S.getLangOpts().ObjC1 || S.getLangOpts().ObjC2)"
3102 " ? ExpectedFunctionVariableOrObjCInterface"
3103 " : ExpectedVariableOrFunction))";
3105 case ObjCMethod | ObjCProp: return "ExpectedMethodOrProperty";
3106 case ObjCProtocol | ObjCInterface:
3107 return "ExpectedObjectiveCInterfaceOrProtocol";
3108 case Field | Var: return "ExpectedFieldOrGlobalVar";
3111 return "ExpectedNamedDecl";
3114 PrintFatalError(S.getLoc(),
3115 "Could not deduce diagnostic argument for Attr subjects");
3120 static std::string GetSubjectWithSuffix(const Record *R) {
3121 const std::string &B = R->getName();
3122 if (B == "DeclBase")
3127 static std::string functionNameForCustomAppertainsTo(const Record &Subject) {
3128 return "is" + Subject.getName().str();
3131 static std::string GenerateCustomAppertainsTo(const Record &Subject,
3133 std::string FnName = functionNameForCustomAppertainsTo(Subject);
3135 // If this code has already been generated, simply return the previous
3137 static std::set<std::string> CustomSubjectSet;
3138 auto I = CustomSubjectSet.find(FnName);
3139 if (I != CustomSubjectSet.end())
3142 Record *Base = Subject.getValueAsDef("Base");
3144 // Not currently support custom subjects within custom subjects.
3145 if (Base->isSubClassOf("SubsetSubject")) {
3146 PrintFatalError(Subject.getLoc(),
3147 "SubsetSubjects within SubsetSubjects is not supported");
3151 OS << "static bool " << FnName << "(const Decl *D) {\n";
3152 OS << " if (const auto *S = dyn_cast<";
3153 OS << GetSubjectWithSuffix(Base);
3155 OS << " return " << Subject.getValueAsString("CheckCode") << ";\n";
3156 OS << " return false;\n";
3159 CustomSubjectSet.insert(FnName);
3163 static std::string GenerateAppertainsTo(const Record &Attr, raw_ostream &OS) {
3164 // If the attribute does not contain a Subjects definition, then use the
3165 // default appertainsTo logic.
3166 if (Attr.isValueUnset("Subjects"))
3167 return "defaultAppertainsTo";
3169 const Record *SubjectObj = Attr.getValueAsDef("Subjects");
3170 std::vector<Record*> Subjects = SubjectObj->getValueAsListOfDefs("Subjects");
3172 // If the list of subjects is empty, it is assumed that the attribute
3173 // appertains to everything.
3174 if (Subjects.empty())
3175 return "defaultAppertainsTo";
3177 bool Warn = SubjectObj->getValueAsDef("Diag")->getValueAsBit("Warn");
3179 // Otherwise, generate an appertainsTo check specific to this attribute which
3180 // checks all of the given subjects against the Decl passed in. Return the
3181 // name of that check to the caller.
3182 std::string FnName = "check" + Attr.getName().str() + "AppertainsTo";
3183 std::stringstream SS;
3184 SS << "static bool " << FnName << "(Sema &S, const AttributeList &Attr, ";
3185 SS << "const Decl *D) {\n";
3187 for (auto I = Subjects.begin(), E = Subjects.end(); I != E; ++I) {
3188 // If the subject has custom code associated with it, generate a function
3189 // for it. The function cannot be inlined into this check (yet) because it
3190 // requires the subject to be of a specific type, and were that information
3191 // inlined here, it would not support an attribute with multiple custom
3193 if ((*I)->isSubClassOf("SubsetSubject")) {
3194 SS << "!" << GenerateCustomAppertainsTo(**I, OS) << "(D)";
3196 SS << "!isa<" << GetSubjectWithSuffix(*I) << ">(D)";
3203 SS << " S.Diag(Attr.getLoc(), diag::";
3204 SS << (Warn ? "warn_attribute_wrong_decl_type" :
3205 "err_attribute_wrong_decl_type");
3207 SS << " << Attr.getName() << ";
3208 SS << CalculateDiagnostic(*SubjectObj) << ";\n";
3209 SS << " return false;\n";
3211 SS << " return true;\n";
3219 emitAttributeMatchRules(PragmaClangAttributeSupport &PragmaAttributeSupport,
3221 OS << "static bool checkAttributeMatchRuleAppliesTo(const Decl *D, "
3222 << AttributeSubjectMatchRule::EnumName << " rule) {\n";
3223 OS << " switch (rule) {\n";
3224 for (const auto &Rule : PragmaAttributeSupport.Rules) {
3225 if (Rule.isAbstractRule()) {
3226 OS << " case " << Rule.getEnumValue() << ":\n";
3227 OS << " assert(false && \"Abstract matcher rule isn't allowed\");\n";
3228 OS << " return false;\n";
3231 std::vector<Record *> Subjects = Rule.getSubjects();
3232 assert(!Subjects.empty() && "Missing subjects");
3233 OS << " case " << Rule.getEnumValue() << ":\n";
3235 for (auto I = Subjects.begin(), E = Subjects.end(); I != E; ++I) {
3236 // If the subject has custom code associated with it, use the function
3237 // that was generated for GenerateAppertainsTo to check if the declaration
3239 if ((*I)->isSubClassOf("SubsetSubject"))
3240 OS << functionNameForCustomAppertainsTo(**I) << "(D)";
3242 OS << "isa<" << GetSubjectWithSuffix(*I) << ">(D)";
3250 OS << " llvm_unreachable(\"Invalid match rule\");\nreturn false;\n";
3254 static void GenerateDefaultLangOptRequirements(raw_ostream &OS) {
3255 OS << "static bool defaultDiagnoseLangOpts(Sema &, ";
3256 OS << "const AttributeList &) {\n";
3257 OS << " return true;\n";
3261 static std::string GenerateLangOptRequirements(const Record &R,
3263 // If the attribute has an empty or unset list of language requirements,
3264 // return the default handler.
3265 std::vector<Record *> LangOpts = R.getValueAsListOfDefs("LangOpts");
3266 if (LangOpts.empty())
3267 return "defaultDiagnoseLangOpts";
3269 // Generate the test condition, as well as a unique function name for the
3270 // diagnostic test. The list of options should usually be short (one or two
3271 // options), and the uniqueness isn't strictly necessary (it is just for
3272 // codegen efficiency).
3273 std::string FnName = "check", Test;
3274 for (auto I = LangOpts.begin(), E = LangOpts.end(); I != E; ++I) {
3275 std::string Part = (*I)->getValueAsString("Name");
3276 if ((*I)->getValueAsBit("Negated")) {
3280 Test += "S.LangOpts." + Part;
3285 FnName += "LangOpts";
3287 // If this code has already been generated, simply return the previous
3289 static std::set<std::string> CustomLangOptsSet;
3290 auto I = CustomLangOptsSet.find(FnName);
3291 if (I != CustomLangOptsSet.end())
3294 OS << "static bool " << FnName << "(Sema &S, const AttributeList &Attr) {\n";
3295 OS << " if (" << Test << ")\n";
3296 OS << " return true;\n\n";
3297 OS << " S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) ";
3298 OS << "<< Attr.getName();\n";
3299 OS << " return false;\n";
3302 CustomLangOptsSet.insert(FnName);
3306 static void GenerateDefaultTargetRequirements(raw_ostream &OS) {
3307 OS << "static bool defaultTargetRequirements(const TargetInfo &) {\n";
3308 OS << " return true;\n";
3312 static std::string GenerateTargetRequirements(const Record &Attr,
3313 const ParsedAttrMap &Dupes,
3315 // If the attribute is not a target specific attribute, return the default
3317 if (!Attr.isSubClassOf("TargetSpecificAttr"))
3318 return "defaultTargetRequirements";
3320 // Get the list of architectures to be tested for.
3321 const Record *R = Attr.getValueAsDef("Target");
3322 std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches");
3323 if (Arches.empty()) {
3324 PrintError(Attr.getLoc(), "Empty list of target architectures for a "
3325 "target-specific attr");
3326 return "defaultTargetRequirements";
3329 // If there are other attributes which share the same parsed attribute kind,
3330 // such as target-specific attributes with a shared spelling, collapse the
3331 // duplicate architectures. This is required because a shared target-specific
3332 // attribute has only one AttributeList::Kind enumeration value, but it
3333 // applies to multiple target architectures. In order for the attribute to be
3334 // considered valid, all of its architectures need to be included.
3335 if (!Attr.isValueUnset("ParseKind")) {
3336 std::string APK = Attr.getValueAsString("ParseKind");
3337 for (const auto &I : Dupes) {
3338 if (I.first == APK) {
3339 std::vector<std::string> DA = I.second->getValueAsDef("Target")
3340 ->getValueAsListOfStrings("Arches");
3341 std::move(DA.begin(), DA.end(), std::back_inserter(Arches));
3346 std::string FnName = "isTarget";
3348 GenerateTargetSpecificAttrChecks(R, Arches, Test, &FnName);
3350 // If this code has already been generated, simply return the previous
3352 static std::set<std::string> CustomTargetSet;
3353 auto I = CustomTargetSet.find(FnName);
3354 if (I != CustomTargetSet.end())
3357 OS << "static bool " << FnName << "(const TargetInfo &Target) {\n";
3358 OS << " const llvm::Triple &T = Target.getTriple();\n";
3359 OS << " return " << Test << ";\n";
3362 CustomTargetSet.insert(FnName);
3366 static void GenerateDefaultSpellingIndexToSemanticSpelling(raw_ostream &OS) {
3367 OS << "static unsigned defaultSpellingIndexToSemanticSpelling("
3368 << "const AttributeList &Attr) {\n";
3369 OS << " return UINT_MAX;\n";
3373 static std::string GenerateSpellingIndexToSemanticSpelling(const Record &Attr,
3375 // If the attribute does not have a semantic form, we can bail out early.
3376 if (!Attr.getValueAsBit("ASTNode"))
3377 return "defaultSpellingIndexToSemanticSpelling";
3379 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
3381 // If there are zero or one spellings, or all of the spellings share the same
3382 // name, we can also bail out early.
3383 if (Spellings.size() <= 1 || SpellingNamesAreCommon(Spellings))
3384 return "defaultSpellingIndexToSemanticSpelling";
3386 // Generate the enumeration we will use for the mapping.
3387 SemanticSpellingMap SemanticToSyntacticMap;
3388 std::string Enum = CreateSemanticSpellings(Spellings, SemanticToSyntacticMap);
3389 std::string Name = Attr.getName().str() + "AttrSpellingMap";
3391 OS << "static unsigned " << Name << "(const AttributeList &Attr) {\n";
3393 OS << " unsigned Idx = Attr.getAttributeSpellingListIndex();\n";
3394 WriteSemanticSpellingSwitch("Idx", SemanticToSyntacticMap, OS);
3400 static bool IsKnownToGCC(const Record &Attr) {
3401 // Look at the spellings for this subject; if there are any spellings which
3402 // claim to be known to GCC, the attribute is known to GCC.
3403 return llvm::any_of(
3404 GetFlattenedSpellings(Attr),
3405 [](const FlattenedSpelling &S) { return S.knownToGCC(); });
3408 /// Emits the parsed attribute helpers
3409 void EmitClangAttrParsedAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
3410 emitSourceFileHeader("Parsed attribute helpers", OS);
3412 PragmaClangAttributeSupport &PragmaAttributeSupport =
3413 getPragmaAttributeSupport(Records);
3415 // Get the list of parsed attributes, and accept the optional list of
3416 // duplicates due to the ParseKind.
3417 ParsedAttrMap Dupes;
3418 ParsedAttrMap Attrs = getParsedAttrList(Records, &Dupes);
3420 // Generate the default appertainsTo, target and language option diagnostic,
3421 // and spelling list index mapping methods.
3422 GenerateDefaultAppertainsTo(OS);
3423 GenerateDefaultLangOptRequirements(OS);
3424 GenerateDefaultTargetRequirements(OS);
3425 GenerateDefaultSpellingIndexToSemanticSpelling(OS);
3427 // Generate the appertainsTo diagnostic methods and write their names into
3428 // another mapping. At the same time, generate the AttrInfoMap object
3429 // contents. Due to the reliance on generated code, use separate streams so
3430 // that code will not be interleaved.
3431 std::stringstream SS;
3432 for (auto I = Attrs.begin(), E = Attrs.end(); I != E; ++I) {
3433 // TODO: If the attribute's kind appears in the list of duplicates, that is
3434 // because it is a target-specific attribute that appears multiple times.
3435 // It would be beneficial to test whether the duplicates are "similar
3436 // enough" to each other to not cause problems. For instance, check that
3437 // the spellings are identical, and custom parsing rules match, etc.
3439 // We need to generate struct instances based off ParsedAttrInfo from
3440 // AttributeList.cpp.
3442 emitArgInfo(*I->second, SS);
3443 SS << ", " << I->second->getValueAsBit("HasCustomParsing");
3444 SS << ", " << I->second->isSubClassOf("TargetSpecificAttr");
3445 SS << ", " << I->second->isSubClassOf("TypeAttr");
3446 SS << ", " << I->second->isSubClassOf("StmtAttr");
3447 SS << ", " << IsKnownToGCC(*I->second);
3448 SS << ", " << PragmaAttributeSupport.isAttributedSupported(*I->second);
3449 SS << ", " << GenerateAppertainsTo(*I->second, OS);
3450 SS << ", " << GenerateLangOptRequirements(*I->second, OS);
3451 SS << ", " << GenerateTargetRequirements(*I->second, Dupes, OS);
3452 SS << ", " << GenerateSpellingIndexToSemanticSpelling(*I->second, OS);
3454 << PragmaAttributeSupport.generateStrictConformsTo(*I->second, OS);
3460 SS << " // AT_" << I->first << "\n";
3463 OS << "static const ParsedAttrInfo AttrInfoMap[AttributeList::UnknownAttribute + 1] = {\n";
3467 // Generate the attribute match rules.
3468 emitAttributeMatchRules(PragmaAttributeSupport, OS);
3471 // Emits the kind list of parsed attributes
3472 void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream &OS) {
3473 emitSourceFileHeader("Attribute name matcher", OS);
3475 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
3476 std::vector<StringMatcher::StringPair> GNU, Declspec, Microsoft, CXX11,
3478 std::set<std::string> Seen;
3479 for (const auto *A : Attrs) {
3480 const Record &Attr = *A;
3482 bool SemaHandler = Attr.getValueAsBit("SemaHandler");
3483 bool Ignored = Attr.getValueAsBit("Ignored");
3484 if (SemaHandler || Ignored) {
3485 // Attribute spellings can be shared between target-specific attributes,
3486 // and can be shared between syntaxes for the same attribute. For
3487 // instance, an attribute can be spelled GNU<"interrupt"> for an ARM-
3488 // specific attribute, or MSP430-specific attribute. Additionally, an
3489 // attribute can be spelled GNU<"dllexport"> and Declspec<"dllexport">
3490 // for the same semantic attribute. Ultimately, we need to map each of
3491 // these to a single AttributeList::Kind value, but the StringMatcher
3492 // class cannot handle duplicate match strings. So we generate a list of
3493 // string to match based on the syntax, and emit multiple string matchers
3494 // depending on the syntax used.
3495 std::string AttrName;
3496 if (Attr.isSubClassOf("TargetSpecificAttr") &&
3497 !Attr.isValueUnset("ParseKind")) {
3498 AttrName = Attr.getValueAsString("ParseKind");
3499 if (Seen.find(AttrName) != Seen.end())
3501 Seen.insert(AttrName);
3503 AttrName = NormalizeAttrName(StringRef(Attr.getName())).str();
3505 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
3506 for (const auto &S : Spellings) {
3507 const std::string &RawSpelling = S.name();
3508 std::vector<StringMatcher::StringPair> *Matches = nullptr;
3509 std::string Spelling;
3510 const std::string &Variety = S.variety();
3511 if (Variety == "CXX11") {
3513 Spelling += S.nameSpace();
3515 } else if (Variety == "GNU")
3517 else if (Variety == "Declspec")
3518 Matches = &Declspec;
3519 else if (Variety == "Microsoft")
3520 Matches = &Microsoft;
3521 else if (Variety == "Keyword")
3522 Matches = &Keywords;
3523 else if (Variety == "Pragma")
3526 assert(Matches && "Unsupported spelling variety found");
3528 if (Variety == "GNU")
3529 Spelling += NormalizeGNUAttrSpelling(RawSpelling);
3531 Spelling += RawSpelling;
3534 Matches->push_back(StringMatcher::StringPair(Spelling,
3535 "return AttributeList::AT_" + AttrName + ";"));
3537 Matches->push_back(StringMatcher::StringPair(Spelling,
3538 "return AttributeList::IgnoredAttribute;"));
3543 OS << "static AttributeList::Kind getAttrKind(StringRef Name, ";
3544 OS << "AttributeList::Syntax Syntax) {\n";
3545 OS << " if (AttributeList::AS_GNU == Syntax) {\n";
3546 StringMatcher("Name", GNU, OS).Emit();
3547 OS << " } else if (AttributeList::AS_Declspec == Syntax) {\n";
3548 StringMatcher("Name", Declspec, OS).Emit();
3549 OS << " } else if (AttributeList::AS_Microsoft == Syntax) {\n";
3550 StringMatcher("Name", Microsoft, OS).Emit();
3551 OS << " } else if (AttributeList::AS_CXX11 == Syntax) {\n";
3552 StringMatcher("Name", CXX11, OS).Emit();
3553 OS << " } else if (AttributeList::AS_Keyword == Syntax || ";
3554 OS << "AttributeList::AS_ContextSensitiveKeyword == Syntax) {\n";
3555 StringMatcher("Name", Keywords, OS).Emit();
3556 OS << " } else if (AttributeList::AS_Pragma == Syntax) {\n";
3557 StringMatcher("Name", Pragma, OS).Emit();
3559 OS << " return AttributeList::UnknownAttribute;\n"
3563 // Emits the code to dump an attribute.
3564 void EmitClangAttrDump(RecordKeeper &Records, raw_ostream &OS) {
3565 emitSourceFileHeader("Attribute dumper", OS);
3567 OS << " switch (A->getKind()) {\n";
3568 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args;
3569 for (const auto *Attr : Attrs) {
3570 const Record &R = *Attr;
3571 if (!R.getValueAsBit("ASTNode"))
3573 OS << " case attr::" << R.getName() << ": {\n";
3575 // If the attribute has a semantically-meaningful name (which is determined
3576 // by whether there is a Spelling enumeration for it), then write out the
3577 // spelling used for the attribute.
3578 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
3579 if (Spellings.size() > 1 && !SpellingNamesAreCommon(Spellings))
3580 OS << " OS << \" \" << A->getSpelling();\n";
3582 Args = R.getValueAsListOfDefs("Args");
3583 if (!Args.empty()) {
3584 OS << " const auto *SA = cast<" << R.getName()
3586 for (const auto *Arg : Args)
3587 createArgument(*Arg, R.getName())->writeDump(OS);
3589 for (const auto *AI : Args)
3590 createArgument(*AI, R.getName())->writeDumpChildren(OS);
3599 void EmitClangAttrParserStringSwitches(RecordKeeper &Records,
3601 emitSourceFileHeader("Parser-related llvm::StringSwitch cases", OS);
3602 emitClangAttrArgContextList(Records, OS);
3603 emitClangAttrIdentifierArgList(Records, OS);
3604 emitClangAttrTypeArgList(Records, OS);
3605 emitClangAttrLateParsedList(Records, OS);
3608 void EmitClangAttrSubjectMatchRulesParserStringSwitches(RecordKeeper &Records,
3610 getPragmaAttributeSupport(Records).generateParsingHelpers(OS);
3613 class DocumentationData {
3615 const Record *Documentation;
3616 const Record *Attribute;
3618 DocumentationData(const Record &Documentation, const Record &Attribute)
3619 : Documentation(&Documentation), Attribute(&Attribute) {}
3622 static void WriteCategoryHeader(const Record *DocCategory,
3624 const std::string &Name = DocCategory->getValueAsString("Name");
3625 OS << Name << "\n" << std::string(Name.length(), '=') << "\n";
3627 // If there is content, print that as well.
3628 std::string ContentStr = DocCategory->getValueAsString("Content");
3629 // Trim leading and trailing newlines and spaces.
3630 OS << StringRef(ContentStr).trim();
3644 static void WriteDocumentation(RecordKeeper &Records,
3645 const DocumentationData &Doc, raw_ostream &OS) {
3646 // FIXME: there is no way to have a per-spelling category for the attribute
3647 // documentation. This may not be a limiting factor since the spellings
3648 // should generally be consistently applied across the category.
3650 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Doc.Attribute);
3652 // Determine the heading to be used for this attribute.
3653 std::string Heading = Doc.Documentation->getValueAsString("Heading");
3654 bool CustomHeading = !Heading.empty();
3655 if (Heading.empty()) {
3656 // If there's only one spelling, we can simply use that.
3657 if (Spellings.size() == 1)
3658 Heading = Spellings.begin()->name();
3660 std::set<std::string> Uniques;
3661 for (auto I = Spellings.begin(), E = Spellings.end();
3662 I != E && Uniques.size() <= 1; ++I) {
3663 std::string Spelling = NormalizeNameForSpellingComparison(I->name());
3664 Uniques.insert(Spelling);
3666 // If the semantic map has only one spelling, that is sufficient for our
3668 if (Uniques.size() == 1)
3669 Heading = *Uniques.begin();
3673 // If the heading is still empty, it is an error.
3674 if (Heading.empty())
3675 PrintFatalError(Doc.Attribute->getLoc(),
3676 "This attribute requires a heading to be specified");
3678 // Gather a list of unique spellings; this is not the same as the semantic
3679 // spelling for the attribute. Variations in underscores and other non-
3680 // semantic characters are still acceptable.
3681 std::vector<std::string> Names;
3683 unsigned SupportedSpellings = 0;
3684 for (const auto &I : Spellings) {
3685 SpellingKind Kind = StringSwitch<SpellingKind>(I.variety())
3687 .Case("CXX11", CXX11)
3688 .Case("Declspec", Declspec)
3689 .Case("Microsoft", Microsoft)
3690 .Case("Keyword", Keyword)
3691 .Case("Pragma", Pragma);
3693 // Mask in the supported spelling.
3694 SupportedSpellings |= Kind;
3697 if (Kind == CXX11 && !I.nameSpace().empty())
3698 Name = I.nameSpace() + "::";
3701 // If this name is the same as the heading, do not add it.
3702 if (Name != Heading)
3703 Names.push_back(Name);
3706 // Print out the heading for the attribute. If there are alternate spellings,
3707 // then display those after the heading.
3708 if (!CustomHeading && !Names.empty()) {
3710 for (auto I = Names.begin(), E = Names.end(); I != E; ++I) {
3711 if (I != Names.begin())
3717 OS << Heading << "\n" << std::string(Heading.length(), '-') << "\n";
3719 if (!SupportedSpellings)
3720 PrintFatalError(Doc.Attribute->getLoc(),
3721 "Attribute has no supported spellings; cannot be "
3724 // List what spelling syntaxes the attribute supports.
3725 OS << ".. csv-table:: Supported Syntaxes\n";
3726 OS << " :header: \"GNU\", \"C++11\", \"__declspec\", \"Keyword\",";
3727 OS << " \"Pragma\", \"Pragma clang attribute\"\n\n";
3729 if (SupportedSpellings & GNU) OS << "X";
3731 if (SupportedSpellings & CXX11) OS << "X";
3733 if (SupportedSpellings & Declspec) OS << "X";
3735 if (SupportedSpellings & Keyword) OS << "X";
3737 if (SupportedSpellings & Pragma) OS << "X";
3739 if (getPragmaAttributeSupport(Records).isAttributedSupported(*Doc.Attribute))
3743 // If the attribute is deprecated, print a message about it, and possibly
3744 // provide a replacement attribute.
3745 if (!Doc.Documentation->isValueUnset("Deprecated")) {
3746 OS << "This attribute has been deprecated, and may be removed in a future "
3747 << "version of Clang.";
3748 const Record &Deprecated = *Doc.Documentation->getValueAsDef("Deprecated");
3749 std::string Replacement = Deprecated.getValueAsString("Replacement");
3750 if (!Replacement.empty())
3751 OS << " This attribute has been superseded by ``"
3752 << Replacement << "``.";
3756 std::string ContentStr = Doc.Documentation->getValueAsString("Content");
3757 // Trim leading and trailing newlines and spaces.
3758 OS << StringRef(ContentStr).trim();
3763 void EmitClangAttrDocs(RecordKeeper &Records, raw_ostream &OS) {
3764 // Get the documentation introduction paragraph.
3765 const Record *Documentation = Records.getDef("GlobalDocumentation");
3766 if (!Documentation) {
3767 PrintFatalError("The Documentation top-level definition is missing, "
3768 "no documentation will be generated.");
3772 OS << Documentation->getValueAsString("Intro") << "\n";
3774 // Gather the Documentation lists from each of the attributes, based on the
3775 // category provided.
3776 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
3777 std::map<const Record *, std::vector<DocumentationData>> SplitDocs;
3778 for (const auto *A : Attrs) {
3779 const Record &Attr = *A;
3780 std::vector<Record *> Docs = Attr.getValueAsListOfDefs("Documentation");
3781 for (const auto *D : Docs) {
3782 const Record &Doc = *D;
3783 const Record *Category = Doc.getValueAsDef("Category");
3784 // If the category is "undocumented", then there cannot be any other
3785 // documentation categories (otherwise, the attribute would become
3787 std::string Cat = Category->getValueAsString("Name");
3788 bool Undocumented = Cat == "Undocumented";
3789 if (Undocumented && Docs.size() > 1)
3790 PrintFatalError(Doc.getLoc(),
3791 "Attribute is \"Undocumented\", but has multiple "
3792 "documentation categories");
3795 SplitDocs[Category].push_back(DocumentationData(Doc, Attr));
3799 // Having split the attributes out based on what documentation goes where,
3800 // we can begin to generate sections of documentation.
3801 for (const auto &I : SplitDocs) {
3802 WriteCategoryHeader(I.first, OS);
3804 // Walk over each of the attributes in the category and write out their
3806 for (const auto &Doc : I.second)
3807 WriteDocumentation(Records, Doc, OS);
3811 void EmitTestPragmaAttributeSupportedAttributes(RecordKeeper &Records,
3813 PragmaClangAttributeSupport Support = getPragmaAttributeSupport(Records);
3814 ParsedAttrMap Attrs = getParsedAttrList(Records);
3815 unsigned NumAttrs = 0;
3816 for (const auto &I : Attrs) {
3817 if (Support.isAttributedSupported(*I.second))
3820 OS << "#pragma clang attribute supports " << NumAttrs << " attributes:\n";
3821 for (const auto &I : Attrs) {
3822 if (!Support.isAttributedSupported(*I.second))
3825 if (I.second->isValueUnset("Subjects")) {
3829 const Record *SubjectObj = I.second->getValueAsDef("Subjects");
3830 std::vector<Record *> Subjects =
3831 SubjectObj->getValueAsListOfDefs("Subjects");
3833 for (const auto &Subject : llvm::enumerate(Subjects)) {
3834 if (Subject.index())
3836 PragmaClangAttributeSupport::RuleOrAggregateRuleSet &RuleSet =
3837 Support.SubjectsToRules.find(Subject.value())->getSecond();
3838 if (RuleSet.isRule()) {
3839 OS << RuleSet.getRule().getEnumValueName();
3843 for (const auto &Rule : llvm::enumerate(RuleSet.getAggregateRuleSet())) {
3846 OS << Rule.value().getEnumValueName();
3854 } // end namespace clang