diff --git a/bolt/lib/Profile/YAMLProfileReader.cpp b/bolt/lib/Profile/YAMLProfileReader.cpp --- a/bolt/lib/Profile/YAMLProfileReader.cpp +++ b/bolt/lib/Profile/YAMLProfileReader.cpp @@ -294,9 +294,19 @@ buildNameMaps(BC); // Preliminary assign function execution count. - for (auto [YamlBF, BF] : llvm::zip_equal(YamlBP.Functions, ProfileBFs)) - if (BF) + for (auto [YamlBF, BF] : llvm::zip_equal(YamlBP.Functions, ProfileBFs)) { + if (!BF) + continue; + if (!BF->hasProfile()) { BF->setExecutionCount(YamlBF.ExecCount); + } else { + if (opts::Verbosity >= 1) { + errs() << "BOLT-WARNING: dropping duplicate profile for " << YamlBF.Name + << '\n'; + } + BF = nullptr; + } + } return Error::success(); } diff --git a/bolt/test/X86/yaml-multiple-profiles.test b/bolt/test/X86/yaml-multiple-profiles.test new file mode 100644 --- /dev/null +++ b/bolt/test/X86/yaml-multiple-profiles.test @@ -0,0 +1,53 @@ +# This test ensures that a YAML profile with multiple profiles matching the same +# function is handled gracefully. + +# REQUIRES: system-linux +# RUN: split-file %s %t +# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %t/main.s -o %t.o +# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q -nostdlib +# RUN: llvm-bolt %t.exe -o /dev/null --data %t/profile.yaml \ +# RUN: --profile-ignore-hash -v=1 2>&1 | FileCheck %s +# CHECK: BOLT-WARNING: dropping duplicate profile for main_alias(*2) +#--- main.s + .globl main_alias + .type main_alias, %function +main_alias: + .globl main + .type main, %function +main: + .cfi_startproc + cmpl $0x0, %eax + retq + .cfi_endproc +.size main, .-main +.size main_alias, .-main_alias +#--- profile.yaml +--- +header: + profile-version: 1 + binary-name: 'yaml-multiple-profiles.test.tmp.exe' + binary-build-id: '' + profile-flags: [ lbr ] + profile-origin: branch profile reader + profile-events: '' + dfs-order: false +functions: + - name: 'main(*2)' + fid: 1 + hash: 0x50BBA3441D436491 + exec: 1 + nblocks: 1 + blocks: + - bid: 0 + insns: 2 + hash: 0x4D4D8FAF7D4C0000 + - name: 'main_alias(*2)' + fid: 1 + hash: 0x50BBA3441D436491 + exec: 1 + nblocks: 1 + blocks: + - bid: 0 + insns: 2 + hash: 0x4D4D8FAF7D4C0000 +...