ClangAttrEmitter.cpp revision 176edba5311f6eff0cad2631449885ddf4fbc9ea
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 29using namespace llvm; 30 31class FlattenedSpelling { 32 std::string V, N, NS; 33 bool K; 34 35public: 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 57std::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 75static 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() 86static 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. 101static 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. 114static 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. 125static 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 133typedef std::vector<std::pair<std::string, const Record *>> ParsedAttrMap; 134 135static 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 164namespace { 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 1012static std::unique_ptr<Argument> 1013createArgument(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 1071static 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 1080static 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 1103static void 1104writePrettyPrintFunction(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. 1207static unsigned 1208getSpellingListIndex(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 1227static 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 1248static bool 1249SpellingNamesAreCommon(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 1262typedef std::map<unsigned, std::string> SemanticSpellingMap; 1263static std::string 1264CreateSemanticSpellings(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 1306void 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. 1317static 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. 1339static 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. 1365static 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 1385static 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. 1394static 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 1415namespace clang { 1416 1417// Emits the class definitions for attributes. 1418void 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. 1612void 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 1651static 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. 1669static 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 1677namespace clang { 1678// Emits the enumeration list for attributes. 1679void 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. 1745void 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. 1788void 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 1820static 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. 1896void 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::Generic:\n"; 1924 OS << " return llvm::StringSwitch<int>(Name)\n"; 1925 GenerateHasAttrSpellingStringSwitch(Attrs, OS); 1926 OS << "case AttrSyntax::GNU:\n"; 1927 OS << " return llvm::StringSwitch<int>(Name)\n"; 1928 GenerateHasAttrSpellingStringSwitch(GNU, OS, "GNU"); 1929 OS << "case AttrSyntax::Declspec:\n"; 1930 OS << " return llvm::StringSwitch<int>(Name)\n"; 1931 GenerateHasAttrSpellingStringSwitch(Declspec, OS, "Declspec"); 1932 OS << "case AttrSyntax::Pragma:\n"; 1933 OS << " return llvm::StringSwitch<int>(Name)\n"; 1934 GenerateHasAttrSpellingStringSwitch(Pragma, OS, "Pragma"); 1935 OS << "case AttrSyntax::CXX: {\n"; 1936 // C++11-style attributes are further split out based on the Scope. 1937 for (std::map<std::string, std::vector<Record *>>::iterator I = CXX.begin(), 1938 E = CXX.end(); 1939 I != E; ++I) { 1940 if (I != CXX.begin()) 1941 OS << " else "; 1942 if (I->first.empty()) 1943 OS << "if (!Scope || Scope->getName() == \"\") {\n"; 1944 else 1945 OS << "if (Scope->getName() == \"" << I->first << "\") {\n"; 1946 OS << " return llvm::StringSwitch<int>(Name)\n"; 1947 GenerateHasAttrSpellingStringSwitch(I->second, OS, "CXX11", I->first); 1948 OS << "}"; 1949 } 1950 OS << "\n}\n"; 1951 OS << "}\n"; 1952} 1953 1954void EmitClangAttrSpellingListIndex(RecordKeeper &Records, raw_ostream &OS) { 1955 emitSourceFileHeader("Code to translate different attribute spellings " 1956 "into internal identifiers", OS); 1957 1958 OS << 1959 " switch (AttrKind) {\n" 1960 " default:\n" 1961 " llvm_unreachable(\"Unknown attribute kind!\");\n" 1962 " break;\n"; 1963 1964 ParsedAttrMap Attrs = getParsedAttrList(Records); 1965 for (const auto &I : Attrs) { 1966 const Record &R = *I.second; 1967 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R); 1968 OS << " case AT_" << I.first << ": {\n"; 1969 for (unsigned I = 0; I < Spellings.size(); ++ I) { 1970 OS << " if (Name == \"" << Spellings[I].name() << "\" && " 1971 << "SyntaxUsed == " 1972 << StringSwitch<unsigned>(Spellings[I].variety()) 1973 .Case("GNU", 0) 1974 .Case("CXX11", 1) 1975 .Case("Declspec", 2) 1976 .Case("Keyword", 3) 1977 .Case("Pragma", 4) 1978 .Default(0) 1979 << " && Scope == \"" << Spellings[I].nameSpace() << "\")\n" 1980 << " return " << I << ";\n"; 1981 } 1982 1983 OS << " break;\n"; 1984 OS << " }\n"; 1985 } 1986 1987 OS << " }\n"; 1988 OS << " return 0;\n"; 1989} 1990 1991// Emits code used by RecursiveASTVisitor to visit attributes 1992void EmitClangAttrASTVisitor(RecordKeeper &Records, raw_ostream &OS) { 1993 emitSourceFileHeader("Used by RecursiveASTVisitor to visit attributes.", OS); 1994 1995 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1996 1997 // Write method declarations for Traverse* methods. 1998 // We emit this here because we only generate methods for attributes that 1999 // are declared as ASTNodes. 2000 OS << "#ifdef ATTR_VISITOR_DECLS_ONLY\n\n"; 2001 for (const auto *Attr : Attrs) { 2002 const Record &R = *Attr; 2003 if (!R.getValueAsBit("ASTNode")) 2004 continue; 2005 OS << " bool Traverse" 2006 << R.getName() << "Attr(" << R.getName() << "Attr *A);\n"; 2007 OS << " bool Visit" 2008 << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n" 2009 << " return true; \n" 2010 << " };\n"; 2011 } 2012 OS << "\n#else // ATTR_VISITOR_DECLS_ONLY\n\n"; 2013 2014 // Write individual Traverse* methods for each attribute class. 2015 for (const auto *Attr : Attrs) { 2016 const Record &R = *Attr; 2017 if (!R.getValueAsBit("ASTNode")) 2018 continue; 2019 2020 OS << "template <typename Derived>\n" 2021 << "bool VISITORCLASS<Derived>::Traverse" 2022 << R.getName() << "Attr(" << R.getName() << "Attr *A) {\n" 2023 << " if (!getDerived().VisitAttr(A))\n" 2024 << " return false;\n" 2025 << " if (!getDerived().Visit" << R.getName() << "Attr(A))\n" 2026 << " return false;\n"; 2027 2028 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args"); 2029 for (const auto *Arg : ArgRecords) 2030 createArgument(*Arg, R.getName())->writeASTVisitorTraversal(OS); 2031 2032 OS << " return true;\n"; 2033 OS << "}\n\n"; 2034 } 2035 2036 // Write generic Traverse routine 2037 OS << "template <typename Derived>\n" 2038 << "bool VISITORCLASS<Derived>::TraverseAttr(Attr *A) {\n" 2039 << " if (!A)\n" 2040 << " return true;\n" 2041 << "\n" 2042 << " switch (A->getKind()) {\n" 2043 << " default:\n" 2044 << " return true;\n"; 2045 2046 for (const auto *Attr : Attrs) { 2047 const Record &R = *Attr; 2048 if (!R.getValueAsBit("ASTNode")) 2049 continue; 2050 2051 OS << " case attr::" << R.getName() << ":\n" 2052 << " return getDerived().Traverse" << R.getName() << "Attr(" 2053 << "cast<" << R.getName() << "Attr>(A));\n"; 2054 } 2055 OS << " }\n"; // end case 2056 OS << "}\n"; // end function 2057 OS << "#endif // ATTR_VISITOR_DECLS_ONLY\n"; 2058} 2059 2060// Emits code to instantiate dependent attributes on templates. 2061void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS) { 2062 emitSourceFileHeader("Template instantiation code for attributes", OS); 2063 2064 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 2065 2066 OS << "namespace clang {\n" 2067 << "namespace sema {\n\n" 2068 << "Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, " 2069 << "Sema &S,\n" 2070 << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n" 2071 << " switch (At->getKind()) {\n" 2072 << " default:\n" 2073 << " break;\n"; 2074 2075 for (const auto *Attr : Attrs) { 2076 const Record &R = *Attr; 2077 if (!R.getValueAsBit("ASTNode")) 2078 continue; 2079 2080 OS << " case attr::" << R.getName() << ": {\n"; 2081 bool ShouldClone = R.getValueAsBit("Clone"); 2082 2083 if (!ShouldClone) { 2084 OS << " return NULL;\n"; 2085 OS << " }\n"; 2086 continue; 2087 } 2088 2089 OS << " const " << R.getName() << "Attr *A = cast<" 2090 << R.getName() << "Attr>(At);\n"; 2091 bool TDependent = R.getValueAsBit("TemplateDependent"); 2092 2093 if (!TDependent) { 2094 OS << " return A->clone(C);\n"; 2095 OS << " }\n"; 2096 continue; 2097 } 2098 2099 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args"); 2100 std::vector<std::unique_ptr<Argument>> Args; 2101 Args.reserve(ArgRecords.size()); 2102 2103 for (const auto *ArgRecord : ArgRecords) 2104 Args.emplace_back(createArgument(*ArgRecord, R.getName())); 2105 2106 for (auto const &ai : Args) 2107 ai->writeTemplateInstantiation(OS); 2108 2109 OS << " return new (C) " << R.getName() << "Attr(A->getLocation(), C"; 2110 for (auto const &ai : Args) { 2111 OS << ", "; 2112 ai->writeTemplateInstantiationArgs(OS); 2113 } 2114 OS << ", A->getSpellingListIndex());\n }\n"; 2115 } 2116 OS << " } // end switch\n" 2117 << " llvm_unreachable(\"Unknown attribute!\");\n" 2118 << " return 0;\n" 2119 << "}\n\n" 2120 << "} // end namespace sema\n" 2121 << "} // end namespace clang\n"; 2122} 2123 2124// Emits the list of parsed attributes. 2125void EmitClangAttrParsedAttrList(RecordKeeper &Records, raw_ostream &OS) { 2126 emitSourceFileHeader("List of all attributes that Clang recognizes", OS); 2127 2128 OS << "#ifndef PARSED_ATTR\n"; 2129 OS << "#define PARSED_ATTR(NAME) NAME\n"; 2130 OS << "#endif\n\n"; 2131 2132 ParsedAttrMap Names = getParsedAttrList(Records); 2133 for (const auto &I : Names) { 2134 OS << "PARSED_ATTR(" << I.first << ")\n"; 2135 } 2136} 2137 2138static bool isArgVariadic(const Record &R, StringRef AttrName) { 2139 return createArgument(R, AttrName)->isVariadic(); 2140} 2141 2142static void emitArgInfo(const Record &R, std::stringstream &OS) { 2143 // This function will count the number of arguments specified for the 2144 // attribute and emit the number of required arguments followed by the 2145 // number of optional arguments. 2146 std::vector<Record *> Args = R.getValueAsListOfDefs("Args"); 2147 unsigned ArgCount = 0, OptCount = 0; 2148 bool HasVariadic = false; 2149 for (const auto *Arg : Args) { 2150 Arg->getValueAsBit("Optional") ? ++OptCount : ++ArgCount; 2151 if (!HasVariadic && isArgVariadic(*Arg, R.getName())) 2152 HasVariadic = true; 2153 } 2154 2155 // If there is a variadic argument, we will set the optional argument count 2156 // to its largest value. Since it's currently a 4-bit number, we set it to 15. 2157 OS << ArgCount << ", " << (HasVariadic ? 15 : OptCount); 2158} 2159 2160static void GenerateDefaultAppertainsTo(raw_ostream &OS) { 2161 OS << "static bool defaultAppertainsTo(Sema &, const AttributeList &,"; 2162 OS << "const Decl *) {\n"; 2163 OS << " return true;\n"; 2164 OS << "}\n\n"; 2165} 2166 2167static std::string CalculateDiagnostic(const Record &S) { 2168 // If the SubjectList object has a custom diagnostic associated with it, 2169 // return that directly. 2170 std::string CustomDiag = S.getValueAsString("CustomDiag"); 2171 if (!CustomDiag.empty()) 2172 return CustomDiag; 2173 2174 // Given the list of subjects, determine what diagnostic best fits. 2175 enum { 2176 Func = 1U << 0, 2177 Var = 1U << 1, 2178 ObjCMethod = 1U << 2, 2179 Param = 1U << 3, 2180 Class = 1U << 4, 2181 GenericRecord = 1U << 5, 2182 Type = 1U << 6, 2183 ObjCIVar = 1U << 7, 2184 ObjCProp = 1U << 8, 2185 ObjCInterface = 1U << 9, 2186 Block = 1U << 10, 2187 Namespace = 1U << 11, 2188 Field = 1U << 12, 2189 CXXMethod = 1U << 13, 2190 ObjCProtocol = 1U << 14 2191 }; 2192 uint32_t SubMask = 0; 2193 2194 std::vector<Record *> Subjects = S.getValueAsListOfDefs("Subjects"); 2195 for (const auto *Subject : Subjects) { 2196 const Record &R = *Subject; 2197 std::string Name; 2198 2199 if (R.isSubClassOf("SubsetSubject")) { 2200 PrintError(R.getLoc(), "SubsetSubjects should use a custom diagnostic"); 2201 // As a fallback, look through the SubsetSubject to see what its base 2202 // type is, and use that. This needs to be updated if SubsetSubjects 2203 // are allowed within other SubsetSubjects. 2204 Name = R.getValueAsDef("Base")->getName(); 2205 } else 2206 Name = R.getName(); 2207 2208 uint32_t V = StringSwitch<uint32_t>(Name) 2209 .Case("Function", Func) 2210 .Case("Var", Var) 2211 .Case("ObjCMethod", ObjCMethod) 2212 .Case("ParmVar", Param) 2213 .Case("TypedefName", Type) 2214 .Case("ObjCIvar", ObjCIVar) 2215 .Case("ObjCProperty", ObjCProp) 2216 .Case("Record", GenericRecord) 2217 .Case("ObjCInterface", ObjCInterface) 2218 .Case("ObjCProtocol", ObjCProtocol) 2219 .Case("Block", Block) 2220 .Case("CXXRecord", Class) 2221 .Case("Namespace", Namespace) 2222 .Case("Field", Field) 2223 .Case("CXXMethod", CXXMethod) 2224 .Default(0); 2225 if (!V) { 2226 // Something wasn't in our mapping, so be helpful and let the developer 2227 // know about it. 2228 PrintFatalError(R.getLoc(), "Unknown subject type: " + R.getName()); 2229 return ""; 2230 } 2231 2232 SubMask |= V; 2233 } 2234 2235 switch (SubMask) { 2236 // For the simple cases where there's only a single entry in the mask, we 2237 // don't have to resort to bit fiddling. 2238 case Func: return "ExpectedFunction"; 2239 case Var: return "ExpectedVariable"; 2240 case Param: return "ExpectedParameter"; 2241 case Class: return "ExpectedClass"; 2242 case 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 2280static std::string GetSubjectWithSuffix(const Record *R) { 2281 std::string B = R->getName(); 2282 if (B == "DeclBase") 2283 return "Decl"; 2284 return B + "Decl"; 2285} 2286static 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 2318static 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 2373static 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 2380static 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 Test += "S.LangOpts." + Part; 2396 if (I + 1 != E) 2397 Test += " || "; 2398 FnName += Part; 2399 } 2400 FnName += "LangOpts"; 2401 2402 // If this code has already been generated, simply return the previous 2403 // instance of it. 2404 static std::set<std::string> CustomLangOptsSet; 2405 std::set<std::string>::iterator I = CustomLangOptsSet.find(FnName); 2406 if (I != CustomLangOptsSet.end()) 2407 return *I; 2408 2409 OS << "static bool " << FnName << "(Sema &S, const AttributeList &Attr) {\n"; 2410 OS << " if (" << Test << ")\n"; 2411 OS << " return true;\n\n"; 2412 OS << " S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) "; 2413 OS << "<< Attr.getName();\n"; 2414 OS << " return false;\n"; 2415 OS << "}\n\n"; 2416 2417 CustomLangOptsSet.insert(FnName); 2418 return FnName; 2419} 2420 2421static void GenerateDefaultTargetRequirements(raw_ostream &OS) { 2422 OS << "static bool defaultTargetRequirements(const llvm::Triple &) {\n"; 2423 OS << " return true;\n"; 2424 OS << "}\n\n"; 2425} 2426 2427static std::string GenerateTargetRequirements(const Record &Attr, 2428 const ParsedAttrMap &Dupes, 2429 raw_ostream &OS) { 2430 // If the attribute is not a target specific attribute, return the default 2431 // target handler. 2432 if (!Attr.isSubClassOf("TargetSpecificAttr")) 2433 return "defaultTargetRequirements"; 2434 2435 // Get the list of architectures to be tested for. 2436 const Record *R = Attr.getValueAsDef("Target"); 2437 std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches"); 2438 if (Arches.empty()) { 2439 PrintError(Attr.getLoc(), "Empty list of target architectures for a " 2440 "target-specific attr"); 2441 return "defaultTargetRequirements"; 2442 } 2443 2444 // If there are other attributes which share the same parsed attribute kind, 2445 // such as target-specific attributes with a shared spelling, collapse the 2446 // duplicate architectures. This is required because a shared target-specific 2447 // attribute has only one AttributeList::Kind enumeration value, but it 2448 // applies to multiple target architectures. In order for the attribute to be 2449 // considered valid, all of its architectures need to be included. 2450 if (!Attr.isValueUnset("ParseKind")) { 2451 std::string APK = Attr.getValueAsString("ParseKind"); 2452 for (const auto &I : Dupes) { 2453 if (I.first == APK) { 2454 std::vector<std::string> DA = I.second->getValueAsDef("Target") 2455 ->getValueAsListOfStrings("Arches"); 2456 std::copy(DA.begin(), DA.end(), std::back_inserter(Arches)); 2457 } 2458 } 2459 } 2460 2461 std::string FnName = "isTarget", Test = "("; 2462 for (auto I = Arches.begin(), E = Arches.end(); I != E; ++I) { 2463 std::string Part = *I; 2464 Test += "Arch == llvm::Triple::" + Part; 2465 if (I + 1 != E) 2466 Test += " || "; 2467 FnName += Part; 2468 } 2469 Test += ")"; 2470 2471 // If the target also requires OS testing, generate those tests as well. 2472 bool UsesOS = false; 2473 if (!R->isValueUnset("OSes")) { 2474 UsesOS = true; 2475 2476 // We know that there was at least one arch test, so we need to and in the 2477 // OS tests. 2478 Test += " && ("; 2479 std::vector<std::string> OSes = R->getValueAsListOfStrings("OSes"); 2480 for (auto I = OSes.begin(), E = OSes.end(); I != E; ++I) { 2481 std::string Part = *I; 2482 2483 Test += "OS == llvm::Triple::" + Part; 2484 if (I + 1 != E) 2485 Test += " || "; 2486 FnName += Part; 2487 } 2488 Test += ")"; 2489 } 2490 2491 // If this code has already been generated, simply return the previous 2492 // instance of it. 2493 static std::set<std::string> CustomTargetSet; 2494 std::set<std::string>::iterator I = CustomTargetSet.find(FnName); 2495 if (I != CustomTargetSet.end()) 2496 return *I; 2497 2498 OS << "static bool " << FnName << "(const llvm::Triple &T) {\n"; 2499 OS << " llvm::Triple::ArchType Arch = T.getArch();\n"; 2500 if (UsesOS) 2501 OS << " llvm::Triple::OSType OS = T.getOS();\n"; 2502 OS << " return " << Test << ";\n"; 2503 OS << "}\n\n"; 2504 2505 CustomTargetSet.insert(FnName); 2506 return FnName; 2507} 2508 2509static void GenerateDefaultSpellingIndexToSemanticSpelling(raw_ostream &OS) { 2510 OS << "static unsigned defaultSpellingIndexToSemanticSpelling(" 2511 << "const AttributeList &Attr) {\n"; 2512 OS << " return UINT_MAX;\n"; 2513 OS << "}\n\n"; 2514} 2515 2516static std::string GenerateSpellingIndexToSemanticSpelling(const Record &Attr, 2517 raw_ostream &OS) { 2518 // If the attribute does not have a semantic form, we can bail out early. 2519 if (!Attr.getValueAsBit("ASTNode")) 2520 return "defaultSpellingIndexToSemanticSpelling"; 2521 2522 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr); 2523 2524 // If there are zero or one spellings, or all of the spellings share the same 2525 // name, we can also bail out early. 2526 if (Spellings.size() <= 1 || SpellingNamesAreCommon(Spellings)) 2527 return "defaultSpellingIndexToSemanticSpelling"; 2528 2529 // Generate the enumeration we will use for the mapping. 2530 SemanticSpellingMap SemanticToSyntacticMap; 2531 std::string Enum = CreateSemanticSpellings(Spellings, SemanticToSyntacticMap); 2532 std::string Name = Attr.getName() + "AttrSpellingMap"; 2533 2534 OS << "static unsigned " << Name << "(const AttributeList &Attr) {\n"; 2535 OS << Enum; 2536 OS << " unsigned Idx = Attr.getAttributeSpellingListIndex();\n"; 2537 WriteSemanticSpellingSwitch("Idx", SemanticToSyntacticMap, OS); 2538 OS << "}\n\n"; 2539 2540 return Name; 2541} 2542 2543static bool IsKnownToGCC(const Record &Attr) { 2544 // Look at the spellings for this subject; if there are any spellings which 2545 // claim to be known to GCC, the attribute is known to GCC. 2546 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr); 2547 for (const auto &I : Spellings) { 2548 if (I.knownToGCC()) 2549 return true; 2550 } 2551 return false; 2552} 2553 2554/// Emits the parsed attribute helpers 2555void EmitClangAttrParsedAttrImpl(RecordKeeper &Records, raw_ostream &OS) { 2556 emitSourceFileHeader("Parsed attribute helpers", OS); 2557 2558 // Get the list of parsed attributes, and accept the optional list of 2559 // duplicates due to the ParseKind. 2560 ParsedAttrMap Dupes; 2561 ParsedAttrMap Attrs = getParsedAttrList(Records, &Dupes); 2562 2563 // Generate the default appertainsTo, target and language option diagnostic, 2564 // and spelling list index mapping methods. 2565 GenerateDefaultAppertainsTo(OS); 2566 GenerateDefaultLangOptRequirements(OS); 2567 GenerateDefaultTargetRequirements(OS); 2568 GenerateDefaultSpellingIndexToSemanticSpelling(OS); 2569 2570 // Generate the appertainsTo diagnostic methods and write their names into 2571 // another mapping. At the same time, generate the AttrInfoMap object 2572 // contents. Due to the reliance on generated code, use separate streams so 2573 // that code will not be interleaved. 2574 std::stringstream SS; 2575 for (auto I = Attrs.begin(), E = Attrs.end(); I != E; ++I) { 2576 // TODO: If the attribute's kind appears in the list of duplicates, that is 2577 // because it is a target-specific attribute that appears multiple times. 2578 // It would be beneficial to test whether the duplicates are "similar 2579 // enough" to each other to not cause problems. For instance, check that 2580 // the spellings are identical, and custom parsing rules match, etc. 2581 2582 // We need to generate struct instances based off ParsedAttrInfo from 2583 // AttributeList.cpp. 2584 SS << " { "; 2585 emitArgInfo(*I->second, SS); 2586 SS << ", " << I->second->getValueAsBit("HasCustomParsing"); 2587 SS << ", " << I->second->isSubClassOf("TargetSpecificAttr"); 2588 SS << ", " << I->second->isSubClassOf("TypeAttr"); 2589 SS << ", " << IsKnownToGCC(*I->second); 2590 SS << ", " << GenerateAppertainsTo(*I->second, OS); 2591 SS << ", " << GenerateLangOptRequirements(*I->second, OS); 2592 SS << ", " << GenerateTargetRequirements(*I->second, Dupes, OS); 2593 SS << ", " << GenerateSpellingIndexToSemanticSpelling(*I->second, OS); 2594 SS << " }"; 2595 2596 if (I + 1 != E) 2597 SS << ","; 2598 2599 SS << " // AT_" << I->first << "\n"; 2600 } 2601 2602 OS << "static const ParsedAttrInfo AttrInfoMap[AttributeList::UnknownAttribute + 1] = {\n"; 2603 OS << SS.str(); 2604 OS << "};\n\n"; 2605} 2606 2607// Emits the kind list of parsed attributes 2608void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream &OS) { 2609 emitSourceFileHeader("Attribute name matcher", OS); 2610 2611 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"); 2612 std::vector<StringMatcher::StringPair> GNU, Declspec, CXX11, Keywords, Pragma; 2613 std::set<std::string> Seen; 2614 for (const auto *A : Attrs) { 2615 const Record &Attr = *A; 2616 2617 bool SemaHandler = Attr.getValueAsBit("SemaHandler"); 2618 bool Ignored = Attr.getValueAsBit("Ignored"); 2619 if (SemaHandler || Ignored) { 2620 // Attribute spellings can be shared between target-specific attributes, 2621 // and can be shared between syntaxes for the same attribute. For 2622 // instance, an attribute can be spelled GNU<"interrupt"> for an ARM- 2623 // specific attribute, or MSP430-specific attribute. Additionally, an 2624 // attribute can be spelled GNU<"dllexport"> and Declspec<"dllexport"> 2625 // for the same semantic attribute. Ultimately, we need to map each of 2626 // these to a single AttributeList::Kind value, but the StringMatcher 2627 // class cannot handle duplicate match strings. So we generate a list of 2628 // string to match based on the syntax, and emit multiple string matchers 2629 // depending on the syntax used. 2630 std::string AttrName; 2631 if (Attr.isSubClassOf("TargetSpecificAttr") && 2632 !Attr.isValueUnset("ParseKind")) { 2633 AttrName = Attr.getValueAsString("ParseKind"); 2634 if (Seen.find(AttrName) != Seen.end()) 2635 continue; 2636 Seen.insert(AttrName); 2637 } else 2638 AttrName = NormalizeAttrName(StringRef(Attr.getName())).str(); 2639 2640 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(Attr); 2641 for (const auto &S : Spellings) { 2642 std::string RawSpelling = S.name(); 2643 std::vector<StringMatcher::StringPair> *Matches = nullptr; 2644 std::string Spelling, Variety = S.variety(); 2645 if (Variety == "CXX11") { 2646 Matches = &CXX11; 2647 Spelling += S.nameSpace(); 2648 Spelling += "::"; 2649 } else if (Variety == "GNU") 2650 Matches = &GNU; 2651 else if (Variety == "Declspec") 2652 Matches = &Declspec; 2653 else if (Variety == "Keyword") 2654 Matches = &Keywords; 2655 else if (Variety == "Pragma") 2656 Matches = &Pragma; 2657 2658 assert(Matches && "Unsupported spelling variety found"); 2659 2660 Spelling += NormalizeAttrSpelling(RawSpelling); 2661 if (SemaHandler) 2662 Matches->push_back(StringMatcher::StringPair(Spelling, 2663 "return AttributeList::AT_" + AttrName + ";")); 2664 else 2665 Matches->push_back(StringMatcher::StringPair(Spelling, 2666 "return AttributeList::IgnoredAttribute;")); 2667 } 2668 } 2669 } 2670 2671 OS << "static AttributeList::Kind getAttrKind(StringRef Name, "; 2672 OS << "AttributeList::Syntax Syntax) {\n"; 2673 OS << " if (AttributeList::AS_GNU == Syntax) {\n"; 2674 StringMatcher("Name", GNU, OS).Emit(); 2675 OS << " } else if (AttributeList::AS_Declspec == Syntax) {\n"; 2676 StringMatcher("Name", Declspec, OS).Emit(); 2677 OS << " } else if (AttributeList::AS_CXX11 == Syntax) {\n"; 2678 StringMatcher("Name", CXX11, OS).Emit(); 2679 OS << " } else if (AttributeList::AS_Keyword == Syntax) {\n"; 2680 StringMatcher("Name", Keywords, OS).Emit(); 2681 OS << " } else if (AttributeList::AS_Pragma == Syntax) {\n"; 2682 StringMatcher("Name", Pragma, OS).Emit(); 2683 OS << " }\n"; 2684 OS << " return AttributeList::UnknownAttribute;\n" 2685 << "}\n"; 2686} 2687 2688// Emits the code to dump an attribute. 2689void EmitClangAttrDump(RecordKeeper &Records, raw_ostream &OS) { 2690 emitSourceFileHeader("Attribute dumper", OS); 2691 2692 OS << 2693 " switch (A->getKind()) {\n" 2694 " default:\n" 2695 " llvm_unreachable(\"Unknown attribute kind!\");\n" 2696 " break;\n"; 2697 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args; 2698 for (const auto *Attr : Attrs) { 2699 const Record &R = *Attr; 2700 if (!R.getValueAsBit("ASTNode")) 2701 continue; 2702 OS << " case attr::" << R.getName() << ": {\n"; 2703 2704 // If the attribute has a semantically-meaningful name (which is determined 2705 // by whether there is a Spelling enumeration for it), then write out the 2706 // spelling used for the attribute. 2707 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(R); 2708 if (Spellings.size() > 1 && !SpellingNamesAreCommon(Spellings)) 2709 OS << " OS << \" \" << A->getSpelling();\n"; 2710 2711 Args = R.getValueAsListOfDefs("Args"); 2712 if (!Args.empty()) { 2713 OS << " const " << R.getName() << "Attr *SA = cast<" << R.getName() 2714 << "Attr>(A);\n"; 2715 for (const auto *Arg : Args) 2716 createArgument(*Arg, R.getName())->writeDump(OS); 2717 2718 for (auto AI = Args.begin(), AE = Args.end(); AI != AE; ++AI) 2719 createArgument(**AI, R.getName())->writeDumpChildren(OS); 2720 } 2721 OS << 2722 " break;\n" 2723 " }\n"; 2724 } 2725 OS << " }\n"; 2726} 2727 2728void EmitClangAttrParserStringSwitches(RecordKeeper &Records, 2729 raw_ostream &OS) { 2730 emitSourceFileHeader("Parser-related llvm::StringSwitch cases", OS); 2731 emitClangAttrArgContextList(Records, OS); 2732 emitClangAttrIdentifierArgList(Records, OS); 2733 emitClangAttrTypeArgList(Records, OS); 2734 emitClangAttrLateParsedList(Records, OS); 2735} 2736 2737class DocumentationData { 2738public: 2739 const Record *Documentation; 2740 const Record *Attribute; 2741 2742 DocumentationData(const Record &Documentation, const Record &Attribute) 2743 : Documentation(&Documentation), Attribute(&Attribute) {} 2744}; 2745 2746static void WriteCategoryHeader(const Record *DocCategory, 2747 raw_ostream &OS) { 2748 const std::string &Name = DocCategory->getValueAsString("Name"); 2749 OS << Name << "\n" << std::string(Name.length(), '=') << "\n"; 2750 2751 // If there is content, print that as well. 2752 std::string ContentStr = DocCategory->getValueAsString("Content"); 2753 if (!ContentStr.empty()) { 2754 // Trim leading and trailing newlines and spaces. 2755 StringRef Content(ContentStr); 2756 while (Content.startswith("\r") || Content.startswith("\n") || 2757 Content.startswith(" ") || Content.startswith("\t")) 2758 Content = Content.substr(1); 2759 while (Content.endswith("\r") || Content.endswith("\n") || 2760 Content.endswith(" ") || Content.endswith("\t")) 2761 Content = Content.substr(0, Content.size() - 1); 2762 OS << Content; 2763 } 2764 OS << "\n\n"; 2765} 2766 2767enum SpellingKind { 2768 GNU = 1 << 0, 2769 CXX11 = 1 << 1, 2770 Declspec = 1 << 2, 2771 Keyword = 1 << 3, 2772 Pragma = 1 << 4 2773}; 2774 2775static void WriteDocumentation(const DocumentationData &Doc, 2776 raw_ostream &OS) { 2777 // FIXME: there is no way to have a per-spelling category for the attribute 2778 // documentation. This may not be a limiting factor since the spellings 2779 // should generally be consistently applied across the category. 2780 2781 std::vector<FlattenedSpelling> Spellings = GetFlattenedSpellings(*Doc.Attribute); 2782 2783 // Determine the heading to be used for this attribute. 2784 std::string Heading = Doc.Documentation->getValueAsString("Heading"); 2785 bool CustomHeading = !Heading.empty(); 2786 if (Heading.empty()) { 2787 // If there's only one spelling, we can simply use that. 2788 if (Spellings.size() == 1) 2789 Heading = Spellings.begin()->name(); 2790 else { 2791 std::set<std::string> Uniques; 2792 for (auto I = Spellings.begin(), E = Spellings.end(); 2793 I != E && Uniques.size() <= 1; ++I) { 2794 std::string Spelling = NormalizeNameForSpellingComparison(I->name()); 2795 Uniques.insert(Spelling); 2796 } 2797 // If the semantic map has only one spelling, that is sufficient for our 2798 // needs. 2799 if (Uniques.size() == 1) 2800 Heading = *Uniques.begin(); 2801 } 2802 } 2803 2804 // If the heading is still empty, it is an error. 2805 if (Heading.empty()) 2806 PrintFatalError(Doc.Attribute->getLoc(), 2807 "This attribute requires a heading to be specified"); 2808 2809 // Gather a list of unique spellings; this is not the same as the semantic 2810 // spelling for the attribute. Variations in underscores and other non- 2811 // semantic characters are still acceptable. 2812 std::vector<std::string> Names; 2813 2814 unsigned SupportedSpellings = 0; 2815 for (const auto &I : Spellings) { 2816 SpellingKind Kind = StringSwitch<SpellingKind>(I.variety()) 2817 .Case("GNU", GNU) 2818 .Case("CXX11", CXX11) 2819 .Case("Declspec", Declspec) 2820 .Case("Keyword", Keyword) 2821 .Case("Pragma", Pragma); 2822 2823 // Mask in the supported spelling. 2824 SupportedSpellings |= Kind; 2825 2826 std::string Name; 2827 if (Kind == CXX11 && !I.nameSpace().empty()) 2828 Name = I.nameSpace() + "::"; 2829 Name += I.name(); 2830 2831 // If this name is the same as the heading, do not add it. 2832 if (Name != Heading) 2833 Names.push_back(Name); 2834 } 2835 2836 // Print out the heading for the attribute. If there are alternate spellings, 2837 // then display those after the heading. 2838 if (!CustomHeading && !Names.empty()) { 2839 Heading += " ("; 2840 for (auto I = Names.begin(), E = Names.end(); I != E; ++I) { 2841 if (I != Names.begin()) 2842 Heading += ", "; 2843 Heading += *I; 2844 } 2845 Heading += ")"; 2846 } 2847 OS << Heading << "\n" << std::string(Heading.length(), '-') << "\n"; 2848 2849 if (!SupportedSpellings) 2850 PrintFatalError(Doc.Attribute->getLoc(), 2851 "Attribute has no supported spellings; cannot be " 2852 "documented"); 2853 2854 // List what spelling syntaxes the attribute supports. 2855 OS << ".. csv-table:: Supported Syntaxes\n"; 2856 OS << " :header: \"GNU\", \"C++11\", \"__declspec\", \"Keyword\","; 2857 OS << " \"Pragma\"\n\n"; 2858 OS << " \""; 2859 if (SupportedSpellings & GNU) OS << "X"; 2860 OS << "\",\""; 2861 if (SupportedSpellings & CXX11) OS << "X"; 2862 OS << "\",\""; 2863 if (SupportedSpellings & Declspec) OS << "X"; 2864 OS << "\",\""; 2865 if (SupportedSpellings & Keyword) OS << "X"; 2866 OS << "\", \""; 2867 if (SupportedSpellings & Pragma) OS << "X"; 2868 OS << "\"\n\n"; 2869 2870 // If the attribute is deprecated, print a message about it, and possibly 2871 // provide a replacement attribute. 2872 if (!Doc.Documentation->isValueUnset("Deprecated")) { 2873 OS << "This attribute has been deprecated, and may be removed in a future " 2874 << "version of Clang."; 2875 const Record &Deprecated = *Doc.Documentation->getValueAsDef("Deprecated"); 2876 std::string Replacement = Deprecated.getValueAsString("Replacement"); 2877 if (!Replacement.empty()) 2878 OS << " This attribute has been superseded by ``" 2879 << Replacement << "``."; 2880 OS << "\n\n"; 2881 } 2882 2883 std::string ContentStr = Doc.Documentation->getValueAsString("Content"); 2884 // Trim leading and trailing newlines and spaces. 2885 StringRef Content(ContentStr); 2886 while (Content.startswith("\r") || Content.startswith("\n") || 2887 Content.startswith(" ") || Content.startswith("\t")) 2888 Content = Content.substr(1); 2889 while (Content.endswith("\r") || Content.endswith("\n") || 2890 Content.endswith(" ") || Content.endswith("\t")) 2891 Content = Content.substr(0, Content.size() - 1); 2892 OS << Content; 2893 2894 OS << "\n\n\n"; 2895} 2896 2897void EmitClangAttrDocs(RecordKeeper &Records, raw_ostream &OS) { 2898 // Get the documentation introduction paragraph. 2899 const Record *Documentation = Records.getDef("GlobalDocumentation"); 2900 if (!Documentation) { 2901 PrintFatalError("The Documentation top-level definition is missing, " 2902 "no documentation will be generated."); 2903 return; 2904 } 2905 2906 OS << Documentation->getValueAsString("Intro") << "\n"; 2907 2908 // Gather the Documentation lists from each of the attributes, based on the 2909 // category provided. 2910 std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr"); 2911 std::map<const Record *, std::vector<DocumentationData>> SplitDocs; 2912 for (const auto *A : Attrs) { 2913 const Record &Attr = *A; 2914 std::vector<Record *> Docs = Attr.getValueAsListOfDefs("Documentation"); 2915 for (const auto *D : Docs) { 2916 const Record &Doc = *D; 2917 const Record *Category = Doc.getValueAsDef("Category"); 2918 // If the category is "undocumented", then there cannot be any other 2919 // documentation categories (otherwise, the attribute would become 2920 // documented). 2921 std::string Cat = Category->getValueAsString("Name"); 2922 bool Undocumented = Cat == "Undocumented"; 2923 if (Undocumented && Docs.size() > 1) 2924 PrintFatalError(Doc.getLoc(), 2925 "Attribute is \"Undocumented\", but has multiple " 2926 "documentation categories"); 2927 2928 if (!Undocumented) 2929 SplitDocs[Category].push_back(DocumentationData(Doc, Attr)); 2930 } 2931 } 2932 2933 // Having split the attributes out based on what documentation goes where, 2934 // we can begin to generate sections of documentation. 2935 for (const auto &I : SplitDocs) { 2936 WriteCategoryHeader(I.first, OS); 2937 2938 // Walk over each of the attributes in the category and write out their 2939 // documentation. 2940 for (const auto &Doc : I.second) 2941 WriteDocumentation(Doc, OS); 2942 } 2943} 2944 2945} // end namespace clang 2946