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/StringSwitch.h" 16 #include "llvm/TableGen/Record.h" 17 #include "llvm/TableGen/StringMatcher.h" 18 #include "llvm/TableGen/TableGenBackend.h" 19 #include <algorithm> 20 #include <cctype> 21 22 using namespace llvm; 23 24 static const std::vector<StringRef> 25 getValueAsListOfStrings(Record &R, StringRef FieldName) { 26 ListInit *List = R.getValueAsListInit(FieldName); 27 assert (List && "Got a null ListInit"); 28 29 std::vector<StringRef> Strings; 30 Strings.reserve(List->getSize()); 31 32 for (ListInit::const_iterator i = List->begin(), e = List->end(); 33 i != e; 34 ++i) { 35 assert(*i && "Got a null element in a ListInit"); 36 if (StringInit *S = dyn_cast<StringInit>(*i)) 37 Strings.push_back(S->getValue()); 38 else 39 assert(false && "Got a non-string, non-code element in a ListInit"); 40 } 41 42 return Strings; 43 } 44 45 static std::string ReadPCHRecord(StringRef type) { 46 return StringSwitch<std::string>(type) 47 .EndsWith("Decl *", "GetLocalDeclAs<" 48 + std::string(type, 0, type.size()-1) + ">(F, Record[Idx++])") 49 .Case("QualType", "getLocalType(F, Record[Idx++])") 50 .Case("Expr *", "ReadExpr(F)") 51 .Case("IdentifierInfo *", "GetIdentifierInfo(F, Record, Idx)") 52 .Case("SourceLocation", "ReadSourceLocation(F, Record, Idx)") 53 .Default("Record[Idx++]"); 54 } 55 56 // Assumes that the way to get the value is SA->getname() 57 static std::string WritePCHRecord(StringRef type, StringRef name) { 58 return StringSwitch<std::string>(type) 59 .EndsWith("Decl *", "AddDeclRef(" + std::string(name) + 60 ", Record);\n") 61 .Case("QualType", "AddTypeRef(" + std::string(name) + ", Record);\n") 62 .Case("Expr *", "AddStmt(" + std::string(name) + ");\n") 63 .Case("IdentifierInfo *", 64 "AddIdentifierRef(" + std::string(name) + ", Record);\n") 65 .Case("SourceLocation", 66 "AddSourceLocation(" + std::string(name) + ", Record);\n") 67 .Default("Record.push_back(" + std::string(name) + ");\n"); 68 } 69 70 // Normalize attribute name by removing leading and trailing 71 // underscores. For example, __foo, foo__, __foo__ would 72 // become foo. 73 static StringRef NormalizeAttrName(StringRef AttrName) { 74 if (AttrName.startswith("__")) 75 AttrName = AttrName.substr(2, AttrName.size()); 76 77 if (AttrName.endswith("__")) 78 AttrName = AttrName.substr(0, AttrName.size() - 2); 79 80 return AttrName; 81 } 82 83 // Normalize attribute spelling only if the spelling has both leading 84 // and trailing underscores. For example, __ms_struct__ will be 85 // normalized to "ms_struct"; __cdecl will remain intact. 86 static StringRef NormalizeAttrSpelling(StringRef AttrSpelling) { 87 if (AttrSpelling.startswith("__") && AttrSpelling.endswith("__")) { 88 AttrSpelling = AttrSpelling.substr(2, AttrSpelling.size() - 4); 89 } 90 91 return AttrSpelling; 92 } 93 94 namespace { 95 class Argument { 96 std::string lowerName, upperName; 97 StringRef attrName; 98 99 public: 100 Argument(Record &Arg, StringRef Attr) 101 : lowerName(Arg.getValueAsString("Name")), upperName(lowerName), 102 attrName(Attr) { 103 if (!lowerName.empty()) { 104 lowerName[0] = std::tolower(lowerName[0]); 105 upperName[0] = std::toupper(upperName[0]); 106 } 107 } 108 virtual ~Argument() {} 109 110 StringRef getLowerName() const { return lowerName; } 111 StringRef getUpperName() const { return upperName; } 112 StringRef getAttrName() const { return attrName; } 113 114 // These functions print the argument contents formatted in different ways. 115 virtual void writeAccessors(raw_ostream &OS) const = 0; 116 virtual void writeAccessorDefinitions(raw_ostream &OS) const {} 117 virtual void writeCloneArgs(raw_ostream &OS) const = 0; 118 virtual void writeTemplateInstantiationArgs(raw_ostream &OS) const = 0; 119 virtual void writeTemplateInstantiation(raw_ostream &OS) const {} 120 virtual void writeCtorBody(raw_ostream &OS) const {} 121 virtual void writeCtorInitializers(raw_ostream &OS) const = 0; 122 virtual void writeCtorParameters(raw_ostream &OS) const = 0; 123 virtual void writeDeclarations(raw_ostream &OS) const = 0; 124 virtual void writePCHReadArgs(raw_ostream &OS) const = 0; 125 virtual void writePCHReadDecls(raw_ostream &OS) const = 0; 126 virtual void writePCHWrite(raw_ostream &OS) const = 0; 127 virtual void writeValue(raw_ostream &OS) const = 0; 128 virtual void writeDump(raw_ostream &OS) const = 0; 129 virtual void writeDumpChildren(raw_ostream &OS) const {} 130 virtual void writeHasChildren(raw_ostream &OS) const { OS << "false"; } 131 }; 132 133 class SimpleArgument : public Argument { 134 std::string type; 135 136 public: 137 SimpleArgument(Record &Arg, StringRef Attr, std::string T) 138 : Argument(Arg, Attr), type(T) 139 {} 140 141 std::string getType() const { return type; } 142 143 void writeAccessors(raw_ostream &OS) const { 144 OS << " " << type << " get" << getUpperName() << "() const {\n"; 145 OS << " return " << getLowerName() << ";\n"; 146 OS << " }"; 147 } 148 void writeCloneArgs(raw_ostream &OS) const { 149 OS << getLowerName(); 150 } 151 void writeTemplateInstantiationArgs(raw_ostream &OS) const { 152 OS << "A->get" << getUpperName() << "()"; 153 } 154 void writeCtorInitializers(raw_ostream &OS) const { 155 OS << getLowerName() << "(" << getUpperName() << ")"; 156 } 157 void writeCtorParameters(raw_ostream &OS) const { 158 OS << type << " " << getUpperName(); 159 } 160 void writeDeclarations(raw_ostream &OS) const { 161 OS << type << " " << getLowerName() << ";"; 162 } 163 void writePCHReadDecls(raw_ostream &OS) const { 164 std::string read = ReadPCHRecord(type); 165 OS << " " << type << " " << getLowerName() << " = " << read << ";\n"; 166 } 167 void writePCHReadArgs(raw_ostream &OS) const { 168 OS << getLowerName(); 169 } 170 void writePCHWrite(raw_ostream &OS) const { 171 OS << " " << WritePCHRecord(type, "SA->get" + 172 std::string(getUpperName()) + "()"); 173 } 174 void writeValue(raw_ostream &OS) const { 175 if (type == "FunctionDecl *") { 176 OS << "\" << get" << getUpperName() << "()->getNameInfo().getAsString() << \""; 177 } else if (type == "IdentifierInfo *") { 178 OS << "\" << get" << getUpperName() << "()->getName() << \""; 179 } else if (type == "QualType") { 180 OS << "\" << get" << getUpperName() << "().getAsString() << \""; 181 } else if (type == "SourceLocation") { 182 OS << "\" << get" << getUpperName() << "().getRawEncoding() << \""; 183 } else { 184 OS << "\" << get" << getUpperName() << "() << \""; 185 } 186 } 187 void writeDump(raw_ostream &OS) const { 188 if (type == "FunctionDecl *") { 189 OS << " OS << \" \";\n"; 190 OS << " dumpBareDeclRef(SA->get" << getUpperName() << "());\n"; 191 } else if (type == "IdentifierInfo *") { 192 OS << " OS << \" \" << SA->get" << getUpperName() 193 << "()->getName();\n"; 194 } else if (type == "QualType") { 195 OS << " OS << \" \" << SA->get" << getUpperName() 196 << "().getAsString();\n"; 197 } else if (type == "SourceLocation") { 198 OS << " OS << \" \";\n"; 199 OS << " SA->get" << getUpperName() << "().print(OS, *SM);\n"; 200 } else if (type == "bool") { 201 OS << " if (SA->get" << getUpperName() << "()) OS << \" " 202 << getUpperName() << "\";\n"; 203 } else if (type == "int" || type == "unsigned") { 204 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n"; 205 } else { 206 llvm_unreachable("Unknown SimpleArgument type!"); 207 } 208 } 209 }; 210 211 class StringArgument : public Argument { 212 public: 213 StringArgument(Record &Arg, StringRef Attr) 214 : Argument(Arg, Attr) 215 {} 216 217 void writeAccessors(raw_ostream &OS) const { 218 OS << " llvm::StringRef get" << getUpperName() << "() const {\n"; 219 OS << " return llvm::StringRef(" << getLowerName() << ", " 220 << getLowerName() << "Length);\n"; 221 OS << " }\n"; 222 OS << " unsigned get" << getUpperName() << "Length() const {\n"; 223 OS << " return " << getLowerName() << "Length;\n"; 224 OS << " }\n"; 225 OS << " void set" << getUpperName() 226 << "(ASTContext &C, llvm::StringRef S) {\n"; 227 OS << " " << getLowerName() << "Length = S.size();\n"; 228 OS << " this->" << getLowerName() << " = new (C, 1) char [" 229 << getLowerName() << "Length];\n"; 230 OS << " std::memcpy(this->" << getLowerName() << ", S.data(), " 231 << getLowerName() << "Length);\n"; 232 OS << " }"; 233 } 234 void writeCloneArgs(raw_ostream &OS) const { 235 OS << "get" << getUpperName() << "()"; 236 } 237 void writeTemplateInstantiationArgs(raw_ostream &OS) const { 238 OS << "A->get" << getUpperName() << "()"; 239 } 240 void writeCtorBody(raw_ostream &OS) const { 241 OS << " std::memcpy(" << getLowerName() << ", " << getUpperName() 242 << ".data(), " << getLowerName() << "Length);"; 243 } 244 void writeCtorInitializers(raw_ostream &OS) const { 245 OS << getLowerName() << "Length(" << getUpperName() << ".size())," 246 << getLowerName() << "(new (Ctx, 1) char[" << getLowerName() 247 << "Length])"; 248 } 249 void writeCtorParameters(raw_ostream &OS) const { 250 OS << "llvm::StringRef " << getUpperName(); 251 } 252 void writeDeclarations(raw_ostream &OS) const { 253 OS << "unsigned " << getLowerName() << "Length;\n"; 254 OS << "char *" << getLowerName() << ";"; 255 } 256 void writePCHReadDecls(raw_ostream &OS) const { 257 OS << " std::string " << getLowerName() 258 << "= ReadString(Record, Idx);\n"; 259 } 260 void writePCHReadArgs(raw_ostream &OS) const { 261 OS << getLowerName(); 262 } 263 void writePCHWrite(raw_ostream &OS) const { 264 OS << " AddString(SA->get" << getUpperName() << "(), Record);\n"; 265 } 266 void writeValue(raw_ostream &OS) const { 267 OS << "\\\"\" << get" << getUpperName() << "() << \"\\\""; 268 } 269 void writeDump(raw_ostream &OS) const { 270 OS << " OS << \" \\\"\" << SA->get" << getUpperName() 271 << "() << \"\\\"\";\n"; 272 } 273 }; 274 275 class AlignedArgument : public Argument { 276 public: 277 AlignedArgument(Record &Arg, StringRef Attr) 278 : Argument(Arg, Attr) 279 {} 280 281 void writeAccessors(raw_ostream &OS) const { 282 OS << " bool is" << getUpperName() << "Dependent() const;\n"; 283 284 OS << " unsigned get" << getUpperName() << "(ASTContext &Ctx) const;\n"; 285 286 OS << " bool is" << getUpperName() << "Expr() const {\n"; 287 OS << " return is" << getLowerName() << "Expr;\n"; 288 OS << " }\n"; 289 290 OS << " Expr *get" << getUpperName() << "Expr() const {\n"; 291 OS << " assert(is" << getLowerName() << "Expr);\n"; 292 OS << " return " << getLowerName() << "Expr;\n"; 293 OS << " }\n"; 294 295 OS << " TypeSourceInfo *get" << getUpperName() << "Type() const {\n"; 296 OS << " assert(!is" << getLowerName() << "Expr);\n"; 297 OS << " return " << getLowerName() << "Type;\n"; 298 OS << " }"; 299 } 300 void writeAccessorDefinitions(raw_ostream &OS) const { 301 OS << "bool " << getAttrName() << "Attr::is" << getUpperName() 302 << "Dependent() const {\n"; 303 OS << " if (is" << getLowerName() << "Expr)\n"; 304 OS << " return " << getLowerName() << "Expr && (" << getLowerName() 305 << "Expr->isValueDependent() || " << getLowerName() 306 << "Expr->isTypeDependent());\n"; 307 OS << " else\n"; 308 OS << " return " << getLowerName() 309 << "Type->getType()->isDependentType();\n"; 310 OS << "}\n"; 311 312 // FIXME: Do not do the calculation here 313 // FIXME: Handle types correctly 314 // A null pointer means maximum alignment 315 // FIXME: Load the platform-specific maximum alignment, rather than 316 // 16, the x86 max. 317 OS << "unsigned " << getAttrName() << "Attr::get" << getUpperName() 318 << "(ASTContext &Ctx) const {\n"; 319 OS << " assert(!is" << getUpperName() << "Dependent());\n"; 320 OS << " if (is" << getLowerName() << "Expr)\n"; 321 OS << " return (" << getLowerName() << "Expr ? " << getLowerName() 322 << "Expr->EvaluateKnownConstInt(Ctx).getZExtValue() : 16)" 323 << "* Ctx.getCharWidth();\n"; 324 OS << " else\n"; 325 OS << " return 0; // FIXME\n"; 326 OS << "}\n"; 327 } 328 void writeCloneArgs(raw_ostream &OS) const { 329 OS << "is" << getLowerName() << "Expr, is" << getLowerName() 330 << "Expr ? static_cast<void*>(" << getLowerName() 331 << "Expr) : " << getLowerName() 332 << "Type"; 333 } 334 void writeTemplateInstantiationArgs(raw_ostream &OS) const { 335 // FIXME: move the definition in Sema::InstantiateAttrs to here. 336 // In the meantime, aligned attributes are cloned. 337 } 338 void writeCtorBody(raw_ostream &OS) const { 339 OS << " if (is" << getLowerName() << "Expr)\n"; 340 OS << " " << getLowerName() << "Expr = reinterpret_cast<Expr *>(" 341 << getUpperName() << ");\n"; 342 OS << " else\n"; 343 OS << " " << getLowerName() 344 << "Type = reinterpret_cast<TypeSourceInfo *>(" << getUpperName() 345 << ");"; 346 } 347 void writeCtorInitializers(raw_ostream &OS) const { 348 OS << "is" << getLowerName() << "Expr(Is" << getUpperName() << "Expr)"; 349 } 350 void writeCtorParameters(raw_ostream &OS) const { 351 OS << "bool Is" << getUpperName() << "Expr, void *" << getUpperName(); 352 } 353 void writeDeclarations(raw_ostream &OS) const { 354 OS << "bool is" << getLowerName() << "Expr;\n"; 355 OS << "union {\n"; 356 OS << "Expr *" << getLowerName() << "Expr;\n"; 357 OS << "TypeSourceInfo *" << getLowerName() << "Type;\n"; 358 OS << "};"; 359 } 360 void writePCHReadArgs(raw_ostream &OS) const { 361 OS << "is" << getLowerName() << "Expr, " << getLowerName() << "Ptr"; 362 } 363 void writePCHReadDecls(raw_ostream &OS) const { 364 OS << " bool is" << getLowerName() << "Expr = Record[Idx++];\n"; 365 OS << " void *" << getLowerName() << "Ptr;\n"; 366 OS << " if (is" << getLowerName() << "Expr)\n"; 367 OS << " " << getLowerName() << "Ptr = ReadExpr(F);\n"; 368 OS << " else\n"; 369 OS << " " << getLowerName() 370 << "Ptr = GetTypeSourceInfo(F, Record, Idx);\n"; 371 } 372 void writePCHWrite(raw_ostream &OS) const { 373 OS << " Record.push_back(SA->is" << getUpperName() << "Expr());\n"; 374 OS << " if (SA->is" << getUpperName() << "Expr())\n"; 375 OS << " AddStmt(SA->get" << getUpperName() << "Expr());\n"; 376 OS << " else\n"; 377 OS << " AddTypeSourceInfo(SA->get" << getUpperName() 378 << "Type(), Record);\n"; 379 } 380 void writeValue(raw_ostream &OS) const { 381 OS << "\";\n" 382 << " " << getLowerName() << "Expr->printPretty(OS, 0, Policy);\n" 383 << " OS << \""; 384 } 385 void writeDump(raw_ostream &OS) const { 386 } 387 void writeDumpChildren(raw_ostream &OS) const { 388 OS << " if (SA->is" << getUpperName() << "Expr()) {\n"; 389 OS << " lastChild();\n"; 390 OS << " dumpStmt(SA->get" << getUpperName() << "Expr());\n"; 391 OS << " } else\n"; 392 OS << " dumpType(SA->get" << getUpperName() 393 << "Type()->getType());\n"; 394 } 395 void writeHasChildren(raw_ostream &OS) const { 396 OS << "SA->is" << getUpperName() << "Expr()"; 397 } 398 }; 399 400 class VariadicArgument : public Argument { 401 std::string type; 402 403 public: 404 VariadicArgument(Record &Arg, StringRef Attr, std::string T) 405 : Argument(Arg, Attr), type(T) 406 {} 407 408 std::string getType() const { return type; } 409 410 void writeAccessors(raw_ostream &OS) const { 411 OS << " typedef " << type << "* " << getLowerName() << "_iterator;\n"; 412 OS << " " << getLowerName() << "_iterator " << getLowerName() 413 << "_begin() const {\n"; 414 OS << " return " << getLowerName() << ";\n"; 415 OS << " }\n"; 416 OS << " " << getLowerName() << "_iterator " << getLowerName() 417 << "_end() const {\n"; 418 OS << " return " << getLowerName() << " + " << getLowerName() 419 << "Size;\n"; 420 OS << " }\n"; 421 OS << " unsigned " << getLowerName() << "_size() const {\n" 422 << " return " << getLowerName() << "Size;\n"; 423 OS << " }"; 424 } 425 void writeCloneArgs(raw_ostream &OS) const { 426 OS << getLowerName() << ", " << getLowerName() << "Size"; 427 } 428 void writeTemplateInstantiationArgs(raw_ostream &OS) const { 429 // This isn't elegant, but we have to go through public methods... 430 OS << "A->" << getLowerName() << "_begin(), " 431 << "A->" << getLowerName() << "_size()"; 432 } 433 void writeCtorBody(raw_ostream &OS) const { 434 // FIXME: memcpy is not safe on non-trivial types. 435 OS << " std::memcpy(" << getLowerName() << ", " << getUpperName() 436 << ", " << getLowerName() << "Size * sizeof(" << getType() << "));\n"; 437 } 438 void writeCtorInitializers(raw_ostream &OS) const { 439 OS << getLowerName() << "Size(" << getUpperName() << "Size), " 440 << getLowerName() << "(new (Ctx, 16) " << getType() << "[" 441 << getLowerName() << "Size])"; 442 } 443 void writeCtorParameters(raw_ostream &OS) const { 444 OS << getType() << " *" << getUpperName() << ", unsigned " 445 << getUpperName() << "Size"; 446 } 447 void writeDeclarations(raw_ostream &OS) const { 448 OS << " unsigned " << getLowerName() << "Size;\n"; 449 OS << " " << getType() << " *" << getLowerName() << ";"; 450 } 451 void writePCHReadDecls(raw_ostream &OS) const { 452 OS << " unsigned " << getLowerName() << "Size = Record[Idx++];\n"; 453 OS << " SmallVector<" << type << ", 4> " << getLowerName() 454 << ";\n"; 455 OS << " " << getLowerName() << ".reserve(" << getLowerName() 456 << "Size);\n"; 457 OS << " for (unsigned i = " << getLowerName() << "Size; i; --i)\n"; 458 459 std::string read = ReadPCHRecord(type); 460 OS << " " << getLowerName() << ".push_back(" << read << ");\n"; 461 } 462 void writePCHReadArgs(raw_ostream &OS) const { 463 OS << getLowerName() << ".data(), " << getLowerName() << "Size"; 464 } 465 void writePCHWrite(raw_ostream &OS) const{ 466 OS << " Record.push_back(SA->" << getLowerName() << "_size());\n"; 467 OS << " for (" << getAttrName() << "Attr::" << getLowerName() 468 << "_iterator i = SA->" << getLowerName() << "_begin(), e = SA->" 469 << getLowerName() << "_end(); i != e; ++i)\n"; 470 OS << " " << WritePCHRecord(type, "(*i)"); 471 } 472 void writeValue(raw_ostream &OS) const { 473 OS << "\";\n"; 474 OS << " bool isFirst = true;\n" 475 << " for (" << getAttrName() << "Attr::" << getLowerName() 476 << "_iterator i = " << getLowerName() << "_begin(), e = " 477 << getLowerName() << "_end(); i != e; ++i) {\n" 478 << " if (isFirst) isFirst = false;\n" 479 << " else OS << \", \";\n" 480 << " OS << *i;\n" 481 << " }\n"; 482 OS << " OS << \""; 483 } 484 void writeDump(raw_ostream &OS) const { 485 OS << " for (" << getAttrName() << "Attr::" << getLowerName() 486 << "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->" 487 << getLowerName() << "_end(); I != E; ++I)\n"; 488 OS << " OS << \" \" << *I;\n"; 489 } 490 }; 491 492 class EnumArgument : public Argument { 493 std::string type; 494 std::vector<StringRef> values, enums, uniques; 495 public: 496 EnumArgument(Record &Arg, StringRef Attr) 497 : Argument(Arg, Attr), type(Arg.getValueAsString("Type")), 498 values(getValueAsListOfStrings(Arg, "Values")), 499 enums(getValueAsListOfStrings(Arg, "Enums")), 500 uniques(enums) 501 { 502 // Calculate the various enum values 503 std::sort(uniques.begin(), uniques.end()); 504 uniques.erase(std::unique(uniques.begin(), uniques.end()), uniques.end()); 505 // FIXME: Emit a proper error 506 assert(!uniques.empty()); 507 } 508 509 void writeAccessors(raw_ostream &OS) const { 510 OS << " " << type << " get" << getUpperName() << "() const {\n"; 511 OS << " return " << getLowerName() << ";\n"; 512 OS << " }"; 513 } 514 void writeCloneArgs(raw_ostream &OS) const { 515 OS << getLowerName(); 516 } 517 void writeTemplateInstantiationArgs(raw_ostream &OS) const { 518 OS << "A->get" << getUpperName() << "()"; 519 } 520 void writeCtorInitializers(raw_ostream &OS) const { 521 OS << getLowerName() << "(" << getUpperName() << ")"; 522 } 523 void writeCtorParameters(raw_ostream &OS) const { 524 OS << type << " " << getUpperName(); 525 } 526 void writeDeclarations(raw_ostream &OS) const { 527 std::vector<StringRef>::const_iterator i = uniques.begin(), 528 e = uniques.end(); 529 // The last one needs to not have a comma. 530 --e; 531 532 OS << "public:\n"; 533 OS << " enum " << type << " {\n"; 534 for (; i != e; ++i) 535 OS << " " << *i << ",\n"; 536 OS << " " << *e << "\n"; 537 OS << " };\n"; 538 OS << "private:\n"; 539 OS << " " << type << " " << getLowerName() << ";"; 540 } 541 void writePCHReadDecls(raw_ostream &OS) const { 542 OS << " " << getAttrName() << "Attr::" << type << " " << getLowerName() 543 << "(static_cast<" << getAttrName() << "Attr::" << type 544 << ">(Record[Idx++]));\n"; 545 } 546 void writePCHReadArgs(raw_ostream &OS) const { 547 OS << getLowerName(); 548 } 549 void writePCHWrite(raw_ostream &OS) const { 550 OS << "Record.push_back(SA->get" << getUpperName() << "());\n"; 551 } 552 void writeValue(raw_ostream &OS) const { 553 OS << "\" << get" << getUpperName() << "() << \""; 554 } 555 void writeDump(raw_ostream &OS) const { 556 OS << " switch(SA->get" << getUpperName() << "()) {\n"; 557 for (std::vector<StringRef>::const_iterator I = uniques.begin(), 558 E = uniques.end(); I != E; ++I) { 559 OS << " case " << getAttrName() << "Attr::" << *I << ":\n"; 560 OS << " OS << \" " << *I << "\";\n"; 561 OS << " break;\n"; 562 } 563 OS << " }\n"; 564 } 565 }; 566 567 class VersionArgument : public Argument { 568 public: 569 VersionArgument(Record &Arg, StringRef Attr) 570 : Argument(Arg, Attr) 571 {} 572 573 void writeAccessors(raw_ostream &OS) const { 574 OS << " VersionTuple get" << getUpperName() << "() const {\n"; 575 OS << " return " << getLowerName() << ";\n"; 576 OS << " }\n"; 577 OS << " void set" << getUpperName() 578 << "(ASTContext &C, VersionTuple V) {\n"; 579 OS << " " << getLowerName() << " = V;\n"; 580 OS << " }"; 581 } 582 void writeCloneArgs(raw_ostream &OS) const { 583 OS << "get" << getUpperName() << "()"; 584 } 585 void writeTemplateInstantiationArgs(raw_ostream &OS) const { 586 OS << "A->get" << getUpperName() << "()"; 587 } 588 void writeCtorBody(raw_ostream &OS) const { 589 } 590 void writeCtorInitializers(raw_ostream &OS) const { 591 OS << getLowerName() << "(" << getUpperName() << ")"; 592 } 593 void writeCtorParameters(raw_ostream &OS) const { 594 OS << "VersionTuple " << getUpperName(); 595 } 596 void writeDeclarations(raw_ostream &OS) const { 597 OS << "VersionTuple " << getLowerName() << ";\n"; 598 } 599 void writePCHReadDecls(raw_ostream &OS) const { 600 OS << " VersionTuple " << getLowerName() 601 << "= ReadVersionTuple(Record, Idx);\n"; 602 } 603 void writePCHReadArgs(raw_ostream &OS) const { 604 OS << getLowerName(); 605 } 606 void writePCHWrite(raw_ostream &OS) const { 607 OS << " AddVersionTuple(SA->get" << getUpperName() << "(), Record);\n"; 608 } 609 void writeValue(raw_ostream &OS) const { 610 OS << getLowerName() << "=\" << get" << getUpperName() << "() << \""; 611 } 612 void writeDump(raw_ostream &OS) const { 613 OS << " OS << \" \" << SA->get" << getUpperName() << "();\n"; 614 } 615 }; 616 617 class ExprArgument : public SimpleArgument { 618 public: 619 ExprArgument(Record &Arg, StringRef Attr) 620 : SimpleArgument(Arg, Attr, "Expr *") 621 {} 622 623 void writeTemplateInstantiationArgs(raw_ostream &OS) const { 624 OS << "tempInst" << getUpperName(); 625 } 626 627 void writeTemplateInstantiation(raw_ostream &OS) const { 628 OS << " " << getType() << " tempInst" << getUpperName() << ";\n"; 629 OS << " {\n"; 630 OS << " EnterExpressionEvaluationContext " 631 << "Unevaluated(S, Sema::Unevaluated);\n"; 632 OS << " ExprResult " << "Result = S.SubstExpr(" 633 << "A->get" << getUpperName() << "(), TemplateArgs);\n"; 634 OS << " tempInst" << getUpperName() << " = " 635 << "Result.takeAs<Expr>();\n"; 636 OS << " }\n"; 637 } 638 639 void writeDump(raw_ostream &OS) const { 640 } 641 642 void writeDumpChildren(raw_ostream &OS) const { 643 OS << " lastChild();\n"; 644 OS << " dumpStmt(SA->get" << getUpperName() << "());\n"; 645 } 646 void writeHasChildren(raw_ostream &OS) const { OS << "true"; } 647 }; 648 649 class VariadicExprArgument : public VariadicArgument { 650 public: 651 VariadicExprArgument(Record &Arg, StringRef Attr) 652 : VariadicArgument(Arg, Attr, "Expr *") 653 {} 654 655 void writeTemplateInstantiationArgs(raw_ostream &OS) const { 656 OS << "tempInst" << getUpperName() << ", " 657 << "A->" << getLowerName() << "_size()"; 658 } 659 660 void writeTemplateInstantiation(raw_ostream &OS) const { 661 OS << " " << getType() << " *tempInst" << getUpperName() 662 << " = new (C, 16) " << getType() 663 << "[A->" << getLowerName() << "_size()];\n"; 664 OS << " {\n"; 665 OS << " EnterExpressionEvaluationContext " 666 << "Unevaluated(S, Sema::Unevaluated);\n"; 667 OS << " " << getType() << " *TI = tempInst" << getUpperName() 668 << ";\n"; 669 OS << " " << getType() << " *I = A->" << getLowerName() 670 << "_begin();\n"; 671 OS << " " << getType() << " *E = A->" << getLowerName() 672 << "_end();\n"; 673 OS << " for (; I != E; ++I, ++TI) {\n"; 674 OS << " ExprResult Result = S.SubstExpr(*I, TemplateArgs);\n"; 675 OS << " *TI = Result.takeAs<Expr>();\n"; 676 OS << " }\n"; 677 OS << " }\n"; 678 } 679 680 void writeDump(raw_ostream &OS) const { 681 } 682 683 void writeDumpChildren(raw_ostream &OS) const { 684 OS << " for (" << getAttrName() << "Attr::" << getLowerName() 685 << "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->" 686 << getLowerName() << "_end(); I != E; ++I) {\n"; 687 OS << " if (I + 1 == E)\n"; 688 OS << " lastChild();\n"; 689 OS << " dumpStmt(*I);\n"; 690 OS << " }\n"; 691 } 692 693 void writeHasChildren(raw_ostream &OS) const { 694 OS << "SA->" << getLowerName() << "_begin() != " 695 << "SA->" << getLowerName() << "_end()"; 696 } 697 }; 698 } 699 700 static Argument *createArgument(Record &Arg, StringRef Attr, 701 Record *Search = 0) { 702 if (!Search) 703 Search = &Arg; 704 705 Argument *Ptr = 0; 706 llvm::StringRef ArgName = Search->getName(); 707 708 if (ArgName == "AlignedArgument") Ptr = new AlignedArgument(Arg, Attr); 709 else if (ArgName == "EnumArgument") Ptr = new EnumArgument(Arg, Attr); 710 else if (ArgName == "ExprArgument") Ptr = new ExprArgument(Arg, Attr); 711 else if (ArgName == "FunctionArgument") 712 Ptr = new SimpleArgument(Arg, Attr, "FunctionDecl *"); 713 else if (ArgName == "IdentifierArgument") 714 Ptr = new SimpleArgument(Arg, Attr, "IdentifierInfo *"); 715 else if (ArgName == "BoolArgument") Ptr = new SimpleArgument(Arg, Attr, 716 "bool"); 717 else if (ArgName == "IntArgument") Ptr = new SimpleArgument(Arg, Attr, "int"); 718 else if (ArgName == "StringArgument") Ptr = new StringArgument(Arg, Attr); 719 else if (ArgName == "TypeArgument") 720 Ptr = new SimpleArgument(Arg, Attr, "QualType"); 721 else if (ArgName == "UnsignedArgument") 722 Ptr = new SimpleArgument(Arg, Attr, "unsigned"); 723 else if (ArgName == "SourceLocArgument") 724 Ptr = new SimpleArgument(Arg, Attr, "SourceLocation"); 725 else if (ArgName == "VariadicUnsignedArgument") 726 Ptr = new VariadicArgument(Arg, Attr, "unsigned"); 727 else if (ArgName == "VariadicExprArgument") 728 Ptr = new VariadicExprArgument(Arg, Attr); 729 else if (ArgName == "VersionArgument") 730 Ptr = new VersionArgument(Arg, Attr); 731 732 if (!Ptr) { 733 std::vector<Record*> Bases = Search->getSuperClasses(); 734 for (std::vector<Record*>::iterator i = Bases.begin(), e = Bases.end(); 735 i != e; ++i) { 736 Ptr = createArgument(Arg, Attr, *i); 737 if (Ptr) 738 break; 739 } 740 } 741 return Ptr; 742 } 743 744 static void writeAvailabilityValue(raw_ostream &OS) { 745 OS << "\" << getPlatform()->getName();\n" 746 << " if (!getIntroduced().empty()) OS << \", introduced=\" << getIntroduced();\n" 747 << " if (!getDeprecated().empty()) OS << \", deprecated=\" << getDeprecated();\n" 748 << " if (!getObsoleted().empty()) OS << \", obsoleted=\" << getObsoleted();\n" 749 << " if (getUnavailable()) OS << \", unavailable\";\n" 750 << " OS << \""; 751 } 752 753 static void writePrettyPrintFunction(Record &R, std::vector<Argument*> &Args, 754 raw_ostream &OS) { 755 std::vector<Record*> Spellings = R.getValueAsListOfDefs("Spellings"); 756 757 OS << "void " << R.getName() << "Attr::printPretty(" 758 << "raw_ostream &OS, const PrintingPolicy &Policy) const {\n"; 759 760 if (Spellings.size() == 0) { 761 OS << "}\n\n"; 762 return; 763 } 764 765 OS << 766 " switch (SpellingListIndex) {\n" 767 " default:\n" 768 " llvm_unreachable(\"Unknown attribute spelling!\");\n" 769 " break;\n"; 770 771 for (unsigned I = 0; I < Spellings.size(); ++ I) { 772 llvm::SmallString<16> Prefix; 773 llvm::SmallString<8> Suffix; 774 // The actual spelling of the name and namespace (if applicable) 775 // of an attribute without considering prefix and suffix. 776 llvm::SmallString<64> Spelling; 777 std::string Name = Spellings[I]->getValueAsString("Name"); 778 std::string Variety = Spellings[I]->getValueAsString("Variety"); 779 780 if (Variety == "GNU") { 781 Prefix = " __attribute__(("; 782 Suffix = "))"; 783 } else if (Variety == "CXX11") { 784 Prefix = " [["; 785 Suffix = "]]"; 786 std::string Namespace = Spellings[I]->getValueAsString("Namespace"); 787 if (Namespace != "") { 788 Spelling += Namespace; 789 Spelling += "::"; 790 } 791 } else if (Variety == "Declspec") { 792 Prefix = " __declspec("; 793 Suffix = ")"; 794 } else if (Variety == "Keyword") { 795 Prefix = " "; 796 Suffix = ""; 797 } else { 798 llvm_unreachable("Unknown attribute syntax variety!"); 799 } 800 801 Spelling += Name; 802 803 OS << 804 " case " << I << " : {\n" 805 " OS << \"" + Prefix.str() + Spelling.str(); 806 807 if (Args.size()) OS << "("; 808 if (Spelling == "availability") { 809 writeAvailabilityValue(OS); 810 } else { 811 for (std::vector<Argument*>::const_iterator I = Args.begin(), 812 E = Args.end(); I != E; ++ I) { 813 if (I != Args.begin()) OS << ", "; 814 (*I)->writeValue(OS); 815 } 816 } 817 818 if (Args.size()) OS << ")"; 819 OS << Suffix.str() + "\";\n"; 820 821 OS << 822 " break;\n" 823 " }\n"; 824 } 825 826 // End of the switch statement. 827 OS << "}\n"; 828 // End of the print function. 829 OS << "}\n\n"; 830 } 831 832 /// \brief Return the index of a spelling in a spelling list. 833 static unsigned getSpellingListIndex(const std::vector<Record*> &SpellingList, 834 const Record &Spelling) { 835 assert(SpellingList.size() && "Spelling list is empty!"); 836 837 for (unsigned Index = 0; Index < SpellingList.size(); ++Index) { 838 Record *S = SpellingList[Index]; 839 if (S->getValueAsString("Variety") != Spelling.getValueAsString("Variety")) 840 continue; 841 if (S->getValueAsString("Variety") == "CXX11" && 842 S->getValueAsString("Namespace") != 843 Spelling.getValueAsString("Namespace")) 844 continue; 845 if (S->getValueAsString("Name") != Spelling.getValueAsString("Name")) 846 continue; 847 848 return Index; 849 } 850 851 llvm_unreachable("Unknown spelling!"); 852 } 853 854 static void writeAttrAccessorDefinition(Record &R, raw_ostream &OS) { 855 std::vector<Record*> Accessors = R.getValueAsListOfDefs("Accessors"); 856 for (std::vector<Record*>::const_iterator I = Accessors.begin(), 857 E = Accessors.end(); I != E; ++I) { 858 Record *Accessor = *I; 859 std::string Name = Accessor->getValueAsString("Name"); 860 std::vector<Record*> Spellings = Accessor->getValueAsListOfDefs( 861 "Spellings"); 862 std::vector<Record*> SpellingList = R.getValueAsListOfDefs("Spellings"); 863 assert(SpellingList.size() && 864 "Attribute with empty spelling list can't have accessors!"); 865 866 OS << " bool " << Name << "() const { return SpellingListIndex == "; 867 for (unsigned Index = 0; Index < Spellings.size(); ++Index) { 868 OS << getSpellingListIndex(SpellingList, *Spellings[Index]); 869 if (Index != Spellings.size() -1) 870 OS << " ||\n SpellingListIndex == "; 871 else 872 OS << "; }\n"; 873 } 874 } 875 } 876 877 namespace clang { 878 879 // Emits the class definitions for attributes. 880 void EmitClangAttrClass(RecordKeeper &Records, raw_ostream &OS) { 881 emitSourceFileHeader("Attribute classes' definitions", OS); 882 883 OS << "#ifndef LLVM_CLANG_ATTR_CLASSES_INC\n"; 884 OS << "#define LLVM_CLANG_ATTR_CLASSES_INC\n\n"; 885 886 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 887 888 for (std::vector<Record*>::iterator i = Attrs.begin(), e = Attrs.end(); 889 i != e; ++i) { 890 Record &R = **i; 891 892 if (!R.getValueAsBit("ASTNode")) 893 continue; 894 895 const std::vector<Record *> Supers = R.getSuperClasses(); 896 assert(!Supers.empty() && "Forgot to specify a superclass for the attr"); 897 std::string SuperName; 898 for (std::vector<Record *>::const_reverse_iterator I = Supers.rbegin(), 899 E = Supers.rend(); I != E; ++I) { 900 const Record &R = **I; 901 if (R.getName() != "TargetSpecificAttr" && SuperName.empty()) 902 SuperName = R.getName(); 903 } 904 905 OS << "class " << R.getName() << "Attr : public " << SuperName << " {\n"; 906 907 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args"); 908 std::vector<Argument*> Args; 909 std::vector<Argument*>::iterator ai, ae; 910 Args.reserve(ArgRecords.size()); 911 912 for (std::vector<Record*>::iterator ri = ArgRecords.begin(), 913 re = ArgRecords.end(); 914 ri != re; ++ri) { 915 Record &ArgRecord = **ri; 916 Argument *Arg = createArgument(ArgRecord, R.getName()); 917 assert(Arg); 918 Args.push_back(Arg); 919 920 Arg->writeDeclarations(OS); 921 OS << "\n\n"; 922 } 923 924 ae = Args.end(); 925 926 OS << "\n public:\n"; 927 OS << " " << R.getName() << "Attr(SourceRange R, ASTContext &Ctx\n"; 928 929 for (ai = Args.begin(); ai != ae; ++ai) { 930 OS << " , "; 931 (*ai)->writeCtorParameters(OS); 932 OS << "\n"; 933 } 934 935 OS << " , "; 936 OS << "unsigned SI = 0\n"; 937 938 OS << " )\n"; 939 OS << " : " << SuperName << "(attr::" << R.getName() << ", R, SI)\n"; 940 941 for (ai = Args.begin(); ai != ae; ++ai) { 942 OS << " , "; 943 (*ai)->writeCtorInitializers(OS); 944 OS << "\n"; 945 } 946 947 OS << " {\n"; 948 949 for (ai = Args.begin(); ai != ae; ++ai) { 950 (*ai)->writeCtorBody(OS); 951 OS << "\n"; 952 } 953 OS << " }\n\n"; 954 955 OS << " virtual " << R.getName() << "Attr *clone (ASTContext &C) const;\n"; 956 OS << " virtual void printPretty(raw_ostream &OS,\n" 957 << " const PrintingPolicy &Policy) const;\n"; 958 959 writeAttrAccessorDefinition(R, OS); 960 961 for (ai = Args.begin(); ai != ae; ++ai) { 962 (*ai)->writeAccessors(OS); 963 OS << "\n\n"; 964 } 965 966 OS << R.getValueAsString("AdditionalMembers"); 967 OS << "\n\n"; 968 969 OS << " static bool classof(const Attr *A) { return A->getKind() == " 970 << "attr::" << R.getName() << "; }\n"; 971 972 bool LateParsed = R.getValueAsBit("LateParsed"); 973 OS << " virtual bool isLateParsed() const { return " 974 << LateParsed << "; }\n"; 975 976 OS << "};\n\n"; 977 } 978 979 OS << "#endif\n"; 980 } 981 982 // Emits the all-arguments-are-expressions property for attributes. 983 void EmitClangAttrExprArgsList(RecordKeeper &Records, raw_ostream &OS) { 984 emitSourceFileHeader("llvm::StringSwitch code to match attributes with " 985 "expression arguments", OS); 986 987 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 988 989 for (std::vector<Record*>::iterator I = Attrs.begin(), E = Attrs.end(); 990 I != E; ++I) { 991 Record &Attr = **I; 992 993 // Determine whether the first argument is something that is always 994 // an expression. 995 std::vector<Record *> Args = Attr.getValueAsListOfDefs("Args"); 996 if (Args.empty() || Args[0]->getSuperClasses().empty()) 997 continue; 998 999 // Check whether this is one of the argument kinds that implies an 1000 // expression. 1001 // FIXME: Aligned is weird. 1002 if (!llvm::StringSwitch<bool>(Args[0]->getSuperClasses().back()->getName()) 1003 .Case("AlignedArgument", true) 1004 .Case("BoolArgument", true) 1005 .Case("DefaultIntArgument", true) 1006 .Case("IntArgument", true) 1007 .Case("ExprArgument", true) 1008 .Case("UnsignedArgument", true) 1009 .Case("VariadicUnsignedArgument", true) 1010 .Case("VariadicExprArgument", true) 1011 .Default(false)) 1012 continue; 1013 1014 std::vector<Record*> Spellings = Attr.getValueAsListOfDefs("Spellings"); 1015 1016 for (std::vector<Record*>::const_iterator I = Spellings.begin(), 1017 E = Spellings.end(); I != E; ++I) { 1018 OS << ".Case(\"" << (*I)->getValueAsString("Name") << "\", " 1019 << "true" << ")\n"; 1020 } 1021 } 1022 } 1023 1024 // Emits the class method definitions for attributes. 1025 void EmitClangAttrImpl(RecordKeeper &Records, raw_ostream &OS) { 1026 emitSourceFileHeader("Attribute classes' member function definitions", OS); 1027 1028 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1029 std::vector<Record*>::iterator i = Attrs.begin(), e = Attrs.end(), ri, re; 1030 std::vector<Argument*>::iterator ai, ae; 1031 1032 for (; i != e; ++i) { 1033 Record &R = **i; 1034 1035 if (!R.getValueAsBit("ASTNode")) 1036 continue; 1037 1038 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args"); 1039 std::vector<Argument*> Args; 1040 for (ri = ArgRecords.begin(), re = ArgRecords.end(); ri != re; ++ri) 1041 Args.push_back(createArgument(**ri, R.getName())); 1042 1043 for (ai = Args.begin(), ae = Args.end(); ai != ae; ++ai) 1044 (*ai)->writeAccessorDefinitions(OS); 1045 1046 OS << R.getName() << "Attr *" << R.getName() 1047 << "Attr::clone(ASTContext &C) const {\n"; 1048 OS << " return new (C) " << R.getName() << "Attr(getLocation(), C"; 1049 for (ai = Args.begin(); ai != ae; ++ai) { 1050 OS << ", "; 1051 (*ai)->writeCloneArgs(OS); 1052 } 1053 OS << ", getSpellingListIndex());\n}\n\n"; 1054 1055 writePrettyPrintFunction(R, Args, OS); 1056 } 1057 } 1058 1059 } // end namespace clang 1060 1061 static void EmitAttrList(raw_ostream &OS, StringRef Class, 1062 const std::vector<Record*> &AttrList) { 1063 std::vector<Record*>::const_iterator i = AttrList.begin(), e = AttrList.end(); 1064 1065 if (i != e) { 1066 // Move the end iterator back to emit the last attribute. 1067 for(--e; i != e; ++i) { 1068 if (!(*i)->getValueAsBit("ASTNode")) 1069 continue; 1070 1071 OS << Class << "(" << (*i)->getName() << ")\n"; 1072 } 1073 1074 OS << "LAST_" << Class << "(" << (*i)->getName() << ")\n\n"; 1075 } 1076 } 1077 1078 namespace clang { 1079 1080 // Emits the enumeration list for attributes. 1081 void EmitClangAttrList(RecordKeeper &Records, raw_ostream &OS) { 1082 emitSourceFileHeader("List of all attributes that Clang recognizes", OS); 1083 1084 OS << "#ifndef LAST_ATTR\n"; 1085 OS << "#define LAST_ATTR(NAME) ATTR(NAME)\n"; 1086 OS << "#endif\n\n"; 1087 1088 OS << "#ifndef INHERITABLE_ATTR\n"; 1089 OS << "#define INHERITABLE_ATTR(NAME) ATTR(NAME)\n"; 1090 OS << "#endif\n\n"; 1091 1092 OS << "#ifndef LAST_INHERITABLE_ATTR\n"; 1093 OS << "#define LAST_INHERITABLE_ATTR(NAME) INHERITABLE_ATTR(NAME)\n"; 1094 OS << "#endif\n\n"; 1095 1096 OS << "#ifndef INHERITABLE_PARAM_ATTR\n"; 1097 OS << "#define INHERITABLE_PARAM_ATTR(NAME) ATTR(NAME)\n"; 1098 OS << "#endif\n\n"; 1099 1100 OS << "#ifndef LAST_INHERITABLE_PARAM_ATTR\n"; 1101 OS << "#define LAST_INHERITABLE_PARAM_ATTR(NAME)" 1102 " INHERITABLE_PARAM_ATTR(NAME)\n"; 1103 OS << "#endif\n\n"; 1104 1105 OS << "#ifndef MS_INHERITANCE_ATTR\n"; 1106 OS << "#define MS_INHERITANCE_ATTR(NAME) INHERITABLE_ATTR(NAME)\n"; 1107 OS << "#endif\n\n"; 1108 1109 OS << "#ifndef LAST_MS_INHERITANCE_ATTR\n"; 1110 OS << "#define LAST_MS_INHERITANCE_ATTR(NAME)" 1111 " MS_INHERITANCE_ATTR(NAME)\n"; 1112 OS << "#endif\n\n"; 1113 1114 Record *InhClass = Records.getClass("InheritableAttr"); 1115 Record *InhParamClass = Records.getClass("InheritableParamAttr"); 1116 Record *MSInheritanceClass = Records.getClass("MSInheritanceAttr"); 1117 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), 1118 NonInhAttrs, InhAttrs, InhParamAttrs, MSInhAttrs; 1119 for (std::vector<Record*>::iterator i = Attrs.begin(), e = Attrs.end(); 1120 i != e; ++i) { 1121 if (!(*i)->getValueAsBit("ASTNode")) 1122 continue; 1123 1124 if ((*i)->isSubClassOf(InhParamClass)) 1125 InhParamAttrs.push_back(*i); 1126 else if ((*i)->isSubClassOf(MSInheritanceClass)) 1127 MSInhAttrs.push_back(*i); 1128 else if ((*i)->isSubClassOf(InhClass)) 1129 InhAttrs.push_back(*i); 1130 else 1131 NonInhAttrs.push_back(*i); 1132 } 1133 1134 EmitAttrList(OS, "INHERITABLE_PARAM_ATTR", InhParamAttrs); 1135 EmitAttrList(OS, "MS_INHERITANCE_ATTR", MSInhAttrs); 1136 EmitAttrList(OS, "INHERITABLE_ATTR", InhAttrs); 1137 EmitAttrList(OS, "ATTR", NonInhAttrs); 1138 1139 OS << "#undef LAST_ATTR\n"; 1140 OS << "#undef INHERITABLE_ATTR\n"; 1141 OS << "#undef MS_INHERITANCE_ATTR\n"; 1142 OS << "#undef LAST_INHERITABLE_ATTR\n"; 1143 OS << "#undef LAST_INHERITABLE_PARAM_ATTR\n"; 1144 OS << "#undef LAST_MS_INHERITANCE_ATTR\n"; 1145 OS << "#undef ATTR\n"; 1146 } 1147 1148 // Emits the code to read an attribute from a precompiled header. 1149 void EmitClangAttrPCHRead(RecordKeeper &Records, raw_ostream &OS) { 1150 emitSourceFileHeader("Attribute deserialization code", OS); 1151 1152 Record *InhClass = Records.getClass("InheritableAttr"); 1153 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), 1154 ArgRecords; 1155 std::vector<Record*>::iterator i = Attrs.begin(), e = Attrs.end(), ai, ae; 1156 std::vector<Argument*> Args; 1157 std::vector<Argument*>::iterator ri, re; 1158 1159 OS << " switch (Kind) {\n"; 1160 OS << " default:\n"; 1161 OS << " assert(0 && \"Unknown attribute!\");\n"; 1162 OS << " break;\n"; 1163 for (; i != e; ++i) { 1164 Record &R = **i; 1165 if (!R.getValueAsBit("ASTNode")) 1166 continue; 1167 1168 OS << " case attr::" << R.getName() << ": {\n"; 1169 if (R.isSubClassOf(InhClass)) 1170 OS << " bool isInherited = Record[Idx++];\n"; 1171 ArgRecords = R.getValueAsListOfDefs("Args"); 1172 Args.clear(); 1173 for (ai = ArgRecords.begin(), ae = ArgRecords.end(); ai != ae; ++ai) { 1174 Argument *A = createArgument(**ai, R.getName()); 1175 Args.push_back(A); 1176 A->writePCHReadDecls(OS); 1177 } 1178 OS << " New = new (Context) " << R.getName() << "Attr(Range, Context"; 1179 for (ri = Args.begin(), re = Args.end(); ri != re; ++ri) { 1180 OS << ", "; 1181 (*ri)->writePCHReadArgs(OS); 1182 } 1183 OS << ");\n"; 1184 if (R.isSubClassOf(InhClass)) 1185 OS << " cast<InheritableAttr>(New)->setInherited(isInherited);\n"; 1186 OS << " break;\n"; 1187 OS << " }\n"; 1188 } 1189 OS << " }\n"; 1190 } 1191 1192 // Emits the code to write an attribute to a precompiled header. 1193 void EmitClangAttrPCHWrite(RecordKeeper &Records, raw_ostream &OS) { 1194 emitSourceFileHeader("Attribute serialization code", OS); 1195 1196 Record *InhClass = Records.getClass("InheritableAttr"); 1197 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args; 1198 std::vector<Record*>::iterator i = Attrs.begin(), e = Attrs.end(), ai, ae; 1199 1200 OS << " switch (A->getKind()) {\n"; 1201 OS << " default:\n"; 1202 OS << " llvm_unreachable(\"Unknown attribute kind!\");\n"; 1203 OS << " break;\n"; 1204 for (; i != e; ++i) { 1205 Record &R = **i; 1206 if (!R.getValueAsBit("ASTNode")) 1207 continue; 1208 OS << " case attr::" << R.getName() << ": {\n"; 1209 Args = R.getValueAsListOfDefs("Args"); 1210 if (R.isSubClassOf(InhClass) || !Args.empty()) 1211 OS << " const " << R.getName() << "Attr *SA = cast<" << R.getName() 1212 << "Attr>(A);\n"; 1213 if (R.isSubClassOf(InhClass)) 1214 OS << " Record.push_back(SA->isInherited());\n"; 1215 for (ai = Args.begin(), ae = Args.end(); ai != ae; ++ai) 1216 createArgument(**ai, R.getName())->writePCHWrite(OS); 1217 OS << " break;\n"; 1218 OS << " }\n"; 1219 } 1220 OS << " }\n"; 1221 } 1222 1223 // Emits the list of spellings for attributes. 1224 void EmitClangAttrSpellingList(RecordKeeper &Records, raw_ostream &OS) { 1225 emitSourceFileHeader("llvm::StringSwitch code to match all known attributes", 1226 OS); 1227 1228 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1229 1230 for (std::vector<Record*>::iterator I = Attrs.begin(), E = Attrs.end(); I != E; ++I) { 1231 Record &Attr = **I; 1232 1233 std::vector<Record*> Spellings = Attr.getValueAsListOfDefs("Spellings"); 1234 1235 for (std::vector<Record*>::const_iterator I = Spellings.begin(), E = Spellings.end(); I != E; ++I) { 1236 OS << ".Case(\"" << (*I)->getValueAsString("Name") << "\", true)\n"; 1237 } 1238 } 1239 1240 } 1241 1242 void EmitClangAttrSpellingListIndex(RecordKeeper &Records, raw_ostream &OS) { 1243 emitSourceFileHeader("Code to translate different attribute spellings " 1244 "into internal identifiers", OS); 1245 1246 OS << 1247 " unsigned Index = 0;\n" 1248 " switch (AttrKind) {\n" 1249 " default:\n" 1250 " llvm_unreachable(\"Unknown attribute kind!\");\n" 1251 " break;\n"; 1252 1253 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1254 for (std::vector<Record*>::const_iterator I = Attrs.begin(), E = Attrs.end(); 1255 I != E; ++I) { 1256 Record &R = **I; 1257 // We only care about attributes that participate in Sema checking, so 1258 // skip those attributes that are not able to make their way to Sema. 1259 if (!R.getValueAsBit("SemaHandler")) 1260 continue; 1261 1262 std::vector<Record*> Spellings = R.getValueAsListOfDefs("Spellings"); 1263 // Each distinct spelling yields an attribute kind. 1264 if (R.getValueAsBit("DistinctSpellings")) { 1265 for (unsigned I = 0; I < Spellings.size(); ++ I) { 1266 OS << 1267 " case AT_" << Spellings[I]->getValueAsString("Name") << ": \n" 1268 " Index = " << I << ";\n" 1269 " break;\n"; 1270 } 1271 } else { 1272 OS << " case AT_" << R.getName() << " : {\n"; 1273 for (unsigned I = 0; I < Spellings.size(); ++ I) { 1274 SmallString<16> Namespace; 1275 if (Spellings[I]->getValueAsString("Variety") == "CXX11") 1276 Namespace = Spellings[I]->getValueAsString("Namespace"); 1277 else 1278 Namespace = ""; 1279 1280 OS << " if (Name == \"" 1281 << Spellings[I]->getValueAsString("Name") << "\" && " 1282 << "SyntaxUsed == " 1283 << StringSwitch<unsigned>(Spellings[I]->getValueAsString("Variety")) 1284 .Case("GNU", 0) 1285 .Case("CXX11", 1) 1286 .Case("Declspec", 2) 1287 .Case("Keyword", 3) 1288 .Default(0) 1289 << " && Scope == \"" << Namespace << "\")\n" 1290 << " return " << I << ";\n"; 1291 } 1292 1293 OS << " break;\n"; 1294 OS << " }\n"; 1295 } 1296 } 1297 1298 OS << " }\n"; 1299 OS << " return Index;\n"; 1300 } 1301 1302 // Emits the LateParsed property for attributes. 1303 void EmitClangAttrLateParsedList(RecordKeeper &Records, raw_ostream &OS) { 1304 emitSourceFileHeader("llvm::StringSwitch code to match late parsed " 1305 "attributes", OS); 1306 1307 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1308 1309 for (std::vector<Record*>::iterator I = Attrs.begin(), E = Attrs.end(); 1310 I != E; ++I) { 1311 Record &Attr = **I; 1312 1313 bool LateParsed = Attr.getValueAsBit("LateParsed"); 1314 1315 if (LateParsed) { 1316 std::vector<Record*> Spellings = 1317 Attr.getValueAsListOfDefs("Spellings"); 1318 1319 // FIXME: Handle non-GNU attributes 1320 for (std::vector<Record*>::const_iterator I = Spellings.begin(), 1321 E = Spellings.end(); I != E; ++I) { 1322 if ((*I)->getValueAsString("Variety") != "GNU") 1323 continue; 1324 OS << ".Case(\"" << (*I)->getValueAsString("Name") << "\", " 1325 << LateParsed << ")\n"; 1326 } 1327 } 1328 } 1329 } 1330 1331 // Emits code to instantiate dependent attributes on templates. 1332 void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS) { 1333 emitSourceFileHeader("Template instantiation code for attributes", OS); 1334 1335 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1336 1337 OS << "namespace clang {\n" 1338 << "namespace sema {\n\n" 1339 << "Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, " 1340 << "Sema &S,\n" 1341 << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n" 1342 << " switch (At->getKind()) {\n" 1343 << " default:\n" 1344 << " break;\n"; 1345 1346 for (std::vector<Record*>::iterator I = Attrs.begin(), E = Attrs.end(); 1347 I != E; ++I) { 1348 Record &R = **I; 1349 if (!R.getValueAsBit("ASTNode")) 1350 continue; 1351 1352 OS << " case attr::" << R.getName() << ": {\n"; 1353 bool ShouldClone = R.getValueAsBit("Clone"); 1354 1355 if (!ShouldClone) { 1356 OS << " return NULL;\n"; 1357 OS << " }\n"; 1358 continue; 1359 } 1360 1361 OS << " const " << R.getName() << "Attr *A = cast<" 1362 << R.getName() << "Attr>(At);\n"; 1363 bool TDependent = R.getValueAsBit("TemplateDependent"); 1364 1365 if (!TDependent) { 1366 OS << " return A->clone(C);\n"; 1367 OS << " }\n"; 1368 continue; 1369 } 1370 1371 std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args"); 1372 std::vector<Argument*> Args; 1373 std::vector<Argument*>::iterator ai, ae; 1374 Args.reserve(ArgRecords.size()); 1375 1376 for (std::vector<Record*>::iterator ri = ArgRecords.begin(), 1377 re = ArgRecords.end(); 1378 ri != re; ++ri) { 1379 Record &ArgRecord = **ri; 1380 Argument *Arg = createArgument(ArgRecord, R.getName()); 1381 assert(Arg); 1382 Args.push_back(Arg); 1383 } 1384 ae = Args.end(); 1385 1386 for (ai = Args.begin(); ai != ae; ++ai) { 1387 (*ai)->writeTemplateInstantiation(OS); 1388 } 1389 OS << " return new (C) " << R.getName() << "Attr(A->getLocation(), C"; 1390 for (ai = Args.begin(); ai != ae; ++ai) { 1391 OS << ", "; 1392 (*ai)->writeTemplateInstantiationArgs(OS); 1393 } 1394 OS << ");\n }\n"; 1395 } 1396 OS << " } // end switch\n" 1397 << " llvm_unreachable(\"Unknown attribute!\");\n" 1398 << " return 0;\n" 1399 << "}\n\n" 1400 << "} // end namespace sema\n" 1401 << "} // end namespace clang\n"; 1402 } 1403 1404 // Emits the list of parsed attributes. 1405 void EmitClangAttrParsedAttrList(RecordKeeper &Records, raw_ostream &OS) { 1406 emitSourceFileHeader("List of all attributes that Clang recognizes", OS); 1407 1408 OS << "#ifndef PARSED_ATTR\n"; 1409 OS << "#define PARSED_ATTR(NAME) NAME\n"; 1410 OS << "#endif\n\n"; 1411 1412 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1413 1414 for (std::vector<Record*>::iterator I = Attrs.begin(), E = Attrs.end(); 1415 I != E; ++I) { 1416 Record &Attr = **I; 1417 1418 bool SemaHandler = Attr.getValueAsBit("SemaHandler"); 1419 bool DistinctSpellings = Attr.getValueAsBit("DistinctSpellings"); 1420 1421 if (SemaHandler) { 1422 if (DistinctSpellings) { 1423 std::vector<Record*> Spellings = Attr.getValueAsListOfDefs("Spellings"); 1424 1425 for (std::vector<Record*>::const_iterator I = Spellings.begin(), 1426 E = Spellings.end(); I != E; ++I) { 1427 std::string AttrName = (*I)->getValueAsString("Name"); 1428 1429 StringRef Spelling = NormalizeAttrName(AttrName); 1430 1431 OS << "PARSED_ATTR(" << Spelling << ")\n"; 1432 } 1433 } else { 1434 StringRef AttrName = Attr.getName(); 1435 AttrName = NormalizeAttrName(AttrName); 1436 OS << "PARSED_ATTR(" << AttrName << ")\n"; 1437 } 1438 } 1439 } 1440 } 1441 1442 // Emits the kind list of parsed attributes 1443 void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream &OS) { 1444 emitSourceFileHeader("Attribute name matcher", OS); 1445 1446 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"); 1447 1448 std::vector<StringMatcher::StringPair> Matches; 1449 for (std::vector<Record*>::iterator I = Attrs.begin(), E = Attrs.end(); 1450 I != E; ++I) { 1451 Record &Attr = **I; 1452 1453 bool SemaHandler = Attr.getValueAsBit("SemaHandler"); 1454 bool Ignored = Attr.getValueAsBit("Ignored"); 1455 bool DistinctSpellings = Attr.getValueAsBit("DistinctSpellings"); 1456 if (SemaHandler || Ignored) { 1457 std::vector<Record*> Spellings = Attr.getValueAsListOfDefs("Spellings"); 1458 1459 for (std::vector<Record*>::const_iterator I = Spellings.begin(), 1460 E = Spellings.end(); I != E; ++I) { 1461 std::string RawSpelling = (*I)->getValueAsString("Name"); 1462 StringRef AttrName = NormalizeAttrName(DistinctSpellings 1463 ? StringRef(RawSpelling) 1464 : StringRef(Attr.getName())); 1465 1466 SmallString<64> Spelling; 1467 if ((*I)->getValueAsString("Variety") == "CXX11") { 1468 Spelling += (*I)->getValueAsString("Namespace"); 1469 Spelling += "::"; 1470 } 1471 Spelling += NormalizeAttrSpelling(RawSpelling); 1472 1473 if (SemaHandler) 1474 Matches.push_back( 1475 StringMatcher::StringPair( 1476 StringRef(Spelling), 1477 "return AttributeList::AT_" + AttrName.str() + ";")); 1478 else 1479 Matches.push_back( 1480 StringMatcher::StringPair( 1481 StringRef(Spelling), 1482 "return AttributeList::IgnoredAttribute;")); 1483 } 1484 } 1485 } 1486 1487 OS << "static AttributeList::Kind getAttrKind(StringRef Name) {\n"; 1488 StringMatcher("Name", Matches, OS).Emit(); 1489 OS << "return AttributeList::UnknownAttribute;\n" 1490 << "}\n"; 1491 } 1492 1493 // Emits the code to dump an attribute. 1494 void EmitClangAttrDump(RecordKeeper &Records, raw_ostream &OS) { 1495 emitSourceFileHeader("Attribute dumper", OS); 1496 1497 OS << 1498 " switch (A->getKind()) {\n" 1499 " default:\n" 1500 " llvm_unreachable(\"Unknown attribute kind!\");\n" 1501 " break;\n"; 1502 std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"), Args; 1503 for (std::vector<Record*>::iterator I = Attrs.begin(), E = Attrs.end(); 1504 I != E; ++I) { 1505 Record &R = **I; 1506 if (!R.getValueAsBit("ASTNode")) 1507 continue; 1508 OS << " case attr::" << R.getName() << ": {\n"; 1509 Args = R.getValueAsListOfDefs("Args"); 1510 if (!Args.empty()) { 1511 OS << " const " << R.getName() << "Attr *SA = cast<" << R.getName() 1512 << "Attr>(A);\n"; 1513 for (std::vector<Record*>::iterator I = Args.begin(), E = Args.end(); 1514 I != E; ++I) 1515 createArgument(**I, R.getName())->writeDump(OS); 1516 1517 // Code for detecting the last child. 1518 OS << " bool OldMoreChildren = hasMoreChildren();\n"; 1519 OS << " bool MoreChildren = OldMoreChildren;\n"; 1520 1521 for (std::vector<Record*>::iterator I = Args.begin(), E = Args.end(); 1522 I != E; ++I) { 1523 // More code for detecting the last child. 1524 OS << " MoreChildren = OldMoreChildren"; 1525 for (std::vector<Record*>::iterator Next = I + 1; Next != E; ++Next) { 1526 OS << " || "; 1527 createArgument(**Next, R.getName())->writeHasChildren(OS); 1528 } 1529 OS << ";\n"; 1530 OS << " setMoreChildren(MoreChildren);\n"; 1531 1532 createArgument(**I, R.getName())->writeDumpChildren(OS); 1533 } 1534 1535 // Reset the last child. 1536 OS << " setMoreChildren(OldMoreChildren);\n"; 1537 } 1538 OS << 1539 " break;\n" 1540 " }\n"; 1541 } 1542 OS << " }\n"; 1543 } 1544 1545 } // end namespace clang 1546