diff options
author | Yonghong Song <yhs@fb.com> | 2019-11-14 10:34:35 -0800 |
---|---|---|
committer | Yonghong Song <yhs@fb.com> | 2019-11-14 14:14:59 -0800 |
commit | dd16b3fe2559789adcdd7d4d0bfe2796897877a3 (patch) | |
tree | ece35fafbf86571a7e9f586d157cb4b928804874 /clang/lib/CodeGen | |
parent | 4c39f341996cea2fd8619fc14c8c66ab567744fb (diff) | |
download | bcm5719-llvm-dd16b3fe2559789adcdd7d4d0bfe2796897877a3.tar.gz bcm5719-llvm-dd16b3fe2559789adcdd7d4d0bfe2796897877a3.zip |
[BPF] Restrict preserve_access_index attribute to C only
This patch is a follow-up for commit 4e2ce228ae79
[BPF] Add preserve_access_index attribute for record definition
to restrict attribute for C only. A new test case is added
to check for this restriction.
Additional code polishing is done based on
Aaron Ballman's suggestion in https://reviews.llvm.org/D69759/new/.
Differential Revision: https://reviews.llvm.org/D70257
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 43 |
1 files changed, 12 insertions, 31 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index e32db8c56df..384e8f72a61 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -3408,10 +3408,6 @@ static bool IsPreserveAIArrayBase(CodeGenFunction &CGF, const Expr *ArrayBase) { 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 @@ static bool IsPreserveAIArrayBase(CodeGenFunction &CGF, const Expr *ArrayBase) { // 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; |