1e5dd7070Spatrick//==--- Attr.td - attribute definitions -----------------------------------===// 2e5dd7070Spatrick// 3e5dd7070Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick// See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick// 7e5dd7070Spatrick//===----------------------------------------------------------------------===// 8e5dd7070Spatrick 9e5dd7070Spatrick// The documentation is organized by category. Attributes can have category- 10e5dd7070Spatrick// specific documentation that is collated within the larger document. 11e5dd7070Spatrickclass DocumentationCategory<string name> { 12e5dd7070Spatrick string Name = name; 13e5dd7070Spatrick code Content = [{}]; 14e5dd7070Spatrick} 15e5dd7070Spatrickdef DocCatFunction : DocumentationCategory<"Function Attributes">; 16e5dd7070Spatrickdef DocCatVariable : DocumentationCategory<"Variable Attributes">; 17e5dd7070Spatrickdef DocCatField : DocumentationCategory<"Field Attributes">; 18e5dd7070Spatrickdef DocCatType : DocumentationCategory<"Type Attributes">; 19e5dd7070Spatrickdef DocCatStmt : DocumentationCategory<"Statement Attributes">; 20e5dd7070Spatrickdef DocCatDecl : DocumentationCategory<"Declaration Attributes">; 21e5dd7070Spatrick 22*12c85518Srobert// This category is for attributes which have not yet been properly documented, 23*12c85518Srobert// but should be. 24*12c85518Srobertdef DocCatUndocumented : DocumentationCategory<"Undocumented"> { 25*12c85518Srobert let Content = [{ 26*12c85518SrobertThis section lists attributes which are recognized by Clang, but which are 27*12c85518Srobertcurrently missing documentation. 28*12c85518Srobert}]; 29*12c85518Srobert} 30*12c85518Srobert 31*12c85518Srobert// Attributes listed under the InternalOnly category do not generate any entry 32*12c85518Srobert// in the documentation. This category should be used only when we _want_ 33*12c85518Srobert// to not document the attribute, e.g. if the attribute has no spellings. 34*12c85518Srobertdef DocCatInternalOnly : DocumentationCategory<"InternalOnly">; 35e5dd7070Spatrick 36e5dd7070Spatrickclass DocDeprecated<string replacement = ""> { 37e5dd7070Spatrick // If the Replacement field is empty, no replacement will be listed with the 38e5dd7070Spatrick // documentation. Otherwise, the documentation will specify the attribute has 39e5dd7070Spatrick // been superseded by this replacement. 40e5dd7070Spatrick string Replacement = replacement; 41e5dd7070Spatrick} 42e5dd7070Spatrick 43e5dd7070Spatrick// Specifies the documentation to be associated with the given category. 44e5dd7070Spatrickclass Documentation { 45e5dd7070Spatrick DocumentationCategory Category; 46e5dd7070Spatrick code Content; 47e5dd7070Spatrick 48e5dd7070Spatrick // If the heading is empty, one may be picked automatically. If the attribute 49e5dd7070Spatrick // only has one spelling, no heading is required as the attribute's sole 50e5dd7070Spatrick // spelling is sufficient. If all spellings are semantically common, the 51e5dd7070Spatrick // heading will be the semantic spelling. If the spellings are not 52e5dd7070Spatrick // semantically common and no heading is provided, an error will be emitted. 53e5dd7070Spatrick string Heading = ""; 54e5dd7070Spatrick 55e5dd7070Spatrick // When set, specifies that the attribute is deprecated and can optionally 56e5dd7070Spatrick // specify a replacement attribute. 57e5dd7070Spatrick DocDeprecated Deprecated; 58e5dd7070Spatrick} 59e5dd7070Spatrick 60*12c85518Srobert// Specifies that the attribute is explicitly omitted from the documentation, 61*12c85518Srobert// because it is not intended to be user-facing. 62*12c85518Srobertdef InternalOnly : Documentation { 63*12c85518Srobert let Category = DocCatInternalOnly; 64*12c85518Srobert} 65*12c85518Srobert 66*12c85518Srobert// Specifies that the attribute is undocumented, but that it _should_ have 67*12c85518Srobert// documentation. 68e5dd7070Spatrickdef Undocumented : Documentation { 69e5dd7070Spatrick let Category = DocCatUndocumented; 70*12c85518Srobert let Content = "No documentation."; 71e5dd7070Spatrick} 72e5dd7070Spatrick 73e5dd7070Spatrickinclude "clang/Basic/AttrDocs.td" 74e5dd7070Spatrick 75e5dd7070Spatrick// An attribute's subject is whatever it appertains to. In this file, it is 76e5dd7070Spatrick// more accurately a list of things that an attribute can appertain to. All 77e5dd7070Spatrick// Decls and Stmts are possibly AttrSubjects (even though the syntax may not 78e5dd7070Spatrick// allow attributes on a given Decl or Stmt). 79e5dd7070Spatrickclass AttrSubject; 80e5dd7070Spatrick 81e5dd7070Spatrickinclude "clang/Basic/DeclNodes.td" 82e5dd7070Spatrickinclude "clang/Basic/StmtNodes.td" 83e5dd7070Spatrick 84e5dd7070Spatrick// A subset-subject is an AttrSubject constrained to operate only on some subset 85e5dd7070Spatrick// of that subject. 86e5dd7070Spatrick// 87e5dd7070Spatrick// The code fragment is a boolean expression that will confirm that the subject 88e5dd7070Spatrick// meets the requirements; the subject will have the name S, and will have the 89e5dd7070Spatrick// type specified by the base. It should be a simple boolean expression. The 90e5dd7070Spatrick// diagnostic string should be a comma-separated list of subject names. 91e5dd7070Spatrickclass SubsetSubject<AttrSubject base, code check, string diag> : AttrSubject { 92e5dd7070Spatrick AttrSubject Base = base; 93e5dd7070Spatrick code CheckCode = check; 94e5dd7070Spatrick string DiagSpelling = diag; 95e5dd7070Spatrick} 96e5dd7070Spatrick 97e5dd7070Spatrickdef LocalVar : SubsetSubject<Var, 98e5dd7070Spatrick [{S->hasLocalStorage() && !isa<ParmVarDecl>(S)}], 99e5dd7070Spatrick "local variables">; 100e5dd7070Spatrickdef NonParmVar : SubsetSubject<Var, 101e5dd7070Spatrick [{S->getKind() != Decl::ParmVar}], 102e5dd7070Spatrick "variables">; 103e5dd7070Spatrickdef NonLocalVar : SubsetSubject<Var, 104e5dd7070Spatrick [{!S->hasLocalStorage()}], 105e5dd7070Spatrick "variables with non-local storage">; 106e5dd7070Spatrickdef NonBitField : SubsetSubject<Field, 107e5dd7070Spatrick [{!S->isBitField()}], 108e5dd7070Spatrick "non-bit-field non-static data members">; 109e5dd7070Spatrick 110e5dd7070Spatrickdef NonStaticCXXMethod : SubsetSubject<CXXMethod, 111e5dd7070Spatrick [{!S->isStatic()}], 112e5dd7070Spatrick "non-static member functions">; 113e5dd7070Spatrick 114e5dd7070Spatrickdef NonStaticNonConstCXXMethod 115e5dd7070Spatrick : SubsetSubject<CXXMethod, 116e5dd7070Spatrick [{!S->isStatic() && !S->isConst()}], 117e5dd7070Spatrick "non-static non-const member functions">; 118e5dd7070Spatrick 119e5dd7070Spatrickdef ObjCInstanceMethod : SubsetSubject<ObjCMethod, 120e5dd7070Spatrick [{S->isInstanceMethod()}], 121e5dd7070Spatrick "Objective-C instance methods">; 122e5dd7070Spatrick 123e5dd7070Spatrickdef Struct : SubsetSubject<Record, 124e5dd7070Spatrick [{!S->isUnion()}], "structs">; 125e5dd7070Spatrick 126e5dd7070Spatrickdef TLSVar : SubsetSubject<Var, 127e5dd7070Spatrick [{S->getTLSKind() != 0}], "thread-local variables">; 128e5dd7070Spatrick 129e5dd7070Spatrickdef SharedVar : SubsetSubject<Var, 130e5dd7070Spatrick [{S->hasGlobalStorage() && !S->getTLSKind()}], 131e5dd7070Spatrick "global variables">; 132e5dd7070Spatrick 133e5dd7070Spatrickdef GlobalVar : SubsetSubject<Var, 134e5dd7070Spatrick [{S->hasGlobalStorage()}], "global variables">; 135e5dd7070Spatrick 136*12c85518Srobertdef ExternalGlobalVar : SubsetSubject<Var, 137*12c85518Srobert [{S->hasGlobalStorage() && 138*12c85518Srobert S->getStorageClass()!=StorageClass::SC_Static && 139*12c85518Srobert !S->isLocalExternDecl()}], 140*12c85518Srobert "external global variables">; 141*12c85518Srobert 142e5dd7070Spatrickdef InlineFunction : SubsetSubject<Function, 143e5dd7070Spatrick [{S->isInlineSpecified()}], "inline functions">; 144e5dd7070Spatrick 145e5dd7070Spatrickdef FunctionTmpl 146e5dd7070Spatrick : SubsetSubject<Function, [{S->getTemplatedKind() == 147e5dd7070Spatrick FunctionDecl::TK_FunctionTemplate}], 148e5dd7070Spatrick "function templates">; 149e5dd7070Spatrick 150*12c85518Srobertdef HLSLEntry 151*12c85518Srobert : SubsetSubject<Function, 152*12c85518Srobert [{S->isExternallyVisible() && !isa<CXXMethodDecl>(S)}], 153*12c85518Srobert "global functions">; 154*12c85518Srobertdef HLSLBufferObj : SubsetSubject<HLSLBuffer, 155*12c85518Srobert [{isa<HLSLBufferDecl>(S)}], 156*12c85518Srobert "cbuffer/tbuffer">; 157*12c85518Srobert 158a9ac8606Spatrickdef ClassTmpl : SubsetSubject<CXXRecord, [{S->getDescribedClassTemplate()}], 159a9ac8606Spatrick "class templates">; 160a9ac8606Spatrick 161e5dd7070Spatrick// FIXME: this hack is needed because DeclNodes.td defines the base Decl node 162e5dd7070Spatrick// type to be a class, not a definition. This makes it impossible to create an 163e5dd7070Spatrick// attribute subject which accepts a Decl. Normally, this is not a problem, 164e5dd7070Spatrick// because the attribute can have no Subjects clause to accomplish this. But in 165e5dd7070Spatrick// the case of a SubsetSubject, there's no way to express it without this hack. 166e5dd7070Spatrickdef DeclBase : AttrSubject; 167e5dd7070Spatrickdef FunctionLike : SubsetSubject<DeclBase, 168e5dd7070Spatrick [{S->getFunctionType(false) != nullptr}], 169e5dd7070Spatrick "functions, function pointers">; 170e5dd7070Spatrick 171e5dd7070Spatrickdef OpenCLKernelFunction 172e5dd7070Spatrick : SubsetSubject<Function, [{S->hasAttr<OpenCLKernelAttr>()}], 173e5dd7070Spatrick "kernel functions">; 174e5dd7070Spatrick 175e5dd7070Spatrick// HasFunctionProto is a more strict version of FunctionLike, so it should 176e5dd7070Spatrick// never be specified in a Subjects list along with FunctionLike (due to the 177e5dd7070Spatrick// inclusive nature of subject testing). 178e5dd7070Spatrickdef HasFunctionProto : SubsetSubject<DeclBase, 179e5dd7070Spatrick [{(S->getFunctionType(true) != nullptr && 180e5dd7070Spatrick isa<FunctionProtoType>(S->getFunctionType())) || 181e5dd7070Spatrick isa<ObjCMethodDecl>(S) || 182e5dd7070Spatrick isa<BlockDecl>(S)}], 183e5dd7070Spatrick "non-K&R-style functions">; 184e5dd7070Spatrick 185e5dd7070Spatrick// A subject that matches the implicit object parameter of a non-static member 186e5dd7070Spatrick// function. Accepted as a function type attribute on the type of such a 187e5dd7070Spatrick// member function. 188e5dd7070Spatrick// FIXME: This does not actually ever match currently. 189e5dd7070Spatrickdef ImplicitObjectParameter 190e5dd7070Spatrick : SubsetSubject<Function, [{static_cast<void>(S), false}], 191e5dd7070Spatrick "implicit object parameters">; 192e5dd7070Spatrick 193e5dd7070Spatrick// A single argument to an attribute 194e5dd7070Spatrickclass Argument<string name, bit optional, bit fake = 0> { 195e5dd7070Spatrick string Name = name; 196e5dd7070Spatrick bit Optional = optional; 197e5dd7070Spatrick 198e5dd7070Spatrick /// A fake argument is used to store and serialize additional information 199e5dd7070Spatrick /// in an attribute without actually changing its parsing or pretty-printing. 200e5dd7070Spatrick bit Fake = fake; 201e5dd7070Spatrick} 202e5dd7070Spatrick 203e5dd7070Spatrickclass BoolArgument<string name, bit opt = 0, bit fake = 0> : Argument<name, opt, 204e5dd7070Spatrick fake>; 205e5dd7070Spatrickclass IdentifierArgument<string name, bit opt = 0> : Argument<name, opt>; 206e5dd7070Spatrickclass IntArgument<string name, bit opt = 0> : Argument<name, opt>; 207e5dd7070Spatrickclass StringArgument<string name, bit opt = 0> : Argument<name, opt>; 208e5dd7070Spatrickclass ExprArgument<string name, bit opt = 0> : Argument<name, opt>; 209ec727ea7Spatrickclass DeclArgument<DeclNode kind, string name, bit opt = 0, bit fake = 0> 210ec727ea7Spatrick : Argument<name, opt, fake> { 211ec727ea7Spatrick DeclNode Kind = kind; 212ec727ea7Spatrick} 213ec727ea7Spatrick 214ec727ea7Spatrick// An argument of a OMPDeclareVariantAttr that represents the `match` 215ec727ea7Spatrick// clause of the declare variant by keeping the information (incl. nesting) in 216ec727ea7Spatrick// an OMPTraitInfo object. 217ec727ea7Spatrick// 218ec727ea7Spatrick// With some exceptions, the `match(<context-selector>)` clause looks roughly 219ec727ea7Spatrick// as follows: 220ec727ea7Spatrick// context-selector := list<selector-set> 221ec727ea7Spatrick// selector-set := <kind>={list<selector>} 222ec727ea7Spatrick// selector := <kind>([score(<const-expr>):] list<trait>) 223ec727ea7Spatrick// trait := <kind> 224ec727ea7Spatrick// 225ec727ea7Spatrick// The structure of an OMPTraitInfo object is a tree as defined below: 226ec727ea7Spatrick// 227ec727ea7Spatrick// OMPTraitInfo := {list<OMPTraitSet>} 228ec727ea7Spatrick// OMPTraitSet := {Kind, list<OMPTraitSelector>} 229ec727ea7Spatrick// OMPTraitSelector := {Kind, Expr, list<OMPTraitProperty>} 230ec727ea7Spatrick// OMPTraitProperty := {Kind} 231ec727ea7Spatrick// 232ec727ea7Spatrickclass OMPTraitInfoArgument<string name> : Argument<name, 0>; 233*12c85518Srobertclass VariadicOMPInteropInfoArgument<string name> : Argument<name, 0>; 234ec727ea7Spatrick 235e5dd7070Spatrickclass TypeArgument<string name, bit opt = 0> : Argument<name, opt>; 236e5dd7070Spatrickclass UnsignedArgument<string name, bit opt = 0> : Argument<name, opt>; 237e5dd7070Spatrickclass VariadicUnsignedArgument<string name> : Argument<name, 1>; 238e5dd7070Spatrickclass VariadicExprArgument<string name> : Argument<name, 1>; 239e5dd7070Spatrickclass VariadicStringArgument<string name> : Argument<name, 1>; 240e5dd7070Spatrickclass VariadicIdentifierArgument<string name> : Argument<name, 1>; 241e5dd7070Spatrick 242e5dd7070Spatrick// Like VariadicUnsignedArgument except values are ParamIdx. 243e5dd7070Spatrickclass VariadicParamIdxArgument<string name> : Argument<name, 1>; 244e5dd7070Spatrick 245e5dd7070Spatrick// A list of identifiers matching parameters or ParamIdx indices. 246e5dd7070Spatrickclass VariadicParamOrParamIdxArgument<string name> : Argument<name, 1>; 247e5dd7070Spatrick 248e5dd7070Spatrick// Like VariadicParamIdxArgument but for a single function parameter index. 249e5dd7070Spatrickclass ParamIdxArgument<string name, bit opt = 0> : Argument<name, opt>; 250e5dd7070Spatrick 251e5dd7070Spatrick// A version of the form major.minor[.subminor]. 252e5dd7070Spatrickclass VersionArgument<string name, bit opt = 0> : Argument<name, opt>; 253e5dd7070Spatrick 254e5dd7070Spatrick// This one's a doozy, so it gets its own special type 255e5dd7070Spatrick// It can be an unsigned integer, or a type. Either can 256e5dd7070Spatrick// be dependent. 257e5dd7070Spatrickclass AlignedArgument<string name, bit opt = 0> : Argument<name, opt>; 258e5dd7070Spatrick 259e5dd7070Spatrick// A bool argument with a default value 260e5dd7070Spatrickclass DefaultBoolArgument<string name, bit default, bit fake = 0> 261e5dd7070Spatrick : BoolArgument<name, 1, fake> { 262e5dd7070Spatrick bit Default = default; 263e5dd7070Spatrick} 264e5dd7070Spatrick 265e5dd7070Spatrick// An integer argument with a default value 266e5dd7070Spatrickclass DefaultIntArgument<string name, int default> : IntArgument<name, 1> { 267e5dd7070Spatrick int Default = default; 268e5dd7070Spatrick} 269e5dd7070Spatrick 270e5dd7070Spatrick// This argument is more complex, it includes the enumerator type name, 271e5dd7070Spatrick// a list of strings to accept, and a list of enumerators to map them to. 272e5dd7070Spatrickclass EnumArgument<string name, string type, list<string> values, 273e5dd7070Spatrick list<string> enums, bit opt = 0, bit fake = 0> 274e5dd7070Spatrick : Argument<name, opt, fake> { 275e5dd7070Spatrick string Type = type; 276e5dd7070Spatrick list<string> Values = values; 277e5dd7070Spatrick list<string> Enums = enums; 278e5dd7070Spatrick} 279e5dd7070Spatrick 280e5dd7070Spatrick// FIXME: There should be a VariadicArgument type that takes any other type 281e5dd7070Spatrick// of argument and generates the appropriate type. 282e5dd7070Spatrickclass VariadicEnumArgument<string name, string type, list<string> values, 283e5dd7070Spatrick list<string> enums> : Argument<name, 1> { 284e5dd7070Spatrick string Type = type; 285e5dd7070Spatrick list<string> Values = values; 286e5dd7070Spatrick list<string> Enums = enums; 287e5dd7070Spatrick} 288e5dd7070Spatrick 289e5dd7070Spatrick// This handles one spelling of an attribute. 290e5dd7070Spatrickclass Spelling<string name, string variety> { 291e5dd7070Spatrick string Name = name; 292e5dd7070Spatrick string Variety = variety; 293e5dd7070Spatrick} 294e5dd7070Spatrick 295e5dd7070Spatrickclass GNU<string name> : Spelling<name, "GNU">; 296e5dd7070Spatrickclass Declspec<string name> : Spelling<name, "Declspec">; 297e5dd7070Spatrickclass Microsoft<string name> : Spelling<name, "Microsoft">; 298e5dd7070Spatrickclass CXX11<string namespace, string name, int version = 1> 299e5dd7070Spatrick : Spelling<name, "CXX11"> { 300e5dd7070Spatrick string Namespace = namespace; 301e5dd7070Spatrick int Version = version; 302e5dd7070Spatrick} 303a9ac8606Spatrickclass C2x<string namespace, string name, int version = 1> 304a9ac8606Spatrick : Spelling<name, "C2x"> { 305e5dd7070Spatrick string Namespace = namespace; 306a9ac8606Spatrick int Version = version; 307e5dd7070Spatrick} 308e5dd7070Spatrick 309e5dd7070Spatrickclass Keyword<string name> : Spelling<name, "Keyword">; 310e5dd7070Spatrickclass Pragma<string namespace, string name> : Spelling<name, "Pragma"> { 311e5dd7070Spatrick string Namespace = namespace; 312e5dd7070Spatrick} 313e5dd7070Spatrick 314ec727ea7Spatrick// The GCC spelling implies GNU<name>, CXX11<"gnu", name>, and optionally, 315ec727ea7Spatrick// C2x<"gnu", name>. This spelling should be used for any GCC-compatible 316e5dd7070Spatrick// attributes. 317ec727ea7Spatrickclass GCC<string name, bit allowInC = 1> : Spelling<name, "GCC"> { 318ec727ea7Spatrick bit AllowInC = allowInC; 319e5dd7070Spatrick} 320e5dd7070Spatrick 321e5dd7070Spatrick// The Clang spelling implies GNU<name>, CXX11<"clang", name>, and optionally, 322e5dd7070Spatrick// C2x<"clang", name>. This spelling should be used for any Clang-specific 323e5dd7070Spatrick// attributes. 324e5dd7070Spatrickclass Clang<string name, bit allowInC = 1> : Spelling<name, "Clang"> { 325e5dd7070Spatrick bit AllowInC = allowInC; 326e5dd7070Spatrick} 327e5dd7070Spatrick 328*12c85518Srobert// HLSL Semantic spellings 329*12c85518Srobertclass HLSLSemantic<string name> : Spelling<name, "HLSLSemantic">; 330*12c85518Srobert 331e5dd7070Spatrickclass Accessor<string name, list<Spelling> spellings> { 332e5dd7070Spatrick string Name = name; 333e5dd7070Spatrick list<Spelling> Spellings = spellings; 334e5dd7070Spatrick} 335e5dd7070Spatrick 336e5dd7070Spatrickclass SubjectDiag<bit warn> { 337e5dd7070Spatrick bit Warn = warn; 338e5dd7070Spatrick} 339e5dd7070Spatrickdef WarnDiag : SubjectDiag<1>; 340e5dd7070Spatrickdef ErrorDiag : SubjectDiag<0>; 341e5dd7070Spatrick 342e5dd7070Spatrickclass SubjectList<list<AttrSubject> subjects, SubjectDiag diag = WarnDiag, 343e5dd7070Spatrick string customDiag = ""> { 344e5dd7070Spatrick list<AttrSubject> Subjects = subjects; 345e5dd7070Spatrick SubjectDiag Diag = diag; 346e5dd7070Spatrick string CustomDiag = customDiag; 347e5dd7070Spatrick} 348e5dd7070Spatrick 349e5dd7070Spatrickclass LangOpt<string name, code customCode = [{}]> { 350ec727ea7Spatrick // The language option to test; ignored when custom code is supplied. 351e5dd7070Spatrick string Name = name; 352e5dd7070Spatrick 353e5dd7070Spatrick // A custom predicate, written as an expression evaluated in a context with 354e5dd7070Spatrick // "LangOpts" bound. 355e5dd7070Spatrick code CustomCode = customCode; 356e5dd7070Spatrick} 357e5dd7070Spatrickdef MicrosoftExt : LangOpt<"MicrosoftExt">; 358e5dd7070Spatrickdef Borland : LangOpt<"Borland">; 359e5dd7070Spatrickdef CUDA : LangOpt<"CUDA">; 360a9ac8606Spatrickdef HIP : LangOpt<"HIP">; 361e5dd7070Spatrickdef SYCL : LangOpt<"SYCLIsDevice">; 362ec727ea7Spatrickdef COnly : LangOpt<"", "!LangOpts.CPlusPlus">; 363e5dd7070Spatrickdef CPlusPlus : LangOpt<"CPlusPlus">; 364e5dd7070Spatrickdef OpenCL : LangOpt<"OpenCL">; 365e5dd7070Spatrickdef RenderScript : LangOpt<"RenderScript">; 366e5dd7070Spatrickdef ObjC : LangOpt<"ObjC">; 367e5dd7070Spatrickdef BlocksSupported : LangOpt<"Blocks">; 368e5dd7070Spatrickdef ObjCAutoRefCount : LangOpt<"ObjCAutoRefCount">; 369ec727ea7Spatrickdef ObjCNonFragileRuntime 370ec727ea7Spatrick : LangOpt<"", "LangOpts.ObjCRuntime.allowsClassStubs()">; 371e5dd7070Spatrick 372*12c85518Srobertdef HLSL : LangOpt<"HLSL">; 373*12c85518Srobert 374e5dd7070Spatrick// Language option for CMSE extensions 375e5dd7070Spatrickdef Cmse : LangOpt<"Cmse">; 376e5dd7070Spatrick 377e5dd7070Spatrick// Defines targets for target-specific attributes. Empty lists are unchecked. 378e5dd7070Spatrickclass TargetSpec { 379e5dd7070Spatrick // Specifies Architectures for which the target applies, based off the 380e5dd7070Spatrick // ArchType enumeration in Triple.h. 381e5dd7070Spatrick list<string> Arches = []; 382e5dd7070Spatrick // Specifies Operating Systems for which the target applies, based off the 383e5dd7070Spatrick // OSType enumeration in Triple.h 384e5dd7070Spatrick list<string> OSes; 385e5dd7070Spatrick // Specifies Object Formats for which the target applies, based off the 386e5dd7070Spatrick // ObjectFormatType enumeration in Triple.h 387e5dd7070Spatrick list<string> ObjectFormats; 388e5dd7070Spatrick // A custom predicate, written as an expression evaluated in a context 389e5dd7070Spatrick // with the following declarations in scope: 390e5dd7070Spatrick // const clang::TargetInfo &Target; 391e5dd7070Spatrick // const llvm::Triple &T = Target.getTriple(); 392e5dd7070Spatrick code CustomCode = [{}]; 393e5dd7070Spatrick} 394e5dd7070Spatrick 395e5dd7070Spatrickclass TargetArch<list<string> arches> : TargetSpec { 396e5dd7070Spatrick let Arches = arches; 397e5dd7070Spatrick} 398e5dd7070Spatrickdef TargetARM : TargetArch<["arm", "thumb", "armeb", "thumbeb"]>; 399ec727ea7Spatrickdef TargetAArch64 : TargetArch<["aarch64"]>; 400ec727ea7Spatrickdef TargetAnyArm : TargetArch<!listconcat(TargetARM.Arches, TargetAArch64.Arches)>; 401e5dd7070Spatrickdef TargetAVR : TargetArch<["avr"]>; 402e5dd7070Spatrickdef TargetBPF : TargetArch<["bpfel", "bpfeb"]>; 403e5dd7070Spatrickdef TargetMips32 : TargetArch<["mips", "mipsel"]>; 404e5dd7070Spatrickdef TargetAnyMips : TargetArch<["mips", "mipsel", "mips64", "mips64el"]>; 405e5dd7070Spatrickdef TargetMSP430 : TargetArch<["msp430"]>; 406a9ac8606Spatrickdef TargetM68k : TargetArch<["m68k"]>; 407e5dd7070Spatrickdef TargetRISCV : TargetArch<["riscv32", "riscv64"]>; 408e5dd7070Spatrickdef TargetX86 : TargetArch<["x86"]>; 409e5dd7070Spatrickdef TargetAnyX86 : TargetArch<["x86", "x86_64"]>; 410e5dd7070Spatrickdef TargetWebAssembly : TargetArch<["wasm32", "wasm64"]>; 411*12c85518Srobertdef TargetWindows : TargetSpec { 412*12c85518Srobert let OSes = ["Win32"]; 413*12c85518Srobert} 414a9ac8606Spatrickdef TargetHasDLLImportExport : TargetSpec { 415a9ac8606Spatrick let CustomCode = [{ Target.getTriple().hasDLLImportExport() }]; 416e5dd7070Spatrick} 417e5dd7070Spatrickdef TargetItaniumCXXABI : TargetSpec { 418e5dd7070Spatrick let CustomCode = [{ Target.getCXXABI().isItaniumFamily() }]; 419e5dd7070Spatrick} 420e5dd7070Spatrickdef TargetMicrosoftCXXABI : TargetArch<["x86", "x86_64", "arm", "thumb", "aarch64"]> { 421e5dd7070Spatrick let CustomCode = [{ Target.getCXXABI().isMicrosoft() }]; 422e5dd7070Spatrick} 423e5dd7070Spatrickdef TargetELF : TargetSpec { 424e5dd7070Spatrick let ObjectFormats = ["ELF"]; 425e5dd7070Spatrick} 426e5dd7070Spatrick 427a9ac8606Spatrickdef TargetSupportsInitPriority : TargetSpec { 428a9ac8606Spatrick let CustomCode = [{ !Target.getTriple().isOSzOS() }]; 429a9ac8606Spatrick} 430e5dd7070Spatrick// Attribute subject match rules that are used for #pragma clang attribute. 431e5dd7070Spatrick// 432e5dd7070Spatrick// A instance of AttrSubjectMatcherRule represents an individual match rule. 433e5dd7070Spatrick// An individual match rule can correspond to a number of different attribute 434e5dd7070Spatrick// subjects, e.g. "record" matching rule corresponds to the Record and 435e5dd7070Spatrick// CXXRecord attribute subjects. 436e5dd7070Spatrick// 437e5dd7070Spatrick// Match rules are used in the subject list of the #pragma clang attribute. 438e5dd7070Spatrick// Match rules can have sub-match rules that are instances of 439e5dd7070Spatrick// AttrSubjectMatcherSubRule. A sub-match rule can correspond to a number 440e5dd7070Spatrick// of different attribute subjects, and it can have a negated spelling as well. 441e5dd7070Spatrick// For example, "variable(unless(is_parameter))" matching rule corresponds to 442e5dd7070Spatrick// the NonParmVar attribute subject. 443e5dd7070Spatrickclass AttrSubjectMatcherSubRule<string name, list<AttrSubject> subjects, 444e5dd7070Spatrick bit negated = 0> { 445e5dd7070Spatrick string Name = name; 446e5dd7070Spatrick list<AttrSubject> Subjects = subjects; 447e5dd7070Spatrick bit Negated = negated; 448e5dd7070Spatrick // Lists language options, one of which is required to be true for the 449e5dd7070Spatrick // attribute to be applicable. If empty, the language options are taken 450e5dd7070Spatrick // from the parent matcher rule. 451e5dd7070Spatrick list<LangOpt> LangOpts = []; 452e5dd7070Spatrick} 453e5dd7070Spatrickclass AttrSubjectMatcherRule<string name, list<AttrSubject> subjects, 454e5dd7070Spatrick list<AttrSubjectMatcherSubRule> subrules = []> { 455e5dd7070Spatrick string Name = name; 456e5dd7070Spatrick list<AttrSubject> Subjects = subjects; 457e5dd7070Spatrick list<AttrSubjectMatcherSubRule> Constraints = subrules; 458e5dd7070Spatrick // Lists language options, one of which is required to be true for the 459e5dd7070Spatrick // attribute to be applicable. If empty, no language options are required. 460e5dd7070Spatrick list<LangOpt> LangOpts = []; 461e5dd7070Spatrick} 462e5dd7070Spatrick 463e5dd7070Spatrick// function(is_member) 464e5dd7070Spatrickdef SubRuleForCXXMethod : AttrSubjectMatcherSubRule<"is_member", [CXXMethod]> { 465e5dd7070Spatrick let LangOpts = [CPlusPlus]; 466e5dd7070Spatrick} 467e5dd7070Spatrickdef SubjectMatcherForFunction : AttrSubjectMatcherRule<"function", [Function], [ 468e5dd7070Spatrick SubRuleForCXXMethod 469e5dd7070Spatrick]>; 470e5dd7070Spatrick// hasType is abstract, it should be used with one of the sub-rules. 471e5dd7070Spatrickdef SubjectMatcherForType : AttrSubjectMatcherRule<"hasType", [], [ 472e5dd7070Spatrick AttrSubjectMatcherSubRule<"functionType", [FunctionLike]> 473e5dd7070Spatrick 474e5dd7070Spatrick // FIXME: There's a matcher ambiguity with objc methods and blocks since 475e5dd7070Spatrick // functionType excludes them but functionProtoType includes them. 476e5dd7070Spatrick // AttrSubjectMatcherSubRule<"functionProtoType", [HasFunctionProto]> 477e5dd7070Spatrick]>; 478e5dd7070Spatrickdef SubjectMatcherForTypedef : AttrSubjectMatcherRule<"type_alias", 479e5dd7070Spatrick [TypedefName]>; 480e5dd7070Spatrickdef SubjectMatcherForRecord : AttrSubjectMatcherRule<"record", [Record, 481e5dd7070Spatrick CXXRecord], [ 482e5dd7070Spatrick // unless(is_union) 483e5dd7070Spatrick AttrSubjectMatcherSubRule<"is_union", [Struct], 1> 484e5dd7070Spatrick]>; 485e5dd7070Spatrickdef SubjectMatcherForEnum : AttrSubjectMatcherRule<"enum", [Enum]>; 486e5dd7070Spatrickdef SubjectMatcherForEnumConstant : AttrSubjectMatcherRule<"enum_constant", 487e5dd7070Spatrick [EnumConstant]>; 488e5dd7070Spatrickdef SubjectMatcherForVar : AttrSubjectMatcherRule<"variable", [Var], [ 489e5dd7070Spatrick AttrSubjectMatcherSubRule<"is_thread_local", [TLSVar]>, 490e5dd7070Spatrick AttrSubjectMatcherSubRule<"is_global", [GlobalVar]>, 491ec727ea7Spatrick AttrSubjectMatcherSubRule<"is_local", [LocalVar]>, 492e5dd7070Spatrick AttrSubjectMatcherSubRule<"is_parameter", [ParmVar]>, 493e5dd7070Spatrick // unless(is_parameter) 494e5dd7070Spatrick AttrSubjectMatcherSubRule<"is_parameter", [NonParmVar], 1> 495e5dd7070Spatrick]>; 496e5dd7070Spatrickdef SubjectMatcherForField : AttrSubjectMatcherRule<"field", [Field]>; 497e5dd7070Spatrickdef SubjectMatcherForNamespace : AttrSubjectMatcherRule<"namespace", 498e5dd7070Spatrick [Namespace]> { 499e5dd7070Spatrick let LangOpts = [CPlusPlus]; 500e5dd7070Spatrick} 501e5dd7070Spatrickdef SubjectMatcherForObjCInterface : AttrSubjectMatcherRule<"objc_interface", 502e5dd7070Spatrick [ObjCInterface]> { 503e5dd7070Spatrick let LangOpts = [ObjC]; 504e5dd7070Spatrick} 505e5dd7070Spatrickdef SubjectMatcherForObjCProtocol : AttrSubjectMatcherRule<"objc_protocol", 506e5dd7070Spatrick [ObjCProtocol]> { 507e5dd7070Spatrick let LangOpts = [ObjC]; 508e5dd7070Spatrick} 509e5dd7070Spatrickdef SubjectMatcherForObjCCategory : AttrSubjectMatcherRule<"objc_category", 510e5dd7070Spatrick [ObjCCategory]> { 511e5dd7070Spatrick let LangOpts = [ObjC]; 512e5dd7070Spatrick} 513e5dd7070Spatrickdef SubjectMatcherForObjCImplementation : 514e5dd7070Spatrick AttrSubjectMatcherRule<"objc_implementation", [ObjCImpl]> { 515e5dd7070Spatrick let LangOpts = [ObjC]; 516e5dd7070Spatrick} 517e5dd7070Spatrickdef SubjectMatcherForObjCMethod : AttrSubjectMatcherRule<"objc_method", 518e5dd7070Spatrick [ObjCMethod], [ 519e5dd7070Spatrick AttrSubjectMatcherSubRule<"is_instance", [ObjCInstanceMethod]> 520e5dd7070Spatrick]> { 521e5dd7070Spatrick let LangOpts = [ObjC]; 522e5dd7070Spatrick} 523e5dd7070Spatrickdef SubjectMatcherForObjCProperty : AttrSubjectMatcherRule<"objc_property", 524e5dd7070Spatrick [ObjCProperty]> { 525e5dd7070Spatrick let LangOpts = [ObjC]; 526e5dd7070Spatrick} 527e5dd7070Spatrickdef SubjectMatcherForBlock : AttrSubjectMatcherRule<"block", [Block]> { 528e5dd7070Spatrick let LangOpts = [BlocksSupported]; 529e5dd7070Spatrick} 530e5dd7070Spatrick 531e5dd7070Spatrick// Aggregate attribute subject match rules are abstract match rules that can't 532e5dd7070Spatrick// be used directly in #pragma clang attribute. Instead, users have to use 533e5dd7070Spatrick// subject match rules that correspond to attribute subjects that derive from 534e5dd7070Spatrick// the specified subject. 535e5dd7070Spatrickclass AttrSubjectMatcherAggregateRule<AttrSubject subject> { 536e5dd7070Spatrick AttrSubject Subject = subject; 537e5dd7070Spatrick} 538e5dd7070Spatrick 539e5dd7070Spatrickdef SubjectMatcherForNamed : AttrSubjectMatcherAggregateRule<Named>; 540e5dd7070Spatrick 541e5dd7070Spatrickclass Attr { 542e5dd7070Spatrick // The various ways in which an attribute can be spelled in source 543e5dd7070Spatrick list<Spelling> Spellings; 544e5dd7070Spatrick // The things to which an attribute can appertain 545e5dd7070Spatrick SubjectList Subjects; 546e5dd7070Spatrick // The arguments allowed on an attribute 547e5dd7070Spatrick list<Argument> Args = []; 548e5dd7070Spatrick // Accessors which should be generated for the attribute. 549e5dd7070Spatrick list<Accessor> Accessors = []; 550e5dd7070Spatrick // Set to true for attributes with arguments which require delayed parsing. 551e5dd7070Spatrick bit LateParsed = 0; 552e5dd7070Spatrick // Set to false to prevent an attribute from being propagated from a template 553e5dd7070Spatrick // to the instantiation. 554e5dd7070Spatrick bit Clone = 1; 555e5dd7070Spatrick // Set to true for attributes which must be instantiated within templates 556e5dd7070Spatrick bit TemplateDependent = 0; 557e5dd7070Spatrick // Set to true for attributes that have a corresponding AST node. 558e5dd7070Spatrick bit ASTNode = 1; 559e5dd7070Spatrick // Set to true for attributes which have handler in Sema. 560e5dd7070Spatrick bit SemaHandler = 1; 561ec727ea7Spatrick // Set to true if this attribute doesn't need custom handling in Sema. 562ec727ea7Spatrick bit SimpleHandler = 0; 563e5dd7070Spatrick // Set to true for attributes that are completely ignored. 564e5dd7070Spatrick bit Ignored = 0; 565e5dd7070Spatrick // Set to true if the attribute's parsing does not match its semantic 566e5dd7070Spatrick // content. Eg) It parses 3 args, but semantically takes 4 args. Opts out of 567e5dd7070Spatrick // common attribute error checking. 568e5dd7070Spatrick bit HasCustomParsing = 0; 569e5dd7070Spatrick // Set to true if all of the attribute's arguments should be parsed in an 570e5dd7070Spatrick // unevaluated context. 571e5dd7070Spatrick bit ParseArgumentsAsUnevaluated = 0; 572e5dd7070Spatrick // Set to true if this attribute meaningful when applied to or inherited 573e5dd7070Spatrick // in a class template definition. 574e5dd7070Spatrick bit MeaningfulToClassTemplateDefinition = 0; 575e5dd7070Spatrick // Set to true if this attribute can be used with '#pragma clang attribute'. 576e5dd7070Spatrick // By default, an attribute is supported by the '#pragma clang attribute' 577e5dd7070Spatrick // only when: 578e5dd7070Spatrick // - It has a subject list whose subjects can be represented using subject 579e5dd7070Spatrick // match rules. 580e5dd7070Spatrick // - It has GNU/CXX11 spelling and doesn't require delayed parsing. 581e5dd7070Spatrick bit PragmaAttributeSupport; 582*12c85518Srobert // Set to true if this attribute accepts parameter pack expansion expressions. 583*12c85518Srobert bit AcceptsExprPack = 0; 584e5dd7070Spatrick // Lists language options, one of which is required to be true for the 585e5dd7070Spatrick // attribute to be applicable. If empty, no language options are required. 586e5dd7070Spatrick list<LangOpt> LangOpts = []; 587e5dd7070Spatrick // Any additional text that should be included verbatim in the class. 588e5dd7070Spatrick // Note: Any additional data members will leak and should be constructed 589e5dd7070Spatrick // externally on the ASTContext. 590e5dd7070Spatrick code AdditionalMembers = [{}]; 591e5dd7070Spatrick // Any documentation that should be associated with the attribute. Since an 592e5dd7070Spatrick // attribute may be documented under multiple categories, more than one 593e5dd7070Spatrick // Documentation entry may be listed. 594e5dd7070Spatrick list<Documentation> Documentation; 595e5dd7070Spatrick} 596e5dd7070Spatrick 597a9ac8606Spatrick/// Used to define a set of mutually exclusive attributes. 598a9ac8606Spatrickclass MutualExclusions<list<Attr> Ex> { 599a9ac8606Spatrick list<Attr> Exclusions = Ex; 600a9ac8606Spatrick} 601a9ac8606Spatrick 602e5dd7070Spatrick/// A type attribute is not processed on a declaration or a statement. 603e5dd7070Spatrickclass TypeAttr : Attr; 604e5dd7070Spatrick 605e5dd7070Spatrick/// A stmt attribute is not processed on a declaration or a type. 606e5dd7070Spatrickclass StmtAttr : Attr; 607e5dd7070Spatrick 608e5dd7070Spatrick/// An inheritable attribute is inherited by later redeclarations. 609e5dd7070Spatrickclass InheritableAttr : Attr { 610e5dd7070Spatrick // Set to true if this attribute can be duplicated on a subject when inheriting 611e5dd7070Spatrick // attributes from prior declarations. 612e5dd7070Spatrick bit InheritEvenIfAlreadyPresent = 0; 613e5dd7070Spatrick} 614e5dd7070Spatrick 615e5dd7070Spatrick/// Some attributes, like calling conventions, can appear in either the 616e5dd7070Spatrick/// declaration or the type position. These attributes are morally type 617e5dd7070Spatrick/// attributes, but have historically been written on declarations. 618e5dd7070Spatrickclass DeclOrTypeAttr : InheritableAttr; 619e5dd7070Spatrick 620a9ac8606Spatrick/// A attribute is either a declaration attribute or a statement attribute. 621a9ac8606Spatrickclass DeclOrStmtAttr : InheritableAttr; 622a9ac8606Spatrick 623*12c85518Srobert/// An attribute class for HLSL Annotations. 624*12c85518Srobertclass HLSLAnnotationAttr : InheritableAttr; 625*12c85518Srobert 626e5dd7070Spatrick/// A target-specific attribute. This class is meant to be used as a mixin 627e5dd7070Spatrick/// with InheritableAttr or Attr depending on the attribute's needs. 628e5dd7070Spatrickclass TargetSpecificAttr<TargetSpec target> { 629e5dd7070Spatrick TargetSpec Target = target; 630e5dd7070Spatrick // Attributes are generally required to have unique spellings for their names 631e5dd7070Spatrick // so that the parser can determine what kind of attribute it has parsed. 632e5dd7070Spatrick // However, target-specific attributes are special in that the attribute only 633e5dd7070Spatrick // "exists" for a given target. So two target-specific attributes can share 634e5dd7070Spatrick // the same name when they exist in different targets. To support this, a 635e5dd7070Spatrick // Kind can be explicitly specified for a target-specific attribute. This 636e5dd7070Spatrick // corresponds to the ParsedAttr::AT_* enum that is generated and it 637e5dd7070Spatrick // should contain a shared value between the attributes. 638e5dd7070Spatrick // 639e5dd7070Spatrick // Target-specific attributes which use this feature should ensure that the 640e5dd7070Spatrick // spellings match exactly between the attributes, and if the arguments or 641e5dd7070Spatrick // subjects differ, should specify HasCustomParsing = 1 and implement their 642e5dd7070Spatrick // own parsing and semantic handling requirements as-needed. 643e5dd7070Spatrick string ParseKind; 644e5dd7070Spatrick} 645e5dd7070Spatrick 646e5dd7070Spatrick/// An inheritable parameter attribute is inherited by later 647e5dd7070Spatrick/// redeclarations, even when it's written on a parameter. 648e5dd7070Spatrickclass InheritableParamAttr : InheritableAttr; 649e5dd7070Spatrick 650e5dd7070Spatrick/// An attribute which changes the ABI rules for a specific parameter. 651e5dd7070Spatrickclass ParameterABIAttr : InheritableParamAttr { 652e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 653e5dd7070Spatrick} 654e5dd7070Spatrick 655e5dd7070Spatrick/// An ignored attribute, which we parse but discard with no checking. 656e5dd7070Spatrickclass IgnoredAttr : Attr { 657e5dd7070Spatrick let Ignored = 1; 658e5dd7070Spatrick let ASTNode = 0; 659e5dd7070Spatrick let SemaHandler = 0; 660*12c85518Srobert let Documentation = [InternalOnly]; 661e5dd7070Spatrick} 662e5dd7070Spatrick 663e5dd7070Spatrick// 664e5dd7070Spatrick// Attributes begin here 665e5dd7070Spatrick// 666e5dd7070Spatrick 667e5dd7070Spatrickdef AbiTag : Attr { 668ec727ea7Spatrick let Spellings = [GCC<"abi_tag", /*AllowInC*/0>]; 669e5dd7070Spatrick let Args = [VariadicStringArgument<"Tags">]; 670e5dd7070Spatrick let Subjects = SubjectList<[Struct, Var, Function, Namespace], ErrorDiag>; 671e5dd7070Spatrick let MeaningfulToClassTemplateDefinition = 1; 672e5dd7070Spatrick let Documentation = [AbiTagsDocs]; 673e5dd7070Spatrick} 674e5dd7070Spatrick 675e5dd7070Spatrickdef AddressSpace : TypeAttr { 676e5dd7070Spatrick let Spellings = [Clang<"address_space">]; 677e5dd7070Spatrick let Args = [IntArgument<"AddressSpace">]; 678e5dd7070Spatrick let Documentation = [Undocumented]; 679e5dd7070Spatrick} 680e5dd7070Spatrick 681e5dd7070Spatrickdef Alias : Attr { 682e5dd7070Spatrick let Spellings = [GCC<"alias">]; 683e5dd7070Spatrick let Args = [StringArgument<"Aliasee">]; 684e5dd7070Spatrick let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag>; 685e5dd7070Spatrick let Documentation = [Undocumented]; 686e5dd7070Spatrick} 687e5dd7070Spatrick 688a9ac8606Spatrickdef BuiltinAlias : Attr { 689a9ac8606Spatrick let Spellings = [CXX11<"clang", "builtin_alias">, 690a9ac8606Spatrick C2x<"clang", "builtin_alias">, 691a9ac8606Spatrick GNU<"clang_builtin_alias">]; 692a9ac8606Spatrick let Args = [IdentifierArgument<"BuiltinName">]; 693a9ac8606Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 694a9ac8606Spatrick let Documentation = [BuiltinAliasDocs]; 695a9ac8606Spatrick} 696a9ac8606Spatrick 697ec727ea7Spatrickdef ArmBuiltinAlias : InheritableAttr, TargetSpecificAttr<TargetAnyArm> { 698ec727ea7Spatrick let Spellings = [Clang<"__clang_arm_builtin_alias">]; 699e5dd7070Spatrick let Args = [IdentifierArgument<"BuiltinName">]; 700e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 701ec727ea7Spatrick let Documentation = [ArmBuiltinAliasDocs]; 702e5dd7070Spatrick} 703e5dd7070Spatrick 704e5dd7070Spatrickdef Aligned : InheritableAttr { 705e5dd7070Spatrick let Spellings = [GCC<"aligned">, Declspec<"align">, Keyword<"alignas">, 706e5dd7070Spatrick Keyword<"_Alignas">]; 707e5dd7070Spatrick let Args = [AlignedArgument<"Alignment", 1>]; 708e5dd7070Spatrick let Accessors = [Accessor<"isGNU", [GCC<"aligned">]>, 709e5dd7070Spatrick Accessor<"isC11", [Keyword<"_Alignas">]>, 710e5dd7070Spatrick Accessor<"isAlignas", [Keyword<"alignas">, 711e5dd7070Spatrick Keyword<"_Alignas">]>, 712e5dd7070Spatrick Accessor<"isDeclspec",[Declspec<"align">]>]; 713e5dd7070Spatrick let Documentation = [Undocumented]; 714e5dd7070Spatrick} 715e5dd7070Spatrick 716e5dd7070Spatrickdef AlignValue : Attr { 717e5dd7070Spatrick let Spellings = [ 718e5dd7070Spatrick // Unfortunately, this is semantically an assertion, not a directive 719e5dd7070Spatrick // (something else must ensure the alignment), so aligned_value is a 720e5dd7070Spatrick // probably a better name. We might want to add an aligned_value spelling in 721e5dd7070Spatrick // the future (and a corresponding C++ attribute), but this can be done 722e5dd7070Spatrick // later once we decide if we also want them to have slightly-different 723e5dd7070Spatrick // semantics than Intel's align_value. 724e5dd7070Spatrick // 725e5dd7070Spatrick // Does not get a [[]] spelling because the attribute is not exposed as such 726e5dd7070Spatrick // by Intel. 727e5dd7070Spatrick GNU<"align_value"> 728e5dd7070Spatrick // Intel's compiler on Windows also supports: 729e5dd7070Spatrick // , Declspec<"align_value"> 730e5dd7070Spatrick ]; 731e5dd7070Spatrick let Args = [ExprArgument<"Alignment">]; 732e5dd7070Spatrick let Subjects = SubjectList<[Var, TypedefName]>; 733e5dd7070Spatrick let Documentation = [AlignValueDocs]; 734e5dd7070Spatrick} 735e5dd7070Spatrick 736e5dd7070Spatrickdef AlignMac68k : InheritableAttr { 737e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 738e5dd7070Spatrick let Spellings = []; 739e5dd7070Spatrick let SemaHandler = 0; 740*12c85518Srobert let Documentation = [InternalOnly]; 741e5dd7070Spatrick} 742e5dd7070Spatrick 743a9ac8606Spatrickdef AlignNatural : InheritableAttr { 744a9ac8606Spatrick // This attribute has no spellings as it is only ever created implicitly. 745a9ac8606Spatrick let Spellings = []; 746a9ac8606Spatrick let SemaHandler = 0; 747*12c85518Srobert let Documentation = [InternalOnly]; 748a9ac8606Spatrick} 749a9ac8606Spatrick 750*12c85518Srobertdef AlwaysInline : DeclOrStmtAttr { 751*12c85518Srobert let Spellings = [GCC<"always_inline">, CXX11<"clang", "always_inline">, 752*12c85518Srobert C2x<"clang", "always_inline">, Keyword<"__forceinline">]; 753*12c85518Srobert let Accessors = [Accessor<"isClangAlwaysInline", [CXX11<"clang", "always_inline">, 754*12c85518Srobert C2x<"clang", "always_inline">]>]; 755*12c85518Srobert let Subjects = SubjectList<[Function, Stmt], WarnDiag, 756*12c85518Srobert "functions and statements">; 757a9ac8606Spatrick let Documentation = [AlwaysInlineDocs]; 758e5dd7070Spatrick} 759e5dd7070Spatrick 760e5dd7070Spatrickdef Artificial : InheritableAttr { 761e5dd7070Spatrick let Spellings = [GCC<"artificial">]; 762ec727ea7Spatrick let Subjects = SubjectList<[InlineFunction]>; 763e5dd7070Spatrick let Documentation = [ArtificialDocs]; 764ec727ea7Spatrick let SimpleHandler = 1; 765e5dd7070Spatrick} 766e5dd7070Spatrick 767e5dd7070Spatrickdef XRayInstrument : InheritableAttr { 768e5dd7070Spatrick let Spellings = [Clang<"xray_always_instrument">, 769e5dd7070Spatrick Clang<"xray_never_instrument">]; 770e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod]>; 771e5dd7070Spatrick let Accessors = [Accessor<"alwaysXRayInstrument", 772e5dd7070Spatrick [Clang<"xray_always_instrument">]>, 773e5dd7070Spatrick Accessor<"neverXRayInstrument", 774e5dd7070Spatrick [Clang<"xray_never_instrument">]>]; 775e5dd7070Spatrick let Documentation = [XRayDocs]; 776ec727ea7Spatrick let SimpleHandler = 1; 777e5dd7070Spatrick} 778e5dd7070Spatrick 779e5dd7070Spatrickdef XRayLogArgs : InheritableAttr { 780e5dd7070Spatrick let Spellings = [Clang<"xray_log_args">]; 781e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod]>; 782e5dd7070Spatrick // This argument is a count not an index, so it has the same encoding (base 783e5dd7070Spatrick // 1 including C++ implicit this parameter) at the source and LLVM levels of 784e5dd7070Spatrick // representation, so ParamIdxArgument is inappropriate. It is never used 785e5dd7070Spatrick // at the AST level of representation, so it never needs to be adjusted not 786e5dd7070Spatrick // to include any C++ implicit this parameter. Thus, we just store it and 787e5dd7070Spatrick // use it as an unsigned that never needs adjustment. 788e5dd7070Spatrick let Args = [UnsignedArgument<"ArgumentCount">]; 789e5dd7070Spatrick let Documentation = [XRayDocs]; 790e5dd7070Spatrick} 791e5dd7070Spatrick 792e5dd7070Spatrickdef PatchableFunctionEntry 793e5dd7070Spatrick : InheritableAttr, 794a9ac8606Spatrick TargetSpecificAttr<TargetArch< 795a9ac8606Spatrick ["aarch64", "aarch64_be", "riscv32", "riscv64", "x86", "x86_64"]>> { 796e5dd7070Spatrick let Spellings = [GCC<"patchable_function_entry">]; 797e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod]>; 798e5dd7070Spatrick let Args = [UnsignedArgument<"Count">, DefaultIntArgument<"Offset", 0>]; 799e5dd7070Spatrick let Documentation = [PatchableFunctionEntryDocs]; 800e5dd7070Spatrick} 801e5dd7070Spatrick 802e5dd7070Spatrickdef TLSModel : InheritableAttr { 803e5dd7070Spatrick let Spellings = [GCC<"tls_model">]; 804e5dd7070Spatrick let Subjects = SubjectList<[TLSVar], ErrorDiag>; 805e5dd7070Spatrick let Args = [StringArgument<"Model">]; 806e5dd7070Spatrick let Documentation = [TLSModelDocs]; 807e5dd7070Spatrick} 808e5dd7070Spatrick 809e5dd7070Spatrickdef AnalyzerNoReturn : InheritableAttr { 810e5dd7070Spatrick // TODO: should this attribute be exposed with a [[]] spelling under the clang 811e5dd7070Spatrick // vendor namespace, or should it use a vendor namespace specific to the 812e5dd7070Spatrick // analyzer? 813e5dd7070Spatrick let Spellings = [GNU<"analyzer_noreturn">]; 814e5dd7070Spatrick // TODO: Add subject list. 815e5dd7070Spatrick let Documentation = [Undocumented]; 816e5dd7070Spatrick} 817e5dd7070Spatrick 818e5dd7070Spatrickdef Annotate : InheritableParamAttr { 819e5dd7070Spatrick let Spellings = [Clang<"annotate">]; 820a9ac8606Spatrick let Args = [StringArgument<"Annotation">, VariadicExprArgument<"Args">]; 821e5dd7070Spatrick // Ensure that the annotate attribute can be used with 822e5dd7070Spatrick // '#pragma clang attribute' even though it has no subject list. 823a9ac8606Spatrick let AdditionalMembers = [{ 824a9ac8606Spatrick static AnnotateAttr *Create(ASTContext &Ctx, llvm::StringRef Annotation, \ 825a9ac8606Spatrick const AttributeCommonInfo &CommonInfo) { 826a9ac8606Spatrick return AnnotateAttr::Create(Ctx, Annotation, nullptr, 0, CommonInfo); 827a9ac8606Spatrick } 828a9ac8606Spatrick static AnnotateAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Annotation, \ 829a9ac8606Spatrick const AttributeCommonInfo &CommonInfo = {SourceRange{}}) { 830a9ac8606Spatrick return AnnotateAttr::CreateImplicit(Ctx, Annotation, nullptr, 0, CommonInfo); 831a9ac8606Spatrick } 832a9ac8606Spatrick }]; 833e5dd7070Spatrick let PragmaAttributeSupport = 1; 834*12c85518Srobert let AcceptsExprPack = 1; 835e5dd7070Spatrick let Documentation = [Undocumented]; 836e5dd7070Spatrick} 837e5dd7070Spatrick 838*12c85518Srobertdef AnnotateType : TypeAttr { 839*12c85518Srobert let Spellings = [CXX11<"clang", "annotate_type">, C2x<"clang", "annotate_type">]; 840*12c85518Srobert let Args = [StringArgument<"Annotation">, VariadicExprArgument<"Args">]; 841*12c85518Srobert let HasCustomParsing = 1; 842*12c85518Srobert let AcceptsExprPack = 1; 843*12c85518Srobert let Documentation = [AnnotateTypeDocs]; 844*12c85518Srobert} 845*12c85518Srobert 846e5dd7070Spatrickdef ARMInterrupt : InheritableAttr, TargetSpecificAttr<TargetARM> { 847a9ac8606Spatrick // NOTE: If you add any additional spellings, M68kInterrupt's, 848a9ac8606Spatrick // MSP430Interrupt's, MipsInterrupt's and AnyX86Interrupt's spellings 849a9ac8606Spatrick // must match. 850e5dd7070Spatrick let Spellings = [GCC<"interrupt">]; 851e5dd7070Spatrick let Args = [EnumArgument<"Interrupt", "InterruptType", 852e5dd7070Spatrick ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", ""], 853e5dd7070Spatrick ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", "Generic"], 854e5dd7070Spatrick 1>]; 855e5dd7070Spatrick let ParseKind = "Interrupt"; 856e5dd7070Spatrick let HasCustomParsing = 1; 857e5dd7070Spatrick let Documentation = [ARMInterruptDocs]; 858e5dd7070Spatrick} 859e5dd7070Spatrick 860e5dd7070Spatrickdef AVRInterrupt : InheritableAttr, TargetSpecificAttr<TargetAVR> { 861e5dd7070Spatrick let Spellings = [GCC<"interrupt">]; 862e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 863e5dd7070Spatrick let ParseKind = "Interrupt"; 864e5dd7070Spatrick let Documentation = [AVRInterruptDocs]; 865e5dd7070Spatrick} 866e5dd7070Spatrick 867e5dd7070Spatrickdef AVRSignal : InheritableAttr, TargetSpecificAttr<TargetAVR> { 868e5dd7070Spatrick let Spellings = [GCC<"signal">]; 869e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 870e5dd7070Spatrick let Documentation = [AVRSignalDocs]; 871e5dd7070Spatrick} 872e5dd7070Spatrick 873e5dd7070Spatrickdef AsmLabel : InheritableAttr { 874e5dd7070Spatrick let Spellings = [Keyword<"asm">, Keyword<"__asm__">]; 875e5dd7070Spatrick let Args = [ 876e5dd7070Spatrick // Label specifies the mangled name for the decl. 877e5dd7070Spatrick StringArgument<"Label">, 878e5dd7070Spatrick 879e5dd7070Spatrick // IsLiteralLabel specifies whether the label is literal (i.e. suppresses 880e5dd7070Spatrick // the global C symbol prefix) or not. If not, the mangle-suppression prefix 881e5dd7070Spatrick // ('\01') is omitted from the decl name at the LLVM IR level. 882e5dd7070Spatrick // 883e5dd7070Spatrick // Non-literal labels are used by some external AST sources like LLDB. 884e5dd7070Spatrick BoolArgument<"IsLiteralLabel", /*optional=*/0, /*fake=*/1> 885e5dd7070Spatrick ]; 886e5dd7070Spatrick let SemaHandler = 0; 887e5dd7070Spatrick let Documentation = [AsmLabelDocs]; 888e5dd7070Spatrick let AdditionalMembers = 889e5dd7070Spatrick[{ 890e5dd7070Spatrickbool isEquivalent(AsmLabelAttr *Other) const { 891e5dd7070Spatrick return getLabel() == Other->getLabel() && getIsLiteralLabel() == Other->getIsLiteralLabel(); 892e5dd7070Spatrick} 893e5dd7070Spatrick}]; 894e5dd7070Spatrick} 895e5dd7070Spatrick 896e5dd7070Spatrickdef Availability : InheritableAttr { 897e5dd7070Spatrick let Spellings = [Clang<"availability">]; 898e5dd7070Spatrick let Args = [IdentifierArgument<"platform">, VersionArgument<"introduced">, 899e5dd7070Spatrick VersionArgument<"deprecated">, VersionArgument<"obsoleted">, 900e5dd7070Spatrick BoolArgument<"unavailable">, StringArgument<"message">, 901e5dd7070Spatrick BoolArgument<"strict">, StringArgument<"replacement">, 902e5dd7070Spatrick IntArgument<"priority">]; 903e5dd7070Spatrick let AdditionalMembers = 904e5dd7070Spatrick[{static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) { 905e5dd7070Spatrick return llvm::StringSwitch<llvm::StringRef>(Platform) 906e5dd7070Spatrick .Case("android", "Android") 907*12c85518Srobert .Case("fuchsia", "Fuchsia") 908e5dd7070Spatrick .Case("ios", "iOS") 909e5dd7070Spatrick .Case("macos", "macOS") 910e5dd7070Spatrick .Case("tvos", "tvOS") 911e5dd7070Spatrick .Case("watchos", "watchOS") 912*12c85518Srobert .Case("driverkit", "DriverKit") 913e5dd7070Spatrick .Case("ios_app_extension", "iOS (App Extension)") 914e5dd7070Spatrick .Case("macos_app_extension", "macOS (App Extension)") 915e5dd7070Spatrick .Case("tvos_app_extension", "tvOS (App Extension)") 916e5dd7070Spatrick .Case("watchos_app_extension", "watchOS (App Extension)") 917a9ac8606Spatrick .Case("maccatalyst", "macCatalyst") 918a9ac8606Spatrick .Case("maccatalyst_app_extension", "macCatalyst (App Extension)") 919e5dd7070Spatrick .Case("swift", "Swift") 920*12c85518Srobert .Case("shadermodel", "HLSL ShaderModel") 921e5dd7070Spatrick .Default(llvm::StringRef()); 922e5dd7070Spatrick} 923e5dd7070Spatrickstatic llvm::StringRef getPlatformNameSourceSpelling(llvm::StringRef Platform) { 924e5dd7070Spatrick return llvm::StringSwitch<llvm::StringRef>(Platform) 925e5dd7070Spatrick .Case("ios", "iOS") 926e5dd7070Spatrick .Case("macos", "macOS") 927e5dd7070Spatrick .Case("tvos", "tvOS") 928e5dd7070Spatrick .Case("watchos", "watchOS") 929e5dd7070Spatrick .Case("ios_app_extension", "iOSApplicationExtension") 930e5dd7070Spatrick .Case("macos_app_extension", "macOSApplicationExtension") 931e5dd7070Spatrick .Case("tvos_app_extension", "tvOSApplicationExtension") 932e5dd7070Spatrick .Case("watchos_app_extension", "watchOSApplicationExtension") 933a9ac8606Spatrick .Case("maccatalyst", "macCatalyst") 934a9ac8606Spatrick .Case("maccatalyst_app_extension", "macCatalystApplicationExtension") 935a9ac8606Spatrick .Case("zos", "z/OS") 936*12c85518Srobert .Case("shadermodel", "ShaderModel") 937e5dd7070Spatrick .Default(Platform); 938e5dd7070Spatrick} 939e5dd7070Spatrickstatic llvm::StringRef canonicalizePlatformName(llvm::StringRef Platform) { 940e5dd7070Spatrick return llvm::StringSwitch<llvm::StringRef>(Platform) 941e5dd7070Spatrick .Case("iOS", "ios") 942e5dd7070Spatrick .Case("macOS", "macos") 943e5dd7070Spatrick .Case("tvOS", "tvos") 944e5dd7070Spatrick .Case("watchOS", "watchos") 945e5dd7070Spatrick .Case("iOSApplicationExtension", "ios_app_extension") 946e5dd7070Spatrick .Case("macOSApplicationExtension", "macos_app_extension") 947e5dd7070Spatrick .Case("tvOSApplicationExtension", "tvos_app_extension") 948e5dd7070Spatrick .Case("watchOSApplicationExtension", "watchos_app_extension") 949a9ac8606Spatrick .Case("macCatalyst", "maccatalyst") 950a9ac8606Spatrick .Case("macCatalystApplicationExtension", "maccatalyst_app_extension") 951*12c85518Srobert .Case("ShaderModel", "shadermodel") 952e5dd7070Spatrick .Default(Platform); 953e5dd7070Spatrick} }]; 954e5dd7070Spatrick let HasCustomParsing = 1; 955e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 956e5dd7070Spatrick let Subjects = SubjectList<[Named]>; 957e5dd7070Spatrick let Documentation = [AvailabilityDocs]; 958e5dd7070Spatrick} 959e5dd7070Spatrick 960e5dd7070Spatrickdef ExternalSourceSymbol : InheritableAttr { 961e5dd7070Spatrick let Spellings = [Clang<"external_source_symbol">]; 962e5dd7070Spatrick let Args = [StringArgument<"language", 1>, 963e5dd7070Spatrick StringArgument<"definedIn", 1>, 964e5dd7070Spatrick BoolArgument<"generatedDeclaration", 1>]; 965e5dd7070Spatrick let HasCustomParsing = 1; 966e5dd7070Spatrick let Subjects = SubjectList<[Named]>; 967e5dd7070Spatrick let Documentation = [ExternalSourceSymbolDocs]; 968e5dd7070Spatrick} 969e5dd7070Spatrick 970e5dd7070Spatrickdef Blocks : InheritableAttr { 971e5dd7070Spatrick let Spellings = [Clang<"blocks">]; 972e5dd7070Spatrick let Args = [EnumArgument<"Type", "BlockType", ["byref"], ["ByRef"]>]; 973e5dd7070Spatrick let Documentation = [Undocumented]; 974e5dd7070Spatrick} 975e5dd7070Spatrick 976e5dd7070Spatrickdef Bounded : IgnoredAttr { 977e5dd7070Spatrick // Does not have a [[]] spelling because the attribute is ignored. 978e5dd7070Spatrick let Spellings = [GNU<"bounded">]; 979e5dd7070Spatrick} 980e5dd7070Spatrick 981e5dd7070Spatrickdef CarriesDependency : InheritableParamAttr { 982e5dd7070Spatrick let Spellings = [GNU<"carries_dependency">, 983e5dd7070Spatrick CXX11<"","carries_dependency", 200809>]; 984e5dd7070Spatrick let Subjects = SubjectList<[ParmVar, ObjCMethod, Function], ErrorDiag>; 985e5dd7070Spatrick let Documentation = [CarriesDependencyDocs]; 986e5dd7070Spatrick} 987e5dd7070Spatrick 988e5dd7070Spatrickdef CDecl : DeclOrTypeAttr { 989e5dd7070Spatrick let Spellings = [GCC<"cdecl">, Keyword<"__cdecl">, Keyword<"_cdecl">]; 990e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 991e5dd7070Spatrick let Documentation = [Undocumented]; 992e5dd7070Spatrick} 993e5dd7070Spatrick 994e5dd7070Spatrick// cf_audited_transfer indicates that the given function has been 995e5dd7070Spatrick// audited and has been marked with the appropriate cf_consumed and 996e5dd7070Spatrick// cf_returns_retained attributes. It is generally applied by 997e5dd7070Spatrick// '#pragma clang arc_cf_code_audited' rather than explicitly. 998e5dd7070Spatrickdef CFAuditedTransfer : InheritableAttr { 999e5dd7070Spatrick let Spellings = [Clang<"cf_audited_transfer">]; 1000e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1001e5dd7070Spatrick let Documentation = [Undocumented]; 1002a9ac8606Spatrick let SimpleHandler = 1; 1003e5dd7070Spatrick} 1004e5dd7070Spatrick 1005e5dd7070Spatrick// cf_unknown_transfer is an explicit opt-out of cf_audited_transfer. 1006e5dd7070Spatrick// It indicates that the function has unknown or unautomatable 1007e5dd7070Spatrick// transfer semantics. 1008e5dd7070Spatrickdef CFUnknownTransfer : InheritableAttr { 1009e5dd7070Spatrick let Spellings = [Clang<"cf_unknown_transfer">]; 1010e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1011e5dd7070Spatrick let Documentation = [Undocumented]; 1012a9ac8606Spatrick let SimpleHandler = 1; 1013e5dd7070Spatrick} 1014a9ac8606Spatrickdef : MutualExclusions<[CFAuditedTransfer, CFUnknownTransfer]>; 1015e5dd7070Spatrick 1016e5dd7070Spatrickdef CFReturnsRetained : InheritableAttr { 1017e5dd7070Spatrick let Spellings = [Clang<"cf_returns_retained">]; 1018e5dd7070Spatrick// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>; 1019e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 1020e5dd7070Spatrick} 1021e5dd7070Spatrick 1022e5dd7070Spatrickdef CFReturnsNotRetained : InheritableAttr { 1023e5dd7070Spatrick let Spellings = [Clang<"cf_returns_not_retained">]; 1024e5dd7070Spatrick// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>; 1025e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 1026e5dd7070Spatrick} 1027e5dd7070Spatrick 1028e5dd7070Spatrickdef CFConsumed : InheritableParamAttr { 1029e5dd7070Spatrick let Spellings = [Clang<"cf_consumed">]; 1030e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 1031e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 1032e5dd7070Spatrick} 1033e5dd7070Spatrick 1034e5dd7070Spatrick// OSObject-based attributes. 1035e5dd7070Spatrickdef OSConsumed : InheritableParamAttr { 1036e5dd7070Spatrick let Spellings = [Clang<"os_consumed">]; 1037e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 1038e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 1039e5dd7070Spatrick} 1040e5dd7070Spatrick 1041e5dd7070Spatrickdef OSReturnsRetained : InheritableAttr { 1042e5dd7070Spatrick let Spellings = [Clang<"os_returns_retained">]; 1043e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod, ObjCProperty, ParmVar]>; 1044e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 1045e5dd7070Spatrick} 1046e5dd7070Spatrick 1047e5dd7070Spatrickdef OSReturnsNotRetained : InheritableAttr { 1048e5dd7070Spatrick let Spellings = [Clang<"os_returns_not_retained">]; 1049e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod, ObjCProperty, ParmVar]>; 1050e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 1051e5dd7070Spatrick} 1052e5dd7070Spatrick 1053e5dd7070Spatrickdef OSReturnsRetainedOnZero : InheritableAttr { 1054e5dd7070Spatrick let Spellings = [Clang<"os_returns_retained_on_zero">]; 1055e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 1056e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 1057e5dd7070Spatrick} 1058e5dd7070Spatrick 1059e5dd7070Spatrickdef OSReturnsRetainedOnNonZero : InheritableAttr { 1060e5dd7070Spatrick let Spellings = [Clang<"os_returns_retained_on_non_zero">]; 1061e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 1062e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 1063e5dd7070Spatrick} 1064e5dd7070Spatrick 1065e5dd7070Spatrickdef OSConsumesThis : InheritableAttr { 1066e5dd7070Spatrick let Spellings = [Clang<"os_consumes_this">]; 1067e5dd7070Spatrick let Subjects = SubjectList<[NonStaticCXXMethod]>; 1068e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 1069ec727ea7Spatrick let SimpleHandler = 1; 1070e5dd7070Spatrick} 1071e5dd7070Spatrick 1072e5dd7070Spatrickdef Cleanup : InheritableAttr { 1073e5dd7070Spatrick let Spellings = [GCC<"cleanup">]; 1074ec727ea7Spatrick let Args = [DeclArgument<Function, "FunctionDecl">]; 1075e5dd7070Spatrick let Subjects = SubjectList<[LocalVar]>; 1076e5dd7070Spatrick let Documentation = [Undocumented]; 1077e5dd7070Spatrick} 1078e5dd7070Spatrick 1079ec727ea7Spatrickdef CmseNSEntry : InheritableAttr, TargetSpecificAttr<TargetARM> { 1080ec727ea7Spatrick let Spellings = [GNU<"cmse_nonsecure_entry">]; 1081ec727ea7Spatrick let Subjects = SubjectList<[Function]>; 1082ec727ea7Spatrick let LangOpts = [Cmse]; 1083ec727ea7Spatrick let Documentation = [ArmCmseNSEntryDocs]; 1084ec727ea7Spatrick} 1085ec727ea7Spatrick 1086ec727ea7Spatrickdef CmseNSCall : TypeAttr, TargetSpecificAttr<TargetARM> { 1087ec727ea7Spatrick let Spellings = [GNU<"cmse_nonsecure_call">]; 1088ec727ea7Spatrick let LangOpts = [Cmse]; 1089ec727ea7Spatrick let Documentation = [ArmCmseNSCallDocs]; 1090ec727ea7Spatrick} 1091ec727ea7Spatrick 1092e5dd7070Spatrickdef Cold : InheritableAttr { 1093e5dd7070Spatrick let Spellings = [GCC<"cold">]; 1094e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1095*12c85518Srobert let Documentation = [ColdFunctionEntryDocs]; 1096a9ac8606Spatrick let SimpleHandler = 1; 1097e5dd7070Spatrick} 1098e5dd7070Spatrick 1099e5dd7070Spatrickdef Common : InheritableAttr { 1100e5dd7070Spatrick let Spellings = [GCC<"common">]; 1101e5dd7070Spatrick let Subjects = SubjectList<[Var]>; 1102e5dd7070Spatrick let Documentation = [Undocumented]; 1103e5dd7070Spatrick} 1104e5dd7070Spatrick 1105e5dd7070Spatrickdef Const : InheritableAttr { 1106e5dd7070Spatrick let Spellings = [GCC<"const">, GCC<"__const">]; 1107e5dd7070Spatrick let Documentation = [Undocumented]; 1108ec727ea7Spatrick let SimpleHandler = 1; 1109e5dd7070Spatrick} 1110e5dd7070Spatrick 1111e5dd7070Spatrickdef ConstInit : InheritableAttr { 1112e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it requires the 1113e5dd7070Spatrick // CPlusPlus language option. 1114e5dd7070Spatrick let Spellings = [Keyword<"constinit">, 1115e5dd7070Spatrick Clang<"require_constant_initialization", 0>]; 1116e5dd7070Spatrick let Subjects = SubjectList<[GlobalVar], ErrorDiag>; 1117e5dd7070Spatrick let Accessors = [Accessor<"isConstinit", [Keyword<"constinit">]>]; 1118e5dd7070Spatrick let Documentation = [ConstInitDocs]; 1119e5dd7070Spatrick let LangOpts = [CPlusPlus]; 1120ec727ea7Spatrick let SimpleHandler = 1; 1121e5dd7070Spatrick} 1122e5dd7070Spatrick 1123e5dd7070Spatrickdef Constructor : InheritableAttr { 1124e5dd7070Spatrick let Spellings = [GCC<"constructor">]; 1125e5dd7070Spatrick let Args = [DefaultIntArgument<"Priority", 65535>]; 1126e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1127e5dd7070Spatrick let Documentation = [Undocumented]; 1128e5dd7070Spatrick} 1129e5dd7070Spatrick 1130e5dd7070Spatrickdef CPUSpecific : InheritableAttr { 1131e5dd7070Spatrick let Spellings = [Clang<"cpu_specific">, Declspec<"cpu_specific">]; 1132e5dd7070Spatrick let Args = [VariadicIdentifierArgument<"Cpus">]; 1133e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1134e5dd7070Spatrick let Documentation = [CPUSpecificCPUDispatchDocs]; 1135e5dd7070Spatrick let AdditionalMembers = [{ 1136e5dd7070Spatrick IdentifierInfo *getCPUName(unsigned Index) const { 1137e5dd7070Spatrick return *(cpus_begin() + Index); 1138e5dd7070Spatrick } 1139e5dd7070Spatrick }]; 1140e5dd7070Spatrick} 1141e5dd7070Spatrick 1142e5dd7070Spatrickdef CPUDispatch : InheritableAttr { 1143e5dd7070Spatrick let Spellings = [Clang<"cpu_dispatch">, Declspec<"cpu_dispatch">]; 1144e5dd7070Spatrick let Args = [VariadicIdentifierArgument<"Cpus">]; 1145e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1146e5dd7070Spatrick let Documentation = [CPUSpecificCPUDispatchDocs]; 1147e5dd7070Spatrick} 1148e5dd7070Spatrick 1149e5dd7070Spatrick// CUDA attributes are spelled __attribute__((attr)) or __declspec(__attr__), 1150e5dd7070Spatrick// and they do not receive a [[]] spelling. 1151e5dd7070Spatrickdef CUDAConstant : InheritableAttr { 1152e5dd7070Spatrick let Spellings = [GNU<"constant">, Declspec<"__constant__">]; 1153e5dd7070Spatrick let Subjects = SubjectList<[Var]>; 1154e5dd7070Spatrick let LangOpts = [CUDA]; 1155e5dd7070Spatrick let Documentation = [Undocumented]; 1156e5dd7070Spatrick} 1157e5dd7070Spatrick 1158e5dd7070Spatrickdef CUDACudartBuiltin : IgnoredAttr { 1159e5dd7070Spatrick let Spellings = [GNU<"cudart_builtin">, Declspec<"__cudart_builtin__">]; 1160e5dd7070Spatrick let LangOpts = [CUDA]; 1161e5dd7070Spatrick} 1162e5dd7070Spatrick 1163e5dd7070Spatrickdef CUDADevice : InheritableAttr { 1164e5dd7070Spatrick let Spellings = [GNU<"device">, Declspec<"__device__">]; 1165e5dd7070Spatrick let Subjects = SubjectList<[Function, Var]>; 1166e5dd7070Spatrick let LangOpts = [CUDA]; 1167e5dd7070Spatrick let Documentation = [Undocumented]; 1168e5dd7070Spatrick} 1169e5dd7070Spatrick 1170e5dd7070Spatrickdef CUDADeviceBuiltin : IgnoredAttr { 1171e5dd7070Spatrick let Spellings = [GNU<"device_builtin">, Declspec<"__device_builtin__">]; 1172e5dd7070Spatrick let LangOpts = [CUDA]; 1173e5dd7070Spatrick} 1174e5dd7070Spatrick 1175ec727ea7Spatrickdef CUDADeviceBuiltinSurfaceType : InheritableAttr { 1176e5dd7070Spatrick let Spellings = [GNU<"device_builtin_surface_type">, 1177e5dd7070Spatrick Declspec<"__device_builtin_surface_type__">]; 1178e5dd7070Spatrick let LangOpts = [CUDA]; 1179ec727ea7Spatrick let Subjects = SubjectList<[CXXRecord]>; 1180ec727ea7Spatrick let Documentation = [CUDADeviceBuiltinSurfaceTypeDocs]; 1181a9ac8606Spatrick let MeaningfulToClassTemplateDefinition = 1; 1182a9ac8606Spatrick let SimpleHandler = 1; 1183e5dd7070Spatrick} 1184e5dd7070Spatrick 1185ec727ea7Spatrickdef CUDADeviceBuiltinTextureType : InheritableAttr { 1186e5dd7070Spatrick let Spellings = [GNU<"device_builtin_texture_type">, 1187e5dd7070Spatrick Declspec<"__device_builtin_texture_type__">]; 1188e5dd7070Spatrick let LangOpts = [CUDA]; 1189ec727ea7Spatrick let Subjects = SubjectList<[CXXRecord]>; 1190ec727ea7Spatrick let Documentation = [CUDADeviceBuiltinTextureTypeDocs]; 1191a9ac8606Spatrick let MeaningfulToClassTemplateDefinition = 1; 1192a9ac8606Spatrick let SimpleHandler = 1; 1193e5dd7070Spatrick} 1194a9ac8606Spatrickdef : MutualExclusions<[CUDADeviceBuiltinSurfaceType, 1195a9ac8606Spatrick CUDADeviceBuiltinTextureType]>; 1196e5dd7070Spatrick 1197e5dd7070Spatrickdef CUDAGlobal : InheritableAttr { 1198e5dd7070Spatrick let Spellings = [GNU<"global">, Declspec<"__global__">]; 1199e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1200e5dd7070Spatrick let LangOpts = [CUDA]; 1201e5dd7070Spatrick let Documentation = [Undocumented]; 1202e5dd7070Spatrick} 1203a9ac8606Spatrickdef : MutualExclusions<[CUDADevice, CUDAGlobal]>; 1204e5dd7070Spatrick 1205e5dd7070Spatrickdef CUDAHost : InheritableAttr { 1206e5dd7070Spatrick let Spellings = [GNU<"host">, Declspec<"__host__">]; 1207e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1208e5dd7070Spatrick let LangOpts = [CUDA]; 1209e5dd7070Spatrick let Documentation = [Undocumented]; 1210a9ac8606Spatrick let SimpleHandler = 1; 1211a9ac8606Spatrick} 1212a9ac8606Spatrickdef : MutualExclusions<[CUDAGlobal, CUDAHost]>; 1213a9ac8606Spatrick 1214a9ac8606Spatrickdef HIPManaged : InheritableAttr { 1215a9ac8606Spatrick let Spellings = [GNU<"managed">, Declspec<"__managed__">]; 1216a9ac8606Spatrick let Subjects = SubjectList<[Var]>; 1217a9ac8606Spatrick let LangOpts = [HIP]; 1218a9ac8606Spatrick let Documentation = [HIPManagedAttrDocs]; 1219e5dd7070Spatrick} 1220e5dd7070Spatrick 1221e5dd7070Spatrickdef CUDAInvalidTarget : InheritableAttr { 1222e5dd7070Spatrick let Spellings = []; 1223e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1224e5dd7070Spatrick let LangOpts = [CUDA]; 1225*12c85518Srobert let Documentation = [InternalOnly]; 1226e5dd7070Spatrick} 1227e5dd7070Spatrick 1228e5dd7070Spatrickdef CUDALaunchBounds : InheritableAttr { 1229e5dd7070Spatrick let Spellings = [GNU<"launch_bounds">, Declspec<"__launch_bounds__">]; 1230e5dd7070Spatrick let Args = [ExprArgument<"MaxThreads">, ExprArgument<"MinBlocks", 1>]; 1231e5dd7070Spatrick let LangOpts = [CUDA]; 1232e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod, FunctionLike]>; 1233e5dd7070Spatrick // An AST node is created for this attribute, but is not used by other parts 1234e5dd7070Spatrick // of the compiler. However, this node needs to exist in the AST because 1235e5dd7070Spatrick // non-LLVM backends may be relying on the attribute's presence. 1236e5dd7070Spatrick let Documentation = [Undocumented]; 1237e5dd7070Spatrick} 1238e5dd7070Spatrick 1239e5dd7070Spatrickdef CUDAShared : InheritableAttr { 1240e5dd7070Spatrick let Spellings = [GNU<"shared">, Declspec<"__shared__">]; 1241e5dd7070Spatrick let Subjects = SubjectList<[Var]>; 1242e5dd7070Spatrick let LangOpts = [CUDA]; 1243e5dd7070Spatrick let Documentation = [Undocumented]; 1244e5dd7070Spatrick} 1245a9ac8606Spatrickdef : MutualExclusions<[CUDAConstant, CUDAShared, HIPManaged]>; 1246e5dd7070Spatrick 1247e5dd7070Spatrickdef SYCLKernel : InheritableAttr { 1248e5dd7070Spatrick let Spellings = [Clang<"sycl_kernel">]; 1249e5dd7070Spatrick let Subjects = SubjectList<[FunctionTmpl]>; 1250e5dd7070Spatrick let LangOpts = [SYCL]; 1251e5dd7070Spatrick let Documentation = [SYCLKernelDocs]; 1252e5dd7070Spatrick} 1253e5dd7070Spatrick 1254*12c85518Srobertdef SYCLSpecialClass: InheritableAttr { 1255*12c85518Srobert let Spellings = [Clang<"sycl_special_class">]; 1256*12c85518Srobert let Subjects = SubjectList<[CXXRecord]>; 1257*12c85518Srobert let LangOpts = [SYCL]; 1258*12c85518Srobert let Documentation = [SYCLSpecialClassDocs]; 1259*12c85518Srobert} 1260*12c85518Srobert 1261e5dd7070Spatrickdef C11NoReturn : InheritableAttr { 1262e5dd7070Spatrick let Spellings = [Keyword<"_Noreturn">]; 1263e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1264e5dd7070Spatrick let SemaHandler = 0; 1265e5dd7070Spatrick let Documentation = [C11NoReturnDocs]; 1266e5dd7070Spatrick} 1267e5dd7070Spatrick 1268e5dd7070Spatrickdef CXX11NoReturn : InheritableAttr { 1269*12c85518Srobert let Spellings = [CXX11<"", "noreturn", 200809>, 1270*12c85518Srobert C2x<"", "noreturn", 202202>, C2x<"", "_Noreturn", 202202>]; 1271e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1272e5dd7070Spatrick let Documentation = [CXX11NoReturnDocs]; 1273e5dd7070Spatrick} 1274e5dd7070Spatrick 1275e5dd7070Spatrick// Similar to CUDA, OpenCL attributes do not receive a [[]] spelling because 1276e5dd7070Spatrick// the specification does not expose them with one currently. 1277e5dd7070Spatrickdef OpenCLKernel : InheritableAttr { 1278e5dd7070Spatrick let Spellings = [Keyword<"__kernel">, Keyword<"kernel">]; 1279e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1280e5dd7070Spatrick let Documentation = [Undocumented]; 1281ec727ea7Spatrick let SimpleHandler = 1; 1282e5dd7070Spatrick} 1283e5dd7070Spatrick 1284a9ac8606Spatrickdef OpenCLUnrollHint : StmtAttr { 1285e5dd7070Spatrick let Spellings = [GNU<"opencl_unroll_hint">]; 1286a9ac8606Spatrick let Subjects = SubjectList<[ForStmt, CXXForRangeStmt, WhileStmt, DoStmt], 1287a9ac8606Spatrick ErrorDiag, "'for', 'while', and 'do' statements">; 1288a9ac8606Spatrick let Args = [UnsignedArgument<"UnrollHint", /*opt*/1>]; 1289e5dd7070Spatrick let Documentation = [OpenCLUnrollHintDocs]; 1290e5dd7070Spatrick} 1291e5dd7070Spatrick 1292e5dd7070Spatrickdef OpenCLIntelReqdSubGroupSize: InheritableAttr { 1293e5dd7070Spatrick let Spellings = [GNU<"intel_reqd_sub_group_size">]; 1294e5dd7070Spatrick let Args = [UnsignedArgument<"SubGroupSize">]; 1295e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1296e5dd7070Spatrick let Documentation = [OpenCLIntelReqdSubGroupSizeDocs]; 1297e5dd7070Spatrick} 1298e5dd7070Spatrick 1299e5dd7070Spatrick// This attribute is both a type attribute, and a declaration attribute (for 1300e5dd7070Spatrick// parameter variables). 1301e5dd7070Spatrickdef OpenCLAccess : Attr { 1302e5dd7070Spatrick let Spellings = [Keyword<"__read_only">, Keyword<"read_only">, 1303e5dd7070Spatrick Keyword<"__write_only">, Keyword<"write_only">, 1304e5dd7070Spatrick Keyword<"__read_write">, Keyword<"read_write">]; 1305e5dd7070Spatrick let Subjects = SubjectList<[ParmVar, TypedefName], ErrorDiag>; 1306e5dd7070Spatrick let Accessors = [Accessor<"isReadOnly", [Keyword<"__read_only">, 1307e5dd7070Spatrick Keyword<"read_only">]>, 1308e5dd7070Spatrick Accessor<"isReadWrite", [Keyword<"__read_write">, 1309e5dd7070Spatrick Keyword<"read_write">]>, 1310e5dd7070Spatrick Accessor<"isWriteOnly", [Keyword<"__write_only">, 1311e5dd7070Spatrick Keyword<"write_only">]>]; 1312e5dd7070Spatrick let Documentation = [OpenCLAccessDocs]; 1313e5dd7070Spatrick} 1314e5dd7070Spatrick 1315e5dd7070Spatrickdef OpenCLPrivateAddressSpace : TypeAttr { 1316e5dd7070Spatrick let Spellings = [Keyword<"__private">, Keyword<"private">, Clang<"opencl_private">]; 1317e5dd7070Spatrick let Documentation = [OpenCLAddressSpacePrivateDocs]; 1318e5dd7070Spatrick} 1319e5dd7070Spatrick 1320e5dd7070Spatrickdef OpenCLGlobalAddressSpace : TypeAttr { 1321e5dd7070Spatrick let Spellings = [Keyword<"__global">, Keyword<"global">, Clang<"opencl_global">]; 1322e5dd7070Spatrick let Documentation = [OpenCLAddressSpaceGlobalDocs]; 1323e5dd7070Spatrick} 1324e5dd7070Spatrick 1325a9ac8606Spatrickdef OpenCLGlobalDeviceAddressSpace : TypeAttr { 1326a9ac8606Spatrick let Spellings = [Clang<"opencl_global_device">]; 1327a9ac8606Spatrick let Documentation = [OpenCLAddressSpaceGlobalExtDocs]; 1328a9ac8606Spatrick} 1329a9ac8606Spatrick 1330a9ac8606Spatrickdef OpenCLGlobalHostAddressSpace : TypeAttr { 1331a9ac8606Spatrick let Spellings = [Clang<"opencl_global_host">]; 1332a9ac8606Spatrick let Documentation = [OpenCLAddressSpaceGlobalExtDocs]; 1333a9ac8606Spatrick} 1334a9ac8606Spatrick 1335e5dd7070Spatrickdef OpenCLLocalAddressSpace : TypeAttr { 1336e5dd7070Spatrick let Spellings = [Keyword<"__local">, Keyword<"local">, Clang<"opencl_local">]; 1337e5dd7070Spatrick let Documentation = [OpenCLAddressSpaceLocalDocs]; 1338e5dd7070Spatrick} 1339e5dd7070Spatrick 1340e5dd7070Spatrickdef OpenCLConstantAddressSpace : TypeAttr { 1341e5dd7070Spatrick let Spellings = [Keyword<"__constant">, Keyword<"constant">, Clang<"opencl_constant">]; 1342e5dd7070Spatrick let Documentation = [OpenCLAddressSpaceConstantDocs]; 1343e5dd7070Spatrick} 1344e5dd7070Spatrick 1345e5dd7070Spatrickdef OpenCLGenericAddressSpace : TypeAttr { 1346e5dd7070Spatrick let Spellings = [Keyword<"__generic">, Keyword<"generic">, Clang<"opencl_generic">]; 1347e5dd7070Spatrick let Documentation = [OpenCLAddressSpaceGenericDocs]; 1348e5dd7070Spatrick} 1349e5dd7070Spatrick 1350e5dd7070Spatrickdef OpenCLNoSVM : Attr { 1351e5dd7070Spatrick let Spellings = [GNU<"nosvm">]; 1352e5dd7070Spatrick let Subjects = SubjectList<[Var]>; 1353e5dd7070Spatrick let Documentation = [OpenCLNoSVMDocs]; 1354e5dd7070Spatrick let LangOpts = [OpenCL]; 1355e5dd7070Spatrick let ASTNode = 0; 1356e5dd7070Spatrick} 1357e5dd7070Spatrick 1358e5dd7070Spatrickdef RenderScriptKernel : Attr { 1359e5dd7070Spatrick let Spellings = [GNU<"kernel">]; 1360e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1361e5dd7070Spatrick let Documentation = [RenderScriptKernelAttributeDocs]; 1362e5dd7070Spatrick let LangOpts = [RenderScript]; 1363ec727ea7Spatrick let SimpleHandler = 1; 1364e5dd7070Spatrick} 1365e5dd7070Spatrick 1366e5dd7070Spatrickdef Deprecated : InheritableAttr { 1367e5dd7070Spatrick let Spellings = [GCC<"deprecated">, Declspec<"deprecated">, 1368a9ac8606Spatrick CXX11<"","deprecated", 201309>, 1369a9ac8606Spatrick C2x<"", "deprecated", 201904>]; 1370e5dd7070Spatrick let Args = [StringArgument<"Message", 1>, 1371e5dd7070Spatrick // An optional string argument that enables us to provide a 1372e5dd7070Spatrick // Fix-It. 1373e5dd7070Spatrick StringArgument<"Replacement", 1>]; 1374e5dd7070Spatrick let MeaningfulToClassTemplateDefinition = 1; 1375e5dd7070Spatrick let Documentation = [DeprecatedDocs]; 1376e5dd7070Spatrick} 1377e5dd7070Spatrick 1378e5dd7070Spatrickdef Destructor : InheritableAttr { 1379e5dd7070Spatrick let Spellings = [GCC<"destructor">]; 1380e5dd7070Spatrick let Args = [DefaultIntArgument<"Priority", 65535>]; 1381e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1382e5dd7070Spatrick let Documentation = [Undocumented]; 1383e5dd7070Spatrick} 1384e5dd7070Spatrick 1385e5dd7070Spatrickdef EmptyBases : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> { 1386e5dd7070Spatrick let Spellings = [Declspec<"empty_bases">]; 1387e5dd7070Spatrick let Subjects = SubjectList<[CXXRecord]>; 1388e5dd7070Spatrick let Documentation = [EmptyBasesDocs]; 1389ec727ea7Spatrick let SimpleHandler = 1; 1390e5dd7070Spatrick} 1391e5dd7070Spatrick 1392e5dd7070Spatrickdef AllocSize : InheritableAttr { 1393e5dd7070Spatrick let Spellings = [GCC<"alloc_size">]; 1394a9ac8606Spatrick let Subjects = SubjectList<[HasFunctionProto]>; 1395e5dd7070Spatrick let Args = [ParamIdxArgument<"ElemSizeParam">, 1396e5dd7070Spatrick ParamIdxArgument<"NumElemsParam", /*opt*/ 1>]; 1397e5dd7070Spatrick let TemplateDependent = 1; 1398e5dd7070Spatrick let Documentation = [AllocSizeDocs]; 1399e5dd7070Spatrick} 1400e5dd7070Spatrick 1401e5dd7070Spatrickdef EnableIf : InheritableAttr { 1402e5dd7070Spatrick // Does not have a [[]] spelling because this attribute requires the ability 1403e5dd7070Spatrick // to parse function arguments but the attribute is not written in the type 1404e5dd7070Spatrick // position. 1405e5dd7070Spatrick let Spellings = [GNU<"enable_if">]; 1406e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1407e5dd7070Spatrick let Args = [ExprArgument<"Cond">, StringArgument<"Message">]; 1408e5dd7070Spatrick let TemplateDependent = 1; 1409e5dd7070Spatrick let Documentation = [EnableIfDocs]; 1410e5dd7070Spatrick} 1411e5dd7070Spatrick 1412e5dd7070Spatrickdef ExtVectorType : Attr { 1413e5dd7070Spatrick // This is an OpenCL-related attribute and does not receive a [[]] spelling. 1414e5dd7070Spatrick let Spellings = [GNU<"ext_vector_type">]; 1415e5dd7070Spatrick // FIXME: This subject list is wrong; this is a type attribute. 1416e5dd7070Spatrick let Subjects = SubjectList<[TypedefName], ErrorDiag>; 1417e5dd7070Spatrick let Args = [ExprArgument<"NumElements">]; 1418e5dd7070Spatrick let ASTNode = 0; 1419e5dd7070Spatrick let Documentation = [Undocumented]; 1420e5dd7070Spatrick // This is a type attribute with an incorrect subject list, so should not be 1421e5dd7070Spatrick // permitted by #pragma clang attribute. 1422e5dd7070Spatrick let PragmaAttributeSupport = 0; 1423e5dd7070Spatrick} 1424e5dd7070Spatrick 1425e5dd7070Spatrickdef FallThrough : StmtAttr { 1426a9ac8606Spatrick let Spellings = [CXX11<"", "fallthrough", 201603>, 1427*12c85518Srobert C2x<"", "fallthrough", 201910>, 1428e5dd7070Spatrick CXX11<"clang", "fallthrough">, GCC<"fallthrough">]; 1429a9ac8606Spatrick // The attribute only applies to a NullStmt, but we have special fix-it 1430a9ac8606Spatrick // behavior if applied to a case label. 1431a9ac8606Spatrick let Subjects = SubjectList<[NullStmt, SwitchCase], ErrorDiag, 1432a9ac8606Spatrick "empty statements">; 1433e5dd7070Spatrick let Documentation = [FallthroughDocs]; 1434e5dd7070Spatrick} 1435e5dd7070Spatrick 1436a9ac8606Spatrickdef Likely : StmtAttr { 1437a9ac8606Spatrick let Spellings = [CXX11<"", "likely", 201803>, C2x<"clang", "likely">]; 1438a9ac8606Spatrick let Documentation = [LikelihoodDocs]; 1439a9ac8606Spatrick} 1440a9ac8606Spatrick 1441a9ac8606Spatrickdef Unlikely : StmtAttr { 1442a9ac8606Spatrick let Spellings = [CXX11<"", "unlikely", 201803>, C2x<"clang", "unlikely">]; 1443a9ac8606Spatrick let Documentation = [LikelihoodDocs]; 1444a9ac8606Spatrick} 1445a9ac8606Spatrickdef : MutualExclusions<[Likely, Unlikely]>; 1446a9ac8606Spatrick 1447a9ac8606Spatrickdef NoMerge : DeclOrStmtAttr { 1448ec727ea7Spatrick let Spellings = [Clang<"nomerge">]; 1449ec727ea7Spatrick let Documentation = [NoMergeDocs]; 1450a9ac8606Spatrick let Subjects = SubjectList<[Function, Stmt], ErrorDiag, 1451a9ac8606Spatrick "functions and statements">; 1452a9ac8606Spatrick let SimpleHandler = 1; 1453a9ac8606Spatrick} 1454a9ac8606Spatrick 1455a9ac8606Spatrickdef MustTail : StmtAttr { 1456a9ac8606Spatrick let Spellings = [Clang<"musttail">]; 1457a9ac8606Spatrick let Documentation = [MustTailDocs]; 1458a9ac8606Spatrick let Subjects = SubjectList<[ReturnStmt], ErrorDiag, "return statements">; 1459ec727ea7Spatrick} 1460ec727ea7Spatrick 1461e5dd7070Spatrickdef FastCall : DeclOrTypeAttr { 1462e5dd7070Spatrick let Spellings = [GCC<"fastcall">, Keyword<"__fastcall">, 1463e5dd7070Spatrick Keyword<"_fastcall">]; 1464e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 1465e5dd7070Spatrick let Documentation = [FastCallDocs]; 1466e5dd7070Spatrick} 1467e5dd7070Spatrick 1468e5dd7070Spatrickdef RegCall : DeclOrTypeAttr { 1469e5dd7070Spatrick let Spellings = [GCC<"regcall">, Keyword<"__regcall">]; 1470e5dd7070Spatrick let Documentation = [RegCallDocs]; 1471e5dd7070Spatrick} 1472e5dd7070Spatrick 1473e5dd7070Spatrickdef Final : InheritableAttr { 1474e5dd7070Spatrick let Spellings = [Keyword<"final">, Keyword<"sealed">]; 1475e5dd7070Spatrick let Accessors = [Accessor<"isSpelledAsSealed", [Keyword<"sealed">]>]; 1476e5dd7070Spatrick let SemaHandler = 0; 1477*12c85518Srobert // Omitted from docs, since this is language syntax, not an attribute, as far 1478*12c85518Srobert // as users are concerned. 1479*12c85518Srobert let Documentation = [InternalOnly]; 1480e5dd7070Spatrick} 1481e5dd7070Spatrick 1482e5dd7070Spatrickdef MinSize : InheritableAttr { 1483e5dd7070Spatrick let Spellings = [Clang<"minsize">]; 1484e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>; 1485*12c85518Srobert let Documentation = [MinSizeDocs]; 1486e5dd7070Spatrick} 1487e5dd7070Spatrick 1488e5dd7070Spatrickdef FlagEnum : InheritableAttr { 1489e5dd7070Spatrick let Spellings = [Clang<"flag_enum">]; 1490e5dd7070Spatrick let Subjects = SubjectList<[Enum]>; 1491e5dd7070Spatrick let Documentation = [FlagEnumDocs]; 1492ec727ea7Spatrick let SimpleHandler = 1; 1493e5dd7070Spatrick} 1494e5dd7070Spatrick 1495e5dd7070Spatrickdef EnumExtensibility : InheritableAttr { 1496e5dd7070Spatrick let Spellings = [Clang<"enum_extensibility">]; 1497e5dd7070Spatrick let Subjects = SubjectList<[Enum]>; 1498e5dd7070Spatrick let Args = [EnumArgument<"Extensibility", "Kind", 1499e5dd7070Spatrick ["closed", "open"], ["Closed", "Open"]>]; 1500e5dd7070Spatrick let Documentation = [EnumExtensibilityDocs]; 1501e5dd7070Spatrick} 1502e5dd7070Spatrick 1503e5dd7070Spatrickdef Flatten : InheritableAttr { 1504e5dd7070Spatrick let Spellings = [GCC<"flatten">]; 1505e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1506e5dd7070Spatrick let Documentation = [FlattenDocs]; 1507ec727ea7Spatrick let SimpleHandler = 1; 1508e5dd7070Spatrick} 1509e5dd7070Spatrick 1510e5dd7070Spatrickdef Format : InheritableAttr { 1511e5dd7070Spatrick let Spellings = [GCC<"format">]; 1512e5dd7070Spatrick let Args = [IdentifierArgument<"Type">, IntArgument<"FormatIdx">, 1513e5dd7070Spatrick IntArgument<"FirstArg">]; 1514e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod, Block, HasFunctionProto]>; 1515e5dd7070Spatrick let Documentation = [FormatDocs]; 1516e5dd7070Spatrick} 1517e5dd7070Spatrick 1518e5dd7070Spatrickdef FormatArg : InheritableAttr { 1519e5dd7070Spatrick let Spellings = [GCC<"format_arg">]; 1520e5dd7070Spatrick let Args = [ParamIdxArgument<"FormatIdx">]; 1521e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod, HasFunctionProto]>; 1522e5dd7070Spatrick let Documentation = [Undocumented]; 1523e5dd7070Spatrick} 1524e5dd7070Spatrick 1525e5dd7070Spatrickdef Callback : InheritableAttr { 1526e5dd7070Spatrick let Spellings = [Clang<"callback">]; 1527e5dd7070Spatrick let Args = [VariadicParamOrParamIdxArgument<"Encoding">]; 1528e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1529e5dd7070Spatrick let Documentation = [CallbackDocs]; 1530e5dd7070Spatrick} 1531e5dd7070Spatrick 1532e5dd7070Spatrickdef GNUInline : InheritableAttr { 1533e5dd7070Spatrick let Spellings = [GCC<"gnu_inline">]; 1534e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1535e5dd7070Spatrick let Documentation = [GnuInlineDocs]; 1536e5dd7070Spatrick} 1537e5dd7070Spatrick 1538e5dd7070Spatrickdef Hot : InheritableAttr { 1539e5dd7070Spatrick let Spellings = [GCC<"hot">]; 1540e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1541*12c85518Srobert let Documentation = [HotFunctionEntryDocs]; 1542a9ac8606Spatrick let SimpleHandler = 1; 1543e5dd7070Spatrick} 1544a9ac8606Spatrickdef : MutualExclusions<[Hot, Cold]>; 1545e5dd7070Spatrick 1546e5dd7070Spatrickdef IBAction : InheritableAttr { 1547e5dd7070Spatrick let Spellings = [Clang<"ibaction">]; 1548e5dd7070Spatrick let Subjects = SubjectList<[ObjCInstanceMethod]>; 1549e5dd7070Spatrick // An AST node is created for this attribute, but is not used by other parts 1550e5dd7070Spatrick // of the compiler. However, this node needs to exist in the AST because 1551e5dd7070Spatrick // external tools rely on it. 1552e5dd7070Spatrick let Documentation = [Undocumented]; 1553ec727ea7Spatrick let SimpleHandler = 1; 1554e5dd7070Spatrick} 1555e5dd7070Spatrick 1556e5dd7070Spatrickdef IBOutlet : InheritableAttr { 1557e5dd7070Spatrick let Spellings = [Clang<"iboutlet">]; 1558e5dd7070Spatrick// let Subjects = [ObjCIvar, ObjCProperty]; 1559e5dd7070Spatrick let Documentation = [Undocumented]; 1560e5dd7070Spatrick} 1561e5dd7070Spatrick 1562e5dd7070Spatrickdef IBOutletCollection : InheritableAttr { 1563e5dd7070Spatrick let Spellings = [Clang<"iboutletcollection">]; 1564e5dd7070Spatrick let Args = [TypeArgument<"Interface", 1>]; 1565e5dd7070Spatrick// let Subjects = [ObjCIvar, ObjCProperty]; 1566e5dd7070Spatrick let Documentation = [Undocumented]; 1567e5dd7070Spatrick} 1568e5dd7070Spatrick 1569e5dd7070Spatrickdef IFunc : Attr, TargetSpecificAttr<TargetELF> { 1570e5dd7070Spatrick let Spellings = [GCC<"ifunc">]; 1571e5dd7070Spatrick let Args = [StringArgument<"Resolver">]; 1572e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1573e5dd7070Spatrick let Documentation = [IFuncDocs]; 1574e5dd7070Spatrick} 1575e5dd7070Spatrick 1576e5dd7070Spatrickdef Restrict : InheritableAttr { 1577e5dd7070Spatrick let Spellings = [Declspec<"restrict">, GCC<"malloc">]; 1578e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1579a9ac8606Spatrick let Documentation = [RestrictDocs]; 1580e5dd7070Spatrick} 1581e5dd7070Spatrick 1582e5dd7070Spatrickdef LayoutVersion : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> { 1583e5dd7070Spatrick let Spellings = [Declspec<"layout_version">]; 1584e5dd7070Spatrick let Args = [UnsignedArgument<"Version">]; 1585e5dd7070Spatrick let Subjects = SubjectList<[CXXRecord]>; 1586e5dd7070Spatrick let Documentation = [LayoutVersionDocs]; 1587e5dd7070Spatrick} 1588e5dd7070Spatrick 1589a9ac8606Spatrickdef Leaf : InheritableAttr { 1590a9ac8606Spatrick let Spellings = [GCC<"leaf">]; 1591a9ac8606Spatrick let Subjects = SubjectList<[Function]>; 1592a9ac8606Spatrick let Documentation = [LeafDocs]; 1593a9ac8606Spatrick let SimpleHandler = 1; 1594a9ac8606Spatrick} 1595a9ac8606Spatrick 1596e5dd7070Spatrickdef LifetimeBound : DeclOrTypeAttr { 1597e5dd7070Spatrick let Spellings = [Clang<"lifetimebound", 0>]; 1598e5dd7070Spatrick let Subjects = SubjectList<[ParmVar, ImplicitObjectParameter], ErrorDiag>; 1599e5dd7070Spatrick let Documentation = [LifetimeBoundDocs]; 1600e5dd7070Spatrick let LangOpts = [CPlusPlus]; 1601ec727ea7Spatrick let SimpleHandler = 1; 1602e5dd7070Spatrick} 1603e5dd7070Spatrick 1604e5dd7070Spatrickdef TrivialABI : InheritableAttr { 1605e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it requires the 1606e5dd7070Spatrick // CPlusPlus language option. 1607e5dd7070Spatrick let Spellings = [Clang<"trivial_abi", 0>]; 1608e5dd7070Spatrick let Subjects = SubjectList<[CXXRecord]>; 1609e5dd7070Spatrick let Documentation = [TrivialABIDocs]; 1610e5dd7070Spatrick let LangOpts = [CPlusPlus]; 1611ec727ea7Spatrick let SimpleHandler = 1; 1612e5dd7070Spatrick} 1613e5dd7070Spatrick 1614e5dd7070Spatrickdef MaxFieldAlignment : InheritableAttr { 1615e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 1616e5dd7070Spatrick let Spellings = []; 1617e5dd7070Spatrick let Args = [UnsignedArgument<"Alignment">]; 1618e5dd7070Spatrick let SemaHandler = 0; 1619*12c85518Srobert let Documentation = [InternalOnly]; 1620e5dd7070Spatrick} 1621e5dd7070Spatrick 1622e5dd7070Spatrickdef MayAlias : InheritableAttr { 1623e5dd7070Spatrick // FIXME: this is a type attribute in GCC, but a declaration attribute here. 1624e5dd7070Spatrick let Spellings = [GCC<"may_alias">]; 1625e5dd7070Spatrick let Documentation = [Undocumented]; 1626ec727ea7Spatrick let SimpleHandler = 1; 1627e5dd7070Spatrick} 1628e5dd7070Spatrick 1629e5dd7070Spatrickdef MIGServerRoutine : InheritableAttr { 1630e5dd7070Spatrick let Spellings = [Clang<"mig_server_routine">]; 1631e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod, Block]>; 1632e5dd7070Spatrick let Documentation = [MIGConventionDocs]; 1633e5dd7070Spatrick} 1634e5dd7070Spatrick 1635e5dd7070Spatrickdef MSABI : DeclOrTypeAttr { 1636e5dd7070Spatrick let Spellings = [GCC<"ms_abi">]; 1637e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 1638e5dd7070Spatrick let Documentation = [MSABIDocs]; 1639e5dd7070Spatrick} 1640e5dd7070Spatrick 1641e5dd7070Spatrickdef MSP430Interrupt : InheritableAttr, TargetSpecificAttr<TargetMSP430> { 1642a9ac8606Spatrick // NOTE: If you add any additional spellings, ARMInterrupt's, M68kInterrupt's, 1643a9ac8606Spatrick // MipsInterrupt's and AnyX86Interrupt's spellings must match. 1644e5dd7070Spatrick let Spellings = [GCC<"interrupt">]; 1645e5dd7070Spatrick let Args = [UnsignedArgument<"Number">]; 1646e5dd7070Spatrick let ParseKind = "Interrupt"; 1647e5dd7070Spatrick let HasCustomParsing = 1; 1648e5dd7070Spatrick let Documentation = [Undocumented]; 1649e5dd7070Spatrick} 1650e5dd7070Spatrick 1651e5dd7070Spatrickdef Mips16 : InheritableAttr, TargetSpecificAttr<TargetMips32> { 1652e5dd7070Spatrick let Spellings = [GCC<"mips16">]; 1653e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1654e5dd7070Spatrick let Documentation = [Undocumented]; 1655a9ac8606Spatrick let SimpleHandler = 1; 1656e5dd7070Spatrick} 1657e5dd7070Spatrick 1658e5dd7070Spatrickdef MipsInterrupt : InheritableAttr, TargetSpecificAttr<TargetMips32> { 1659e5dd7070Spatrick // NOTE: If you add any additional spellings, ARMInterrupt's, 1660a9ac8606Spatrick // M68kInterrupt's, MSP430Interrupt's and AnyX86Interrupt's spellings 1661a9ac8606Spatrick // must match. 1662e5dd7070Spatrick let Spellings = [GCC<"interrupt">]; 1663e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1664e5dd7070Spatrick let Args = [EnumArgument<"Interrupt", "InterruptType", 1665e5dd7070Spatrick ["vector=sw0", "vector=sw1", "vector=hw0", 1666e5dd7070Spatrick "vector=hw1", "vector=hw2", "vector=hw3", 1667e5dd7070Spatrick "vector=hw4", "vector=hw5", "eic", ""], 1668e5dd7070Spatrick ["sw0", "sw1", "hw0", "hw1", "hw2", "hw3", 1669e5dd7070Spatrick "hw4", "hw5", "eic", "eic"] 1670e5dd7070Spatrick >]; 1671e5dd7070Spatrick let ParseKind = "Interrupt"; 1672e5dd7070Spatrick let Documentation = [MipsInterruptDocs]; 1673e5dd7070Spatrick} 1674a9ac8606Spatrickdef : MutualExclusions<[Mips16, MipsInterrupt]>; 1675e5dd7070Spatrick 1676e5dd7070Spatrickdef MicroMips : InheritableAttr, TargetSpecificAttr<TargetMips32> { 1677e5dd7070Spatrick let Spellings = [GCC<"micromips">]; 1678e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1679e5dd7070Spatrick let Documentation = [MicroMipsDocs]; 1680a9ac8606Spatrick let SimpleHandler = 1; 1681e5dd7070Spatrick} 1682a9ac8606Spatrickdef : MutualExclusions<[Mips16, MicroMips]>; 1683e5dd7070Spatrick 1684e5dd7070Spatrickdef MipsLongCall : InheritableAttr, TargetSpecificAttr<TargetAnyMips> { 1685e5dd7070Spatrick let Spellings = [GCC<"long_call">, GCC<"far">]; 1686e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1687e5dd7070Spatrick let Documentation = [MipsLongCallStyleDocs]; 1688a9ac8606Spatrick let SimpleHandler = 1; 1689e5dd7070Spatrick} 1690e5dd7070Spatrick 1691e5dd7070Spatrickdef MipsShortCall : InheritableAttr, TargetSpecificAttr<TargetAnyMips> { 1692e5dd7070Spatrick let Spellings = [GCC<"short_call">, GCC<"near">]; 1693e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1694e5dd7070Spatrick let Documentation = [MipsShortCallStyleDocs]; 1695a9ac8606Spatrick let SimpleHandler = 1; 1696a9ac8606Spatrick} 1697a9ac8606Spatrickdef : MutualExclusions<[MipsLongCall, MipsShortCall]>; 1698a9ac8606Spatrick 1699a9ac8606Spatrickdef M68kInterrupt : InheritableAttr, TargetSpecificAttr<TargetM68k> { 1700a9ac8606Spatrick // NOTE: If you add any additional spellings, ARMInterrupt's, MipsInterrupt's 1701a9ac8606Spatrick // MSP430Interrupt's and AnyX86Interrupt's spellings must match. 1702a9ac8606Spatrick let Spellings = [GNU<"interrupt">]; 1703a9ac8606Spatrick let Args = [UnsignedArgument<"Number">]; 1704a9ac8606Spatrick let ParseKind = "Interrupt"; 1705a9ac8606Spatrick let HasCustomParsing = 1; 1706a9ac8606Spatrick let Documentation = [Undocumented]; 1707e5dd7070Spatrick} 1708e5dd7070Spatrick 1709e5dd7070Spatrickdef Mode : Attr { 1710e5dd7070Spatrick let Spellings = [GCC<"mode">]; 1711e5dd7070Spatrick let Subjects = SubjectList<[Var, Enum, TypedefName, Field], ErrorDiag>; 1712e5dd7070Spatrick let Args = [IdentifierArgument<"Mode">]; 1713e5dd7070Spatrick let Documentation = [Undocumented]; 1714e5dd7070Spatrick // This is notionally a type attribute, which #pragma clang attribute 1715e5dd7070Spatrick // generally does not support. 1716e5dd7070Spatrick let PragmaAttributeSupport = 0; 1717e5dd7070Spatrick} 1718e5dd7070Spatrick 1719e5dd7070Spatrickdef Naked : InheritableAttr { 1720e5dd7070Spatrick let Spellings = [GCC<"naked">, Declspec<"naked">]; 1721e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1722e5dd7070Spatrick let Documentation = [Undocumented]; 1723e5dd7070Spatrick} 1724e5dd7070Spatrick 1725e5dd7070Spatrickdef NeonPolyVectorType : TypeAttr { 1726e5dd7070Spatrick let Spellings = [Clang<"neon_polyvector_type">]; 1727e5dd7070Spatrick let Args = [IntArgument<"NumElements">]; 1728e5dd7070Spatrick let Documentation = [Undocumented]; 1729e5dd7070Spatrick // Represented as VectorType instead. 1730e5dd7070Spatrick let ASTNode = 0; 1731e5dd7070Spatrick} 1732e5dd7070Spatrick 1733e5dd7070Spatrickdef NeonVectorType : TypeAttr { 1734e5dd7070Spatrick let Spellings = [Clang<"neon_vector_type">]; 1735e5dd7070Spatrick let Args = [IntArgument<"NumElements">]; 1736e5dd7070Spatrick let Documentation = [Undocumented]; 1737e5dd7070Spatrick // Represented as VectorType instead. 1738e5dd7070Spatrick let ASTNode = 0; 1739e5dd7070Spatrick} 1740e5dd7070Spatrick 1741a9ac8606Spatrickdef ArmSveVectorBits : TypeAttr { 1742a9ac8606Spatrick let Spellings = [GNU<"arm_sve_vector_bits">]; 1743a9ac8606Spatrick let Subjects = SubjectList<[TypedefName], ErrorDiag>; 1744a9ac8606Spatrick let Args = [UnsignedArgument<"NumBits">]; 1745a9ac8606Spatrick let Documentation = [ArmSveVectorBitsDocs]; 1746a9ac8606Spatrick let PragmaAttributeSupport = 0; 1747a9ac8606Spatrick // Represented as VectorType instead. 1748a9ac8606Spatrick let ASTNode = 0; 1749a9ac8606Spatrick} 1750a9ac8606Spatrick 1751ec727ea7Spatrickdef ArmMveStrictPolymorphism : TypeAttr, TargetSpecificAttr<TargetARM> { 1752ec727ea7Spatrick let Spellings = [Clang<"__clang_arm_mve_strict_polymorphism">]; 1753ec727ea7Spatrick let Documentation = [ArmMveStrictPolymorphismDocs]; 1754ec727ea7Spatrick} 1755ec727ea7Spatrick 1756e5dd7070Spatrickdef NoUniqueAddress : InheritableAttr, TargetSpecificAttr<TargetItaniumCXXABI> { 1757e5dd7070Spatrick let Spellings = [CXX11<"", "no_unique_address", 201803>]; 1758e5dd7070Spatrick let Subjects = SubjectList<[NonBitField], ErrorDiag>; 1759e5dd7070Spatrick let Documentation = [NoUniqueAddressDocs]; 1760ec727ea7Spatrick let SimpleHandler = 1; 1761e5dd7070Spatrick} 1762e5dd7070Spatrick 1763e5dd7070Spatrickdef ReturnsTwice : InheritableAttr { 1764e5dd7070Spatrick let Spellings = [GCC<"returns_twice">]; 1765e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1766e5dd7070Spatrick let Documentation = [Undocumented]; 1767ec727ea7Spatrick let SimpleHandler = 1; 1768e5dd7070Spatrick} 1769e5dd7070Spatrick 1770e5dd7070Spatrickdef DisableTailCalls : InheritableAttr { 1771e5dd7070Spatrick let Spellings = [Clang<"disable_tail_calls">]; 1772e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod]>; 1773e5dd7070Spatrick let Documentation = [DisableTailCallsDocs]; 1774a9ac8606Spatrick let SimpleHandler = 1; 1775e5dd7070Spatrick} 1776a9ac8606Spatrickdef : MutualExclusions<[Naked, DisableTailCalls]>; 1777e5dd7070Spatrick 1778e5dd7070Spatrickdef NoAlias : InheritableAttr { 1779e5dd7070Spatrick let Spellings = [Declspec<"noalias">]; 1780e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1781e5dd7070Spatrick let Documentation = [NoAliasDocs]; 1782ec727ea7Spatrick let SimpleHandler = 1; 1783e5dd7070Spatrick} 1784e5dd7070Spatrick 1785e5dd7070Spatrickdef NoCommon : InheritableAttr { 1786e5dd7070Spatrick let Spellings = [GCC<"nocommon">]; 1787e5dd7070Spatrick let Subjects = SubjectList<[Var]>; 1788e5dd7070Spatrick let Documentation = [Undocumented]; 1789ec727ea7Spatrick let SimpleHandler = 1; 1790e5dd7070Spatrick} 1791e5dd7070Spatrick 1792e5dd7070Spatrickdef NoDebug : InheritableAttr { 1793e5dd7070Spatrick let Spellings = [GCC<"nodebug">]; 1794e5dd7070Spatrick let Subjects = SubjectList<[TypedefName, FunctionLike, ObjCMethod, NonParmVar]>; 1795e5dd7070Spatrick let Documentation = [NoDebugDocs]; 1796e5dd7070Spatrick} 1797e5dd7070Spatrick 1798a9ac8606Spatrickdef StandaloneDebug : InheritableAttr { 1799a9ac8606Spatrick let Spellings = [Clang<"standalone_debug", /*allowInC =*/0>]; 1800a9ac8606Spatrick let Subjects = SubjectList<[CXXRecord]>; 1801a9ac8606Spatrick let Documentation = [StandaloneDebugDocs]; 1802a9ac8606Spatrick let SimpleHandler = 1; 1803a9ac8606Spatrick let LangOpts = [CPlusPlus]; 1804a9ac8606Spatrick} 1805a9ac8606Spatrick 1806e5dd7070Spatrickdef NoDuplicate : InheritableAttr { 1807e5dd7070Spatrick let Spellings = [Clang<"noduplicate">]; 1808e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1809e5dd7070Spatrick let Documentation = [NoDuplicateDocs]; 1810ec727ea7Spatrick let SimpleHandler = 1; 1811e5dd7070Spatrick} 1812e5dd7070Spatrick 1813e5dd7070Spatrickdef Convergent : InheritableAttr { 1814e5dd7070Spatrick let Spellings = [Clang<"convergent">]; 1815e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1816e5dd7070Spatrick let Documentation = [ConvergentDocs]; 1817ec727ea7Spatrick let SimpleHandler = 1; 1818e5dd7070Spatrick} 1819e5dd7070Spatrick 1820*12c85518Srobertdef NoInline : DeclOrStmtAttr { 1821*12c85518Srobert let Spellings = [Keyword<"__noinline__">, GCC<"noinline">, 1822*12c85518Srobert CXX11<"clang", "noinline">, C2x<"clang", "noinline">, 1823*12c85518Srobert Declspec<"noinline">]; 1824*12c85518Srobert let Accessors = [Accessor<"isClangNoInline", [CXX11<"clang", "noinline">, 1825*12c85518Srobert C2x<"clang", "noinline">]>]; 1826*12c85518Srobert let Documentation = [NoInlineDocs]; 1827*12c85518Srobert let Subjects = SubjectList<[Function, Stmt], WarnDiag, 1828*12c85518Srobert "functions and statements">; 1829ec727ea7Spatrick let SimpleHandler = 1; 1830e5dd7070Spatrick} 1831e5dd7070Spatrick 1832e5dd7070Spatrickdef NoMips16 : InheritableAttr, TargetSpecificAttr<TargetMips32> { 1833e5dd7070Spatrick let Spellings = [GCC<"nomips16">]; 1834e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1835e5dd7070Spatrick let Documentation = [Undocumented]; 1836ec727ea7Spatrick let SimpleHandler = 1; 1837e5dd7070Spatrick} 1838e5dd7070Spatrick 1839e5dd7070Spatrickdef NoMicroMips : InheritableAttr, TargetSpecificAttr<TargetMips32> { 1840e5dd7070Spatrick let Spellings = [GCC<"nomicromips">]; 1841e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1842e5dd7070Spatrick let Documentation = [MicroMipsDocs]; 1843ec727ea7Spatrick let SimpleHandler = 1; 1844e5dd7070Spatrick} 1845e5dd7070Spatrick 1846e5dd7070Spatrickdef RISCVInterrupt : InheritableAttr, TargetSpecificAttr<TargetRISCV> { 1847e5dd7070Spatrick let Spellings = [GCC<"interrupt">]; 1848e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 1849e5dd7070Spatrick let Args = [EnumArgument<"Interrupt", "InterruptType", 1850e5dd7070Spatrick ["user", "supervisor", "machine"], 1851e5dd7070Spatrick ["user", "supervisor", "machine"], 1852e5dd7070Spatrick 1>]; 1853e5dd7070Spatrick let ParseKind = "Interrupt"; 1854e5dd7070Spatrick let Documentation = [RISCVInterruptDocs]; 1855e5dd7070Spatrick} 1856e5dd7070Spatrick 1857e5dd7070Spatrick// This is not a TargetSpecificAttr so that is silently accepted and 1858e5dd7070Spatrick// ignored on other targets as encouraged by the OpenCL spec. 1859e5dd7070Spatrick// 1860e5dd7070Spatrick// See OpenCL 1.2 6.11.5: "It is our intention that a particular 1861e5dd7070Spatrick// implementation of OpenCL be free to ignore all attributes and the 1862e5dd7070Spatrick// resulting executable binary will produce the same result." 1863e5dd7070Spatrick// 1864e5dd7070Spatrick// However, only AMD GPU targets will emit the corresponding IR 1865e5dd7070Spatrick// attribute. 1866e5dd7070Spatrick// 1867e5dd7070Spatrick// FIXME: This provides a sub-optimal error message if you attempt to 1868e5dd7070Spatrick// use this in CUDA, since CUDA does not use the same terminology. 1869e5dd7070Spatrick// 1870e5dd7070Spatrick// FIXME: SubjectList should be for OpenCLKernelFunction, but is not to 1871e5dd7070Spatrick// workaround needing to see kernel attribute before others to know if 1872e5dd7070Spatrick// this should be rejected on non-kernels. 1873e5dd7070Spatrick 1874e5dd7070Spatrickdef AMDGPUFlatWorkGroupSize : InheritableAttr { 1875e5dd7070Spatrick let Spellings = [Clang<"amdgpu_flat_work_group_size", 0>]; 1876e5dd7070Spatrick let Args = [ExprArgument<"Min">, ExprArgument<"Max">]; 1877e5dd7070Spatrick let Documentation = [AMDGPUFlatWorkGroupSizeDocs]; 1878e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">; 1879e5dd7070Spatrick} 1880e5dd7070Spatrick 1881e5dd7070Spatrickdef AMDGPUWavesPerEU : InheritableAttr { 1882e5dd7070Spatrick let Spellings = [Clang<"amdgpu_waves_per_eu", 0>]; 1883e5dd7070Spatrick let Args = [ExprArgument<"Min">, ExprArgument<"Max", 1>]; 1884e5dd7070Spatrick let Documentation = [AMDGPUWavesPerEUDocs]; 1885e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">; 1886e5dd7070Spatrick} 1887e5dd7070Spatrick 1888e5dd7070Spatrickdef AMDGPUNumSGPR : InheritableAttr { 1889e5dd7070Spatrick let Spellings = [Clang<"amdgpu_num_sgpr", 0>]; 1890e5dd7070Spatrick let Args = [UnsignedArgument<"NumSGPR">]; 1891e5dd7070Spatrick let Documentation = [AMDGPUNumSGPRNumVGPRDocs]; 1892e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">; 1893e5dd7070Spatrick} 1894e5dd7070Spatrick 1895e5dd7070Spatrickdef AMDGPUNumVGPR : InheritableAttr { 1896e5dd7070Spatrick let Spellings = [Clang<"amdgpu_num_vgpr", 0>]; 1897e5dd7070Spatrick let Args = [UnsignedArgument<"NumVGPR">]; 1898e5dd7070Spatrick let Documentation = [AMDGPUNumSGPRNumVGPRDocs]; 1899e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">; 1900e5dd7070Spatrick} 1901e5dd7070Spatrick 1902*12c85518Srobertdef AMDGPUKernelCall : DeclOrTypeAttr { 1903*12c85518Srobert let Spellings = [Clang<"amdgpu_kernel">]; 1904*12c85518Srobert let Documentation = [Undocumented]; 1905*12c85518Srobert} 1906*12c85518Srobert 1907e5dd7070Spatrickdef BPFPreserveAccessIndex : InheritableAttr, 1908e5dd7070Spatrick TargetSpecificAttr<TargetBPF> { 1909e5dd7070Spatrick let Spellings = [Clang<"preserve_access_index">]; 1910e5dd7070Spatrick let Subjects = SubjectList<[Record], ErrorDiag>; 1911e5dd7070Spatrick let Documentation = [BPFPreserveAccessIndexDocs]; 1912e5dd7070Spatrick let LangOpts = [COnly]; 1913e5dd7070Spatrick} 1914e5dd7070Spatrick 1915*12c85518Srobertdef BTFDeclTag : InheritableAttr { 1916*12c85518Srobert let Spellings = [Clang<"btf_decl_tag">]; 1917*12c85518Srobert let Args = [StringArgument<"BTFDeclTag">]; 1918*12c85518Srobert let Subjects = SubjectList<[Var, Function, Record, Field, TypedefName], 1919*12c85518Srobert ErrorDiag>; 1920*12c85518Srobert let Documentation = [BTFDeclTagDocs]; 1921*12c85518Srobert let LangOpts = [COnly]; 1922*12c85518Srobert} 1923*12c85518Srobert 1924*12c85518Srobertdef BTFTypeTag : TypeAttr { 1925*12c85518Srobert let Spellings = [Clang<"btf_type_tag">]; 1926*12c85518Srobert let Args = [StringArgument<"BTFTypeTag">]; 1927*12c85518Srobert let Documentation = [BTFTypeTagDocs]; 1928*12c85518Srobert let LangOpts = [COnly]; 1929*12c85518Srobert} 1930*12c85518Srobert 1931e5dd7070Spatrickdef WebAssemblyExportName : InheritableAttr, 1932e5dd7070Spatrick TargetSpecificAttr<TargetWebAssembly> { 1933e5dd7070Spatrick let Spellings = [Clang<"export_name">]; 1934e5dd7070Spatrick let Args = [StringArgument<"ExportName">]; 1935e5dd7070Spatrick let Documentation = [WebAssemblyExportNameDocs]; 1936e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1937e5dd7070Spatrick} 1938e5dd7070Spatrick 1939e5dd7070Spatrickdef WebAssemblyImportModule : InheritableAttr, 1940e5dd7070Spatrick TargetSpecificAttr<TargetWebAssembly> { 1941e5dd7070Spatrick let Spellings = [Clang<"import_module">]; 1942e5dd7070Spatrick let Args = [StringArgument<"ImportModule">]; 1943e5dd7070Spatrick let Documentation = [WebAssemblyImportModuleDocs]; 1944e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1945e5dd7070Spatrick} 1946e5dd7070Spatrick 1947e5dd7070Spatrickdef WebAssemblyImportName : InheritableAttr, 1948e5dd7070Spatrick TargetSpecificAttr<TargetWebAssembly> { 1949e5dd7070Spatrick let Spellings = [Clang<"import_name">]; 1950e5dd7070Spatrick let Args = [StringArgument<"ImportName">]; 1951e5dd7070Spatrick let Documentation = [WebAssemblyImportNameDocs]; 1952e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1953e5dd7070Spatrick} 1954e5dd7070Spatrick 1955e5dd7070Spatrickdef NoSplitStack : InheritableAttr { 1956e5dd7070Spatrick let Spellings = [GCC<"no_split_stack">]; 1957e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 1958e5dd7070Spatrick let Documentation = [NoSplitStackDocs]; 1959ec727ea7Spatrick let SimpleHandler = 1; 1960e5dd7070Spatrick} 1961e5dd7070Spatrick 1962e5dd7070Spatrickdef NonNull : InheritableParamAttr { 1963e5dd7070Spatrick let Spellings = [GCC<"nonnull">]; 1964e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod, HasFunctionProto, ParmVar], WarnDiag, 1965e5dd7070Spatrick "functions, methods, and parameters">; 1966e5dd7070Spatrick let Args = [VariadicParamIdxArgument<"Args">]; 1967e5dd7070Spatrick let AdditionalMembers = [{ 1968e5dd7070Spatrick bool isNonNull(unsigned IdxAST) const { 1969e5dd7070Spatrick if (!args_size()) 1970e5dd7070Spatrick return true; 1971*12c85518Srobert return llvm::any_of(args(), [=](const ParamIdx &Idx) { 1972*12c85518Srobert return Idx.getASTIndex() == IdxAST; 1973*12c85518Srobert }); 1974e5dd7070Spatrick } 1975e5dd7070Spatrick }]; 1976e5dd7070Spatrick // FIXME: We should merge duplicates into a single nonnull attribute. 1977e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 1978e5dd7070Spatrick let Documentation = [NonNullDocs]; 1979e5dd7070Spatrick} 1980e5dd7070Spatrick 1981e5dd7070Spatrickdef ReturnsNonNull : InheritableAttr { 1982e5dd7070Spatrick let Spellings = [GCC<"returns_nonnull">]; 1983e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod, Function]>; 1984e5dd7070Spatrick let Documentation = [ReturnsNonNullDocs]; 1985e5dd7070Spatrick} 1986e5dd7070Spatrick 1987a9ac8606Spatrickdef CalledOnce : Attr { 1988a9ac8606Spatrick let Spellings = [Clang<"called_once">]; 1989a9ac8606Spatrick let Subjects = SubjectList<[ParmVar]>; 1990a9ac8606Spatrick let LangOpts = [ObjC]; 1991a9ac8606Spatrick let Documentation = [CalledOnceDocs]; 1992a9ac8606Spatrick} 1993a9ac8606Spatrick 1994e5dd7070Spatrick// pass_object_size(N) indicates that the parameter should have 1995e5dd7070Spatrick// __builtin_object_size with Type=N evaluated on the parameter at the callsite. 1996e5dd7070Spatrickdef PassObjectSize : InheritableParamAttr { 1997e5dd7070Spatrick let Spellings = [Clang<"pass_object_size">, 1998e5dd7070Spatrick Clang<"pass_dynamic_object_size">]; 1999e5dd7070Spatrick let Accessors = [Accessor<"isDynamic", [Clang<"pass_dynamic_object_size">]>]; 2000e5dd7070Spatrick let Args = [IntArgument<"Type">]; 2001e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 2002e5dd7070Spatrick let Documentation = [PassObjectSizeDocs]; 2003e5dd7070Spatrick} 2004e5dd7070Spatrick 2005e5dd7070Spatrick// Nullability type attributes. 2006e5dd7070Spatrickdef TypeNonNull : TypeAttr { 2007e5dd7070Spatrick let Spellings = [Keyword<"_Nonnull">]; 2008e5dd7070Spatrick let Documentation = [TypeNonNullDocs]; 2009e5dd7070Spatrick} 2010e5dd7070Spatrick 2011e5dd7070Spatrickdef TypeNullable : TypeAttr { 2012e5dd7070Spatrick let Spellings = [Keyword<"_Nullable">]; 2013e5dd7070Spatrick let Documentation = [TypeNullableDocs]; 2014e5dd7070Spatrick} 2015e5dd7070Spatrick 2016a9ac8606Spatrickdef TypeNullableResult : TypeAttr { 2017a9ac8606Spatrick let Spellings = [Keyword<"_Nullable_result">]; 2018a9ac8606Spatrick let Documentation = [TypeNullableResultDocs]; 2019a9ac8606Spatrick} 2020a9ac8606Spatrick 2021e5dd7070Spatrickdef TypeNullUnspecified : TypeAttr { 2022e5dd7070Spatrick let Spellings = [Keyword<"_Null_unspecified">]; 2023e5dd7070Spatrick let Documentation = [TypeNullUnspecifiedDocs]; 2024e5dd7070Spatrick} 2025e5dd7070Spatrick 2026e5dd7070Spatrick// This is a marker used to indicate that an __unsafe_unretained qualifier was 2027e5dd7070Spatrick// ignored because ARC is not enabled. The usual representation for this 2028e5dd7070Spatrick// qualifier is as an ObjCOwnership attribute with Kind == "none". 2029e5dd7070Spatrickdef ObjCInertUnsafeUnretained : TypeAttr { 2030e5dd7070Spatrick let Spellings = [Keyword<"__unsafe_unretained">]; 2031*12c85518Srobert let Documentation = [InternalOnly]; 2032e5dd7070Spatrick} 2033e5dd7070Spatrick 2034e5dd7070Spatrickdef ObjCKindOf : TypeAttr { 2035e5dd7070Spatrick let Spellings = [Keyword<"__kindof">]; 2036e5dd7070Spatrick let Documentation = [Undocumented]; 2037e5dd7070Spatrick} 2038e5dd7070Spatrick 2039e5dd7070Spatrickdef NoEscape : Attr { 2040e5dd7070Spatrick let Spellings = [Clang<"noescape">]; 2041e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 2042e5dd7070Spatrick let Documentation = [NoEscapeDocs]; 2043e5dd7070Spatrick} 2044e5dd7070Spatrick 2045*12c85518Srobertdef MaybeUndef : InheritableAttr { 2046*12c85518Srobert let Spellings = [Clang<"maybe_undef">]; 2047*12c85518Srobert let Subjects = SubjectList<[ParmVar]>; 2048*12c85518Srobert let Documentation = [MaybeUndefDocs]; 2049*12c85518Srobert let SimpleHandler = 1; 2050*12c85518Srobert} 2051*12c85518Srobert 2052e5dd7070Spatrickdef AssumeAligned : InheritableAttr { 2053e5dd7070Spatrick let Spellings = [GCC<"assume_aligned">]; 2054e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod, Function]>; 2055e5dd7070Spatrick let Args = [ExprArgument<"Alignment">, ExprArgument<"Offset", 1>]; 2056e5dd7070Spatrick let Documentation = [AssumeAlignedDocs]; 2057e5dd7070Spatrick} 2058e5dd7070Spatrick 2059e5dd7070Spatrickdef AllocAlign : InheritableAttr { 2060e5dd7070Spatrick let Spellings = [GCC<"alloc_align">]; 2061e5dd7070Spatrick let Subjects = SubjectList<[HasFunctionProto]>; 2062e5dd7070Spatrick let Args = [ParamIdxArgument<"ParamIndex">]; 2063e5dd7070Spatrick let Documentation = [AllocAlignDocs]; 2064e5dd7070Spatrick} 2065e5dd7070Spatrick 2066e5dd7070Spatrickdef NoReturn : InheritableAttr { 2067e5dd7070Spatrick let Spellings = [GCC<"noreturn">, Declspec<"noreturn">]; 2068e5dd7070Spatrick // FIXME: Does GCC allow this on the function instead? 2069e5dd7070Spatrick let Documentation = [Undocumented]; 2070e5dd7070Spatrick} 2071e5dd7070Spatrick 2072e5dd7070Spatrickdef NoInstrumentFunction : InheritableAttr { 2073e5dd7070Spatrick let Spellings = [GCC<"no_instrument_function">]; 2074*12c85518Srobert let Subjects = SubjectList<[Function, ObjCMethod]>; 2075e5dd7070Spatrick let Documentation = [Undocumented]; 2076ec727ea7Spatrick let SimpleHandler = 1; 2077e5dd7070Spatrick} 2078e5dd7070Spatrick 2079a9ac8606Spatrickdef NoProfileFunction : InheritableAttr { 2080a9ac8606Spatrick let Spellings = [GCC<"no_profile_instrument_function">]; 2081a9ac8606Spatrick let Subjects = SubjectList<[Function]>; 2082a9ac8606Spatrick let Documentation = [NoProfileInstrumentFunctionDocs]; 2083a9ac8606Spatrick let SimpleHandler = 1; 2084a9ac8606Spatrick} 2085a9ac8606Spatrick 2086e5dd7070Spatrickdef NotTailCalled : InheritableAttr { 2087e5dd7070Spatrick let Spellings = [Clang<"not_tail_called">]; 2088e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 2089e5dd7070Spatrick let Documentation = [NotTailCalledDocs]; 2090a9ac8606Spatrick let SimpleHandler = 1; 2091e5dd7070Spatrick} 2092a9ac8606Spatrickdef : MutualExclusions<[AlwaysInline, NotTailCalled]>; 2093e5dd7070Spatrick 2094e5dd7070Spatrickdef NoStackProtector : InheritableAttr { 2095*12c85518Srobert let Spellings = [Clang<"no_stack_protector">, Declspec<"safebuffers">]; 2096e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 2097e5dd7070Spatrick let Documentation = [NoStackProtectorDocs]; 2098ec727ea7Spatrick let SimpleHandler = 1; 2099e5dd7070Spatrick} 2100e5dd7070Spatrick 2101*12c85518Srobertdef StrictGuardStackCheck : InheritableAttr { 2102*12c85518Srobert let Spellings = [Declspec<"strict_gs_check">]; 2103*12c85518Srobert let Subjects = SubjectList<[Function]>; 2104*12c85518Srobert let Documentation = [StrictGuardStackCheckDocs]; 2105*12c85518Srobert let SimpleHandler = 1; 2106*12c85518Srobert} 2107*12c85518Srobert 2108e5dd7070Spatrickdef NoThrow : InheritableAttr { 2109e5dd7070Spatrick let Spellings = [GCC<"nothrow">, Declspec<"nothrow">]; 2110e5dd7070Spatrick let Subjects = SubjectList<[FunctionLike]>; 2111e5dd7070Spatrick let Documentation = [NoThrowDocs]; 2112e5dd7070Spatrick} 2113e5dd7070Spatrick 2114*12c85518Srobertdef NoUwtable : InheritableAttr { 2115*12c85518Srobert let Spellings = [Clang<"nouwtable">]; 2116*12c85518Srobert let Subjects = SubjectList<[FunctionLike]>; 2117*12c85518Srobert let Documentation = [NoUwtableDocs]; 2118*12c85518Srobert let SimpleHandler = 1; 2119*12c85518Srobert} 2120*12c85518Srobert 2121e5dd7070Spatrickdef NvWeak : IgnoredAttr { 2122e5dd7070Spatrick // No Declspec spelling of this attribute; the CUDA headers use 2123e5dd7070Spatrick // __attribute__((nv_weak)) unconditionally. Does not receive an [[]] 2124e5dd7070Spatrick // spelling because it is a CUDA attribute. 2125e5dd7070Spatrick let Spellings = [GNU<"nv_weak">]; 2126e5dd7070Spatrick let LangOpts = [CUDA]; 2127e5dd7070Spatrick} 2128e5dd7070Spatrick 2129e5dd7070Spatrickdef ObjCBridge : InheritableAttr { 2130e5dd7070Spatrick let Spellings = [Clang<"objc_bridge">]; 2131e5dd7070Spatrick let Subjects = SubjectList<[Record, TypedefName], ErrorDiag>; 2132e5dd7070Spatrick let Args = [IdentifierArgument<"BridgedType">]; 2133e5dd7070Spatrick let Documentation = [Undocumented]; 2134e5dd7070Spatrick} 2135e5dd7070Spatrick 2136e5dd7070Spatrickdef ObjCBridgeMutable : InheritableAttr { 2137e5dd7070Spatrick let Spellings = [Clang<"objc_bridge_mutable">]; 2138e5dd7070Spatrick let Subjects = SubjectList<[Record], ErrorDiag>; 2139e5dd7070Spatrick let Args = [IdentifierArgument<"BridgedType">]; 2140e5dd7070Spatrick let Documentation = [Undocumented]; 2141e5dd7070Spatrick} 2142e5dd7070Spatrick 2143e5dd7070Spatrickdef ObjCBridgeRelated : InheritableAttr { 2144e5dd7070Spatrick let Spellings = [Clang<"objc_bridge_related">]; 2145e5dd7070Spatrick let Subjects = SubjectList<[Record], ErrorDiag>; 2146e5dd7070Spatrick let Args = [IdentifierArgument<"RelatedClass">, 2147e5dd7070Spatrick IdentifierArgument<"ClassMethod">, 2148e5dd7070Spatrick IdentifierArgument<"InstanceMethod">]; 2149e5dd7070Spatrick let HasCustomParsing = 1; 2150e5dd7070Spatrick let Documentation = [Undocumented]; 2151e5dd7070Spatrick} 2152e5dd7070Spatrick 2153a9ac8606Spatrickdef NSErrorDomain : InheritableAttr { 2154a9ac8606Spatrick let Spellings = [GNU<"ns_error_domain">]; 2155a9ac8606Spatrick let Subjects = SubjectList<[Enum], ErrorDiag>; 2156a9ac8606Spatrick let Args = [DeclArgument<Var, "ErrorDomain">]; 2157a9ac8606Spatrick let Documentation = [NSErrorDomainDocs]; 2158a9ac8606Spatrick} 2159a9ac8606Spatrick 2160e5dd7070Spatrickdef NSReturnsRetained : DeclOrTypeAttr { 2161e5dd7070Spatrick let Spellings = [Clang<"ns_returns_retained">]; 2162e5dd7070Spatrick// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>; 2163e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 2164e5dd7070Spatrick} 2165e5dd7070Spatrick 2166e5dd7070Spatrickdef NSReturnsNotRetained : InheritableAttr { 2167e5dd7070Spatrick let Spellings = [Clang<"ns_returns_not_retained">]; 2168e5dd7070Spatrick// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>; 2169e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 2170e5dd7070Spatrick} 2171e5dd7070Spatrick 2172e5dd7070Spatrickdef NSReturnsAutoreleased : InheritableAttr { 2173e5dd7070Spatrick let Spellings = [Clang<"ns_returns_autoreleased">]; 2174e5dd7070Spatrick// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>; 2175e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 2176e5dd7070Spatrick} 2177e5dd7070Spatrick 2178e5dd7070Spatrickdef NSConsumesSelf : InheritableAttr { 2179e5dd7070Spatrick let Spellings = [Clang<"ns_consumes_self">]; 2180e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod]>; 2181e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 2182ec727ea7Spatrick let SimpleHandler = 1; 2183e5dd7070Spatrick} 2184e5dd7070Spatrick 2185e5dd7070Spatrickdef NSConsumed : InheritableParamAttr { 2186e5dd7070Spatrick let Spellings = [Clang<"ns_consumed">]; 2187e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 2188e5dd7070Spatrick let Documentation = [RetainBehaviorDocs]; 2189e5dd7070Spatrick} 2190e5dd7070Spatrick 2191e5dd7070Spatrickdef ObjCException : InheritableAttr { 2192e5dd7070Spatrick let Spellings = [Clang<"objc_exception">]; 2193e5dd7070Spatrick let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; 2194e5dd7070Spatrick let Documentation = [Undocumented]; 2195ec727ea7Spatrick let SimpleHandler = 1; 2196e5dd7070Spatrick} 2197e5dd7070Spatrick 2198e5dd7070Spatrickdef ObjCMethodFamily : InheritableAttr { 2199e5dd7070Spatrick let Spellings = [Clang<"objc_method_family">]; 2200e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod], ErrorDiag>; 2201e5dd7070Spatrick let Args = [EnumArgument<"Family", "FamilyKind", 2202e5dd7070Spatrick ["none", "alloc", "copy", "init", "mutableCopy", "new"], 2203e5dd7070Spatrick ["OMF_None", "OMF_alloc", "OMF_copy", "OMF_init", 2204e5dd7070Spatrick "OMF_mutableCopy", "OMF_new"]>]; 2205e5dd7070Spatrick let Documentation = [ObjCMethodFamilyDocs]; 2206e5dd7070Spatrick} 2207e5dd7070Spatrick 2208e5dd7070Spatrickdef ObjCNSObject : InheritableAttr { 2209e5dd7070Spatrick let Spellings = [Clang<"NSObject">]; 2210e5dd7070Spatrick let Documentation = [Undocumented]; 2211e5dd7070Spatrick} 2212e5dd7070Spatrick 2213e5dd7070Spatrickdef ObjCIndependentClass : InheritableAttr { 2214e5dd7070Spatrick let Spellings = [Clang<"objc_independent_class">]; 2215e5dd7070Spatrick let Documentation = [Undocumented]; 2216e5dd7070Spatrick} 2217e5dd7070Spatrick 2218e5dd7070Spatrickdef ObjCPreciseLifetime : InheritableAttr { 2219e5dd7070Spatrick let Spellings = [Clang<"objc_precise_lifetime">]; 2220e5dd7070Spatrick let Subjects = SubjectList<[Var], ErrorDiag>; 2221e5dd7070Spatrick let Documentation = [Undocumented]; 2222e5dd7070Spatrick} 2223e5dd7070Spatrick 2224e5dd7070Spatrickdef ObjCReturnsInnerPointer : InheritableAttr { 2225e5dd7070Spatrick let Spellings = [Clang<"objc_returns_inner_pointer">]; 2226e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod, ObjCProperty], ErrorDiag>; 2227e5dd7070Spatrick let Documentation = [Undocumented]; 2228e5dd7070Spatrick} 2229e5dd7070Spatrick 2230e5dd7070Spatrickdef ObjCRequiresSuper : InheritableAttr { 2231e5dd7070Spatrick let Spellings = [Clang<"objc_requires_super">]; 2232e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod], ErrorDiag>; 2233e5dd7070Spatrick let Documentation = [ObjCRequiresSuperDocs]; 2234e5dd7070Spatrick} 2235e5dd7070Spatrick 2236e5dd7070Spatrickdef ObjCRootClass : InheritableAttr { 2237e5dd7070Spatrick let Spellings = [Clang<"objc_root_class">]; 2238e5dd7070Spatrick let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; 2239e5dd7070Spatrick let Documentation = [Undocumented]; 2240ec727ea7Spatrick let SimpleHandler = 1; 2241e5dd7070Spatrick} 2242e5dd7070Spatrick 2243e5dd7070Spatrickdef ObjCNonLazyClass : Attr { 2244e5dd7070Spatrick let Spellings = [Clang<"objc_nonlazy_class">]; 2245e5dd7070Spatrick let Subjects = SubjectList<[ObjCInterface, ObjCImpl], ErrorDiag>; 2246e5dd7070Spatrick let LangOpts = [ObjC]; 2247e5dd7070Spatrick let Documentation = [ObjCNonLazyClassDocs]; 2248ec727ea7Spatrick let SimpleHandler = 1; 2249e5dd7070Spatrick} 2250e5dd7070Spatrick 2251e5dd7070Spatrickdef ObjCSubclassingRestricted : InheritableAttr { 2252e5dd7070Spatrick let Spellings = [Clang<"objc_subclassing_restricted">]; 2253e5dd7070Spatrick let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; 2254e5dd7070Spatrick let Documentation = [ObjCSubclassingRestrictedDocs]; 2255ec727ea7Spatrick let SimpleHandler = 1; 2256e5dd7070Spatrick} 2257e5dd7070Spatrick 2258e5dd7070Spatrickdef ObjCExplicitProtocolImpl : InheritableAttr { 2259e5dd7070Spatrick let Spellings = [Clang<"objc_protocol_requires_explicit_implementation">]; 2260e5dd7070Spatrick let Subjects = SubjectList<[ObjCProtocol], ErrorDiag>; 2261e5dd7070Spatrick let Documentation = [Undocumented]; 2262e5dd7070Spatrick} 2263e5dd7070Spatrick 2264e5dd7070Spatrickdef ObjCDesignatedInitializer : Attr { 2265e5dd7070Spatrick let Spellings = [Clang<"objc_designated_initializer">]; 2266e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod], ErrorDiag>; 2267e5dd7070Spatrick let Documentation = [Undocumented]; 2268e5dd7070Spatrick} 2269e5dd7070Spatrick 2270e5dd7070Spatrickdef ObjCDirect : Attr { 2271e5dd7070Spatrick let Spellings = [Clang<"objc_direct">]; 2272e5dd7070Spatrick let Subjects = SubjectList<[ObjCMethod], ErrorDiag>; 2273e5dd7070Spatrick let LangOpts = [ObjC]; 2274e5dd7070Spatrick let Documentation = [ObjCDirectDocs]; 2275e5dd7070Spatrick} 2276e5dd7070Spatrick 2277e5dd7070Spatrickdef ObjCDirectMembers : Attr { 2278e5dd7070Spatrick let Spellings = [Clang<"objc_direct_members">]; 2279ec727ea7Spatrick let Subjects = SubjectList<[ObjCImpl, ObjCInterface, ObjCCategory], ErrorDiag>; 2280e5dd7070Spatrick let LangOpts = [ObjC]; 2281e5dd7070Spatrick let Documentation = [ObjCDirectMembersDocs]; 2282e5dd7070Spatrick} 2283e5dd7070Spatrick 2284a9ac8606Spatrickdef ObjCNonRuntimeProtocol : Attr { 2285a9ac8606Spatrick let Spellings = [Clang<"objc_non_runtime_protocol">]; 2286a9ac8606Spatrick let Subjects = SubjectList<[ObjCProtocol], ErrorDiag>; 2287a9ac8606Spatrick let LangOpts = [ObjC]; 2288a9ac8606Spatrick let Documentation = [ObjCNonRuntimeProtocolDocs]; 2289a9ac8606Spatrick let SimpleHandler = 1; 2290a9ac8606Spatrick} 2291a9ac8606Spatrick 2292e5dd7070Spatrickdef ObjCRuntimeName : Attr { 2293e5dd7070Spatrick let Spellings = [Clang<"objc_runtime_name">]; 2294e5dd7070Spatrick let Subjects = SubjectList<[ObjCInterface, ObjCProtocol], ErrorDiag>; 2295e5dd7070Spatrick let Args = [StringArgument<"MetadataName">]; 2296e5dd7070Spatrick let Documentation = [ObjCRuntimeNameDocs]; 2297e5dd7070Spatrick} 2298e5dd7070Spatrick 2299e5dd7070Spatrickdef ObjCRuntimeVisible : Attr { 2300e5dd7070Spatrick let Spellings = [Clang<"objc_runtime_visible">]; 2301e5dd7070Spatrick let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; 2302e5dd7070Spatrick let Documentation = [ObjCRuntimeVisibleDocs]; 2303ec727ea7Spatrick let SimpleHandler = 1; 2304e5dd7070Spatrick} 2305e5dd7070Spatrick 2306e5dd7070Spatrickdef ObjCClassStub : Attr { 2307e5dd7070Spatrick let Spellings = [Clang<"objc_class_stub">]; 2308e5dd7070Spatrick let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; 2309e5dd7070Spatrick let Documentation = [ObjCClassStubDocs]; 2310e5dd7070Spatrick let LangOpts = [ObjCNonFragileRuntime]; 2311ec727ea7Spatrick let SimpleHandler = 1; 2312e5dd7070Spatrick} 2313e5dd7070Spatrick 2314e5dd7070Spatrickdef ObjCBoxable : Attr { 2315e5dd7070Spatrick let Spellings = [Clang<"objc_boxable">]; 2316e5dd7070Spatrick let Subjects = SubjectList<[Record], ErrorDiag>; 2317e5dd7070Spatrick let Documentation = [ObjCBoxableDocs]; 2318e5dd7070Spatrick} 2319e5dd7070Spatrick 2320e5dd7070Spatrickdef OptimizeNone : InheritableAttr { 2321e5dd7070Spatrick let Spellings = [Clang<"optnone">]; 2322e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod]>; 2323e5dd7070Spatrick let Documentation = [OptnoneDocs]; 2324e5dd7070Spatrick} 2325e5dd7070Spatrick 2326e5dd7070Spatrickdef Overloadable : Attr { 2327e5dd7070Spatrick let Spellings = [Clang<"overloadable">]; 2328e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 2329e5dd7070Spatrick let Documentation = [OverloadableDocs]; 2330ec727ea7Spatrick let SimpleHandler = 1; 2331e5dd7070Spatrick} 2332e5dd7070Spatrick 2333e5dd7070Spatrickdef Override : InheritableAttr { 2334e5dd7070Spatrick let Spellings = [Keyword<"override">]; 2335e5dd7070Spatrick let SemaHandler = 0; 2336*12c85518Srobert // Omitted from docs, since this is language syntax, not an attribute, as far 2337*12c85518Srobert // as users are concerned. 2338*12c85518Srobert let Documentation = [InternalOnly]; 2339e5dd7070Spatrick} 2340e5dd7070Spatrick 2341e5dd7070Spatrickdef Ownership : InheritableAttr { 2342e5dd7070Spatrick let Spellings = [Clang<"ownership_holds">, Clang<"ownership_returns">, 2343e5dd7070Spatrick Clang<"ownership_takes">]; 2344e5dd7070Spatrick let Accessors = [Accessor<"isHolds", [Clang<"ownership_holds">]>, 2345e5dd7070Spatrick Accessor<"isReturns", [Clang<"ownership_returns">]>, 2346e5dd7070Spatrick Accessor<"isTakes", [Clang<"ownership_takes">]>]; 2347e5dd7070Spatrick let AdditionalMembers = [{ 2348e5dd7070Spatrick enum OwnershipKind { Holds, Returns, Takes }; 2349e5dd7070Spatrick OwnershipKind getOwnKind() const { 2350e5dd7070Spatrick return isHolds() ? Holds : 2351e5dd7070Spatrick isTakes() ? Takes : 2352e5dd7070Spatrick Returns; 2353e5dd7070Spatrick } 2354e5dd7070Spatrick }]; 2355e5dd7070Spatrick let Args = [IdentifierArgument<"Module">, 2356e5dd7070Spatrick VariadicParamIdxArgument<"Args">]; 2357e5dd7070Spatrick let Subjects = SubjectList<[HasFunctionProto]>; 2358e5dd7070Spatrick let Documentation = [Undocumented]; 2359e5dd7070Spatrick} 2360e5dd7070Spatrick 2361e5dd7070Spatrickdef Packed : InheritableAttr { 2362e5dd7070Spatrick let Spellings = [GCC<"packed">]; 2363e5dd7070Spatrick// let Subjects = [Tag, Field]; 2364e5dd7070Spatrick let Documentation = [Undocumented]; 2365e5dd7070Spatrick} 2366e5dd7070Spatrick 2367e5dd7070Spatrickdef IntelOclBicc : DeclOrTypeAttr { 2368e5dd7070Spatrick let Spellings = [Clang<"intel_ocl_bicc", 0>]; 2369e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 2370e5dd7070Spatrick let Documentation = [Undocumented]; 2371e5dd7070Spatrick} 2372e5dd7070Spatrick 2373e5dd7070Spatrickdef Pcs : DeclOrTypeAttr { 2374e5dd7070Spatrick let Spellings = [GCC<"pcs">]; 2375e5dd7070Spatrick let Args = [EnumArgument<"PCS", "PCSType", 2376e5dd7070Spatrick ["aapcs", "aapcs-vfp"], 2377e5dd7070Spatrick ["AAPCS", "AAPCS_VFP"]>]; 2378e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 2379e5dd7070Spatrick let Documentation = [PcsDocs]; 2380e5dd7070Spatrick} 2381e5dd7070Spatrick 2382e5dd7070Spatrickdef AArch64VectorPcs: DeclOrTypeAttr { 2383e5dd7070Spatrick let Spellings = [Clang<"aarch64_vector_pcs">]; 2384e5dd7070Spatrick let Documentation = [AArch64VectorPcsDocs]; 2385e5dd7070Spatrick} 2386e5dd7070Spatrick 2387*12c85518Srobertdef AArch64SVEPcs: DeclOrTypeAttr { 2388*12c85518Srobert let Spellings = [Clang<"aarch64_sve_pcs">]; 2389*12c85518Srobert let Documentation = [AArch64SVEPcsDocs]; 2390*12c85518Srobert} 2391*12c85518Srobert 2392e5dd7070Spatrickdef Pure : InheritableAttr { 2393e5dd7070Spatrick let Spellings = [GCC<"pure">]; 2394e5dd7070Spatrick let Documentation = [Undocumented]; 2395ec727ea7Spatrick let SimpleHandler = 1; 2396e5dd7070Spatrick} 2397e5dd7070Spatrick 2398e5dd7070Spatrickdef Regparm : TypeAttr { 2399e5dd7070Spatrick let Spellings = [GCC<"regparm">]; 2400e5dd7070Spatrick let Args = [UnsignedArgument<"NumParams">]; 2401e5dd7070Spatrick let Documentation = [RegparmDocs]; 2402e5dd7070Spatrick // Represented as part of the enclosing function type. 2403e5dd7070Spatrick let ASTNode = 0; 2404e5dd7070Spatrick} 2405e5dd7070Spatrick 2406a9ac8606Spatrickdef SwiftAsyncName : InheritableAttr { 2407a9ac8606Spatrick let Spellings = [GNU<"swift_async_name">]; 2408a9ac8606Spatrick let Args = [StringArgument<"Name">]; 2409a9ac8606Spatrick let Subjects = SubjectList<[ObjCMethod, Function], ErrorDiag>; 2410a9ac8606Spatrick let Documentation = [SwiftAsyncNameDocs]; 2411a9ac8606Spatrick} 2412a9ac8606Spatrick 2413a9ac8606Spatrickdef SwiftAttr : InheritableAttr { 2414a9ac8606Spatrick let Spellings = [GNU<"swift_attr">]; 2415a9ac8606Spatrick let Args = [StringArgument<"Attribute">]; 2416a9ac8606Spatrick let Documentation = [SwiftAttrDocs]; 2417*12c85518Srobert let PragmaAttributeSupport = 1; 2418a9ac8606Spatrick} 2419a9ac8606Spatrick 2420a9ac8606Spatrickdef SwiftBridge : InheritableAttr { 2421a9ac8606Spatrick let Spellings = [GNU<"swift_bridge">]; 2422a9ac8606Spatrick let Args = [StringArgument<"SwiftType">]; 2423a9ac8606Spatrick let Subjects = SubjectList<[Tag, TypedefName, ObjCInterface, ObjCProtocol], 2424a9ac8606Spatrick ErrorDiag>; 2425a9ac8606Spatrick let Documentation = [SwiftBridgeDocs]; 2426a9ac8606Spatrick} 2427a9ac8606Spatrick 2428a9ac8606Spatrickdef SwiftBridgedTypedef : InheritableAttr { 2429a9ac8606Spatrick let Spellings = [GNU<"swift_bridged_typedef">]; 2430a9ac8606Spatrick let Subjects = SubjectList<[TypedefName], ErrorDiag>; 2431a9ac8606Spatrick let Documentation = [SwiftBridgedTypedefDocs]; 2432a9ac8606Spatrick let SimpleHandler = 1; 2433a9ac8606Spatrick} 2434a9ac8606Spatrick 2435a9ac8606Spatrickdef SwiftObjCMembers : Attr { 2436a9ac8606Spatrick let Spellings = [GNU<"swift_objc_members">]; 2437a9ac8606Spatrick let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; 2438a9ac8606Spatrick let Documentation = [SwiftObjCMembersDocs]; 2439a9ac8606Spatrick let SimpleHandler = 1; 2440a9ac8606Spatrick} 2441a9ac8606Spatrick 2442a9ac8606Spatrickdef SwiftError : InheritableAttr { 2443a9ac8606Spatrick let Spellings = [GNU<"swift_error">]; 2444a9ac8606Spatrick let Args = [ 2445a9ac8606Spatrick EnumArgument<"Convention", "ConventionKind", 2446a9ac8606Spatrick ["none", "nonnull_error", "null_result", "zero_result", "nonzero_result"], 2447a9ac8606Spatrick ["None", "NonNullError", "NullResult", "ZeroResult", "NonZeroResult"]> 2448a9ac8606Spatrick ]; 2449a9ac8606Spatrick let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>; 2450a9ac8606Spatrick let Documentation = [SwiftErrorDocs]; 2451a9ac8606Spatrick} 2452a9ac8606Spatrick 2453a9ac8606Spatrickdef SwiftName : InheritableAttr { 2454a9ac8606Spatrick let Spellings = [GNU<"swift_name">]; 2455a9ac8606Spatrick let Args = [StringArgument<"Name">]; 2456a9ac8606Spatrick let Documentation = [SwiftNameDocs]; 2457a9ac8606Spatrick} 2458a9ac8606Spatrick 2459a9ac8606Spatrickdef SwiftNewType : InheritableAttr { 2460a9ac8606Spatrick let Spellings = [GNU<"swift_newtype">, GNU<"swift_wrapper">]; 2461a9ac8606Spatrick let Args = [EnumArgument<"NewtypeKind", "NewtypeKind", 2462a9ac8606Spatrick ["struct", "enum"], ["NK_Struct", "NK_Enum"]>]; 2463a9ac8606Spatrick let Subjects = SubjectList<[TypedefName], ErrorDiag>; 2464a9ac8606Spatrick let Documentation = [SwiftNewTypeDocs]; 2465a9ac8606Spatrick let HasCustomParsing = 1; 2466a9ac8606Spatrick} 2467a9ac8606Spatrick 2468a9ac8606Spatrickdef SwiftPrivate : InheritableAttr { 2469a9ac8606Spatrick let Spellings = [GNU<"swift_private">]; 2470a9ac8606Spatrick let Documentation = [SwiftPrivateDocs]; 2471a9ac8606Spatrick let SimpleHandler = 1; 2472a9ac8606Spatrick} 2473a9ac8606Spatrick 2474e5dd7070Spatrickdef NoDeref : TypeAttr { 2475e5dd7070Spatrick let Spellings = [Clang<"noderef">]; 2476e5dd7070Spatrick let Documentation = [NoDerefDocs]; 2477e5dd7070Spatrick} 2478e5dd7070Spatrick 2479e5dd7070Spatrickdef ReqdWorkGroupSize : InheritableAttr { 2480e5dd7070Spatrick // Does not have a [[]] spelling because it is an OpenCL-related attribute. 2481e5dd7070Spatrick let Spellings = [GNU<"reqd_work_group_size">]; 2482e5dd7070Spatrick let Args = [UnsignedArgument<"XDim">, UnsignedArgument<"YDim">, 2483e5dd7070Spatrick UnsignedArgument<"ZDim">]; 2484e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 2485e5dd7070Spatrick let Documentation = [Undocumented]; 2486e5dd7070Spatrick} 2487e5dd7070Spatrick 2488e5dd7070Spatrickdef WorkGroupSizeHint : InheritableAttr { 2489e5dd7070Spatrick // Does not have a [[]] spelling because it is an OpenCL-related attribute. 2490e5dd7070Spatrick let Spellings = [GNU<"work_group_size_hint">]; 2491e5dd7070Spatrick let Args = [UnsignedArgument<"XDim">, 2492e5dd7070Spatrick UnsignedArgument<"YDim">, 2493e5dd7070Spatrick UnsignedArgument<"ZDim">]; 2494e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 2495e5dd7070Spatrick let Documentation = [Undocumented]; 2496e5dd7070Spatrick} 2497e5dd7070Spatrick 2498a9ac8606Spatrickdef InitPriority : InheritableAttr, TargetSpecificAttr<TargetSupportsInitPriority> { 2499ec727ea7Spatrick let Spellings = [GCC<"init_priority", /*AllowInC*/0>]; 2500e5dd7070Spatrick let Args = [UnsignedArgument<"Priority">]; 2501e5dd7070Spatrick let Subjects = SubjectList<[Var], ErrorDiag>; 2502ec727ea7Spatrick let Documentation = [InitPriorityDocs]; 2503e5dd7070Spatrick} 2504e5dd7070Spatrick 2505e5dd7070Spatrickdef Section : InheritableAttr { 2506e5dd7070Spatrick let Spellings = [GCC<"section">, Declspec<"allocate">]; 2507e5dd7070Spatrick let Args = [StringArgument<"Name">]; 2508e5dd7070Spatrick let Subjects = 2509e5dd7070Spatrick SubjectList<[ Function, GlobalVar, ObjCMethod, ObjCProperty ], ErrorDiag>; 2510e5dd7070Spatrick let Documentation = [SectionDocs]; 2511e5dd7070Spatrick} 2512e5dd7070Spatrick 2513e5dd7070Spatrick// This is used for `__declspec(code_seg("segname"))`, but not for 2514e5dd7070Spatrick// `#pragma code_seg("segname")`. 2515e5dd7070Spatrickdef CodeSeg : InheritableAttr { 2516e5dd7070Spatrick let Spellings = [Declspec<"code_seg">]; 2517e5dd7070Spatrick let Args = [StringArgument<"Name">]; 2518e5dd7070Spatrick let Subjects = SubjectList<[Function, CXXRecord], ErrorDiag>; 2519e5dd7070Spatrick let Documentation = [CodeSegDocs]; 2520e5dd7070Spatrick} 2521e5dd7070Spatrick 2522e5dd7070Spatrickdef PragmaClangBSSSection : InheritableAttr { 2523e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 2524e5dd7070Spatrick let Spellings = []; 2525e5dd7070Spatrick let Args = [StringArgument<"Name">]; 2526e5dd7070Spatrick let Subjects = SubjectList<[GlobalVar], ErrorDiag>; 2527*12c85518Srobert let Documentation = [InternalOnly]; 2528e5dd7070Spatrick} 2529e5dd7070Spatrick 2530e5dd7070Spatrickdef PragmaClangDataSection : InheritableAttr { 2531e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 2532e5dd7070Spatrick let Spellings = []; 2533e5dd7070Spatrick let Args = [StringArgument<"Name">]; 2534e5dd7070Spatrick let Subjects = SubjectList<[GlobalVar], ErrorDiag>; 2535*12c85518Srobert let Documentation = [InternalOnly]; 2536e5dd7070Spatrick} 2537e5dd7070Spatrick 2538e5dd7070Spatrickdef PragmaClangRodataSection : InheritableAttr { 2539e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 2540e5dd7070Spatrick let Spellings = []; 2541e5dd7070Spatrick let Args = [StringArgument<"Name">]; 2542e5dd7070Spatrick let Subjects = SubjectList<[GlobalVar], ErrorDiag>; 2543*12c85518Srobert let Documentation = [InternalOnly]; 2544e5dd7070Spatrick} 2545e5dd7070Spatrick 2546e5dd7070Spatrickdef PragmaClangRelroSection : InheritableAttr { 2547e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 2548e5dd7070Spatrick let Spellings = []; 2549e5dd7070Spatrick let Args = [StringArgument<"Name">]; 2550e5dd7070Spatrick let Subjects = SubjectList<[GlobalVar], ErrorDiag>; 2551*12c85518Srobert let Documentation = [InternalOnly]; 2552e5dd7070Spatrick} 2553e5dd7070Spatrick 2554a9ac8606Spatrickdef StrictFP : InheritableAttr { 2555a9ac8606Spatrick // This attribute has no spellings as it is only ever created implicitly. 2556a9ac8606Spatrick // Function uses strict floating point operations. 2557a9ac8606Spatrick let Spellings = []; 2558a9ac8606Spatrick let Subjects = SubjectList<[Function]>; 2559*12c85518Srobert let Documentation = [InternalOnly]; 2560a9ac8606Spatrick} 2561a9ac8606Spatrick 2562e5dd7070Spatrickdef PragmaClangTextSection : InheritableAttr { 2563e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 2564e5dd7070Spatrick let Spellings = []; 2565e5dd7070Spatrick let Args = [StringArgument<"Name">]; 2566e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 2567*12c85518Srobert let Documentation = [InternalOnly]; 2568e5dd7070Spatrick} 2569e5dd7070Spatrick 2570e5dd7070Spatrickdef Sentinel : InheritableAttr { 2571e5dd7070Spatrick let Spellings = [GCC<"sentinel">]; 2572e5dd7070Spatrick let Args = [DefaultIntArgument<"Sentinel", 0>, 2573e5dd7070Spatrick DefaultIntArgument<"NullPos", 0>]; 2574e5dd7070Spatrick// let Subjects = SubjectList<[Function, ObjCMethod, Block, Var]>; 2575e5dd7070Spatrick let Documentation = [Undocumented]; 2576e5dd7070Spatrick} 2577e5dd7070Spatrick 2578e5dd7070Spatrickdef StdCall : DeclOrTypeAttr { 2579e5dd7070Spatrick let Spellings = [GCC<"stdcall">, Keyword<"__stdcall">, Keyword<"_stdcall">]; 2580e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 2581e5dd7070Spatrick let Documentation = [StdCallDocs]; 2582e5dd7070Spatrick} 2583e5dd7070Spatrick 2584e5dd7070Spatrickdef SwiftCall : DeclOrTypeAttr { 2585e5dd7070Spatrick let Spellings = [Clang<"swiftcall">]; 2586e5dd7070Spatrick// let Subjects = SubjectList<[Function]>; 2587e5dd7070Spatrick let Documentation = [SwiftCallDocs]; 2588e5dd7070Spatrick} 2589e5dd7070Spatrick 2590a9ac8606Spatrickdef SwiftAsyncCall : DeclOrTypeAttr { 2591a9ac8606Spatrick let Spellings = [Clang<"swiftasynccall">]; 2592a9ac8606Spatrick let Documentation = [SwiftAsyncCallDocs]; 2593a9ac8606Spatrick} 2594a9ac8606Spatrick 2595e5dd7070Spatrickdef SwiftContext : ParameterABIAttr { 2596e5dd7070Spatrick let Spellings = [Clang<"swift_context">]; 2597e5dd7070Spatrick let Documentation = [SwiftContextDocs]; 2598e5dd7070Spatrick} 2599e5dd7070Spatrick 2600a9ac8606Spatrickdef SwiftAsyncContext : ParameterABIAttr { 2601a9ac8606Spatrick let Spellings = [Clang<"swift_async_context">]; 2602a9ac8606Spatrick let Documentation = [SwiftAsyncContextDocs]; 2603a9ac8606Spatrick} 2604a9ac8606Spatrick 2605e5dd7070Spatrickdef SwiftErrorResult : ParameterABIAttr { 2606e5dd7070Spatrick let Spellings = [Clang<"swift_error_result">]; 2607e5dd7070Spatrick let Documentation = [SwiftErrorResultDocs]; 2608e5dd7070Spatrick} 2609e5dd7070Spatrick 2610e5dd7070Spatrickdef SwiftIndirectResult : ParameterABIAttr { 2611e5dd7070Spatrick let Spellings = [Clang<"swift_indirect_result">]; 2612e5dd7070Spatrick let Documentation = [SwiftIndirectResultDocs]; 2613e5dd7070Spatrick} 2614e5dd7070Spatrick 2615a9ac8606Spatrickdef SwiftAsync : InheritableAttr { 2616a9ac8606Spatrick let Spellings = [Clang<"swift_async">]; 2617a9ac8606Spatrick let Subjects = SubjectList<[Function, ObjCMethod]>; 2618a9ac8606Spatrick let Args = [EnumArgument<"Kind", "Kind", 2619a9ac8606Spatrick ["none", "swift_private", "not_swift_private"], 2620a9ac8606Spatrick ["None", "SwiftPrivate", "NotSwiftPrivate"]>, 2621a9ac8606Spatrick ParamIdxArgument<"CompletionHandlerIndex", /*opt=*/1>]; 2622a9ac8606Spatrick let Documentation = [SwiftAsyncDocs]; 2623a9ac8606Spatrick} 2624a9ac8606Spatrick 2625a9ac8606Spatrickdef SwiftAsyncError : InheritableAttr { 2626a9ac8606Spatrick let Spellings = [Clang<"swift_async_error">]; 2627a9ac8606Spatrick let Subjects = SubjectList<[Function, ObjCMethod]>; 2628a9ac8606Spatrick let Args = [EnumArgument<"Convention", "ConventionKind", 2629a9ac8606Spatrick ["none", "nonnull_error", "zero_argument", "nonzero_argument"], 2630a9ac8606Spatrick ["None", "NonNullError", "ZeroArgument", "NonZeroArgument"]>, 2631a9ac8606Spatrick UnsignedArgument<"HandlerParamIdx", /*opt=*/1>]; 2632a9ac8606Spatrick let Documentation = [SwiftAsyncErrorDocs]; 2633a9ac8606Spatrick} 2634a9ac8606Spatrick 2635e5dd7070Spatrickdef Suppress : StmtAttr { 2636e5dd7070Spatrick let Spellings = [CXX11<"gsl", "suppress">]; 2637e5dd7070Spatrick let Args = [VariadicStringArgument<"DiagnosticIdentifiers">]; 2638e5dd7070Spatrick let Documentation = [SuppressDocs]; 2639e5dd7070Spatrick} 2640e5dd7070Spatrick 2641e5dd7070Spatrickdef SysVABI : DeclOrTypeAttr { 2642e5dd7070Spatrick let Spellings = [GCC<"sysv_abi">]; 2643e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 2644e5dd7070Spatrick let Documentation = [Undocumented]; 2645e5dd7070Spatrick} 2646e5dd7070Spatrick 2647e5dd7070Spatrickdef ThisCall : DeclOrTypeAttr { 2648e5dd7070Spatrick let Spellings = [GCC<"thiscall">, Keyword<"__thiscall">, 2649e5dd7070Spatrick Keyword<"_thiscall">]; 2650e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 2651e5dd7070Spatrick let Documentation = [ThisCallDocs]; 2652e5dd7070Spatrick} 2653e5dd7070Spatrick 2654e5dd7070Spatrickdef VectorCall : DeclOrTypeAttr { 2655e5dd7070Spatrick let Spellings = [Clang<"vectorcall">, Keyword<"__vectorcall">, 2656e5dd7070Spatrick Keyword<"_vectorcall">]; 2657e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 2658e5dd7070Spatrick let Documentation = [VectorCallDocs]; 2659e5dd7070Spatrick} 2660e5dd7070Spatrick 2661*12c85518Srobertdef ZeroCallUsedRegs : InheritableAttr { 2662*12c85518Srobert let Spellings = [GCC<"zero_call_used_regs">]; 2663*12c85518Srobert let Subjects = SubjectList<[Function], ErrorDiag>; 2664*12c85518Srobert let Args = [ 2665*12c85518Srobert EnumArgument<"ZeroCallUsedRegs", "ZeroCallUsedRegsKind", 2666*12c85518Srobert ["skip", "used-gpr-arg", "used-gpr", "used-arg", "used", 2667*12c85518Srobert "all-gpr-arg", "all-gpr", "all-arg", "all"], 2668*12c85518Srobert ["Skip", "UsedGPRArg", "UsedGPR", "UsedArg", "Used", 2669*12c85518Srobert "AllGPRArg", "AllGPR", "AllArg", "All"]> 2670*12c85518Srobert ]; 2671*12c85518Srobert let Documentation = [ZeroCallUsedRegsDocs]; 2672*12c85518Srobert} 2673*12c85518Srobert 2674e5dd7070Spatrickdef Pascal : DeclOrTypeAttr { 2675e5dd7070Spatrick let Spellings = [Clang<"pascal">, Keyword<"__pascal">, Keyword<"_pascal">]; 2676e5dd7070Spatrick// let Subjects = [Function, ObjCMethod]; 2677e5dd7070Spatrick let Documentation = [Undocumented]; 2678e5dd7070Spatrick} 2679e5dd7070Spatrick 2680a9ac8606Spatrickdef PreferredName : InheritableAttr { 2681a9ac8606Spatrick let Spellings = [Clang<"preferred_name", /*AllowInC*/0>]; 2682a9ac8606Spatrick let Subjects = SubjectList<[ClassTmpl]>; 2683a9ac8606Spatrick let Args = [TypeArgument<"TypedefType">]; 2684a9ac8606Spatrick let Documentation = [PreferredNameDocs]; 2685a9ac8606Spatrick let InheritEvenIfAlreadyPresent = 1; 2686a9ac8606Spatrick let MeaningfulToClassTemplateDefinition = 1; 2687a9ac8606Spatrick let TemplateDependent = 1; 2688a9ac8606Spatrick} 2689a9ac8606Spatrick 2690e5dd7070Spatrickdef PreserveMost : DeclOrTypeAttr { 2691e5dd7070Spatrick let Spellings = [Clang<"preserve_most">]; 2692e5dd7070Spatrick let Documentation = [PreserveMostDocs]; 2693e5dd7070Spatrick} 2694e5dd7070Spatrick 2695e5dd7070Spatrickdef PreserveAll : DeclOrTypeAttr { 2696e5dd7070Spatrick let Spellings = [Clang<"preserve_all">]; 2697e5dd7070Spatrick let Documentation = [PreserveAllDocs]; 2698e5dd7070Spatrick} 2699e5dd7070Spatrick 2700e5dd7070Spatrickdef Target : InheritableAttr { 2701e5dd7070Spatrick let Spellings = [GCC<"target">]; 2702e5dd7070Spatrick let Args = [StringArgument<"featuresStr">]; 2703e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 2704e5dd7070Spatrick let Documentation = [TargetDocs]; 2705e5dd7070Spatrick let AdditionalMembers = [{ 2706e5dd7070Spatrick StringRef getArchitecture() const { 2707e5dd7070Spatrick StringRef Features = getFeaturesStr(); 2708e5dd7070Spatrick if (Features == "default") return {}; 2709e5dd7070Spatrick 2710e5dd7070Spatrick SmallVector<StringRef, 1> AttrFeatures; 2711e5dd7070Spatrick Features.split(AttrFeatures, ","); 2712e5dd7070Spatrick 2713e5dd7070Spatrick for (auto &Feature : AttrFeatures) { 2714e5dd7070Spatrick Feature = Feature.trim(); 2715e5dd7070Spatrick if (Feature.startswith("arch=")) 2716e5dd7070Spatrick return Feature.drop_front(sizeof("arch=") - 1); 2717e5dd7070Spatrick } 2718e5dd7070Spatrick return ""; 2719e5dd7070Spatrick } 2720e5dd7070Spatrick 2721e5dd7070Spatrick // Gets the list of features as simple string-refs with no +/- or 'no-'. 2722e5dd7070Spatrick // Only adds the items to 'Out' that are additions. 2723e5dd7070Spatrick void getAddedFeatures(llvm::SmallVectorImpl<StringRef> &Out) const { 2724e5dd7070Spatrick StringRef Features = getFeaturesStr(); 2725e5dd7070Spatrick if (Features == "default") return; 2726e5dd7070Spatrick 2727e5dd7070Spatrick SmallVector<StringRef, 1> AttrFeatures; 2728e5dd7070Spatrick Features.split(AttrFeatures, ","); 2729e5dd7070Spatrick 2730e5dd7070Spatrick for (auto &Feature : AttrFeatures) { 2731e5dd7070Spatrick Feature = Feature.trim(); 2732e5dd7070Spatrick 2733e5dd7070Spatrick if (!Feature.startswith("no-") && !Feature.startswith("arch=") && 2734e5dd7070Spatrick !Feature.startswith("fpmath=") && !Feature.startswith("tune=")) 2735e5dd7070Spatrick Out.push_back(Feature); 2736e5dd7070Spatrick } 2737e5dd7070Spatrick } 2738e5dd7070Spatrick 2739e5dd7070Spatrick bool isDefaultVersion() const { return getFeaturesStr() == "default"; } 2740*12c85518Srobert }]; 2741*12c85518Srobert} 2742e5dd7070Spatrick 2743*12c85518Srobertdef TargetVersion : InheritableAttr { 2744*12c85518Srobert let Spellings = [GCC<"target_version">]; 2745*12c85518Srobert let Args = [StringArgument<"NamesStr">]; 2746*12c85518Srobert let Subjects = SubjectList<[Function], ErrorDiag>; 2747*12c85518Srobert let Documentation = [TargetVersionDocs]; 2748*12c85518Srobert let AdditionalMembers = [{ 2749*12c85518Srobert StringRef getName() const { return getNamesStr().trim(); } 2750*12c85518Srobert bool isDefaultVersion() const { 2751*12c85518Srobert return getName() == "default"; 2752*12c85518Srobert } 2753*12c85518Srobert void getFeatures(llvm::SmallVectorImpl<StringRef> &Out) const { 2754*12c85518Srobert if (isDefaultVersion()) return; 2755*12c85518Srobert StringRef Features = getName(); 2756e5dd7070Spatrick 2757*12c85518Srobert SmallVector<StringRef, 8> AttrFeatures; 2758*12c85518Srobert Features.split(AttrFeatures, "+"); 2759*12c85518Srobert 2760e5dd7070Spatrick for (auto &Feature : AttrFeatures) { 2761e5dd7070Spatrick Feature = Feature.trim(); 2762*12c85518Srobert Out.push_back(Feature); 2763e5dd7070Spatrick } 2764e5dd7070Spatrick } 2765e5dd7070Spatrick }]; 2766e5dd7070Spatrick} 2767e5dd7070Spatrick 2768*12c85518Srobertdef TargetClones : InheritableAttr { 2769*12c85518Srobert let Spellings = [GCC<"target_clones">]; 2770*12c85518Srobert let Args = [VariadicStringArgument<"featuresStrs">]; 2771*12c85518Srobert let Documentation = [TargetClonesDocs]; 2772*12c85518Srobert let Subjects = SubjectList<[Function], ErrorDiag>; 2773*12c85518Srobert let AdditionalMembers = [{ 2774*12c85518Srobert StringRef getFeatureStr(unsigned Index) const { 2775*12c85518Srobert return *(featuresStrs_begin() + Index); 2776*12c85518Srobert } 2777*12c85518Srobert // Given an index into the 'featuresStrs' sequence, compute a unique 2778*12c85518Srobert // ID to be used with function name mangling for the associated variant. 2779*12c85518Srobert // This mapping is necessary due to a requirement that the mangling ID 2780*12c85518Srobert // used for the "default" variant be the largest mangling ID in the 2781*12c85518Srobert // variant set. Duplicate variants present in 'featuresStrs' are also 2782*12c85518Srobert // assigned their own unique ID (the mapping is bijective). 2783*12c85518Srobert unsigned getMangledIndex(unsigned Index) const { 2784*12c85518Srobert if (getFeatureStr(Index) == "default") 2785*12c85518Srobert return std::count_if(featuresStrs_begin(), featuresStrs_end(), 2786*12c85518Srobert [](StringRef S) { return S != "default"; }); 2787*12c85518Srobert 2788*12c85518Srobert return std::count_if(featuresStrs_begin(), featuresStrs_begin() + Index, 2789*12c85518Srobert [](StringRef S) { return S != "default"; }); 2790*12c85518Srobert } 2791*12c85518Srobert 2792*12c85518Srobert // Given an index into the 'featuresStrs' sequence, determine if the 2793*12c85518Srobert // index corresponds to the first instance of the named variant. This 2794*12c85518Srobert // is used to skip over duplicate variant instances when iterating over 2795*12c85518Srobert // 'featuresStrs'. 2796*12c85518Srobert bool isFirstOfVersion(unsigned Index) const { 2797*12c85518Srobert StringRef FeatureStr(getFeatureStr(Index)); 2798*12c85518Srobert return 0 == std::count_if( 2799*12c85518Srobert featuresStrs_begin(), featuresStrs_begin() + Index, 2800*12c85518Srobert [FeatureStr](StringRef S) { return S == FeatureStr; }); 2801*12c85518Srobert 2802*12c85518Srobert } 2803*12c85518Srobert }]; 2804*12c85518Srobert} 2805*12c85518Srobert 2806*12c85518Srobertdef : MutualExclusions<[TargetClones, TargetVersion, Target, CPUDispatch, CPUSpecific]>; 2807*12c85518Srobert 2808e5dd7070Spatrickdef MinVectorWidth : InheritableAttr { 2809e5dd7070Spatrick let Spellings = [Clang<"min_vector_width">]; 2810e5dd7070Spatrick let Args = [UnsignedArgument<"VectorWidth">]; 2811e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 2812e5dd7070Spatrick let Documentation = [MinVectorWidthDocs]; 2813e5dd7070Spatrick} 2814e5dd7070Spatrick 2815e5dd7070Spatrickdef TransparentUnion : InheritableAttr { 2816e5dd7070Spatrick let Spellings = [GCC<"transparent_union">]; 2817e5dd7070Spatrick// let Subjects = SubjectList<[Record, TypedefName]>; 2818e5dd7070Spatrick let Documentation = [TransparentUnionDocs]; 2819e5dd7070Spatrick let LangOpts = [COnly]; 2820e5dd7070Spatrick} 2821e5dd7070Spatrick 2822e5dd7070Spatrickdef Unavailable : InheritableAttr { 2823e5dd7070Spatrick let Spellings = [Clang<"unavailable">]; 2824e5dd7070Spatrick let Args = [StringArgument<"Message", 1>, 2825e5dd7070Spatrick EnumArgument<"ImplicitReason", "ImplicitReason", 2826e5dd7070Spatrick ["", "", "", ""], 2827e5dd7070Spatrick ["IR_None", 2828e5dd7070Spatrick "IR_ARCForbiddenType", 2829e5dd7070Spatrick "IR_ForbiddenWeak", 2830e5dd7070Spatrick "IR_ARCForbiddenConversion", 2831e5dd7070Spatrick "IR_ARCInitReturnsUnrelated", 2832e5dd7070Spatrick "IR_ARCFieldWithOwnership"], 1, /*fake*/ 1>]; 2833e5dd7070Spatrick let Documentation = [Undocumented]; 2834e5dd7070Spatrick} 2835e5dd7070Spatrick 2836e5dd7070Spatrickdef DiagnoseIf : InheritableAttr { 2837e5dd7070Spatrick // Does not have a [[]] spelling because this attribute requires the ability 2838e5dd7070Spatrick // to parse function arguments but the attribute is not written in the type 2839e5dd7070Spatrick // position. 2840e5dd7070Spatrick let Spellings = [GNU<"diagnose_if">]; 2841e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod, ObjCProperty]>; 2842e5dd7070Spatrick let Args = [ExprArgument<"Cond">, StringArgument<"Message">, 2843e5dd7070Spatrick EnumArgument<"DiagnosticType", 2844e5dd7070Spatrick "DiagnosticType", 2845e5dd7070Spatrick ["error", "warning"], 2846e5dd7070Spatrick ["DT_Error", "DT_Warning"]>, 2847e5dd7070Spatrick BoolArgument<"ArgDependent", 0, /*fake*/ 1>, 2848ec727ea7Spatrick DeclArgument<Named, "Parent", 0, /*fake*/ 1>]; 2849e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 2850e5dd7070Spatrick let LateParsed = 1; 2851e5dd7070Spatrick let AdditionalMembers = [{ 2852e5dd7070Spatrick bool isError() const { return diagnosticType == DT_Error; } 2853e5dd7070Spatrick bool isWarning() const { return diagnosticType == DT_Warning; } 2854e5dd7070Spatrick }]; 2855e5dd7070Spatrick let TemplateDependent = 1; 2856e5dd7070Spatrick let Documentation = [DiagnoseIfDocs]; 2857e5dd7070Spatrick} 2858e5dd7070Spatrick 2859e5dd7070Spatrickdef ArcWeakrefUnavailable : InheritableAttr { 2860e5dd7070Spatrick let Spellings = [Clang<"objc_arc_weak_reference_unavailable">]; 2861e5dd7070Spatrick let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; 2862e5dd7070Spatrick let Documentation = [Undocumented]; 2863ec727ea7Spatrick let SimpleHandler = 1; 2864e5dd7070Spatrick} 2865e5dd7070Spatrick 2866e5dd7070Spatrickdef ObjCGC : TypeAttr { 2867e5dd7070Spatrick let Spellings = [Clang<"objc_gc">]; 2868e5dd7070Spatrick let Args = [IdentifierArgument<"Kind">]; 2869e5dd7070Spatrick let Documentation = [Undocumented]; 2870e5dd7070Spatrick} 2871e5dd7070Spatrick 2872e5dd7070Spatrickdef ObjCOwnership : DeclOrTypeAttr { 2873e5dd7070Spatrick let Spellings = [Clang<"objc_ownership">]; 2874e5dd7070Spatrick let Args = [IdentifierArgument<"Kind">]; 2875e5dd7070Spatrick let Documentation = [Undocumented]; 2876e5dd7070Spatrick} 2877e5dd7070Spatrick 2878e5dd7070Spatrickdef ObjCRequiresPropertyDefs : InheritableAttr { 2879e5dd7070Spatrick let Spellings = [Clang<"objc_requires_property_definitions">]; 2880e5dd7070Spatrick let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; 2881e5dd7070Spatrick let Documentation = [Undocumented]; 2882ec727ea7Spatrick let SimpleHandler = 1; 2883e5dd7070Spatrick} 2884e5dd7070Spatrick 2885e5dd7070Spatrickdef Unused : InheritableAttr { 2886e5dd7070Spatrick let Spellings = [CXX11<"", "maybe_unused", 201603>, GCC<"unused">, 2887*12c85518Srobert C2x<"", "maybe_unused", 202106>]; 2888e5dd7070Spatrick let Subjects = SubjectList<[Var, ObjCIvar, Type, Enum, EnumConstant, Label, 2889e5dd7070Spatrick Field, ObjCMethod, FunctionLike]>; 2890e5dd7070Spatrick let Documentation = [WarnMaybeUnusedDocs]; 2891e5dd7070Spatrick} 2892e5dd7070Spatrick 2893e5dd7070Spatrickdef Used : InheritableAttr { 2894e5dd7070Spatrick let Spellings = [GCC<"used">]; 2895e5dd7070Spatrick let Subjects = SubjectList<[NonLocalVar, Function, ObjCMethod]>; 2896a9ac8606Spatrick let Documentation = [UsedDocs]; 2897a9ac8606Spatrick let SimpleHandler = 1; 2898a9ac8606Spatrick} 2899a9ac8606Spatrick 2900a9ac8606Spatrickdef Retain : InheritableAttr { 2901a9ac8606Spatrick let Spellings = [GCC<"retain">]; 2902a9ac8606Spatrick let Subjects = SubjectList<[NonLocalVar, Function, ObjCMethod]>; 2903a9ac8606Spatrick let Documentation = [RetainDocs]; 2904ec727ea7Spatrick let SimpleHandler = 1; 2905e5dd7070Spatrick} 2906e5dd7070Spatrick 2907e5dd7070Spatrickdef Uuid : InheritableAttr { 2908e5dd7070Spatrick let Spellings = [Declspec<"uuid">, Microsoft<"uuid">]; 2909ec727ea7Spatrick let Args = [StringArgument<"Guid">, 2910ec727ea7Spatrick DeclArgument<MSGuid, "GuidDecl", 0, /*fake=*/1>]; 2911e5dd7070Spatrick let Subjects = SubjectList<[Record, Enum]>; 2912e5dd7070Spatrick // FIXME: Allow expressing logical AND for LangOpts. Our condition should be: 2913e5dd7070Spatrick // CPlusPlus && (MicrosoftExt || Borland) 2914e5dd7070Spatrick let LangOpts = [MicrosoftExt, Borland]; 2915e5dd7070Spatrick let Documentation = [Undocumented]; 2916e5dd7070Spatrick} 2917e5dd7070Spatrick 2918e5dd7070Spatrickdef VectorSize : TypeAttr { 2919e5dd7070Spatrick let Spellings = [GCC<"vector_size">]; 2920e5dd7070Spatrick let Args = [ExprArgument<"NumBytes">]; 2921e5dd7070Spatrick let Documentation = [Undocumented]; 2922e5dd7070Spatrick // Represented as VectorType instead. 2923e5dd7070Spatrick let ASTNode = 0; 2924e5dd7070Spatrick} 2925e5dd7070Spatrick 2926e5dd7070Spatrickdef VecTypeHint : InheritableAttr { 2927e5dd7070Spatrick // Does not have a [[]] spelling because it is an OpenCL-related attribute. 2928e5dd7070Spatrick let Spellings = [GNU<"vec_type_hint">]; 2929e5dd7070Spatrick let Args = [TypeArgument<"TypeHint">]; 2930e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 2931e5dd7070Spatrick let Documentation = [Undocumented]; 2932e5dd7070Spatrick} 2933e5dd7070Spatrick 2934ec727ea7Spatrickdef MatrixType : TypeAttr { 2935ec727ea7Spatrick let Spellings = [Clang<"matrix_type">]; 2936ec727ea7Spatrick let Subjects = SubjectList<[TypedefName], ErrorDiag>; 2937ec727ea7Spatrick let Args = [ExprArgument<"NumRows">, ExprArgument<"NumColumns">]; 2938ec727ea7Spatrick let Documentation = [Undocumented]; 2939ec727ea7Spatrick let ASTNode = 0; 2940ec727ea7Spatrick let PragmaAttributeSupport = 0; 2941ec727ea7Spatrick} 2942ec727ea7Spatrick 2943e5dd7070Spatrickdef Visibility : InheritableAttr { 2944e5dd7070Spatrick let Clone = 0; 2945e5dd7070Spatrick let Spellings = [GCC<"visibility">]; 2946e5dd7070Spatrick let Args = [EnumArgument<"Visibility", "VisibilityType", 2947e5dd7070Spatrick ["default", "hidden", "internal", "protected"], 2948e5dd7070Spatrick ["Default", "Hidden", "Hidden", "Protected"]>]; 2949e5dd7070Spatrick let MeaningfulToClassTemplateDefinition = 1; 2950e5dd7070Spatrick let Documentation = [Undocumented]; 2951e5dd7070Spatrick} 2952e5dd7070Spatrick 2953e5dd7070Spatrickdef TypeVisibility : InheritableAttr { 2954e5dd7070Spatrick let Clone = 0; 2955e5dd7070Spatrick let Spellings = [Clang<"type_visibility">]; 2956e5dd7070Spatrick let Args = [EnumArgument<"Visibility", "VisibilityType", 2957e5dd7070Spatrick ["default", "hidden", "internal", "protected"], 2958e5dd7070Spatrick ["Default", "Hidden", "Hidden", "Protected"]>]; 2959e5dd7070Spatrick// let Subjects = [Tag, ObjCInterface, Namespace]; 2960e5dd7070Spatrick let Documentation = [Undocumented]; 2961e5dd7070Spatrick} 2962e5dd7070Spatrick 2963e5dd7070Spatrickdef VecReturn : InheritableAttr { 2964e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it only appertains 2965e5dd7070Spatrick // to C++ struct/class/union. 2966e5dd7070Spatrick // FIXME: should this attribute have a CPlusPlus language option? 2967e5dd7070Spatrick let Spellings = [Clang<"vecreturn", 0>]; 2968e5dd7070Spatrick let Subjects = SubjectList<[CXXRecord], ErrorDiag>; 2969e5dd7070Spatrick let Documentation = [Undocumented]; 2970e5dd7070Spatrick} 2971e5dd7070Spatrick 2972e5dd7070Spatrickdef WarnUnused : InheritableAttr { 2973e5dd7070Spatrick let Spellings = [GCC<"warn_unused">]; 2974e5dd7070Spatrick let Subjects = SubjectList<[Record]>; 2975e5dd7070Spatrick let Documentation = [Undocumented]; 2976ec727ea7Spatrick let SimpleHandler = 1; 2977e5dd7070Spatrick} 2978e5dd7070Spatrick 2979e5dd7070Spatrickdef WarnUnusedResult : InheritableAttr { 2980a9ac8606Spatrick let Spellings = [CXX11<"", "nodiscard", 201907>, 2981*12c85518Srobert C2x<"", "nodiscard", 202003>, 2982e5dd7070Spatrick CXX11<"clang", "warn_unused_result">, 2983e5dd7070Spatrick GCC<"warn_unused_result">]; 2984*12c85518Srobert let Subjects = SubjectList<[ObjCMethod, Enum, Record, FunctionLike, TypedefName]>; 2985e5dd7070Spatrick let Args = [StringArgument<"Message", 1>]; 2986e5dd7070Spatrick let Documentation = [WarnUnusedResultsDocs]; 2987e5dd7070Spatrick let AdditionalMembers = [{ 2988e5dd7070Spatrick // Check whether this the C++11 nodiscard version, even in non C++11 2989e5dd7070Spatrick // spellings. 2990e5dd7070Spatrick bool IsCXX11NoDiscard() const { 2991e5dd7070Spatrick return this->getSemanticSpelling() == CXX11_nodiscard; 2992e5dd7070Spatrick } 2993e5dd7070Spatrick }]; 2994e5dd7070Spatrick} 2995e5dd7070Spatrick 2996e5dd7070Spatrickdef Weak : InheritableAttr { 2997e5dd7070Spatrick let Spellings = [GCC<"weak">]; 2998e5dd7070Spatrick let Subjects = SubjectList<[Var, Function, CXXRecord]>; 2999*12c85518Srobert let Documentation = [WeakDocs]; 3000ec727ea7Spatrick let SimpleHandler = 1; 3001e5dd7070Spatrick} 3002e5dd7070Spatrick 3003e5dd7070Spatrickdef WeakImport : InheritableAttr { 3004e5dd7070Spatrick let Spellings = [Clang<"weak_import">]; 3005e5dd7070Spatrick let Documentation = [Undocumented]; 3006e5dd7070Spatrick} 3007e5dd7070Spatrick 3008e5dd7070Spatrickdef WeakRef : InheritableAttr { 3009e5dd7070Spatrick let Spellings = [GCC<"weakref">]; 3010e5dd7070Spatrick // A WeakRef that has an argument is treated as being an AliasAttr 3011e5dd7070Spatrick let Args = [StringArgument<"Aliasee", 1>]; 3012e5dd7070Spatrick let Subjects = SubjectList<[Var, Function], ErrorDiag>; 3013e5dd7070Spatrick let Documentation = [Undocumented]; 3014e5dd7070Spatrick} 3015e5dd7070Spatrick 3016e5dd7070Spatrickdef LTOVisibilityPublic : InheritableAttr { 3017e5dd7070Spatrick let Spellings = [Clang<"lto_visibility_public">]; 3018e5dd7070Spatrick let Subjects = SubjectList<[Record]>; 3019e5dd7070Spatrick let Documentation = [LTOVisibilityDocs]; 3020ec727ea7Spatrick let SimpleHandler = 1; 3021e5dd7070Spatrick} 3022e5dd7070Spatrick 3023e5dd7070Spatrickdef AnyX86Interrupt : InheritableAttr, TargetSpecificAttr<TargetAnyX86> { 3024e5dd7070Spatrick // NOTE: If you add any additional spellings, ARMInterrupt's, 3025a9ac8606Spatrick // M68kInterrupt's, MSP430Interrupt's and MipsInterrupt's spellings must match. 3026e5dd7070Spatrick let Spellings = [GCC<"interrupt">]; 3027e5dd7070Spatrick let Subjects = SubjectList<[HasFunctionProto]>; 3028e5dd7070Spatrick let ParseKind = "Interrupt"; 3029e5dd7070Spatrick let HasCustomParsing = 1; 3030e5dd7070Spatrick let Documentation = [Undocumented]; 3031e5dd7070Spatrick} 3032e5dd7070Spatrick 3033e5dd7070Spatrickdef AnyX86NoCallerSavedRegisters : InheritableAttr, 3034e5dd7070Spatrick TargetSpecificAttr<TargetAnyX86> { 3035e5dd7070Spatrick let Spellings = [GCC<"no_caller_saved_registers">]; 3036e5dd7070Spatrick let Documentation = [AnyX86NoCallerSavedRegistersDocs]; 3037ec727ea7Spatrick let SimpleHandler = 1; 3038e5dd7070Spatrick} 3039e5dd7070Spatrick 3040e5dd7070Spatrickdef AnyX86NoCfCheck : DeclOrTypeAttr, TargetSpecificAttr<TargetAnyX86>{ 3041e5dd7070Spatrick let Spellings = [GCC<"nocf_check">]; 3042e5dd7070Spatrick let Subjects = SubjectList<[FunctionLike]>; 3043e5dd7070Spatrick let Documentation = [AnyX86NoCfCheckDocs]; 3044e5dd7070Spatrick} 3045e5dd7070Spatrick 3046e5dd7070Spatrickdef X86ForceAlignArgPointer : InheritableAttr, TargetSpecificAttr<TargetAnyX86> { 3047e5dd7070Spatrick let Spellings = [GCC<"force_align_arg_pointer">]; 3048e5dd7070Spatrick // Technically, this appertains to a FunctionDecl, but the target-specific 3049e5dd7070Spatrick // code silently allows anything function-like (such as typedefs or function 3050e5dd7070Spatrick // pointers), but does not apply the attribute to them. 3051e5dd7070Spatrick let Documentation = [X86ForceAlignArgPointerDocs]; 3052e5dd7070Spatrick} 3053e5dd7070Spatrick 3054e5dd7070Spatrickdef NoSanitize : InheritableAttr { 3055e5dd7070Spatrick let Spellings = [Clang<"no_sanitize">]; 3056e5dd7070Spatrick let Args = [VariadicStringArgument<"Sanitizers">]; 3057e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod, GlobalVar], ErrorDiag>; 3058e5dd7070Spatrick let Documentation = [NoSanitizeDocs]; 3059e5dd7070Spatrick let AdditionalMembers = [{ 3060e5dd7070Spatrick SanitizerMask getMask() const { 3061e5dd7070Spatrick SanitizerMask Mask; 3062e5dd7070Spatrick for (auto SanitizerName : sanitizers()) { 3063e5dd7070Spatrick SanitizerMask ParsedMask = 3064e5dd7070Spatrick parseSanitizerValue(SanitizerName, /*AllowGroups=*/true); 3065e5dd7070Spatrick Mask |= expandSanitizerGroups(ParsedMask); 3066e5dd7070Spatrick } 3067e5dd7070Spatrick return Mask; 3068e5dd7070Spatrick } 3069a9ac8606Spatrick 3070a9ac8606Spatrick bool hasCoverage() const { 3071a9ac8606Spatrick return llvm::is_contained(sanitizers(), "coverage"); 3072a9ac8606Spatrick } 3073e5dd7070Spatrick }]; 3074e5dd7070Spatrick} 3075e5dd7070Spatrick 3076e5dd7070Spatrick// Attributes to disable a specific sanitizer. No new sanitizers should be added 3077e5dd7070Spatrick// to this list; the no_sanitize attribute should be extended instead. 3078e5dd7070Spatrickdef NoSanitizeSpecific : InheritableAttr { 3079e5dd7070Spatrick let Spellings = [GCC<"no_address_safety_analysis">, 3080e5dd7070Spatrick GCC<"no_sanitize_address">, 3081e5dd7070Spatrick GCC<"no_sanitize_thread">, 3082e5dd7070Spatrick Clang<"no_sanitize_memory">]; 3083e5dd7070Spatrick let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag>; 3084e5dd7070Spatrick let Documentation = [NoSanitizeAddressDocs, NoSanitizeThreadDocs, 3085e5dd7070Spatrick NoSanitizeMemoryDocs]; 3086e5dd7070Spatrick let ASTNode = 0; 3087e5dd7070Spatrick} 3088e5dd7070Spatrick 3089*12c85518Srobertdef DisableSanitizerInstrumentation : InheritableAttr { 3090*12c85518Srobert let Spellings = [Clang<"disable_sanitizer_instrumentation">]; 3091*12c85518Srobert let Subjects = SubjectList<[Function, ObjCMethod, GlobalVar]>; 3092*12c85518Srobert let Documentation = [DisableSanitizerInstrumentationDocs]; 3093*12c85518Srobert let SimpleHandler = 1; 3094*12c85518Srobert} 3095*12c85518Srobert 3096e5dd7070Spatrickdef CFICanonicalJumpTable : InheritableAttr { 3097e5dd7070Spatrick let Spellings = [Clang<"cfi_canonical_jump_table">]; 3098e5dd7070Spatrick let Subjects = SubjectList<[Function], ErrorDiag>; 3099e5dd7070Spatrick let Documentation = [CFICanonicalJumpTableDocs]; 3100ec727ea7Spatrick let SimpleHandler = 1; 3101e5dd7070Spatrick} 3102e5dd7070Spatrick 3103e5dd7070Spatrick// C/C++ Thread safety attributes (e.g. for deadlock, data race checking) 3104e5dd7070Spatrick// Not all of these attributes will be given a [[]] spelling. The attributes 3105e5dd7070Spatrick// which require access to function parameter names cannot use the [[]] spelling 3106e5dd7070Spatrick// because they are not written in the type position. Some attributes are given 3107e5dd7070Spatrick// an updated captability-based name and the older name will only be supported 3108e5dd7070Spatrick// under the GNU-style spelling. 3109e5dd7070Spatrickdef GuardedVar : InheritableAttr { 3110e5dd7070Spatrick let Spellings = [Clang<"guarded_var", 0>]; 3111e5dd7070Spatrick let Subjects = SubjectList<[Field, SharedVar]>; 3112e5dd7070Spatrick let Documentation = [Undocumented]; 3113ec727ea7Spatrick let SimpleHandler = 1; 3114e5dd7070Spatrick} 3115e5dd7070Spatrick 3116e5dd7070Spatrickdef PtGuardedVar : InheritableAttr { 3117e5dd7070Spatrick let Spellings = [Clang<"pt_guarded_var", 0>]; 3118e5dd7070Spatrick let Subjects = SubjectList<[Field, SharedVar]>; 3119e5dd7070Spatrick let Documentation = [Undocumented]; 3120e5dd7070Spatrick} 3121e5dd7070Spatrick 3122e5dd7070Spatrickdef Lockable : InheritableAttr { 3123e5dd7070Spatrick let Spellings = [GNU<"lockable">]; 3124e5dd7070Spatrick let Subjects = SubjectList<[Record]>; 3125e5dd7070Spatrick let Documentation = [Undocumented]; 3126e5dd7070Spatrick let ASTNode = 0; // Replaced by Capability 3127e5dd7070Spatrick} 3128e5dd7070Spatrick 3129e5dd7070Spatrickdef ScopedLockable : InheritableAttr { 3130e5dd7070Spatrick let Spellings = [Clang<"scoped_lockable", 0>]; 3131e5dd7070Spatrick let Subjects = SubjectList<[Record]>; 3132e5dd7070Spatrick let Documentation = [Undocumented]; 3133ec727ea7Spatrick let SimpleHandler = 1; 3134e5dd7070Spatrick} 3135e5dd7070Spatrick 3136e5dd7070Spatrickdef Capability : InheritableAttr { 3137e5dd7070Spatrick let Spellings = [Clang<"capability", 0>, Clang<"shared_capability", 0>]; 3138e5dd7070Spatrick let Subjects = SubjectList<[Record, TypedefName], ErrorDiag>; 3139e5dd7070Spatrick let Args = [StringArgument<"Name">]; 3140e5dd7070Spatrick let Accessors = [Accessor<"isShared", 3141e5dd7070Spatrick [Clang<"shared_capability", 0>]>]; 3142e5dd7070Spatrick let Documentation = [Undocumented]; 3143e5dd7070Spatrick} 3144e5dd7070Spatrick 3145e5dd7070Spatrickdef AssertCapability : InheritableAttr { 3146e5dd7070Spatrick let Spellings = [Clang<"assert_capability", 0>, 3147e5dd7070Spatrick Clang<"assert_shared_capability", 0>]; 3148e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3149e5dd7070Spatrick let LateParsed = 1; 3150e5dd7070Spatrick let TemplateDependent = 1; 3151e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3152e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3153e5dd7070Spatrick let Args = [VariadicExprArgument<"Args">]; 3154e5dd7070Spatrick let Accessors = [Accessor<"isShared", 3155e5dd7070Spatrick [Clang<"assert_shared_capability", 0>]>]; 3156e5dd7070Spatrick let Documentation = [AssertCapabilityDocs]; 3157e5dd7070Spatrick} 3158e5dd7070Spatrick 3159e5dd7070Spatrickdef AcquireCapability : InheritableAttr { 3160e5dd7070Spatrick let Spellings = [Clang<"acquire_capability", 0>, 3161e5dd7070Spatrick Clang<"acquire_shared_capability", 0>, 3162e5dd7070Spatrick GNU<"exclusive_lock_function">, 3163e5dd7070Spatrick GNU<"shared_lock_function">]; 3164e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3165e5dd7070Spatrick let LateParsed = 1; 3166e5dd7070Spatrick let TemplateDependent = 1; 3167e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3168e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3169e5dd7070Spatrick let Args = [VariadicExprArgument<"Args">]; 3170e5dd7070Spatrick let Accessors = [Accessor<"isShared", 3171e5dd7070Spatrick [Clang<"acquire_shared_capability", 0>, 3172e5dd7070Spatrick GNU<"shared_lock_function">]>]; 3173e5dd7070Spatrick let Documentation = [AcquireCapabilityDocs]; 3174e5dd7070Spatrick} 3175e5dd7070Spatrick 3176e5dd7070Spatrickdef TryAcquireCapability : InheritableAttr { 3177e5dd7070Spatrick let Spellings = [Clang<"try_acquire_capability", 0>, 3178e5dd7070Spatrick Clang<"try_acquire_shared_capability", 0>]; 3179e5dd7070Spatrick let Subjects = SubjectList<[Function], 3180e5dd7070Spatrick ErrorDiag>; 3181e5dd7070Spatrick let LateParsed = 1; 3182e5dd7070Spatrick let TemplateDependent = 1; 3183e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3184e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3185e5dd7070Spatrick let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">]; 3186e5dd7070Spatrick let Accessors = [Accessor<"isShared", 3187e5dd7070Spatrick [Clang<"try_acquire_shared_capability", 0>]>]; 3188e5dd7070Spatrick let Documentation = [TryAcquireCapabilityDocs]; 3189e5dd7070Spatrick} 3190e5dd7070Spatrick 3191e5dd7070Spatrickdef ReleaseCapability : InheritableAttr { 3192e5dd7070Spatrick let Spellings = [Clang<"release_capability", 0>, 3193e5dd7070Spatrick Clang<"release_shared_capability", 0>, 3194e5dd7070Spatrick Clang<"release_generic_capability", 0>, 3195e5dd7070Spatrick Clang<"unlock_function", 0>]; 3196e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3197e5dd7070Spatrick let LateParsed = 1; 3198e5dd7070Spatrick let TemplateDependent = 1; 3199e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3200e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3201e5dd7070Spatrick let Args = [VariadicExprArgument<"Args">]; 3202e5dd7070Spatrick let Accessors = [Accessor<"isShared", 3203e5dd7070Spatrick [Clang<"release_shared_capability", 0>]>, 3204e5dd7070Spatrick Accessor<"isGeneric", 3205e5dd7070Spatrick [Clang<"release_generic_capability", 0>, 3206e5dd7070Spatrick Clang<"unlock_function", 0>]>]; 3207e5dd7070Spatrick let Documentation = [ReleaseCapabilityDocs]; 3208e5dd7070Spatrick} 3209e5dd7070Spatrick 3210e5dd7070Spatrickdef RequiresCapability : InheritableAttr { 3211e5dd7070Spatrick let Spellings = [Clang<"requires_capability", 0>, 3212e5dd7070Spatrick Clang<"exclusive_locks_required", 0>, 3213e5dd7070Spatrick Clang<"requires_shared_capability", 0>, 3214e5dd7070Spatrick Clang<"shared_locks_required", 0>]; 3215e5dd7070Spatrick let Args = [VariadicExprArgument<"Args">]; 3216e5dd7070Spatrick let LateParsed = 1; 3217e5dd7070Spatrick let TemplateDependent = 1; 3218e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3219e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3220e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3221e5dd7070Spatrick let Accessors = [Accessor<"isShared", [Clang<"requires_shared_capability", 0>, 3222e5dd7070Spatrick Clang<"shared_locks_required", 0>]>]; 3223e5dd7070Spatrick let Documentation = [Undocumented]; 3224e5dd7070Spatrick} 3225e5dd7070Spatrick 3226e5dd7070Spatrickdef NoThreadSafetyAnalysis : InheritableAttr { 3227e5dd7070Spatrick let Spellings = [Clang<"no_thread_safety_analysis">]; 3228e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3229e5dd7070Spatrick let Documentation = [Undocumented]; 3230ec727ea7Spatrick let SimpleHandler = 1; 3231e5dd7070Spatrick} 3232e5dd7070Spatrick 3233e5dd7070Spatrickdef GuardedBy : InheritableAttr { 3234e5dd7070Spatrick let Spellings = [GNU<"guarded_by">]; 3235e5dd7070Spatrick let Args = [ExprArgument<"Arg">]; 3236e5dd7070Spatrick let LateParsed = 1; 3237e5dd7070Spatrick let TemplateDependent = 1; 3238e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3239e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3240e5dd7070Spatrick let Subjects = SubjectList<[Field, SharedVar]>; 3241e5dd7070Spatrick let Documentation = [Undocumented]; 3242e5dd7070Spatrick} 3243e5dd7070Spatrick 3244e5dd7070Spatrickdef PtGuardedBy : InheritableAttr { 3245e5dd7070Spatrick let Spellings = [GNU<"pt_guarded_by">]; 3246e5dd7070Spatrick let Args = [ExprArgument<"Arg">]; 3247e5dd7070Spatrick let LateParsed = 1; 3248e5dd7070Spatrick let TemplateDependent = 1; 3249e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3250e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3251e5dd7070Spatrick let Subjects = SubjectList<[Field, SharedVar]>; 3252e5dd7070Spatrick let Documentation = [Undocumented]; 3253e5dd7070Spatrick} 3254e5dd7070Spatrick 3255e5dd7070Spatrickdef AcquiredAfter : InheritableAttr { 3256e5dd7070Spatrick let Spellings = [GNU<"acquired_after">]; 3257e5dd7070Spatrick let Args = [VariadicExprArgument<"Args">]; 3258e5dd7070Spatrick let LateParsed = 1; 3259e5dd7070Spatrick let TemplateDependent = 1; 3260e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3261e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3262e5dd7070Spatrick let Subjects = SubjectList<[Field, SharedVar]>; 3263e5dd7070Spatrick let Documentation = [Undocumented]; 3264e5dd7070Spatrick} 3265e5dd7070Spatrick 3266e5dd7070Spatrickdef AcquiredBefore : InheritableAttr { 3267e5dd7070Spatrick let Spellings = [GNU<"acquired_before">]; 3268e5dd7070Spatrick let Args = [VariadicExprArgument<"Args">]; 3269e5dd7070Spatrick let LateParsed = 1; 3270e5dd7070Spatrick let TemplateDependent = 1; 3271e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3272e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3273e5dd7070Spatrick let Subjects = SubjectList<[Field, SharedVar]>; 3274e5dd7070Spatrick let Documentation = [Undocumented]; 3275e5dd7070Spatrick} 3276e5dd7070Spatrick 3277e5dd7070Spatrickdef AssertExclusiveLock : InheritableAttr { 3278e5dd7070Spatrick let Spellings = [GNU<"assert_exclusive_lock">]; 3279e5dd7070Spatrick let Args = [VariadicExprArgument<"Args">]; 3280e5dd7070Spatrick let LateParsed = 1; 3281e5dd7070Spatrick let TemplateDependent = 1; 3282e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3283e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3284e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3285e5dd7070Spatrick let Documentation = [Undocumented]; 3286e5dd7070Spatrick} 3287e5dd7070Spatrick 3288e5dd7070Spatrickdef AssertSharedLock : InheritableAttr { 3289e5dd7070Spatrick let Spellings = [GNU<"assert_shared_lock">]; 3290e5dd7070Spatrick let Args = [VariadicExprArgument<"Args">]; 3291e5dd7070Spatrick let LateParsed = 1; 3292e5dd7070Spatrick let TemplateDependent = 1; 3293e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3294e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3295e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3296e5dd7070Spatrick let Documentation = [Undocumented]; 3297e5dd7070Spatrick} 3298e5dd7070Spatrick 3299e5dd7070Spatrick// The first argument is an integer or boolean value specifying the return value 3300e5dd7070Spatrick// of a successful lock acquisition. 3301e5dd7070Spatrickdef ExclusiveTrylockFunction : InheritableAttr { 3302e5dd7070Spatrick let Spellings = [GNU<"exclusive_trylock_function">]; 3303e5dd7070Spatrick let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">]; 3304e5dd7070Spatrick let LateParsed = 1; 3305e5dd7070Spatrick let TemplateDependent = 1; 3306e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3307e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3308e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3309e5dd7070Spatrick let Documentation = [Undocumented]; 3310e5dd7070Spatrick} 3311e5dd7070Spatrick 3312e5dd7070Spatrick// The first argument is an integer or boolean value specifying the return value 3313e5dd7070Spatrick// of a successful lock acquisition. 3314e5dd7070Spatrickdef SharedTrylockFunction : InheritableAttr { 3315e5dd7070Spatrick let Spellings = [GNU<"shared_trylock_function">]; 3316e5dd7070Spatrick let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">]; 3317e5dd7070Spatrick let LateParsed = 1; 3318e5dd7070Spatrick let TemplateDependent = 1; 3319e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3320e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3321e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3322e5dd7070Spatrick let Documentation = [Undocumented]; 3323e5dd7070Spatrick} 3324e5dd7070Spatrick 3325e5dd7070Spatrickdef LockReturned : InheritableAttr { 3326e5dd7070Spatrick let Spellings = [GNU<"lock_returned">]; 3327e5dd7070Spatrick let Args = [ExprArgument<"Arg">]; 3328e5dd7070Spatrick let LateParsed = 1; 3329e5dd7070Spatrick let TemplateDependent = 1; 3330e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3331e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3332e5dd7070Spatrick let Documentation = [Undocumented]; 3333e5dd7070Spatrick} 3334e5dd7070Spatrick 3335e5dd7070Spatrickdef LocksExcluded : InheritableAttr { 3336e5dd7070Spatrick let Spellings = [GNU<"locks_excluded">]; 3337e5dd7070Spatrick let Args = [VariadicExprArgument<"Args">]; 3338e5dd7070Spatrick let LateParsed = 1; 3339e5dd7070Spatrick let TemplateDependent = 1; 3340e5dd7070Spatrick let ParseArgumentsAsUnevaluated = 1; 3341e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3342e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3343e5dd7070Spatrick let Documentation = [Undocumented]; 3344e5dd7070Spatrick} 3345e5dd7070Spatrick 3346e5dd7070Spatrick// C/C++ consumed attributes. 3347e5dd7070Spatrick 3348e5dd7070Spatrickdef Consumable : InheritableAttr { 3349e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it only appertains 3350e5dd7070Spatrick // to C++ struct/class/union. 3351e5dd7070Spatrick // FIXME: should this attribute have a CPlusPlus language option? 3352e5dd7070Spatrick let Spellings = [Clang<"consumable", 0>]; 3353e5dd7070Spatrick let Subjects = SubjectList<[CXXRecord]>; 3354e5dd7070Spatrick let Args = [EnumArgument<"DefaultState", "ConsumedState", 3355e5dd7070Spatrick ["unknown", "consumed", "unconsumed"], 3356e5dd7070Spatrick ["Unknown", "Consumed", "Unconsumed"]>]; 3357e5dd7070Spatrick let Documentation = [ConsumableDocs]; 3358e5dd7070Spatrick} 3359e5dd7070Spatrick 3360e5dd7070Spatrickdef ConsumableAutoCast : InheritableAttr { 3361e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it only appertains 3362e5dd7070Spatrick // to C++ struct/class/union. 3363e5dd7070Spatrick // FIXME: should this attribute have a CPlusPlus language option? 3364e5dd7070Spatrick let Spellings = [Clang<"consumable_auto_cast_state", 0>]; 3365e5dd7070Spatrick let Subjects = SubjectList<[CXXRecord]>; 3366e5dd7070Spatrick let Documentation = [Undocumented]; 3367ec727ea7Spatrick let SimpleHandler = 1; 3368e5dd7070Spatrick} 3369e5dd7070Spatrick 3370e5dd7070Spatrickdef ConsumableSetOnRead : InheritableAttr { 3371e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it only appertains 3372e5dd7070Spatrick // to C++ struct/class/union. 3373e5dd7070Spatrick // FIXME: should this attribute have a CPlusPlus language option? 3374e5dd7070Spatrick let Spellings = [Clang<"consumable_set_state_on_read", 0>]; 3375e5dd7070Spatrick let Subjects = SubjectList<[CXXRecord]>; 3376e5dd7070Spatrick let Documentation = [Undocumented]; 3377ec727ea7Spatrick let SimpleHandler = 1; 3378e5dd7070Spatrick} 3379e5dd7070Spatrick 3380e5dd7070Spatrickdef CallableWhen : InheritableAttr { 3381e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it only appertains 3382e5dd7070Spatrick // to C++ function (but doesn't require it to be a member function). 3383e5dd7070Spatrick // FIXME: should this attribute have a CPlusPlus language option? 3384e5dd7070Spatrick let Spellings = [Clang<"callable_when", 0>]; 3385e5dd7070Spatrick let Subjects = SubjectList<[CXXMethod]>; 3386e5dd7070Spatrick let Args = [VariadicEnumArgument<"CallableStates", "ConsumedState", 3387e5dd7070Spatrick ["unknown", "consumed", "unconsumed"], 3388e5dd7070Spatrick ["Unknown", "Consumed", "Unconsumed"]>]; 3389e5dd7070Spatrick let Documentation = [CallableWhenDocs]; 3390e5dd7070Spatrick} 3391e5dd7070Spatrick 3392e5dd7070Spatrickdef ParamTypestate : InheritableAttr { 3393e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it only appertains 3394e5dd7070Spatrick // to a parameter whose type is a consumable C++ class. 3395e5dd7070Spatrick // FIXME: should this attribute have a CPlusPlus language option? 3396e5dd7070Spatrick let Spellings = [Clang<"param_typestate", 0>]; 3397e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 3398e5dd7070Spatrick let Args = [EnumArgument<"ParamState", "ConsumedState", 3399e5dd7070Spatrick ["unknown", "consumed", "unconsumed"], 3400e5dd7070Spatrick ["Unknown", "Consumed", "Unconsumed"]>]; 3401e5dd7070Spatrick let Documentation = [ParamTypestateDocs]; 3402e5dd7070Spatrick} 3403e5dd7070Spatrick 3404e5dd7070Spatrickdef ReturnTypestate : InheritableAttr { 3405e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it only appertains 3406e5dd7070Spatrick // to a parameter or function return type that is a consumable C++ class. 3407e5dd7070Spatrick // FIXME: should this attribute have a CPlusPlus language option? 3408e5dd7070Spatrick let Spellings = [Clang<"return_typestate", 0>]; 3409e5dd7070Spatrick let Subjects = SubjectList<[Function, ParmVar]>; 3410e5dd7070Spatrick let Args = [EnumArgument<"State", "ConsumedState", 3411e5dd7070Spatrick ["unknown", "consumed", "unconsumed"], 3412e5dd7070Spatrick ["Unknown", "Consumed", "Unconsumed"]>]; 3413e5dd7070Spatrick let Documentation = [ReturnTypestateDocs]; 3414e5dd7070Spatrick} 3415e5dd7070Spatrick 3416e5dd7070Spatrickdef SetTypestate : InheritableAttr { 3417e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it only appertains 3418e5dd7070Spatrick // to C++ function (but doesn't require it to be a member function). 3419e5dd7070Spatrick // FIXME: should this attribute have a CPlusPlus language option? 3420e5dd7070Spatrick let Spellings = [Clang<"set_typestate", 0>]; 3421e5dd7070Spatrick let Subjects = SubjectList<[CXXMethod]>; 3422e5dd7070Spatrick let Args = [EnumArgument<"NewState", "ConsumedState", 3423e5dd7070Spatrick ["unknown", "consumed", "unconsumed"], 3424e5dd7070Spatrick ["Unknown", "Consumed", "Unconsumed"]>]; 3425e5dd7070Spatrick let Documentation = [SetTypestateDocs]; 3426e5dd7070Spatrick} 3427e5dd7070Spatrick 3428e5dd7070Spatrickdef TestTypestate : InheritableAttr { 3429e5dd7070Spatrick // This attribute does not have a C [[]] spelling because it only appertains 3430e5dd7070Spatrick // to C++ function (but doesn't require it to be a member function). 3431e5dd7070Spatrick // FIXME: should this attribute have a CPlusPlus language option? 3432e5dd7070Spatrick let Spellings = [Clang<"test_typestate", 0>]; 3433e5dd7070Spatrick let Subjects = SubjectList<[CXXMethod]>; 3434e5dd7070Spatrick let Args = [EnumArgument<"TestState", "ConsumedState", 3435e5dd7070Spatrick ["consumed", "unconsumed"], 3436e5dd7070Spatrick ["Consumed", "Unconsumed"]>]; 3437e5dd7070Spatrick let Documentation = [TestTypestateDocs]; 3438e5dd7070Spatrick} 3439e5dd7070Spatrick 3440e5dd7070Spatrick// Type safety attributes for `void *' pointers and type tags. 3441e5dd7070Spatrick 3442e5dd7070Spatrickdef ArgumentWithTypeTag : InheritableAttr { 3443e5dd7070Spatrick let Spellings = [Clang<"argument_with_type_tag">, 3444e5dd7070Spatrick Clang<"pointer_with_type_tag">]; 3445e5dd7070Spatrick let Subjects = SubjectList<[HasFunctionProto], ErrorDiag>; 3446e5dd7070Spatrick let Args = [IdentifierArgument<"ArgumentKind">, 3447e5dd7070Spatrick ParamIdxArgument<"ArgumentIdx">, 3448e5dd7070Spatrick ParamIdxArgument<"TypeTagIdx">, 3449e5dd7070Spatrick BoolArgument<"IsPointer", /*opt*/0, /*fake*/1>]; 3450e5dd7070Spatrick let Documentation = [ArgumentWithTypeTagDocs, PointerWithTypeTagDocs]; 3451e5dd7070Spatrick} 3452e5dd7070Spatrick 3453e5dd7070Spatrickdef TypeTagForDatatype : InheritableAttr { 3454e5dd7070Spatrick let Spellings = [Clang<"type_tag_for_datatype">]; 3455e5dd7070Spatrick let Args = [IdentifierArgument<"ArgumentKind">, 3456e5dd7070Spatrick TypeArgument<"MatchingCType">, 3457e5dd7070Spatrick BoolArgument<"LayoutCompatible">, 3458e5dd7070Spatrick BoolArgument<"MustBeNull">]; 3459e5dd7070Spatrick// let Subjects = SubjectList<[Var], ErrorDiag>; 3460e5dd7070Spatrick let HasCustomParsing = 1; 3461e5dd7070Spatrick let Documentation = [TypeTagForDatatypeDocs]; 3462e5dd7070Spatrick} 3463e5dd7070Spatrick 3464e5dd7070Spatrickdef Owner : InheritableAttr { 3465e5dd7070Spatrick let Spellings = [CXX11<"gsl", "Owner">]; 3466e5dd7070Spatrick let Subjects = SubjectList<[Struct]>; 3467e5dd7070Spatrick let Args = [TypeArgument<"DerefType", /*opt=*/1>]; 3468e5dd7070Spatrick let Documentation = [LifetimeOwnerDocs]; 3469e5dd7070Spatrick} 3470e5dd7070Spatrick 3471e5dd7070Spatrickdef Pointer : InheritableAttr { 3472e5dd7070Spatrick let Spellings = [CXX11<"gsl", "Pointer">]; 3473e5dd7070Spatrick let Subjects = SubjectList<[Struct]>; 3474e5dd7070Spatrick let Args = [TypeArgument<"DerefType", /*opt=*/1>]; 3475e5dd7070Spatrick let Documentation = [LifetimePointerDocs]; 3476e5dd7070Spatrick} 3477a9ac8606Spatrickdef : MutualExclusions<[Owner, Pointer]>; 3478e5dd7070Spatrick 3479e5dd7070Spatrick// Microsoft-related attributes 3480e5dd7070Spatrick 3481e5dd7070Spatrickdef MSNoVTable : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> { 3482e5dd7070Spatrick let Spellings = [Declspec<"novtable">]; 3483e5dd7070Spatrick let Subjects = SubjectList<[CXXRecord]>; 3484e5dd7070Spatrick let Documentation = [MSNoVTableDocs]; 3485ec727ea7Spatrick let SimpleHandler = 1; 3486e5dd7070Spatrick} 3487e5dd7070Spatrick 3488e5dd7070Spatrickdef : IgnoredAttr { 3489e5dd7070Spatrick let Spellings = [Declspec<"property">]; 3490e5dd7070Spatrick} 3491e5dd7070Spatrick 3492e5dd7070Spatrickdef MSAllocator : InheritableAttr { 3493e5dd7070Spatrick let Spellings = [Declspec<"allocator">]; 3494e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3495e5dd7070Spatrick let Documentation = [MSAllocatorDocs]; 3496e5dd7070Spatrick} 3497e5dd7070Spatrick 3498*12c85518Srobertdef CFGuard : InheritableAttr, TargetSpecificAttr<TargetWindows> { 3499e5dd7070Spatrick // Currently only the __declspec(guard(nocf)) modifier is supported. In future 3500e5dd7070Spatrick // we might also want to support __declspec(guard(suppress)). 3501*12c85518Srobert let Spellings = [Declspec<"guard">, Clang<"guard">]; 3502e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3503e5dd7070Spatrick let Args = [EnumArgument<"Guard", "GuardArg", ["nocf"], ["nocf"]>]; 3504e5dd7070Spatrick let Documentation = [CFGuardDocs]; 3505e5dd7070Spatrick} 3506e5dd7070Spatrick 3507e5dd7070Spatrickdef MSStruct : InheritableAttr { 3508e5dd7070Spatrick let Spellings = [GCC<"ms_struct">]; 3509e5dd7070Spatrick let Subjects = SubjectList<[Record]>; 3510e5dd7070Spatrick let Documentation = [Undocumented]; 3511ec727ea7Spatrick let SimpleHandler = 1; 3512e5dd7070Spatrick} 3513e5dd7070Spatrick 3514a9ac8606Spatrickdef DLLExport : InheritableAttr, TargetSpecificAttr<TargetHasDLLImportExport> { 3515e5dd7070Spatrick let Spellings = [Declspec<"dllexport">, GCC<"dllexport">]; 3516e5dd7070Spatrick let Subjects = SubjectList<[Function, Var, CXXRecord, ObjCInterface]>; 3517e5dd7070Spatrick let Documentation = [DLLExportDocs]; 3518e5dd7070Spatrick} 3519e5dd7070Spatrick 3520a9ac8606Spatrickdef DLLExportStaticLocal : InheritableAttr, TargetSpecificAttr<TargetHasDLLImportExport> { 3521e5dd7070Spatrick // This attribute is used internally only when -fno-dllexport-inlines is 3522a9ac8606Spatrick // passed. This attribute is added to inline functions of a class having the 3523a9ac8606Spatrick // dllexport attribute. If the function has static local variables, this 3524a9ac8606Spatrick // attribute is used to determine whether the variables are exported or not. If 3525a9ac8606Spatrick // the function has local static variables, the function is dllexported too. 3526e5dd7070Spatrick let Spellings = []; 3527e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3528*12c85518Srobert let Documentation = [InternalOnly]; 3529e5dd7070Spatrick} 3530e5dd7070Spatrick 3531a9ac8606Spatrickdef DLLImport : InheritableAttr, TargetSpecificAttr<TargetHasDLLImportExport> { 3532e5dd7070Spatrick let Spellings = [Declspec<"dllimport">, GCC<"dllimport">]; 3533e5dd7070Spatrick let Subjects = SubjectList<[Function, Var, CXXRecord, ObjCInterface]>; 3534e5dd7070Spatrick let Documentation = [DLLImportDocs]; 3535e5dd7070Spatrick 3536e5dd7070Spatrick 3537e5dd7070Spatrick let AdditionalMembers = [{ 3538e5dd7070Spatrickprivate: 3539e5dd7070Spatrick bool PropagatedToBaseTemplate = false; 3540e5dd7070Spatrick 3541e5dd7070Spatrickpublic: 3542e5dd7070Spatrick void setPropagatedToBaseTemplate() { PropagatedToBaseTemplate = true; } 3543e5dd7070Spatrick bool wasPropagatedToBaseTemplate() { return PropagatedToBaseTemplate; } 3544e5dd7070Spatrick }]; 3545e5dd7070Spatrick} 3546e5dd7070Spatrick 3547a9ac8606Spatrickdef DLLImportStaticLocal : InheritableAttr, TargetSpecificAttr<TargetHasDLLImportExport> { 3548e5dd7070Spatrick // This attribute is used internally only when -fno-dllexport-inlines is 3549a9ac8606Spatrick // passed. This attribute is added to inline functions of a class having the 3550a9ac8606Spatrick // dllimport attribute. If the function has static local variables, this 3551a9ac8606Spatrick // attribute is used to determine whether the variables are imported or not. 3552e5dd7070Spatrick let Spellings = []; 3553e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3554*12c85518Srobert let Documentation = [InternalOnly]; 3555e5dd7070Spatrick} 3556e5dd7070Spatrick 3557e5dd7070Spatrickdef SelectAny : InheritableAttr { 3558e5dd7070Spatrick let Spellings = [Declspec<"selectany">, GCC<"selectany">]; 3559e5dd7070Spatrick let Documentation = [SelectAnyDocs]; 3560ec727ea7Spatrick let SimpleHandler = 1; 3561e5dd7070Spatrick} 3562e5dd7070Spatrick 3563e5dd7070Spatrickdef Thread : Attr { 3564e5dd7070Spatrick let Spellings = [Declspec<"thread">]; 3565e5dd7070Spatrick let LangOpts = [MicrosoftExt]; 3566e5dd7070Spatrick let Documentation = [ThreadDocs]; 3567e5dd7070Spatrick let Subjects = SubjectList<[Var]>; 3568e5dd7070Spatrick} 3569e5dd7070Spatrick 3570e5dd7070Spatrickdef Win64 : IgnoredAttr { 3571e5dd7070Spatrick let Spellings = [Keyword<"__w64">]; 3572e5dd7070Spatrick let LangOpts = [MicrosoftExt]; 3573e5dd7070Spatrick} 3574e5dd7070Spatrick 3575e5dd7070Spatrickdef Ptr32 : TypeAttr { 3576e5dd7070Spatrick let Spellings = [Keyword<"__ptr32">]; 3577e5dd7070Spatrick let Documentation = [Ptr32Docs]; 3578e5dd7070Spatrick} 3579e5dd7070Spatrick 3580e5dd7070Spatrickdef Ptr64 : TypeAttr { 3581e5dd7070Spatrick let Spellings = [Keyword<"__ptr64">]; 3582e5dd7070Spatrick let Documentation = [Ptr64Docs]; 3583e5dd7070Spatrick} 3584e5dd7070Spatrick 3585e5dd7070Spatrickdef SPtr : TypeAttr { 3586e5dd7070Spatrick let Spellings = [Keyword<"__sptr">]; 3587e5dd7070Spatrick let Documentation = [SPtrDocs]; 3588e5dd7070Spatrick} 3589e5dd7070Spatrick 3590e5dd7070Spatrickdef UPtr : TypeAttr { 3591e5dd7070Spatrick let Spellings = [Keyword<"__uptr">]; 3592e5dd7070Spatrick let Documentation = [UPtrDocs]; 3593e5dd7070Spatrick} 3594e5dd7070Spatrick 3595e5dd7070Spatrickdef MSInheritance : InheritableAttr { 3596e5dd7070Spatrick let LangOpts = [MicrosoftExt]; 3597e5dd7070Spatrick let Args = [DefaultBoolArgument<"BestCase", /*default*/1, /*fake*/1>]; 3598e5dd7070Spatrick let Spellings = [Keyword<"__single_inheritance">, 3599e5dd7070Spatrick Keyword<"__multiple_inheritance">, 3600e5dd7070Spatrick Keyword<"__virtual_inheritance">, 3601e5dd7070Spatrick Keyword<"__unspecified_inheritance">]; 3602e5dd7070Spatrick let AdditionalMembers = [{ 3603e5dd7070Spatrick MSInheritanceModel getInheritanceModel() const { 3604e5dd7070Spatrick // The spelling enum should agree with MSInheritanceModel. 3605e5dd7070Spatrick return MSInheritanceModel(getSemanticSpelling()); 3606e5dd7070Spatrick } 3607e5dd7070Spatrick }]; 3608e5dd7070Spatrick let Documentation = [MSInheritanceDocs]; 3609e5dd7070Spatrick} 3610e5dd7070Spatrick 3611e5dd7070Spatrickdef MSVtorDisp : InheritableAttr { 3612e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 3613e5dd7070Spatrick let Spellings = []; 3614e5dd7070Spatrick let Args = [UnsignedArgument<"vdm">]; 3615e5dd7070Spatrick let SemaHandler = 0; 3616e5dd7070Spatrick 3617e5dd7070Spatrick let AdditionalMembers = [{ 3618e5dd7070Spatrick MSVtorDispMode getVtorDispMode() const { return MSVtorDispMode(vdm); } 3619e5dd7070Spatrick }]; 3620*12c85518Srobert let Documentation = [InternalOnly]; 3621e5dd7070Spatrick} 3622e5dd7070Spatrick 3623e5dd7070Spatrickdef InitSeg : Attr { 3624e5dd7070Spatrick let Spellings = [Pragma<"", "init_seg">]; 3625e5dd7070Spatrick let Args = [StringArgument<"Section">]; 3626e5dd7070Spatrick let SemaHandler = 0; 3627e5dd7070Spatrick let Documentation = [InitSegDocs]; 3628e5dd7070Spatrick let AdditionalMembers = [{ 3629e5dd7070Spatrick void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const { 3630e5dd7070Spatrick OS << " (" << getSection() << ')'; 3631e5dd7070Spatrick } 3632e5dd7070Spatrick }]; 3633e5dd7070Spatrick} 3634e5dd7070Spatrick 3635e5dd7070Spatrickdef LoopHint : Attr { 3636e5dd7070Spatrick /// #pragma clang loop <option> directive 3637e5dd7070Spatrick /// vectorize: vectorizes loop operations if State == Enable. 3638e5dd7070Spatrick /// vectorize_width: vectorize loop operations with width 'Value'. 3639e5dd7070Spatrick /// interleave: interleave multiple loop iterations if State == Enable. 3640e5dd7070Spatrick /// interleave_count: interleaves 'Value' loop iterations. 3641e5dd7070Spatrick /// unroll: fully unroll loop if State == Enable. 3642e5dd7070Spatrick /// unroll_count: unrolls loop 'Value' times. 3643e5dd7070Spatrick /// unroll_and_jam: attempt to unroll and jam loop if State == Enable. 3644e5dd7070Spatrick /// unroll_and_jam_count: unroll and jams loop 'Value' times. 3645e5dd7070Spatrick /// distribute: attempt to distribute loop if State == Enable. 3646e5dd7070Spatrick /// pipeline: disable pipelining loop if State == Disable. 3647e5dd7070Spatrick /// pipeline_initiation_interval: create loop schedule with initiation interval equal to 'Value'. 3648e5dd7070Spatrick 3649e5dd7070Spatrick /// #pragma unroll <argument> directive 3650e5dd7070Spatrick /// <no arg>: fully unrolls loop. 3651e5dd7070Spatrick /// boolean: fully unrolls loop if State == Enable. 3652e5dd7070Spatrick /// expression: unrolls loop 'Value' times. 3653e5dd7070Spatrick 3654e5dd7070Spatrick let Spellings = [Pragma<"clang", "loop">, Pragma<"", "unroll">, 3655e5dd7070Spatrick Pragma<"", "nounroll">, Pragma<"", "unroll_and_jam">, 3656e5dd7070Spatrick Pragma<"", "nounroll_and_jam">]; 3657e5dd7070Spatrick 3658e5dd7070Spatrick /// State of the loop optimization specified by the spelling. 3659e5dd7070Spatrick let Args = [EnumArgument<"Option", "OptionType", 3660e5dd7070Spatrick ["vectorize", "vectorize_width", "interleave", "interleave_count", 3661e5dd7070Spatrick "unroll", "unroll_count", "unroll_and_jam", "unroll_and_jam_count", 3662e5dd7070Spatrick "pipeline", "pipeline_initiation_interval", "distribute", 3663e5dd7070Spatrick "vectorize_predicate"], 3664e5dd7070Spatrick ["Vectorize", "VectorizeWidth", "Interleave", "InterleaveCount", 3665e5dd7070Spatrick "Unroll", "UnrollCount", "UnrollAndJam", "UnrollAndJamCount", 3666e5dd7070Spatrick "PipelineDisabled", "PipelineInitiationInterval", "Distribute", 3667e5dd7070Spatrick "VectorizePredicate"]>, 3668e5dd7070Spatrick EnumArgument<"State", "LoopHintState", 3669a9ac8606Spatrick ["enable", "disable", "numeric", "fixed_width", 3670a9ac8606Spatrick "scalable_width", "assume_safety", "full"], 3671a9ac8606Spatrick ["Enable", "Disable", "Numeric", "FixedWidth", 3672a9ac8606Spatrick "ScalableWidth", "AssumeSafety", "Full"]>, 3673e5dd7070Spatrick ExprArgument<"Value">]; 3674e5dd7070Spatrick 3675e5dd7070Spatrick let AdditionalMembers = [{ 3676e5dd7070Spatrick static const char *getOptionName(int Option) { 3677e5dd7070Spatrick switch(Option) { 3678e5dd7070Spatrick case Vectorize: return "vectorize"; 3679e5dd7070Spatrick case VectorizeWidth: return "vectorize_width"; 3680e5dd7070Spatrick case Interleave: return "interleave"; 3681e5dd7070Spatrick case InterleaveCount: return "interleave_count"; 3682e5dd7070Spatrick case Unroll: return "unroll"; 3683e5dd7070Spatrick case UnrollCount: return "unroll_count"; 3684e5dd7070Spatrick case UnrollAndJam: return "unroll_and_jam"; 3685e5dd7070Spatrick case UnrollAndJamCount: return "unroll_and_jam_count"; 3686e5dd7070Spatrick case PipelineDisabled: return "pipeline"; 3687e5dd7070Spatrick case PipelineInitiationInterval: return "pipeline_initiation_interval"; 3688e5dd7070Spatrick case Distribute: return "distribute"; 3689e5dd7070Spatrick case VectorizePredicate: return "vectorize_predicate"; 3690e5dd7070Spatrick } 3691e5dd7070Spatrick llvm_unreachable("Unhandled LoopHint option."); 3692e5dd7070Spatrick } 3693e5dd7070Spatrick 3694ec727ea7Spatrick void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const; 3695e5dd7070Spatrick 3696e5dd7070Spatrick // Return a string containing the loop hint argument including the 3697e5dd7070Spatrick // enclosing parentheses. 3698ec727ea7Spatrick std::string getValueString(const PrintingPolicy &Policy) const; 3699e5dd7070Spatrick 3700e5dd7070Spatrick // Return a string suitable for identifying this attribute in diagnostics. 3701ec727ea7Spatrick std::string getDiagnosticName(const PrintingPolicy &Policy) const; 3702e5dd7070Spatrick }]; 3703e5dd7070Spatrick 3704e5dd7070Spatrick let Documentation = [LoopHintDocs, UnrollHintDocs]; 3705a9ac8606Spatrick let HasCustomParsing = 1; 3706e5dd7070Spatrick} 3707e5dd7070Spatrick 3708e5dd7070Spatrickdef CapturedRecord : InheritableAttr { 3709e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 3710e5dd7070Spatrick let Spellings = []; 3711e5dd7070Spatrick let SemaHandler = 0; 3712*12c85518Srobert let Documentation = [InternalOnly]; 3713e5dd7070Spatrick} 3714e5dd7070Spatrick 3715e5dd7070Spatrickdef OMPThreadPrivateDecl : InheritableAttr { 3716e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 3717e5dd7070Spatrick let Spellings = []; 3718e5dd7070Spatrick let SemaHandler = 0; 3719*12c85518Srobert let Documentation = [InternalOnly]; 3720e5dd7070Spatrick} 3721e5dd7070Spatrick 3722e5dd7070Spatrickdef OMPCaptureNoInit : InheritableAttr { 3723e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 3724e5dd7070Spatrick let Spellings = []; 3725e5dd7070Spatrick let SemaHandler = 0; 3726*12c85518Srobert let Documentation = [InternalOnly]; 3727e5dd7070Spatrick} 3728e5dd7070Spatrick 3729e5dd7070Spatrickdef OMPCaptureKind : Attr { 3730e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 3731e5dd7070Spatrick let Spellings = []; 3732e5dd7070Spatrick let SemaHandler = 0; 3733ec727ea7Spatrick let Args = [UnsignedArgument<"CaptureKindVal">]; 3734*12c85518Srobert let Documentation = [InternalOnly]; 3735ec727ea7Spatrick let AdditionalMembers = [{ 3736ec727ea7Spatrick llvm::omp::Clause getCaptureKind() const { 3737ec727ea7Spatrick return static_cast<llvm::omp::Clause>(getCaptureKindVal()); 3738ec727ea7Spatrick } 3739ec727ea7Spatrick }]; 3740e5dd7070Spatrick} 3741e5dd7070Spatrick 3742e5dd7070Spatrickdef OMPReferencedVar : Attr { 3743e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 3744e5dd7070Spatrick let Spellings = []; 3745e5dd7070Spatrick let SemaHandler = 0; 3746e5dd7070Spatrick let Args = [ExprArgument<"Ref">]; 3747*12c85518Srobert let Documentation = [InternalOnly]; 3748e5dd7070Spatrick} 3749e5dd7070Spatrick 3750e5dd7070Spatrickdef OMPDeclareSimdDecl : Attr { 3751e5dd7070Spatrick let Spellings = [Pragma<"omp", "declare simd">]; 3752e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3753e5dd7070Spatrick let SemaHandler = 0; 3754e5dd7070Spatrick let HasCustomParsing = 1; 3755e5dd7070Spatrick let Documentation = [OMPDeclareSimdDocs]; 3756e5dd7070Spatrick let Args = [ 3757e5dd7070Spatrick EnumArgument<"BranchState", "BranchStateTy", 3758e5dd7070Spatrick [ "", "inbranch", "notinbranch" ], 3759e5dd7070Spatrick [ "BS_Undefined", "BS_Inbranch", "BS_Notinbranch" ]>, 3760e5dd7070Spatrick ExprArgument<"Simdlen">, VariadicExprArgument<"Uniforms">, 3761e5dd7070Spatrick VariadicExprArgument<"Aligneds">, VariadicExprArgument<"Alignments">, 3762e5dd7070Spatrick VariadicExprArgument<"Linears">, VariadicUnsignedArgument<"Modifiers">, 3763e5dd7070Spatrick VariadicExprArgument<"Steps"> 3764e5dd7070Spatrick ]; 3765e5dd7070Spatrick let AdditionalMembers = [{ 3766e5dd7070Spatrick void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy) 3767ec727ea7Spatrick const; 3768e5dd7070Spatrick }]; 3769e5dd7070Spatrick} 3770e5dd7070Spatrick 3771e5dd7070Spatrickdef OMPDeclareTargetDecl : InheritableAttr { 3772e5dd7070Spatrick let Spellings = [Pragma<"omp", "declare target">]; 3773e5dd7070Spatrick let SemaHandler = 0; 3774e5dd7070Spatrick let Subjects = SubjectList<[Function, SharedVar]>; 3775e5dd7070Spatrick let Documentation = [OMPDeclareTargetDocs]; 3776e5dd7070Spatrick let Args = [ 3777e5dd7070Spatrick EnumArgument<"MapType", "MapTypeTy", 3778*12c85518Srobert [ "to", "enter", "link" ], 3779*12c85518Srobert [ "MT_To", "MT_Enter", "MT_Link" ]>, 3780e5dd7070Spatrick EnumArgument<"DevType", "DevTypeTy", 3781e5dd7070Spatrick [ "host", "nohost", "any" ], 3782a9ac8606Spatrick [ "DT_Host", "DT_NoHost", "DT_Any" ]>, 3783*12c85518Srobert ExprArgument<"IndirectExpr">, 3784*12c85518Srobert BoolArgument<"Indirect">, 3785a9ac8606Spatrick UnsignedArgument<"Level"> 3786e5dd7070Spatrick ]; 3787e5dd7070Spatrick let AdditionalMembers = [{ 3788ec727ea7Spatrick void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const; 3789*12c85518Srobert static std::optional<MapTypeTy> 3790ec727ea7Spatrick isDeclareTargetDeclaration(const ValueDecl *VD); 3791*12c85518Srobert static std::optional<OMPDeclareTargetDeclAttr*> getActiveAttr(const ValueDecl *VD); 3792*12c85518Srobert static std::optional<DevTypeTy> getDeviceType(const ValueDecl *VD); 3793*12c85518Srobert static std::optional<SourceLocation> getLocation(const ValueDecl *VD); 3794e5dd7070Spatrick }]; 3795e5dd7070Spatrick} 3796e5dd7070Spatrick 3797e5dd7070Spatrickdef OMPAllocateDecl : InheritableAttr { 3798e5dd7070Spatrick // This attribute has no spellings as it is only ever created implicitly. 3799e5dd7070Spatrick let Spellings = []; 3800e5dd7070Spatrick let SemaHandler = 0; 3801e5dd7070Spatrick let Args = [ 3802e5dd7070Spatrick EnumArgument<"AllocatorType", "AllocatorTypeTy", 3803e5dd7070Spatrick [ 3804ec727ea7Spatrick "omp_null_allocator", "omp_default_mem_alloc", 3805ec727ea7Spatrick "omp_large_cap_mem_alloc", "omp_const_mem_alloc", 3806ec727ea7Spatrick "omp_high_bw_mem_alloc", "omp_low_lat_mem_alloc", 3807ec727ea7Spatrick "omp_cgroup_mem_alloc", "omp_pteam_mem_alloc", 3808ec727ea7Spatrick "omp_thread_mem_alloc", "" 3809e5dd7070Spatrick ], 3810e5dd7070Spatrick [ 3811ec727ea7Spatrick "OMPNullMemAlloc", "OMPDefaultMemAlloc", 3812ec727ea7Spatrick "OMPLargeCapMemAlloc", "OMPConstMemAlloc", 3813ec727ea7Spatrick "OMPHighBWMemAlloc", "OMPLowLatMemAlloc", 3814e5dd7070Spatrick "OMPCGroupMemAlloc", "OMPPTeamMemAlloc", "OMPThreadMemAlloc", 3815e5dd7070Spatrick "OMPUserDefinedMemAlloc" 3816e5dd7070Spatrick ]>, 3817*12c85518Srobert ExprArgument<"Allocator">, 3818*12c85518Srobert ExprArgument<"Alignment"> 3819e5dd7070Spatrick ]; 3820*12c85518Srobert let Documentation = [InternalOnly]; 3821e5dd7070Spatrick} 3822e5dd7070Spatrick 3823e5dd7070Spatrickdef OMPDeclareVariant : InheritableAttr { 3824e5dd7070Spatrick let Spellings = [Pragma<"omp", "declare variant">]; 3825e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3826e5dd7070Spatrick let SemaHandler = 0; 3827e5dd7070Spatrick let HasCustomParsing = 1; 3828e5dd7070Spatrick let InheritEvenIfAlreadyPresent = 1; 3829e5dd7070Spatrick let Documentation = [OMPDeclareVariantDocs]; 3830e5dd7070Spatrick let Args = [ 3831e5dd7070Spatrick ExprArgument<"VariantFuncRef">, 3832ec727ea7Spatrick OMPTraitInfoArgument<"TraitInfos">, 3833*12c85518Srobert VariadicExprArgument<"AdjustArgsNothing">, 3834*12c85518Srobert VariadicExprArgument<"AdjustArgsNeedDevicePtr">, 3835*12c85518Srobert VariadicOMPInteropInfoArgument<"AppendArgs">, 3836e5dd7070Spatrick ]; 3837e5dd7070Spatrick let AdditionalMembers = [{ 3838ec727ea7Spatrick OMPTraitInfo &getTraitInfo() { return *traitInfos; } 3839e5dd7070Spatrick void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy) 3840ec727ea7Spatrick const; 3841*12c85518Srobert static StringRef getInteropTypeString(const OMPInteropInfo *I) { 3842*12c85518Srobert if (I->IsTarget && I->IsTargetSync) 3843*12c85518Srobert return "target,targetsync"; 3844*12c85518Srobert if (I->IsTarget) 3845*12c85518Srobert return "target"; 3846*12c85518Srobert return "targetsync"; 3847*12c85518Srobert } 3848e5dd7070Spatrick }]; 3849e5dd7070Spatrick} 3850e5dd7070Spatrick 3851a9ac8606Spatrickdef Assumption : InheritableAttr { 3852a9ac8606Spatrick let Spellings = [Clang<"assume">]; 3853a9ac8606Spatrick let Subjects = SubjectList<[Function, ObjCMethod]>; 3854a9ac8606Spatrick let InheritEvenIfAlreadyPresent = 1; 3855a9ac8606Spatrick let Documentation = [AssumptionDocs]; 3856a9ac8606Spatrick let Args = [StringArgument<"Assumption">]; 3857a9ac8606Spatrick} 3858a9ac8606Spatrick 3859e5dd7070Spatrickdef InternalLinkage : InheritableAttr { 3860e5dd7070Spatrick let Spellings = [Clang<"internal_linkage">]; 3861e5dd7070Spatrick let Subjects = SubjectList<[Var, Function, CXXRecord]>; 3862e5dd7070Spatrick let Documentation = [InternalLinkageDocs]; 3863e5dd7070Spatrick} 3864a9ac8606Spatrickdef : MutualExclusions<[Common, InternalLinkage]>; 3865e5dd7070Spatrick 3866e5dd7070Spatrickdef ExcludeFromExplicitInstantiation : InheritableAttr { 3867e5dd7070Spatrick let Spellings = [Clang<"exclude_from_explicit_instantiation">]; 3868e5dd7070Spatrick let Subjects = SubjectList<[Var, Function, CXXRecord]>; 3869e5dd7070Spatrick let Documentation = [ExcludeFromExplicitInstantiationDocs]; 3870e5dd7070Spatrick let MeaningfulToClassTemplateDefinition = 1; 3871ec727ea7Spatrick let SimpleHandler = 1; 3872e5dd7070Spatrick} 3873e5dd7070Spatrick 3874e5dd7070Spatrickdef Reinitializes : InheritableAttr { 3875e5dd7070Spatrick let Spellings = [Clang<"reinitializes", 0>]; 3876e5dd7070Spatrick let Subjects = SubjectList<[NonStaticNonConstCXXMethod], ErrorDiag>; 3877e5dd7070Spatrick let Documentation = [ReinitializesDocs]; 3878ec727ea7Spatrick let SimpleHandler = 1; 3879e5dd7070Spatrick} 3880e5dd7070Spatrick 3881e5dd7070Spatrickdef NoDestroy : InheritableAttr { 3882e5dd7070Spatrick let Spellings = [Clang<"no_destroy", 0>]; 3883e5dd7070Spatrick let Subjects = SubjectList<[Var]>; 3884e5dd7070Spatrick let Documentation = [NoDestroyDocs]; 3885e5dd7070Spatrick} 3886e5dd7070Spatrick 3887e5dd7070Spatrickdef AlwaysDestroy : InheritableAttr { 3888e5dd7070Spatrick let Spellings = [Clang<"always_destroy", 0>]; 3889e5dd7070Spatrick let Subjects = SubjectList<[Var]>; 3890e5dd7070Spatrick let Documentation = [AlwaysDestroyDocs]; 3891e5dd7070Spatrick} 3892a9ac8606Spatrickdef : MutualExclusions<[NoDestroy, AlwaysDestroy]>; 3893e5dd7070Spatrick 3894e5dd7070Spatrickdef SpeculativeLoadHardening : InheritableAttr { 3895e5dd7070Spatrick let Spellings = [Clang<"speculative_load_hardening">]; 3896e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>; 3897e5dd7070Spatrick let Documentation = [SpeculativeLoadHardeningDocs]; 3898a9ac8606Spatrick let SimpleHandler = 1; 3899e5dd7070Spatrick} 3900e5dd7070Spatrick 3901e5dd7070Spatrickdef NoSpeculativeLoadHardening : InheritableAttr { 3902e5dd7070Spatrick let Spellings = [Clang<"no_speculative_load_hardening">]; 3903e5dd7070Spatrick let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>; 3904e5dd7070Spatrick let Documentation = [NoSpeculativeLoadHardeningDocs]; 3905a9ac8606Spatrick let SimpleHandler = 1; 3906e5dd7070Spatrick} 3907a9ac8606Spatrickdef : MutualExclusions<[SpeculativeLoadHardening, NoSpeculativeLoadHardening]>; 3908e5dd7070Spatrick 3909e5dd7070Spatrickdef Uninitialized : InheritableAttr { 3910e5dd7070Spatrick let Spellings = [Clang<"uninitialized", 0>]; 3911e5dd7070Spatrick let Subjects = SubjectList<[LocalVar]>; 3912ec727ea7Spatrick let PragmaAttributeSupport = 1; 3913e5dd7070Spatrick let Documentation = [UninitializedDocs]; 3914e5dd7070Spatrick} 3915e5dd7070Spatrick 3916ec727ea7Spatrickdef LoaderUninitialized : Attr { 3917ec727ea7Spatrick let Spellings = [Clang<"loader_uninitialized">]; 3918ec727ea7Spatrick let Subjects = SubjectList<[GlobalVar]>; 3919ec727ea7Spatrick let Documentation = [LoaderUninitializedDocs]; 3920a9ac8606Spatrick let SimpleHandler = 1; 3921ec727ea7Spatrick} 3922ec727ea7Spatrick 3923e5dd7070Spatrickdef ObjCExternallyRetained : InheritableAttr { 3924e5dd7070Spatrick let LangOpts = [ObjCAutoRefCount]; 3925e5dd7070Spatrick let Spellings = [Clang<"objc_externally_retained">]; 3926e5dd7070Spatrick let Subjects = SubjectList<[NonParmVar, Function, Block, ObjCMethod]>; 3927e5dd7070Spatrick let Documentation = [ObjCExternallyRetainedDocs]; 3928e5dd7070Spatrick} 3929e5dd7070Spatrick 3930e5dd7070Spatrickdef NoBuiltin : Attr { 3931e5dd7070Spatrick let Spellings = [Clang<"no_builtin">]; 3932e5dd7070Spatrick let Args = [VariadicStringArgument<"BuiltinNames">]; 3933e5dd7070Spatrick let Subjects = SubjectList<[Function]>; 3934e5dd7070Spatrick let Documentation = [NoBuiltinDocs]; 3935e5dd7070Spatrick} 3936e5dd7070Spatrick 3937a9ac8606Spatrickdef UsingIfExists : InheritableAttr { 3938a9ac8606Spatrick let Spellings = [Clang<"using_if_exists", 0>]; 3939a9ac8606Spatrick let Subjects = SubjectList<[Using, 3940a9ac8606Spatrick UnresolvedUsingTypename, 3941a9ac8606Spatrick UnresolvedUsingValue], ErrorDiag>; 3942a9ac8606Spatrick let Documentation = [UsingIfExistsDocs]; 3943a9ac8606Spatrick} 3944a9ac8606Spatrick 3945e5dd7070Spatrick// FIXME: This attribute is not inheritable, it will not be propagated to 3946e5dd7070Spatrick// redecls. [[clang::lifetimebound]] has the same problems. This should be 3947e5dd7070Spatrick// fixed in TableGen (by probably adding a new inheritable flag). 3948e5dd7070Spatrickdef AcquireHandle : DeclOrTypeAttr { 3949e5dd7070Spatrick let Spellings = [Clang<"acquire_handle">]; 3950e5dd7070Spatrick let Args = [StringArgument<"HandleType">]; 3951e5dd7070Spatrick let Subjects = SubjectList<[Function, TypedefName, ParmVar]>; 3952e5dd7070Spatrick let Documentation = [AcquireHandleDocs]; 3953e5dd7070Spatrick} 3954e5dd7070Spatrick 3955e5dd7070Spatrickdef UseHandle : InheritableParamAttr { 3956e5dd7070Spatrick let Spellings = [Clang<"use_handle">]; 3957e5dd7070Spatrick let Args = [StringArgument<"HandleType">]; 3958e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 3959e5dd7070Spatrick let Documentation = [UseHandleDocs]; 3960e5dd7070Spatrick} 3961e5dd7070Spatrick 3962e5dd7070Spatrickdef ReleaseHandle : InheritableParamAttr { 3963e5dd7070Spatrick let Spellings = [Clang<"release_handle">]; 3964e5dd7070Spatrick let Args = [StringArgument<"HandleType">]; 3965e5dd7070Spatrick let Subjects = SubjectList<[ParmVar]>; 3966e5dd7070Spatrick let Documentation = [ReleaseHandleDocs]; 3967e5dd7070Spatrick} 3968ec727ea7Spatrick 3969*12c85518Srobertdef DiagnoseAsBuiltin : InheritableAttr { 3970*12c85518Srobert let Spellings = [Clang<"diagnose_as_builtin">]; 3971*12c85518Srobert let Args = [DeclArgument<Function, "Function">, 3972*12c85518Srobert VariadicUnsignedArgument<"ArgIndices">]; 3973*12c85518Srobert let Subjects = SubjectList<[Function]>; 3974*12c85518Srobert let Documentation = [DiagnoseAsBuiltinDocs]; 3975*12c85518Srobert} 3976*12c85518Srobert 3977ec727ea7Spatrickdef Builtin : InheritableAttr { 3978ec727ea7Spatrick let Spellings = []; 3979ec727ea7Spatrick let Args = [UnsignedArgument<"ID">]; 3980ec727ea7Spatrick let Subjects = SubjectList<[Function]>; 3981ec727ea7Spatrick let SemaHandler = 0; 3982*12c85518Srobert let Documentation = [InternalOnly]; 3983ec727ea7Spatrick} 3984a9ac8606Spatrick 3985a9ac8606Spatrickdef EnforceTCB : InheritableAttr { 3986a9ac8606Spatrick let Spellings = [Clang<"enforce_tcb">]; 3987*12c85518Srobert let Subjects = SubjectList<[Function, ObjCMethod]>; 3988a9ac8606Spatrick let Args = [StringArgument<"TCBName">]; 3989a9ac8606Spatrick let Documentation = [EnforceTCBDocs]; 3990a9ac8606Spatrick bit InheritEvenIfAlreadyPresent = 1; 3991a9ac8606Spatrick} 3992a9ac8606Spatrick 3993a9ac8606Spatrickdef EnforceTCBLeaf : InheritableAttr { 3994a9ac8606Spatrick let Spellings = [Clang<"enforce_tcb_leaf">]; 3995*12c85518Srobert let Subjects = SubjectList<[Function, ObjCMethod]>; 3996a9ac8606Spatrick let Args = [StringArgument<"TCBName">]; 3997a9ac8606Spatrick let Documentation = [EnforceTCBLeafDocs]; 3998a9ac8606Spatrick bit InheritEvenIfAlreadyPresent = 1; 3999a9ac8606Spatrick} 4000*12c85518Srobert 4001*12c85518Srobertdef Error : InheritableAttr { 4002*12c85518Srobert let Spellings = [GCC<"error">, GCC<"warning">]; 4003*12c85518Srobert let Accessors = [Accessor<"isError", [GCC<"error">]>, 4004*12c85518Srobert Accessor<"isWarning", [GCC<"warning">]>]; 4005*12c85518Srobert let Args = [StringArgument<"UserDiagnostic">]; 4006*12c85518Srobert let Subjects = SubjectList<[Function], ErrorDiag>; 4007*12c85518Srobert let Documentation = [ErrorAttrDocs]; 4008*12c85518Srobert} 4009*12c85518Srobert 4010*12c85518Srobertdef HLSLNumThreads: InheritableAttr { 4011*12c85518Srobert let Spellings = [Microsoft<"numthreads">]; 4012*12c85518Srobert let Args = [IntArgument<"X">, IntArgument<"Y">, IntArgument<"Z">]; 4013*12c85518Srobert let Subjects = SubjectList<[HLSLEntry]>; 4014*12c85518Srobert let LangOpts = [HLSL]; 4015*12c85518Srobert let Documentation = [NumThreadsDocs]; 4016*12c85518Srobert} 4017*12c85518Srobert 4018*12c85518Srobertdef HLSLSV_GroupIndex: HLSLAnnotationAttr { 4019*12c85518Srobert let Spellings = [HLSLSemantic<"SV_GroupIndex">]; 4020*12c85518Srobert let Subjects = SubjectList<[ParmVar, GlobalVar]>; 4021*12c85518Srobert let LangOpts = [HLSL]; 4022*12c85518Srobert let Documentation = [HLSLSV_GroupIndexDocs]; 4023*12c85518Srobert} 4024*12c85518Srobert 4025*12c85518Srobertdef HLSLResourceBinding: InheritableAttr { 4026*12c85518Srobert let Spellings = [HLSLSemantic<"register">]; 4027*12c85518Srobert let Subjects = SubjectList<[HLSLBufferObj, ExternalGlobalVar]>; 4028*12c85518Srobert let LangOpts = [HLSL]; 4029*12c85518Srobert let Args = [StringArgument<"Slot">, StringArgument<"Space", 1>]; 4030*12c85518Srobert let Documentation = [HLSLResourceBindingDocs]; 4031*12c85518Srobert} 4032*12c85518Srobert 4033*12c85518Srobertdef HLSLSV_DispatchThreadID: HLSLAnnotationAttr { 4034*12c85518Srobert let Spellings = [HLSLSemantic<"SV_DispatchThreadID">]; 4035*12c85518Srobert let Subjects = SubjectList<[ParmVar, Field]>; 4036*12c85518Srobert let LangOpts = [HLSL]; 4037*12c85518Srobert let Documentation = [HLSLSV_DispatchThreadIDDocs]; 4038*12c85518Srobert} 4039*12c85518Srobert 4040*12c85518Srobertdef HLSLShader : InheritableAttr { 4041*12c85518Srobert let Spellings = [Microsoft<"shader">]; 4042*12c85518Srobert let Subjects = SubjectList<[HLSLEntry]>; 4043*12c85518Srobert let LangOpts = [HLSL]; 4044*12c85518Srobert // NOTE: 4045*12c85518Srobert // order for the enum should match order in llvm::Triple::EnvironmentType. 4046*12c85518Srobert // ShaderType will be converted to llvm::Triple::EnvironmentType like 4047*12c85518Srobert // (llvm::Triple::EnvironmentType)((uint32_t)ShaderType + 4048*12c85518Srobert // (uint32_t)llvm::Triple::EnvironmentType::Pixel). 4049*12c85518Srobert // This will avoid update code for convert when new shader type is added. 4050*12c85518Srobert let Args = [ 4051*12c85518Srobert EnumArgument<"Type", "ShaderType", 4052*12c85518Srobert [ 4053*12c85518Srobert "pixel", "vertex", "geometry", "hull", "domain", "compute", 4054*12c85518Srobert "library", "raygeneration", "intersection", "anyHit", 4055*12c85518Srobert "closestHit", "miss", "callable", "mesh", "amplification" 4056*12c85518Srobert ], 4057*12c85518Srobert [ 4058*12c85518Srobert "Pixel", "Vertex", "Geometry", "Hull", "Domain", "Compute", 4059*12c85518Srobert "Library", "RayGeneration", "Intersection", "AnyHit", 4060*12c85518Srobert "ClosestHit", "Miss", "Callable", "Mesh", "Amplification" 4061*12c85518Srobert ]> 4062*12c85518Srobert ]; 4063*12c85518Srobert let Documentation = [HLSLSV_ShaderTypeAttrDocs]; 4064*12c85518Srobert} 4065*12c85518Srobert 4066*12c85518Srobertdef HLSLResource : InheritableAttr { 4067*12c85518Srobert let Spellings = []; 4068*12c85518Srobert let Subjects = SubjectList<[Struct]>; 4069*12c85518Srobert let LangOpts = [HLSL]; 4070*12c85518Srobert let Args = [EnumArgument<"ResourceType", "ResourceClass", 4071*12c85518Srobert ["SRV", "UAV", "CBuffer", "Sampler"], 4072*12c85518Srobert ["SRV", "UAV", "CBuffer", "Sampler"] 4073*12c85518Srobert >, 4074*12c85518Srobert EnumArgument<"ResourceShape", "ResourceKind", 4075*12c85518Srobert ["Texture1D", "Texture2D", "Texture2DMS", 4076*12c85518Srobert "Texture3D", "TextureCube", "Texture1DArray", 4077*12c85518Srobert "Texture2DArray", "Texture2DMSArray", 4078*12c85518Srobert "TextureCubeArray", "TypedBuffer", "RawBuffer", 4079*12c85518Srobert "StructuredBuffer", "CBufferKind", "SamplerKind", 4080*12c85518Srobert "TBuffer", "RTAccelerationStructure", "FeedbackTexture2D", 4081*12c85518Srobert "FeedbackTexture2DArray"], 4082*12c85518Srobert ["Texture1D", "Texture2D", "Texture2DMS", 4083*12c85518Srobert "Texture3D", "TextureCube", "Texture1DArray", 4084*12c85518Srobert "Texture2DArray", "Texture2DMSArray", 4085*12c85518Srobert "TextureCubeArray", "TypedBuffer", "RawBuffer", 4086*12c85518Srobert "StructuredBuffer", "CBufferKind", "SamplerKind", 4087*12c85518Srobert "TBuffer", "RTAccelerationStructure", "FeedbackTexture2D", 4088*12c85518Srobert "FeedbackTexture2DArray"] 4089*12c85518Srobert > 4090*12c85518Srobert ]; 4091*12c85518Srobert let Documentation = [InternalOnly]; 4092*12c85518Srobert} 4093*12c85518Srobert 4094*12c85518Srobertdef HLSLGroupSharedAddressSpace : TypeAttr { 4095*12c85518Srobert let Spellings = [Keyword<"groupshared">]; 4096*12c85518Srobert let Subjects = SubjectList<[Var]>; 4097*12c85518Srobert let Documentation = [HLSLGroupSharedAddressSpaceDocs]; 4098*12c85518Srobert} 4099*12c85518Srobert 4100*12c85518Srobertdef RandomizeLayout : InheritableAttr { 4101*12c85518Srobert let Spellings = [GCC<"randomize_layout">]; 4102*12c85518Srobert let Subjects = SubjectList<[Record]>; 4103*12c85518Srobert let Documentation = [ClangRandomizeLayoutDocs]; 4104*12c85518Srobert let LangOpts = [COnly]; 4105*12c85518Srobert} 4106*12c85518Srobert 4107*12c85518Srobertdef NoRandomizeLayout : InheritableAttr { 4108*12c85518Srobert let Spellings = [GCC<"no_randomize_layout">]; 4109*12c85518Srobert let Subjects = SubjectList<[Record]>; 4110*12c85518Srobert let Documentation = [ClangRandomizeLayoutDocs]; 4111*12c85518Srobert let LangOpts = [COnly]; 4112*12c85518Srobert} 4113*12c85518Srobertdef : MutualExclusions<[RandomizeLayout, NoRandomizeLayout]>; 4114*12c85518Srobert 4115*12c85518Srobertdef FunctionReturnThunks : InheritableAttr, 4116*12c85518Srobert TargetSpecificAttr<TargetAnyX86> { 4117*12c85518Srobert let Spellings = [GCC<"function_return">]; 4118*12c85518Srobert let Args = [EnumArgument<"ThunkType", "Kind", 4119*12c85518Srobert ["keep", "thunk-extern"], 4120*12c85518Srobert ["Keep", "Extern"] 4121*12c85518Srobert >]; 4122*12c85518Srobert let Subjects = SubjectList<[Function]>; 4123*12c85518Srobert let Documentation = [FunctionReturnThunksDocs]; 4124*12c85518Srobert} 4125*12c85518Srobertdef ReadOnlyPlacement : InheritableAttr { 4126*12c85518Srobert let Spellings = [Clang<"enforce_read_only_placement">]; 4127*12c85518Srobert let Subjects = SubjectList<[Record]>; 4128*12c85518Srobert let Documentation = [ReadOnlyPlacementDocs]; 4129*12c85518Srobert} 4130