@@ -1972,7 +1972,7 @@ bool CodeGenFunction::EmitScalarRangeCheck(llvm::Value *Value, QualType Ty,
1972
1972
SanitizerKind::SanitizerOrdinal Kind =
1973
1973
NeedsEnumCheck ? SanitizerKind::SO_Enum : SanitizerKind::SO_Bool;
1974
1974
EmitCheck (std::make_pair (Check, Kind), SanitizerHandler::LoadInvalidValue,
1975
- StaticArgs, EmitCheckValue ( Value) );
1975
+ StaticArgs, Value);
1976
1976
return true ;
1977
1977
}
1978
1978
@@ -3462,7 +3462,8 @@ llvm::Constant *CodeGenFunction::EmitCheckTypeDescriptor(QualType T) {
3462
3462
return GV;
3463
3463
}
3464
3464
3465
- llvm::Value *CodeGenFunction::EmitCheckValue (llvm::Value *V) {
3465
+ llvm::Value *CodeGenFunction::EmitCheckValue (llvm::Value *V,
3466
+ bool &MayReadFromPtrToInt) {
3466
3467
llvm::Type *TargetTy = IntPtrTy;
3467
3468
3468
3469
if (V->getType () == TargetTy)
@@ -3488,6 +3489,7 @@ llvm::Value *CodeGenFunction::EmitCheckValue(llvm::Value *V) {
3488
3489
Builder.CreateStore (V, Ptr );
3489
3490
V = Ptr .getPointer ();
3490
3491
}
3492
+ MayReadFromPtrToInt = true ;
3491
3493
return Builder.CreatePtrToInt (V, TargetTy);
3492
3494
}
3493
3495
@@ -3593,7 +3595,8 @@ static void emitCheckHandlerCall(CodeGenFunction &CGF,
3593
3595
ArrayRef<llvm::Value *> FnArgs,
3594
3596
SanitizerHandler CheckHandler,
3595
3597
CheckRecoverableKind RecoverKind, bool IsFatal,
3596
- llvm::BasicBlock *ContBB, bool NoMerge) {
3598
+ llvm::BasicBlock *ContBB, bool NoMerge,
3599
+ bool MayReadFromPtrToInt) {
3597
3600
assert (IsFatal || RecoverKind != CheckRecoverableKind::Unrecoverable);
3598
3601
std::optional<ApplyDebugLocation> DL;
3599
3602
if (!CGF.Builder .getCurrentDebugLocation ()) {
@@ -3626,9 +3629,14 @@ static void emitCheckHandlerCall(CodeGenFunction &CGF,
3626
3629
if (CGF.CGM .getCodeGenOpts ().OptimizationLevel > 0 && MayReturn) {
3627
3630
// __ubsan_handle_dynamic_type_cache_miss reads the vtable, which is also
3628
3631
// accessible by the current module.
3629
- if (CheckHandler != SanitizerHandler::DynamicTypeCacheMiss)
3630
- B.addMemoryAttr (llvm::MemoryEffects::argMemOnly (llvm::ModRefInfo::Ref) |
3631
- llvm::MemoryEffects::inaccessibleMemOnly ());
3632
+ if (CheckHandler != SanitizerHandler::DynamicTypeCacheMiss) {
3633
+ llvm::MemoryEffects ME =
3634
+ llvm::MemoryEffects::argMemOnly (llvm::ModRefInfo::Ref) |
3635
+ llvm::MemoryEffects::inaccessibleMemOnly ();
3636
+ if (MayReadFromPtrToInt)
3637
+ ME |= llvm::MemoryEffects::readOnly ();
3638
+ B.addMemoryAttr (ME);
3639
+ }
3632
3640
// If the handler does not return, it must interact with the environment in
3633
3641
// an observable way.
3634
3642
B.addAttribute (llvm::Attribute::MustProgress);
@@ -3729,6 +3737,7 @@ void CodeGenFunction::EmitCheck(
3729
3737
// representing operand values.
3730
3738
SmallVector<llvm::Value *, 4 > Args;
3731
3739
SmallVector<llvm::Type *, 4 > ArgTypes;
3740
+ bool MayReadFromPtrToInt = false ;
3732
3741
if (!CGM.getCodeGenOpts ().SanitizeMinimalRuntime ) {
3733
3742
Args.reserve (DynamicArgs.size () + 1 );
3734
3743
ArgTypes.reserve (DynamicArgs.size () + 1 );
@@ -3748,7 +3757,7 @@ void CodeGenFunction::EmitCheck(
3748
3757
}
3749
3758
3750
3759
for (size_t i = 0 , n = DynamicArgs.size (); i != n; ++i) {
3751
- Args.push_back (EmitCheckValue (DynamicArgs[i]));
3760
+ Args.push_back (EmitCheckValue (DynamicArgs[i], MayReadFromPtrToInt ));
3752
3761
ArgTypes.push_back (IntPtrTy);
3753
3762
}
3754
3763
}
@@ -3760,7 +3769,8 @@ void CodeGenFunction::EmitCheck(
3760
3769
// Simple case: we need to generate a single handler call, either
3761
3770
// fatal, or non-fatal.
3762
3771
emitCheckHandlerCall (*this , FnType, Args, CheckHandler, RecoverKind,
3763
- (FatalCond != nullptr ), Cont, NoMerge);
3772
+ (FatalCond != nullptr ), Cont, NoMerge,
3773
+ MayReadFromPtrToInt);
3764
3774
} else {
3765
3775
// Emit two handler calls: first one for set of unrecoverable checks,
3766
3776
// another one for recoverable.
@@ -3770,10 +3780,10 @@ void CodeGenFunction::EmitCheck(
3770
3780
Builder.CreateCondBr (FatalCond, NonFatalHandlerBB, FatalHandlerBB);
3771
3781
EmitBlock (FatalHandlerBB);
3772
3782
emitCheckHandlerCall (*this , FnType, Args, CheckHandler, RecoverKind, true ,
3773
- NonFatalHandlerBB, NoMerge);
3783
+ NonFatalHandlerBB, NoMerge, MayReadFromPtrToInt );
3774
3784
EmitBlock (NonFatalHandlerBB);
3775
3785
emitCheckHandlerCall (*this , FnType, Args, CheckHandler, RecoverKind, false ,
3776
- Cont, NoMerge);
3786
+ Cont, NoMerge, MayReadFromPtrToInt );
3777
3787
}
3778
3788
3779
3789
EmitBlock (Cont);
0 commit comments