From 6fb39ac77bb2e080cc41cd0060464e76f84f994a Mon Sep 17 00:00:00 2001 From: Maksim Panchenko Date: Wed, 25 Sep 2024 23:18:34 +0200 Subject: [PATCH] [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 --- .../merge-fdata-uninitialized-header.test | 45 +++++++++++++++++++ bolt/tools/merge-fdata/merge-fdata.cpp | 12 ++++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 bolt/test/merge-fdata-uninitialized-header.test diff --git a/bolt/test/merge-fdata-uninitialized-header.test b/bolt/test/merge-fdata-uninitialized-header.test new file mode 100644 index 000000000000..533696127841 --- /dev/null +++ b/bolt/test/merge-fdata-uninitialized-header.test @@ -0,0 +1,45 @@ +## Test that merge-fdata correctly handles YAML header with an uninitialized +## fields. a.yaml does not have hash-func set and it used to crash merge-fdata. + +# REQUIRES: system-linux + +# RUN: split-file %s %t +# RUN: not merge-fdata %t/a.yaml %t/b.yaml 2>&1 | FileCheck %s + +# CHECK: cannot merge profiles with different hash functions + +#--- a.yaml +--- +header: + profile-version: 1 + binary-name: 'a.out' + binary-build-id: '' + profile-flags: [ lbr ] + profile-origin: branch profile reader + profile-events: '' + dfs-order: false +functions: + - name: 'main' + fid: 1 + hash: 0x50BBA3441D436491 + exec: 1 + nblocks: 0 +... +#--- b.yaml +--- +header: + profile-version: 1 + binary-name: 'a.out' + binary-build-id: '' + profile-flags: [ lbr ] + profile-origin: branch profile reader + profile-events: '' + dfs-order: false + hash-func: xxh3 +functions: + - name: 'main' + fid: 1 + hash: 0x50BBA3441D436491 + exec: 1 + nblocks: 0 +... diff --git a/bolt/tools/merge-fdata/merge-fdata.cpp b/bolt/tools/merge-fdata/merge-fdata.cpp index b640aae808f5..89ca46c1c0a8 100644 --- a/bolt/tools/merge-fdata/merge-fdata.cpp +++ b/bolt/tools/merge-fdata/merge-fdata.cpp @@ -145,6 +145,10 @@ void mergeProfileHeaders(BinaryProfileHeader &MergedHeader, errs() << "WARNING: merging profiles with different sampling events\n"; MergedHeader.EventNames += "," + Header.EventNames; } + + if (MergedHeader.HashFunction != Header.HashFunction) + report_error("merge conflict", + "cannot merge profiles with different hash functions"); } void mergeBasicBlockProfile(BinaryBasicBlockProfile &MergedBB, @@ -386,6 +390,7 @@ int main(int argc, char **argv) { // Merged information for all functions. StringMap MergedBFs; + bool FirstHeader = true; for (std::string &InputDataFilename : Inputs) { ErrorOr> MB = MemoryBuffer::getFileOrSTDIN(InputDataFilename); @@ -409,7 +414,12 @@ int main(int argc, char **argv) { } // Merge the header. - mergeProfileHeaders(MergedHeader, BP.Header); + if (FirstHeader) { + MergedHeader = BP.Header; + FirstHeader = false; + } else { + mergeProfileHeaders(MergedHeader, BP.Header); + } // Do the function merge. for (BinaryFunctionProfile &BF : BP.Functions) {