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