From b382003f3a94d5d5d01b5b93c8c17c941444a760 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Mon, 2 Dec 2013 15:02:49 +0000 Subject: [PATCH] Replacing custom subject application logic with table-generated logic. Affects: guarded_var, pt_guarded_var, guarded_by, pt_guarded_by, acquired_after and acquired_before. No functional change intended. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196105 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/Attr.td | 21 ++++++++++---- lib/Sema/SemaDeclAttr.cpp | 55 ++----------------------------------- 2 files changed, 17 insertions(+), 59 deletions(-) diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index 71a73328a7..e947b8ebfd 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -46,6 +46,9 @@ def Struct : SubsetSubjectgetTLSKind() != 0}]>; +def SharedVar : SubsetSubjecthasGlobalStorage() && !S->getTLSKind()}]>; + // A single argument to an attribute class Argument { string Name = name; @@ -910,12 +913,14 @@ def NoSanitizeMemory : InheritableAttr { def GuardedVar : InheritableAttr { let Spellings = [GNU<"guarded_var">]; - let Subjects = SubjectList<[Field, Var]>; + let Subjects = SubjectList<[Field, SharedVar], WarnDiag, + "ExpectedFieldOrGlobalVar">; } def PtGuardedVar : InheritableAttr { let Spellings = [GNU<"pt_guarded_var">]; - let Subjects = SubjectList<[Field, Var]>; + let Subjects = SubjectList<[Field, SharedVar], WarnDiag, + "ExpectedFieldOrGlobalVar">; } def Lockable : InheritableAttr { @@ -938,7 +943,8 @@ def GuardedBy : InheritableAttr { let Args = [ExprArgument<"Arg">]; let LateParsed = 1; let TemplateDependent = 1; - let Subjects = SubjectList<[Field, Var]>; + let Subjects = SubjectList<[Field, SharedVar], WarnDiag, + "ExpectedFieldOrGlobalVar">; } def PtGuardedBy : InheritableAttr { @@ -946,7 +952,8 @@ def PtGuardedBy : InheritableAttr { let Args = [ExprArgument<"Arg">]; let LateParsed = 1; let TemplateDependent = 1; - let Subjects = SubjectList<[Field, Var]>; + let Subjects = SubjectList<[Field, SharedVar], WarnDiag, + "ExpectedFieldOrGlobalVar">; } def AcquiredAfter : InheritableAttr { @@ -954,7 +961,8 @@ def AcquiredAfter : InheritableAttr { let Args = [VariadicExprArgument<"Args">]; let LateParsed = 1; let TemplateDependent = 1; - let Subjects = SubjectList<[Field, Var]>; + let Subjects = SubjectList<[Field, SharedVar], WarnDiag, + "ExpectedFieldOrGlobalVar">; } def AcquiredBefore : InheritableAttr { @@ -962,7 +970,8 @@ def AcquiredBefore : InheritableAttr { let Args = [VariadicExprArgument<"Args">]; let LateParsed = 1; let TemplateDependent = 1; - let Subjects = SubjectList<[Field, Var]>; + let Subjects = SubjectList<[Field, SharedVar], WarnDiag, + "ExpectedFieldOrGlobalVar">; } def ExclusiveLockFunction : InheritableAttr { diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 7c5e066cc9..9f34fa9498 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -337,17 +337,6 @@ static void handleSimpleAttribute(Sema &S, Decl *D, Attr.getAttributeSpellingListIndex())); } -/// -/// \brief Check if passed in Decl is a field or potentially shared global var -/// \return true if the Decl is a field or potentially shared global variable -/// -static bool mayBeSharedVariable(const Decl *D) { - if (const VarDecl *vd = dyn_cast(D)) - return vd->hasGlobalStorage() && !vd->getTLSKind(); - - return true; -} - /// \brief Check if the passed-in expression is of type int or bool. static bool isIntOrBool(Expr *Exp) { QualType QT = Exp->getType(); @@ -543,32 +532,8 @@ static void checkAttrArgsAreLockableObjs(Sema &S, Decl *D, // least add some helper functions to check most argument patterns (# // and types of args). -static bool checkGuardedVarAttrCommon(Sema &S, Decl *D, - const AttributeList &Attr) { - // D must be either a member field or global (potentially shared) variable. - if (!mayBeSharedVariable(D)) { - S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) - << Attr.getName() << ExpectedFieldOrGlobalVar; - return false; - } - - return true; -} - -static void handleGuardedVarAttr(Sema &S, Decl *D, const AttributeList &Attr) { - if (!checkGuardedVarAttrCommon(S, D, Attr)) - return; - - D->addAttr(::new (S.Context) - GuardedVarAttr(Attr.getRange(), S.Context, - Attr.getAttributeSpellingListIndex())); -} - static void handlePtGuardedVarAttr(Sema &S, Decl *D, const AttributeList &Attr) { - if (!checkGuardedVarAttrCommon(S, D, Attr)) - return; - if (!threadSafetyCheckIsPointer(S, D, Attr)) return; @@ -580,13 +545,6 @@ static void handlePtGuardedVarAttr(Sema &S, Decl *D, static bool checkGuardedByAttrCommon(Sema &S, Decl *D, const AttributeList &Attr, Expr* &Arg) { - // D must be either a member field or global (potentially shared) variable. - if (!mayBeSharedVariable(D)) { - S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) - << Attr.getName() << ExpectedFieldOrGlobalVar; - return false; - } - SmallVector Args; // check that all arguments are lockable objects checkAttrArgsAreLockableObjs(S, D, Attr, Args); @@ -626,16 +584,8 @@ static bool checkAcquireOrderAttrCommon(Sema &S, Decl *D, if (!checkAttributeAtLeastNumArgs(S, Attr, 1)) return false; - // D must be either a member field or global (potentially shared) variable. - ValueDecl *VD = dyn_cast(D); - if (!VD || !mayBeSharedVariable(D)) { - S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) - << Attr.getName() << ExpectedFieldOrGlobalVar; - return false; - } - // Check that this attribute only applies to lockable types. - QualType QT = VD->getType(); + QualType QT = cast(D)->getType(); if (!QT->isDependentType()) { const RecordType *RT = getRecordType(QT); if (!RT || !RT->getDecl()->getAttr()) { @@ -4302,8 +4252,7 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, handleAssertSharedLockAttr(S, D, Attr); break; case AttributeList::AT_GuardedVar: - handleGuardedVarAttr(S, D, Attr); - break; + handleSimpleAttribute(S, D, Attr); break; case AttributeList::AT_PtGuardedVar: handlePtGuardedVarAttr(S, D, Attr); break; -- 2.40.0