[cfe-commits] r146562 - in /cfe/trunk: include/clang/Sema/Sema.h lib/Sema/SemaChecking.cpp
Alexander Potapenko
glider at google.com
Fri Dec 16 03:34:27 PST 2011
Hi Matt,
I believe this change caused http://llvm.org/bugs/show_bug.cgi?id=11594
On Wed, Dec 14, 2011 at 8:02 PM, Matt Beaumont-Gay <matthewbg at google.com> wrote:
> Author: matthewbg
> Date: Wed Dec 14 10:02:15 2011
> New Revision: 146562
>
> URL: http://llvm.org/viewvc/llvm-project?rev=146562&view=rev
> Log:
> r146430 lost some compile-time performance on MultiSource/Benchmarks/MiBench/security-rijndael; this gets most of it back.
>
> Modified:
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/lib/Sema/SemaChecking.cpp
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=146562&r1=146561&r2=146562&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Wed Dec 14 10:02:15 2011
> @@ -6190,7 +6190,8 @@
>
> private:
> void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
> - bool isSubscript=false, bool AllowOnePastEnd=true);
> + const ArraySubscriptExpr *ASE=0,
> + bool AllowOnePastEnd=true);
> void CheckArrayAccess(const Expr *E);
> bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall);
> bool CheckBlockCall(NamedDecl *NDecl, CallExpr *TheCall);
>
> Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=146562&r1=146561&r2=146562&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Dec 14 10:02:15 2011
> @@ -4274,20 +4274,21 @@
> }
>
> void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
> - bool isSubscript, bool AllowOnePastEnd) {
> - const Type *EffectiveType = getElementType(BaseExpr);
> - BaseExpr = BaseExpr->IgnoreParenCasts();
> + const ArraySubscriptExpr *ASE,
> + bool AllowOnePastEnd) {
> IndexExpr = IndexExpr->IgnoreParenCasts();
> + if (IndexExpr->isValueDependent())
> + return;
>
> + const Type *EffectiveType = getElementType(BaseExpr);
> + BaseExpr = BaseExpr->IgnoreParenCasts();
> const ConstantArrayType *ArrayTy =
> Context.getAsConstantArrayType(BaseExpr->getType());
> if (!ArrayTy)
> return;
>
> - if (IndexExpr->isValueDependent())
> - return;
> llvm::APSInt index;
> - if (!IndexExpr->isIntegerConstantExpr(index, Context))
> + if (!IndexExpr->EvaluateAsInt(index, Context))
> return;
>
> const NamedDecl *ND = NULL;
> @@ -4336,8 +4337,22 @@
> if (IsTailPaddedMemberArray(*this, size, ND))
> return;
>
> + // Suppress the warning if the subscript expression (as identified by the
> + // ']' location) and the index expression are both from macro expansions
> + // within a system header.
> + if (ASE) {
> + SourceLocation RBracketLoc = SourceMgr.getSpellingLoc(
> + ASE->getRBracketLoc());
> + if (SourceMgr.isInSystemHeader(RBracketLoc)) {
> + SourceLocation IndexLoc = SourceMgr.getSpellingLoc(
> + IndexExpr->getLocStart());
> + if (SourceMgr.isFromSameFile(RBracketLoc, IndexLoc))
> + return;
> + }
> + }
> +
> unsigned DiagID = diag::warn_ptr_arith_exceeds_bounds;
> - if (isSubscript)
> + if (ASE)
> DiagID = diag::warn_array_index_exceeds_bounds;
>
> DiagRuntimeBehavior(BaseExpr->getLocStart(), BaseExpr,
> @@ -4347,7 +4362,7 @@
> << IndexExpr->getSourceRange());
> } else {
> unsigned DiagID = diag::warn_array_index_precedes_bounds;
> - if (!isSubscript) {
> + if (!ASE) {
> DiagID = diag::warn_ptr_arith_precedes_bounds;
> if (index.isNegative()) index = -index;
> }
> @@ -4381,17 +4396,7 @@
> switch (expr->getStmtClass()) {
> case Stmt::ArraySubscriptExprClass: {
> const ArraySubscriptExpr *ASE = cast<ArraySubscriptExpr>(expr);
> - // Suppress the warning if the subscript expression (as identified by
> - // the ']' location) and the index expression are both from macro
> - // expansions within a system header.
> - SourceLocation RBracketLoc = SourceMgr.getSpellingLoc(
> - ASE->getRBracketLoc());
> - SourceLocation IndexLoc = SourceMgr.getSpellingLoc(
> - ASE->getIdx()->IgnoreParens()->getLocStart());
> - if (SourceMgr.isFromSameFile(RBracketLoc, IndexLoc) &&
> - SourceMgr.isInSystemHeader(RBracketLoc))
> - return;
> - CheckArrayAccess(ASE->getBase(), ASE->getIdx(), true,
> + CheckArrayAccess(ASE->getBase(), ASE->getIdx(), ASE,
> AllowOnePastEnd > 0);
> return;
> }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
--
Alexander Potapenko
Software Engineer
Google Moscow
More information about the cfe-commits
mailing list