[BOLT] Require CFG in BAT mode (#150488)

`getFallthroughsInTrace` requires CFG for functions not covered by BAT,
even in BAT/fdata mode. BAT-covered functions go through special
handling in fdata (`BAT->getFallthroughsInTrace`) and YAML
(`DataAggregator::writeBATYAML`) modes.

Since all modes (BAT/no-BAT, YAML/fdata) now need disassembly/CFG
construction:
- drop special BAT/fdata handling that omitted disassembly/CFG in
  `RewriteInstance::run`, enabling *CFG for all non-BAT functions*,
- switch `getFallthroughsInTrace` to check if a function has CFG,
- which *allows emitting profile for non-simple functions* in all modes.

Previously, traces in non-simple functions were reported as invalid/
mismatching disassembled function contents. This change reduces the
number of such invalid traces and increases the number of profiled
functions. These functions may participate in function reordering via
call graph profile.

Test Plan: updated unclaimed-jt-entries.s
This commit is contained in:
Amir Ayupov 2025-07-25 13:54:37 +02:00 committed by GitHub
parent e38f98f535
commit a850912de1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 18 additions and 20 deletions

View File

@ -906,11 +906,10 @@ DataAggregator::getFallthroughsInTrace(BinaryFunction &BF, const Trace &Trace,
if (BF.isPseudo())
return Branches;
if (!BF.isSimple())
// Can only record traces in CFG state
if (!BF.hasCFG())
return std::nullopt;
assert(BF.hasCFG() && "can only record traces in CFG state");
const BinaryBasicBlock *FromBB = BF.getBasicBlockContainingOffset(From);
const BinaryBasicBlock *ToBB = BF.getBasicBlockContainingOffset(To);

View File

@ -714,21 +714,6 @@ Error RewriteInstance::run() {
preprocessProfileData();
// Skip disassembling if we have a translation table and we are running an
// aggregation job.
if (opts::AggregateOnly && BAT->enabledFor(InputFile)) {
// YAML profile in BAT mode requires CFG for .bolt.org.text functions
if (!opts::SaveProfile.empty() ||
opts::ProfileFormat == opts::ProfileFormatKind::PF_YAML) {
selectFunctionsToProcess();
disassembleFunctions();
processMetadataPreCFG();
buildFunctionsCFG();
}
processProfileData();
return Error::success();
}
selectFunctionsToProcess();
readDebugInfo();

View File

@ -18,6 +18,18 @@
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o
# RUN: %clang %cflags -no-pie %t.o -o %t.exe -Wl,-q
## Check that non-simple function profile is emitted in perf2bolt mode
# RUN: link_fdata %s %t.exe %t.pa PREAGG
# RUN: llvm-strip -N L5 -N L5_ret %t.exe
# RUN: perf2bolt %t.exe -p %t.pa --pa -o %t.fdata -strict=0 -print-profile \
# RUN: -print-only=main | FileCheck %s --check-prefix=CHECK-P2B
# CHECK-P2B: PERF2BOLT: traces mismatching disassembled function contents: 0
# CHECK-P2B: Binary Function "main"
# CHECK-P2B: IsSimple : 0
# RUN: FileCheck %s --input-file %t.fdata --check-prefix=CHECK-FDATA
# CHECK-FDATA: 1 main 0 1 main 7 0 1
# RUN: llvm-bolt %t.exe -v=1 -o %t.out 2>&1 | FileCheck %s
# CHECK: BOLT-WARNING: unclaimed data to code reference (possibly an unrecognized jump table entry) to .Ltmp[[#]] in main
@ -33,8 +45,10 @@
.size main, .Lend-main
main:
jmp *L4-24(,%rdi,8)
.L5:
# PREAGG: T #main# #L5# #L5_ret# 1
L5:
movl $4, %eax
L5_ret:
ret
.L9:
movl $2, %eax
@ -58,7 +72,7 @@ L4:
.quad .L3
.quad .L6
.quad .L3
.quad .L5
.quad L5
.quad .L3
.quad .L3
.quad .L3