mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-01 15:19:05 +00:00
[ShrinkWrapping] Disable the optimization for functions with sanitize like
attribute. Even if the target supports shrink-wrapping, the prologue and epilogue must not move because a crash can happen anywhere and sanitizers need to be able to unwind from the PC of the crash. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253116 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cbf7d4abb0
commit
8d80702537
@ -468,7 +468,14 @@ bool ShrinkWrap::isShrinkWrapEnabled(const MachineFunction &MF) {
|
||||
return TFI->enableShrinkWrapping(MF) &&
|
||||
// Windows with CFI has some limitations that make it impossible
|
||||
// to use shrink-wrapping.
|
||||
!MF.getTarget().getMCAsmInfo()->usesWindowsCFI();
|
||||
!MF.getTarget().getMCAsmInfo()->usesWindowsCFI() &&
|
||||
// Sanitizers look at the value of the stack at the location
|
||||
// of the crash. Since a crash can happen anywhere, the
|
||||
// frame must be lowered before anything else happen for the
|
||||
// sanitizers to be able to get a correct stack frame.
|
||||
!(MF.getFunction()->hasFnAttribute(Attribute::SanitizeAddress) ||
|
||||
MF.getFunction()->hasFnAttribute(Attribute::SanitizeThread) ||
|
||||
MF.getFunction()->hasFnAttribute(Attribute::SanitizeMemory));
|
||||
// If EnableShrinkWrap is set, it takes precedence on whatever the
|
||||
// target sets. The rational is that we assume we want to test
|
||||
// something related to shrink-wrapping.
|
||||
|
40
test/CodeGen/X86/x86-sanitizer-shrink-wrapping.ll
Normal file
40
test/CodeGen/X86/x86-sanitizer-shrink-wrapping.ll
Normal file
@ -0,0 +1,40 @@
|
||||
; RUN: llc -o - < %s | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
||||
target triple = "x86_64-apple-macosx"
|
||||
|
||||
; Even if the target supports shrink-wrapping, the prologue and epilogue
|
||||
; must not move because a crash can happen anywhere and sanitizers need
|
||||
; to be able to unwind from the PC of the crash.
|
||||
; CHECK-LABEL: sanitize:
|
||||
; CHECK: pushq
|
||||
; CHECK: incl 40
|
||||
; CHECK: popq
|
||||
; CHECK-NEXT: retq
|
||||
; CHECK: movl $40, %edi
|
||||
; CHECK-NEXT callq ___asan_report_load4
|
||||
define void @sanitize() #0 {
|
||||
entry:
|
||||
%tmp = load i8, i8* inttoptr (i64 17592186044421 to i8*)
|
||||
%tmp1 = icmp ne i8 %tmp, 0
|
||||
br i1 %tmp1, label %if.then, label %else
|
||||
|
||||
if.then:
|
||||
%tmp3 = icmp sge i8 3, %tmp
|
||||
br i1 %tmp3, label %else, label %end
|
||||
|
||||
else:
|
||||
call void @__asan_report_load4(i64 40)
|
||||
call void asm sideeffect "", ""()
|
||||
unreachable
|
||||
|
||||
end:
|
||||
%tmp6 = load i32, i32* inttoptr (i64 40 to i32*), align 8
|
||||
%inc = add nsw i32 %tmp6, 1
|
||||
store i32 %inc, i32* inttoptr (i64 40 to i32*), align 8
|
||||
ret void
|
||||
}
|
||||
|
||||
attributes #0 = { sanitize_address nounwind "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" }
|
||||
|
||||
declare void @__asan_report_load4(i64)
|
Loading…
x
Reference in New Issue
Block a user