This revision was automatically updated to reflect the committed changes. Closed by commit rGdd16b3fe2559: [BPF] Restrict preserve_access_index attribute to C only (authored by yonghong-song).
Changed prior to commit: https://reviews.llvm.org/D70257?vs=229355&id=229406#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D70257/new/ https://reviews.llvm.org/D70257 Files: clang/include/clang/Basic/Attr.td clang/lib/CodeGen/CGExpr.cpp clang/test/Sema/bpf-attr-preserve-access-index.cpp Index: clang/test/Sema/bpf-attr-preserve-access-index.cpp =================================================================== --- /dev/null +++ clang/test/Sema/bpf-attr-preserve-access-index.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -x c++ -triple bpf-pc-linux-gnu -dwarf-version=4 -fsyntax-only -verify %s + +#define __reloc__ __attribute__((preserve_access_index)) + +struct t1 { + int a; + int b[4]; + int c:1; +} __reloc__; // expected-warning {{'preserve_access_index' attribute ignored}} Index: clang/lib/CodeGen/CGExpr.cpp =================================================================== --- clang/lib/CodeGen/CGExpr.cpp +++ clang/lib/CodeGen/CGExpr.cpp @@ -3408,10 +3408,6 @@ if (!ArrayBase || !CGF.getDebugInfo()) return false; - const auto *ImplicitCast = dyn_cast<ImplicitCastExpr>(ArrayBase); - if (!ImplicitCast) - return false; - // Only support base as either a MemberExpr or DeclRefExpr. // DeclRefExpr to cover cases like: // struct s { int a; int b[10]; }; @@ -3419,39 +3415,24 @@ // p[1].a // p[1] will generate a DeclRefExpr and p[1].a is a MemberExpr. // p->b[5] is a MemberExpr example. - const Expr *E = ImplicitCast->getSubExpr(); - const auto *MemberCast = dyn_cast<MemberExpr>(E); - if (MemberCast) - return MemberCast->getMemberDecl()->hasAttr<BPFPreserveAccessIndexAttr>(); - - const auto *DeclRefCast = dyn_cast<DeclRefExpr>(E); - if (DeclRefCast) { - const VarDecl *VarDef = dyn_cast<VarDecl>(DeclRefCast->getDecl()); + const Expr *E = ArrayBase->IgnoreImpCasts(); + if (const auto *ME = dyn_cast<MemberExpr>(E)) + return ME->getMemberDecl()->hasAttr<BPFPreserveAccessIndexAttr>(); + + if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) { + const auto *VarDef = dyn_cast<VarDecl>(DRE->getDecl()); if (!VarDef) return false; - const auto *PtrT = dyn_cast<PointerType>(VarDef->getType().getTypePtr()); + const auto *PtrT = VarDef->getType()->getAs<PointerType>(); if (!PtrT) return false; - const auto *PointeeT = PtrT->getPointeeType().getTypePtr(); - - // Peel off typedef's - const auto *TypedefT = dyn_cast<TypedefType>(PointeeT); - while (TypedefT) { - PointeeT = TypedefT->desugar().getTypePtr(); - TypedefT = dyn_cast<TypedefType>(PointeeT); - } - - // Not a typedef any more, it should be an elaborated type. - const auto ElaborateT = dyn_cast<ElaboratedType>(PointeeT); - if (!ElaborateT) - return false; - const auto *RecT = dyn_cast<RecordType>(ElaborateT->desugar().getTypePtr()); - if (!RecT) - return false; - - return RecT->getDecl()->hasAttr<BPFPreserveAccessIndexAttr>(); + const auto *PointeeT = PtrT->getPointeeType() + ->getUnqualifiedDesugaredType(); + if (const auto *RecT = dyn_cast<RecordType>(PointeeT)) + return RecT->getDecl()->hasAttr<BPFPreserveAccessIndexAttr>(); + return false; } return false; Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -1584,6 +1584,7 @@ let Spellings = [Clang<"preserve_access_index">]; let Subjects = SubjectList<[Record], ErrorDiag>; let Documentation = [BPFPreserveAccessIndexDocs]; + let LangOpts = [COnly]; } def WebAssemblyImportModule : InheritableAttr,
Index: clang/test/Sema/bpf-attr-preserve-access-index.cpp =================================================================== --- /dev/null +++ clang/test/Sema/bpf-attr-preserve-access-index.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -x c++ -triple bpf-pc-linux-gnu -dwarf-version=4 -fsyntax-only -verify %s + +#define __reloc__ __attribute__((preserve_access_index)) + +struct t1 { + int a; + int b[4]; + int c:1; +} __reloc__; // expected-warning {{'preserve_access_index' attribute ignored}} Index: clang/lib/CodeGen/CGExpr.cpp =================================================================== --- clang/lib/CodeGen/CGExpr.cpp +++ clang/lib/CodeGen/CGExpr.cpp @@ -3408,10 +3408,6 @@ if (!ArrayBase || !CGF.getDebugInfo()) return false; - const auto *ImplicitCast = dyn_cast<ImplicitCastExpr>(ArrayBase); - if (!ImplicitCast) - return false; - // Only support base as either a MemberExpr or DeclRefExpr. // DeclRefExpr to cover cases like: // struct s { int a; int b[10]; }; @@ -3419,39 +3415,24 @@ // p[1].a // p[1] will generate a DeclRefExpr and p[1].a is a MemberExpr. // p->b[5] is a MemberExpr example. - const Expr *E = ImplicitCast->getSubExpr(); - const auto *MemberCast = dyn_cast<MemberExpr>(E); - if (MemberCast) - return MemberCast->getMemberDecl()->hasAttr<BPFPreserveAccessIndexAttr>(); - - const auto *DeclRefCast = dyn_cast<DeclRefExpr>(E); - if (DeclRefCast) { - const VarDecl *VarDef = dyn_cast<VarDecl>(DeclRefCast->getDecl()); + const Expr *E = ArrayBase->IgnoreImpCasts(); + if (const auto *ME = dyn_cast<MemberExpr>(E)) + return ME->getMemberDecl()->hasAttr<BPFPreserveAccessIndexAttr>(); + + if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) { + const auto *VarDef = dyn_cast<VarDecl>(DRE->getDecl()); if (!VarDef) return false; - const auto *PtrT = dyn_cast<PointerType>(VarDef->getType().getTypePtr()); + const auto *PtrT = VarDef->getType()->getAs<PointerType>(); if (!PtrT) return false; - const auto *PointeeT = PtrT->getPointeeType().getTypePtr(); - - // Peel off typedef's - const auto *TypedefT = dyn_cast<TypedefType>(PointeeT); - while (TypedefT) { - PointeeT = TypedefT->desugar().getTypePtr(); - TypedefT = dyn_cast<TypedefType>(PointeeT); - } - - // Not a typedef any more, it should be an elaborated type. - const auto ElaborateT = dyn_cast<ElaboratedType>(PointeeT); - if (!ElaborateT) - return false; - const auto *RecT = dyn_cast<RecordType>(ElaborateT->desugar().getTypePtr()); - if (!RecT) - return false; - - return RecT->getDecl()->hasAttr<BPFPreserveAccessIndexAttr>(); + const auto *PointeeT = PtrT->getPointeeType() + ->getUnqualifiedDesugaredType(); + if (const auto *RecT = dyn_cast<RecordType>(PointeeT)) + return RecT->getDecl()->hasAttr<BPFPreserveAccessIndexAttr>(); + return false; } return false; Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -1584,6 +1584,7 @@ let Spellings = [Clang<"preserve_access_index">]; let Subjects = SubjectList<[Record], ErrorDiag>; let Documentation = [BPFPreserveAccessIndexDocs]; + let LangOpts = [COnly]; } def WebAssemblyImportModule : InheritableAttr,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits