diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Basic/Attributes.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Basic/Attributes.cpp | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/contrib/llvm-project/clang/lib/Basic/Attributes.cpp b/contrib/llvm-project/clang/lib/Basic/Attributes.cpp index 62eea9c59082..44a4f1890d39 100644 --- a/contrib/llvm-project/clang/lib/Basic/Attributes.cpp +++ b/contrib/llvm-project/clang/lib/Basic/Attributes.cpp @@ -1,16 +1,39 @@ +//===--- Attributes.cpp ---------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements the AttributeCommonInfo interface. +// +//===----------------------------------------------------------------------===// + #include "clang/Basic/Attributes.h" #include "clang/Basic/AttrSubjectMatchRules.h" -#include "clang/Basic/AttributeCommonInfo.h" #include "clang/Basic/IdentifierTable.h" -#include "llvm/ADT/StringSwitch.h" +#include "clang/Basic/LangOptions.h" +#include "clang/Basic/ParsedAttrInfo.h" +#include "clang/Basic/TargetInfo.h" + using namespace clang; -int clang::hasAttribute(AttrSyntax Syntax, const IdentifierInfo *Scope, - const IdentifierInfo *Attr, const TargetInfo &Target, - const LangOptions &LangOpts) { +static int hasAttributeImpl(AttributeCommonInfo::Syntax Syntax, StringRef Name, + StringRef ScopeName, const TargetInfo &Target, + const LangOptions &LangOpts) { + +#include "clang/Basic/AttrHasAttributeImpl.inc" + + return 0; +} + +int clang::hasAttribute(AttributeCommonInfo::Syntax Syntax, + const IdentifierInfo *Scope, const IdentifierInfo *Attr, + const TargetInfo &Target, const LangOptions &LangOpts) { StringRef Name = Attr->getName(); // Normalize the attribute name, __foo__ becomes foo. - if (Name.size() >= 4 && Name.startswith("__") && Name.endswith("__")) + if (Name.size() >= 4 && Name.starts_with("__") && Name.ends_with("__")) Name = Name.substr(2, Name.size() - 4); // Normalize the scope name, but only for gnu and clang attributes. @@ -24,11 +47,17 @@ int clang::hasAttribute(AttrSyntax Syntax, const IdentifierInfo *Scope, // attributes. We support those, but not through the typical attribute // machinery that goes through TableGen. We support this in all OpenMP modes // so long as double square brackets are enabled. - if (LangOpts.OpenMP && LangOpts.DoubleSquareBracketAttributes && - ScopeName == "omp") + if (LangOpts.OpenMP && ScopeName == "omp") return (Name == "directive" || Name == "sequence") ? 1 : 0; -#include "clang/Basic/AttrHasAttributeImpl.inc" + int res = hasAttributeImpl(Syntax, Name, ScopeName, Target, LangOpts); + if (res) + return res; + + // Check if any plugin provides this attribute. + for (auto &Ptr : getAttributePluginInstances()) + if (Ptr->hasSpelling(Syntax, Name)) + return 1; return 0; } @@ -53,7 +82,7 @@ normalizeAttrScopeName(const IdentifierInfo *Scope, // to be "clang". StringRef ScopeName = Scope->getName(); if (SyntaxUsed == AttributeCommonInfo::AS_CXX11 || - SyntaxUsed == AttributeCommonInfo::AS_C2x) { + SyntaxUsed == AttributeCommonInfo::AS_C23) { if (ScopeName == "__gnu__") ScopeName = "gnu"; else if (ScopeName == "_Clang") @@ -70,12 +99,12 @@ static StringRef normalizeAttrName(const IdentifierInfo *Name, bool ShouldNormalize = SyntaxUsed == AttributeCommonInfo::AS_GNU || ((SyntaxUsed == AttributeCommonInfo::AS_CXX11 || - SyntaxUsed == AttributeCommonInfo::AS_C2x) && + SyntaxUsed == AttributeCommonInfo::AS_C23) && (NormalizedScopeName.empty() || NormalizedScopeName == "gnu" || NormalizedScopeName == "clang")); StringRef AttrName = Name->getName(); - if (ShouldNormalize && AttrName.size() >= 4 && AttrName.startswith("__") && - AttrName.endswith("__")) + if (ShouldNormalize && AttrName.size() >= 4 && AttrName.starts_with("__") && + AttrName.ends_with("__")) AttrName = AttrName.slice(2, AttrName.size() - 2); return AttrName; @@ -85,6 +114,10 @@ bool AttributeCommonInfo::isGNUScope() const { return ScopeName && (ScopeName->isStr("gnu") || ScopeName->isStr("__gnu__")); } +bool AttributeCommonInfo::isClangScope() const { + return ScopeName && (ScopeName->isStr("clang") || ScopeName->isStr("_Clang")); +} + #include "clang/Sema/AttrParsedAttrKinds.inc" static SmallString<64> normalizeName(const IdentifierInfo *Name, @@ -96,7 +129,7 @@ static SmallString<64> normalizeName(const IdentifierInfo *Name, SmallString<64> FullName = ScopeName; if (!ScopeName.empty()) { assert(SyntaxUsed == AttributeCommonInfo::AS_CXX11 || - SyntaxUsed == AttributeCommonInfo::AS_C2x); + SyntaxUsed == AttributeCommonInfo::AS_C23); FullName += "::"; } FullName += AttrName; |