[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:
Quentin Colombet 2015-11-14 01:55:17 +00:00
parent cbf7d4abb0
commit 8d80702537
2 changed files with 48 additions and 1 deletions

View File

@ -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.

View 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)