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 .Default(false); 1391 } 1392 1393 // Emits the first-argument-is-identifier property for attributes. 1394 static void emitClangAttrIdentifierArgList(RecordKeeper &Records, raw_ostream &OS) { 1395 OS << "#if defined(CLANG_ATTR_IDENTIFIER_ARG_LIST)\n"; 1396 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1397 1398 for (const auto *Attr : Attrs) { 1399 // Determine whether the first argument is an identifier. 1400 std::vector<Record *> Args = Attr->getValueAsListOfDefs("Args"); 1401 if (Args.empty() || !isIdentifierArgument(Args[0])) 1402 continue; 1403 1404 // All these spellings take an identifier argument. 1405 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr); 1406 std::set<std::string> Emitted; 1407 for (const auto &S : Spellings) { 1408 if (Emitted.insert(S.name()).second) 1409 OS << ".Case(\"" << S.name() << "\", " << "true" << ")\n"; 1410 } 1411 } 1412 OS << "#endif // CLANG_ATTR_IDENTIFIER_ARG_LIST\n\n"; 1413 } 1414 1415 namespace clang { 1416 1417 // Emits the class definitions for attributes. 1418 void EmitClangAttrClass(RecordKeeper &Records, raw_ostream &OS) { 1419 emitSourceFileHeader("Attribute classes' definitions", OS); 1420 1421 OS << "#ifndef LLVM_CLANG_ATTR_CLASSES_INC\n"; 1422 OS << "#define LLVM_CLANG_ATTR_CLASSES_INC\n\n"; 1423 1424 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1425 1426 for (const auto *Attr : Attrs) { 1427 const Record &R = *Attr; 1428 1429 // FIXME: Currently, documentation is generated as-needed due to the fact 1430 // that there is no way to allow a generated project "reach into" the docs 1431 // directory (for instance, it may be an out-of-tree build). However, we want 1432 // to ensure that every attribute has a Documentation field, and produce an 1433 // error if it has been neglected. Otherwise, the on-demand generation which 1434 // happens server-side will fail. This code is ensuring that functionality, 1435 // even though this Emitter doesn't technically need the documentation. 1436 // When attribute documentation can be generated as part of the build 1437 // itself, this code can be removed. 1438 (void)R.getValueAsListOfDefs("Documentation"); 1439 1440 if (!R.getValueAsBit("ASTNode")) 1441 continue; 1442 1443 const std::vector<Record *> Supers = R.getSuperClasses(); 1444 assert(!Supers.empty() && "Forgot to specify a superclass for the attr"); 1445 std::string SuperName; 1446 for (const auto *Super : llvm::make_range(Supers.rbegin(), Supers.rend())) { 1447 const Record &R = *Super; 1448 if (R.getName() != "TargetSpecificAttr" && SuperName.empty()) 1449 SuperName = R.getName(); 1450 } 1451 1452 OS << "class " << R.getName() << "Attr : public " << SuperName << " {\n"; 1453 1454 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args"); 1455 std::vector<std::unique_ptr<Argument>> Args; 1456 Args.reserve(ArgRecords.size()); 1457 1458 for (const auto *ArgRecord : ArgRecords) { 1459 Args.emplace_back(createArgument(*ArgRecord, R.getName())); 1460 Args.back()->writeDeclarations(OS); 1461 OS << "\n\n"; 1462 } 1463 1464 OS << "\npublic:\n"; 1465 1466 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R); 1467 1468 // If there are zero or one spellings, all spelling-related functionality 1469 // can be elided. If all of the spellings share the same name, the spelling 1470 // functionality can also be elided. 1471 bool ElideSpelling = (Spellings.size() <= 1) || 1472 SpellingNamesAreCommon(Spellings); 1473 1474 // This maps spelling index values to semantic Spelling enumerants. 1475 SemanticSpellingMap SemanticToSyntacticMap; 1476 1477 if (!ElideSpelling) 1478 OS << CreateSemanticSpellings(Spellings, SemanticToSyntacticMap); 1479 1480 OS << " static " << R.getName() << "Attr *CreateImplicit("; 1481 OS << "ASTContext &Ctx"; 1482 if (!ElideSpelling) 1483 OS << ", Spelling S"; 1484 for (auto const &ai : Args) { 1485 OS << ", "; 1486 ai->writeCtorParameters(OS); 1487 } 1488 OS << ", SourceRange Loc = SourceRange()"; 1489 OS << ") {\n"; 1490 OS << " " << R.getName() << "Attr *A = new (Ctx) " << R.getName(); 1491 OS << "Attr(Loc, Ctx, "; 1492 for (auto const &ai : Args) { 1493 ai->writeImplicitCtorArgs(OS); 1494 OS << ", "; 1495 } 1496 OS << (ElideSpelling ? "0" : "S") << ");\n"; 1497 OS << " A->setImplicit(true);\n"; 1498 OS << " return A;\n }\n\n"; 1499 1500 OS << " " << R.getName() << "Attr(SourceRange R, ASTContext &Ctx\n"; 1501 1502 bool HasOpt = false; 1503 for (auto const &ai : Args) { 1504 OS << " , "; 1505 ai->writeCtorParameters(OS); 1506 OS << "\n"; 1507 if (ai->isOptional()) 1508 HasOpt = true; 1509 } 1510 1511 OS << " , "; 1512 OS << "unsigned SI\n"; 1513 1514 OS << " )\n"; 1515 OS << " : " << SuperName << "(attr::" << R.getName() << ", R, SI)\n"; 1516 1517 for (auto const &ai : Args) { 1518 OS << " , "; 1519 ai->writeCtorInitializers(OS); 1520 OS << "\n"; 1521 } 1522 1523 OS << " {\n"; 1524 1525 for (auto const &ai : Args) { 1526 ai->writeCtorBody(OS); 1527 OS << "\n"; 1528 } 1529 OS << " }\n\n"; 1530 1531 // If there are optional arguments, write out a constructor that elides the 1532 // optional arguments as well. 1533 if (HasOpt) { 1534 OS << " " << R.getName() << "Attr(SourceRange R, ASTContext &Ctx\n"; 1535 for (auto const &ai : Args) { 1536 if (!ai->isOptional()) { 1537 OS << " , "; 1538 ai->writeCtorParameters(OS); 1539 OS << "\n"; 1540 } 1541 } 1542 1543 OS << " , "; 1544 OS << "unsigned SI\n"; 1545 1546 OS << " )\n"; 1547 OS << " : " << SuperName << "(attr::" << R.getName() << ", R, SI)\n"; 1548 1549 for (auto const &ai : Args) { 1550 OS << " , "; 1551 ai->writeCtorDefaultInitializers(OS); 1552 OS << "\n"; 1553 } 1554 1555 OS << " {\n"; 1556 1557 for (auto const &ai : Args) { 1558 if (!ai->isOptional()) { 1559 ai->writeCtorBody(OS); 1560 OS << "\n"; 1561 } 1562 } 1563 OS << " }\n\n"; 1564 } 1565 1566 OS << " " << R.getName() << "Attr *clone(ASTContext &C) const override;\n"; 1567 OS << " void printPretty(raw_ostream &OS,\n" 1568 << " const PrintingPolicy &Policy) const override;\n"; 1569 OS << " const char *getSpelling() const override;\n"; 1570 1571 if (!ElideSpelling) { 1572 assert(!SemanticToSyntacticMap.empty() && "Empty semantic mapping list"); 1573 OS << " Spelling getSemanticSpelling() const {\n"; 1574 WriteSemanticSpellingSwitch("SpellingListIndex", SemanticToSyntacticMap, 1575 OS); 1576 OS << " }\n"; 1577 } 1578 1579 writeAttrAccessorDefinition(R, OS); 1580 1581 for (auto const &ai : Args) { 1582 ai->writeAccessors(OS); 1583 OS << "\n\n"; 1584 1585 if (ai->isEnumArg()) 1586 static_cast<const EnumArgument *>(ai.get())->writeConversion(OS); 1587 else if (ai->isVariadicEnumArg()) 1588 static_cast<const VariadicEnumArgument *>(ai.get()) 1589 ->writeConversion(OS); 1590 } 1591 1592 OS << R.getValueAsString("AdditionalMembers"); 1593 OS << "\n\n"; 1594 1595 OS << " static bool classof(const Attr *A) { return A->getKind() == " 1596 << "attr::" << R.getName() << "; }\n"; 1597 1598 bool LateParsed = R.getValueAsBit("LateParsed"); 1599 OS << " bool isLateParsed() const override { return " 1600 << LateParsed << "; }\n"; 1601 1602 if (R.getValueAsBit("DuplicatesAllowedWhileMerging")) 1603 OS << " bool duplicatesAllowed() const override { return true; }\n\n"; 1604 1605 OS << "};\n\n"; 1606 } 1607 1608 OS << "#endif\n"; 1609 } 1610 1611 // Emits the class method definitions for attributes. 1612 void EmitClangAttrImpl(RecordKeeper &Records, raw_ostream &OS) { 1613 emitSourceFileHeader("Attribute classes' member function definitions", OS); 1614 1615 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1616 1617 for (auto *Attr : Attrs) { 1618 Record &R = *Attr; 1619 1620 if (!R.getValueAsBit("ASTNode")) 1621 continue; 1622 1623 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args"); 1624 std::vector<std::unique_ptr<Argument>> Args; 1625 for (const auto *Arg : ArgRecords) 1626 Args.emplace_back(createArgument(*Arg, R.getName())); 1627 1628 for (auto const &ai : Args) 1629 ai->writeAccessorDefinitions(OS); 1630 1631 OS << R.getName() << "Attr *" << R.getName() 1632 << "Attr::clone(ASTContext &C) const {\n"; 1633 OS << " auto *A = new (C) " << R.getName() << "Attr(getLocation(), C"; 1634 for (auto const &ai : Args) { 1635 OS << ", "; 1636 ai->writeCloneArgs(OS); 1637 } 1638 OS << ", getSpellingListIndex());\n"; 1639 OS << " A->Inherited = Inherited;\n"; 1640 OS << " A->IsPackExpansion = IsPackExpansion;\n"; 1641 OS << " A->Implicit = Implicit;\n"; 1642 OS << " return A;\n}\n\n"; 1643 1644 writePrettyPrintFunction(R, Args, OS); 1645 writeGetSpellingFunction(R, OS); 1646 } 1647 } 1648 1649 } // end namespace clang 1650 1651 static void EmitAttrList(raw_ostream &OS, StringRef Class, 1652 const std::vector<Record*> &AttrList) { 1653 std::vector<Record*>::const_iterator i = AttrList.begin(), e = AttrList.end(); 1654 1655 if (i != e) { 1656 // Move the end iterator back to emit the last attribute. 1657 for(--e; i != e; ++i) { 1658 if (!(*i)->getValueAsBit("ASTNode")) 1659 continue; 1660 1661 OS << Class << "(" << (*i)->getName() << ")\n"; 1662 } 1663 1664 OS << "LAST_" << Class << "(" << (*i)->getName() << ")\n\n"; 1665 } 1666 } 1667 1668 // Determines if an attribute has a Pragma spelling. 1669 static bool AttrHasPragmaSpelling(const Record *R) { 1670 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*R); 1671 return std::find_if(Spellings.begin(), Spellings.end(), 1672 [](const FlattenedSpelling &S) { 1673 return S.variety() == "Pragma"; 1674 }) != Spellings.end(); 1675 } 1676 1677 namespace clang { 1678 // Emits the enumeration list for attributes. 1679 void EmitClangAttrList(RecordKeeper &Records, raw_ostream &OS) { 1680 emitSourceFileHeader("List of all attributes that Clang recognizes", OS); 1681 1682 OS << "#ifndef LAST_ATTR\n"; 1683 OS << "#define LAST_ATTR(NAME) ATTR(NAME)\n"; 1684 OS << "#endif\n\n"; 1685 1686 OS << "#ifndef INHERITABLE_ATTR\n"; 1687 OS << "#define INHERITABLE_ATTR(NAME) ATTR(NAME)\n"; 1688 OS << "#endif\n\n"; 1689 1690 OS << "#ifndef LAST_INHERITABLE_ATTR\n"; 1691 OS << "#define LAST_INHERITABLE_ATTR(NAME) INHERITABLE_ATTR(NAME)\n"; 1692 OS << "#endif\n\n"; 1693 1694 OS << "#ifndef INHERITABLE_PARAM_ATTR\n"; 1695 OS << "#define INHERITABLE_PARAM_ATTR(NAME) ATTR(NAME)\n"; 1696 OS << "#endif\n\n"; 1697 1698 OS << "#ifndef LAST_INHERITABLE_PARAM_ATTR\n"; 1699 OS << "#define LAST_INHERITABLE_PARAM_ATTR(NAME)" 1700 " INHERITABLE_PARAM_ATTR(NAME)\n"; 1701 OS << "#endif\n\n"; 1702 1703 OS << "#ifndef PRAGMA_SPELLING_ATTR\n"; 1704 OS << "#define PRAGMA_SPELLING_ATTR(NAME)\n"; 1705 OS << "#endif\n\n"; 1706 1707 OS << "#ifndef LAST_PRAGMA_SPELLING_ATTR\n"; 1708 OS << "#define LAST_PRAGMA_SPELLING_ATTR(NAME) PRAGMA_SPELLING_ATTR(NAME)\n"; 1709 OS << "#endif\n\n"; 1710 1711 Record *InhClass = Records.getClass("InheritableAttr"); 1712 Record *InhParamClass = Records.getClass("InheritableParamAttr"); 1713 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"), 1714 NonInhAttrs, InhAttrs, InhParamAttrs, PragmaAttrs; 1715 for (auto *Attr : Attrs) { 1716 if (!Attr->getValueAsBit("ASTNode")) 1717 continue; 1718 1719 if (AttrHasPragmaSpelling(Attr)) 1720 PragmaAttrs.push_back(Attr); 1721 1722 if (Attr->isSubClassOf(InhParamClass)) 1723 InhParamAttrs.push_back(Attr); 1724 else if (Attr->isSubClassOf(InhClass)) 1725 InhAttrs.push_back(Attr); 1726 else 1727 NonInhAttrs.push_back(Attr); 1728 } 1729 1730 EmitAttrList(OS, "PRAGMA_SPELLING_ATTR", PragmaAttrs); 1731 EmitAttrList(OS, "INHERITABLE_PARAM_ATTR", InhParamAttrs); 1732 EmitAttrList(OS, "INHERITABLE_ATTR", InhAttrs); 1733 EmitAttrList(OS, "ATTR", NonInhAttrs); 1734 1735 OS << "#undef LAST_ATTR\n"; 1736 OS << "#undef INHERITABLE_ATTR\n"; 1737 OS << "#undef LAST_INHERITABLE_ATTR\n"; 1738 OS << "#undef LAST_INHERITABLE_PARAM_ATTR\n"; 1739 OS << "#undef LAST_PRAGMA_ATTR\n"; 1740 OS << "#undef PRAGMA_SPELLING_ATTR\n"; 1741 OS << "#undef ATTR\n"; 1742 } 1743 1744 // Emits the code to read an attribute from a precompiled header. 1745 void EmitClangAttrPCHRead(RecordKeeper &Records, raw_ostream &OS) { 1746 emitSourceFileHeader("Attribute deserialization code", OS); 1747 1748 Record *InhClass = Records.getClass("InheritableAttr"); 1749 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), 1750 ArgRecords; 1751 std::vector<std::unique_ptr<Argument>> Args; 1752 1753 OS << " switch (Kind) {\n"; 1754 OS << " default:\n"; 1755 OS << " llvm_unreachable(\"Unknown attribute!\");\n"; 1756 for (const auto *Attr : Attrs) { 1757 const Record &R = *Attr; 1758 if (!R.getValueAsBit("ASTNode")) 1759 continue; 1760 1761 OS << " case attr::" << R.getName() << ": {\n"; 1762 if (R.isSubClassOf(InhClass)) 1763 OS << " bool isInherited = Record[Idx++];\n"; 1764 OS << " bool isImplicit = Record[Idx++];\n"; 1765 OS << " unsigned Spelling = Record[Idx++];\n"; 1766 ArgRecords = R.getValueAsListOfDefs("Args"); 1767 Args.clear(); 1768 for (const auto *Arg : ArgRecords) { 1769 Args.emplace_back(createArgument(*Arg, R.getName())); 1770 Args.back()->writePCHReadDecls(OS); 1771 } 1772 OS << " New = new (Context) " << R.getName() << "Attr(Range, Context"; 1773 for (auto const &ri : Args) { 1774 OS << ", "; 1775 ri->writePCHReadArgs(OS); 1776 } 1777 OS << ", Spelling);\n"; 1778 if (R.isSubClassOf(InhClass)) 1779 OS << " cast<InheritableAttr>(New)->setInherited(isInherited);\n"; 1780 OS << " New->setImplicit(isImplicit);\n"; 1781 OS << " break;\n"; 1782 OS << " }\n"; 1783 } 1784 OS << " }\n"; 1785 } 1786 1787 // Emits the code to write an attribute to a precompiled header. 1788 void EmitClangAttrPCHWrite(RecordKeeper &Records, raw_ostream &OS) { 1789 emitSourceFileHeader("Attribute serialization code", OS); 1790 1791 Record *InhClass = Records.getClass("InheritableAttr"); 1792 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args; 1793 1794 OS << " switch (A->getKind()) {\n"; 1795 OS << " default:\n"; 1796 OS << " llvm_unreachable(\"Unknown attribute kind!\");\n"; 1797 OS << " break;\n"; 1798 for (const auto *Attr : Attrs) { 1799 const Record &R = *Attr; 1800 if (!R.getValueAsBit("ASTNode")) 1801 continue; 1802 OS << " case attr::" << R.getName() << ": {\n"; 1803 Args = R.getValueAsListOfDefs("Args"); 1804 if (R.isSubClassOf(InhClass) || !Args.empty()) 1805 OS << " const " << R.getName() << "Attr *SA = cast<" << R.getName() 1806 << "Attr>(A);\n"; 1807 if (R.isSubClassOf(InhClass)) 1808 OS << " Record.push_back(SA->isInherited());\n"; 1809 OS << " Record.push_back(A->isImplicit());\n"; 1810 OS << " Record.push_back(A->getSpellingListIndex());\n"; 1811 1812 for (const auto *Arg : Args) 1813 createArgument(*Arg, R.getName())->writePCHWrite(OS); 1814 OS << " break;\n"; 1815 OS << " }\n"; 1816 } 1817 OS << " }\n"; 1818 } 1819 1820 static void GenerateHasAttrSpellingStringSwitch( 1821 const std::vector<Record *> &Attrs, raw_ostream &OS, 1822 const std::string &Variety = "", const std::string &Scope = "") { 1823 for (const auto *Attr : Attrs) { 1824 // C++11-style attributes have specific version information associated with 1825 // them. If the attribute has no scope, the version information must not 1826 // have the default value (1), as that's incorrect. Instead, the unscoped 1827 // attribute version information should be taken from the SD-6 standing 1828 // document, which can be found at: 1829 // https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations 1830 int Version = 1; 1831 1832 if (Variety == "CXX11") { 1833 std::vector<Record *> Spellings = Attr->getValueAsListOfDefs("Spellings"); 1834 for (const auto &Spelling : Spellings) { 1835 if (Spelling->getValueAsString("Variety") == "CXX11") { 1836 Version = static_cast<int>(Spelling->getValueAsInt("Version")); 1837 if (Scope.empty() && Version == 1) 1838 PrintError(Spelling->getLoc(), "C++ standard attributes must " 1839 "have valid version information."); 1840 break; 1841 } 1842 } 1843 } 1844 1845 // It is assumed that there will be an llvm::Triple object named T within 1846 // scope that can be used to determine whether the attribute exists in 1847 // a given target. 1848 std::string Test; 1849 if (Attr->isSubClassOf("TargetSpecificAttr")) { 1850 const Record *R = Attr->getValueAsDef("Target"); 1851 std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches"); 1852 1853 Test += "("; 1854 for (auto AI = Arches.begin(), AE = Arches.end(); AI != AE; ++AI) { 1855 std::string Part = *AI; 1856 Test += "T.getArch() == llvm::Triple::" + Part; 1857 if (AI + 1 != AE) 1858 Test += " || "; 1859 } 1860 Test += ")"; 1861 1862 std::vector<std::string> OSes; 1863 if (!R->isValueUnset("OSes")) { 1864 Test += " && ("; 1865 std::vector<std::string> OSes = R->getValueAsListOfStrings("OSes"); 1866 for (auto AI = OSes.begin(), AE = OSes.end(); AI != AE; ++AI) { 1867 std::string Part = *AI; 1868 1869 Test += "T.getOS() == llvm::Triple::" + Part; 1870 if (AI + 1 != AE) 1871 Test += " || "; 1872 } 1873 Test += ")"; 1874 } 1875 1876 // If this is the C++11 variety, also add in the LangOpts test. 1877 if (Variety == "CXX11") 1878 Test += " && LangOpts.CPlusPlus11"; 1879 } else if (Variety == "CXX11") 1880 // C++11 mode should be checked against LangOpts, which is presumed to be 1881 // present in the caller. 1882 Test = "LangOpts.CPlusPlus11"; 1883 1884 std::string TestStr = 1885 !Test.empty() ? Test + " ? " + llvm::itostr(Version) + " : 0" : "1"; 1886 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Attr); 1887 for (const auto &S : Spellings) 1888 if (Variety.empty() || (Variety == S.variety() && 1889 (Scope.empty() || Scope == S.nameSpace()))) 1890 OS << " .Case(\"" << S.name() << "\", " << TestStr << ")\n"; 1891 } 1892 OS << " .Default(0);\n"; 1893 } 1894 1895 // Emits the list of spellings for attributes. 1896 void EmitClangAttrHasAttrImpl(RecordKeeper &Records, raw_ostream &OS) { 1897 emitSourceFileHeader("Code to implement the __has_attribute logic", OS); 1898 1899 // Separate all of the attributes out into four group: generic, C++11, GNU, 1900 // and declspecs. Then generate a big switch statement for each of them. 1901 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"); 1902 std::vector<Record *> Declspec, GNU, Pragma; 1903 std::map<std::string, std::vector<Record *>> CXX; 1904 1905 // Walk over the list of all attributes, and split them out based on the 1906 // spelling variety. 1907 for (auto *R : Attrs) { 1908 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*R); 1909 for (const auto &SI : Spellings) { 1910 std::string Variety = SI.variety(); 1911 if (Variety == "GNU") 1912 GNU.push_back(R); 1913 else if (Variety == "Declspec") 1914 Declspec.push_back(R); 1915 else if (Variety == "CXX11") 1916 CXX[SI.nameSpace()].push_back(R); 1917 else if (Variety == "Pragma") 1918 Pragma.push_back(R); 1919 } 1920 } 1921 1922 OS << "switch (Syntax) {\n"; 1923 OS << "case AttrSyntax::GNU:\n"; 1924 OS << " return llvm::StringSwitch<int>(Name)\n"; 1925 GenerateHasAttrSpellingStringSwitch(GNU, OS, "GNU"); 1926 OS << "case AttrSyntax::Declspec:\n"; 1927 OS << " return llvm::StringSwitch<int>(Name)\n"; 1928 GenerateHasAttrSpellingStringSwitch(Declspec, OS, "Declspec"); 1929 OS << "case AttrSyntax::Pragma:\n"; 1930 OS << " return llvm::StringSwitch<int>(Name)\n"; 1931 GenerateHasAttrSpellingStringSwitch(Pragma, OS, "Pragma"); 1932 OS << "case AttrSyntax::CXX: {\n"; 1933 // C++11-style attributes are further split out based on the Scope. 1934 for (std::map<std::string, std::vector<Record *>>::iterator I = CXX.begin(), 1935 E = CXX.end(); 1936 I != E; ++I) { 1937 if (I != CXX.begin()) 1938 OS << " else "; 1939 if (I->first.empty()) 1940 OS << "if (!Scope || Scope->getName() == \"\") {\n"; 1941 else 1942 OS << "if (Scope->getName() == \"" << I->first << "\") {\n"; 1943 OS << " return llvm::StringSwitch<int>(Name)\n"; 1944 GenerateHasAttrSpellingStringSwitch(I->second, OS, "CXX11", I->first); 1945 OS << "}"; 1946 } 1947 OS << "\n}\n"; 1948 OS << "}\n"; 1949 } 1950 1951 void EmitClangAttrSpellingListIndex(RecordKeeper &Records, raw_ostream &OS) { 1952 emitSourceFileHeader("Code to translate different attribute spellings " 1953 "into internal identifiers", OS); 1954 1955 OS << 1956 " switch (AttrKind) {\n" 1957 " default:\n" 1958 " llvm_unreachable(\"Unknown attribute kind!\");\n" 1959 " break;\n"; 1960 1961 ParsedAttrMap Attrs = getParsedAttrList(Records); 1962 for (const auto &I : Attrs) { 1963 const Record &R = *I.second; 1964 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R); 1965 OS << " case AT_" << I.first << ": {\n"; 1966 for (unsigned I = 0; I < Spellings.size(); ++ I) { 1967 OS << " if (Name == \"" << Spellings[I].name() << "\" && " 1968 << "SyntaxUsed == " 1969 << StringSwitch<unsigned>(Spellings[I].variety()) 1970 .Case("GNU", 0) 1971 .Case("CXX11", 1) 1972 .Case("Declspec", 2) 1973 .Case("Keyword", 3) 1974 .Case("Pragma", 4) 1975 .Default(0) 1976 << " && Scope == \"" << Spellings[I].nameSpace() << "\")\n" 1977 << " return " << I << ";\n"; 1978 } 1979 1980 OS << " break;\n"; 1981 OS << " }\n"; 1982 } 1983 1984 OS << " }\n"; 1985 OS << " return 0;\n"; 1986 } 1987 1988 // Emits code used by RecursiveASTVisitor to visit attributes 1989 void EmitClangAttrASTVisitor(RecordKeeper &Records, raw_ostream &OS) { 1990 emitSourceFileHeader("Used by RecursiveASTVisitor to visit attributes.", OS); 1991 1992 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1993 1994 // Write method declarations for Traverse* methods. 1995 // We emit this here because we only generate methods for attributes that 1996 // are declared as ASTNodes. 1997 OS << "#ifdef ATTR_VISITOR_DECLS_ONLY\n\n"; 1998 for (const auto *Attr : Attrs) { 1999 const Record &R = *Attr; 2000 if (!R.getValueAsBit("ASTNode")) 2001 continue; 2002 OS << " bool Traverse" 2003 << R.getName() << "Attr(" << R.getName() << "Attr *A);\n"; 2004 OS << " bool Visit" 2005 << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n" 2006 << " return true; \n" 2007 << " };\n"; 2008 } 2009 OS << "\n#else // ATTR_VISITOR_DECLS_ONLY\n\n"; 2010 2011 // Write individual Traverse* methods for each attribute class. 2012 for (const auto *Attr : Attrs) { 2013 const Record &R = *Attr; 2014 if (!R.getValueAsBit("ASTNode")) 2015 continue; 2016 2017 OS << "template <typename Derived>\n" 2018 << "bool VISITORCLASS<Derived>::Traverse" 2019 << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n" 2020 << " if (!getDerived().VisitAttr(A))\n" 2021 << " return false;\n" 2022 << " if (!getDerived().Visit" << R.getName() << "Attr(A))\n" 2023 << " return false;\n"; 2024 2025 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args"); 2026 for (const auto *Arg : ArgRecords) 2027 createArgument(*Arg, R.getName())->writeASTVisitorTraversal(OS); 2028 2029 OS << " return true;\n"; 2030 OS << "}\n\n"; 2031 } 2032 2033 // Write generic Traverse routine 2034 OS << "template <typename Derived>\n" 2035 << "bool VISITORCLASS<Derived>::TraverseAttr(Attr *A) {\n" 2036 << " if (!A)\n" 2037 << " return true;\n" 2038 << "\n" 2039 << " switch (A->getKind()) {\n" 2040 << " default:\n" 2041 << " return true;\n"; 2042 2043 for (const auto *Attr : Attrs) { 2044 const Record &R = *Attr; 2045 if (!R.getValueAsBit("ASTNode")) 2046 continue; 2047 2048 OS << " case attr::" << R.getName() << ":\n" 2049 << " return getDerived().Traverse" << R.getName() << "Attr(" 2050 << "cast<" << R.getName() << "Attr>(A));\n"; 2051 } 2052 OS << " }\n"; // end case 2053 OS << "}\n"; // end function 2054 OS << "#endif // ATTR_VISITOR_DECLS_ONLY\n"; 2055 } 2056 2057 // Emits code to instantiate dependent attributes on templates. 2058 void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS) { 2059 emitSourceFileHeader("Template instantiation code for attributes", OS); 2060 2061 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 2062 2063 OS << "namespace clang {\n" 2064 << "namespace sema {\n\n" 2065 << "Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, " 2066 << "Sema &S,\n" 2067 << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n" 2068 << " switch (At->getKind()) {\n" 2069 << " default:\n" 2070 << " break;\n"; 2071 2072 for (const auto *Attr : Attrs) { 2073 const Record &R = *Attr; 2074 if (!R.getValueAsBit("ASTNode")) 2075 continue; 2076 2077 OS << " case attr::" << R.getName() << ": {\n"; 2078 bool ShouldClone = R.getValueAsBit("Clone"); 2079 2080 if (!ShouldClone) { 2081 OS << " return NULL;\n"; 2082 OS << " }\n"; 2083 continue; 2084 } 2085 2086 OS << " const " << R.getName() << "Attr *A = cast<" 2087 << R.getName() << "Attr>(At);\n"; 2088 bool TDependent = R.getValueAsBit("TemplateDependent"); 2089 2090 if (!TDependent) { 2091 OS << " return A->clone(C);\n"; 2092 OS << " }\n"; 2093 continue; 2094 } 2095 2096 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args"); 2097 std::vector<std::unique_ptr<Argument>> Args; 2098 Args.reserve(ArgRecords.size()); 2099 2100 for (const auto *ArgRecord : ArgRecords) 2101 Args.emplace_back(createArgument(*ArgRecord, R.getName())); 2102 2103 for (auto const &ai : Args) 2104 ai->writeTemplateInstantiation(OS); 2105 2106 OS << " return new (C) " << R.getName() << "Attr(A->getLocation(), C"; 2107 for (auto const &ai : Args) { 2108 OS << ", "; 2109 ai->writeTemplateInstantiationArgs(OS); 2110 } 2111 OS << ", A->getSpellingListIndex());\n }\n"; 2112 } 2113 OS << " } // end switch\n" 2114 << " llvm_unreachable(\"Unknown attribute!\");\n" 2115 << " return 0;\n" 2116 << "}\n\n" 2117 << "} // end namespace sema\n" 2118 << "} // end namespace clang\n"; 2119 } 2120 2121 // Emits the list of parsed attributes. 2122 void EmitClangAttrParsedAttrList(RecordKeeper &Records, raw_ostream &OS) { 2123 emitSourceFileHeader("List of all attributes that Clang recognizes", OS); 2124 2125 OS << "#ifndef PARSED_ATTR\n"; 2126 OS << "#define PARSED_ATTR(NAME) NAME\n"; 2127 OS << "#endif\n\n"; 2128 2129 ParsedAttrMap Names = getParsedAttrList(Records); 2130 for (const auto &I : Names) { 2131 OS << "PARSED_ATTR(" << I.first << ")\n"; 2132 } 2133 } 2134 2135 static bool isArgVariadic(const Record &R, StringRef AttrName) { 2136 return createArgument(R, AttrName)->isVariadic(); 2137 } 2138 2139 static void emitArgInfo(const Record &R, std::stringstream &OS) { 2140 // This function will count the number of arguments specified for the 2141 // attribute and emit the number of required arguments followed by the 2142 // number of optional arguments. 2143 std::vector<Record *> Args = R.getValueAsListOfDefs("Args"); 2144 unsigned ArgCount = 0, OptCount = 0; 2145 bool HasVariadic = false; 2146 for (const auto *Arg : Args) { 2147 Arg->getValueAsBit("Optional") ? ++OptCount : ++ArgCount; 2148 if (!HasVariadic && isArgVariadic(*Arg, R.getName())) 2149 HasVariadic = true; 2150 } 2151 2152 // If there is a variadic argument, we will set the optional argument count 2153 // to its largest value. Since it's currently a 4-bit number, we set it to 15. 2154 OS << ArgCount << ", " << (HasVariadic ? 15 : OptCount); 2155 } 2156 2157 static void GenerateDefaultAppertainsTo(raw_ostream &OS) { 2158 OS << "static bool defaultAppertainsTo(Sema &, const AttributeList &,"; 2159 OS << "const Decl *) {\n"; 2160 OS << " return true;\n"; 2161 OS << "}\n\n"; 2162 } 2163 2164 static std::string CalculateDiagnostic(const Record &S) { 2165 // If the SubjectList object has a custom diagnostic associated with it, 2166 // return that directly. 2167 std::string CustomDiag = S.getValueAsString("CustomDiag"); 2168 if (!CustomDiag.empty()) 2169 return CustomDiag; 2170 2171 // Given the list of subjects, determine what diagnostic best fits. 2172 enum { 2173 Func = 1U << 0, 2174 Var = 1U << 1, 2175 ObjCMethod = 1U << 2, 2176 Param = 1U << 3, 2177 Class = 1U << 4, 2178 GenericRecord = 1U << 5, 2179 Type = 1U << 6, 2180 ObjCIVar = 1U << 7, 2181 ObjCProp = 1U << 8, 2182 ObjCInterface = 1U << 9, 2183 Block = 1U << 10, 2184 Namespace = 1U << 11, 2185 Field = 1U << 12, 2186 CXXMethod = 1U << 13, 2187 ObjCProtocol = 1U << 14, 2188 Enum = 1U << 15 2189 }; 2190 uint32_t SubMask = 0; 2191 2192 std::vector<Record *> Subjects = S.getValueAsListOfDefs("Subjects"); 2193 for (const auto *Subject : Subjects) { 2194 const Record &R = *Subject; 2195 std::string Name; 2196 2197 if (R.isSubClassOf("SubsetSubject")) { 2198 PrintError(R.getLoc(), "SubsetSubjects should use a custom diagnostic"); 2199 // As a fallback, look through the SubsetSubject to see what its base 2200 // type is, and use that. This needs to be updated if SubsetSubjects 2201 // are allowed within other SubsetSubjects. 2202 Name = R.getValueAsDef("Base")->getName(); 2203 } else 2204 Name = R.getName(); 2205 2206 uint32_t V = StringSwitch<uint32_t>(Name) 2207 .Case("Function", Func) 2208 .Case("Var", Var) 2209 .Case("ObjCMethod", ObjCMethod) 2210 .Case("ParmVar", Param) 2211 .Case("TypedefName", Type) 2212 .Case("ObjCIvar", ObjCIVar) 2213 .Case("ObjCProperty", ObjCProp) 2214 .Case("Record", GenericRecord) 2215 .Case("ObjCInterface", ObjCInterface) 2216 .Case("ObjCProtocol", ObjCProtocol) 2217 .Case("Block", Block) 2218 .Case("CXXRecord", Class) 2219 .Case("Namespace", Namespace) 2220 .Case("Field", Field) 2221 .Case("CXXMethod", CXXMethod) 2222 .Case("Enum", Enum) 2223 .Default(0); 2224 if (!V) { 2225 // Something wasn't in our mapping, so be helpful and let the developer 2226 // know about it. 2227 PrintFatalError(R.getLoc(), "Unknown subject type: " + R.getName()); 2228 return ""; 2229 } 2230 2231 SubMask |= V; 2232 } 2233 2234 switch (SubMask) { 2235 // For the simple cases where there's only a single entry in the mask, we 2236 // don't have to resort to bit fiddling. 2237 case Func: return "ExpectedFunction"; 2238 case Var: return "ExpectedVariable"; 2239 case Param: return "ExpectedParameter"; 2240 case Class: return "ExpectedClass"; 2241 case Enum: return "ExpectedEnum"; 2242 case CXXMethod: 2243 // FIXME: Currently, this maps to ExpectedMethod based on existing code, 2244 // but should map to something a bit more accurate at some point. 2245 case ObjCMethod: return "ExpectedMethod"; 2246 case Type: return "ExpectedType"; 2247 case ObjCInterface: return "ExpectedObjectiveCInterface"; 2248 case ObjCProtocol: return "ExpectedObjectiveCProtocol"; 2249 2250 // "GenericRecord" means struct, union or class; check the language options 2251 // and if not compiling for C++, strip off the class part. Note that this 2252 // relies on the fact that the context for this declares "Sema &S". 2253 case GenericRecord: 2254 return "(S.getLangOpts().CPlusPlus ? ExpectedStructOrUnionOrClass : " 2255 "ExpectedStructOrUnion)"; 2256 case Func | ObjCMethod | Block: return "ExpectedFunctionMethodOrBlock"; 2257 case Func | ObjCMethod | Class: return "ExpectedFunctionMethodOrClass"; 2258 case Func | Param: 2259 case Func | ObjCMethod | Param: return "ExpectedFunctionMethodOrParameter"; 2260 case Func | ObjCMethod: return "ExpectedFunctionOrMethod"; 2261 case Func | Var: return "ExpectedVariableOrFunction"; 2262 2263 // If not compiling for C++, the class portion does not apply. 2264 case Func | Var | Class: 2265 return "(S.getLangOpts().CPlusPlus ? ExpectedFunctionVariableOrClass : " 2266 "ExpectedVariableOrFunction)"; 2267 2268 case ObjCMethod | ObjCProp: return "ExpectedMethodOrProperty"; 2269 case ObjCProtocol | ObjCInterface: 2270 return "ExpectedObjectiveCInterfaceOrProtocol"; 2271 case Field | Var: return "ExpectedFieldOrGlobalVar"; 2272 } 2273 2274 PrintFatalError(S.getLoc(), 2275 "Could not deduce diagnostic argument for Attr subjects"); 2276 2277 return ""; 2278 } 2279 2280 static std::string GetSubjectWithSuffix(const Record *R) { 2281 std::string B = R->getName(); 2282 if (B == "DeclBase") 2283 return "Decl"; 2284 return B + "Decl"; 2285 } 2286 static std::string GenerateCustomAppertainsTo(const Record &Subject, 2287 raw_ostream &OS) { 2288 std::string FnName = "is" + Subject.getName(); 2289 2290 // If this code has already been generated, simply return the previous 2291 // instance of it. 2292 static std::set<std::string> CustomSubjectSet; 2293 std::set<std::string>::iterator I = CustomSubjectSet.find(FnName); 2294 if (I != CustomSubjectSet.end()) 2295 return *I; 2296 2297 Record *Base = Subject.getValueAsDef("Base"); 2298 2299 // Not currently support custom subjects within custom subjects. 2300 if (Base->isSubClassOf("SubsetSubject")) { 2301 PrintFatalError(Subject.getLoc(), 2302 "SubsetSubjects within SubsetSubjects is not supported"); 2303 return ""; 2304 } 2305 2306 OS << "static bool " << FnName << "(const Decl *D) {\n"; 2307 OS << " if (const " << GetSubjectWithSuffix(Base) << " *S = dyn_cast<"; 2308 OS << GetSubjectWithSuffix(Base); 2309 OS << ">(D))\n"; 2310 OS << " return " << Subject.getValueAsString("CheckCode") << ";\n"; 2311 OS << " return false;\n"; 2312 OS << "}\n\n"; 2313 2314 CustomSubjectSet.insert(FnName); 2315 return FnName; 2316 } 2317 2318 static std::string GenerateAppertainsTo(const Record &Attr, raw_ostream &OS) { 2319 // If the attribute does not contain a Subjects definition, then use the 2320 // default appertainsTo logic. 2321 if (Attr.isValueUnset("Subjects")) 2322 return "defaultAppertainsTo"; 2323 2324 const Record *SubjectObj = Attr.getValueAsDef("Subjects"); 2325 std::vector<Record*> Subjects = SubjectObj->getValueAsListOfDefs("Subjects"); 2326 2327 // If the list of subjects is empty, it is assumed that the attribute 2328 // appertains to everything. 2329 if (Subjects.empty()) 2330 return "defaultAppertainsTo"; 2331 2332 bool Warn = SubjectObj->getValueAsDef("Diag")->getValueAsBit("Warn"); 2333 2334 // Otherwise, generate an appertainsTo check specific to this attribute which 2335 // checks all of the given subjects against the Decl passed in. Return the 2336 // name of that check to the caller. 2337 std::string FnName = "check" + Attr.getName() + "AppertainsTo"; 2338 std::stringstream SS; 2339 SS << "static bool " << FnName << "(Sema &S, const AttributeList &Attr, "; 2340 SS << "const Decl *D) {\n"; 2341 SS << " if ("; 2342 for (auto I = Subjects.begin(), E = Subjects.end(); I != E; ++I) { 2343 // If the subject has custom code associated with it, generate a function 2344 // for it. The function cannot be inlined into this check (yet) because it 2345 // requires the subject to be of a specific type, and were that information 2346 // inlined here, it would not support an attribute with multiple custom 2347 // subjects. 2348 if ((*I)->isSubClassOf("SubsetSubject")) { 2349 SS << "!" << GenerateCustomAppertainsTo(**I, OS) << "(D)"; 2350 } else { 2351 SS << "!isa<" << GetSubjectWithSuffix(*I) << ">(D)"; 2352 } 2353 2354 if (I + 1 != E) 2355 SS << " && "; 2356 } 2357 SS << ") {\n"; 2358 SS << " S.Diag(Attr.getLoc(), diag::"; 2359 SS << (Warn ? "warn_attribute_wrong_decl_type" : 2360 "err_attribute_wrong_decl_type"); 2361 SS << ")\n"; 2362 SS << " << Attr.getName() << "; 2363 SS << CalculateDiagnostic(*SubjectObj) << ";\n"; 2364 SS << " return false;\n"; 2365 SS << " }\n"; 2366 SS << " return true;\n"; 2367 SS << "}\n\n"; 2368 2369 OS << SS.str(); 2370 return FnName; 2371 } 2372 2373 static void GenerateDefaultLangOptRequirements(raw_ostream &OS) { 2374 OS << "static bool defaultDiagnoseLangOpts(Sema &, "; 2375 OS << "const AttributeList &) {\n"; 2376 OS << " return true;\n"; 2377 OS << "}\n\n"; 2378 } 2379 2380 static std::string GenerateLangOptRequirements(const Record &R, 2381 raw_ostream &OS) { 2382 // If the attribute has an empty or unset list of language requirements, 2383 // return the default handler. 2384 std::vector<Record *> LangOpts = R.getValueAsListOfDefs("LangOpts"); 2385 if (LangOpts.empty()) 2386 return "defaultDiagnoseLangOpts"; 2387 2388 // Generate the test condition, as well as a unique function name for the 2389 // diagnostic test. The list of options should usually be short (one or two 2390 // options), and the uniqueness isn't strictly necessary (it is just for 2391 // codegen efficiency). 2392 std::string FnName = "check", Test; 2393 for (auto I = LangOpts.begin(), E = LangOpts.end(); I != E; ++I) { 2394 std::string Part = (*I)->getValueAsString("Name"); 2395 if ((*I)->getValueAsBit("Negated")) 2396 Test += "!"; 2397 Test += "S.LangOpts." + Part; 2398 if (I + 1 != E) 2399 Test += " || "; 2400 FnName += Part; 2401 } 2402 FnName += "LangOpts"; 2403 2404 // If this code has already been generated, simply return the previous 2405 // instance of it. 2406 static std::set<std::string> CustomLangOptsSet; 2407 std::set<std::string>::iterator I = CustomLangOptsSet.find(FnName); 2408 if (I != CustomLangOptsSet.end()) 2409 return *I; 2410 2411 OS << "static bool " << FnName << "(Sema &S, const AttributeList &Attr) {\n"; 2412 OS << " if (" << Test << ")\n"; 2413 OS << " return true;\n\n"; 2414 OS << " S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) "; 2415 OS << "<< Attr.getName();\n"; 2416 OS << " return false;\n"; 2417 OS << "}\n\n"; 2418 2419 CustomLangOptsSet.insert(FnName); 2420 return FnName; 2421 } 2422 2423 static void GenerateDefaultTargetRequirements(raw_ostream &OS) { 2424 OS << "static bool defaultTargetRequirements(const llvm::Triple &) {\n"; 2425 OS << " return true;\n"; 2426 OS << "}\n\n"; 2427 } 2428 2429 static std::string GenerateTargetRequirements(const Record &Attr, 2430 const ParsedAttrMap &Dupes, 2431 raw_ostream &OS) { 2432 // If the attribute is not a target specific attribute, return the default 2433 // target handler. 2434 if (!Attr.isSubClassOf("TargetSpecificAttr")) 2435 return "defaultTargetRequirements"; 2436 2437 // Get the list of architectures to be tested for. 2438 const Record *R = Attr.getValueAsDef("Target"); 2439 std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches"); 2440 if (Arches.empty()) { 2441 PrintError(Attr.getLoc(), "Empty list of target architectures for a " 2442 "target-specific attr"); 2443 return "defaultTargetRequirements"; 2444 } 2445 2446 // If there are other attributes which share the same parsed attribute kind, 2447 // such as target-specific attributes with a shared spelling, collapse the 2448 // duplicate architectures. This is required because a shared target-specific 2449 // attribute has only one AttributeList::Kind enumeration value, but it 2450 // applies to multiple target architectures. In order for the attribute to be 2451 // considered valid, all of its architectures need to be included. 2452 if (!Attr.isValueUnset("ParseKind")) { 2453 std::string APK = Attr.getValueAsString("ParseKind"); 2454 for (const auto &I : Dupes) { 2455 if (I.first == APK) { 2456 std::vector<std::string> DA = I.second->getValueAsDef("Target") 2457 ->getValueAsListOfStrings("Arches"); 2458 std::copy(DA.begin(), DA.end(), std::back_inserter(Arches)); 2459 } 2460 } 2461 } 2462 2463 std::string FnName = "isTarget", Test = "("; 2464 for (auto I = Arches.begin(), E = Arches.end(); I != E; ++I) { 2465 std::string Part = *I; 2466 Test += "Arch == llvm::Triple::" + Part; 2467 if (I + 1 != E) 2468 Test += " || "; 2469 FnName += Part; 2470 } 2471 Test += ")"; 2472 2473 // If the target also requires OS testing, generate those tests as well. 2474 bool UsesOS = false; 2475 if (!R->isValueUnset("OSes")) { 2476 UsesOS = true; 2477 2478 // We know that there was at least one arch test, so we need to and in the 2479 // OS tests. 2480 Test += " && ("; 2481 std::vector<std::string> OSes = R->getValueAsListOfStrings("OSes"); 2482 for (auto I = OSes.begin(), E = OSes.end(); I != E; ++I) { 2483 std::string Part = *I; 2484 2485 Test += "OS == llvm::Triple::" + Part; 2486 if (I + 1 != E) 2487 Test += " || "; 2488 FnName += Part; 2489 } 2490 Test += ")"; 2491 } 2492 2493 // If this code has already been generated, simply return the previous 2494 // instance of it. 2495 static std::set<std::string> CustomTargetSet; 2496 std::set<std::string>::iterator I = CustomTargetSet.find(FnName); 2497 if (I != CustomTargetSet.end()) 2498 return *I; 2499 2500 OS << "static bool " << FnName << "(const llvm::Triple &T) {\n"; 2501 OS << " llvm::Triple::ArchType Arch = T.getArch();\n"; 2502 if (UsesOS) 2503 OS << " llvm::Triple::OSType OS = T.getOS();\n"; 2504 OS << " return " << Test << ";\n"; 2505 OS << "}\n\n"; 2506 2507 CustomTargetSet.insert(FnName); 2508 return FnName; 2509 } 2510 2511 static void GenerateDefaultSpellingIndexToSemanticSpelling(raw_ostream &OS) { 2512 OS << "static unsigned defaultSpellingIndexToSemanticSpelling(" 2513 << "const AttributeList &Attr) {\n"; 2514 OS << " return UINT_MAX;\n"; 2515 OS << "}\n\n"; 2516 } 2517 2518 static std::string GenerateSpellingIndexToSemanticSpelling(const Record &Attr, 2519 raw_ostream &OS) { 2520 // If the attribute does not have a semantic form, we can bail out early. 2521 if (!Attr.getValueAsBit("ASTNode")) 2522 return "defaultSpellingIndexToSemanticSpelling"; 2523 2524 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr); 2525 2526 // If there are zero or one spellings, or all of the spellings share the same 2527 // name, we can also bail out early. 2528 if (Spellings.size() <= 1 || SpellingNamesAreCommon(Spellings)) 2529 return "defaultSpellingIndexToSemanticSpelling"; 2530 2531 // Generate the enumeration we will use for the mapping. 2532 SemanticSpellingMap SemanticToSyntacticMap; 2533 std::string Enum = CreateSemanticSpellings(Spellings, SemanticToSyntacticMap); 2534 std::string Name = Attr.getName() + "AttrSpellingMap"; 2535 2536 OS << "static unsigned " << Name << "(const AttributeList &Attr) {\n"; 2537 OS << Enum; 2538 OS << " unsigned Idx = Attr.getAttributeSpellingListIndex();\n"; 2539 WriteSemanticSpellingSwitch("Idx", SemanticToSyntacticMap, OS); 2540 OS << "}\n\n"; 2541 2542 return Name; 2543 } 2544 2545 static bool IsKnownToGCC(const Record &Attr) { 2546 // Look at the spellings for this subject; if there are any spellings which 2547 // claim to be known to GCC, the attribute is known to GCC. 2548 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr); 2549 for (const auto &I : Spellings) { 2550 if (I.knownToGCC()) 2551 return true; 2552 } 2553 return false; 2554 } 2555 2556 /// Emits the parsed attribute helpers 2557 void EmitClangAttrParsedAttrImpl(RecordKeeper &Records, raw_ostream &OS) { 2558 emitSourceFileHeader("Parsed attribute helpers", OS); 2559 2560 // Get the list of parsed attributes, and accept the optional list of 2561 // duplicates due to the ParseKind. 2562 ParsedAttrMap Dupes; 2563 ParsedAttrMap Attrs = getParsedAttrList(Records, &Dupes); 2564 2565 // Generate the default appertainsTo, target and language option diagnostic, 2566 // and spelling list index mapping methods. 2567 GenerateDefaultAppertainsTo(OS); 2568 GenerateDefaultLangOptRequirements(OS); 2569 GenerateDefaultTargetRequirements(OS); 2570 GenerateDefaultSpellingIndexToSemanticSpelling(OS); 2571 2572 // Generate the appertainsTo diagnostic methods and write their names into 2573 // another mapping. At the same time, generate the AttrInfoMap object 2574 // contents. Due to the reliance on generated code, use separate streams so 2575 // that code will not be interleaved. 2576 std::stringstream SS; 2577 for (auto I = Attrs.begin(), E = Attrs.end(); I != E; ++I) { 2578 // TODO: If the attribute's kind appears in the list of duplicates, that is 2579 // because it is a target-specific attribute that appears multiple times. 2580 // It would be beneficial to test whether the duplicates are "similar 2581 // enough" to each other to not cause problems. For instance, check that 2582 // the spellings are identical, and custom parsing rules match, etc. 2583 2584 // We need to generate struct instances based off ParsedAttrInfo from 2585 // AttributeList.cpp. 2586 SS << " { "; 2587 emitArgInfo(*I->second, SS); 2588 SS << ", " << I->second->getValueAsBit("HasCustomParsing"); 2589 SS << ", " << I->second->isSubClassOf("TargetSpecificAttr"); 2590 SS << ", " << I->second->isSubClassOf("TypeAttr"); 2591 SS << ", " << IsKnownToGCC(*I->second); 2592 SS << ", " << GenerateAppertainsTo(*I->second, OS); 2593 SS << ", " << GenerateLangOptRequirements(*I->second, OS); 2594 SS << ", " << GenerateTargetRequirements(*I->second, Dupes, OS); 2595 SS << ", " << GenerateSpellingIndexToSemanticSpelling(*I->second, OS); 2596 SS << " }"; 2597 2598 if (I + 1 != E) 2599 SS << ","; 2600 2601 SS << " // AT_" << I->first << "\n"; 2602 } 2603 2604 OS << "static const ParsedAttrInfo AttrInfoMap[AttributeList::UnknownAttribute + 1] = {\n"; 2605 OS << SS.str(); 2606 OS << "};\n\n"; 2607 } 2608 2609 // Emits the kind list of parsed attributes 2610 void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream &OS) { 2611 emitSourceFileHeader("Attribute name matcher", OS); 2612 2613 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"); 2614 std::vector<StringMatcher::StringPair> GNU, Declspec, CXX11, Keywords, Pragma; 2615 std::set<std::string> Seen; 2616 for (const auto *A : Attrs) { 2617 const Record &Attr = *A; 2618 2619 bool SemaHandler = Attr.getValueAsBit("SemaHandler"); 2620 bool Ignored = Attr.getValueAsBit("Ignored"); 2621 if (SemaHandler || Ignored) { 2622 // Attribute spellings can be shared between target-specific attributes, 2623 // and can be shared between syntaxes for the same attribute. For 2624 // instance, an attribute can be spelled GNU<"interrupt"> for an ARM- 2625 // specific attribute, or MSP430-specific attribute. Additionally, an 2626 // attribute can be spelled GNU<"dllexport"> and Declspec<"dllexport"> 2627 // for the same semantic attribute. Ultimately, we need to map each of 2628 // these to a single AttributeList::Kind value, but the StringMatcher 2629 // class cannot handle duplicate match strings. So we generate a list of 2630 // string to match based on the syntax, and emit multiple string matchers 2631 // depending on the syntax used. 2632 std::string AttrName; 2633 if (Attr.isSubClassOf("TargetSpecificAttr") && 2634 !Attr.isValueUnset("ParseKind")) { 2635 AttrName = Attr.getValueAsString("ParseKind"); 2636 if (Seen.find(AttrName) != Seen.end()) 2637 continue; 2638 Seen.insert(AttrName); 2639 } else 2640 AttrName = NormalizeAttrName(StringRef(Attr.getName())).str(); 2641 2642 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr); 2643 for (const auto &S : Spellings) { 2644 std::string RawSpelling = S.name(); 2645 std::vector<StringMatcher::StringPair> *Matches = nullptr; 2646 std::string Spelling, Variety = S.variety(); 2647 if (Variety == "CXX11") { 2648 Matches = &CXX11; 2649 Spelling += S.nameSpace(); 2650 Spelling += "::"; 2651 } else if (Variety == "GNU") 2652 Matches = &GNU; 2653 else if (Variety == "Declspec") 2654 Matches = &Declspec; 2655 else if (Variety == "Keyword") 2656 Matches = &Keywords; 2657 else if (Variety == "Pragma") 2658 Matches = &Pragma; 2659 2660 assert(Matches && "Unsupported spelling variety found"); 2661 2662 Spelling += NormalizeAttrSpelling(RawSpelling); 2663 if (SemaHandler) 2664 Matches->push_back(StringMatcher::StringPair(Spelling, 2665 "return AttributeList::AT_" + AttrName + ";")); 2666 else 2667 Matches->push_back(StringMatcher::StringPair(Spelling, 2668 "return AttributeList::IgnoredAttribute;")); 2669 } 2670 } 2671 } 2672 2673 OS << "static AttributeList::Kind getAttrKind(StringRef Name, "; 2674 OS << "AttributeList::Syntax Syntax) {\n"; 2675 OS << " if (AttributeList::AS_GNU == Syntax) {\n"; 2676 StringMatcher("Name", GNU, OS).Emit(); 2677 OS << " } else if (AttributeList::AS_Declspec == Syntax) {\n"; 2678 StringMatcher("Name", Declspec, OS).Emit(); 2679 OS << " } else if (AttributeList::AS_CXX11 == Syntax) {\n"; 2680 StringMatcher("Name", CXX11, OS).Emit(); 2681 OS << " } else if (AttributeList::AS_Keyword == Syntax) {\n"; 2682 StringMatcher("Name", Keywords, OS).Emit(); 2683 OS << " } else if (AttributeList::AS_Pragma == Syntax) {\n"; 2684 StringMatcher("Name", Pragma, OS).Emit(); 2685 OS << " }\n"; 2686 OS << " return AttributeList::UnknownAttribute;\n" 2687 << "}\n"; 2688 } 2689 2690 // Emits the code to dump an attribute. 2691 void EmitClangAttrDump(RecordKeeper &Records, raw_ostream &OS) { 2692 emitSourceFileHeader("Attribute dumper", OS); 2693 2694 OS << 2695 " switch (A->getKind()) {\n" 2696 " default:\n" 2697 " llvm_unreachable(\"Unknown attribute kind!\");\n" 2698 " break;\n"; 2699 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args; 2700 for (const auto *Attr : Attrs) { 2701 const Record &R = *Attr; 2702 if (!R.getValueAsBit("ASTNode")) 2703 continue; 2704 OS << " case attr::" << R.getName() << ": {\n"; 2705 2706 // If the attribute has a semantically-meaningful name (which is determined 2707 // by whether there is a Spelling enumeration for it), then write out the 2708 // spelling used for the attribute. 2709 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R); 2710 if (Spellings.size() > 1 && !SpellingNamesAreCommon(Spellings)) 2711 OS << " OS << \" \" << A->getSpelling();\n"; 2712 2713 Args = R.getValueAsListOfDefs("Args"); 2714 if (!Args.empty()) { 2715 OS << " const " << R.getName() << "Attr *SA = cast<" << R.getName() 2716 << "Attr>(A);\n"; 2717 for (const auto *Arg : Args) 2718 createArgument(*Arg, R.getName())->writeDump(OS); 2719 2720 for (auto AI = Args.begin(), AE = Args.end(); AI != AE; ++AI) 2721 createArgument(**AI, R.getName())->writeDumpChildren(OS); 2722 } 2723 OS << 2724 " break;\n" 2725 " }\n"; 2726 } 2727 OS << " }\n"; 2728 } 2729 2730 void EmitClangAttrParserStringSwitches(RecordKeeper &Records, 2731 raw_ostream &OS) { 2732 emitSourceFileHeader("Parser-related llvm::StringSwitch cases", OS); 2733 emitClangAttrArgContextList(Records, OS); 2734 emitClangAttrIdentifierArgList(Records, OS); 2735 emitClangAttrTypeArgList(Records, OS); 2736 emitClangAttrLateParsedList(Records, OS); 2737 } 2738 2739 class DocumentationData { 2740 public: 2741 const Record *Documentation; 2742 const Record *Attribute; 2743 2744 DocumentationData(const Record &Documentation, const Record &Attribute) 2745 : Documentation(&Documentation), Attribute(&Attribute) {} 2746 }; 2747 2748 static void WriteCategoryHeader(const Record *DocCategory, 2749 raw_ostream &OS) { 2750 const std::string &Name = DocCategory->getValueAsString("Name"); 2751 OS << Name << "\n" << std::string(Name.length(), '=') << "\n"; 2752 2753 // If there is content, print that as well. 2754 std::string ContentStr = DocCategory->getValueAsString("Content"); 2755 if (!ContentStr.empty()) { 2756 // Trim leading and trailing newlines and spaces. 2757 StringRef Content(ContentStr); 2758 while (Content.startswith("\r") || Content.startswith("\n") || 2759 Content.startswith(" ") || Content.startswith("\t")) 2760 Content = Content.substr(1); 2761 while (Content.endswith("\r") || Content.endswith("\n") || 2762 Content.endswith(" ") || Content.endswith("\t")) 2763 Content = Content.substr(0, Content.size() - 1); 2764 OS << Content; 2765 } 2766 OS << "\n\n"; 2767 } 2768 2769 enum SpellingKind { 2770 GNU = 1 << 0, 2771 CXX11 = 1 << 1, 2772 Declspec = 1 << 2, 2773 Keyword = 1 << 3, 2774 Pragma = 1 << 4 2775 }; 2776 2777 static void WriteDocumentation(const DocumentationData &Doc, 2778 raw_ostream &OS) { 2779 // FIXME: there is no way to have a per-spelling category for the attribute 2780 // documentation. This may not be a limiting factor since the spellings 2781 // should generally be consistently applied across the category. 2782 2783 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Doc.Attribute); 2784 2785 // Determine the heading to be used for this attribute. 2786 std::string Heading = Doc.Documentation->getValueAsString("Heading"); 2787 bool CustomHeading = !Heading.empty(); 2788 if (Heading.empty()) { 2789 // If there's only one spelling, we can simply use that. 2790 if (Spellings.size() == 1) 2791 Heading = Spellings.begin()->name(); 2792 else { 2793 std::set<std::string> Uniques; 2794 for (auto I = Spellings.begin(), E = Spellings.end(); 2795 I != E && Uniques.size() <= 1; ++I) { 2796 std::string Spelling = NormalizeNameForSpellingComparison(I->name()); 2797 Uniques.insert(Spelling); 2798 } 2799 // If the semantic map has only one spelling, that is sufficient for our 2800 // needs. 2801 if (Uniques.size() == 1) 2802 Heading = *Uniques.begin(); 2803 } 2804 } 2805 2806 // If the heading is still empty, it is an error. 2807 if (Heading.empty()) 2808 PrintFatalError(Doc.Attribute->getLoc(), 2809 "This attribute requires a heading to be specified"); 2810 2811 // Gather a list of unique spellings; this is not the same as the semantic 2812 // spelling for the attribute. Variations in underscores and other non- 2813 // semantic characters are still acceptable. 2814 std::vector<std::string> Names; 2815 2816 unsigned SupportedSpellings = 0; 2817 for (const auto &I : Spellings) { 2818 SpellingKind Kind = StringSwitch<SpellingKind>(I.variety()) 2819 .Case("GNU", GNU) 2820 .Case("CXX11", CXX11) 2821 .Case("Declspec", Declspec) 2822 .Case("Keyword", Keyword) 2823 .Case("Pragma", Pragma); 2824 2825 // Mask in the supported spelling. 2826 SupportedSpellings |= Kind; 2827 2828 std::string Name; 2829 if (Kind == CXX11 && !I.nameSpace().empty()) 2830 Name = I.nameSpace() + "::"; 2831 Name += I.name(); 2832 2833 // If this name is the same as the heading, do not add it. 2834 if (Name != Heading) 2835 Names.push_back(Name); 2836 } 2837 2838 // Print out the heading for the attribute. If there are alternate spellings, 2839 // then display those after the heading. 2840 if (!CustomHeading && !Names.empty()) { 2841 Heading += " ("; 2842 for (auto I = Names.begin(), E = Names.end(); I != E; ++I) { 2843 if (I != Names.begin()) 2844 Heading += ", "; 2845 Heading += *I; 2846 } 2847 Heading += ")"; 2848 } 2849 OS << Heading << "\n" << std::string(Heading.length(), '-') << "\n"; 2850 2851 if (!SupportedSpellings) 2852 PrintFatalError(Doc.Attribute->getLoc(), 2853 "Attribute has no supported spellings; cannot be " 2854 "documented"); 2855 2856 // List what spelling syntaxes the attribute supports. 2857 OS << ".. csv-table:: Supported Syntaxes\n"; 2858 OS << " :header: \"GNU\", \"C++11\", \"__declspec\", \"Keyword\","; 2859 OS << " \"Pragma\"\n\n"; 2860 OS << " \""; 2861 if (SupportedSpellings & GNU) OS << "X"; 2862 OS << "\",\""; 2863 if (SupportedSpellings & CXX11) OS << "X"; 2864 OS << "\",\""; 2865 if (SupportedSpellings & Declspec) OS << "X"; 2866 OS << "\",\""; 2867 if (SupportedSpellings & Keyword) OS << "X"; 2868 OS << "\", \""; 2869 if (SupportedSpellings & Pragma) OS << "X"; 2870 OS << "\"\n\n"; 2871 2872 // If the attribute is deprecated, print a message about it, and possibly 2873 // provide a replacement attribute. 2874 if (!Doc.Documentation->isValueUnset("Deprecated")) { 2875 OS << "This attribute has been deprecated, and may be removed in a future " 2876 << "version of Clang."; 2877 const Record &Deprecated = *Doc.Documentation->getValueAsDef("Deprecated"); 2878 std::string Replacement = Deprecated.getValueAsString("Replacement"); 2879 if (!Replacement.empty()) 2880 OS << " This attribute has been superseded by ``" 2881 << Replacement << "``."; 2882 OS << "\n\n"; 2883 } 2884 2885 std::string ContentStr = Doc.Documentation->getValueAsString("Content"); 2886 // Trim leading and trailing newlines and spaces. 2887 StringRef Content(ContentStr); 2888 while (Content.startswith("\r") || Content.startswith("\n") || 2889 Content.startswith(" ") || Content.startswith("\t")) 2890 Content = Content.substr(1); 2891 while (Content.endswith("\r") || Content.endswith("\n") || 2892 Content.endswith(" ") || Content.endswith("\t")) 2893 Content = Content.substr(0, Content.size() - 1); 2894 OS << Content; 2895 2896 OS << "\n\n\n"; 2897 } 2898 2899 void EmitClangAttrDocs(RecordKeeper &Records, raw_ostream &OS) { 2900 // Get the documentation introduction paragraph. 2901 const Record *Documentation = Records.getDef("GlobalDocumentation"); 2902 if (!Documentation) { 2903 PrintFatalError("The Documentation top-level definition is missing, " 2904 "no documentation will be generated."); 2905 return; 2906 } 2907 2908 OS << Documentation->getValueAsString("Intro") << "\n"; 2909 2910 // Gather the Documentation lists from each of the attributes, based on the 2911 // category provided. 2912 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"); 2913 std::map<const Record *, std::vector<DocumentationData>> SplitDocs; 2914 for (const auto *A : Attrs) { 2915 const Record &Attr = *A; 2916 std::vector<Record *> Docs = Attr.getValueAsListOfDefs("Documentation"); 2917 for (const auto *D : Docs) { 2918 const Record &Doc = *D; 2919 const Record *Category = Doc.getValueAsDef("Category"); 2920 // If the category is "undocumented", then there cannot be any other 2921 // documentation categories (otherwise, the attribute would become 2922 // documented). 2923 std::string Cat = Category->getValueAsString("Name"); 2924 bool Undocumented = Cat == "Undocumented"; 2925 if (Undocumented && Docs.size() > 1) 2926 PrintFatalError(Doc.getLoc(), 2927 "Attribute is \"Undocumented\", but has multiple " 2928 "documentation categories"); 2929 2930 if (!Undocumented) 2931 SplitDocs[Category].push_back(DocumentationData(Doc, Attr)); 2932 } 2933 } 2934 2935 // Having split the attributes out based on what documentation goes where, 2936 // we can begin to generate sections of documentation. 2937 for (const auto &I : SplitDocs) { 2938 WriteCategoryHeader(I.first, OS); 2939 2940 // Walk over each of the attributes in the category and write out their 2941 // documentation. 2942 for (const auto &Doc : I.second) 2943 WriteDocumentation(Doc, OS); 2944 } 2945 } 2946 2947 } // end namespace clang 2948