Skip to content

Commit

Permalink
[HotColdSplit] Disable splitting for sanitized functions
Browse files Browse the repository at this point in the history
Splitting can make sanitizer errors harder to understand, as the
trapping instruction may not be in the function where the bug was
detected.

rdar://48142697

llvm-svn: 354931
  • Loading branch information
vedantk committed Feb 26, 2019
1 parent 35d2d51 commit 73522d1
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 2 deletions.
11 changes: 9 additions & 2 deletions llvm/lib/Transforms/IPO/HotColdSplitting.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,11 @@ bool unlikelyExecuted(BasicBlock &BB) {
if (BB.isEHPad() || isa<ResumeInst>(BB.getTerminator()))
return true;

// The block is cold if it calls/invokes a cold function.
// The block is cold if it calls/invokes a cold function. However, do not
// mark sanitizer traps as cold.
for (Instruction &I : BB)
if (auto CS = CallSite(&I))
if (CS.hasFnAttr(Attribute::Cold))
if (CS.hasFnAttr(Attribute::Cold) && !CS->getMetadata("nosanitize"))
return true;

// The block is cold if it has an unreachable terminator, unless it's
Expand Down Expand Up @@ -235,6 +236,12 @@ bool HotColdSplitting::shouldOutlineFrom(const Function &F) const {
if (F.hasFnAttribute(Attribute::NoInline))
return false;

if (F.hasFnAttribute(Attribute::SanitizeAddress) ||
F.hasFnAttribute(Attribute::SanitizeHWAddress) ||
F.hasFnAttribute(Attribute::SanitizeThread) ||
F.hasFnAttribute(Attribute::SanitizeMemory))
return false;

return true;
}

Expand Down
72 changes: 72 additions & 0 deletions llvm/test/Transforms/HotColdSplit/X86/do-not-split.ll
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,78 @@ if.end: ; preds = %entry
ret void
}

; CHECK-LABEL: @sanitize_address
; CHECK-NOT: sanitize_address.cold.1
define void @sanitize_address() sanitize_address {
entry:
br i1 undef, label %if.then, label %if.end

if.then: ; preds = %entry
call void @sink()
ret void

if.end: ; preds = %entry
ret void
}

; CHECK-LABEL: @sanitize_hwaddress
; CHECK-NOT: sanitize_hwaddress.cold.1
define void @sanitize_hwaddress() sanitize_hwaddress {
entry:
br i1 undef, label %if.then, label %if.end

if.then: ; preds = %entry
call void @sink()
ret void

if.end: ; preds = %entry
ret void
}

; CHECK-LABEL: @sanitize_thread
; CHECK-NOT: sanitize_thread.cold.1
define void @sanitize_thread() sanitize_thread {
entry:
br i1 undef, label %if.then, label %if.end

if.then: ; preds = %entry
call void @sink()
ret void

if.end: ; preds = %entry
ret void
}

; CHECK-LABEL: @sanitize_memory
; CHECK-NOT: sanitize_memory.cold.1
define void @sanitize_memory() sanitize_memory {
entry:
br i1 undef, label %if.then, label %if.end

if.then: ; preds = %entry
call void @sink()
ret void

if.end: ; preds = %entry
ret void
}

declare void @llvm.trap() cold noreturn

; CHECK-LABEL: @nosanitize_call
; CHECK-NOT: nosanitize_call.cold.1
define void @nosanitize_call() sanitize_memory {
entry:
br i1 undef, label %if.then, label %if.end

if.then: ; preds = %entry
call void @llvm.trap(), !nosanitize !2
unreachable

if.end: ; preds = %entry
ret void
}

declare void @llvm.dbg.value(metadata, metadata, metadata)

declare void @sink() cold
Expand Down

0 comments on commit 73522d1

Please sign in to comment.