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