@@ -1997,8 +1997,8 @@ struct CallObjCArcUse final : EHScopeStack::Cleanup {
19971997
19981998Value *CodeGenFunction::EmitCheckedArgForBuiltin(const Expr *E,
19991999                                                 BuiltinCheckKind Kind) {
2000-   assert((Kind == BCK_CLZPassedZero || Kind == BCK_CTZPassedZero)
2001-           &&  "Unsupported builtin check kind");
2000+   assert((Kind == BCK_CLZPassedZero || Kind == BCK_CTZPassedZero) && 
2001+          "Unsupported builtin check kind");
20022002
20032003  Value *ArgValue = EmitScalarExpr(E);
20042004  if (!SanOpts.has(SanitizerKind::Builtin))
@@ -2015,6 +2015,21 @@ Value *CodeGenFunction::EmitCheckedArgForBuiltin(const Expr *E,
20152015  return ArgValue;
20162016}
20172017
2018+ Value *CodeGenFunction::EmitCheckedArgForAssume(const Expr *E) {
2019+   Value *ArgValue = EvaluateExprAsBool(E);
2020+   if (!SanOpts.has(SanitizerKind::Builtin))
2021+     return ArgValue;
2022+ 
2023+   SanitizerScope SanScope(this);
2024+   EmitCheck(
2025+       std::make_pair(ArgValue, SanitizerKind::Builtin),
2026+       SanitizerHandler::InvalidBuiltin,
2027+       {EmitCheckSourceLocation(E->getExprLoc()),
2028+        llvm::ConstantInt::get(Builder.getInt8Ty(), BCK_AssumePassedFalse)},
2029+       std::nullopt);
2030+   return ArgValue;
2031+ }
2032+ 
20182033static Value *EmitAbs(CodeGenFunction &CGF, Value *ArgValue, bool HasNSW) {
20192034  return CGF.Builder.CreateBinaryIntrinsic(
20202035      Intrinsic::abs, ArgValue,
@@ -3428,7 +3443,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
34283443    if (E->getArg(0)->HasSideEffects(getContext()))
34293444      return RValue::get(nullptr);
34303445
3431-     Value *ArgValue = EmitScalarExpr (E->getArg(0));
3446+     Value *ArgValue = EmitCheckedArgForAssume (E->getArg(0));
34323447    Function *FnAssume = CGM.getIntrinsic(Intrinsic::assume);
34333448    Builder.CreateCall(FnAssume, ArgValue);
34343449    return RValue::get(nullptr);
0 commit comments