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