summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorYonghong Song <yhs@fb.com>2019-11-14 10:34:35 -0800
committerYonghong Song <yhs@fb.com>2019-11-14 14:14:59 -0800
commitdd16b3fe2559789adcdd7d4d0bfe2796897877a3 (patch)
treeece35fafbf86571a7e9f586d157cb4b928804874 /clang/lib/CodeGen
parent4c39f341996cea2fd8619fc14c8c66ab567744fb (diff)
downloadbcm5719-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.cpp43
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;
OpenPOWER on IntegriCloud