1 //===- ClangAttrEmitter.cpp - Generate Clang attribute handling =-*- C++ -*--=//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // These tablegen backends emit Clang attribute processing code
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "TableGenBackends.h"
14 #include "ASTTableGen.h"
15
16 #include "llvm/ADT/ArrayRef.h"
17 #include "llvm/ADT/DenseMap.h"
18 #include "llvm/ADT/DenseSet.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SmallString.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/ADT/StringSet.h"
24 #include "llvm/ADT/StringSwitch.h"
25 #include "llvm/ADT/iterator_range.h"
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/Support/raw_ostream.h"
28 #include "llvm/TableGen/Error.h"
29 #include "llvm/TableGen/Record.h"
30 #include "llvm/TableGen/StringMatcher.h"
31 #include "llvm/TableGen/TableGenBackend.h"
32 #include <algorithm>
33 #include <cassert>
34 #include <cctype>
35 #include <cstddef>
36 #include <cstdint>
37 #include <map>
38 #include <memory>
39 #include <set>
40 #include <sstream>
41 #include <string>
42 #include <utility>
43 #include <vector>
44
45 using namespace llvm;
46
47 namespace {
48
49 class FlattenedSpelling {
50 std::string V, N, NS;
51 bool K = false;
52
53 public:
FlattenedSpelling(const std::string & Variety,const std::string & Name,const std::string & Namespace,bool KnownToGCC)54 FlattenedSpelling(const std::string &Variety, const std::string &Name,
55 const std::string &Namespace, bool KnownToGCC) :
56 V(Variety), N(Name), NS(Namespace), K(KnownToGCC) {}
FlattenedSpelling(const Record & Spelling)57 explicit FlattenedSpelling(const Record &Spelling)
58 : V(std::string(Spelling.getValueAsString("Variety"))),
59 N(std::string(Spelling.getValueAsString("Name"))) {
60 assert(V != "GCC" && V != "Clang" &&
61 "Given a GCC spelling, which means this hasn't been flattened!");
62 if (V == "CXX11" || V == "C2x" || V == "Pragma")
63 NS = std::string(Spelling.getValueAsString("Namespace"));
64 }
65
variety() const66 const std::string &variety() const { return V; }
name() const67 const std::string &name() const { return N; }
nameSpace() const68 const std::string &nameSpace() const { return NS; }
knownToGCC() const69 bool knownToGCC() const { return K; }
70 };
71
72 } // end anonymous namespace
73
74 static std::vector<FlattenedSpelling>
GetFlattenedSpellings(const Record & Attr)75 GetFlattenedSpellings(const Record &Attr) {
76 std::vector<Record *> Spellings = Attr.getValueAsListOfDefs("Spellings");
77 std::vector<FlattenedSpelling> Ret;
78
79 for (const auto &Spelling : Spellings) {
80 StringRef Variety = Spelling->getValueAsString("Variety");
81 StringRef Name = Spelling->getValueAsString("Name");
82 if (Variety == "GCC") {
83 Ret.emplace_back("GNU", std::string(Name), "", true);
84 Ret.emplace_back("CXX11", std::string(Name), "gnu", true);
85 if (Spelling->getValueAsBit("AllowInC"))
86 Ret.emplace_back("C2x", std::string(Name), "gnu", true);
87 } else if (Variety == "Clang") {
88 Ret.emplace_back("GNU", std::string(Name), "", false);
89 Ret.emplace_back("CXX11", std::string(Name), "clang", false);
90 if (Spelling->getValueAsBit("AllowInC"))
91 Ret.emplace_back("C2x", std::string(Name), "clang", false);
92 } else
93 Ret.push_back(FlattenedSpelling(*Spelling));
94 }
95
96 return Ret;
97 }
98
ReadPCHRecord(StringRef type)99 static std::string ReadPCHRecord(StringRef type) {
100 return StringSwitch<std::string>(type)
101 .EndsWith("Decl *", "Record.GetLocalDeclAs<" +
102 std::string(type.data(), 0, type.size() - 1) +
103 ">(Record.readInt())")
104 .Case("TypeSourceInfo *", "Record.readTypeSourceInfo()")
105 .Case("Expr *", "Record.readExpr()")
106 .Case("IdentifierInfo *", "Record.readIdentifier()")
107 .Case("StringRef", "Record.readString()")
108 .Case("ParamIdx", "ParamIdx::deserialize(Record.readInt())")
109 .Case("OMPTraitInfo *", "Record.readOMPTraitInfo()")
110 .Default("Record.readInt()");
111 }
112
113 // Get a type that is suitable for storing an object of the specified type.
getStorageType(StringRef type)114 static StringRef getStorageType(StringRef type) {
115 return StringSwitch<StringRef>(type)
116 .Case("StringRef", "std::string")
117 .Default(type);
118 }
119
120 // Assumes that the way to get the value is SA->getname()
WritePCHRecord(StringRef type,StringRef name)121 static std::string WritePCHRecord(StringRef type, StringRef name) {
122 return "Record." +
123 StringSwitch<std::string>(type)
124 .EndsWith("Decl *", "AddDeclRef(" + std::string(name) + ");\n")
125 .Case("TypeSourceInfo *",
126 "AddTypeSourceInfo(" + std::string(name) + ");\n")
127 .Case("Expr *", "AddStmt(" + std::string(name) + ");\n")
128 .Case("IdentifierInfo *",
129 "AddIdentifierRef(" + std::string(name) + ");\n")
130 .Case("StringRef", "AddString(" + std::string(name) + ");\n")
131 .Case("ParamIdx",
132 "push_back(" + std::string(name) + ".serialize());\n")
133 .Case("OMPTraitInfo *",
134 "writeOMPTraitInfo(" + std::string(name) + ");\n")
135 .Default("push_back(" + std::string(name) + ");\n");
136 }
137
138 // Normalize attribute name by removing leading and trailing
139 // underscores. For example, __foo, foo__, __foo__ would
140 // become foo.
NormalizeAttrName(StringRef AttrName)141 static StringRef NormalizeAttrName(StringRef AttrName) {
142 AttrName.consume_front("__");
143 AttrName.consume_back("__");
144 return AttrName;
145 }
146
147 // Normalize the name by removing any and all leading and trailing underscores.
148 // This is different from NormalizeAttrName in that it also handles names like
149 // _pascal and __pascal.
NormalizeNameForSpellingComparison(StringRef Name)150 static StringRef NormalizeNameForSpellingComparison(StringRef Name) {
151 return Name.trim("_");
152 }
153
154 // Normalize the spelling of a GNU attribute (i.e. "x" in "__attribute__((x))"),
155 // removing "__" if it appears at the beginning and end of the attribute's name.
NormalizeGNUAttrSpelling(StringRef AttrSpelling)156 static StringRef NormalizeGNUAttrSpelling(StringRef AttrSpelling) {
157 if (AttrSpelling.startswith("__") && AttrSpelling.endswith("__")) {
158 AttrSpelling = AttrSpelling.substr(2, AttrSpelling.size() - 4);
159 }
160
161 return AttrSpelling;
162 }
163
164 typedef std::vector<std::pair<std::string, const Record *>> ParsedAttrMap;
165
getParsedAttrList(const RecordKeeper & Records,ParsedAttrMap * Dupes=nullptr)166 static ParsedAttrMap getParsedAttrList(const RecordKeeper &Records,
167 ParsedAttrMap *Dupes = nullptr) {
168 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
169 std::set<std::string> Seen;
170 ParsedAttrMap R;
171 for (const auto *Attr : Attrs) {
172 if (Attr->getValueAsBit("SemaHandler")) {
173 std::string AN;
174 if (Attr->isSubClassOf("TargetSpecificAttr") &&
175 !Attr->isValueUnset("ParseKind")) {
176 AN = std::string(Attr->getValueAsString("ParseKind"));
177
178 // If this attribute has already been handled, it does not need to be
179 // handled again.
180 if (Seen.find(AN) != Seen.end()) {
181 if (Dupes)
182 Dupes->push_back(std::make_pair(AN, Attr));
183 continue;
184 }
185 Seen.insert(AN);
186 } else
187 AN = NormalizeAttrName(Attr->getName()).str();
188
189 R.push_back(std::make_pair(AN, Attr));
190 }
191 }
192 return R;
193 }
194
195 namespace {
196
197 class Argument {
198 std::string lowerName, upperName;
199 StringRef attrName;
200 bool isOpt;
201 bool Fake;
202
203 public:
Argument(const Record & Arg,StringRef Attr)204 Argument(const Record &Arg, StringRef Attr)
205 : lowerName(std::string(Arg.getValueAsString("Name"))),
206 upperName(lowerName), attrName(Attr), isOpt(false), Fake(false) {
207 if (!lowerName.empty()) {
208 lowerName[0] = std::tolower(lowerName[0]);
209 upperName[0] = std::toupper(upperName[0]);
210 }
211 // Work around MinGW's macro definition of 'interface' to 'struct'. We
212 // have an attribute argument called 'Interface', so only the lower case
213 // name conflicts with the macro definition.
214 if (lowerName == "interface")
215 lowerName = "interface_";
216 }
217 virtual ~Argument() = default;
218
getLowerName() const219 StringRef getLowerName() const { return lowerName; }
getUpperName() const220 StringRef getUpperName() const { return upperName; }
getAttrName() const221 StringRef getAttrName() const { return attrName; }
222
isOptional() const223 bool isOptional() const { return isOpt; }
setOptional(bool set)224 void setOptional(bool set) { isOpt = set; }
225
isFake() const226 bool isFake() const { return Fake; }
setFake(bool fake)227 void setFake(bool fake) { Fake = fake; }
228
229 // These functions print the argument contents formatted in different ways.
230 virtual void writeAccessors(raw_ostream &OS) const = 0;
writeAccessorDefinitions(raw_ostream & OS) const231 virtual void writeAccessorDefinitions(raw_ostream &OS) const {}
writeASTVisitorTraversal(raw_ostream & OS) const232 virtual void writeASTVisitorTraversal(raw_ostream &OS) const {}
233 virtual void writeCloneArgs(raw_ostream &OS) const = 0;
234 virtual void writeTemplateInstantiationArgs(raw_ostream &OS) const = 0;
writeTemplateInstantiation(raw_ostream & OS) const235 virtual void writeTemplateInstantiation(raw_ostream &OS) const {}
writeCtorBody(raw_ostream & OS) const236 virtual void writeCtorBody(raw_ostream &OS) const {}
237 virtual void writeCtorInitializers(raw_ostream &OS) const = 0;
238 virtual void writeCtorDefaultInitializers(raw_ostream &OS) const = 0;
239 virtual void writeCtorParameters(raw_ostream &OS) const = 0;
240 virtual void writeDeclarations(raw_ostream &OS) const = 0;
241 virtual void writePCHReadArgs(raw_ostream &OS) const = 0;
242 virtual void writePCHReadDecls(raw_ostream &OS) const = 0;
243 virtual void writePCHWrite(raw_ostream &OS) const = 0;
getIsOmitted() const244 virtual std::string getIsOmitted() const { return "false"; }
245 virtual void writeValue(raw_ostream &OS) const = 0;
246 virtual void writeDump(raw_ostream &OS) const = 0;
writeDumpChildren(raw_ostream & OS) const247 virtual void writeDumpChildren(raw_ostream &OS) const {}
writeHasChildren(raw_ostream & OS) const248 virtual void writeHasChildren(raw_ostream &OS) const { OS << "false"; }
249
isEnumArg() const250 virtual bool isEnumArg() const { return false; }
isVariadicEnumArg() const251 virtual bool isVariadicEnumArg() const { return false; }
isVariadic() const252 virtual bool isVariadic() const { return false; }
253
writeImplicitCtorArgs(raw_ostream & OS) const254 virtual void writeImplicitCtorArgs(raw_ostream &OS) const {
255 OS << getUpperName();
256 }
257 };
258
259 class SimpleArgument : public Argument {
260 std::string type;
261
262 public:
SimpleArgument(const Record & Arg,StringRef Attr,std::string T)263 SimpleArgument(const Record &Arg, StringRef Attr, std::string T)
264 : Argument(Arg, Attr), type(std::move(T)) {}
265
getType() const266 std::string getType() const { return type; }
267
writeAccessors(raw_ostream & OS) const268 void writeAccessors(raw_ostream &OS) const override {
269 OS << " " << type << " get" << getUpperName() << "() const {\n";
270 OS << " return " << getLowerName() << ";\n";
271 OS << " }";
272 }
273
writeCloneArgs(raw_ostream & OS) const274 void writeCloneArgs(raw_ostream &OS) const override {
275 OS << getLowerName();
276 }
277
writeTemplateInstantiationArgs(raw_ostream & OS) const278 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
279 OS << "A->get" << getUpperName() << "()";
280 }
281
writeCtorInitializers(raw_ostream & OS) const282 void writeCtorInitializers(raw_ostream &OS) const override {
283 OS << getLowerName() << "(" << getUpperName() << ")";
284 }
285
writeCtorDefaultInitializers(raw_ostream & OS) const286 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
287 OS << getLowerName() << "()";
288 }
289
writeCtorParameters(raw_ostream & OS) const290 void writeCtorParameters(raw_ostream &OS) const override {
291 OS << type << " " << getUpperName();
292 }
293
writeDeclarations(raw_ostream & OS) const294 void writeDeclarations(raw_ostream &OS) const override {
295 OS << type << " " << getLowerName() << ";";
296 }
297
writePCHReadDecls(raw_ostream & OS) const298 void writePCHReadDecls(raw_ostream &OS) const override {
299 std::string read = ReadPCHRecord(type);
300 OS << " " << type << " " << getLowerName() << " = " << read << ";\n";
301 }
302
writePCHReadArgs(raw_ostream & OS) const303 void writePCHReadArgs(raw_ostream &OS) const override {
304 OS << getLowerName();
305 }
306
writePCHWrite(raw_ostream & OS) const307 void writePCHWrite(raw_ostream &OS) const override {
308 OS << " "
309 << WritePCHRecord(type,
310 "SA->get" + std::string(getUpperName()) + "()");
311 }
312
getIsOmitted() const313 std::string getIsOmitted() const override {
314 if (type == "IdentifierInfo *")
315 return "!get" + getUpperName().str() + "()";
316 if (type == "TypeSourceInfo *")
317 return "!get" + getUpperName().str() + "Loc()";
318 if (type == "ParamIdx")
319 return "!get" + getUpperName().str() + "().isValid()";
320 return "false";
321 }
322
writeValue(raw_ostream & OS) const323 void writeValue(raw_ostream &OS) const override {
324 if (type == "FunctionDecl *")
325 OS << "\" << get" << getUpperName()
326 << "()->getNameInfo().getAsString() << \"";
327 else if (type == "IdentifierInfo *")
328 // Some non-optional (comma required) identifier arguments can be the
329 // empty string but are then recorded as a nullptr.
330 OS << "\" << (get" << getUpperName() << "() ? get" << getUpperName()
331 << "()->getName() : \"\") << \"";
332 else if (type == "VarDecl *")
333 OS << "\" << get" << getUpperName() << "()->getName() << \"";
334 else if (type == "TypeSourceInfo *")
335 OS << "\" << get" << getUpperName() << "().getAsString() << \"";
336 else if (type == "ParamIdx")
337 OS << "\" << get" << getUpperName() << "().getSourceIndex() << \"";
338 else
339 OS << "\" << get" << getUpperName() << "() << \"";
340 }
341
writeDump(raw_ostream & OS) const342 void writeDump(raw_ostream &OS) const override {
343 if (StringRef(type).endswith("Decl *")) {
344 OS << " OS << \" \";\n";
345 OS << " dumpBareDeclRef(SA->get" << getUpperName() << "());\n";
346 } else if (type == "IdentifierInfo *") {
347 // Some non-optional (comma required) identifier arguments can be the
348 // empty string but are then recorded as a nullptr.
349 OS << " if (SA->get" << getUpperName() << "())\n"
350 << " OS << \" \" << SA->get" << getUpperName()
351 << "()->getName();\n";
352 } else if (type == "TypeSourceInfo *") {
353 if (isOptional())
354 OS << " if (SA->get" << getUpperName() << "Loc())";
355 OS << " OS << \" \" << SA->get" << getUpperName()
356 << "().getAsString();\n";
357 } else if (type == "bool") {
358 OS << " if (SA->get" << getUpperName() << "()) OS << \" "
359 << getUpperName() << "\";\n";
360 } else if (type == "int" || type == "unsigned") {
361 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
362 } else if (type == "ParamIdx") {
363 if (isOptional())
364 OS << " if (SA->get" << getUpperName() << "().isValid())\n ";
365 OS << " OS << \" \" << SA->get" << getUpperName()
366 << "().getSourceIndex();\n";
367 } else if (type == "OMPTraitInfo *") {
368 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
369 } else {
370 llvm_unreachable("Unknown SimpleArgument type!");
371 }
372 }
373 };
374
375 class DefaultSimpleArgument : public SimpleArgument {
376 int64_t Default;
377
378 public:
DefaultSimpleArgument(const Record & Arg,StringRef Attr,std::string T,int64_t Default)379 DefaultSimpleArgument(const Record &Arg, StringRef Attr,
380 std::string T, int64_t Default)
381 : SimpleArgument(Arg, Attr, T), Default(Default) {}
382
writeAccessors(raw_ostream & OS) const383 void writeAccessors(raw_ostream &OS) const override {
384 SimpleArgument::writeAccessors(OS);
385
386 OS << "\n\n static const " << getType() << " Default" << getUpperName()
387 << " = ";
388 if (getType() == "bool")
389 OS << (Default != 0 ? "true" : "false");
390 else
391 OS << Default;
392 OS << ";";
393 }
394 };
395
396 class StringArgument : public Argument {
397 public:
StringArgument(const Record & Arg,StringRef Attr)398 StringArgument(const Record &Arg, StringRef Attr)
399 : Argument(Arg, Attr)
400 {}
401
writeAccessors(raw_ostream & OS) const402 void writeAccessors(raw_ostream &OS) const override {
403 OS << " llvm::StringRef get" << getUpperName() << "() const {\n";
404 OS << " return llvm::StringRef(" << getLowerName() << ", "
405 << getLowerName() << "Length);\n";
406 OS << " }\n";
407 OS << " unsigned get" << getUpperName() << "Length() const {\n";
408 OS << " return " << getLowerName() << "Length;\n";
409 OS << " }\n";
410 OS << " void set" << getUpperName()
411 << "(ASTContext &C, llvm::StringRef S) {\n";
412 OS << " " << getLowerName() << "Length = S.size();\n";
413 OS << " this->" << getLowerName() << " = new (C, 1) char ["
414 << getLowerName() << "Length];\n";
415 OS << " if (!S.empty())\n";
416 OS << " std::memcpy(this->" << getLowerName() << ", S.data(), "
417 << getLowerName() << "Length);\n";
418 OS << " }";
419 }
420
writeCloneArgs(raw_ostream & OS) const421 void writeCloneArgs(raw_ostream &OS) const override {
422 OS << "get" << getUpperName() << "()";
423 }
424
writeTemplateInstantiationArgs(raw_ostream & OS) const425 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
426 OS << "A->get" << getUpperName() << "()";
427 }
428
writeCtorBody(raw_ostream & OS) const429 void writeCtorBody(raw_ostream &OS) const override {
430 OS << " if (!" << getUpperName() << ".empty())\n";
431 OS << " std::memcpy(" << getLowerName() << ", " << getUpperName()
432 << ".data(), " << getLowerName() << "Length);\n";
433 }
434
writeCtorInitializers(raw_ostream & OS) const435 void writeCtorInitializers(raw_ostream &OS) const override {
436 OS << getLowerName() << "Length(" << getUpperName() << ".size()),"
437 << getLowerName() << "(new (Ctx, 1) char[" << getLowerName()
438 << "Length])";
439 }
440
writeCtorDefaultInitializers(raw_ostream & OS) const441 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
442 OS << getLowerName() << "Length(0)," << getLowerName() << "(nullptr)";
443 }
444
writeCtorParameters(raw_ostream & OS) const445 void writeCtorParameters(raw_ostream &OS) const override {
446 OS << "llvm::StringRef " << getUpperName();
447 }
448
writeDeclarations(raw_ostream & OS) const449 void writeDeclarations(raw_ostream &OS) const override {
450 OS << "unsigned " << getLowerName() << "Length;\n";
451 OS << "char *" << getLowerName() << ";";
452 }
453
writePCHReadDecls(raw_ostream & OS) const454 void writePCHReadDecls(raw_ostream &OS) const override {
455 OS << " std::string " << getLowerName()
456 << "= Record.readString();\n";
457 }
458
writePCHReadArgs(raw_ostream & OS) const459 void writePCHReadArgs(raw_ostream &OS) const override {
460 OS << getLowerName();
461 }
462
writePCHWrite(raw_ostream & OS) const463 void writePCHWrite(raw_ostream &OS) const override {
464 OS << " Record.AddString(SA->get" << getUpperName() << "());\n";
465 }
466
writeValue(raw_ostream & OS) const467 void writeValue(raw_ostream &OS) const override {
468 OS << "\\\"\" << get" << getUpperName() << "() << \"\\\"";
469 }
470
writeDump(raw_ostream & OS) const471 void writeDump(raw_ostream &OS) const override {
472 OS << " OS << \" \\\"\" << SA->get" << getUpperName()
473 << "() << \"\\\"\";\n";
474 }
475 };
476
477 class AlignedArgument : public Argument {
478 public:
AlignedArgument(const Record & Arg,StringRef Attr)479 AlignedArgument(const Record &Arg, StringRef Attr)
480 : Argument(Arg, Attr)
481 {}
482
writeAccessors(raw_ostream & OS) const483 void writeAccessors(raw_ostream &OS) const override {
484 OS << " bool is" << getUpperName() << "Dependent() const;\n";
485 OS << " bool is" << getUpperName() << "ErrorDependent() const;\n";
486
487 OS << " unsigned get" << getUpperName() << "(ASTContext &Ctx) const;\n";
488
489 OS << " bool is" << getUpperName() << "Expr() const {\n";
490 OS << " return is" << getLowerName() << "Expr;\n";
491 OS << " }\n";
492
493 OS << " Expr *get" << getUpperName() << "Expr() const {\n";
494 OS << " assert(is" << getLowerName() << "Expr);\n";
495 OS << " return " << getLowerName() << "Expr;\n";
496 OS << " }\n";
497
498 OS << " TypeSourceInfo *get" << getUpperName() << "Type() const {\n";
499 OS << " assert(!is" << getLowerName() << "Expr);\n";
500 OS << " return " << getLowerName() << "Type;\n";
501 OS << " }";
502 }
503
writeAccessorDefinitions(raw_ostream & OS) const504 void writeAccessorDefinitions(raw_ostream &OS) const override {
505 OS << "bool " << getAttrName() << "Attr::is" << getUpperName()
506 << "Dependent() const {\n";
507 OS << " if (is" << getLowerName() << "Expr)\n";
508 OS << " return " << getLowerName() << "Expr && (" << getLowerName()
509 << "Expr->isValueDependent() || " << getLowerName()
510 << "Expr->isTypeDependent());\n";
511 OS << " else\n";
512 OS << " return " << getLowerName()
513 << "Type->getType()->isDependentType();\n";
514 OS << "}\n";
515
516 OS << "bool " << getAttrName() << "Attr::is" << getUpperName()
517 << "ErrorDependent() const {\n";
518 OS << " if (is" << getLowerName() << "Expr)\n";
519 OS << " return " << getLowerName() << "Expr && " << getLowerName()
520 << "Expr->containsErrors();\n";
521 OS << " return " << getLowerName()
522 << "Type->getType()->containsErrors();\n";
523 OS << "}\n";
524
525 // FIXME: Do not do the calculation here
526 // FIXME: Handle types correctly
527 // A null pointer means maximum alignment
528 OS << "unsigned " << getAttrName() << "Attr::get" << getUpperName()
529 << "(ASTContext &Ctx) const {\n";
530 OS << " assert(!is" << getUpperName() << "Dependent());\n";
531 OS << " if (is" << getLowerName() << "Expr)\n";
532 OS << " return " << getLowerName() << "Expr ? " << getLowerName()
533 << "Expr->EvaluateKnownConstInt(Ctx).getZExtValue()"
534 << " * Ctx.getCharWidth() : "
535 << "Ctx.getTargetDefaultAlignForAttributeAligned();\n";
536 OS << " else\n";
537 OS << " return 0; // FIXME\n";
538 OS << "}\n";
539 }
540
writeASTVisitorTraversal(raw_ostream & OS) const541 void writeASTVisitorTraversal(raw_ostream &OS) const override {
542 StringRef Name = getUpperName();
543 OS << " if (A->is" << Name << "Expr()) {\n"
544 << " if (!getDerived().TraverseStmt(A->get" << Name << "Expr()))\n"
545 << " return false;\n"
546 << " } else if (auto *TSI = A->get" << Name << "Type()) {\n"
547 << " if (!getDerived().TraverseTypeLoc(TSI->getTypeLoc()))\n"
548 << " return false;\n"
549 << " }\n";
550 }
551
writeCloneArgs(raw_ostream & OS) const552 void writeCloneArgs(raw_ostream &OS) const override {
553 OS << "is" << getLowerName() << "Expr, is" << getLowerName()
554 << "Expr ? static_cast<void*>(" << getLowerName()
555 << "Expr) : " << getLowerName()
556 << "Type";
557 }
558
writeTemplateInstantiationArgs(raw_ostream & OS) const559 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
560 // FIXME: move the definition in Sema::InstantiateAttrs to here.
561 // In the meantime, aligned attributes are cloned.
562 }
563
writeCtorBody(raw_ostream & OS) const564 void writeCtorBody(raw_ostream &OS) const override {
565 OS << " if (is" << getLowerName() << "Expr)\n";
566 OS << " " << getLowerName() << "Expr = reinterpret_cast<Expr *>("
567 << getUpperName() << ");\n";
568 OS << " else\n";
569 OS << " " << getLowerName()
570 << "Type = reinterpret_cast<TypeSourceInfo *>(" << getUpperName()
571 << ");\n";
572 }
573
writeCtorInitializers(raw_ostream & OS) const574 void writeCtorInitializers(raw_ostream &OS) const override {
575 OS << "is" << getLowerName() << "Expr(Is" << getUpperName() << "Expr)";
576 }
577
writeCtorDefaultInitializers(raw_ostream & OS) const578 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
579 OS << "is" << getLowerName() << "Expr(false)";
580 }
581
writeCtorParameters(raw_ostream & OS) const582 void writeCtorParameters(raw_ostream &OS) const override {
583 OS << "bool Is" << getUpperName() << "Expr, void *" << getUpperName();
584 }
585
writeImplicitCtorArgs(raw_ostream & OS) const586 void writeImplicitCtorArgs(raw_ostream &OS) const override {
587 OS << "Is" << getUpperName() << "Expr, " << getUpperName();
588 }
589
writeDeclarations(raw_ostream & OS) const590 void writeDeclarations(raw_ostream &OS) const override {
591 OS << "bool is" << getLowerName() << "Expr;\n";
592 OS << "union {\n";
593 OS << "Expr *" << getLowerName() << "Expr;\n";
594 OS << "TypeSourceInfo *" << getLowerName() << "Type;\n";
595 OS << "};";
596 }
597
writePCHReadArgs(raw_ostream & OS) const598 void writePCHReadArgs(raw_ostream &OS) const override {
599 OS << "is" << getLowerName() << "Expr, " << getLowerName() << "Ptr";
600 }
601
writePCHReadDecls(raw_ostream & OS) const602 void writePCHReadDecls(raw_ostream &OS) const override {
603 OS << " bool is" << getLowerName() << "Expr = Record.readInt();\n";
604 OS << " void *" << getLowerName() << "Ptr;\n";
605 OS << " if (is" << getLowerName() << "Expr)\n";
606 OS << " " << getLowerName() << "Ptr = Record.readExpr();\n";
607 OS << " else\n";
608 OS << " " << getLowerName()
609 << "Ptr = Record.readTypeSourceInfo();\n";
610 }
611
writePCHWrite(raw_ostream & OS) const612 void writePCHWrite(raw_ostream &OS) const override {
613 OS << " Record.push_back(SA->is" << getUpperName() << "Expr());\n";
614 OS << " if (SA->is" << getUpperName() << "Expr())\n";
615 OS << " Record.AddStmt(SA->get" << getUpperName() << "Expr());\n";
616 OS << " else\n";
617 OS << " Record.AddTypeSourceInfo(SA->get" << getUpperName()
618 << "Type());\n";
619 }
620
getIsOmitted() const621 std::string getIsOmitted() const override {
622 return "!is" + getLowerName().str() + "Expr || !" + getLowerName().str()
623 + "Expr";
624 }
625
writeValue(raw_ostream & OS) const626 void writeValue(raw_ostream &OS) const override {
627 OS << "\";\n";
628 OS << " " << getLowerName()
629 << "Expr->printPretty(OS, nullptr, Policy);\n";
630 OS << " OS << \"";
631 }
632
writeDump(raw_ostream & OS) const633 void writeDump(raw_ostream &OS) const override {
634 OS << " if (!SA->is" << getUpperName() << "Expr())\n";
635 OS << " dumpType(SA->get" << getUpperName()
636 << "Type()->getType());\n";
637 }
638
writeDumpChildren(raw_ostream & OS) const639 void writeDumpChildren(raw_ostream &OS) const override {
640 OS << " if (SA->is" << getUpperName() << "Expr())\n";
641 OS << " Visit(SA->get" << getUpperName() << "Expr());\n";
642 }
643
writeHasChildren(raw_ostream & OS) const644 void writeHasChildren(raw_ostream &OS) const override {
645 OS << "SA->is" << getUpperName() << "Expr()";
646 }
647 };
648
649 class VariadicArgument : public Argument {
650 std::string Type, ArgName, ArgSizeName, RangeName;
651
652 protected:
653 // Assumed to receive a parameter: raw_ostream OS.
writeValueImpl(raw_ostream & OS) const654 virtual void writeValueImpl(raw_ostream &OS) const {
655 OS << " OS << Val;\n";
656 }
657 // Assumed to receive a parameter: raw_ostream OS.
writeDumpImpl(raw_ostream & OS) const658 virtual void writeDumpImpl(raw_ostream &OS) const {
659 OS << " OS << \" \" << Val;\n";
660 }
661
662 public:
VariadicArgument(const Record & Arg,StringRef Attr,std::string T)663 VariadicArgument(const Record &Arg, StringRef Attr, std::string T)
664 : Argument(Arg, Attr), Type(std::move(T)),
665 ArgName(getLowerName().str() + "_"), ArgSizeName(ArgName + "Size"),
666 RangeName(std::string(getLowerName())) {}
667
getType() const668 const std::string &getType() const { return Type; }
getArgName() const669 const std::string &getArgName() const { return ArgName; }
getArgSizeName() const670 const std::string &getArgSizeName() const { return ArgSizeName; }
isVariadic() const671 bool isVariadic() const override { return true; }
672
writeAccessors(raw_ostream & OS) const673 void writeAccessors(raw_ostream &OS) const override {
674 std::string IteratorType = getLowerName().str() + "_iterator";
675 std::string BeginFn = getLowerName().str() + "_begin()";
676 std::string EndFn = getLowerName().str() + "_end()";
677
678 OS << " typedef " << Type << "* " << IteratorType << ";\n";
679 OS << " " << IteratorType << " " << BeginFn << " const {"
680 << " return " << ArgName << "; }\n";
681 OS << " " << IteratorType << " " << EndFn << " const {"
682 << " return " << ArgName << " + " << ArgSizeName << "; }\n";
683 OS << " unsigned " << getLowerName() << "_size() const {"
684 << " return " << ArgSizeName << "; }\n";
685 OS << " llvm::iterator_range<" << IteratorType << "> " << RangeName
686 << "() const { return llvm::make_range(" << BeginFn << ", " << EndFn
687 << "); }\n";
688 }
689
writeCloneArgs(raw_ostream & OS) const690 void writeCloneArgs(raw_ostream &OS) const override {
691 OS << ArgName << ", " << ArgSizeName;
692 }
693
writeTemplateInstantiationArgs(raw_ostream & OS) const694 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
695 // This isn't elegant, but we have to go through public methods...
696 OS << "A->" << getLowerName() << "_begin(), "
697 << "A->" << getLowerName() << "_size()";
698 }
699
writeASTVisitorTraversal(raw_ostream & OS) const700 void writeASTVisitorTraversal(raw_ostream &OS) const override {
701 // FIXME: Traverse the elements.
702 }
703
writeCtorBody(raw_ostream & OS) const704 void writeCtorBody(raw_ostream &OS) const override {
705 OS << " std::copy(" << getUpperName() << ", " << getUpperName() << " + "
706 << ArgSizeName << ", " << ArgName << ");\n";
707 }
708
writeCtorInitializers(raw_ostream & OS) const709 void writeCtorInitializers(raw_ostream &OS) const override {
710 OS << ArgSizeName << "(" << getUpperName() << "Size), "
711 << ArgName << "(new (Ctx, 16) " << getType() << "["
712 << ArgSizeName << "])";
713 }
714
writeCtorDefaultInitializers(raw_ostream & OS) const715 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
716 OS << ArgSizeName << "(0), " << ArgName << "(nullptr)";
717 }
718
writeCtorParameters(raw_ostream & OS) const719 void writeCtorParameters(raw_ostream &OS) const override {
720 OS << getType() << " *" << getUpperName() << ", unsigned "
721 << getUpperName() << "Size";
722 }
723
writeImplicitCtorArgs(raw_ostream & OS) const724 void writeImplicitCtorArgs(raw_ostream &OS) const override {
725 OS << getUpperName() << ", " << getUpperName() << "Size";
726 }
727
writeDeclarations(raw_ostream & OS) const728 void writeDeclarations(raw_ostream &OS) const override {
729 OS << " unsigned " << ArgSizeName << ";\n";
730 OS << " " << getType() << " *" << ArgName << ";";
731 }
732
writePCHReadDecls(raw_ostream & OS) const733 void writePCHReadDecls(raw_ostream &OS) const override {
734 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
735 OS << " SmallVector<" << getType() << ", 4> "
736 << getLowerName() << ";\n";
737 OS << " " << getLowerName() << ".reserve(" << getLowerName()
738 << "Size);\n";
739
740 // If we can't store the values in the current type (if it's something
741 // like StringRef), store them in a different type and convert the
742 // container afterwards.
743 std::string StorageType = std::string(getStorageType(getType()));
744 std::string StorageName = std::string(getLowerName());
745 if (StorageType != getType()) {
746 StorageName += "Storage";
747 OS << " SmallVector<" << StorageType << ", 4> "
748 << StorageName << ";\n";
749 OS << " " << StorageName << ".reserve(" << getLowerName()
750 << "Size);\n";
751 }
752
753 OS << " for (unsigned i = 0; i != " << getLowerName() << "Size; ++i)\n";
754 std::string read = ReadPCHRecord(Type);
755 OS << " " << StorageName << ".push_back(" << read << ");\n";
756
757 if (StorageType != getType()) {
758 OS << " for (unsigned i = 0; i != " << getLowerName() << "Size; ++i)\n";
759 OS << " " << getLowerName() << ".push_back("
760 << StorageName << "[i]);\n";
761 }
762 }
763
writePCHReadArgs(raw_ostream & OS) const764 void writePCHReadArgs(raw_ostream &OS) const override {
765 OS << getLowerName() << ".data(), " << getLowerName() << "Size";
766 }
767
writePCHWrite(raw_ostream & OS) const768 void writePCHWrite(raw_ostream &OS) const override {
769 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
770 OS << " for (auto &Val : SA->" << RangeName << "())\n";
771 OS << " " << WritePCHRecord(Type, "Val");
772 }
773
writeValue(raw_ostream & OS) const774 void writeValue(raw_ostream &OS) const override {
775 OS << "\";\n";
776 OS << " bool isFirst = true;\n"
777 << " for (const auto &Val : " << RangeName << "()) {\n"
778 << " if (isFirst) isFirst = false;\n"
779 << " else OS << \", \";\n";
780 writeValueImpl(OS);
781 OS << " }\n";
782 OS << " OS << \"";
783 }
784
writeDump(raw_ostream & OS) const785 void writeDump(raw_ostream &OS) const override {
786 OS << " for (const auto &Val : SA->" << RangeName << "())\n";
787 writeDumpImpl(OS);
788 }
789 };
790
791 class VariadicParamIdxArgument : public VariadicArgument {
792 public:
VariadicParamIdxArgument(const Record & Arg,StringRef Attr)793 VariadicParamIdxArgument(const Record &Arg, StringRef Attr)
794 : VariadicArgument(Arg, Attr, "ParamIdx") {}
795
796 public:
writeValueImpl(raw_ostream & OS) const797 void writeValueImpl(raw_ostream &OS) const override {
798 OS << " OS << Val.getSourceIndex();\n";
799 }
800
writeDumpImpl(raw_ostream & OS) const801 void writeDumpImpl(raw_ostream &OS) const override {
802 OS << " OS << \" \" << Val.getSourceIndex();\n";
803 }
804 };
805
806 struct VariadicParamOrParamIdxArgument : public VariadicArgument {
VariadicParamOrParamIdxArgument__anona61259f60211::VariadicParamOrParamIdxArgument807 VariadicParamOrParamIdxArgument(const Record &Arg, StringRef Attr)
808 : VariadicArgument(Arg, Attr, "int") {}
809 };
810
811 // Unique the enums, but maintain the original declaration ordering.
812 std::vector<StringRef>
uniqueEnumsInOrder(const std::vector<StringRef> & enums)813 uniqueEnumsInOrder(const std::vector<StringRef> &enums) {
814 std::vector<StringRef> uniques;
815 SmallDenseSet<StringRef, 8> unique_set;
816 for (const auto &i : enums) {
817 if (unique_set.insert(i).second)
818 uniques.push_back(i);
819 }
820 return uniques;
821 }
822
823 class EnumArgument : public Argument {
824 std::string type;
825 std::vector<StringRef> values, enums, uniques;
826
827 public:
EnumArgument(const Record & Arg,StringRef Attr)828 EnumArgument(const Record &Arg, StringRef Attr)
829 : Argument(Arg, Attr), type(std::string(Arg.getValueAsString("Type"))),
830 values(Arg.getValueAsListOfStrings("Values")),
831 enums(Arg.getValueAsListOfStrings("Enums")),
832 uniques(uniqueEnumsInOrder(enums)) {
833 // FIXME: Emit a proper error
834 assert(!uniques.empty());
835 }
836
isEnumArg() const837 bool isEnumArg() const override { return true; }
838
writeAccessors(raw_ostream & OS) const839 void writeAccessors(raw_ostream &OS) const override {
840 OS << " " << type << " get" << getUpperName() << "() const {\n";
841 OS << " return " << getLowerName() << ";\n";
842 OS << " }";
843 }
844
writeCloneArgs(raw_ostream & OS) const845 void writeCloneArgs(raw_ostream &OS) const override {
846 OS << getLowerName();
847 }
848
writeTemplateInstantiationArgs(raw_ostream & OS) const849 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
850 OS << "A->get" << getUpperName() << "()";
851 }
writeCtorInitializers(raw_ostream & OS) const852 void writeCtorInitializers(raw_ostream &OS) const override {
853 OS << getLowerName() << "(" << getUpperName() << ")";
854 }
writeCtorDefaultInitializers(raw_ostream & OS) const855 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
856 OS << getLowerName() << "(" << type << "(0))";
857 }
writeCtorParameters(raw_ostream & OS) const858 void writeCtorParameters(raw_ostream &OS) const override {
859 OS << type << " " << getUpperName();
860 }
writeDeclarations(raw_ostream & OS) const861 void writeDeclarations(raw_ostream &OS) const override {
862 auto i = uniques.cbegin(), e = uniques.cend();
863 // The last one needs to not have a comma.
864 --e;
865
866 OS << "public:\n";
867 OS << " enum " << type << " {\n";
868 for (; i != e; ++i)
869 OS << " " << *i << ",\n";
870 OS << " " << *e << "\n";
871 OS << " };\n";
872 OS << "private:\n";
873 OS << " " << type << " " << getLowerName() << ";";
874 }
875
writePCHReadDecls(raw_ostream & OS) const876 void writePCHReadDecls(raw_ostream &OS) const override {
877 OS << " " << getAttrName() << "Attr::" << type << " " << getLowerName()
878 << "(static_cast<" << getAttrName() << "Attr::" << type
879 << ">(Record.readInt()));\n";
880 }
881
writePCHReadArgs(raw_ostream & OS) const882 void writePCHReadArgs(raw_ostream &OS) const override {
883 OS << getLowerName();
884 }
885
writePCHWrite(raw_ostream & OS) const886 void writePCHWrite(raw_ostream &OS) const override {
887 OS << "Record.push_back(SA->get" << getUpperName() << "());\n";
888 }
889
writeValue(raw_ostream & OS) const890 void writeValue(raw_ostream &OS) const override {
891 // FIXME: this isn't 100% correct -- some enum arguments require printing
892 // as a string literal, while others require printing as an identifier.
893 // Tablegen currently does not distinguish between the two forms.
894 OS << "\\\"\" << " << getAttrName() << "Attr::Convert" << type << "ToStr(get"
895 << getUpperName() << "()) << \"\\\"";
896 }
897
writeDump(raw_ostream & OS) const898 void writeDump(raw_ostream &OS) const override {
899 OS << " switch(SA->get" << getUpperName() << "()) {\n";
900 for (const auto &I : uniques) {
901 OS << " case " << getAttrName() << "Attr::" << I << ":\n";
902 OS << " OS << \" " << I << "\";\n";
903 OS << " break;\n";
904 }
905 OS << " }\n";
906 }
907
writeConversion(raw_ostream & OS,bool Header) const908 void writeConversion(raw_ostream &OS, bool Header) const {
909 if (Header) {
910 OS << " static bool ConvertStrTo" << type << "(StringRef Val, " << type
911 << " &Out);\n";
912 OS << " static const char *Convert" << type << "ToStr(" << type
913 << " Val);\n";
914 return;
915 }
916
917 OS << "bool " << getAttrName() << "Attr::ConvertStrTo" << type
918 << "(StringRef Val, " << type << " &Out) {\n";
919 OS << " Optional<" << type << "> R = llvm::StringSwitch<Optional<";
920 OS << type << ">>(Val)\n";
921 for (size_t I = 0; I < enums.size(); ++I) {
922 OS << " .Case(\"" << values[I] << "\", ";
923 OS << getAttrName() << "Attr::" << enums[I] << ")\n";
924 }
925 OS << " .Default(Optional<" << type << ">());\n";
926 OS << " if (R) {\n";
927 OS << " Out = *R;\n return true;\n }\n";
928 OS << " return false;\n";
929 OS << "}\n\n";
930
931 // Mapping from enumeration values back to enumeration strings isn't
932 // trivial because some enumeration values have multiple named
933 // enumerators, such as type_visibility(internal) and
934 // type_visibility(hidden) both mapping to TypeVisibilityAttr::Hidden.
935 OS << "const char *" << getAttrName() << "Attr::Convert" << type
936 << "ToStr(" << type << " Val) {\n"
937 << " switch(Val) {\n";
938 SmallDenseSet<StringRef, 8> Uniques;
939 for (size_t I = 0; I < enums.size(); ++I) {
940 if (Uniques.insert(enums[I]).second)
941 OS << " case " << getAttrName() << "Attr::" << enums[I]
942 << ": return \"" << values[I] << "\";\n";
943 }
944 OS << " }\n"
945 << " llvm_unreachable(\"No enumerator with that value\");\n"
946 << "}\n";
947 }
948 };
949
950 class VariadicEnumArgument: public VariadicArgument {
951 std::string type, QualifiedTypeName;
952 std::vector<StringRef> values, enums, uniques;
953
954 protected:
writeValueImpl(raw_ostream & OS) const955 void writeValueImpl(raw_ostream &OS) const override {
956 // FIXME: this isn't 100% correct -- some enum arguments require printing
957 // as a string literal, while others require printing as an identifier.
958 // Tablegen currently does not distinguish between the two forms.
959 OS << " OS << \"\\\"\" << " << getAttrName() << "Attr::Convert" << type
960 << "ToStr(Val)" << "<< \"\\\"\";\n";
961 }
962
963 public:
VariadicEnumArgument(const Record & Arg,StringRef Attr)964 VariadicEnumArgument(const Record &Arg, StringRef Attr)
965 : VariadicArgument(Arg, Attr,
966 std::string(Arg.getValueAsString("Type"))),
967 type(std::string(Arg.getValueAsString("Type"))),
968 values(Arg.getValueAsListOfStrings("Values")),
969 enums(Arg.getValueAsListOfStrings("Enums")),
970 uniques(uniqueEnumsInOrder(enums)) {
971 QualifiedTypeName = getAttrName().str() + "Attr::" + type;
972
973 // FIXME: Emit a proper error
974 assert(!uniques.empty());
975 }
976
isVariadicEnumArg() const977 bool isVariadicEnumArg() const override { return true; }
978
writeDeclarations(raw_ostream & OS) const979 void writeDeclarations(raw_ostream &OS) const override {
980 auto i = uniques.cbegin(), e = uniques.cend();
981 // The last one needs to not have a comma.
982 --e;
983
984 OS << "public:\n";
985 OS << " enum " << type << " {\n";
986 for (; i != e; ++i)
987 OS << " " << *i << ",\n";
988 OS << " " << *e << "\n";
989 OS << " };\n";
990 OS << "private:\n";
991
992 VariadicArgument::writeDeclarations(OS);
993 }
994
writeDump(raw_ostream & OS) const995 void writeDump(raw_ostream &OS) const override {
996 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
997 << "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->"
998 << getLowerName() << "_end(); I != E; ++I) {\n";
999 OS << " switch(*I) {\n";
1000 for (const auto &UI : uniques) {
1001 OS << " case " << getAttrName() << "Attr::" << UI << ":\n";
1002 OS << " OS << \" " << UI << "\";\n";
1003 OS << " break;\n";
1004 }
1005 OS << " }\n";
1006 OS << " }\n";
1007 }
1008
writePCHReadDecls(raw_ostream & OS) const1009 void writePCHReadDecls(raw_ostream &OS) const override {
1010 OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
1011 OS << " SmallVector<" << QualifiedTypeName << ", 4> " << getLowerName()
1012 << ";\n";
1013 OS << " " << getLowerName() << ".reserve(" << getLowerName()
1014 << "Size);\n";
1015 OS << " for (unsigned i = " << getLowerName() << "Size; i; --i)\n";
1016 OS << " " << getLowerName() << ".push_back(" << "static_cast<"
1017 << QualifiedTypeName << ">(Record.readInt()));\n";
1018 }
1019
writePCHWrite(raw_ostream & OS) const1020 void writePCHWrite(raw_ostream &OS) const override {
1021 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
1022 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
1023 << "_iterator i = SA->" << getLowerName() << "_begin(), e = SA->"
1024 << getLowerName() << "_end(); i != e; ++i)\n";
1025 OS << " " << WritePCHRecord(QualifiedTypeName, "(*i)");
1026 }
1027
writeConversion(raw_ostream & OS,bool Header) const1028 void writeConversion(raw_ostream &OS, bool Header) const {
1029 if (Header) {
1030 OS << " static bool ConvertStrTo" << type << "(StringRef Val, " << type
1031 << " &Out);\n";
1032 OS << " static const char *Convert" << type << "ToStr(" << type
1033 << " Val);\n";
1034 return;
1035 }
1036
1037 OS << "bool " << getAttrName() << "Attr::ConvertStrTo" << type
1038 << "(StringRef Val, ";
1039 OS << type << " &Out) {\n";
1040 OS << " Optional<" << type << "> R = llvm::StringSwitch<Optional<";
1041 OS << type << ">>(Val)\n";
1042 for (size_t I = 0; I < enums.size(); ++I) {
1043 OS << " .Case(\"" << values[I] << "\", ";
1044 OS << getAttrName() << "Attr::" << enums[I] << ")\n";
1045 }
1046 OS << " .Default(Optional<" << type << ">());\n";
1047 OS << " if (R) {\n";
1048 OS << " Out = *R;\n return true;\n }\n";
1049 OS << " return false;\n";
1050 OS << "}\n\n";
1051
1052 OS << "const char *" << getAttrName() << "Attr::Convert" << type
1053 << "ToStr(" << type << " Val) {\n"
1054 << " switch(Val) {\n";
1055 SmallDenseSet<StringRef, 8> Uniques;
1056 for (size_t I = 0; I < enums.size(); ++I) {
1057 if (Uniques.insert(enums[I]).second)
1058 OS << " case " << getAttrName() << "Attr::" << enums[I]
1059 << ": return \"" << values[I] << "\";\n";
1060 }
1061 OS << " }\n"
1062 << " llvm_unreachable(\"No enumerator with that value\");\n"
1063 << "}\n";
1064 }
1065 };
1066
1067 class VersionArgument : public Argument {
1068 public:
VersionArgument(const Record & Arg,StringRef Attr)1069 VersionArgument(const Record &Arg, StringRef Attr)
1070 : Argument(Arg, Attr)
1071 {}
1072
writeAccessors(raw_ostream & OS) const1073 void writeAccessors(raw_ostream &OS) const override {
1074 OS << " VersionTuple get" << getUpperName() << "() const {\n";
1075 OS << " return " << getLowerName() << ";\n";
1076 OS << " }\n";
1077 OS << " void set" << getUpperName()
1078 << "(ASTContext &C, VersionTuple V) {\n";
1079 OS << " " << getLowerName() << " = V;\n";
1080 OS << " }";
1081 }
1082
writeCloneArgs(raw_ostream & OS) const1083 void writeCloneArgs(raw_ostream &OS) const override {
1084 OS << "get" << getUpperName() << "()";
1085 }
1086
writeTemplateInstantiationArgs(raw_ostream & OS) const1087 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1088 OS << "A->get" << getUpperName() << "()";
1089 }
1090
writeCtorInitializers(raw_ostream & OS) const1091 void writeCtorInitializers(raw_ostream &OS) const override {
1092 OS << getLowerName() << "(" << getUpperName() << ")";
1093 }
1094
writeCtorDefaultInitializers(raw_ostream & OS) const1095 void writeCtorDefaultInitializers(raw_ostream &OS) const override {
1096 OS << getLowerName() << "()";
1097 }
1098
writeCtorParameters(raw_ostream & OS) const1099 void writeCtorParameters(raw_ostream &OS) const override {
1100 OS << "VersionTuple " << getUpperName();
1101 }
1102
writeDeclarations(raw_ostream & OS) const1103 void writeDeclarations(raw_ostream &OS) const override {
1104 OS << "VersionTuple " << getLowerName() << ";\n";
1105 }
1106
writePCHReadDecls(raw_ostream & OS) const1107 void writePCHReadDecls(raw_ostream &OS) const override {
1108 OS << " VersionTuple " << getLowerName()
1109 << "= Record.readVersionTuple();\n";
1110 }
1111
writePCHReadArgs(raw_ostream & OS) const1112 void writePCHReadArgs(raw_ostream &OS) const override {
1113 OS << getLowerName();
1114 }
1115
writePCHWrite(raw_ostream & OS) const1116 void writePCHWrite(raw_ostream &OS) const override {
1117 OS << " Record.AddVersionTuple(SA->get" << getUpperName() << "());\n";
1118 }
1119
writeValue(raw_ostream & OS) const1120 void writeValue(raw_ostream &OS) const override {
1121 OS << getLowerName() << "=\" << get" << getUpperName() << "() << \"";
1122 }
1123
writeDump(raw_ostream & OS) const1124 void writeDump(raw_ostream &OS) const override {
1125 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
1126 }
1127 };
1128
1129 class ExprArgument : public SimpleArgument {
1130 public:
ExprArgument(const Record & Arg,StringRef Attr)1131 ExprArgument(const Record &Arg, StringRef Attr)
1132 : SimpleArgument(Arg, Attr, "Expr *")
1133 {}
1134
writeASTVisitorTraversal(raw_ostream & OS) const1135 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1136 OS << " if (!"
1137 << "getDerived().TraverseStmt(A->get" << getUpperName() << "()))\n";
1138 OS << " return false;\n";
1139 }
1140
writeTemplateInstantiationArgs(raw_ostream & OS) const1141 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1142 OS << "tempInst" << getUpperName();
1143 }
1144
writeTemplateInstantiation(raw_ostream & OS) const1145 void writeTemplateInstantiation(raw_ostream &OS) const override {
1146 OS << " " << getType() << " tempInst" << getUpperName() << ";\n";
1147 OS << " {\n";
1148 OS << " EnterExpressionEvaluationContext "
1149 << "Unevaluated(S, Sema::ExpressionEvaluationContext::Unevaluated);\n";
1150 OS << " ExprResult " << "Result = S.SubstExpr("
1151 << "A->get" << getUpperName() << "(), TemplateArgs);\n";
1152 OS << " tempInst" << getUpperName() << " = "
1153 << "Result.getAs<Expr>();\n";
1154 OS << " }\n";
1155 }
1156
writeDump(raw_ostream & OS) const1157 void writeDump(raw_ostream &OS) const override {}
1158
writeDumpChildren(raw_ostream & OS) const1159 void writeDumpChildren(raw_ostream &OS) const override {
1160 OS << " Visit(SA->get" << getUpperName() << "());\n";
1161 }
1162
writeHasChildren(raw_ostream & OS) const1163 void writeHasChildren(raw_ostream &OS) const override { OS << "true"; }
1164 };
1165
1166 class VariadicExprArgument : public VariadicArgument {
1167 public:
VariadicExprArgument(const Record & Arg,StringRef Attr)1168 VariadicExprArgument(const Record &Arg, StringRef Attr)
1169 : VariadicArgument(Arg, Attr, "Expr *")
1170 {}
1171
writeASTVisitorTraversal(raw_ostream & OS) const1172 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1173 OS << " {\n";
1174 OS << " " << getType() << " *I = A->" << getLowerName()
1175 << "_begin();\n";
1176 OS << " " << getType() << " *E = A->" << getLowerName()
1177 << "_end();\n";
1178 OS << " for (; I != E; ++I) {\n";
1179 OS << " if (!getDerived().TraverseStmt(*I))\n";
1180 OS << " return false;\n";
1181 OS << " }\n";
1182 OS << " }\n";
1183 }
1184
writeTemplateInstantiationArgs(raw_ostream & OS) const1185 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1186 OS << "tempInst" << getUpperName() << ", "
1187 << "A->" << getLowerName() << "_size()";
1188 }
1189
writeTemplateInstantiation(raw_ostream & OS) const1190 void writeTemplateInstantiation(raw_ostream &OS) const override {
1191 OS << " auto *tempInst" << getUpperName()
1192 << " = new (C, 16) " << getType()
1193 << "[A->" << getLowerName() << "_size()];\n";
1194 OS << " {\n";
1195 OS << " EnterExpressionEvaluationContext "
1196 << "Unevaluated(S, Sema::ExpressionEvaluationContext::Unevaluated);\n";
1197 OS << " " << getType() << " *TI = tempInst" << getUpperName()
1198 << ";\n";
1199 OS << " " << getType() << " *I = A->" << getLowerName()
1200 << "_begin();\n";
1201 OS << " " << getType() << " *E = A->" << getLowerName()
1202 << "_end();\n";
1203 OS << " for (; I != E; ++I, ++TI) {\n";
1204 OS << " ExprResult Result = S.SubstExpr(*I, TemplateArgs);\n";
1205 OS << " *TI = Result.getAs<Expr>();\n";
1206 OS << " }\n";
1207 OS << " }\n";
1208 }
1209
writeDump(raw_ostream & OS) const1210 void writeDump(raw_ostream &OS) const override {}
1211
writeDumpChildren(raw_ostream & OS) const1212 void writeDumpChildren(raw_ostream &OS) const override {
1213 OS << " for (" << getAttrName() << "Attr::" << getLowerName()
1214 << "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->"
1215 << getLowerName() << "_end(); I != E; ++I)\n";
1216 OS << " Visit(*I);\n";
1217 }
1218
writeHasChildren(raw_ostream & OS) const1219 void writeHasChildren(raw_ostream &OS) const override {
1220 OS << "SA->" << getLowerName() << "_begin() != "
1221 << "SA->" << getLowerName() << "_end()";
1222 }
1223 };
1224
1225 class VariadicIdentifierArgument : public VariadicArgument {
1226 public:
VariadicIdentifierArgument(const Record & Arg,StringRef Attr)1227 VariadicIdentifierArgument(const Record &Arg, StringRef Attr)
1228 : VariadicArgument(Arg, Attr, "IdentifierInfo *")
1229 {}
1230 };
1231
1232 class VariadicStringArgument : public VariadicArgument {
1233 public:
VariadicStringArgument(const Record & Arg,StringRef Attr)1234 VariadicStringArgument(const Record &Arg, StringRef Attr)
1235 : VariadicArgument(Arg, Attr, "StringRef")
1236 {}
1237
writeCtorBody(raw_ostream & OS) const1238 void writeCtorBody(raw_ostream &OS) const override {
1239 OS << " for (size_t I = 0, E = " << getArgSizeName() << "; I != E;\n"
1240 " ++I) {\n"
1241 " StringRef Ref = " << getUpperName() << "[I];\n"
1242 " if (!Ref.empty()) {\n"
1243 " char *Mem = new (Ctx, 1) char[Ref.size()];\n"
1244 " std::memcpy(Mem, Ref.data(), Ref.size());\n"
1245 " " << getArgName() << "[I] = StringRef(Mem, Ref.size());\n"
1246 " }\n"
1247 " }\n";
1248 }
1249
writeValueImpl(raw_ostream & OS) const1250 void writeValueImpl(raw_ostream &OS) const override {
1251 OS << " OS << \"\\\"\" << Val << \"\\\"\";\n";
1252 }
1253 };
1254
1255 class TypeArgument : public SimpleArgument {
1256 public:
TypeArgument(const Record & Arg,StringRef Attr)1257 TypeArgument(const Record &Arg, StringRef Attr)
1258 : SimpleArgument(Arg, Attr, "TypeSourceInfo *")
1259 {}
1260
writeAccessors(raw_ostream & OS) const1261 void writeAccessors(raw_ostream &OS) const override {
1262 OS << " QualType get" << getUpperName() << "() const {\n";
1263 OS << " return " << getLowerName() << "->getType();\n";
1264 OS << " }";
1265 OS << " " << getType() << " get" << getUpperName() << "Loc() const {\n";
1266 OS << " return " << getLowerName() << ";\n";
1267 OS << " }";
1268 }
1269
writeASTVisitorTraversal(raw_ostream & OS) const1270 void writeASTVisitorTraversal(raw_ostream &OS) const override {
1271 OS << " if (auto *TSI = A->get" << getUpperName() << "Loc())\n";
1272 OS << " if (!getDerived().TraverseTypeLoc(TSI->getTypeLoc()))\n";
1273 OS << " return false;\n";
1274 }
1275
writeTemplateInstantiationArgs(raw_ostream & OS) const1276 void writeTemplateInstantiationArgs(raw_ostream &OS) const override {
1277 OS << "A->get" << getUpperName() << "Loc()";
1278 }
1279
writePCHWrite(raw_ostream & OS) const1280 void writePCHWrite(raw_ostream &OS) const override {
1281 OS << " "
1282 << WritePCHRecord(getType(),
1283 "SA->get" + std::string(getUpperName()) + "Loc()");
1284 }
1285 };
1286
1287 } // end anonymous namespace
1288
1289 static std::unique_ptr<Argument>
createArgument(const Record & Arg,StringRef Attr,const Record * Search=nullptr)1290 createArgument(const Record &Arg, StringRef Attr,
1291 const Record *Search = nullptr) {
1292 if (!Search)
1293 Search = &Arg;
1294
1295 std::unique_ptr<Argument> Ptr;
1296 llvm::StringRef ArgName = Search->getName();
1297
1298 if (ArgName == "AlignedArgument")
1299 Ptr = std::make_unique<AlignedArgument>(Arg, Attr);
1300 else if (ArgName == "EnumArgument")
1301 Ptr = std::make_unique<EnumArgument>(Arg, Attr);
1302 else if (ArgName == "ExprArgument")
1303 Ptr = std::make_unique<ExprArgument>(Arg, Attr);
1304 else if (ArgName == "DeclArgument")
1305 Ptr = std::make_unique<SimpleArgument>(
1306 Arg, Attr, (Arg.getValueAsDef("Kind")->getName() + "Decl *").str());
1307 else if (ArgName == "IdentifierArgument")
1308 Ptr = std::make_unique<SimpleArgument>(Arg, Attr, "IdentifierInfo *");
1309 else if (ArgName == "DefaultBoolArgument")
1310 Ptr = std::make_unique<DefaultSimpleArgument>(
1311 Arg, Attr, "bool", Arg.getValueAsBit("Default"));
1312 else if (ArgName == "BoolArgument")
1313 Ptr = std::make_unique<SimpleArgument>(Arg, Attr, "bool");
1314 else if (ArgName == "DefaultIntArgument")
1315 Ptr = std::make_unique<DefaultSimpleArgument>(
1316 Arg, Attr, "int", Arg.getValueAsInt("Default"));
1317 else if (ArgName == "IntArgument")
1318 Ptr = std::make_unique<SimpleArgument>(Arg, Attr, "int");
1319 else if (ArgName == "StringArgument")
1320 Ptr = std::make_unique<StringArgument>(Arg, Attr);
1321 else if (ArgName == "TypeArgument")
1322 Ptr = std::make_unique<TypeArgument>(Arg, Attr);
1323 else if (ArgName == "UnsignedArgument")
1324 Ptr = std::make_unique<SimpleArgument>(Arg, Attr, "unsigned");
1325 else if (ArgName == "VariadicUnsignedArgument")
1326 Ptr = std::make_unique<VariadicArgument>(Arg, Attr, "unsigned");
1327 else if (ArgName == "VariadicStringArgument")
1328 Ptr = std::make_unique<VariadicStringArgument>(Arg, Attr);
1329 else if (ArgName == "VariadicEnumArgument")
1330 Ptr = std::make_unique<VariadicEnumArgument>(Arg, Attr);
1331 else if (ArgName == "VariadicExprArgument")
1332 Ptr = std::make_unique<VariadicExprArgument>(Arg, Attr);
1333 else if (ArgName == "VariadicParamIdxArgument")
1334 Ptr = std::make_unique<VariadicParamIdxArgument>(Arg, Attr);
1335 else if (ArgName == "VariadicParamOrParamIdxArgument")
1336 Ptr = std::make_unique<VariadicParamOrParamIdxArgument>(Arg, Attr);
1337 else if (ArgName == "ParamIdxArgument")
1338 Ptr = std::make_unique<SimpleArgument>(Arg, Attr, "ParamIdx");
1339 else if (ArgName == "VariadicIdentifierArgument")
1340 Ptr = std::make_unique<VariadicIdentifierArgument>(Arg, Attr);
1341 else if (ArgName == "VersionArgument")
1342 Ptr = std::make_unique<VersionArgument>(Arg, Attr);
1343 else if (ArgName == "OMPTraitInfoArgument")
1344 Ptr = std::make_unique<SimpleArgument>(Arg, Attr, "OMPTraitInfo *");
1345
1346 if (!Ptr) {
1347 // Search in reverse order so that the most-derived type is handled first.
1348 ArrayRef<std::pair<Record*, SMRange>> Bases = Search->getSuperClasses();
1349 for (const auto &Base : llvm::reverse(Bases)) {
1350 if ((Ptr = createArgument(Arg, Attr, Base.first)))
1351 break;
1352 }
1353 }
1354
1355 if (Ptr && Arg.getValueAsBit("Optional"))
1356 Ptr->setOptional(true);
1357
1358 if (Ptr && Arg.getValueAsBit("Fake"))
1359 Ptr->setFake(true);
1360
1361 return Ptr;
1362 }
1363
writeAvailabilityValue(raw_ostream & OS)1364 static void writeAvailabilityValue(raw_ostream &OS) {
1365 OS << "\" << getPlatform()->getName();\n"
1366 << " if (getStrict()) OS << \", strict\";\n"
1367 << " if (!getIntroduced().empty()) OS << \", introduced=\" << getIntroduced();\n"
1368 << " if (!getDeprecated().empty()) OS << \", deprecated=\" << getDeprecated();\n"
1369 << " if (!getObsoleted().empty()) OS << \", obsoleted=\" << getObsoleted();\n"
1370 << " if (getUnavailable()) OS << \", unavailable\";\n"
1371 << " OS << \"";
1372 }
1373
writeDeprecatedAttrValue(raw_ostream & OS,std::string & Variety)1374 static void writeDeprecatedAttrValue(raw_ostream &OS, std::string &Variety) {
1375 OS << "\\\"\" << getMessage() << \"\\\"\";\n";
1376 // Only GNU deprecated has an optional fixit argument at the second position.
1377 if (Variety == "GNU")
1378 OS << " if (!getReplacement().empty()) OS << \", \\\"\""
1379 " << getReplacement() << \"\\\"\";\n";
1380 OS << " OS << \"";
1381 }
1382
writeGetSpellingFunction(const Record & R,raw_ostream & OS)1383 static void writeGetSpellingFunction(const Record &R, raw_ostream &OS) {
1384 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
1385
1386 OS << "const char *" << R.getName() << "Attr::getSpelling() const {\n";
1387 if (Spellings.empty()) {
1388 OS << " return \"(No spelling)\";\n}\n\n";
1389 return;
1390 }
1391
1392 OS << " switch (getAttributeSpellingListIndex()) {\n"
1393 " default:\n"
1394 " llvm_unreachable(\"Unknown attribute spelling!\");\n"
1395 " return \"(No spelling)\";\n";
1396
1397 for (unsigned I = 0; I < Spellings.size(); ++I)
1398 OS << " case " << I << ":\n"
1399 " return \"" << Spellings[I].name() << "\";\n";
1400 // End of the switch statement.
1401 OS << " }\n";
1402 // End of the getSpelling function.
1403 OS << "}\n\n";
1404 }
1405
1406 static void
writePrettyPrintFunction(const Record & R,const std::vector<std::unique_ptr<Argument>> & Args,raw_ostream & OS)1407 writePrettyPrintFunction(const Record &R,
1408 const std::vector<std::unique_ptr<Argument>> &Args,
1409 raw_ostream &OS) {
1410 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
1411
1412 OS << "void " << R.getName() << "Attr::printPretty("
1413 << "raw_ostream &OS, const PrintingPolicy &Policy) const {\n";
1414
1415 if (Spellings.empty()) {
1416 OS << "}\n\n";
1417 return;
1418 }
1419
1420 OS << " switch (getAttributeSpellingListIndex()) {\n"
1421 " default:\n"
1422 " llvm_unreachable(\"Unknown attribute spelling!\");\n"
1423 " break;\n";
1424
1425 for (unsigned I = 0; I < Spellings.size(); ++ I) {
1426 llvm::SmallString<16> Prefix;
1427 llvm::SmallString<8> Suffix;
1428 // The actual spelling of the name and namespace (if applicable)
1429 // of an attribute without considering prefix and suffix.
1430 llvm::SmallString<64> Spelling;
1431 std::string Name = Spellings[I].name();
1432 std::string Variety = Spellings[I].variety();
1433
1434 if (Variety == "GNU") {
1435 Prefix = " __attribute__((";
1436 Suffix = "))";
1437 } else if (Variety == "CXX11" || Variety == "C2x") {
1438 Prefix = " [[";
1439 Suffix = "]]";
1440 std::string Namespace = Spellings[I].nameSpace();
1441 if (!Namespace.empty()) {
1442 Spelling += Namespace;
1443 Spelling += "::";
1444 }
1445 } else if (Variety == "Declspec") {
1446 Prefix = " __declspec(";
1447 Suffix = ")";
1448 } else if (Variety == "Microsoft") {
1449 Prefix = "[";
1450 Suffix = "]";
1451 } else if (Variety == "Keyword") {
1452 Prefix = " ";
1453 Suffix = "";
1454 } else if (Variety == "Pragma") {
1455 Prefix = "#pragma ";
1456 Suffix = "\n";
1457 std::string Namespace = Spellings[I].nameSpace();
1458 if (!Namespace.empty()) {
1459 Spelling += Namespace;
1460 Spelling += " ";
1461 }
1462 } else {
1463 llvm_unreachable("Unknown attribute syntax variety!");
1464 }
1465
1466 Spelling += Name;
1467
1468 OS <<
1469 " case " << I << " : {\n"
1470 " OS << \"" << Prefix << Spelling;
1471
1472 if (Variety == "Pragma") {
1473 OS << "\";\n";
1474 OS << " printPrettyPragma(OS, Policy);\n";
1475 OS << " OS << \"\\n\";";
1476 OS << " break;\n";
1477 OS << " }\n";
1478 continue;
1479 }
1480
1481 if (Spelling == "availability") {
1482 OS << "(";
1483 writeAvailabilityValue(OS);
1484 OS << ")";
1485 } else if (Spelling == "deprecated" || Spelling == "gnu::deprecated") {
1486 OS << "(";
1487 writeDeprecatedAttrValue(OS, Variety);
1488 OS << ")";
1489 } else {
1490 // To avoid printing parentheses around an empty argument list or
1491 // printing spurious commas at the end of an argument list, we need to
1492 // determine where the last provided non-fake argument is.
1493 unsigned NonFakeArgs = 0;
1494 unsigned TrailingOptArgs = 0;
1495 bool FoundNonOptArg = false;
1496 for (const auto &arg : llvm::reverse(Args)) {
1497 if (arg->isFake())
1498 continue;
1499 ++NonFakeArgs;
1500 if (FoundNonOptArg)
1501 continue;
1502 // FIXME: arg->getIsOmitted() == "false" means we haven't implemented
1503 // any way to detect whether the argument was omitted.
1504 if (!arg->isOptional() || arg->getIsOmitted() == "false") {
1505 FoundNonOptArg = true;
1506 continue;
1507 }
1508 if (!TrailingOptArgs++)
1509 OS << "\";\n"
1510 << " unsigned TrailingOmittedArgs = 0;\n";
1511 OS << " if (" << arg->getIsOmitted() << ")\n"
1512 << " ++TrailingOmittedArgs;\n";
1513 }
1514 if (TrailingOptArgs)
1515 OS << " OS << \"";
1516 if (TrailingOptArgs < NonFakeArgs)
1517 OS << "(";
1518 else if (TrailingOptArgs)
1519 OS << "\";\n"
1520 << " if (TrailingOmittedArgs < " << NonFakeArgs << ")\n"
1521 << " OS << \"(\";\n"
1522 << " OS << \"";
1523 unsigned ArgIndex = 0;
1524 for (const auto &arg : Args) {
1525 if (arg->isFake())
1526 continue;
1527 if (ArgIndex) {
1528 if (ArgIndex >= NonFakeArgs - TrailingOptArgs)
1529 OS << "\";\n"
1530 << " if (" << ArgIndex << " < " << NonFakeArgs
1531 << " - TrailingOmittedArgs)\n"
1532 << " OS << \", \";\n"
1533 << " OS << \"";
1534 else
1535 OS << ", ";
1536 }
1537 std::string IsOmitted = arg->getIsOmitted();
1538 if (arg->isOptional() && IsOmitted != "false")
1539 OS << "\";\n"
1540 << " if (!(" << IsOmitted << ")) {\n"
1541 << " OS << \"";
1542 arg->writeValue(OS);
1543 if (arg->isOptional() && IsOmitted != "false")
1544 OS << "\";\n"
1545 << " }\n"
1546 << " OS << \"";
1547 ++ArgIndex;
1548 }
1549 if (TrailingOptArgs < NonFakeArgs)
1550 OS << ")";
1551 else if (TrailingOptArgs)
1552 OS << "\";\n"
1553 << " if (TrailingOmittedArgs < " << NonFakeArgs << ")\n"
1554 << " OS << \")\";\n"
1555 << " OS << \"";
1556 }
1557
1558 OS << Suffix + "\";\n";
1559
1560 OS <<
1561 " break;\n"
1562 " }\n";
1563 }
1564
1565 // End of the switch statement.
1566 OS << "}\n";
1567 // End of the print function.
1568 OS << "}\n\n";
1569 }
1570
1571 /// Return the index of a spelling in a spelling list.
1572 static unsigned
getSpellingListIndex(const std::vector<FlattenedSpelling> & SpellingList,const FlattenedSpelling & Spelling)1573 getSpellingListIndex(const std::vector<FlattenedSpelling> &SpellingList,
1574 const FlattenedSpelling &Spelling) {
1575 assert(!SpellingList.empty() && "Spelling list is empty!");
1576
1577 for (unsigned Index = 0; Index < SpellingList.size(); ++Index) {
1578 const FlattenedSpelling &S = SpellingList[Index];
1579 if (S.variety() != Spelling.variety())
1580 continue;
1581 if (S.nameSpace() != Spelling.nameSpace())
1582 continue;
1583 if (S.name() != Spelling.name())
1584 continue;
1585
1586 return Index;
1587 }
1588
1589 llvm_unreachable("Unknown spelling!");
1590 }
1591
writeAttrAccessorDefinition(const Record & R,raw_ostream & OS)1592 static void writeAttrAccessorDefinition(const Record &R, raw_ostream &OS) {
1593 std::vector<Record*> Accessors = R.getValueAsListOfDefs("Accessors");
1594 if (Accessors.empty())
1595 return;
1596
1597 const std::vector<FlattenedSpelling> SpellingList = GetFlattenedSpellings(R);
1598 assert(!SpellingList.empty() &&
1599 "Attribute with empty spelling list can't have accessors!");
1600 for (const auto *Accessor : Accessors) {
1601 const StringRef Name = Accessor->getValueAsString("Name");
1602 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Accessor);
1603
1604 OS << " bool " << Name
1605 << "() const { return getAttributeSpellingListIndex() == ";
1606 for (unsigned Index = 0; Index < Spellings.size(); ++Index) {
1607 OS << getSpellingListIndex(SpellingList, Spellings[Index]);
1608 if (Index != Spellings.size() - 1)
1609 OS << " ||\n getAttributeSpellingListIndex() == ";
1610 else
1611 OS << "; }\n";
1612 }
1613 }
1614 }
1615
1616 static bool
SpellingNamesAreCommon(const std::vector<FlattenedSpelling> & Spellings)1617 SpellingNamesAreCommon(const std::vector<FlattenedSpelling>& Spellings) {
1618 assert(!Spellings.empty() && "An empty list of spellings was provided");
1619 std::string FirstName =
1620 std::string(NormalizeNameForSpellingComparison(Spellings.front().name()));
1621 for (const auto &Spelling :
1622 llvm::make_range(std::next(Spellings.begin()), Spellings.end())) {
1623 std::string Name =
1624 std::string(NormalizeNameForSpellingComparison(Spelling.name()));
1625 if (Name != FirstName)
1626 return false;
1627 }
1628 return true;
1629 }
1630
1631 typedef std::map<unsigned, std::string> SemanticSpellingMap;
1632 static std::string
CreateSemanticSpellings(const std::vector<FlattenedSpelling> & Spellings,SemanticSpellingMap & Map)1633 CreateSemanticSpellings(const std::vector<FlattenedSpelling> &Spellings,
1634 SemanticSpellingMap &Map) {
1635 // The enumerants are automatically generated based on the variety,
1636 // namespace (if present) and name for each attribute spelling. However,
1637 // care is taken to avoid trampling on the reserved namespace due to
1638 // underscores.
1639 std::string Ret(" enum Spelling {\n");
1640 std::set<std::string> Uniques;
1641 unsigned Idx = 0;
1642
1643 // If we have a need to have this many spellings we likely need to add an
1644 // extra bit to the SpellingIndex in AttributeCommonInfo, then increase the
1645 // value of SpellingNotCalculated there and here.
1646 assert(Spellings.size() < 15 &&
1647 "Too many spellings, would step on SpellingNotCalculated in "
1648 "AttributeCommonInfo");
1649 for (auto I = Spellings.begin(), E = Spellings.end(); I != E; ++I, ++Idx) {
1650 const FlattenedSpelling &S = *I;
1651 const std::string &Variety = S.variety();
1652 const std::string &Spelling = S.name();
1653 const std::string &Namespace = S.nameSpace();
1654 std::string EnumName;
1655
1656 EnumName += (Variety + "_");
1657 if (!Namespace.empty())
1658 EnumName += (NormalizeNameForSpellingComparison(Namespace).str() +
1659 "_");
1660 EnumName += NormalizeNameForSpellingComparison(Spelling);
1661
1662 // Even if the name is not unique, this spelling index corresponds to a
1663 // particular enumerant name that we've calculated.
1664 Map[Idx] = EnumName;
1665
1666 // Since we have been stripping underscores to avoid trampling on the
1667 // reserved namespace, we may have inadvertently created duplicate
1668 // enumerant names. These duplicates are not considered part of the
1669 // semantic spelling, and can be elided.
1670 if (Uniques.find(EnumName) != Uniques.end())
1671 continue;
1672
1673 Uniques.insert(EnumName);
1674 if (I != Spellings.begin())
1675 Ret += ",\n";
1676 // Duplicate spellings are not considered part of the semantic spelling
1677 // enumeration, but the spelling index and semantic spelling values are
1678 // meant to be equivalent, so we must specify a concrete value for each
1679 // enumerator.
1680 Ret += " " + EnumName + " = " + llvm::utostr(Idx);
1681 }
1682 Ret += ",\n SpellingNotCalculated = 15\n";
1683 Ret += "\n };\n\n";
1684 return Ret;
1685 }
1686
WriteSemanticSpellingSwitch(const std::string & VarName,const SemanticSpellingMap & Map,raw_ostream & OS)1687 void WriteSemanticSpellingSwitch(const std::string &VarName,
1688 const SemanticSpellingMap &Map,
1689 raw_ostream &OS) {
1690 OS << " switch (" << VarName << ") {\n default: "
1691 << "llvm_unreachable(\"Unknown spelling list index\");\n";
1692 for (const auto &I : Map)
1693 OS << " case " << I.first << ": return " << I.second << ";\n";
1694 OS << " }\n";
1695 }
1696
1697 // Emits the LateParsed property for attributes.
emitClangAttrLateParsedList(RecordKeeper & Records,raw_ostream & OS)1698 static void emitClangAttrLateParsedList(RecordKeeper &Records, raw_ostream &OS) {
1699 OS << "#if defined(CLANG_ATTR_LATE_PARSED_LIST)\n";
1700 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
1701
1702 for (const auto *Attr : Attrs) {
1703 bool LateParsed = Attr->getValueAsBit("LateParsed");
1704
1705 if (LateParsed) {
1706 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr);
1707
1708 // FIXME: Handle non-GNU attributes
1709 for (const auto &I : Spellings) {
1710 if (I.variety() != "GNU")
1711 continue;
1712 OS << ".Case(\"" << I.name() << "\", " << LateParsed << ")\n";
1713 }
1714 }
1715 }
1716 OS << "#endif // CLANG_ATTR_LATE_PARSED_LIST\n\n";
1717 }
1718
hasGNUorCXX11Spelling(const Record & Attribute)1719 static bool hasGNUorCXX11Spelling(const Record &Attribute) {
1720 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attribute);
1721 for (const auto &I : Spellings) {
1722 if (I.variety() == "GNU" || I.variety() == "CXX11")
1723 return true;
1724 }
1725 return false;
1726 }
1727
1728 namespace {
1729
1730 struct AttributeSubjectMatchRule {
1731 const Record *MetaSubject;
1732 const Record *Constraint;
1733
AttributeSubjectMatchRule__anona61259f60311::AttributeSubjectMatchRule1734 AttributeSubjectMatchRule(const Record *MetaSubject, const Record *Constraint)
1735 : MetaSubject(MetaSubject), Constraint(Constraint) {
1736 assert(MetaSubject && "Missing subject");
1737 }
1738
isSubRule__anona61259f60311::AttributeSubjectMatchRule1739 bool isSubRule() const { return Constraint != nullptr; }
1740
getSubjects__anona61259f60311::AttributeSubjectMatchRule1741 std::vector<Record *> getSubjects() const {
1742 return (Constraint ? Constraint : MetaSubject)
1743 ->getValueAsListOfDefs("Subjects");
1744 }
1745
getLangOpts__anona61259f60311::AttributeSubjectMatchRule1746 std::vector<Record *> getLangOpts() const {
1747 if (Constraint) {
1748 // Lookup the options in the sub-rule first, in case the sub-rule
1749 // overrides the rules options.
1750 std::vector<Record *> Opts = Constraint->getValueAsListOfDefs("LangOpts");
1751 if (!Opts.empty())
1752 return Opts;
1753 }
1754 return MetaSubject->getValueAsListOfDefs("LangOpts");
1755 }
1756
1757 // Abstract rules are used only for sub-rules
isAbstractRule__anona61259f60311::AttributeSubjectMatchRule1758 bool isAbstractRule() const { return getSubjects().empty(); }
1759
getName__anona61259f60311::AttributeSubjectMatchRule1760 StringRef getName() const {
1761 return (Constraint ? Constraint : MetaSubject)->getValueAsString("Name");
1762 }
1763
isNegatedSubRule__anona61259f60311::AttributeSubjectMatchRule1764 bool isNegatedSubRule() const {
1765 assert(isSubRule() && "Not a sub-rule");
1766 return Constraint->getValueAsBit("Negated");
1767 }
1768
getSpelling__anona61259f60311::AttributeSubjectMatchRule1769 std::string getSpelling() const {
1770 std::string Result = std::string(MetaSubject->getValueAsString("Name"));
1771 if (isSubRule()) {
1772 Result += '(';
1773 if (isNegatedSubRule())
1774 Result += "unless(";
1775 Result += getName();
1776 if (isNegatedSubRule())
1777 Result += ')';
1778 Result += ')';
1779 }
1780 return Result;
1781 }
1782
getEnumValueName__anona61259f60311::AttributeSubjectMatchRule1783 std::string getEnumValueName() const {
1784 SmallString<128> Result;
1785 Result += "SubjectMatchRule_";
1786 Result += MetaSubject->getValueAsString("Name");
1787 if (isSubRule()) {
1788 Result += "_";
1789 if (isNegatedSubRule())
1790 Result += "not_";
1791 Result += Constraint->getValueAsString("Name");
1792 }
1793 if (isAbstractRule())
1794 Result += "_abstract";
1795 return std::string(Result.str());
1796 }
1797
getEnumValue__anona61259f60311::AttributeSubjectMatchRule1798 std::string getEnumValue() const { return "attr::" + getEnumValueName(); }
1799
1800 static const char *EnumName;
1801 };
1802
1803 const char *AttributeSubjectMatchRule::EnumName = "attr::SubjectMatchRule";
1804
1805 struct PragmaClangAttributeSupport {
1806 std::vector<AttributeSubjectMatchRule> Rules;
1807
1808 class RuleOrAggregateRuleSet {
1809 std::vector<AttributeSubjectMatchRule> Rules;
1810 bool IsRule;
RuleOrAggregateRuleSet(ArrayRef<AttributeSubjectMatchRule> Rules,bool IsRule)1811 RuleOrAggregateRuleSet(ArrayRef<AttributeSubjectMatchRule> Rules,
1812 bool IsRule)
1813 : Rules(Rules), IsRule(IsRule) {}
1814
1815 public:
isRule() const1816 bool isRule() const { return IsRule; }
1817
getRule() const1818 const AttributeSubjectMatchRule &getRule() const {
1819 assert(IsRule && "not a rule!");
1820 return Rules[0];
1821 }
1822
getAggregateRuleSet() const1823 ArrayRef<AttributeSubjectMatchRule> getAggregateRuleSet() const {
1824 return Rules;
1825 }
1826
1827 static RuleOrAggregateRuleSet
getRule(const AttributeSubjectMatchRule & Rule)1828 getRule(const AttributeSubjectMatchRule &Rule) {
1829 return RuleOrAggregateRuleSet(Rule, /*IsRule=*/true);
1830 }
1831 static RuleOrAggregateRuleSet
getAggregateRuleSet(ArrayRef<AttributeSubjectMatchRule> Rules)1832 getAggregateRuleSet(ArrayRef<AttributeSubjectMatchRule> Rules) {
1833 return RuleOrAggregateRuleSet(Rules, /*IsRule=*/false);
1834 }
1835 };
1836 llvm::DenseMap<const Record *, RuleOrAggregateRuleSet> SubjectsToRules;
1837
1838 PragmaClangAttributeSupport(RecordKeeper &Records);
1839
1840 bool isAttributedSupported(const Record &Attribute);
1841
1842 void emitMatchRuleList(raw_ostream &OS);
1843
1844 void generateStrictConformsTo(const Record &Attr, raw_ostream &OS);
1845
1846 void generateParsingHelpers(raw_ostream &OS);
1847 };
1848
1849 } // end anonymous namespace
1850
doesDeclDeriveFrom(const Record * D,const Record * Base)1851 static bool doesDeclDeriveFrom(const Record *D, const Record *Base) {
1852 const Record *CurrentBase = D->getValueAsOptionalDef(BaseFieldName);
1853 if (!CurrentBase)
1854 return false;
1855 if (CurrentBase == Base)
1856 return true;
1857 return doesDeclDeriveFrom(CurrentBase, Base);
1858 }
1859
PragmaClangAttributeSupport(RecordKeeper & Records)1860 PragmaClangAttributeSupport::PragmaClangAttributeSupport(
1861 RecordKeeper &Records) {
1862 std::vector<Record *> MetaSubjects =
1863 Records.getAllDerivedDefinitions("AttrSubjectMatcherRule");
1864 auto MapFromSubjectsToRules = [this](const Record *SubjectContainer,
1865 const Record *MetaSubject,
1866 const Record *Constraint) {
1867 Rules.emplace_back(MetaSubject, Constraint);
1868 std::vector<Record *> ApplicableSubjects =
1869 SubjectContainer->getValueAsListOfDefs("Subjects");
1870 for (const auto *Subject : ApplicableSubjects) {
1871 bool Inserted =
1872 SubjectsToRules
1873 .try_emplace(Subject, RuleOrAggregateRuleSet::getRule(
1874 AttributeSubjectMatchRule(MetaSubject,
1875 Constraint)))
1876 .second;
1877 if (!Inserted) {
1878 PrintFatalError("Attribute subject match rules should not represent"
1879 "same attribute subjects.");
1880 }
1881 }
1882 };
1883 for (const auto *MetaSubject : MetaSubjects) {
1884 MapFromSubjectsToRules(MetaSubject, MetaSubject, /*Constraints=*/nullptr);
1885 std::vector<Record *> Constraints =
1886 MetaSubject->getValueAsListOfDefs("Constraints");
1887 for (const auto *Constraint : Constraints)
1888 MapFromSubjectsToRules(Constraint, MetaSubject, Constraint);
1889 }
1890
1891 std::vector<Record *> Aggregates =
1892 Records.getAllDerivedDefinitions("AttrSubjectMatcherAggregateRule");
1893 std::vector<Record *> DeclNodes =
1894 Records.getAllDerivedDefinitions(DeclNodeClassName);
1895 for (const auto *Aggregate : Aggregates) {
1896 Record *SubjectDecl = Aggregate->getValueAsDef("Subject");
1897
1898 // Gather sub-classes of the aggregate subject that act as attribute
1899 // subject rules.
1900 std::vector<AttributeSubjectMatchRule> Rules;
1901 for (const auto *D : DeclNodes) {
1902 if (doesDeclDeriveFrom(D, SubjectDecl)) {
1903 auto It = SubjectsToRules.find(D);
1904 if (It == SubjectsToRules.end())
1905 continue;
1906 if (!It->second.isRule() || It->second.getRule().isSubRule())
1907 continue; // Assume that the rule will be included as well.
1908 Rules.push_back(It->second.getRule());
1909 }
1910 }
1911
1912 bool Inserted =
1913 SubjectsToRules
1914 .try_emplace(SubjectDecl,
1915 RuleOrAggregateRuleSet::getAggregateRuleSet(Rules))
1916 .second;
1917 if (!Inserted) {
1918 PrintFatalError("Attribute subject match rules should not represent"
1919 "same attribute subjects.");
1920 }
1921 }
1922 }
1923
1924 static PragmaClangAttributeSupport &
getPragmaAttributeSupport(RecordKeeper & Records)1925 getPragmaAttributeSupport(RecordKeeper &Records) {
1926 static PragmaClangAttributeSupport Instance(Records);
1927 return Instance;
1928 }
1929
emitMatchRuleList(raw_ostream & OS)1930 void PragmaClangAttributeSupport::emitMatchRuleList(raw_ostream &OS) {
1931 OS << "#ifndef ATTR_MATCH_SUB_RULE\n";
1932 OS << "#define ATTR_MATCH_SUB_RULE(Value, Spelling, IsAbstract, Parent, "
1933 "IsNegated) "
1934 << "ATTR_MATCH_RULE(Value, Spelling, IsAbstract)\n";
1935 OS << "#endif\n";
1936 for (const auto &Rule : Rules) {
1937 OS << (Rule.isSubRule() ? "ATTR_MATCH_SUB_RULE" : "ATTR_MATCH_RULE") << '(';
1938 OS << Rule.getEnumValueName() << ", \"" << Rule.getSpelling() << "\", "
1939 << Rule.isAbstractRule();
1940 if (Rule.isSubRule())
1941 OS << ", "
1942 << AttributeSubjectMatchRule(Rule.MetaSubject, nullptr).getEnumValue()
1943 << ", " << Rule.isNegatedSubRule();
1944 OS << ")\n";
1945 }
1946 OS << "#undef ATTR_MATCH_SUB_RULE\n";
1947 }
1948
isAttributedSupported(const Record & Attribute)1949 bool PragmaClangAttributeSupport::isAttributedSupported(
1950 const Record &Attribute) {
1951 // If the attribute explicitly specified whether to support #pragma clang
1952 // attribute, use that setting.
1953 bool Unset;
1954 bool SpecifiedResult =
1955 Attribute.getValueAsBitOrUnset("PragmaAttributeSupport", Unset);
1956 if (!Unset)
1957 return SpecifiedResult;
1958
1959 // Opt-out rules:
1960 // An attribute requires delayed parsing (LateParsed is on)
1961 if (Attribute.getValueAsBit("LateParsed"))
1962 return false;
1963 // An attribute has no GNU/CXX11 spelling
1964 if (!hasGNUorCXX11Spelling(Attribute))
1965 return false;
1966 // An attribute subject list has a subject that isn't covered by one of the
1967 // subject match rules or has no subjects at all.
1968 if (Attribute.isValueUnset("Subjects"))
1969 return false;
1970 const Record *SubjectObj = Attribute.getValueAsDef("Subjects");
1971 std::vector<Record *> Subjects = SubjectObj->getValueAsListOfDefs("Subjects");
1972 if (Subjects.empty())
1973 return false;
1974 for (const auto *Subject : Subjects) {
1975 if (SubjectsToRules.find(Subject) == SubjectsToRules.end())
1976 return false;
1977 }
1978 return true;
1979 }
1980
GenerateTestExpression(ArrayRef<Record * > LangOpts)1981 static std::string GenerateTestExpression(ArrayRef<Record *> LangOpts) {
1982 std::string Test;
1983
1984 for (auto *E : LangOpts) {
1985 if (!Test.empty())
1986 Test += " || ";
1987
1988 const StringRef Code = E->getValueAsString("CustomCode");
1989 if (!Code.empty()) {
1990 Test += "(";
1991 Test += Code;
1992 Test += ")";
1993 if (!E->getValueAsString("Name").empty()) {
1994 PrintWarning(
1995 E->getLoc(),
1996 "non-empty 'Name' field ignored because 'CustomCode' was supplied");
1997 }
1998 } else {
1999 Test += "LangOpts.";
2000 Test += E->getValueAsString("Name");
2001 }
2002 }
2003
2004 if (Test.empty())
2005 return "true";
2006
2007 return Test;
2008 }
2009
2010 void
generateStrictConformsTo(const Record & Attr,raw_ostream & OS)2011 PragmaClangAttributeSupport::generateStrictConformsTo(const Record &Attr,
2012 raw_ostream &OS) {
2013 if (!isAttributedSupported(Attr) || Attr.isValueUnset("Subjects"))
2014 return;
2015 // Generate a function that constructs a set of matching rules that describe
2016 // to which declarations the attribute should apply to.
2017 OS << "void getPragmaAttributeMatchRules("
2018 << "llvm::SmallVectorImpl<std::pair<"
2019 << AttributeSubjectMatchRule::EnumName
2020 << ", bool>> &MatchRules, const LangOptions &LangOpts) const override {\n";
2021 const Record *SubjectObj = Attr.getValueAsDef("Subjects");
2022 std::vector<Record *> Subjects = SubjectObj->getValueAsListOfDefs("Subjects");
2023 for (const auto *Subject : Subjects) {
2024 auto It = SubjectsToRules.find(Subject);
2025 assert(It != SubjectsToRules.end() &&
2026 "This attribute is unsupported by #pragma clang attribute");
2027 for (const auto &Rule : It->getSecond().getAggregateRuleSet()) {
2028 // The rule might be language specific, so only subtract it from the given
2029 // rules if the specific language options are specified.
2030 std::vector<Record *> LangOpts = Rule.getLangOpts();
2031 OS << " MatchRules.push_back(std::make_pair(" << Rule.getEnumValue()
2032 << ", /*IsSupported=*/" << GenerateTestExpression(LangOpts)
2033 << "));\n";
2034 }
2035 }
2036 OS << "}\n\n";
2037 }
2038
generateParsingHelpers(raw_ostream & OS)2039 void PragmaClangAttributeSupport::generateParsingHelpers(raw_ostream &OS) {
2040 // Generate routines that check the names of sub-rules.
2041 OS << "Optional<attr::SubjectMatchRule> "
2042 "defaultIsAttributeSubjectMatchSubRuleFor(StringRef, bool) {\n";
2043 OS << " return None;\n";
2044 OS << "}\n\n";
2045
2046 std::map<const Record *, std::vector<AttributeSubjectMatchRule>>
2047 SubMatchRules;
2048 for (const auto &Rule : Rules) {
2049 if (!Rule.isSubRule())
2050 continue;
2051 SubMatchRules[Rule.MetaSubject].push_back(Rule);
2052 }
2053
2054 for (const auto &SubMatchRule : SubMatchRules) {
2055 OS << "Optional<attr::SubjectMatchRule> isAttributeSubjectMatchSubRuleFor_"
2056 << SubMatchRule.first->getValueAsString("Name")
2057 << "(StringRef Name, bool IsUnless) {\n";
2058 OS << " if (IsUnless)\n";
2059 OS << " return "
2060 "llvm::StringSwitch<Optional<attr::SubjectMatchRule>>(Name).\n";
2061 for (const auto &Rule : SubMatchRule.second) {
2062 if (Rule.isNegatedSubRule())
2063 OS << " Case(\"" << Rule.getName() << "\", " << Rule.getEnumValue()
2064 << ").\n";
2065 }
2066 OS << " Default(None);\n";
2067 OS << " return "
2068 "llvm::StringSwitch<Optional<attr::SubjectMatchRule>>(Name).\n";
2069 for (const auto &Rule : SubMatchRule.second) {
2070 if (!Rule.isNegatedSubRule())
2071 OS << " Case(\"" << Rule.getName() << "\", " << Rule.getEnumValue()
2072 << ").\n";
2073 }
2074 OS << " Default(None);\n";
2075 OS << "}\n\n";
2076 }
2077
2078 // Generate the function that checks for the top-level rules.
2079 OS << "std::pair<Optional<attr::SubjectMatchRule>, "
2080 "Optional<attr::SubjectMatchRule> (*)(StringRef, "
2081 "bool)> isAttributeSubjectMatchRule(StringRef Name) {\n";
2082 OS << " return "
2083 "llvm::StringSwitch<std::pair<Optional<attr::SubjectMatchRule>, "
2084 "Optional<attr::SubjectMatchRule> (*) (StringRef, "
2085 "bool)>>(Name).\n";
2086 for (const auto &Rule : Rules) {
2087 if (Rule.isSubRule())
2088 continue;
2089 std::string SubRuleFunction;
2090 if (SubMatchRules.count(Rule.MetaSubject))
2091 SubRuleFunction =
2092 ("isAttributeSubjectMatchSubRuleFor_" + Rule.getName()).str();
2093 else
2094 SubRuleFunction = "defaultIsAttributeSubjectMatchSubRuleFor";
2095 OS << " Case(\"" << Rule.getName() << "\", std::make_pair("
2096 << Rule.getEnumValue() << ", " << SubRuleFunction << ")).\n";
2097 }
2098 OS << " Default(std::make_pair(None, "
2099 "defaultIsAttributeSubjectMatchSubRuleFor));\n";
2100 OS << "}\n\n";
2101
2102 // Generate the function that checks for the submatch rules.
2103 OS << "const char *validAttributeSubjectMatchSubRules("
2104 << AttributeSubjectMatchRule::EnumName << " Rule) {\n";
2105 OS << " switch (Rule) {\n";
2106 for (const auto &SubMatchRule : SubMatchRules) {
2107 OS << " case "
2108 << AttributeSubjectMatchRule(SubMatchRule.first, nullptr).getEnumValue()
2109 << ":\n";
2110 OS << " return \"'";
2111 bool IsFirst = true;
2112 for (const auto &Rule : SubMatchRule.second) {
2113 if (!IsFirst)
2114 OS << ", '";
2115 IsFirst = false;
2116 if (Rule.isNegatedSubRule())
2117 OS << "unless(";
2118 OS << Rule.getName();
2119 if (Rule.isNegatedSubRule())
2120 OS << ')';
2121 OS << "'";
2122 }
2123 OS << "\";\n";
2124 }
2125 OS << " default: return nullptr;\n";
2126 OS << " }\n";
2127 OS << "}\n\n";
2128 }
2129
2130 template <typename Fn>
forEachUniqueSpelling(const Record & Attr,Fn && F)2131 static void forEachUniqueSpelling(const Record &Attr, Fn &&F) {
2132 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
2133 SmallDenseSet<StringRef, 8> Seen;
2134 for (const FlattenedSpelling &S : Spellings) {
2135 if (Seen.insert(S.name()).second)
2136 F(S);
2137 }
2138 }
2139
2140 /// Emits the first-argument-is-type property for attributes.
emitClangAttrTypeArgList(RecordKeeper & Records,raw_ostream & OS)2141 static void emitClangAttrTypeArgList(RecordKeeper &Records, raw_ostream &OS) {
2142 OS << "#if defined(CLANG_ATTR_TYPE_ARG_LIST)\n";
2143 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
2144
2145 for (const auto *Attr : Attrs) {
2146 // Determine whether the first argument is a type.
2147 std::vector<Record *> Args = Attr->getValueAsListOfDefs("Args");
2148 if (Args.empty())
2149 continue;
2150
2151 if (Args[0]->getSuperClasses().back().first->getName() != "TypeArgument")
2152 continue;
2153
2154 // All these spellings take a single type argument.
2155 forEachUniqueSpelling(*Attr, [&](const FlattenedSpelling &S) {
2156 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
2157 });
2158 }
2159 OS << "#endif // CLANG_ATTR_TYPE_ARG_LIST\n\n";
2160 }
2161
2162 /// Emits the parse-arguments-in-unevaluated-context property for
2163 /// attributes.
emitClangAttrArgContextList(RecordKeeper & Records,raw_ostream & OS)2164 static void emitClangAttrArgContextList(RecordKeeper &Records, raw_ostream &OS) {
2165 OS << "#if defined(CLANG_ATTR_ARG_CONTEXT_LIST)\n";
2166 ParsedAttrMap Attrs = getParsedAttrList(Records);
2167 for (const auto &I : Attrs) {
2168 const Record &Attr = *I.second;
2169
2170 if (!Attr.getValueAsBit("ParseArgumentsAsUnevaluated"))
2171 continue;
2172
2173 // All these spellings take are parsed unevaluated.
2174 forEachUniqueSpelling(Attr, [&](const FlattenedSpelling &S) {
2175 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
2176 });
2177 }
2178 OS << "#endif // CLANG_ATTR_ARG_CONTEXT_LIST\n\n";
2179 }
2180
isIdentifierArgument(Record * Arg)2181 static bool isIdentifierArgument(Record *Arg) {
2182 return !Arg->getSuperClasses().empty() &&
2183 llvm::StringSwitch<bool>(Arg->getSuperClasses().back().first->getName())
2184 .Case("IdentifierArgument", true)
2185 .Case("EnumArgument", true)
2186 .Case("VariadicEnumArgument", true)
2187 .Default(false);
2188 }
2189
isVariadicIdentifierArgument(Record * Arg)2190 static bool isVariadicIdentifierArgument(Record *Arg) {
2191 return !Arg->getSuperClasses().empty() &&
2192 llvm::StringSwitch<bool>(
2193 Arg->getSuperClasses().back().first->getName())
2194 .Case("VariadicIdentifierArgument", true)
2195 .Case("VariadicParamOrParamIdxArgument", true)
2196 .Default(false);
2197 }
2198
emitClangAttrVariadicIdentifierArgList(RecordKeeper & Records,raw_ostream & OS)2199 static void emitClangAttrVariadicIdentifierArgList(RecordKeeper &Records,
2200 raw_ostream &OS) {
2201 OS << "#if defined(CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST)\n";
2202 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
2203 for (const auto *A : Attrs) {
2204 // Determine whether the first argument is a variadic identifier.
2205 std::vector<Record *> Args = A->getValueAsListOfDefs("Args");
2206 if (Args.empty() || !isVariadicIdentifierArgument(Args[0]))
2207 continue;
2208
2209 // All these spellings take an identifier argument.
2210 forEachUniqueSpelling(*A, [&](const FlattenedSpelling &S) {
2211 OS << ".Case(\"" << S.name() << "\", "
2212 << "true"
2213 << ")\n";
2214 });
2215 }
2216 OS << "#endif // CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST\n\n";
2217 }
2218
2219 // Emits the first-argument-is-identifier property for attributes.
emitClangAttrIdentifierArgList(RecordKeeper & Records,raw_ostream & OS)2220 static void emitClangAttrIdentifierArgList(RecordKeeper &Records, raw_ostream &OS) {
2221 OS << "#if defined(CLANG_ATTR_IDENTIFIER_ARG_LIST)\n";
2222 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
2223
2224 for (const auto *Attr : Attrs) {
2225 // Determine whether the first argument is an identifier.
2226 std::vector<Record *> Args = Attr->getValueAsListOfDefs("Args");
2227 if (Args.empty() || !isIdentifierArgument(Args[0]))
2228 continue;
2229
2230 // All these spellings take an identifier argument.
2231 forEachUniqueSpelling(*Attr, [&](const FlattenedSpelling &S) {
2232 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n";
2233 });
2234 }
2235 OS << "#endif // CLANG_ATTR_IDENTIFIER_ARG_LIST\n\n";
2236 }
2237
keywordThisIsaIdentifierInArgument(const Record * Arg)2238 static bool keywordThisIsaIdentifierInArgument(const Record *Arg) {
2239 return !Arg->getSuperClasses().empty() &&
2240 llvm::StringSwitch<bool>(
2241 Arg->getSuperClasses().back().first->getName())
2242 .Case("VariadicParamOrParamIdxArgument", true)
2243 .Default(false);
2244 }
2245
emitClangAttrThisIsaIdentifierArgList(RecordKeeper & Records,raw_ostream & OS)2246 static void emitClangAttrThisIsaIdentifierArgList(RecordKeeper &Records,
2247 raw_ostream &OS) {
2248 OS << "#if defined(CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST)\n";
2249 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
2250 for (const auto *A : Attrs) {
2251 // Determine whether the first argument is a variadic identifier.
2252 std::vector<Record *> Args = A->getValueAsListOfDefs("Args");
2253 if (Args.empty() || !keywordThisIsaIdentifierInArgument(Args[0]))
2254 continue;
2255
2256 // All these spellings take an identifier argument.
2257 forEachUniqueSpelling(*A, [&](const FlattenedSpelling &S) {
2258 OS << ".Case(\"" << S.name() << "\", "
2259 << "true"
2260 << ")\n";
2261 });
2262 }
2263 OS << "#endif // CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST\n\n";
2264 }
2265
emitAttributes(RecordKeeper & Records,raw_ostream & OS,bool Header)2266 static void emitAttributes(RecordKeeper &Records, raw_ostream &OS,
2267 bool Header) {
2268 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
2269 ParsedAttrMap AttrMap = getParsedAttrList(Records);
2270
2271 for (const auto *Attr : Attrs) {
2272 const Record &R = *Attr;
2273
2274 // FIXME: Currently, documentation is generated as-needed due to the fact
2275 // that there is no way to allow a generated project "reach into" the docs
2276 // directory (for instance, it may be an out-of-tree build). However, we want
2277 // to ensure that every attribute has a Documentation field, and produce an
2278 // error if it has been neglected. Otherwise, the on-demand generation which
2279 // happens server-side will fail. This code is ensuring that functionality,
2280 // even though this Emitter doesn't technically need the documentation.
2281 // When attribute documentation can be generated as part of the build
2282 // itself, this code can be removed.
2283 (void)R.getValueAsListOfDefs("Documentation");
2284
2285 if (!R.getValueAsBit("ASTNode"))
2286 continue;
2287
2288 ArrayRef<std::pair<Record *, SMRange>> Supers = R.getSuperClasses();
2289 assert(!Supers.empty() && "Forgot to specify a superclass for the attr");
2290 std::string SuperName;
2291 bool Inheritable = false;
2292 for (const auto &Super : llvm::reverse(Supers)) {
2293 const Record *R = Super.first;
2294 if (R->getName() != "TargetSpecificAttr" &&
2295 R->getName() != "DeclOrTypeAttr" && SuperName.empty())
2296 SuperName = std::string(R->getName());
2297 if (R->getName() == "InheritableAttr")
2298 Inheritable = true;
2299 }
2300
2301 if (Header)
2302 OS << "class " << R.getName() << "Attr : public " << SuperName << " {\n";
2303 else
2304 OS << "\n// " << R.getName() << "Attr implementation\n\n";
2305
2306 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
2307 std::vector<std::unique_ptr<Argument>> Args;
2308 Args.reserve(ArgRecords.size());
2309
2310 bool HasOptArg = false;
2311 bool HasFakeArg = false;
2312 for (const auto *ArgRecord : ArgRecords) {
2313 Args.emplace_back(createArgument(*ArgRecord, R.getName()));
2314 if (Header) {
2315 Args.back()->writeDeclarations(OS);
2316 OS << "\n\n";
2317 }
2318
2319 // For these purposes, fake takes priority over optional.
2320 if (Args.back()->isFake()) {
2321 HasFakeArg = true;
2322 } else if (Args.back()->isOptional()) {
2323 HasOptArg = true;
2324 }
2325 }
2326
2327 if (Header)
2328 OS << "public:\n";
2329
2330 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
2331
2332 // If there are zero or one spellings, all spelling-related functionality
2333 // can be elided. If all of the spellings share the same name, the spelling
2334 // functionality can also be elided.
2335 bool ElideSpelling = (Spellings.size() <= 1) ||
2336 SpellingNamesAreCommon(Spellings);
2337
2338 // This maps spelling index values to semantic Spelling enumerants.
2339 SemanticSpellingMap SemanticToSyntacticMap;
2340
2341 std::string SpellingEnum;
2342 if (Spellings.size() > 1)
2343 SpellingEnum = CreateSemanticSpellings(Spellings, SemanticToSyntacticMap);
2344 if (Header)
2345 OS << SpellingEnum;
2346
2347 const auto &ParsedAttrSpellingItr = llvm::find_if(
2348 AttrMap, [R](const std::pair<std::string, const Record *> &P) {
2349 return &R == P.second;
2350 });
2351
2352 // Emit CreateImplicit factory methods.
2353 auto emitCreate = [&](bool Implicit, bool emitFake) {
2354 if (Header)
2355 OS << " static ";
2356 OS << R.getName() << "Attr *";
2357 if (!Header)
2358 OS << R.getName() << "Attr::";
2359 OS << "Create";
2360 if (Implicit)
2361 OS << "Implicit";
2362 OS << "(";
2363 OS << "ASTContext &Ctx";
2364 for (auto const &ai : Args) {
2365 if (ai->isFake() && !emitFake) continue;
2366 OS << ", ";
2367 ai->writeCtorParameters(OS);
2368 }
2369 OS << ", const AttributeCommonInfo &CommonInfo";
2370 if (Header && Implicit)
2371 OS << " = {SourceRange{}}";
2372 OS << ")";
2373 if (Header) {
2374 OS << ";\n";
2375 return;
2376 }
2377
2378 OS << " {\n";
2379 OS << " auto *A = new (Ctx) " << R.getName();
2380 OS << "Attr(Ctx, CommonInfo";
2381 for (auto const &ai : Args) {
2382 if (ai->isFake() && !emitFake) continue;
2383 OS << ", ";
2384 ai->writeImplicitCtorArgs(OS);
2385 }
2386 OS << ");\n";
2387 if (Implicit) {
2388 OS << " A->setImplicit(true);\n";
2389 }
2390 if (Implicit || ElideSpelling) {
2391 OS << " if (!A->isAttributeSpellingListCalculated() && "
2392 "!A->getAttrName())\n";
2393 OS << " A->setAttributeSpellingListIndex(0);\n";
2394 }
2395 OS << " return A;\n}\n\n";
2396 };
2397
2398 auto emitCreateNoCI = [&](bool Implicit, bool emitFake) {
2399 if (Header)
2400 OS << " static ";
2401 OS << R.getName() << "Attr *";
2402 if (!Header)
2403 OS << R.getName() << "Attr::";
2404 OS << "Create";
2405 if (Implicit)
2406 OS << "Implicit";
2407 OS << "(";
2408 OS << "ASTContext &Ctx";
2409 for (auto const &ai : Args) {
2410 if (ai->isFake() && !emitFake) continue;
2411 OS << ", ";
2412 ai->writeCtorParameters(OS);
2413 }
2414 OS << ", SourceRange Range, AttributeCommonInfo::Syntax Syntax";
2415 if (!ElideSpelling) {
2416 OS << ", " << R.getName() << "Attr::Spelling S";
2417 if (Header)
2418 OS << " = static_cast<Spelling>(SpellingNotCalculated)";
2419 }
2420 OS << ")";
2421 if (Header) {
2422 OS << ";\n";
2423 return;
2424 }
2425
2426 OS << " {\n";
2427 OS << " AttributeCommonInfo I(Range, ";
2428
2429 if (ParsedAttrSpellingItr != std::end(AttrMap))
2430 OS << "AT_" << ParsedAttrSpellingItr->first;
2431 else
2432 OS << "NoSemaHandlerAttribute";
2433
2434 OS << ", Syntax";
2435 if (!ElideSpelling)
2436 OS << ", S";
2437 OS << ");\n";
2438 OS << " return Create";
2439 if (Implicit)
2440 OS << "Implicit";
2441 OS << "(Ctx";
2442 for (auto const &ai : Args) {
2443 if (ai->isFake() && !emitFake) continue;
2444 OS << ", ";
2445 ai->writeImplicitCtorArgs(OS);
2446 }
2447 OS << ", I);\n";
2448 OS << "}\n\n";
2449 };
2450
2451 auto emitCreates = [&](bool emitFake) {
2452 emitCreate(true, emitFake);
2453 emitCreate(false, emitFake);
2454 emitCreateNoCI(true, emitFake);
2455 emitCreateNoCI(false, emitFake);
2456 };
2457
2458 if (Header)
2459 OS << " // Factory methods\n";
2460
2461 // Emit a CreateImplicit that takes all the arguments.
2462 emitCreates(true);
2463
2464 // Emit a CreateImplicit that takes all the non-fake arguments.
2465 if (HasFakeArg)
2466 emitCreates(false);
2467
2468 // Emit constructors.
2469 auto emitCtor = [&](bool emitOpt, bool emitFake) {
2470 auto shouldEmitArg = [=](const std::unique_ptr<Argument> &arg) {
2471 if (arg->isFake()) return emitFake;
2472 if (arg->isOptional()) return emitOpt;
2473 return true;
2474 };
2475 if (Header)
2476 OS << " ";
2477 else
2478 OS << R.getName() << "Attr::";
2479 OS << R.getName()
2480 << "Attr(ASTContext &Ctx, const AttributeCommonInfo &CommonInfo";
2481 OS << '\n';
2482 for (auto const &ai : Args) {
2483 if (!shouldEmitArg(ai)) continue;
2484 OS << " , ";
2485 ai->writeCtorParameters(OS);
2486 OS << "\n";
2487 }
2488
2489 OS << " )";
2490 if (Header) {
2491 OS << ";\n";
2492 return;
2493 }
2494 OS << "\n : " << SuperName << "(Ctx, CommonInfo, ";
2495 OS << "attr::" << R.getName() << ", "
2496 << (R.getValueAsBit("LateParsed") ? "true" : "false");
2497 if (Inheritable) {
2498 OS << ", "
2499 << (R.getValueAsBit("InheritEvenIfAlreadyPresent") ? "true"
2500 : "false");
2501 }
2502 OS << ")\n";
2503
2504 for (auto const &ai : Args) {
2505 OS << " , ";
2506 if (!shouldEmitArg(ai)) {
2507 ai->writeCtorDefaultInitializers(OS);
2508 } else {
2509 ai->writeCtorInitializers(OS);
2510 }
2511 OS << "\n";
2512 }
2513
2514 OS << " {\n";
2515
2516 for (auto const &ai : Args) {
2517 if (!shouldEmitArg(ai)) continue;
2518 ai->writeCtorBody(OS);
2519 }
2520 OS << "}\n\n";
2521 };
2522
2523 if (Header)
2524 OS << "\n // Constructors\n";
2525
2526 // Emit a constructor that includes all the arguments.
2527 // This is necessary for cloning.
2528 emitCtor(true, true);
2529
2530 // Emit a constructor that takes all the non-fake arguments.
2531 if (HasFakeArg)
2532 emitCtor(true, false);
2533
2534 // Emit a constructor that takes all the non-fake, non-optional arguments.
2535 if (HasOptArg)
2536 emitCtor(false, false);
2537
2538 if (Header) {
2539 OS << '\n';
2540 OS << " " << R.getName() << "Attr *clone(ASTContext &C) const;\n";
2541 OS << " void printPretty(raw_ostream &OS,\n"
2542 << " const PrintingPolicy &Policy) const;\n";
2543 OS << " const char *getSpelling() const;\n";
2544 }
2545
2546 if (!ElideSpelling) {
2547 assert(!SemanticToSyntacticMap.empty() && "Empty semantic mapping list");
2548 if (Header)
2549 OS << " Spelling getSemanticSpelling() const;\n";
2550 else {
2551 OS << R.getName() << "Attr::Spelling " << R.getName()
2552 << "Attr::getSemanticSpelling() const {\n";
2553 WriteSemanticSpellingSwitch("getAttributeSpellingListIndex()",
2554 SemanticToSyntacticMap, OS);
2555 OS << "}\n";
2556 }
2557 }
2558
2559 if (Header)
2560 writeAttrAccessorDefinition(R, OS);
2561
2562 for (auto const &ai : Args) {
2563 if (Header) {
2564 ai->writeAccessors(OS);
2565 } else {
2566 ai->writeAccessorDefinitions(OS);
2567 }
2568 OS << "\n\n";
2569
2570 // Don't write conversion routines for fake arguments.
2571 if (ai->isFake()) continue;
2572
2573 if (ai->isEnumArg())
2574 static_cast<const EnumArgument *>(ai.get())->writeConversion(OS,
2575 Header);
2576 else if (ai->isVariadicEnumArg())
2577 static_cast<const VariadicEnumArgument *>(ai.get())->writeConversion(
2578 OS, Header);
2579 }
2580
2581 if (Header) {
2582 OS << R.getValueAsString("AdditionalMembers");
2583 OS << "\n\n";
2584
2585 OS << " static bool classof(const Attr *A) { return A->getKind() == "
2586 << "attr::" << R.getName() << "; }\n";
2587
2588 OS << "};\n\n";
2589 } else {
2590 OS << R.getName() << "Attr *" << R.getName()
2591 << "Attr::clone(ASTContext &C) const {\n";
2592 OS << " auto *A = new (C) " << R.getName() << "Attr(C, *this";
2593 for (auto const &ai : Args) {
2594 OS << ", ";
2595 ai->writeCloneArgs(OS);
2596 }
2597 OS << ");\n";
2598 OS << " A->Inherited = Inherited;\n";
2599 OS << " A->IsPackExpansion = IsPackExpansion;\n";
2600 OS << " A->setImplicit(Implicit);\n";
2601 OS << " return A;\n}\n\n";
2602
2603 writePrettyPrintFunction(R, Args, OS);
2604 writeGetSpellingFunction(R, OS);
2605 }
2606 }
2607 }
2608 // Emits the class definitions for attributes.
EmitClangAttrClass(RecordKeeper & Records,raw_ostream & OS)2609 void clang::EmitClangAttrClass(RecordKeeper &Records, raw_ostream &OS) {
2610 emitSourceFileHeader("Attribute classes' definitions", OS);
2611
2612 OS << "#ifndef LLVM_CLANG_ATTR_CLASSES_INC\n";
2613 OS << "#define LLVM_CLANG_ATTR_CLASSES_INC\n\n";
2614
2615 emitAttributes(Records, OS, true);
2616
2617 OS << "#endif // LLVM_CLANG_ATTR_CLASSES_INC\n";
2618 }
2619
2620 // Emits the class method definitions for attributes.
EmitClangAttrImpl(RecordKeeper & Records,raw_ostream & OS)2621 void clang::EmitClangAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
2622 emitSourceFileHeader("Attribute classes' member function definitions", OS);
2623
2624 emitAttributes(Records, OS, false);
2625
2626 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
2627
2628 // Instead of relying on virtual dispatch we just create a huge dispatch
2629 // switch. This is both smaller and faster than virtual functions.
2630 auto EmitFunc = [&](const char *Method) {
2631 OS << " switch (getKind()) {\n";
2632 for (const auto *Attr : Attrs) {
2633 const Record &R = *Attr;
2634 if (!R.getValueAsBit("ASTNode"))
2635 continue;
2636
2637 OS << " case attr::" << R.getName() << ":\n";
2638 OS << " return cast<" << R.getName() << "Attr>(this)->" << Method
2639 << ";\n";
2640 }
2641 OS << " }\n";
2642 OS << " llvm_unreachable(\"Unexpected attribute kind!\");\n";
2643 OS << "}\n\n";
2644 };
2645
2646 OS << "const char *Attr::getSpelling() const {\n";
2647 EmitFunc("getSpelling()");
2648
2649 OS << "Attr *Attr::clone(ASTContext &C) const {\n";
2650 EmitFunc("clone(C)");
2651
2652 OS << "void Attr::printPretty(raw_ostream &OS, "
2653 "const PrintingPolicy &Policy) const {\n";
2654 EmitFunc("printPretty(OS, Policy)");
2655 }
2656
emitAttrList(raw_ostream & OS,StringRef Class,const std::vector<Record * > & AttrList)2657 static void emitAttrList(raw_ostream &OS, StringRef Class,
2658 const std::vector<Record*> &AttrList) {
2659 for (auto Cur : AttrList) {
2660 OS << Class << "(" << Cur->getName() << ")\n";
2661 }
2662 }
2663
2664 // Determines if an attribute has a Pragma spelling.
AttrHasPragmaSpelling(const Record * R)2665 static bool AttrHasPragmaSpelling(const Record *R) {
2666 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*R);
2667 return llvm::find_if(Spellings, [](const FlattenedSpelling &S) {
2668 return S.variety() == "Pragma";
2669 }) != Spellings.end();
2670 }
2671
2672 namespace {
2673
2674 struct AttrClassDescriptor {
2675 const char * const MacroName;
2676 const char * const TableGenName;
2677 };
2678
2679 } // end anonymous namespace
2680
2681 static const AttrClassDescriptor AttrClassDescriptors[] = {
2682 { "ATTR", "Attr" },
2683 { "TYPE_ATTR", "TypeAttr" },
2684 { "STMT_ATTR", "StmtAttr" },
2685 { "INHERITABLE_ATTR", "InheritableAttr" },
2686 { "DECL_OR_TYPE_ATTR", "DeclOrTypeAttr" },
2687 { "INHERITABLE_PARAM_ATTR", "InheritableParamAttr" },
2688 { "PARAMETER_ABI_ATTR", "ParameterABIAttr" }
2689 };
2690
emitDefaultDefine(raw_ostream & OS,StringRef name,const char * superName)2691 static void emitDefaultDefine(raw_ostream &OS, StringRef name,
2692 const char *superName) {
2693 OS << "#ifndef " << name << "\n";
2694 OS << "#define " << name << "(NAME) ";
2695 if (superName) OS << superName << "(NAME)";
2696 OS << "\n#endif\n\n";
2697 }
2698
2699 namespace {
2700
2701 /// A class of attributes.
2702 struct AttrClass {
2703 const AttrClassDescriptor &Descriptor;
2704 Record *TheRecord;
2705 AttrClass *SuperClass = nullptr;
2706 std::vector<AttrClass*> SubClasses;
2707 std::vector<Record*> Attrs;
2708
AttrClass__anona61259f61311::AttrClass2709 AttrClass(const AttrClassDescriptor &Descriptor, Record *R)
2710 : Descriptor(Descriptor), TheRecord(R) {}
2711
emitDefaultDefines__anona61259f61311::AttrClass2712 void emitDefaultDefines(raw_ostream &OS) const {
2713 // Default the macro unless this is a root class (i.e. Attr).
2714 if (SuperClass) {
2715 emitDefaultDefine(OS, Descriptor.MacroName,
2716 SuperClass->Descriptor.MacroName);
2717 }
2718 }
2719
emitUndefs__anona61259f61311::AttrClass2720 void emitUndefs(raw_ostream &OS) const {
2721 OS << "#undef " << Descriptor.MacroName << "\n";
2722 }
2723
emitAttrList__anona61259f61311::AttrClass2724 void emitAttrList(raw_ostream &OS) const {
2725 for (auto SubClass : SubClasses) {
2726 SubClass->emitAttrList(OS);
2727 }
2728
2729 ::emitAttrList(OS, Descriptor.MacroName, Attrs);
2730 }
2731
classifyAttrOnRoot__anona61259f61311::AttrClass2732 void classifyAttrOnRoot(Record *Attr) {
2733 bool result = classifyAttr(Attr);
2734 assert(result && "failed to classify on root"); (void) result;
2735 }
2736
emitAttrRange__anona61259f61311::AttrClass2737 void emitAttrRange(raw_ostream &OS) const {
2738 OS << "ATTR_RANGE(" << Descriptor.TableGenName
2739 << ", " << getFirstAttr()->getName()
2740 << ", " << getLastAttr()->getName() << ")\n";
2741 }
2742
2743 private:
classifyAttr__anona61259f61311::AttrClass2744 bool classifyAttr(Record *Attr) {
2745 // Check all the subclasses.
2746 for (auto SubClass : SubClasses) {
2747 if (SubClass->classifyAttr(Attr))
2748 return true;
2749 }
2750
2751 // It's not more specific than this class, but it might still belong here.
2752 if (Attr->isSubClassOf(TheRecord)) {
2753 Attrs.push_back(Attr);
2754 return true;
2755 }
2756
2757 return false;
2758 }
2759
getFirstAttr__anona61259f61311::AttrClass2760 Record *getFirstAttr() const {
2761 if (!SubClasses.empty())
2762 return SubClasses.front()->getFirstAttr();
2763 return Attrs.front();
2764 }
2765
getLastAttr__anona61259f61311::AttrClass2766 Record *getLastAttr() const {
2767 if (!Attrs.empty())
2768 return Attrs.back();
2769 return SubClasses.back()->getLastAttr();
2770 }
2771 };
2772
2773 /// The entire hierarchy of attribute classes.
2774 class AttrClassHierarchy {
2775 std::vector<std::unique_ptr<AttrClass>> Classes;
2776
2777 public:
AttrClassHierarchy(RecordKeeper & Records)2778 AttrClassHierarchy(RecordKeeper &Records) {
2779 // Find records for all the classes.
2780 for (auto &Descriptor : AttrClassDescriptors) {
2781 Record *ClassRecord = Records.getClass(Descriptor.TableGenName);
2782 AttrClass *Class = new AttrClass(Descriptor, ClassRecord);
2783 Classes.emplace_back(Class);
2784 }
2785
2786 // Link up the hierarchy.
2787 for (auto &Class : Classes) {
2788 if (AttrClass *SuperClass = findSuperClass(Class->TheRecord)) {
2789 Class->SuperClass = SuperClass;
2790 SuperClass->SubClasses.push_back(Class.get());
2791 }
2792 }
2793
2794 #ifndef NDEBUG
2795 for (auto i = Classes.begin(), e = Classes.end(); i != e; ++i) {
2796 assert((i == Classes.begin()) == ((*i)->SuperClass == nullptr) &&
2797 "only the first class should be a root class!");
2798 }
2799 #endif
2800 }
2801
emitDefaultDefines(raw_ostream & OS) const2802 void emitDefaultDefines(raw_ostream &OS) const {
2803 for (auto &Class : Classes) {
2804 Class->emitDefaultDefines(OS);
2805 }
2806 }
2807
emitUndefs(raw_ostream & OS) const2808 void emitUndefs(raw_ostream &OS) const {
2809 for (auto &Class : Classes) {
2810 Class->emitUndefs(OS);
2811 }
2812 }
2813
emitAttrLists(raw_ostream & OS) const2814 void emitAttrLists(raw_ostream &OS) const {
2815 // Just start from the root class.
2816 Classes[0]->emitAttrList(OS);
2817 }
2818
emitAttrRanges(raw_ostream & OS) const2819 void emitAttrRanges(raw_ostream &OS) const {
2820 for (auto &Class : Classes)
2821 Class->emitAttrRange(OS);
2822 }
2823
classifyAttr(Record * Attr)2824 void classifyAttr(Record *Attr) {
2825 // Add the attribute to the root class.
2826 Classes[0]->classifyAttrOnRoot(Attr);
2827 }
2828
2829 private:
findClassByRecord(Record * R) const2830 AttrClass *findClassByRecord(Record *R) const {
2831 for (auto &Class : Classes) {
2832 if (Class->TheRecord == R)
2833 return Class.get();
2834 }
2835 return nullptr;
2836 }
2837
findSuperClass(Record * R) const2838 AttrClass *findSuperClass(Record *R) const {
2839 // TableGen flattens the superclass list, so we just need to walk it
2840 // in reverse.
2841 auto SuperClasses = R->getSuperClasses();
2842 for (signed i = 0, e = SuperClasses.size(); i != e; ++i) {
2843 auto SuperClass = findClassByRecord(SuperClasses[e - i - 1].first);
2844 if (SuperClass) return SuperClass;
2845 }
2846 return nullptr;
2847 }
2848 };
2849
2850 } // end anonymous namespace
2851
2852 namespace clang {
2853
2854 // Emits the enumeration list for attributes.
EmitClangAttrList(RecordKeeper & Records,raw_ostream & OS)2855 void EmitClangAttrList(RecordKeeper &Records, raw_ostream &OS) {
2856 emitSourceFileHeader("List of all attributes that Clang recognizes", OS);
2857
2858 AttrClassHierarchy Hierarchy(Records);
2859
2860 // Add defaulting macro definitions.
2861 Hierarchy.emitDefaultDefines(OS);
2862 emitDefaultDefine(OS, "PRAGMA_SPELLING_ATTR", nullptr);
2863
2864 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
2865 std::vector<Record *> PragmaAttrs;
2866 for (auto *Attr : Attrs) {
2867 if (!Attr->getValueAsBit("ASTNode"))
2868 continue;
2869
2870 // Add the attribute to the ad-hoc groups.
2871 if (AttrHasPragmaSpelling(Attr))
2872 PragmaAttrs.push_back(Attr);
2873
2874 // Place it in the hierarchy.
2875 Hierarchy.classifyAttr(Attr);
2876 }
2877
2878 // Emit the main attribute list.
2879 Hierarchy.emitAttrLists(OS);
2880
2881 // Emit the ad hoc groups.
2882 emitAttrList(OS, "PRAGMA_SPELLING_ATTR", PragmaAttrs);
2883
2884 // Emit the attribute ranges.
2885 OS << "#ifdef ATTR_RANGE\n";
2886 Hierarchy.emitAttrRanges(OS);
2887 OS << "#undef ATTR_RANGE\n";
2888 OS << "#endif\n";
2889
2890 Hierarchy.emitUndefs(OS);
2891 OS << "#undef PRAGMA_SPELLING_ATTR\n";
2892 }
2893
2894 // Emits the enumeration list for attributes.
EmitClangAttrSubjectMatchRuleList(RecordKeeper & Records,raw_ostream & OS)2895 void EmitClangAttrSubjectMatchRuleList(RecordKeeper &Records, raw_ostream &OS) {
2896 emitSourceFileHeader(
2897 "List of all attribute subject matching rules that Clang recognizes", OS);
2898 PragmaClangAttributeSupport &PragmaAttributeSupport =
2899 getPragmaAttributeSupport(Records);
2900 emitDefaultDefine(OS, "ATTR_MATCH_RULE", nullptr);
2901 PragmaAttributeSupport.emitMatchRuleList(OS);
2902 OS << "#undef ATTR_MATCH_RULE\n";
2903 }
2904
2905 // Emits the code to read an attribute from a precompiled header.
EmitClangAttrPCHRead(RecordKeeper & Records,raw_ostream & OS)2906 void EmitClangAttrPCHRead(RecordKeeper &Records, raw_ostream &OS) {
2907 emitSourceFileHeader("Attribute deserialization code", OS);
2908
2909 Record *InhClass = Records.getClass("InheritableAttr");
2910 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"),
2911 ArgRecords;
2912 std::vector<std::unique_ptr<Argument>> Args;
2913
2914 OS << " switch (Kind) {\n";
2915 for (const auto *Attr : Attrs) {
2916 const Record &R = *Attr;
2917 if (!R.getValueAsBit("ASTNode"))
2918 continue;
2919
2920 OS << " case attr::" << R.getName() << ": {\n";
2921 if (R.isSubClassOf(InhClass))
2922 OS << " bool isInherited = Record.readInt();\n";
2923 OS << " bool isImplicit = Record.readInt();\n";
2924 OS << " bool isPackExpansion = Record.readInt();\n";
2925 ArgRecords = R.getValueAsListOfDefs("Args");
2926 Args.clear();
2927 for (const auto *Arg : ArgRecords) {
2928 Args.emplace_back(createArgument(*Arg, R.getName()));
2929 Args.back()->writePCHReadDecls(OS);
2930 }
2931 OS << " New = new (Context) " << R.getName() << "Attr(Context, Info";
2932 for (auto const &ri : Args) {
2933 OS << ", ";
2934 ri->writePCHReadArgs(OS);
2935 }
2936 OS << ");\n";
2937 if (R.isSubClassOf(InhClass))
2938 OS << " cast<InheritableAttr>(New)->setInherited(isInherited);\n";
2939 OS << " New->setImplicit(isImplicit);\n";
2940 OS << " New->setPackExpansion(isPackExpansion);\n";
2941 OS << " break;\n";
2942 OS << " }\n";
2943 }
2944 OS << " }\n";
2945 }
2946
2947 // Emits the code to write an attribute to a precompiled header.
EmitClangAttrPCHWrite(RecordKeeper & Records,raw_ostream & OS)2948 void EmitClangAttrPCHWrite(RecordKeeper &Records, raw_ostream &OS) {
2949 emitSourceFileHeader("Attribute serialization code", OS);
2950
2951 Record *InhClass = Records.getClass("InheritableAttr");
2952 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args;
2953
2954 OS << " switch (A->getKind()) {\n";
2955 for (const auto *Attr : Attrs) {
2956 const Record &R = *Attr;
2957 if (!R.getValueAsBit("ASTNode"))
2958 continue;
2959 OS << " case attr::" << R.getName() << ": {\n";
2960 Args = R.getValueAsListOfDefs("Args");
2961 if (R.isSubClassOf(InhClass) || !Args.empty())
2962 OS << " const auto *SA = cast<" << R.getName()
2963 << "Attr>(A);\n";
2964 if (R.isSubClassOf(InhClass))
2965 OS << " Record.push_back(SA->isInherited());\n";
2966 OS << " Record.push_back(A->isImplicit());\n";
2967 OS << " Record.push_back(A->isPackExpansion());\n";
2968
2969 for (const auto *Arg : Args)
2970 createArgument(*Arg, R.getName())->writePCHWrite(OS);
2971 OS << " break;\n";
2972 OS << " }\n";
2973 }
2974 OS << " }\n";
2975 }
2976
2977 // Helper function for GenerateTargetSpecificAttrChecks that alters the 'Test'
2978 // parameter with only a single check type, if applicable.
GenerateTargetSpecificAttrCheck(const Record * R,std::string & Test,std::string * FnName,StringRef ListName,StringRef CheckAgainst,StringRef Scope)2979 static bool GenerateTargetSpecificAttrCheck(const Record *R, std::string &Test,
2980 std::string *FnName,
2981 StringRef ListName,
2982 StringRef CheckAgainst,
2983 StringRef Scope) {
2984 if (!R->isValueUnset(ListName)) {
2985 Test += " && (";
2986 std::vector<StringRef> Items = R->getValueAsListOfStrings(ListName);
2987 for (auto I = Items.begin(), E = Items.end(); I != E; ++I) {
2988 StringRef Part = *I;
2989 Test += CheckAgainst;
2990 Test += " == ";
2991 Test += Scope;
2992 Test += Part;
2993 if (I + 1 != E)
2994 Test += " || ";
2995 if (FnName)
2996 *FnName += Part;
2997 }
2998 Test += ")";
2999 return true;
3000 }
3001 return false;
3002 }
3003
3004 // Generate a conditional expression to check if the current target satisfies
3005 // the conditions for a TargetSpecificAttr record, and append the code for
3006 // those checks to the Test string. If the FnName string pointer is non-null,
3007 // append a unique suffix to distinguish this set of target checks from other
3008 // TargetSpecificAttr records.
GenerateTargetSpecificAttrChecks(const Record * R,std::vector<StringRef> & Arches,std::string & Test,std::string * FnName)3009 static bool GenerateTargetSpecificAttrChecks(const Record *R,
3010 std::vector<StringRef> &Arches,
3011 std::string &Test,
3012 std::string *FnName) {
3013 bool AnyTargetChecks = false;
3014
3015 // It is assumed that there will be an llvm::Triple object
3016 // named "T" and a TargetInfo object named "Target" within
3017 // scope that can be used to determine whether the attribute exists in
3018 // a given target.
3019 Test += "true";
3020 // If one or more architectures is specified, check those. Arches are handled
3021 // differently because GenerateTargetRequirements needs to combine the list
3022 // with ParseKind.
3023 if (!Arches.empty()) {
3024 AnyTargetChecks = true;
3025 Test += " && (";
3026 for (auto I = Arches.begin(), E = Arches.end(); I != E; ++I) {
3027 StringRef Part = *I;
3028 Test += "T.getArch() == llvm::Triple::";
3029 Test += Part;
3030 if (I + 1 != E)
3031 Test += " || ";
3032 if (FnName)
3033 *FnName += Part;
3034 }
3035 Test += ")";
3036 }
3037
3038 // If the attribute is specific to particular OSes, check those.
3039 AnyTargetChecks |= GenerateTargetSpecificAttrCheck(
3040 R, Test, FnName, "OSes", "T.getOS()", "llvm::Triple::");
3041
3042 // If one or more object formats is specified, check those.
3043 AnyTargetChecks |=
3044 GenerateTargetSpecificAttrCheck(R, Test, FnName, "ObjectFormats",
3045 "T.getObjectFormat()", "llvm::Triple::");
3046
3047 // If custom code is specified, emit it.
3048 StringRef Code = R->getValueAsString("CustomCode");
3049 if (!Code.empty()) {
3050 AnyTargetChecks = true;
3051 Test += " && (";
3052 Test += Code;
3053 Test += ")";
3054 }
3055
3056 return AnyTargetChecks;
3057 }
3058
GenerateHasAttrSpellingStringSwitch(const std::vector<Record * > & Attrs,raw_ostream & OS,const std::string & Variety="",const std::string & Scope="")3059 static void GenerateHasAttrSpellingStringSwitch(
3060 const std::vector<Record *> &Attrs, raw_ostream &OS,
3061 const std::string &Variety = "", const std::string &Scope = "") {
3062 for (const auto *Attr : Attrs) {
3063 // C++11-style attributes have specific version information associated with
3064 // them. If the attribute has no scope, the version information must not
3065 // have the default value (1), as that's incorrect. Instead, the unscoped
3066 // attribute version information should be taken from the SD-6 standing
3067 // document, which can be found at:
3068 // https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations
3069 //
3070 // C2x-style attributes have the same kind of version information
3071 // associated with them. The unscoped attribute version information should
3072 // be taken from the specification of the attribute in the C Standard.
3073 int Version = 1;
3074
3075 if (Variety == "CXX11" || Variety == "C2x") {
3076 std::vector<Record *> Spellings = Attr->getValueAsListOfDefs("Spellings");
3077 for (const auto &Spelling : Spellings) {
3078 if (Spelling->getValueAsString("Variety") == Variety) {
3079 Version = static_cast<int>(Spelling->getValueAsInt("Version"));
3080 if (Scope.empty() && Version == 1)
3081 PrintError(Spelling->getLoc(), "Standard attributes must have "
3082 "valid version information.");
3083 break;
3084 }
3085 }
3086 }
3087
3088 std::string Test;
3089 if (Attr->isSubClassOf("TargetSpecificAttr")) {
3090 const Record *R = Attr->getValueAsDef("Target");
3091 std::vector<StringRef> Arches = R->getValueAsListOfStrings("Arches");
3092 GenerateTargetSpecificAttrChecks(R, Arches, Test, nullptr);
3093
3094 // If this is the C++11 variety, also add in the LangOpts test.
3095 if (Variety == "CXX11")
3096 Test += " && LangOpts.CPlusPlus11";
3097 else if (Variety == "C2x")
3098 Test += " && LangOpts.DoubleSquareBracketAttributes";
3099 } else if (Variety == "CXX11")
3100 // C++11 mode should be checked against LangOpts, which is presumed to be
3101 // present in the caller.
3102 Test = "LangOpts.CPlusPlus11";
3103 else if (Variety == "C2x")
3104 Test = "LangOpts.DoubleSquareBracketAttributes";
3105
3106 std::string TestStr =
3107 !Test.empty() ? Test + " ? " + llvm::itostr(Version) + " : 0" : "1";
3108 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr);
3109 for (const auto &S : Spellings)
3110 if (Variety.empty() || (Variety == S.variety() &&
3111 (Scope.empty() || Scope == S.nameSpace())))
3112 OS << " .Case(\"" << S.name() << "\", " << TestStr << ")\n";
3113 }
3114 OS << " .Default(0);\n";
3115 }
3116
3117 // Emits the list of spellings for attributes.
EmitClangAttrHasAttrImpl(RecordKeeper & Records,raw_ostream & OS)3118 void EmitClangAttrHasAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
3119 emitSourceFileHeader("Code to implement the __has_attribute logic", OS);
3120
3121 // Separate all of the attributes out into four group: generic, C++11, GNU,
3122 // and declspecs. Then generate a big switch statement for each of them.
3123 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
3124 std::vector<Record *> Declspec, Microsoft, GNU, Pragma;
3125 std::map<std::string, std::vector<Record *>> CXX, C2x;
3126
3127 // Walk over the list of all attributes, and split them out based on the
3128 // spelling variety.
3129 for (auto *R : Attrs) {
3130 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*R);
3131 for (const auto &SI : Spellings) {
3132 const std::string &Variety = SI.variety();
3133 if (Variety == "GNU")
3134 GNU.push_back(R);
3135 else if (Variety == "Declspec")
3136 Declspec.push_back(R);
3137 else if (Variety == "Microsoft")
3138 Microsoft.push_back(R);
3139 else if (Variety == "CXX11")
3140 CXX[SI.nameSpace()].push_back(R);
3141 else if (Variety == "C2x")
3142 C2x[SI.nameSpace()].push_back(R);
3143 else if (Variety == "Pragma")
3144 Pragma.push_back(R);
3145 }
3146 }
3147
3148 OS << "const llvm::Triple &T = Target.getTriple();\n";
3149 OS << "switch (Syntax) {\n";
3150 OS << "case AttrSyntax::GNU:\n";
3151 OS << " return llvm::StringSwitch<int>(Name)\n";
3152 GenerateHasAttrSpellingStringSwitch(GNU, OS, "GNU");
3153 OS << "case AttrSyntax::Declspec:\n";
3154 OS << " return llvm::StringSwitch<int>(Name)\n";
3155 GenerateHasAttrSpellingStringSwitch(Declspec, OS, "Declspec");
3156 OS << "case AttrSyntax::Microsoft:\n";
3157 OS << " return llvm::StringSwitch<int>(Name)\n";
3158 GenerateHasAttrSpellingStringSwitch(Microsoft, OS, "Microsoft");
3159 OS << "case AttrSyntax::Pragma:\n";
3160 OS << " return llvm::StringSwitch<int>(Name)\n";
3161 GenerateHasAttrSpellingStringSwitch(Pragma, OS, "Pragma");
3162 auto fn = [&OS](const char *Spelling, const char *Variety,
3163 const std::map<std::string, std::vector<Record *>> &List) {
3164 OS << "case AttrSyntax::" << Variety << ": {\n";
3165 // C++11-style attributes are further split out based on the Scope.
3166 for (auto I = List.cbegin(), E = List.cend(); I != E; ++I) {
3167 if (I != List.cbegin())
3168 OS << " else ";
3169 if (I->first.empty())
3170 OS << "if (ScopeName == \"\") {\n";
3171 else
3172 OS << "if (ScopeName == \"" << I->first << "\") {\n";
3173 OS << " return llvm::StringSwitch<int>(Name)\n";
3174 GenerateHasAttrSpellingStringSwitch(I->second, OS, Spelling, I->first);
3175 OS << "}";
3176 }
3177 OS << "\n} break;\n";
3178 };
3179 fn("CXX11", "CXX", CXX);
3180 fn("C2x", "C", C2x);
3181 OS << "}\n";
3182 }
3183
EmitClangAttrSpellingListIndex(RecordKeeper & Records,raw_ostream & OS)3184 void EmitClangAttrSpellingListIndex(RecordKeeper &Records, raw_ostream &OS) {
3185 emitSourceFileHeader("Code to translate different attribute spellings "
3186 "into internal identifiers", OS);
3187
3188 OS << " switch (getParsedKind()) {\n";
3189 OS << " case IgnoredAttribute:\n";
3190 OS << " case UnknownAttribute:\n";
3191 OS << " case NoSemaHandlerAttribute:\n";
3192 OS << " llvm_unreachable(\"Ignored/unknown shouldn't get here\");\n";
3193
3194 ParsedAttrMap Attrs = getParsedAttrList(Records);
3195 for (const auto &I : Attrs) {
3196 const Record &R = *I.second;
3197 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
3198 OS << " case AT_" << I.first << ": {\n";
3199 for (unsigned I = 0; I < Spellings.size(); ++ I) {
3200 OS << " if (Name == \"" << Spellings[I].name() << "\" && "
3201 << "getSyntax() == AttributeCommonInfo::AS_" << Spellings[I].variety()
3202 << " && Scope == \"" << Spellings[I].nameSpace() << "\")\n"
3203 << " return " << I << ";\n";
3204 }
3205
3206 OS << " break;\n";
3207 OS << " }\n";
3208 }
3209
3210 OS << " }\n";
3211 OS << " return 0;\n";
3212 }
3213
3214 // Emits code used by RecursiveASTVisitor to visit attributes
EmitClangAttrASTVisitor(RecordKeeper & Records,raw_ostream & OS)3215 void EmitClangAttrASTVisitor(RecordKeeper &Records, raw_ostream &OS) {
3216 emitSourceFileHeader("Used by RecursiveASTVisitor to visit attributes.", OS);
3217
3218 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
3219
3220 // Write method declarations for Traverse* methods.
3221 // We emit this here because we only generate methods for attributes that
3222 // are declared as ASTNodes.
3223 OS << "#ifdef ATTR_VISITOR_DECLS_ONLY\n\n";
3224 for (const auto *Attr : Attrs) {
3225 const Record &R = *Attr;
3226 if (!R.getValueAsBit("ASTNode"))
3227 continue;
3228 OS << " bool Traverse"
3229 << R.getName() << "Attr(" << R.getName() << "Attr *A);\n";
3230 OS << " bool Visit"
3231 << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n"
3232 << " return true; \n"
3233 << " }\n";
3234 }
3235 OS << "\n#else // ATTR_VISITOR_DECLS_ONLY\n\n";
3236
3237 // Write individual Traverse* methods for each attribute class.
3238 for (const auto *Attr : Attrs) {
3239 const Record &R = *Attr;
3240 if (!R.getValueAsBit("ASTNode"))
3241 continue;
3242
3243 OS << "template <typename Derived>\n"
3244 << "bool VISITORCLASS<Derived>::Traverse"
3245 << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n"
3246 << " if (!getDerived().VisitAttr(A))\n"
3247 << " return false;\n"
3248 << " if (!getDerived().Visit" << R.getName() << "Attr(A))\n"
3249 << " return false;\n";
3250
3251 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
3252 for (const auto *Arg : ArgRecords)
3253 createArgument(*Arg, R.getName())->writeASTVisitorTraversal(OS);
3254
3255 OS << " return true;\n";
3256 OS << "}\n\n";
3257 }
3258
3259 // Write generic Traverse routine
3260 OS << "template <typename Derived>\n"
3261 << "bool VISITORCLASS<Derived>::TraverseAttr(Attr *A) {\n"
3262 << " if (!A)\n"
3263 << " return true;\n"
3264 << "\n"
3265 << " switch (A->getKind()) {\n";
3266
3267 for (const auto *Attr : Attrs) {
3268 const Record &R = *Attr;
3269 if (!R.getValueAsBit("ASTNode"))
3270 continue;
3271
3272 OS << " case attr::" << R.getName() << ":\n"
3273 << " return getDerived().Traverse" << R.getName() << "Attr("
3274 << "cast<" << R.getName() << "Attr>(A));\n";
3275 }
3276 OS << " }\n"; // end switch
3277 OS << " llvm_unreachable(\"bad attribute kind\");\n";
3278 OS << "}\n"; // end function
3279 OS << "#endif // ATTR_VISITOR_DECLS_ONLY\n";
3280 }
3281
EmitClangAttrTemplateInstantiateHelper(const std::vector<Record * > & Attrs,raw_ostream & OS,bool AppliesToDecl)3282 void EmitClangAttrTemplateInstantiateHelper(const std::vector<Record *> &Attrs,
3283 raw_ostream &OS,
3284 bool AppliesToDecl) {
3285
3286 OS << " switch (At->getKind()) {\n";
3287 for (const auto *Attr : Attrs) {
3288 const Record &R = *Attr;
3289 if (!R.getValueAsBit("ASTNode"))
3290 continue;
3291 OS << " case attr::" << R.getName() << ": {\n";
3292 bool ShouldClone = R.getValueAsBit("Clone") &&
3293 (!AppliesToDecl ||
3294 R.getValueAsBit("MeaningfulToClassTemplateDefinition"));
3295
3296 if (!ShouldClone) {
3297 OS << " return nullptr;\n";
3298 OS << " }\n";
3299 continue;
3300 }
3301
3302 OS << " const auto *A = cast<"
3303 << R.getName() << "Attr>(At);\n";
3304 bool TDependent = R.getValueAsBit("TemplateDependent");
3305
3306 if (!TDependent) {
3307 OS << " return A->clone(C);\n";
3308 OS << " }\n";
3309 continue;
3310 }
3311
3312 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
3313 std::vector<std::unique_ptr<Argument>> Args;
3314 Args.reserve(ArgRecords.size());
3315
3316 for (const auto *ArgRecord : ArgRecords)
3317 Args.emplace_back(createArgument(*ArgRecord, R.getName()));
3318
3319 for (auto const &ai : Args)
3320 ai->writeTemplateInstantiation(OS);
3321
3322 OS << " return new (C) " << R.getName() << "Attr(C, *A";
3323 for (auto const &ai : Args) {
3324 OS << ", ";
3325 ai->writeTemplateInstantiationArgs(OS);
3326 }
3327 OS << ");\n }\n";
3328 }
3329 OS << " } // end switch\n"
3330 << " llvm_unreachable(\"Unknown attribute!\");\n"
3331 << " return nullptr;\n";
3332 }
3333
3334 // Emits code to instantiate dependent attributes on templates.
EmitClangAttrTemplateInstantiate(RecordKeeper & Records,raw_ostream & OS)3335 void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS) {
3336 emitSourceFileHeader("Template instantiation code for attributes", OS);
3337
3338 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
3339
3340 OS << "namespace clang {\n"
3341 << "namespace sema {\n\n"
3342 << "Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, "
3343 << "Sema &S,\n"
3344 << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n";
3345 EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/false);
3346 OS << "}\n\n"
3347 << "Attr *instantiateTemplateAttributeForDecl(const Attr *At,\n"
3348 << " ASTContext &C, Sema &S,\n"
3349 << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n";
3350 EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/true);
3351 OS << "}\n\n"
3352 << "} // end namespace sema\n"
3353 << "} // end namespace clang\n";
3354 }
3355
3356 // Emits the list of parsed attributes.
EmitClangAttrParsedAttrList(RecordKeeper & Records,raw_ostream & OS)3357 void EmitClangAttrParsedAttrList(RecordKeeper &Records, raw_ostream &OS) {
3358 emitSourceFileHeader("List of all attributes that Clang recognizes", OS);
3359
3360 OS << "#ifndef PARSED_ATTR\n";
3361 OS << "#define PARSED_ATTR(NAME) NAME\n";
3362 OS << "#endif\n\n";
3363
3364 ParsedAttrMap Names = getParsedAttrList(Records);
3365 for (const auto &I : Names) {
3366 OS << "PARSED_ATTR(" << I.first << ")\n";
3367 }
3368 }
3369
isArgVariadic(const Record & R,StringRef AttrName)3370 static bool isArgVariadic(const Record &R, StringRef AttrName) {
3371 return createArgument(R, AttrName)->isVariadic();
3372 }
3373
emitArgInfo(const Record & R,raw_ostream & OS)3374 static void emitArgInfo(const Record &R, raw_ostream &OS) {
3375 // This function will count the number of arguments specified for the
3376 // attribute and emit the number of required arguments followed by the
3377 // number of optional arguments.
3378 std::vector<Record *> Args = R.getValueAsListOfDefs("Args");
3379 unsigned ArgCount = 0, OptCount = 0;
3380 bool HasVariadic = false;
3381 for (const auto *Arg : Args) {
3382 // If the arg is fake, it's the user's job to supply it: general parsing
3383 // logic shouldn't need to know anything about it.
3384 if (Arg->getValueAsBit("Fake"))
3385 continue;
3386 Arg->getValueAsBit("Optional") ? ++OptCount : ++ArgCount;
3387 if (!HasVariadic && isArgVariadic(*Arg, R.getName()))
3388 HasVariadic = true;
3389 }
3390
3391 // If there is a variadic argument, we will set the optional argument count
3392 // to its largest value. Since it's currently a 4-bit number, we set it to 15.
3393 OS << " NumArgs = " << ArgCount << ";\n";
3394 OS << " OptArgs = " << (HasVariadic ? 15 : OptCount) << ";\n";
3395 }
3396
GetDiagnosticSpelling(const Record & R)3397 static std::string GetDiagnosticSpelling(const Record &R) {
3398 std::string Ret = std::string(R.getValueAsString("DiagSpelling"));
3399 if (!Ret.empty())
3400 return Ret;
3401
3402 // If we couldn't find the DiagSpelling in this object, we can check to see
3403 // if the object is one that has a base, and if it is, loop up to the Base
3404 // member recursively.
3405 if (auto Base = R.getValueAsOptionalDef(BaseFieldName))
3406 return GetDiagnosticSpelling(*Base);
3407
3408 return "";
3409 }
3410
CalculateDiagnostic(const Record & S)3411 static std::string CalculateDiagnostic(const Record &S) {
3412 // If the SubjectList object has a custom diagnostic associated with it,
3413 // return that directly.
3414 const StringRef CustomDiag = S.getValueAsString("CustomDiag");
3415 if (!CustomDiag.empty())
3416 return ("\"" + Twine(CustomDiag) + "\"").str();
3417
3418 std::vector<std::string> DiagList;
3419 std::vector<Record *> Subjects = S.getValueAsListOfDefs("Subjects");
3420 for (const auto *Subject : Subjects) {
3421 const Record &R = *Subject;
3422 // Get the diagnostic text from the Decl or Stmt node given.
3423 std::string V = GetDiagnosticSpelling(R);
3424 if (V.empty()) {
3425 PrintError(R.getLoc(),
3426 "Could not determine diagnostic spelling for the node: " +
3427 R.getName() + "; please add one to DeclNodes.td");
3428 } else {
3429 // The node may contain a list of elements itself, so split the elements
3430 // by a comma, and trim any whitespace.
3431 SmallVector<StringRef, 2> Frags;
3432 llvm::SplitString(V, Frags, ",");
3433 for (auto Str : Frags) {
3434 DiagList.push_back(std::string(Str.trim()));
3435 }
3436 }
3437 }
3438
3439 if (DiagList.empty()) {
3440 PrintFatalError(S.getLoc(),
3441 "Could not deduce diagnostic argument for Attr subjects");
3442 return "";
3443 }
3444
3445 // FIXME: this is not particularly good for localization purposes and ideally
3446 // should be part of the diagnostics engine itself with some sort of list
3447 // specifier.
3448
3449 // A single member of the list can be returned directly.
3450 if (DiagList.size() == 1)
3451 return '"' + DiagList.front() + '"';
3452
3453 if (DiagList.size() == 2)
3454 return '"' + DiagList[0] + " and " + DiagList[1] + '"';
3455
3456 // If there are more than two in the list, we serialize the first N - 1
3457 // elements with a comma. This leaves the string in the state: foo, bar,
3458 // baz (but misses quux). We can then add ", and " for the last element
3459 // manually.
3460 std::string Diag = llvm::join(DiagList.begin(), DiagList.end() - 1, ", ");
3461 return '"' + Diag + ", and " + *(DiagList.end() - 1) + '"';
3462 }
3463
GetSubjectWithSuffix(const Record * R)3464 static std::string GetSubjectWithSuffix(const Record *R) {
3465 const std::string &B = std::string(R->getName());
3466 if (B == "DeclBase")
3467 return "Decl";
3468 return B + "Decl";
3469 }
3470
functionNameForCustomAppertainsTo(const Record & Subject)3471 static std::string functionNameForCustomAppertainsTo(const Record &Subject) {
3472 return "is" + Subject.getName().str();
3473 }
3474
GenerateCustomAppertainsTo(const Record & Subject,raw_ostream & OS)3475 static void GenerateCustomAppertainsTo(const Record &Subject, raw_ostream &OS) {
3476 std::string FnName = functionNameForCustomAppertainsTo(Subject);
3477
3478 // If this code has already been generated, we don't need to do anything.
3479 static std::set<std::string> CustomSubjectSet;
3480 auto I = CustomSubjectSet.find(FnName);
3481 if (I != CustomSubjectSet.end())
3482 return;
3483
3484 // This only works with non-root Decls.
3485 Record *Base = Subject.getValueAsDef(BaseFieldName);
3486
3487 // Not currently support custom subjects within custom subjects.
3488 if (Base->isSubClassOf("SubsetSubject")) {
3489 PrintFatalError(Subject.getLoc(),
3490 "SubsetSubjects within SubsetSubjects is not supported");
3491 return;
3492 }
3493
3494 OS << "static bool " << FnName << "(const Decl *D) {\n";
3495 OS << " if (const auto *S = dyn_cast<";
3496 OS << GetSubjectWithSuffix(Base);
3497 OS << ">(D))\n";
3498 OS << " return " << Subject.getValueAsString("CheckCode") << ";\n";
3499 OS << " return false;\n";
3500 OS << "}\n\n";
3501
3502 CustomSubjectSet.insert(FnName);
3503 }
3504
GenerateAppertainsTo(const Record & Attr,raw_ostream & OS)3505 static void GenerateAppertainsTo(const Record &Attr, raw_ostream &OS) {
3506 // If the attribute does not contain a Subjects definition, then use the
3507 // default appertainsTo logic.
3508 if (Attr.isValueUnset("Subjects"))
3509 return;
3510
3511 const Record *SubjectObj = Attr.getValueAsDef("Subjects");
3512 std::vector<Record*> Subjects = SubjectObj->getValueAsListOfDefs("Subjects");
3513
3514 // If the list of subjects is empty, it is assumed that the attribute
3515 // appertains to everything.
3516 if (Subjects.empty())
3517 return;
3518
3519 bool Warn = SubjectObj->getValueAsDef("Diag")->getValueAsBit("Warn");
3520
3521 // Otherwise, generate an appertainsTo check specific to this attribute which
3522 // checks all of the given subjects against the Decl passed in.
3523 //
3524 // If D is null, that means the attribute was not applied to a declaration
3525 // at all (for instance because it was applied to a type), or that the caller
3526 // has determined that the check should fail (perhaps prior to the creation
3527 // of the declaration).
3528 OS << "bool diagAppertainsToDecl(Sema &S, ";
3529 OS << "const ParsedAttr &Attr, const Decl *D) const override {\n";
3530 OS << " if (";
3531 for (auto I = Subjects.begin(), E = Subjects.end(); I != E; ++I) {
3532 // If the subject has custom code associated with it, use the generated
3533 // function for it. The function cannot be inlined into this check (yet)
3534 // because it requires the subject to be of a specific type, and were that
3535 // information inlined here, it would not support an attribute with multiple
3536 // custom subjects.
3537 if ((*I)->isSubClassOf("SubsetSubject")) {
3538 OS << "!" << functionNameForCustomAppertainsTo(**I) << "(D)";
3539 } else {
3540 OS << "!isa<" << GetSubjectWithSuffix(*I) << ">(D)";
3541 }
3542
3543 if (I + 1 != E)
3544 OS << " && ";
3545 }
3546 OS << ") {\n";
3547 OS << " S.Diag(Attr.getLoc(), diag::";
3548 OS << (Warn ? "warn_attribute_wrong_decl_type_str" :
3549 "err_attribute_wrong_decl_type_str");
3550 OS << ")\n";
3551 OS << " << Attr << ";
3552 OS << CalculateDiagnostic(*SubjectObj) << ";\n";
3553 OS << " return false;\n";
3554 OS << " }\n";
3555 OS << " return true;\n";
3556 OS << "}\n\n";
3557 }
3558
3559 static void
emitAttributeMatchRules(PragmaClangAttributeSupport & PragmaAttributeSupport,raw_ostream & OS)3560 emitAttributeMatchRules(PragmaClangAttributeSupport &PragmaAttributeSupport,
3561 raw_ostream &OS) {
3562 OS << "static bool checkAttributeMatchRuleAppliesTo(const Decl *D, "
3563 << AttributeSubjectMatchRule::EnumName << " rule) {\n";
3564 OS << " switch (rule) {\n";
3565 for (const auto &Rule : PragmaAttributeSupport.Rules) {
3566 if (Rule.isAbstractRule()) {
3567 OS << " case " << Rule.getEnumValue() << ":\n";
3568 OS << " assert(false && \"Abstract matcher rule isn't allowed\");\n";
3569 OS << " return false;\n";
3570 continue;
3571 }
3572 std::vector<Record *> Subjects = Rule.getSubjects();
3573 assert(!Subjects.empty() && "Missing subjects");
3574 OS << " case " << Rule.getEnumValue() << ":\n";
3575 OS << " return ";
3576 for (auto I = Subjects.begin(), E = Subjects.end(); I != E; ++I) {
3577 // If the subject has custom code associated with it, use the function
3578 // that was generated for GenerateAppertainsTo to check if the declaration
3579 // is valid.
3580 if ((*I)->isSubClassOf("SubsetSubject"))
3581 OS << functionNameForCustomAppertainsTo(**I) << "(D)";
3582 else
3583 OS << "isa<" << GetSubjectWithSuffix(*I) << ">(D)";
3584
3585 if (I + 1 != E)
3586 OS << " || ";
3587 }
3588 OS << ";\n";
3589 }
3590 OS << " }\n";
3591 OS << " llvm_unreachable(\"Invalid match rule\");\nreturn false;\n";
3592 OS << "}\n\n";
3593 }
3594
GenerateLangOptRequirements(const Record & R,raw_ostream & OS)3595 static void GenerateLangOptRequirements(const Record &R,
3596 raw_ostream &OS) {
3597 // If the attribute has an empty or unset list of language requirements,
3598 // use the default handler.
3599 std::vector<Record *> LangOpts = R.getValueAsListOfDefs("LangOpts");
3600 if (LangOpts.empty())
3601 return;
3602
3603 OS << "bool diagLangOpts(Sema &S, const ParsedAttr &Attr) ";
3604 OS << "const override {\n";
3605 OS << " auto &LangOpts = S.LangOpts;\n";
3606 OS << " if (" << GenerateTestExpression(LangOpts) << ")\n";
3607 OS << " return true;\n\n";
3608 OS << " S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) ";
3609 OS << "<< Attr;\n";
3610 OS << " return false;\n";
3611 OS << "}\n\n";
3612 }
3613
GenerateTargetRequirements(const Record & Attr,const ParsedAttrMap & Dupes,raw_ostream & OS)3614 static void GenerateTargetRequirements(const Record &Attr,
3615 const ParsedAttrMap &Dupes,
3616 raw_ostream &OS) {
3617 // If the attribute is not a target specific attribute, use the default
3618 // target handler.
3619 if (!Attr.isSubClassOf("TargetSpecificAttr"))
3620 return;
3621
3622 // Get the list of architectures to be tested for.
3623 const Record *R = Attr.getValueAsDef("Target");
3624 std::vector<StringRef> Arches = R->getValueAsListOfStrings("Arches");
3625
3626 // If there are other attributes which share the same parsed attribute kind,
3627 // such as target-specific attributes with a shared spelling, collapse the
3628 // duplicate architectures. This is required because a shared target-specific
3629 // attribute has only one ParsedAttr::Kind enumeration value, but it
3630 // applies to multiple target architectures. In order for the attribute to be
3631 // considered valid, all of its architectures need to be included.
3632 if (!Attr.isValueUnset("ParseKind")) {
3633 const StringRef APK = Attr.getValueAsString("ParseKind");
3634 for (const auto &I : Dupes) {
3635 if (I.first == APK) {
3636 std::vector<StringRef> DA =
3637 I.second->getValueAsDef("Target")->getValueAsListOfStrings(
3638 "Arches");
3639 Arches.insert(Arches.end(), DA.begin(), DA.end());
3640 }
3641 }
3642 }
3643
3644 std::string FnName = "isTarget";
3645 std::string Test;
3646 bool UsesT = GenerateTargetSpecificAttrChecks(R, Arches, Test, &FnName);
3647
3648 OS << "bool existsInTarget(const TargetInfo &Target) const override {\n";
3649 if (UsesT)
3650 OS << " const llvm::Triple &T = Target.getTriple(); (void)T;\n";
3651 OS << " return " << Test << ";\n";
3652 OS << "}\n\n";
3653 }
3654
GenerateSpellingIndexToSemanticSpelling(const Record & Attr,raw_ostream & OS)3655 static void GenerateSpellingIndexToSemanticSpelling(const Record &Attr,
3656 raw_ostream &OS) {
3657 // If the attribute does not have a semantic form, we can bail out early.
3658 if (!Attr.getValueAsBit("ASTNode"))
3659 return;
3660
3661 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
3662
3663 // If there are zero or one spellings, or all of the spellings share the same
3664 // name, we can also bail out early.
3665 if (Spellings.size() <= 1 || SpellingNamesAreCommon(Spellings))
3666 return;
3667
3668 // Generate the enumeration we will use for the mapping.
3669 SemanticSpellingMap SemanticToSyntacticMap;
3670 std::string Enum = CreateSemanticSpellings(Spellings, SemanticToSyntacticMap);
3671 std::string Name = Attr.getName().str() + "AttrSpellingMap";
3672
3673 OS << "unsigned spellingIndexToSemanticSpelling(";
3674 OS << "const ParsedAttr &Attr) const override {\n";
3675 OS << Enum;
3676 OS << " unsigned Idx = Attr.getAttributeSpellingListIndex();\n";
3677 WriteSemanticSpellingSwitch("Idx", SemanticToSyntacticMap, OS);
3678 OS << "}\n\n";
3679 }
3680
GenerateHandleDeclAttribute(const Record & Attr,raw_ostream & OS)3681 static void GenerateHandleDeclAttribute(const Record &Attr, raw_ostream &OS) {
3682 // Only generate if Attr can be handled simply.
3683 if (!Attr.getValueAsBit("SimpleHandler"))
3684 return;
3685
3686 // Generate a function which just converts from ParsedAttr to the Attr type.
3687 OS << "AttrHandling handleDeclAttribute(Sema &S, Decl *D,";
3688 OS << "const ParsedAttr &Attr) const override {\n";
3689 OS << " D->addAttr(::new (S.Context) " << Attr.getName();
3690 OS << "Attr(S.Context, Attr));\n";
3691 OS << " return AttributeApplied;\n";
3692 OS << "}\n\n";
3693 }
3694
IsKnownToGCC(const Record & Attr)3695 static bool IsKnownToGCC(const Record &Attr) {
3696 // Look at the spellings for this subject; if there are any spellings which
3697 // claim to be known to GCC, the attribute is known to GCC.
3698 return llvm::any_of(
3699 GetFlattenedSpellings(Attr),
3700 [](const FlattenedSpelling &S) { return S.knownToGCC(); });
3701 }
3702
3703 /// Emits the parsed attribute helpers
EmitClangAttrParsedAttrImpl(RecordKeeper & Records,raw_ostream & OS)3704 void EmitClangAttrParsedAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
3705 emitSourceFileHeader("Parsed attribute helpers", OS);
3706
3707 PragmaClangAttributeSupport &PragmaAttributeSupport =
3708 getPragmaAttributeSupport(Records);
3709
3710 // Get the list of parsed attributes, and accept the optional list of
3711 // duplicates due to the ParseKind.
3712 ParsedAttrMap Dupes;
3713 ParsedAttrMap Attrs = getParsedAttrList(Records, &Dupes);
3714
3715 // Generate all of the custom appertainsTo functions that the attributes
3716 // will be using.
3717 for (auto I : Attrs) {
3718 const Record &Attr = *I.second;
3719 if (Attr.isValueUnset("Subjects"))
3720 continue;
3721 const Record *SubjectObj = Attr.getValueAsDef("Subjects");
3722 for (auto Subject : SubjectObj->getValueAsListOfDefs("Subjects"))
3723 if (Subject->isSubClassOf("SubsetSubject"))
3724 GenerateCustomAppertainsTo(*Subject, OS);
3725 }
3726
3727 // Generate a ParsedAttrInfo struct for each of the attributes.
3728 for (auto I = Attrs.begin(), E = Attrs.end(); I != E; ++I) {
3729 // TODO: If the attribute's kind appears in the list of duplicates, that is
3730 // because it is a target-specific attribute that appears multiple times.
3731 // It would be beneficial to test whether the duplicates are "similar
3732 // enough" to each other to not cause problems. For instance, check that
3733 // the spellings are identical, and custom parsing rules match, etc.
3734
3735 // We need to generate struct instances based off ParsedAttrInfo from
3736 // ParsedAttr.cpp.
3737 const std::string &AttrName = I->first;
3738 const Record &Attr = *I->second;
3739 auto Spellings = GetFlattenedSpellings(Attr);
3740 if (!Spellings.empty()) {
3741 OS << "static constexpr ParsedAttrInfo::Spelling " << I->first
3742 << "Spellings[] = {\n";
3743 for (const auto &S : Spellings) {
3744 const std::string &RawSpelling = S.name();
3745 std::string Spelling;
3746 if (!S.nameSpace().empty())
3747 Spelling += S.nameSpace() + "::";
3748 if (S.variety() == "GNU")
3749 Spelling += NormalizeGNUAttrSpelling(RawSpelling);
3750 else
3751 Spelling += RawSpelling;
3752 OS << " {AttributeCommonInfo::AS_" << S.variety();
3753 OS << ", \"" << Spelling << "\"},\n";
3754 }
3755 OS << "};\n";
3756 }
3757 OS << "struct ParsedAttrInfo" << I->first
3758 << " final : public ParsedAttrInfo {\n";
3759 OS << " ParsedAttrInfo" << I->first << "() {\n";
3760 OS << " AttrKind = ParsedAttr::AT_" << AttrName << ";\n";
3761 emitArgInfo(Attr, OS);
3762 OS << " HasCustomParsing = ";
3763 OS << Attr.getValueAsBit("HasCustomParsing") << ";\n";
3764 OS << " IsTargetSpecific = ";
3765 OS << Attr.isSubClassOf("TargetSpecificAttr") << ";\n";
3766 OS << " IsType = ";
3767 OS << (Attr.isSubClassOf("TypeAttr") ||
3768 Attr.isSubClassOf("DeclOrTypeAttr")) << ";\n";
3769 OS << " IsStmt = ";
3770 OS << Attr.isSubClassOf("StmtAttr") << ";\n";
3771 OS << " IsKnownToGCC = ";
3772 OS << IsKnownToGCC(Attr) << ";\n";
3773 OS << " IsSupportedByPragmaAttribute = ";
3774 OS << PragmaAttributeSupport.isAttributedSupported(*I->second) << ";\n";
3775 if (!Spellings.empty())
3776 OS << " Spellings = " << I->first << "Spellings;\n";
3777 OS << " }\n";
3778 GenerateAppertainsTo(Attr, OS);
3779 GenerateLangOptRequirements(Attr, OS);
3780 GenerateTargetRequirements(Attr, Dupes, OS);
3781 GenerateSpellingIndexToSemanticSpelling(Attr, OS);
3782 PragmaAttributeSupport.generateStrictConformsTo(*I->second, OS);
3783 GenerateHandleDeclAttribute(Attr, OS);
3784 OS << "static const ParsedAttrInfo" << I->first << " Instance;\n";
3785 OS << "};\n";
3786 OS << "const ParsedAttrInfo" << I->first << " ParsedAttrInfo" << I->first
3787 << "::Instance;\n";
3788 }
3789
3790 OS << "static const ParsedAttrInfo *AttrInfoMap[] = {\n";
3791 for (auto I = Attrs.begin(), E = Attrs.end(); I != E; ++I) {
3792 OS << "&ParsedAttrInfo" << I->first << "::Instance,\n";
3793 }
3794 OS << "};\n\n";
3795
3796 // Generate the attribute match rules.
3797 emitAttributeMatchRules(PragmaAttributeSupport, OS);
3798 }
3799
3800 // Emits the kind list of parsed attributes
EmitClangAttrParsedAttrKinds(RecordKeeper & Records,raw_ostream & OS)3801 void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream &OS) {
3802 emitSourceFileHeader("Attribute name matcher", OS);
3803
3804 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
3805 std::vector<StringMatcher::StringPair> GNU, Declspec, Microsoft, CXX11,
3806 Keywords, Pragma, C2x;
3807 std::set<std::string> Seen;
3808 for (const auto *A : Attrs) {
3809 const Record &Attr = *A;
3810
3811 bool SemaHandler = Attr.getValueAsBit("SemaHandler");
3812 bool Ignored = Attr.getValueAsBit("Ignored");
3813 if (SemaHandler || Ignored) {
3814 // Attribute spellings can be shared between target-specific attributes,
3815 // and can be shared between syntaxes for the same attribute. For
3816 // instance, an attribute can be spelled GNU<"interrupt"> for an ARM-
3817 // specific attribute, or MSP430-specific attribute. Additionally, an
3818 // attribute can be spelled GNU<"dllexport"> and Declspec<"dllexport">
3819 // for the same semantic attribute. Ultimately, we need to map each of
3820 // these to a single AttributeCommonInfo::Kind value, but the
3821 // StringMatcher class cannot handle duplicate match strings. So we
3822 // generate a list of string to match based on the syntax, and emit
3823 // multiple string matchers depending on the syntax used.
3824 std::string AttrName;
3825 if (Attr.isSubClassOf("TargetSpecificAttr") &&
3826 !Attr.isValueUnset("ParseKind")) {
3827 AttrName = std::string(Attr.getValueAsString("ParseKind"));
3828 if (Seen.find(AttrName) != Seen.end())
3829 continue;
3830 Seen.insert(AttrName);
3831 } else
3832 AttrName = NormalizeAttrName(StringRef(Attr.getName())).str();
3833
3834 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr);
3835 for (const auto &S : Spellings) {
3836 const std::string &RawSpelling = S.name();
3837 std::vector<StringMatcher::StringPair> *Matches = nullptr;
3838 std::string Spelling;
3839 const std::string &Variety = S.variety();
3840 if (Variety == "CXX11") {
3841 Matches = &CXX11;
3842 if (!S.nameSpace().empty())
3843 Spelling += S.nameSpace() + "::";
3844 } else if (Variety == "C2x") {
3845 Matches = &C2x;
3846 if (!S.nameSpace().empty())
3847 Spelling += S.nameSpace() + "::";
3848 } else if (Variety == "GNU")
3849 Matches = &GNU;
3850 else if (Variety == "Declspec")
3851 Matches = &Declspec;
3852 else if (Variety == "Microsoft")
3853 Matches = &Microsoft;
3854 else if (Variety == "Keyword")
3855 Matches = &Keywords;
3856 else if (Variety == "Pragma")
3857 Matches = &Pragma;
3858
3859 assert(Matches && "Unsupported spelling variety found");
3860
3861 if (Variety == "GNU")
3862 Spelling += NormalizeGNUAttrSpelling(RawSpelling);
3863 else
3864 Spelling += RawSpelling;
3865
3866 if (SemaHandler)
3867 Matches->push_back(StringMatcher::StringPair(
3868 Spelling, "return AttributeCommonInfo::AT_" + AttrName + ";"));
3869 else
3870 Matches->push_back(StringMatcher::StringPair(
3871 Spelling, "return AttributeCommonInfo::IgnoredAttribute;"));
3872 }
3873 }
3874 }
3875
3876 OS << "static AttributeCommonInfo::Kind getAttrKind(StringRef Name, ";
3877 OS << "AttributeCommonInfo::Syntax Syntax) {\n";
3878 OS << " if (AttributeCommonInfo::AS_GNU == Syntax) {\n";
3879 StringMatcher("Name", GNU, OS).Emit();
3880 OS << " } else if (AttributeCommonInfo::AS_Declspec == Syntax) {\n";
3881 StringMatcher("Name", Declspec, OS).Emit();
3882 OS << " } else if (AttributeCommonInfo::AS_Microsoft == Syntax) {\n";
3883 StringMatcher("Name", Microsoft, OS).Emit();
3884 OS << " } else if (AttributeCommonInfo::AS_CXX11 == Syntax) {\n";
3885 StringMatcher("Name", CXX11, OS).Emit();
3886 OS << " } else if (AttributeCommonInfo::AS_C2x == Syntax) {\n";
3887 StringMatcher("Name", C2x, OS).Emit();
3888 OS << " } else if (AttributeCommonInfo::AS_Keyword == Syntax || ";
3889 OS << "AttributeCommonInfo::AS_ContextSensitiveKeyword == Syntax) {\n";
3890 StringMatcher("Name", Keywords, OS).Emit();
3891 OS << " } else if (AttributeCommonInfo::AS_Pragma == Syntax) {\n";
3892 StringMatcher("Name", Pragma, OS).Emit();
3893 OS << " }\n";
3894 OS << " return AttributeCommonInfo::UnknownAttribute;\n"
3895 << "}\n";
3896 }
3897
3898 // Emits the code to dump an attribute.
EmitClangAttrTextNodeDump(RecordKeeper & Records,raw_ostream & OS)3899 void EmitClangAttrTextNodeDump(RecordKeeper &Records, raw_ostream &OS) {
3900 emitSourceFileHeader("Attribute text node dumper", OS);
3901
3902 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args;
3903 for (const auto *Attr : Attrs) {
3904 const Record &R = *Attr;
3905 if (!R.getValueAsBit("ASTNode"))
3906 continue;
3907
3908 // If the attribute has a semantically-meaningful name (which is determined
3909 // by whether there is a Spelling enumeration for it), then write out the
3910 // spelling used for the attribute.
3911
3912 std::string FunctionContent;
3913 llvm::raw_string_ostream SS(FunctionContent);
3914
3915 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R);
3916 if (Spellings.size() > 1 && !SpellingNamesAreCommon(Spellings))
3917 SS << " OS << \" \" << A->getSpelling();\n";
3918
3919 Args = R.getValueAsListOfDefs("Args");
3920 for (const auto *Arg : Args)
3921 createArgument(*Arg, R.getName())->writeDump(SS);
3922
3923 if (SS.tell()) {
3924 OS << " void Visit" << R.getName() << "Attr(const " << R.getName()
3925 << "Attr *A) {\n";
3926 if (!Args.empty())
3927 OS << " const auto *SA = cast<" << R.getName()
3928 << "Attr>(A); (void)SA;\n";
3929 OS << SS.str();
3930 OS << " }\n";
3931 }
3932 }
3933 }
3934
EmitClangAttrNodeTraverse(RecordKeeper & Records,raw_ostream & OS)3935 void EmitClangAttrNodeTraverse(RecordKeeper &Records, raw_ostream &OS) {
3936 emitSourceFileHeader("Attribute text node traverser", OS);
3937
3938 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"), Args;
3939 for (const auto *Attr : Attrs) {
3940 const Record &R = *Attr;
3941 if (!R.getValueAsBit("ASTNode"))
3942 continue;
3943
3944 std::string FunctionContent;
3945 llvm::raw_string_ostream SS(FunctionContent);
3946
3947 Args = R.getValueAsListOfDefs("Args");
3948 for (const auto *Arg : Args)
3949 createArgument(*Arg, R.getName())->writeDumpChildren(SS);
3950 if (SS.tell()) {
3951 OS << " void Visit" << R.getName() << "Attr(const " << R.getName()
3952 << "Attr *A) {\n";
3953 if (!Args.empty())
3954 OS << " const auto *SA = cast<" << R.getName()
3955 << "Attr>(A); (void)SA;\n";
3956 OS << SS.str();
3957 OS << " }\n";
3958 }
3959 }
3960 }
3961
EmitClangAttrParserStringSwitches(RecordKeeper & Records,raw_ostream & OS)3962 void EmitClangAttrParserStringSwitches(RecordKeeper &Records,
3963 raw_ostream &OS) {
3964 emitSourceFileHeader("Parser-related llvm::StringSwitch cases", OS);
3965 emitClangAttrArgContextList(Records, OS);
3966 emitClangAttrIdentifierArgList(Records, OS);
3967 emitClangAttrVariadicIdentifierArgList(Records, OS);
3968 emitClangAttrThisIsaIdentifierArgList(Records, OS);
3969 emitClangAttrTypeArgList(Records, OS);
3970 emitClangAttrLateParsedList(Records, OS);
3971 }
3972
EmitClangAttrSubjectMatchRulesParserStringSwitches(RecordKeeper & Records,raw_ostream & OS)3973 void EmitClangAttrSubjectMatchRulesParserStringSwitches(RecordKeeper &Records,
3974 raw_ostream &OS) {
3975 getPragmaAttributeSupport(Records).generateParsingHelpers(OS);
3976 }
3977
3978 enum class SpellingKind {
3979 GNU,
3980 CXX11,
3981 C2x,
3982 Declspec,
3983 Microsoft,
3984 Keyword,
3985 Pragma,
3986 };
3987 static const size_t NumSpellingKinds = (size_t)SpellingKind::Pragma + 1;
3988
3989 class SpellingList {
3990 std::vector<std::string> Spellings[NumSpellingKinds];
3991
3992 public:
operator [](SpellingKind K) const3993 ArrayRef<std::string> operator[](SpellingKind K) const {
3994 return Spellings[(size_t)K];
3995 }
3996
add(const Record & Attr,FlattenedSpelling Spelling)3997 void add(const Record &Attr, FlattenedSpelling Spelling) {
3998 SpellingKind Kind = StringSwitch<SpellingKind>(Spelling.variety())
3999 .Case("GNU", SpellingKind::GNU)
4000 .Case("CXX11", SpellingKind::CXX11)
4001 .Case("C2x", SpellingKind::C2x)
4002 .Case("Declspec", SpellingKind::Declspec)
4003 .Case("Microsoft", SpellingKind::Microsoft)
4004 .Case("Keyword", SpellingKind::Keyword)
4005 .Case("Pragma", SpellingKind::Pragma);
4006 std::string Name;
4007 if (!Spelling.nameSpace().empty()) {
4008 switch (Kind) {
4009 case SpellingKind::CXX11:
4010 case SpellingKind::C2x:
4011 Name = Spelling.nameSpace() + "::";
4012 break;
4013 case SpellingKind::Pragma:
4014 Name = Spelling.nameSpace() + " ";
4015 break;
4016 default:
4017 PrintFatalError(Attr.getLoc(), "Unexpected namespace in spelling");
4018 }
4019 }
4020 Name += Spelling.name();
4021
4022 Spellings[(size_t)Kind].push_back(Name);
4023 }
4024 };
4025
4026 class DocumentationData {
4027 public:
4028 const Record *Documentation;
4029 const Record *Attribute;
4030 std::string Heading;
4031 SpellingList SupportedSpellings;
4032
DocumentationData(const Record & Documentation,const Record & Attribute,std::pair<std::string,SpellingList> HeadingAndSpellings)4033 DocumentationData(const Record &Documentation, const Record &Attribute,
4034 std::pair<std::string, SpellingList> HeadingAndSpellings)
4035 : Documentation(&Documentation), Attribute(&Attribute),
4036 Heading(std::move(HeadingAndSpellings.first)),
4037 SupportedSpellings(std::move(HeadingAndSpellings.second)) {}
4038 };
4039
WriteCategoryHeader(const Record * DocCategory,raw_ostream & OS)4040 static void WriteCategoryHeader(const Record *DocCategory,
4041 raw_ostream &OS) {
4042 const StringRef Name = DocCategory->getValueAsString("Name");
4043 OS << Name << "\n" << std::string(Name.size(), '=') << "\n";
4044
4045 // If there is content, print that as well.
4046 const StringRef ContentStr = DocCategory->getValueAsString("Content");
4047 // Trim leading and trailing newlines and spaces.
4048 OS << ContentStr.trim();
4049
4050 OS << "\n\n";
4051 }
4052
4053 static std::pair<std::string, SpellingList>
GetAttributeHeadingAndSpellings(const Record & Documentation,const Record & Attribute)4054 GetAttributeHeadingAndSpellings(const Record &Documentation,
4055 const Record &Attribute) {
4056 // FIXME: there is no way to have a per-spelling category for the attribute
4057 // documentation. This may not be a limiting factor since the spellings
4058 // should generally be consistently applied across the category.
4059
4060 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attribute);
4061 if (Spellings.empty())
4062 PrintFatalError(Attribute.getLoc(),
4063 "Attribute has no supported spellings; cannot be "
4064 "documented");
4065
4066 // Determine the heading to be used for this attribute.
4067 std::string Heading = std::string(Documentation.getValueAsString("Heading"));
4068 if (Heading.empty()) {
4069 // If there's only one spelling, we can simply use that.
4070 if (Spellings.size() == 1)
4071 Heading = Spellings.begin()->name();
4072 else {
4073 std::set<std::string> Uniques;
4074 for (auto I = Spellings.begin(), E = Spellings.end();
4075 I != E && Uniques.size() <= 1; ++I) {
4076 std::string Spelling =
4077 std::string(NormalizeNameForSpellingComparison(I->name()));
4078 Uniques.insert(Spelling);
4079 }
4080 // If the semantic map has only one spelling, that is sufficient for our
4081 // needs.
4082 if (Uniques.size() == 1)
4083 Heading = *Uniques.begin();
4084 }
4085 }
4086
4087 // If the heading is still empty, it is an error.
4088 if (Heading.empty())
4089 PrintFatalError(Attribute.getLoc(),
4090 "This attribute requires a heading to be specified");
4091
4092 SpellingList SupportedSpellings;
4093 for (const auto &I : Spellings)
4094 SupportedSpellings.add(Attribute, I);
4095
4096 return std::make_pair(std::move(Heading), std::move(SupportedSpellings));
4097 }
4098
WriteDocumentation(RecordKeeper & Records,const DocumentationData & Doc,raw_ostream & OS)4099 static void WriteDocumentation(RecordKeeper &Records,
4100 const DocumentationData &Doc, raw_ostream &OS) {
4101 OS << Doc.Heading << "\n" << std::string(Doc.Heading.length(), '-') << "\n";
4102
4103 // List what spelling syntaxes the attribute supports.
4104 OS << ".. csv-table:: Supported Syntaxes\n";
4105 OS << " :header: \"GNU\", \"C++11\", \"C2x\", \"``__declspec``\",";
4106 OS << " \"Keyword\", \"``#pragma``\", \"``#pragma clang attribute``\"\n\n";
4107 OS << " \"";
4108 for (size_t Kind = 0; Kind != NumSpellingKinds; ++Kind) {
4109 SpellingKind K = (SpellingKind)Kind;
4110 // TODO: List Microsoft (IDL-style attribute) spellings once we fully
4111 // support them.
4112 if (K == SpellingKind::Microsoft)
4113 continue;
4114
4115 bool PrintedAny = false;
4116 for (StringRef Spelling : Doc.SupportedSpellings[K]) {
4117 if (PrintedAny)
4118 OS << " |br| ";
4119 OS << "``" << Spelling << "``";
4120 PrintedAny = true;
4121 }
4122
4123 OS << "\",\"";
4124 }
4125
4126 if (getPragmaAttributeSupport(Records).isAttributedSupported(
4127 *Doc.Attribute))
4128 OS << "Yes";
4129 OS << "\"\n\n";
4130
4131 // If the attribute is deprecated, print a message about it, and possibly
4132 // provide a replacement attribute.
4133 if (!Doc.Documentation->isValueUnset("Deprecated")) {
4134 OS << "This attribute has been deprecated, and may be removed in a future "
4135 << "version of Clang.";
4136 const Record &Deprecated = *Doc.Documentation->getValueAsDef("Deprecated");
4137 const StringRef Replacement = Deprecated.getValueAsString("Replacement");
4138 if (!Replacement.empty())
4139 OS << " This attribute has been superseded by ``" << Replacement
4140 << "``.";
4141 OS << "\n\n";
4142 }
4143
4144 const StringRef ContentStr = Doc.Documentation->getValueAsString("Content");
4145 // Trim leading and trailing newlines and spaces.
4146 OS << ContentStr.trim();
4147
4148 OS << "\n\n\n";
4149 }
4150
EmitClangAttrDocs(RecordKeeper & Records,raw_ostream & OS)4151 void EmitClangAttrDocs(RecordKeeper &Records, raw_ostream &OS) {
4152 // Get the documentation introduction paragraph.
4153 const Record *Documentation = Records.getDef("GlobalDocumentation");
4154 if (!Documentation) {
4155 PrintFatalError("The Documentation top-level definition is missing, "
4156 "no documentation will be generated.");
4157 return;
4158 }
4159
4160 OS << Documentation->getValueAsString("Intro") << "\n";
4161
4162 // Gather the Documentation lists from each of the attributes, based on the
4163 // category provided.
4164 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
4165 std::map<const Record *, std::vector<DocumentationData>> SplitDocs;
4166 for (const auto *A : Attrs) {
4167 const Record &Attr = *A;
4168 std::vector<Record *> Docs = Attr.getValueAsListOfDefs("Documentation");
4169 for (const auto *D : Docs) {
4170 const Record &Doc = *D;
4171 const Record *Category = Doc.getValueAsDef("Category");
4172 // If the category is "undocumented", then there cannot be any other
4173 // documentation categories (otherwise, the attribute would become
4174 // documented).
4175 const StringRef Cat = Category->getValueAsString("Name");
4176 bool Undocumented = Cat == "Undocumented";
4177 if (Undocumented && Docs.size() > 1)
4178 PrintFatalError(Doc.getLoc(),
4179 "Attribute is \"Undocumented\", but has multiple "
4180 "documentation categories");
4181
4182 if (!Undocumented)
4183 SplitDocs[Category].push_back(DocumentationData(
4184 Doc, Attr, GetAttributeHeadingAndSpellings(Doc, Attr)));
4185 }
4186 }
4187
4188 // Having split the attributes out based on what documentation goes where,
4189 // we can begin to generate sections of documentation.
4190 for (auto &I : SplitDocs) {
4191 WriteCategoryHeader(I.first, OS);
4192
4193 llvm::sort(I.second,
4194 [](const DocumentationData &D1, const DocumentationData &D2) {
4195 return D1.Heading < D2.Heading;
4196 });
4197
4198 // Walk over each of the attributes in the category and write out their
4199 // documentation.
4200 for (const auto &Doc : I.second)
4201 WriteDocumentation(Records, Doc, OS);
4202 }
4203 }
4204
EmitTestPragmaAttributeSupportedAttributes(RecordKeeper & Records,raw_ostream & OS)4205 void EmitTestPragmaAttributeSupportedAttributes(RecordKeeper &Records,
4206 raw_ostream &OS) {
4207 PragmaClangAttributeSupport Support = getPragmaAttributeSupport(Records);
4208 ParsedAttrMap Attrs = getParsedAttrList(Records);
4209 OS << "#pragma clang attribute supports the following attributes:\n";
4210 for (const auto &I : Attrs) {
4211 if (!Support.isAttributedSupported(*I.second))
4212 continue;
4213 OS << I.first;
4214 if (I.second->isValueUnset("Subjects")) {
4215 OS << " ()\n";
4216 continue;
4217 }
4218 const Record *SubjectObj = I.second->getValueAsDef("Subjects");
4219 std::vector<Record *> Subjects =
4220 SubjectObj->getValueAsListOfDefs("Subjects");
4221 OS << " (";
4222 for (const auto &Subject : llvm::enumerate(Subjects)) {
4223 if (Subject.index())
4224 OS << ", ";
4225 PragmaClangAttributeSupport::RuleOrAggregateRuleSet &RuleSet =
4226 Support.SubjectsToRules.find(Subject.value())->getSecond();
4227 if (RuleSet.isRule()) {
4228 OS << RuleSet.getRule().getEnumValueName();
4229 continue;
4230 }
4231 OS << "(";
4232 for (const auto &Rule : llvm::enumerate(RuleSet.getAggregateRuleSet())) {
4233 if (Rule.index())
4234 OS << ", ";
4235 OS << Rule.value().getEnumValueName();
4236 }
4237 OS << ")";
4238 }
4239 OS << ")\n";
4240 }
4241 OS << "End of supported attributes.\n";
4242 }
4243
4244 } // end namespace clang
4245