diff --git a/llvm/tools/llvm-profgen/ProfileGenerator.cpp b/llvm/tools/llvm-profgen/ProfileGenerator.cpp --- a/llvm/tools/llvm-profgen/ProfileGenerator.cpp +++ b/llvm/tools/llvm-profgen/ProfileGenerator.cpp @@ -8,6 +8,7 @@ #include "ProfileGenerator.h" #include "llvm/ProfileData/ProfileCommon.h" +#include static cl::opt OutputFilename("output", cl::value_desc("output"), cl::Required, @@ -520,7 +521,8 @@ // Extract the top frame probes by looking up each address among the range in // the Address2ProbeMap extractProbesFromRange(RangeCounter, ProbeCounter, Binary); - std::unordered_map + std::unordered_map> FrameSamples; for (auto PI : ProbeCounter) { const MCDecodedPseudoProbe *Probe = PI.first; @@ -530,7 +532,7 @@ // Record the current frame and FunctionProfile whenever samples are // collected for non-danglie probes. This is for reporting all of the // zero count probes of the frame later. - FrameSamples[Probe->getInlineTreeNode()] = &FunctionProfile; + FrameSamples[Probe->getInlineTreeNode()].insert(&FunctionProfile); FunctionProfile.addBodySamplesForProbe(Probe->getIndex(), Count); FunctionProfile.addTotalSamples(Count); if (Probe->isEntry()) { @@ -559,12 +561,13 @@ FunctionProfile.getContext().getNameWithoutContext(), Count); } } + } - // Assign zero count for remaining probes without sample hits to - // differentiate from probes optimized away, of which the counts are unknown - // and will be inferred by the compiler. - for (auto &I : FrameSamples) { - auto *FunctionProfile = I.second; + // Assign zero count for remaining probes without sample hits to + // differentiate from probes optimized away, of which the counts are unknown + // and will be inferred by the compiler. + for (auto &I : FrameSamples) { + for (auto *FunctionProfile : I.second) { for (auto *Probe : I.first->getProbes()) { FunctionProfile->addBodySamplesForProbe(Probe->getIndex(), 0); }