Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:Update
llvm.7809
backport-clang-r206364
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File backport-clang-r206364 of Package llvm.7809
------------------------------------------------------------------------ r206364 | rsandifo | 2014-04-16 10:47:51 +0200 (Wed, 16 Apr 2014) | 4 lines Sema: Factor out argument range checks for builtin functions No behavioural change intended. ------------------------------------------------------------------------ Index: tools/clang/include/clang/Sema/Sema.h =================================================================== --- tools/clang/include/clang/Sema/Sema.h.orig +++ tools/clang/include/clang/Sema/Sema.h @@ -7860,13 +7860,14 @@ public: private: bool SemaBuiltinPrefetch(CallExpr *TheCall); - bool SemaBuiltinObjectSize(CallExpr *TheCall); bool SemaBuiltinLongjmp(CallExpr *TheCall); ExprResult SemaBuiltinAtomicOverloaded(ExprResult TheCallResult); ExprResult SemaAtomicOpsOverloaded(ExprResult TheCallResult, AtomicExpr::AtomicOp Op); bool SemaBuiltinConstantArg(CallExpr *TheCall, int ArgNum, llvm::APSInt &Result); + bool SemaBuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, + int Low, int High); public: enum FormatStringType { Index: tools/clang/lib/Sema/SemaChecking.cpp =================================================================== --- tools/clang/lib/Sema/SemaChecking.cpp.orig +++ tools/clang/lib/Sema/SemaChecking.cpp @@ -175,7 +175,7 @@ Sema::CheckBuiltinFunctionCall(unsigned return ExprError(); break; case Builtin::BI__builtin_object_size: - if (SemaBuiltinObjectSize(TheCall)) + if (SemaBuiltinConstantArgRange(TheCall, 1, 0, 3)) return ExprError(); break; case Builtin::BI__builtin_longjmp: @@ -442,24 +442,8 @@ bool Sema::CheckAArch64BuiltinFunctionCa #include "clang/Basic/arm_neon.inc" #undef GET_NEON_AARCH64_IMMEDIATE_CHECK } - ; - // We can't check the value of a dependent argument. - if (TheCall->getArg(i)->isTypeDependent() || - TheCall->getArg(i)->isValueDependent()) - return false; - - // Check that the immediate argument is actually a constant. - if (SemaBuiltinConstantArg(TheCall, i, Result)) - return true; - - // Range check against the upper/lower values for this isntruction. - unsigned Val = Result.getZExtValue(); - if (Val < l || Val > (u + l)) - return Diag(TheCall->getLocStart(), diag::err_argument_invalid_range) - << l << u + l << TheCall->getArg(i)->getSourceRange(); - - return false; + return SemaBuiltinConstantArgRange(TheCall, i, l, u + l); } bool Sema::CheckARMBuiltinExclusiveCall(unsigned BuiltinID, CallExpr *TheCall) { @@ -633,25 +617,10 @@ bool Sema::CheckARMBuiltinFunctionCall(u #define GET_NEON_IMMEDIATE_CHECK #include "clang/Basic/arm_neon.inc" #undef GET_NEON_IMMEDIATE_CHECK - }; - - // We can't check the value of a dependent argument. - if (TheCall->getArg(i)->isTypeDependent() || - TheCall->getArg(i)->isValueDependent()) - return false; - - // Check that the immediate argument is actually a constant. - if (SemaBuiltinConstantArg(TheCall, i, Result)) - return true; - - // Range check against the upper/lower values for this isntruction. - unsigned Val = Result.getZExtValue(); - if (Val < l || Val > (u + l)) - return Diag(TheCall->getLocStart(), diag::err_argument_invalid_range) - << l << u+l << TheCall->getArg(i)->getSourceRange(); + } // FIXME: VFP Intrinsics should error if VFP not present. - return false; + return SemaBuiltinConstantArgRange(TheCall, i, l, u + l); } bool Sema::CheckMipsBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { @@ -665,25 +634,9 @@ bool Sema::CheckMipsBuiltinFunctionCall( case Mips::BI__builtin_mips_precr_sra_ph_w: i = 2; l = 0; u = 31; break; case Mips::BI__builtin_mips_precr_sra_r_ph_w: i = 2; l = 0; u = 31; break; case Mips::BI__builtin_mips_prepend: i = 2; l = 0; u = 31; break; - }; - - // We can't check the value of a dependent argument. - if (TheCall->getArg(i)->isTypeDependent() || - TheCall->getArg(i)->isValueDependent()) - return false; - - // Check that the immediate argument is actually a constant. - llvm::APSInt Result; - if (SemaBuiltinConstantArg(TheCall, i, Result)) - return true; - - // Range check against the upper/lower values for this instruction. - unsigned Val = Result.getZExtValue(); - if (Val < l || Val > u) - return Diag(TheCall->getLocStart(), diag::err_argument_invalid_range) - << l << u << TheCall->getArg(i)->getSourceRange(); + } - return false; + return SemaBuiltinConstantArgRange(TheCall, i, l, u); } /// Given a FunctionDecl's FormatAttr, attempts to populate the FomatStringInfo @@ -1873,31 +1826,10 @@ bool Sema::SemaBuiltinPrefetch(CallExpr // Argument 0 is checked for us and the remaining arguments must be // constant integers. - for (unsigned i = 1; i != NumArgs; ++i) { - Expr *Arg = TheCall->getArg(i); - - // We can't check the value of a dependent argument. - if (Arg->isTypeDependent() || Arg->isValueDependent()) - continue; - - llvm::APSInt Result; - if (SemaBuiltinConstantArg(TheCall, i, Result)) + for (unsigned i = 1; i != NumArgs; ++i) + if (SemaBuiltinConstantArgRange(TheCall, i, 0, i == 1 ? 1 : 3)) return true; - // FIXME: gcc issues a warning and rewrites these to 0. These - // seems especially odd for the third argument since the default - // is 3. - if (i == 1) { - if (Result.getLimitedValue() > 1) - return Diag(TheCall->getLocStart(), diag::err_argument_invalid_range) - << "0" << "1" << Arg->getSourceRange(); - } else { - if (Result.getLimitedValue() > 3) - return Diag(TheCall->getLocStart(), diag::err_argument_invalid_range) - << "0" << "3" << Arg->getSourceRange(); - } - } - return false; } @@ -1918,27 +1850,24 @@ bool Sema::SemaBuiltinConstantArg(CallEx return false; } -/// SemaBuiltinObjectSize - Handle __builtin_object_size(void *ptr, -/// int type). This simply type checks that type is one of the defined -/// constants (0-3). -// For compatibility check 0-3, llvm only handles 0 and 2. -bool Sema::SemaBuiltinObjectSize(CallExpr *TheCall) { +/// SemaBuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr +/// TheCall is a constant expression in the range [Low, High]. +bool Sema::SemaBuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, + int Low, int High) { llvm::APSInt Result; // We can't check the value of a dependent argument. - if (TheCall->getArg(1)->isTypeDependent() || - TheCall->getArg(1)->isValueDependent()) + Expr *Arg = TheCall->getArg(ArgNum); + if (Arg->isTypeDependent() || Arg->isValueDependent()) return false; // Check constant-ness first. - if (SemaBuiltinConstantArg(TheCall, 1, Result)) + if (SemaBuiltinConstantArg(TheCall, ArgNum, Result)) return true; - Expr *Arg = TheCall->getArg(1); - if (Result.getSExtValue() < 0 || Result.getSExtValue() > 3) { + if (Result.getSExtValue() < Low || Result.getSExtValue() > High) return Diag(TheCall->getLocStart(), diag::err_argument_invalid_range) - << "0" << "3" << SourceRange(Arg->getLocStart(), Arg->getLocEnd()); - } + << Low << High << Arg->getSourceRange(); return false; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor