Skip to content

Commit 9c4aca2

Browse files
authored
[HWASAN] Emit optimization remarks (#88332)
Similar to #88304 SelHWAsan is optimization. We may want to diagnose compiler decisions. Remarks is the tool for that https://llvm.org/docs/Remarks.html.
1 parent f7cc224 commit 9c4aca2

File tree

2 files changed

+43
-19
lines changed

2 files changed

+43
-19
lines changed

llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "llvm/Analysis/BlockFrequencyInfo.h"
2222
#include "llvm/Analysis/DomTreeUpdater.h"
2323
#include "llvm/Analysis/GlobalsModRef.h"
24+
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
2425
#include "llvm/Analysis/PostDominators.h"
2526
#include "llvm/Analysis/ProfileSummaryInfo.h"
2627
#include "llvm/Analysis/StackSafetyAnalysis.h"
@@ -1492,23 +1493,42 @@ bool HWAddressSanitizer::instrumentStack(memtag::StackInfo &SInfo,
14921493
return true;
14931494
}
14941495

1496+
static void emitRemark(const Function &F, OptimizationRemarkEmitter &ORE,
1497+
bool Skip) {
1498+
if (Skip) {
1499+
ORE.emit([&]() {
1500+
return OptimizationRemark(DEBUG_TYPE, "Skip", &F)
1501+
<< "Skipped: F=" << ore::NV("Function", &F);
1502+
});
1503+
} else {
1504+
ORE.emit([&]() {
1505+
return OptimizationRemarkMissed(DEBUG_TYPE, "Sanitize", &F)
1506+
<< "Sanitized: F=" << ore::NV("Function", &F);
1507+
});
1508+
}
1509+
}
1510+
14951511
bool HWAddressSanitizer::selectiveInstrumentationShouldSkip(
14961512
Function &F, FunctionAnalysisManager &FAM) const {
1497-
if (ClRandomSkipRate.getNumOccurrences()) {
1498-
std::bernoulli_distribution D(ClRandomSkipRate);
1499-
return !D(*Rng);
1500-
}
1501-
if (!ClHotPercentileCutoff.getNumOccurrences())
1502-
return false;
1503-
auto &MAMProxy = FAM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
1504-
ProfileSummaryInfo *PSI =
1505-
MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent());
1506-
if (!PSI || !PSI->hasProfileSummary()) {
1507-
++NumNoProfileSummaryFuncs;
1508-
return false;
1509-
}
1510-
return PSI->isFunctionHotInCallGraphNthPercentile(
1511-
ClHotPercentileCutoff, &F, FAM.getResult<BlockFrequencyAnalysis>(F));
1513+
bool Skip = [&]() {
1514+
if (ClRandomSkipRate.getNumOccurrences()) {
1515+
std::bernoulli_distribution D(ClRandomSkipRate);
1516+
return !D(*Rng);
1517+
}
1518+
if (!ClHotPercentileCutoff.getNumOccurrences())
1519+
return false;
1520+
auto &MAMProxy = FAM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
1521+
ProfileSummaryInfo *PSI =
1522+
MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent());
1523+
if (!PSI || !PSI->hasProfileSummary()) {
1524+
++NumNoProfileSummaryFuncs;
1525+
return false;
1526+
}
1527+
return PSI->isFunctionHotInCallGraphNthPercentile(
1528+
ClHotPercentileCutoff, &F, FAM.getResult<BlockFrequencyAnalysis>(F));
1529+
}();
1530+
emitRemark(F, FAM.getResult<OptimizationRemarkEmitterAnalysis>(F), Skip);
1531+
return Skip;
15121532
}
15131533

15141534
void HWAddressSanitizer::sanitizeFunction(Function &F,

llvm/test/Instrumentation/HWAddressSanitizer/pgo-opt-out.ll

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
; RUN: opt < %s -passes='require<profile-summary>,hwasan' -S -hwasan-percentile-cutoff-hot=700000 | FileCheck %s --check-prefix=HOT70
2-
; RUN: opt < %s -passes='require<profile-summary>,hwasan' -S -hwasan-percentile-cutoff-hot=990000 | FileCheck %s --check-prefix=HOT99
3-
; RUN: opt < %s -passes='require<profile-summary>,hwasan' -S -hwasan-random-rate=1.0 | FileCheck %s --check-prefix=ALL
4-
; RUN: opt < %s -passes='require<profile-summary>,hwasan' -S -hwasan-random-rate=0.0 | FileCheck %s --check-prefix=NONE
1+
; RUN: opt < %s -passes='require<profile-summary>,hwasan' -pass-remarks=hwasan -pass-remarks-missed=hwasan -S -hwasan-percentile-cutoff-hot=700000 2>&1 | FileCheck %s --check-prefix=HOT70
2+
; RUN: opt < %s -passes='require<profile-summary>,hwasan' -pass-remarks=hwasan -pass-remarks-missed=hwasan -S -hwasan-percentile-cutoff-hot=990000 2>&1 | FileCheck %s --check-prefix=HOT99
3+
; RUN: opt < %s -passes='require<profile-summary>,hwasan' -pass-remarks=hwasan -pass-remarks-missed=hwasan -S -hwasan-random-rate=1.0 2>&1 | FileCheck %s --check-prefix=ALL
4+
; RUN: opt < %s -passes='require<profile-summary>,hwasan' -pass-remarks=hwasan -pass-remarks-missed=hwasan -S -hwasan-random-rate=0.0 2>&1 | FileCheck %s --check-prefix=NONE
55

6+
; HOT70: remark: <unknown>:0:0: Sanitized: F=sanitized
67
; HOT70: @sanitized
78
; HOT70-NEXT: @__hwasan_tls
89

10+
; HOT99: remark: <unknown>:0:0: Skipped: F=sanitized
911
; HOT99: @sanitized
1012
; HOT99-NEXT: %x = alloca i8, i64 4
1113

14+
; ALL: remark: <unknown>:0:0: Sanitized: F=sanitize
1215
; ALL: @sanitized
1316
; ALL-NEXT: @__hwasan_tls
1417

18+
; NONE: remark: <unknown>:0:0: Skipped: F=sanitized
1519
; NONE: @sanitized
1620
; NONE-NEXT: %x = alloca i8, i64 4
1721

0 commit comments

Comments
 (0)