[BOLT] Report per-section hotness in bolt-heatmap.
This patch adds a new feature to bolt heatmap to print the hotness of each section in terms of the percentage of samples within that section. Sample output generated for the clang binary: Section Name, Begin Address, End Address, Percentage Hotness .text, 0x1a7b9b0, 0x20a2cc0, 1.4709 .init, 0x20a2cc0, 0x20a2ce1, 0.0001 .fini, 0x20a2ce4, 0x20a2cf2, 0.0000 .text.unlikely, 0x20a2d00, 0x431990c, 0.3061 .text.hot, 0x4319910, 0x4bc6927, 97.2197 .text.startup, 0x4bc6930, 0x4c10c89, 0.0058 .plt, 0x4c10c90, 0x4c12010, 0.9974 Reviewed By: rafauler Differential Revision: https://reviews.llvm.org/D124412
This commit is contained in:
@@ -116,6 +116,22 @@ namespace {
|
||||
const char TimerGroupName[] = "aggregator";
|
||||
const char TimerGroupDesc[] = "Aggregator";
|
||||
|
||||
std::vector<SectionNameAndRange> getTextSections(const BinaryContext *BC) {
|
||||
std::vector<SectionNameAndRange> sections;
|
||||
for (BinarySection &Section : BC->sections()) {
|
||||
if (!Section.isText())
|
||||
continue;
|
||||
if (Section.getSize() == 0)
|
||||
continue;
|
||||
sections.push_back(
|
||||
{Section.getName(), Section.getAddress(), Section.getEndAddress()});
|
||||
}
|
||||
std::sort(sections.begin(), sections.end(),
|
||||
[](const SectionNameAndRange &A, const SectionNameAndRange &B) {
|
||||
return A.BeginAddress < B.BeginAddress;
|
||||
});
|
||||
return sections;
|
||||
}
|
||||
}
|
||||
|
||||
constexpr uint64_t DataAggregator::KernelBaseAddr;
|
||||
@@ -1292,7 +1308,7 @@ std::error_code DataAggregator::printLBRHeatMap() {
|
||||
opts::HeatmapMinAddress = KernelBaseAddr;
|
||||
}
|
||||
Heatmap HM(opts::HeatmapBlock, opts::HeatmapMinAddress,
|
||||
opts::HeatmapMaxAddress);
|
||||
opts::HeatmapMaxAddress, getTextSections(BC));
|
||||
uint64_t NumTotalSamples = 0;
|
||||
|
||||
if (opts::BasicAggregation) {
|
||||
@@ -1374,6 +1390,10 @@ std::error_code DataAggregator::printLBRHeatMap() {
|
||||
HM.printCDF(opts::OutputFilename);
|
||||
else
|
||||
HM.printCDF(opts::OutputFilename + ".csv");
|
||||
if (opts::OutputFilename == "-")
|
||||
HM.printSectionHotness(opts::OutputFilename);
|
||||
else
|
||||
HM.printSectionHotness(opts::OutputFilename + "-section-hotness.csv");
|
||||
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user