[llvm] [llvm-profgen] Add branch/target validation (PR #188620)
Amir Ayupov via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 15 22:51:01 PDT 2026
================
@@ -1344,6 +1344,52 @@ void PerfScriptReader::warnInvalidRange() {
"range end acrossing the unconditinal jmp.");
}
+void PerfScriptReader::warnIfBranchTargetMismatch() {
+ // Collect unique branch source and target addresses from LBR samples,
+ // then check what percentage don't match known instructions in the binary.
+
+ uint64_t MismatchedBranches = 0;
+ uint64_t MismatchedIndirectTargets = 0;
+ uint64_t MismatchedTargets = 0;
+ uint64_t TotalSamples = 0;
+
+ for (const auto &Item : AggregatedSamples) {
+ const PerfSample *Sample = Item.first.getPtr();
+ for (const LBREntry &LBR : Sample->LBRStack) {
+ uint64_t Source = LBR.Source;
+ uint64_t Target = LBR.Target;
+ if (Source == ExternalAddr || Target == ExternalAddr)
+ continue;
+ TotalSamples++;
+
+ // Validate Branch sources are Call/Branch/Indirect Branch
+ if (!Binary->addressIsTransfer(Source))
+ MismatchedBranches++;
+
+ // Validate Indirect Branch targets landed in code. This may over estimate
+ // the vaid targets only because there's no good way to determine jump
+ // table targets
+ if (Binary->addressIsIndirectBranch(Source)) {
+ if (!Binary->addressIsCode(Target))
+ MismatchedIndirectTargets++;
+ } else if (!Binary->addressIsBranchTarget(Target) &&
+ !Binary->findFuncRangeForStartAddr(Target))
+ MismatchedTargets++;
+ }
+ }
+
+ emitWarningSummary(MismatchedBranches, TotalSamples,
+ "of branches do not match the binary, likely due to "
+ "problematic raw samples or mismatch in binary.");
----------------
aaupov wrote:
Please address the other sentence too
https://github.com/llvm/llvm-project/pull/188620
More information about the llvm-commits
mailing list