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