Skip to content

Commit 4959e8a

Browse files
authored
[BOLT][NFCI] Use heuristic for matching split global functions (#90429)
This change speeds up fragment matching for large BOLTed binaries where all fragments of global parent functions are put under `bolt-pseudo.o` file symbol: - before: iterating over symbols under `bolt-pseudo.o` only to fail to find a parent, - after: bail out immediately and use a global parent by name. Test Plan: NFC, updated register-fragments-bolt-symbols.s
1 parent 6d8c6ef commit 4959e8a

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,6 +1567,11 @@ void RewriteInstance::registerFragments() {
15671567

15681568
uint64_t ParentAddress{0};
15691569

1570+
// Check if containing FILE symbol is BOLT emitted synthetic symbol marking
1571+
// local fragments of global parents.
1572+
if (cantFail(FSI[-1].getName()) == getBOLTFileSymbolName())
1573+
goto registerParent;
1574+
15701575
// BOLT split fragment symbols are emitted just before the main function
15711576
// symbol.
15721577
for (ELFSymbolRef NextSymbol = Symbol; NextSymbol < StopSymbol;

bolt/test/X86/register-fragments-bolt-symbols.s

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
# RUN: link_fdata %s %t.bolt %t.preagg PREAGG
3131
# PREAGG: B X:0 #chain.cold.0# 1 0
32+
# PREAGG: B X:0 #dummy# 1 0
3233
# RUN: perf2bolt %t.bolt -p %t.preagg --pa -o %t.bat.fdata -w %t.bat.yaml -v=1 \
3334
# RUN: | FileCheck %s --check-prefix=CHECK-REGISTER
3435
# RUN: FileCheck --input-file %t.bat.fdata --check-prefix=CHECK-FDATA %s
@@ -44,7 +45,13 @@
4445
# CHECK-SYMS: l F .text.cold [[#]] chain.cold.0
4546
# CHECK-SYMS: l F .text [[#]] chain
4647
# CHECK-SYMS: l df *ABS* [[#]] bolt-pseudo.o
48+
# CHECK-SYMS: l F .text.cold [[#]] dummy.cold.0
49+
# CHECK-SYMS: l F .text.cold.1 [[#]] dummy.cold.1
50+
# CHECK-SYMS: l F .text.cold.2 [[#]] dummy.cold.2
4751

52+
# CHECK-REGISTER: BOLT-INFO: marking dummy.cold.0/1(*2) as a fragment of dummy
53+
# CHECK-REGISTER: BOLT-INFO: marking dummy.cold.1/1(*2) as a fragment of dummy
54+
# CHECK-REGISTER: BOLT-INFO: marking dummy.cold.2/1(*2) as a fragment of dummy
4855
# CHECK-REGISTER: BOLT-INFO: marking chain.cold.0/1(*2) as a fragment of chain/2(*2)
4956

5057
# CHECK-FDATA: 0 [unknown] 0 1 chain/chain.s/2 10 0 1

0 commit comments

Comments
 (0)