[llvm-branch-commits] Extract EmitCheckedArgForAssume (PR #109880)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Sep 24 16:02:31 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-codegen
Author: Vitaly Buka (vitalybuka)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/109880.diff
3 Files Affected:
- (modified) clang/lib/CodeGen/CGBuiltin.cpp (+21-12)
- (modified) clang/lib/CodeGen/CGStmt.cpp (+1-2)
- (modified) clang/lib/CodeGen/CodeGenFunction.h (+4)
``````````diff
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 83da5d7d75be3b..bf68841c4bc7ed 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -1996,21 +1996,16 @@ struct CallObjCArcUse final : EHScopeStack::Cleanup {
Value *CodeGenFunction::EmitCheckedArgForBuiltin(const Expr *E,
BuiltinCheckKind Kind) {
- assert((Kind == BCK_CLZPassedZero || Kind == BCK_CTZPassedZero ||
- Kind == BCK_AssumePassedFalse) &&
- "Unsupported builtin check kind");
+ assert((Kind == BCK_CLZPassedZero || Kind == BCK_CTZPassedZero)
+ && "Unsupported builtin check kind");
- Value *ArgValue =
- Kind == BCK_AssumePassedFalse ? EvaluateExprAsBool(E) : EmitScalarExpr(E);
+ Value *ArgValue = EmitScalarExpr(E);
if (!SanOpts.has(SanitizerKind::Builtin))
return ArgValue;
SanitizerScope SanScope(this);
- Value *Cond =
- Kind == BCK_AssumePassedFalse
- ? ArgValue
- : Builder.CreateICmpNE(
- ArgValue, llvm::Constant::getNullValue(ArgValue->getType()));
+ Value *Cond = Builder.CreateICmpNE(
+ ArgValue, llvm::Constant::getNullValue(ArgValue->getType()));
EmitCheck(std::make_pair(Cond, SanitizerKind::Builtin),
SanitizerHandler::InvalidBuiltin,
{EmitCheckSourceLocation(E->getExprLoc()),
@@ -2019,6 +2014,21 @@ Value *CodeGenFunction::EmitCheckedArgForBuiltin(const Expr *E,
return ArgValue;
}
+Value *CodeGenFunction::EmitCheckedArgForAssume(const Expr *E) {
+ Value *ArgValue = EvaluateExprAsBool(E);
+ if (!SanOpts.has(SanitizerKind::Builtin))
+ return ArgValue;
+
+ SanitizerScope SanScope(this);
+ EmitCheck(
+ std::make_pair(ArgValue, SanitizerKind::Builtin),
+ SanitizerHandler::InvalidBuiltin,
+ {EmitCheckSourceLocation(E->getExprLoc()),
+ llvm::ConstantInt::get(Builder.getInt8Ty(), BCK_AssumePassedFalse)},
+ std::nullopt);
+ return ArgValue;
+}
+
static Value *EmitAbs(CodeGenFunction &CGF, Value *ArgValue, bool HasNSW) {
return CGF.Builder.CreateBinaryIntrinsic(
Intrinsic::abs, ArgValue,
@@ -3429,8 +3439,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
if (E->getArg(0)->HasSideEffects(getContext()))
return RValue::get(nullptr);
- Value *ArgValue =
- EmitCheckedArgForBuiltin(E->getArg(0), BCK_AssumePassedFalse);
+ Value *ArgValue = EmitCheckedArgForAssume(E->getArg(0));
Function *FnAssume = CGM.getIntrinsic(Intrinsic::assume);
Builder.CreateCall(FnAssume, ArgValue);
return RValue::get(nullptr);
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index 291639346d8952..f4ecc01598f936 100644
--- a/clang/lib/CodeGen/CGStmt.cpp
+++ b/clang/lib/CodeGen/CGStmt.cpp
@@ -754,8 +754,7 @@ void CodeGenFunction::EmitAttributedStmt(const AttributedStmt &S) {
const Expr *Assumption = cast<CXXAssumeAttr>(A)->getAssumption();
if (getLangOpts().CXXAssumptions &&
!Assumption->HasSideEffects(getContext())) {
- llvm::Value *AssumptionVal =
- EmitCheckedArgForBuiltin(Assumption, BCK_AssumePassedFalse);
+ llvm::Value *AssumptionVal = EmitCheckedArgForAssume(Assumption);
Builder.CreateAssumption(AssumptionVal);
}
} break;
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index 99db330f3316e5..04dfaffd811c02 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -5077,6 +5077,10 @@ class CodeGenFunction : public CodeGenTypeCache {
/// enabled, a runtime check specified by \p Kind is also emitted.
llvm::Value *EmitCheckedArgForBuiltin(const Expr *E, BuiltinCheckKind Kind);
+ /// Emits an argument for a call to a `__builtin_assume`. If the builtin
+ /// sanitizer is enabled, a runtime check is also emitted.
+ llvm::Value *EmitCheckedArgForAssume(const Expr *E);
+
/// Emit a description of a type in a format suitable for passing to
/// a runtime sanitizer handler.
llvm::Constant *EmitCheckTypeDescriptor(QualType T);
``````````
</details>
https://github.com/llvm/llvm-project/pull/109880
More information about the llvm-branch-commits
mailing list