Skip to content

Commit 6fb39ac

Browse files
authored
[BOLT][merge-fdata] Initialize YAML profile header (#109613)
While merging profiles, some fields in the input header, e.g. HashFunction, could be uninitialized leading to a UMR. Initialize merged header with the first input header. Fixes #109592
1 parent 924b390 commit 6fb39ac

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
## Test that merge-fdata correctly handles YAML header with an uninitialized
2+
## fields. a.yaml does not have hash-func set and it used to crash merge-fdata.
3+
4+
# REQUIRES: system-linux
5+
6+
# RUN: split-file %s %t
7+
# RUN: not merge-fdata %t/a.yaml %t/b.yaml 2>&1 | FileCheck %s
8+
9+
# CHECK: cannot merge profiles with different hash functions
10+
11+
#--- a.yaml
12+
---
13+
header:
14+
profile-version: 1
15+
binary-name: 'a.out'
16+
binary-build-id: '<unknown>'
17+
profile-flags: [ lbr ]
18+
profile-origin: branch profile reader
19+
profile-events: ''
20+
dfs-order: false
21+
functions:
22+
- name: 'main'
23+
fid: 1
24+
hash: 0x50BBA3441D436491
25+
exec: 1
26+
nblocks: 0
27+
...
28+
#--- b.yaml
29+
---
30+
header:
31+
profile-version: 1
32+
binary-name: 'a.out'
33+
binary-build-id: '<unknown>'
34+
profile-flags: [ lbr ]
35+
profile-origin: branch profile reader
36+
profile-events: ''
37+
dfs-order: false
38+
hash-func: xxh3
39+
functions:
40+
- name: 'main'
41+
fid: 1
42+
hash: 0x50BBA3441D436491
43+
exec: 1
44+
nblocks: 0
45+
...

bolt/tools/merge-fdata/merge-fdata.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ void mergeProfileHeaders(BinaryProfileHeader &MergedHeader,
145145
errs() << "WARNING: merging profiles with different sampling events\n";
146146
MergedHeader.EventNames += "," + Header.EventNames;
147147
}
148+
149+
if (MergedHeader.HashFunction != Header.HashFunction)
150+
report_error("merge conflict",
151+
"cannot merge profiles with different hash functions");
148152
}
149153

150154
void mergeBasicBlockProfile(BinaryBasicBlockProfile &MergedBB,
@@ -386,6 +390,7 @@ int main(int argc, char **argv) {
386390
// Merged information for all functions.
387391
StringMap<BinaryFunctionProfile> MergedBFs;
388392

393+
bool FirstHeader = true;
389394
for (std::string &InputDataFilename : Inputs) {
390395
ErrorOr<std::unique_ptr<MemoryBuffer>> MB =
391396
MemoryBuffer::getFileOrSTDIN(InputDataFilename);
@@ -409,7 +414,12 @@ int main(int argc, char **argv) {
409414
}
410415

411416
// Merge the header.
412-
mergeProfileHeaders(MergedHeader, BP.Header);
417+
if (FirstHeader) {
418+
MergedHeader = BP.Header;
419+
FirstHeader = false;
420+
} else {
421+
mergeProfileHeaders(MergedHeader, BP.Header);
422+
}
413423

414424
// Do the function merge.
415425
for (BinaryFunctionProfile &BF : BP.Functions) {

0 commit comments

Comments
 (0)