1
0
mirror of https://github.com/wolfpld/tracy synced 2025-05-01 13:13:53 +00:00

Store and pass AddrStat data in one data structure.

This commit is contained in:
Bartosz Taudul 2021-07-18 14:36:44 +02:00
parent 9c7a122d94
commit e30608afbf
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3
2 changed files with 159 additions and 152 deletions

View File

@ -971,7 +971,7 @@ void SourceView::RenderSimpleSourceView()
const auto lx = ts * maxLine + ty + round( ts*0.4f ); const auto lx = ts * maxLine + ty + round( ts*0.4f );
DrawLine( draw, dpos + ImVec2( lx, 0 ), dpos + ImVec2( lx, wh ), 0x08FFFFFF ); DrawLine( draw, dpos + ImVec2( lx, 0 ), dpos + ImVec2( lx, wh ), 0x08FFFFFF );
const AddrStat zero = {}; const AddrStatData zero;
if( m_targetLine != 0 ) if( m_targetLine != 0 )
{ {
int lineNum = 1; int lineNum = 1;
@ -982,7 +982,7 @@ void SourceView::RenderSimpleSourceView()
m_targetLine = 0; m_targetLine = 0;
ImGui::SetScrollHereY(); ImGui::SetScrollHereY();
} }
RenderLine( line, lineNum++, zero, zero, zero, nullptr, nullptr ); RenderLine( line, lineNum++, zero.ipMaxAsm, zero, nullptr, nullptr );
} }
const auto win = ImGui::GetCurrentWindowRead(); const auto win = ImGui::GetCurrentWindowRead();
m_srcWidth = win->DC.CursorMaxPos.x - win->DC.CursorStartPos.x; m_srcWidth = win->DC.CursorMaxPos.x - win->DC.CursorStartPos.x;
@ -995,7 +995,7 @@ void SourceView::RenderSimpleSourceView()
{ {
for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ ) for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ )
{ {
RenderLine( lines[i], i+1, zero, zero, zero, nullptr, nullptr ); RenderLine( lines[i], i+1, zero.ipMaxAsm, zero, nullptr, nullptr );
} }
} }
} }
@ -1201,42 +1201,40 @@ void SourceView::RenderSymbolView( Worker& worker, View& view )
TextFocused( ICON_FA_WEIGHT_HANGING " Code:", MemSizeToString( m_codeLen ) ); TextFocused( ICON_FA_WEIGHT_HANGING " Code:", MemSizeToString( m_codeLen ) );
} }
AddrStat iptotalSrc = {}, iptotalAsm = {}; AddrStatData as;
AddrStat ipmaxSrc = {}, ipmaxAsm = {};
unordered_flat_map<uint64_t, AddrStat> ipcountSrc, ipcountAsm;
if( m_cost == CostType::SampleCount ) if( m_cost == CostType::SampleCount )
{ {
if( m_calcInlineStats ) if( m_calcInlineStats )
{ {
GatherIpStats( m_symAddr, iptotalSrc, iptotalAsm, ipcountSrc, ipcountAsm, ipmaxSrc, ipmaxAsm, worker, limitView, view ); GatherIpStats( m_symAddr, as, worker, limitView, view );
GatherAdditionalIpStats( m_symAddr, iptotalSrc, iptotalAsm, ipcountSrc, ipcountAsm, ipmaxSrc, ipmaxAsm, worker, limitView, view ); GatherAdditionalIpStats( m_symAddr, as, worker, limitView, view );
} }
else else
{ {
GatherIpStats( m_baseAddr, iptotalSrc, iptotalAsm, ipcountSrc, ipcountAsm, ipmaxSrc, ipmaxAsm, worker, limitView, view ); GatherIpStats( m_baseAddr, as, worker, limitView, view );
auto iptr = worker.GetInlineSymbolList( m_baseAddr, m_codeLen ); auto iptr = worker.GetInlineSymbolList( m_baseAddr, m_codeLen );
if( iptr ) if( iptr )
{ {
const auto symEnd = m_baseAddr + m_codeLen; const auto symEnd = m_baseAddr + m_codeLen;
while( *iptr < symEnd ) while( *iptr < symEnd )
{ {
GatherIpStats( *iptr, iptotalSrc, iptotalAsm, ipcountSrc, ipcountAsm, ipmaxSrc, ipmaxAsm, worker, limitView, view ); GatherIpStats( *iptr, as, worker, limitView, view );
iptr++; iptr++;
} }
} }
GatherAdditionalIpStats( m_symAddr, iptotalSrc, iptotalAsm, ipcountSrc, ipcountAsm, ipmaxSrc, ipmaxAsm, worker, limitView, view ); GatherAdditionalIpStats( m_symAddr, as, worker, limitView, view );
} }
} }
else else
{ {
GatherIpHwStats( iptotalSrc, iptotalAsm, ipcountSrc, ipcountAsm, ipmaxSrc, ipmaxAsm, worker, view, m_cost ); GatherIpHwStats( as, worker, view, m_cost );
} }
if( !m_calcInlineStats ) if( !m_calcInlineStats )
{ {
iptotalSrc = iptotalAsm; as.ipTotalSrc = as.ipTotalAsm;
} }
const auto slzReady = worker.AreSourceLocationZonesReady(); const auto slzReady = worker.AreSourceLocationZonesReady();
if( ( iptotalAsm.local + iptotalAsm.ext ) > 0 || ( view.m_statRange.active && worker.GetSamplesForSymbol( m_baseAddr ) ) ) if( ( as.ipTotalAsm.local + as.ipTotalAsm.ext ) > 0 || ( view.m_statRange.active && worker.GetSamplesForSymbol( m_baseAddr ) ) )
{ {
ImGui::SameLine(); ImGui::SameLine();
ImGui::Spacing(); ImGui::Spacing();
@ -1313,16 +1311,16 @@ void SourceView::RenderSymbolView( Worker& worker, View& view )
ImGui::SameLine(); ImGui::SameLine();
if( m_childCalls ) if( m_childCalls )
{ {
TextFocused( ICON_FA_STOPWATCH " Time:", TimeToString( ( iptotalAsm.local + iptotalAsm.ext ) * worker.GetSamplingPeriod() ) ); TextFocused( ICON_FA_STOPWATCH " Time:", TimeToString( ( as.ipTotalAsm.local + as.ipTotalAsm.ext ) * worker.GetSamplingPeriod() ) );
} }
else else
{ {
TextFocused( ICON_FA_STOPWATCH " Time:", TimeToString( iptotalAsm.local * worker.GetSamplingPeriod() ) ); TextFocused( ICON_FA_STOPWATCH " Time:", TimeToString( as.ipTotalAsm.local * worker.GetSamplingPeriod() ) );
} }
if( iptotalAsm.ext ) if( as.ipTotalAsm.ext )
{ {
ImGui::SameLine(); ImGui::SameLine();
ImGui::TextDisabled( "(%c%s)", m_childCalls ? '-' : '+', TimeToString( iptotalAsm.ext * worker.GetSamplingPeriod() ) ); ImGui::TextDisabled( "(%c%s)", m_childCalls ? '-' : '+', TimeToString( as.ipTotalAsm.ext * worker.GetSamplingPeriod() ) );
if( ImGui::IsItemHovered() ) if( ImGui::IsItemHovered() )
{ {
ImGui::BeginTooltip(); ImGui::BeginTooltip();
@ -1335,16 +1333,16 @@ void SourceView::RenderSymbolView( Worker& worker, View& view )
ImGui::SameLine(); ImGui::SameLine();
if( m_childCalls ) if( m_childCalls )
{ {
TextFocused( ICON_FA_EYE_DROPPER " Samples:", RealToString( iptotalAsm.local + iptotalAsm.ext ) ); TextFocused( ICON_FA_EYE_DROPPER " Samples:", RealToString( as.ipTotalAsm.local + as.ipTotalAsm.ext ) );
} }
else else
{ {
TextFocused( ICON_FA_EYE_DROPPER " Samples:", RealToString( iptotalAsm.local ) ); TextFocused( ICON_FA_EYE_DROPPER " Samples:", RealToString( as.ipTotalAsm.local ) );
} }
if( iptotalAsm.ext ) if( as.ipTotalAsm.ext )
{ {
ImGui::SameLine(); ImGui::SameLine();
ImGui::Text( "(%c%s)", m_childCalls ? '-' : '+', RealToString( iptotalAsm.ext ) ); ImGui::Text( "(%c%s)", m_childCalls ? '-' : '+', RealToString( as.ipTotalAsm.ext ) );
if( ImGui::IsItemHovered() ) if( ImGui::IsItemHovered() )
{ {
ImGui::BeginTooltip(); ImGui::BeginTooltip();
@ -1355,7 +1353,7 @@ void SourceView::RenderSymbolView( Worker& worker, View& view )
} }
else else
{ {
TextFocused( "Events:", RealToString( iptotalAsm.local ) ); TextFocused( "Events:", RealToString( as.ipTotalAsm.local ) );
} }
ImGui::SameLine(); ImGui::SameLine();
ImGui::Spacing(); ImGui::Spacing();
@ -1408,16 +1406,16 @@ void SourceView::RenderSymbolView( Worker& worker, View& view )
switch( m_displayMode ) switch( m_displayMode )
{ {
case DisplaySource: case DisplaySource:
RenderSymbolSourceView( iptotalSrc, ipcountSrc, ipcountAsm, ipmaxSrc, worker, view ); RenderSymbolSourceView( as, worker, view );
break; break;
case DisplayAsm: case DisplayAsm:
jumpOut = RenderSymbolAsmView( iptotalAsm, ipcountAsm, ipmaxAsm, worker, view ); jumpOut = RenderSymbolAsmView( as, worker, view );
break; break;
case DisplayMixed: case DisplayMixed:
ImGui::Columns( 2 ); ImGui::Columns( 2 );
RenderSymbolSourceView( iptotalSrc, ipcountSrc, ipcountAsm, ipmaxSrc, worker, view ); RenderSymbolSourceView( as, worker, view );
ImGui::NextColumn(); ImGui::NextColumn();
jumpOut = RenderSymbolAsmView( iptotalAsm, ipcountAsm, ipmaxAsm, worker, view ); jumpOut = RenderSymbolAsmView( as, worker, view );
ImGui::EndColumns(); ImGui::EndColumns();
break; break;
default: default:
@ -1535,7 +1533,7 @@ static uint32_t GetGoodnessColor( float inRatio )
return GoodnessColor[ratio]; return GoodnessColor[ratio];
} }
void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordered_flat_map<uint64_t, AddrStat>& ipcount, const unordered_flat_map<uint64_t, AddrStat>& ipcountAsm, const AddrStat& ipmax, Worker& worker, const View& view ) void SourceView::RenderSymbolSourceView( const AddrStatData& as, Worker& worker, const View& view )
{ {
if( m_sourceFiles.empty() ) if( m_sourceFiles.empty() )
{ {
@ -1626,8 +1624,8 @@ void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordere
if( srcline != 0 ) if( srcline != 0 )
{ {
AddrStat cnt = {}; AddrStat cnt = {};
auto ait = ipcountAsm.find( v.addr ); auto ait = as.ipCountAsm.find( v.addr );
if( ait != ipcountAsm.end() ) cnt = ait->second; if( ait != as.ipCountAsm.end() ) cnt = ait->second;
auto fit = fileCounts.find( srcidx.Idx() ); auto fit = fileCounts.find( srcidx.Idx() );
if( fit == fileCounts.end() ) if( fit == fileCounts.end() )
@ -1774,7 +1772,7 @@ void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordere
const auto tmp = RealToString( lineCount ); const auto tmp = RealToString( lineCount );
const auto maxLine = strlen( tmp ); const auto maxLine = strlen( tmp );
auto lx = ts * maxLine + ty + round( ts*0.4f ); auto lx = ts * maxLine + ty + round( ts*0.4f );
if( iptotal.local + iptotal.ext != 0 ) lx += ts * 7 + ty; if( as.ipTotalSrc.local + as.ipTotalSrc.ext != 0 ) lx += ts * 7 + ty;
if( !m_asm.empty() ) if( !m_asm.empty() )
{ {
const auto tmp = RealToString( m_asm.size() ); const auto tmp = RealToString( m_asm.size() );
@ -1784,7 +1782,7 @@ void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordere
if( m_hwSamples && worker.GetHwSampleCountAddress() != 0 ) lx += 19 * ts + ty; if( m_hwSamples && worker.GetHwSampleCountAddress() != 0 ) lx += 19 * ts + ty;
DrawLine( draw, dpos + ImVec2( lx, 0 ), dpos + ImVec2( lx, wh ), 0x08FFFFFF ); DrawLine( draw, dpos + ImVec2( lx, 0 ), dpos + ImVec2( lx, wh ), 0x08FFFFFF );
const AddrStat zero = {}; const AddrStatData zero;
m_selectedAddressesHover.clear(); m_selectedAddressesHover.clear();
if( m_targetLine != 0 ) if( m_targetLine != 0 )
{ {
@ -1796,7 +1794,7 @@ void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordere
m_targetLine = 0; m_targetLine = 0;
ImGui::SetScrollHereY(); ImGui::SetScrollHereY();
} }
RenderLine( line, lineNum++, zero, iptotal, ipmax, &worker, &view ); RenderLine( line, lineNum++, zero.ipMaxAsm, as, &worker, &view );
} }
const auto win = ImGui::GetCurrentWindowRead(); const auto win = ImGui::GetCurrentWindowRead();
m_srcWidth = win->DC.CursorMaxPos.x - win->DC.CursorStartPos.x; m_srcWidth = win->DC.CursorMaxPos.x - win->DC.CursorStartPos.x;
@ -1807,20 +1805,20 @@ void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordere
clipper.Begin( (int)lines.size() ); clipper.Begin( (int)lines.size() );
while( clipper.Step() ) while( clipper.Step() )
{ {
if( iptotal.local + iptotal.ext == 0 ) if( as.ipTotalSrc.local + as.ipTotalSrc.ext == 0 )
{ {
for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ ) for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ )
{ {
RenderLine( lines[i], i+1, zero, zero, zero, &worker, &view ); RenderLine( lines[i], i+1, zero.ipMaxAsm, zero, &worker, &view );
} }
} }
else else
{ {
for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ ) for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ )
{ {
auto it = ipcount.find( i+1 ); auto it = as.ipCountSrc.find( i+1 );
const auto ipcnt = it == ipcount.end() ? zero : it->second; const auto ipcnt = it == as.ipCountSrc.end() ? zero.ipMaxAsm : it->second;
RenderLine( lines[i], i+1, ipcnt, iptotal, ipmax, &worker, &view ); RenderLine( lines[i], i+1, ipcnt, as, &worker, &view );
} }
} }
} }
@ -1844,11 +1842,11 @@ void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordere
} }
std::vector<std::pair<uint64_t, AddrStat>> ipData; std::vector<std::pair<uint64_t, AddrStat>> ipData;
ipData.reserve( ipcount.size() ); ipData.reserve( as.ipCountSrc.size() );
for( auto& v : ipcount ) ipData.emplace_back( v.first, v.second ); for( auto& v : as.ipCountSrc ) ipData.emplace_back( v.first, v.second );
for( uint32_t lineNum = 1; lineNum <= lines.size(); lineNum++ ) for( uint32_t lineNum = 1; lineNum <= lines.size(); lineNum++ )
{ {
if( ipcount.find( lineNum ) == ipcount.end() ) if( as.ipCountSrc.find( lineNum ) == as.ipCountSrc.end() )
{ {
auto addresses = worker.GetAddressesForLocation( m_source.idx(), lineNum ); auto addresses = worker.GetAddressesForLocation( m_source.idx(), lineNum );
if( addresses ) if( addresses )
@ -1883,12 +1881,12 @@ void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordere
const auto ly = round( rect.Min.y + float( firstLine ) / lines.size() * rect.GetHeight() ); const auto ly = round( rect.Min.y + float( firstLine ) / lines.size() * rect.GetHeight() );
if( m_childCalls ) if( m_childCalls )
{ {
const auto color = ( ipSum.local + ipSum.ext == 0 ) ? 0x22FFFFFF : GetHotnessColor( ipSum.local + ipSum.ext, ipmax.local + ipmax.ext ); const auto color = ( ipSum.local + ipSum.ext == 0 ) ? 0x22FFFFFF : GetHotnessColor( ipSum.local + ipSum.ext, as.ipMaxSrc.local + as.ipMaxSrc.ext );
draw->AddRectFilled( ImVec2( x14, ly ), ImVec2( x34, ly+3 ), color ); draw->AddRectFilled( ImVec2( x14, ly ), ImVec2( x34, ly+3 ), color );
} }
else else
{ {
const auto color = ipSum.local == 0 ? 0x22FFFFFF : GetHotnessColor( ipSum.local, ipmax.local ); const auto color = ipSum.local == 0 ? 0x22FFFFFF : GetHotnessColor( ipSum.local, as.ipMaxSrc.local );
draw->AddRectFilled( ImVec2( x14, ly ), ImVec2( x34, ly+3 ), color ); draw->AddRectFilled( ImVec2( x14, ly ), ImVec2( x34, ly+3 ), color );
} }
} }
@ -1905,8 +1903,8 @@ void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordere
uint32_t numLines = 0; uint32_t numLines = 0;
for( auto& idx : m_srcSampleSelect ) for( auto& idx : m_srcSampleSelect )
{ {
auto it = ipcount.find( idx ); auto it = as.ipCountSrc.find( idx );
if( it != ipcount.end() ) if( it != as.ipCountSrc.end() )
{ {
count += it->second; count += it->second;
numLines++; numLines++;
@ -1924,11 +1922,11 @@ void SourceView::RenderSymbolSourceView( const AddrStat& iptotal, const unordere
char* end; char* end;
if( m_childCalls ) if( m_childCalls )
{ {
end = PrintFloat( buf, buf+16, 100.f * ( count.local + count.ext ) / ( iptotal.local + iptotal.ext ), 2 ); end = PrintFloat( buf, buf+16, 100.f * ( count.local + count.ext ) / ( as.ipTotalSrc.local + as.ipTotalSrc.ext ), 2 );
} }
else if( iptotal.local != 0 ) else if( as.ipTotalSrc.local != 0 )
{ {
end = PrintFloat( buf, buf+16, 100.f * count.local / iptotal.local, 2 ); end = PrintFloat( buf, buf+16, 100.f * count.local / as.ipTotalSrc.local, 2 );
} }
else else
{ {
@ -2020,7 +2018,7 @@ static int PrintHexBytes( char* buf, const uint8_t* bytes, size_t len, CpuArchit
} }
} }
uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unordered_flat_map<uint64_t, AddrStat>& ipcount, const AddrStat& ipmax, Worker& worker, View& view ) uint64_t SourceView::RenderSymbolAsmView( const AddrStatData& as, Worker& worker, View& view )
{ {
if( m_disasmFail >= 0 ) if( m_disasmFail >= 0 )
{ {
@ -2163,7 +2161,7 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
uint64_t selJumpTarget; uint64_t selJumpTarget;
uint64_t jumpOut = 0; uint64_t jumpOut = 0;
const AddrStat zero = {}; const AddrStatData zero;
if( m_targetAddr != 0 ) if( m_targetAddr != 0 )
{ {
for( auto& line : m_asm ) for( auto& line : m_asm )
@ -2173,7 +2171,7 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
m_targetAddr = 0; m_targetAddr = 0;
ImGui::SetScrollHereY(); ImGui::SetScrollHereY();
} }
RenderAsmLine( line, zero, iptotal, ipmax, worker, jumpOut, maxAddrLen, view ); RenderAsmLine( line, zero.ipMaxAsm, as, worker, jumpOut, maxAddrLen, view );
} }
const auto win = ImGui::GetCurrentWindowRead(); const auto win = ImGui::GetCurrentWindowRead();
m_asmWidth = win->DC.CursorMaxPos.x - win->DC.CursorStartPos.x; m_asmWidth = win->DC.CursorMaxPos.x - win->DC.CursorStartPos.x;
@ -2190,11 +2188,11 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
const auto dpos = wpos + ImVec2( 0.5f, 0.5f ); const auto dpos = wpos + ImVec2( 0.5f, 0.5f );
static std::vector<uint64_t> insList; static std::vector<uint64_t> insList;
insList.clear(); insList.clear();
if( iptotal.local + iptotal.ext == 0 ) if( as.ipTotalAsm.local + as.ipTotalAsm.ext == 0 )
{ {
for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ ) for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ )
{ {
RenderAsmLine( m_asm[i], zero, zero, zero, worker, jumpOut, maxAddrLen, view ); RenderAsmLine( m_asm[i], zero.ipMaxAsm, zero, worker, jumpOut, maxAddrLen, view );
insList.emplace_back( m_asm[i].addr ); insList.emplace_back( m_asm[i].addr );
} }
} }
@ -2203,9 +2201,9 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ ) for( auto i=clipper.DisplayStart; i<clipper.DisplayEnd; i++ )
{ {
auto& line = m_asm[i]; auto& line = m_asm[i];
auto it = ipcount.find( line.addr ); auto it = as.ipCountAsm.find( line.addr );
const auto ipcnt = it == ipcount.end() ? zero : it->second; const auto ipcnt = it == as.ipCountAsm.end() ? zero.ipMaxAsm : it->second;
RenderAsmLine( line, ipcnt, iptotal, ipmax, worker, jumpOut, maxAddrLen, view ); RenderAsmLine( line, ipcnt, as, worker, jumpOut, maxAddrLen, view );
insList.emplace_back( line.addr ); insList.emplace_back( line.addr );
} }
} }
@ -2216,7 +2214,7 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
const auto th2 = floor( ts.y / 2 ); const auto th2 = floor( ts.y / 2 );
const auto th4 = floor( ts.y / 4 ); const auto th4 = floor( ts.y / 4 );
const auto xoff = const auto xoff =
( ( iptotal.local + iptotal.ext ) == 0 ? 0 : ( 7 * ts.x + ts.y ) ) + ( ( as.ipTotalAsm.local + as.ipTotalAsm.ext ) == 0 ? 0 : ( 7 * ts.x + ts.y ) ) +
(3+maxAddrLen) * ts.x + (3+maxAddrLen) * ts.x +
( ( m_asmShowSourceLocation && !m_sourceFiles.empty() ) ? 36 * ts.x : 0 ) + ( ( m_asmShowSourceLocation && !m_sourceFiles.empty() ) ? 36 * ts.x : 0 ) +
( m_asmBytes ? m_maxAsmBytes*3 * ts.x : 0 ) + ( m_asmBytes ? m_maxAsmBytes*3 * ts.x : 0 ) +
@ -2404,13 +2402,13 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
uint32_t selJumpLineStart, selJumpLineEnd, selJumpLineTarget; uint32_t selJumpLineStart, selJumpLineEnd, selJumpLineTarget;
std::vector<std::pair<uint64_t, AddrStat>> ipData; std::vector<std::pair<uint64_t, AddrStat>> ipData;
ipData.reserve( ipcount.size() ); ipData.reserve( as.ipCountAsm.size() );
if( selJumpStart == 0 ) if( selJumpStart == 0 )
{ {
for( size_t i=0; i<m_asm.size(); i++ ) for( size_t i=0; i<m_asm.size(); i++ )
{ {
auto it = ipcount.find( m_asm[i].addr ); auto it = as.ipCountAsm.find( m_asm[i].addr );
if( it == ipcount.end() ) continue; if( it == as.ipCountAsm.end() ) continue;
ipData.emplace_back( i, it->second ); ipData.emplace_back( i, it->second );
} }
} }
@ -2422,8 +2420,8 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
if( selJumpEnd == m_asm[i].addr ) selJumpLineEnd = i; if( selJumpEnd == m_asm[i].addr ) selJumpLineEnd = i;
if( selJumpTarget == m_asm[i].addr ) selJumpLineTarget = i; if( selJumpTarget == m_asm[i].addr ) selJumpLineTarget = i;
auto it = ipcount.find( m_asm[i].addr ); auto it = as.ipCountAsm.find( m_asm[i].addr );
if( it == ipcount.end() ) continue; if( it == as.ipCountAsm.end() ) continue;
ipData.emplace_back( i, it->second ); ipData.emplace_back( i, it->second );
} }
} }
@ -2446,12 +2444,12 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
const auto ly = round( rect.Min.y + float( firstLine ) / m_asm.size() * rect.GetHeight() ); const auto ly = round( rect.Min.y + float( firstLine ) / m_asm.size() * rect.GetHeight() );
if( m_childCalls ) if( m_childCalls )
{ {
const auto color = GetHotnessColor( ipSum.local + ipSum.ext, ipmax.local + ipmax.ext ); const auto color = GetHotnessColor( ipSum.local + ipSum.ext, as.ipMaxAsm.local + as.ipMaxAsm.ext );
draw->AddRectFilled( ImVec2( x40, ly ), ImVec2( x60, ly+3 ), color ); draw->AddRectFilled( ImVec2( x40, ly ), ImVec2( x60, ly+3 ), color );
} }
else if( ipmax.local != 0 ) else if( as.ipMaxAsm.local != 0 )
{ {
const auto color = GetHotnessColor( ipSum.local, ipmax.local ); const auto color = GetHotnessColor( ipSum.local, as.ipMaxAsm.local );
draw->AddRectFilled( ImVec2( x40, ly ), ImVec2( x60, ly+3 ), color ); draw->AddRectFilled( ImVec2( x40, ly ), ImVec2( x60, ly+3 ), color );
} }
} }
@ -2513,8 +2511,8 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
uint32_t numLines = 0; uint32_t numLines = 0;
for( auto& idx : m_asmSampleSelect ) for( auto& idx : m_asmSampleSelect )
{ {
auto it = ipcount.find( m_asm[idx].addr ); auto it = as.ipCountAsm.find( m_asm[idx].addr );
if( it != ipcount.end() ) if( it != as.ipCountAsm.end() )
{ {
count += it->second; count += it->second;
numLines++; numLines++;
@ -2532,11 +2530,11 @@ uint64_t SourceView::RenderSymbolAsmView( const AddrStat& iptotal, const unorder
char* end; char* end;
if( m_childCalls ) if( m_childCalls )
{ {
end = PrintFloat( buf, buf+16, 100.f * ( count.local + count.ext ) / ( iptotal.local + iptotal.ext ), 2 ); end = PrintFloat( buf, buf+16, 100.f * ( count.local + count.ext ) / ( as.ipTotalAsm.local + as.ipTotalAsm.ext ), 2 );
} }
else if( iptotal.local != 0 ) else if( as.ipTotalAsm.local != 0 )
{ {
end = PrintFloat( buf, buf+16, 100.f * count.local / iptotal.local, 2 ); end = PrintFloat( buf, buf+16, 100.f * count.local / as.ipTotalAsm.local, 2 );
} }
else else
{ {
@ -2608,7 +2606,7 @@ static bool PrintPercentage( float val, uint32_t col = 0xFFFFFFFF )
return ImGui::IsWindowHovered() && ImGui::IsMouseHoveringRect( wpos, wpos + ImVec2( stw * 7, ty ) ); return ImGui::IsWindowHovered() && ImGui::IsMouseHoveringRect( wpos, wpos + ImVec2( stw * 7, ty ) );
} }
void SourceView::RenderLine( const Tokenizer::Line& line, int lineNum, const AddrStat& ipcnt, const AddrStat& iptotal, const AddrStat& ipmax, Worker* worker, const View* view ) void SourceView::RenderLine( const Tokenizer::Line& line, int lineNum, const AddrStat& ipcnt, const AddrStatData& as, Worker* worker, const View* view )
{ {
const auto ts = ImGui::CalcTextSize( " " ); const auto ts = ImGui::CalcTextSize( " " );
const auto ty = ImGui::GetFontSize(); const auto ty = ImGui::GetFontSize();
@ -2673,7 +2671,7 @@ void SourceView::RenderLine( const Tokenizer::Line& line, int lineNum, const Add
} }
bool mouseHandled = false; bool mouseHandled = false;
if( iptotal.local + iptotal.ext != 0 ) if( as.ipTotalSrc.local + as.ipTotalSrc.ext != 0 )
{ {
if( ( m_childCalls && ipcnt.local + ipcnt.ext == 0 ) || ( !m_childCalls && ipcnt.local == 0 ) ) if( ( m_childCalls && ipcnt.local + ipcnt.ext == 0 ) || ( !m_childCalls && ipcnt.local == 0 ) )
{ {
@ -2694,11 +2692,11 @@ void SourceView::RenderLine( const Tokenizer::Line& line, int lineNum, const Add
bool hover; bool hover;
if( m_childCalls ) if( m_childCalls )
{ {
hover = PrintPercentage( 100.f * ( ipcnt.local + ipcnt.ext ) / ( iptotal.local + iptotal.ext ), sit == m_srcSampleSelect.end() ? 0xFFFFFFFF : 0xFF8888FF ); hover = PrintPercentage( 100.f * ( ipcnt.local + ipcnt.ext ) / ( as.ipTotalSrc.local + as.ipTotalSrc.ext ), sit == m_srcSampleSelect.end() ? 0xFFFFFFFF : 0xFF8888FF );
} }
else else
{ {
hover = PrintPercentage( 100.f * ipcnt.local / iptotal.local, sit == m_srcSampleSelect.end() ? 0xFFFFFFFF : 0xFF8888FF ); hover = PrintPercentage( 100.f * ipcnt.local / as.ipTotalSrc.local, sit == m_srcSampleSelect.end() ? 0xFFFFFFFF : 0xFF8888FF );
} }
if( hover ) if( hover )
{ {
@ -2785,13 +2783,13 @@ void SourceView::RenderLine( const Tokenizer::Line& line, int lineNum, const Add
uint32_t col, glow; uint32_t col, glow;
if( m_childCalls ) if( m_childCalls )
{ {
col = GetHotnessColor( ipcnt.local + ipcnt.ext, ipmax.local + ipmax.ext ); col = GetHotnessColor( ipcnt.local + ipcnt.ext, as.ipMaxSrc.local + as.ipMaxSrc.ext );
glow = GetHotnessGlow( ipcnt.local + ipcnt.ext, ipmax.local + ipmax.ext ); glow = GetHotnessGlow( ipcnt.local + ipcnt.ext, as.ipMaxSrc.local + as.ipMaxSrc.ext );
} }
else else
{ {
col = GetHotnessColor( ipcnt.local, ipmax.local ); col = GetHotnessColor( ipcnt.local, as.ipMaxSrc.local );
glow = GetHotnessGlow( ipcnt.local, ipmax.local ); glow = GetHotnessGlow( ipcnt.local, as.ipMaxSrc.local );
} }
if( glow ) if( glow )
{ {
@ -2887,7 +2885,7 @@ void SourceView::RenderLine( const Tokenizer::Line& line, int lineNum, const Add
DrawLine( draw, dpos + ImVec2( 0, ty+2 ), dpos + ImVec2( w, ty+2 ), 0x08FFFFFF ); DrawLine( draw, dpos + ImVec2( 0, ty+2 ), dpos + ImVec2( w, ty+2 ), 0x08FFFFFF );
} }
void SourceView::RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const AddrStat& iptotal, const AddrStat& ipmax, Worker& worker, uint64_t& jumpOut, int maxAddrLen, View& view ) void SourceView::RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const AddrStatData& as, Worker& worker, uint64_t& jumpOut, int maxAddrLen, View& view )
{ {
const auto ty = ImGui::GetFontSize(); const auto ty = ImGui::GetFontSize();
auto draw = ImGui::GetWindowDrawList(); auto draw = ImGui::GetWindowDrawList();
@ -2935,7 +2933,7 @@ void SourceView::RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const Addr
} }
const auto ts = ImGui::CalcTextSize( " " ); const auto ts = ImGui::CalcTextSize( " " );
if( iptotal.local + iptotal.ext != 0 ) if( as.ipTotalAsm.local + as.ipTotalAsm.ext != 0 )
{ {
if( ( m_childCalls && ipcnt.local + ipcnt.ext == 0 ) || ( !m_childCalls && ipcnt.local == 0 ) ) if( ( m_childCalls && ipcnt.local + ipcnt.ext == 0 ) || ( !m_childCalls && ipcnt.local == 0 ) )
{ {
@ -2956,11 +2954,11 @@ void SourceView::RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const Addr
bool hover; bool hover;
if( m_childCalls ) if( m_childCalls )
{ {
hover = PrintPercentage( 100.f * ( ipcnt.local + ipcnt.ext ) / ( iptotal.local + iptotal.ext ), sit == m_asmSampleSelect.end() ? 0xFFFFFFFF : 0xFF8888FF ); hover = PrintPercentage( 100.f * ( ipcnt.local + ipcnt.ext ) / ( as.ipTotalAsm.local + as.ipTotalAsm.ext ), sit == m_asmSampleSelect.end() ? 0xFFFFFFFF : 0xFF8888FF );
} }
else else
{ {
hover = PrintPercentage( 100.f * ipcnt.local / iptotal.local, sit == m_asmSampleSelect.end() ? 0xFFFFFFFF : 0xFF8888FF ); hover = PrintPercentage( 100.f * ipcnt.local / as.ipTotalAsm.local, sit == m_asmSampleSelect.end() ? 0xFFFFFFFF : 0xFF8888FF );
} }
if( hover ) if( hover )
{ {
@ -3080,13 +3078,13 @@ void SourceView::RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const Addr
uint32_t col, glow; uint32_t col, glow;
if( m_childCalls ) if( m_childCalls )
{ {
col = GetHotnessColor( ipcnt.local + ipcnt.ext, ipmax.local + ipmax.ext ); col = GetHotnessColor( ipcnt.local + ipcnt.ext, as.ipMaxAsm.local + as.ipMaxAsm.ext );
glow = GetHotnessGlow( ipcnt.local + ipcnt.ext, ipmax.local + ipmax.ext ); glow = GetHotnessGlow( ipcnt.local + ipcnt.ext, as.ipMaxAsm.local + as.ipMaxAsm.ext );
} }
else else
{ {
col = GetHotnessColor( ipcnt.local, ipmax.local ); col = GetHotnessColor( ipcnt.local, as.ipMaxAsm.local );
glow = GetHotnessGlow( ipcnt.local, ipmax.local ); glow = GetHotnessGlow( ipcnt.local, as.ipMaxAsm.local );
} }
if( glow ) if( glow )
{ {
@ -3337,7 +3335,7 @@ void SourceView::RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const Addr
const auto& mjl = m_maxJumpLevel; const auto& mjl = m_maxJumpLevel;
const auto col = GetHsvColor( line.jumpAddr, 6 ); const auto col = GetHsvColor( line.jumpAddr, 6 );
const auto xoff = const auto xoff =
( ( iptotal.local + iptotal.ext == 0 ) ? 0 : ( 7 * ts.x + ts.y ) ) + ( ( as.ipTotalAsm.local + as.ipTotalAsm.ext == 0 ) ? 0 : ( 7 * ts.x + ts.y ) ) +
(3+maxAddrLen) * ts.x + (3+maxAddrLen) * ts.x +
( ( m_asmShowSourceLocation && !m_sourceFiles.empty() ) ? 36 * ts.x : 0 ) + ( ( m_asmShowSourceLocation && !m_sourceFiles.empty() ) ? 36 * ts.x : 0 ) +
( m_asmBytes ? m_maxAsmBytes*3 * ts.x : 0 ) + ( m_asmBytes ? m_maxAsmBytes*3 * ts.x : 0 ) +
@ -4035,7 +4033,7 @@ void SourceView::SelectAsmLinesHover( uint32_t file, uint32_t line, const Worker
} }
} }
void SourceView::GatherIpHwStats( AddrStat& iptotalSrc, AddrStat& iptotalAsm, unordered_flat_map<uint64_t, AddrStat>& ipcountSrc, unordered_flat_map<uint64_t, AddrStat>& ipcountAsm, AddrStat& ipmaxSrc, AddrStat& ipmaxAsm, Worker& worker, const View& view, CostType cost ) void SourceView::GatherIpHwStats( AddrStatData& as, Worker& worker, const View& view, CostType cost )
{ {
auto filename = m_source.filename(); auto filename = m_source.filename();
for( auto& v : m_asm ) for( auto& v : m_asm )
@ -4076,9 +4074,9 @@ void SourceView::GatherIpHwStats( AddrStat& iptotalSrc, AddrStat& iptotalAsm, un
} }
} }
assert( ipcountAsm.find( addr ) == ipcountAsm.end() ); assert( ipcountAsm.find( addr ) == ipcountAsm.end() );
ipcountAsm.emplace( addr, AddrStat { stat, 0 } ); as.ipCountAsm.emplace( addr, AddrStat { stat, 0 } );
iptotalAsm.local += stat; as.ipTotalAsm.local += stat;
if( ipmaxAsm.local < stat ) ipmaxAsm.local = stat; if( as.ipMaxAsm.local < stat ) as.ipMaxAsm.local = stat;
if( filename ) if( filename )
{ {
@ -4089,19 +4087,19 @@ void SourceView::GatherIpHwStats( AddrStat& iptotalSrc, AddrStat& iptotalAsm, un
auto ffn = worker.GetString( fref ); auto ffn = worker.GetString( fref );
if( strcmp( ffn, filename ) == 0 ) if( strcmp( ffn, filename ) == 0 )
{ {
auto it = ipcountSrc.find( line ); auto it = as.ipCountSrc.find( line );
if( it == ipcountSrc.end() ) if( it == as.ipCountSrc.end() )
{ {
ipcountSrc.emplace( line, AddrStat{ stat, 0 } ); as.ipCountSrc.emplace( line, AddrStat{ stat, 0 } );
if( ipmaxSrc.local < stat ) ipmaxSrc.local = stat; if( as.ipMaxSrc.local < stat ) as.ipMaxSrc.local = stat;
} }
else else
{ {
const auto sum = it->second.local + stat; const auto sum = it->second.local + stat;
it->second.local = sum; it->second.local = sum;
if( ipmaxSrc.local < sum ) ipmaxSrc.local = sum; if( as.ipMaxSrc.local < sum ) as.ipMaxSrc.local = sum;
} }
iptotalSrc.local += stat; as.ipTotalSrc.local += stat;
} }
} }
} }
@ -4164,7 +4162,7 @@ void SourceView::CountHwStats( unordered_flat_map<uint64_t, AddrStat>& hwCountSr
} }
} }
void SourceView::GatherIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrStat& iptotalAsm, unordered_flat_map<uint64_t, AddrStat>& ipcountSrc, unordered_flat_map<uint64_t, AddrStat>& ipcountAsm, AddrStat& ipmaxSrc, AddrStat& ipmaxAsm, const Worker& worker, bool limitView, const View& view ) void SourceView::GatherIpStats( uint64_t baseAddr, AddrStatData& as, const Worker& worker, bool limitView, const View& view )
{ {
const auto slzReady = worker.AreSourceLocationZonesReady(); const auto slzReady = worker.AreSourceLocationZonesReady();
auto filename = m_source.filename(); auto filename = m_source.filename();
@ -4175,7 +4173,7 @@ void SourceView::GatherIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrSta
auto it = std::lower_bound( vec->begin(), vec->end(), view.m_statRange.min, [] ( const auto& lhs, const auto& rhs ) { return lhs.time.Val() < rhs; } ); auto it = std::lower_bound( vec->begin(), vec->end(), view.m_statRange.min, [] ( const auto& lhs, const auto& rhs ) { return lhs.time.Val() < rhs; } );
if( it == vec->end() ) return; if( it == vec->end() ) return;
auto end = std::lower_bound( it, vec->end(), view.m_statRange.max, [] ( const auto& lhs, const auto& rhs ) { return lhs.time.Val() < rhs; } ); auto end = std::lower_bound( it, vec->end(), view.m_statRange.max, [] ( const auto& lhs, const auto& rhs ) { return lhs.time.Val() < rhs; } );
iptotalAsm.local += end - it; as.ipTotalAsm.local += end - it;
while( it != end ) while( it != end )
{ {
if( filename ) if( filename )
@ -4189,36 +4187,36 @@ void SourceView::GatherIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrSta
const auto line = frame->data[0].line; const auto line = frame->data[0].line;
if( line != 0 ) if( line != 0 )
{ {
auto sit = ipcountSrc.find( line ); auto sit = as.ipCountSrc.find( line );
if( sit == ipcountSrc.end() ) if( sit == as.ipCountSrc.end() )
{ {
ipcountSrc.emplace( line, AddrStat { 1, 0 } ); as.ipCountSrc.emplace( line, AddrStat { 1, 0 } );
if( ipmaxSrc.local < 1 ) ipmaxSrc.local = 1; if( as.ipMaxSrc.local < 1 ) as.ipMaxSrc.local = 1;
} }
else else
{ {
const auto sum = sit->second.local + 1; const auto sum = sit->second.local + 1;
sit->second.local = sum; sit->second.local = sum;
if( ipmaxSrc.local < sum ) ipmaxSrc.local = sum; if( as.ipMaxSrc.local < sum ) as.ipMaxSrc.local = sum;
} }
iptotalSrc.local++; as.ipTotalSrc.local++;
} }
} }
} }
} }
auto addr = worker.GetCanonicalPointer( it->ip ); auto addr = worker.GetCanonicalPointer( it->ip );
auto sit = ipcountAsm.find( addr ); auto sit = as.ipCountAsm.find( addr );
if( sit == ipcountAsm.end() ) if( sit == as.ipCountAsm.end() )
{ {
ipcountAsm.emplace( addr, AddrStat{ 1, 0 } ); as.ipCountAsm.emplace( addr, AddrStat{ 1, 0 } );
if( ipmaxAsm.local < 1 ) ipmaxAsm.local = 1; if( as.ipMaxAsm.local < 1 ) as.ipMaxAsm.local = 1;
} }
else else
{ {
const auto sum = sit->second.local + 1; const auto sum = sit->second.local + 1;
sit->second.local = sum; sit->second.local = sum;
if( ipmaxAsm.local < sum ) ipmaxAsm.local = sum; if( as.ipMaxAsm.local < sum ) as.ipMaxAsm.local = sum;
} }
++it; ++it;
@ -4234,11 +4232,11 @@ void SourceView::GatherIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrSta
assert( ipcountAsm.find( addr ) == ipcountAsm.end() ); assert( ipcountAsm.find( addr ) == ipcountAsm.end() );
auto cp = slzReady ? worker.GetChildSamples( addr ) : nullptr; auto cp = slzReady ? worker.GetChildSamples( addr ) : nullptr;
const auto ccnt = cp ? cp->size() : 0; const auto ccnt = cp ? cp->size() : 0;
ipcountAsm.emplace( addr, AddrStat { ip.second, ccnt } ); as.ipCountAsm.emplace( addr, AddrStat { ip.second, ccnt } );
iptotalAsm.local += ip.second; as.ipTotalAsm.local += ip.second;
iptotalAsm.ext += ccnt; as.ipTotalAsm.ext += ccnt;
if( ipmaxAsm.local < ip.second ) ipmaxAsm.local = ip.second; if( as.ipMaxAsm.local < ip.second ) as.ipMaxAsm.local = ip.second;
if( ipmaxAsm.ext < ccnt ) ipmaxAsm.ext = ccnt; if( as.ipMaxAsm.ext < ccnt ) as.ipMaxAsm.ext = ccnt;
if( filename ) if( filename )
{ {
@ -4251,12 +4249,12 @@ void SourceView::GatherIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrSta
const auto line = frame->data[0].line; const auto line = frame->data[0].line;
if( line != 0 ) if( line != 0 )
{ {
auto it = ipcountSrc.find( line ); auto it = as.ipCountSrc.find( line );
if( it == ipcountSrc.end() ) if( it == as.ipCountSrc.end() )
{ {
ipcountSrc.emplace( line, AddrStat{ ip.second, ccnt } ); as.ipCountSrc.emplace( line, AddrStat{ ip.second, ccnt } );
if( ipmaxSrc.local < ip.second ) ipmaxSrc.local = ip.second; if( as.ipMaxSrc.local < ip.second ) as.ipMaxSrc.local = ip.second;
if( ipmaxSrc.ext < ccnt ) ipmaxSrc.ext = ccnt; if( as.ipMaxSrc.ext < ccnt ) as.ipMaxSrc.ext = ccnt;
} }
else else
{ {
@ -4264,11 +4262,11 @@ void SourceView::GatherIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrSta
const auto csum = it->second.ext + ccnt; const auto csum = it->second.ext + ccnt;
it->second.local = sum; it->second.local = sum;
it->second.ext = csum; it->second.ext = csum;
if( ipmaxSrc.local < sum ) ipmaxSrc.local = sum; if( as.ipMaxSrc.local < sum ) as.ipMaxSrc.local = sum;
if( ipmaxSrc.ext < csum ) ipmaxSrc.ext = csum; if( as.ipMaxSrc.ext < csum ) as.ipMaxSrc.ext = csum;
} }
iptotalSrc.local += ip.second; as.ipTotalSrc.local += ip.second;
iptotalSrc.ext += ccnt; as.ipTotalSrc.ext += ccnt;
} }
} }
} }
@ -4277,7 +4275,7 @@ void SourceView::GatherIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrSta
} }
} }
void SourceView::GatherAdditionalIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrStat& iptotalAsm, unordered_flat_map<uint64_t, AddrStat>& ipcountSrc, unordered_flat_map<uint64_t, AddrStat>& ipcountAsm, AddrStat& ipmaxSrc, AddrStat& ipmaxAsm, const Worker& worker, bool limitView, const View& view ) void SourceView::GatherAdditionalIpStats( uint64_t baseAddr, AddrStatData& as, const Worker& worker, bool limitView, const View& view )
{ {
if( !worker.AreSourceLocationZonesReady() ) return; if( !worker.AreSourceLocationZonesReady() ) return;
auto sym = worker.GetSymbolData( baseAddr ); auto sym = worker.GetSymbolData( baseAddr );
@ -4288,16 +4286,16 @@ void SourceView::GatherAdditionalIpStats( uint64_t baseAddr, AddrStat& iptotalSr
{ {
for( uint64_t ip = baseAddr; ip < baseAddr + sym->size.Val(); ip++ ) for( uint64_t ip = baseAddr; ip < baseAddr + sym->size.Val(); ip++ )
{ {
if( ipcountAsm.find( ip ) != ipcountAsm.end() ) continue; if( as.ipCountAsm.find( ip ) != as.ipCountAsm.end() ) continue;
auto cp = worker.GetChildSamples( ip ); auto cp = worker.GetChildSamples( ip );
if( !cp ) continue; if( !cp ) continue;
auto it = std::lower_bound( cp->begin(), cp->end(), view.m_statRange.min, [] ( const auto& lhs, const auto& rhs ) { return lhs.Val() < rhs; } ); auto it = std::lower_bound( cp->begin(), cp->end(), view.m_statRange.min, [] ( const auto& lhs, const auto& rhs ) { return lhs.Val() < rhs; } );
if( it == cp->end() ) continue; if( it == cp->end() ) continue;
auto end = std::lower_bound( it, cp->end(), view.m_statRange.max, [] ( const auto& lhs, const auto& rhs ) { return lhs.Val() < rhs; } ); auto end = std::lower_bound( it, cp->end(), view.m_statRange.max, [] ( const auto& lhs, const auto& rhs ) { return lhs.Val() < rhs; } );
const auto ccnt = uint64_t( end - it ); const auto ccnt = uint64_t( end - it );
ipcountAsm.emplace( ip, AddrStat { 0, ccnt } ); as.ipCountAsm.emplace( ip, AddrStat { 0, ccnt } );
iptotalAsm.ext += ccnt; as.ipTotalAsm.ext += ccnt;
if( ipmaxAsm.ext < ccnt ) ipmaxAsm.ext = ccnt; if( as.ipMaxAsm.ext < ccnt ) as.ipMaxAsm.ext = ccnt;
if( filename ) if( filename )
{ {
@ -4310,19 +4308,19 @@ void SourceView::GatherAdditionalIpStats( uint64_t baseAddr, AddrStat& iptotalSr
const auto line = frame->data[0].line; const auto line = frame->data[0].line;
if( line != 0 ) if( line != 0 )
{ {
auto it = ipcountSrc.find( line ); auto it = as.ipCountSrc.find( line );
if( it == ipcountSrc.end() ) if( it == as.ipCountSrc.end() )
{ {
ipcountSrc.emplace( line, AddrStat{ 0, ccnt } ); as.ipCountSrc.emplace( line, AddrStat{ 0, ccnt } );
if( ipmaxSrc.ext < ccnt ) ipmaxSrc.ext = ccnt; if( as.ipMaxSrc.ext < ccnt ) as.ipMaxSrc.ext = ccnt;
} }
else else
{ {
const auto csum = it->second.ext + ccnt; const auto csum = it->second.ext + ccnt;
it->second.ext = csum; it->second.ext = csum;
if( ipmaxSrc.ext < csum ) ipmaxSrc.ext = csum; if( as.ipMaxSrc.ext < csum ) as.ipMaxSrc.ext = csum;
} }
iptotalSrc.ext += ccnt; as.ipTotalSrc.ext += ccnt;
} }
} }
} }
@ -4333,13 +4331,13 @@ void SourceView::GatherAdditionalIpStats( uint64_t baseAddr, AddrStat& iptotalSr
{ {
for( uint64_t ip = baseAddr; ip < baseAddr + sym->size.Val(); ip++ ) for( uint64_t ip = baseAddr; ip < baseAddr + sym->size.Val(); ip++ )
{ {
if( ipcountAsm.find( ip ) != ipcountAsm.end() ) continue; if( as.ipCountAsm.find( ip ) != as.ipCountAsm.end() ) continue;
auto cp = worker.GetChildSamples( ip ); auto cp = worker.GetChildSamples( ip );
if( !cp ) continue; if( !cp ) continue;
const auto ccnt = cp->size(); const auto ccnt = cp->size();
ipcountAsm.emplace( ip, AddrStat { 0, ccnt } ); as.ipCountAsm.emplace( ip, AddrStat { 0, ccnt } );
iptotalAsm.ext += ccnt; as.ipTotalAsm.ext += ccnt;
if( ipmaxAsm.ext < ccnt ) ipmaxAsm.ext = ccnt; if( as.ipMaxAsm.ext < ccnt ) as.ipMaxAsm.ext = ccnt;
if( filename ) if( filename )
{ {
@ -4352,19 +4350,19 @@ void SourceView::GatherAdditionalIpStats( uint64_t baseAddr, AddrStat& iptotalSr
const auto line = frame->data[0].line; const auto line = frame->data[0].line;
if( line != 0 ) if( line != 0 )
{ {
auto it = ipcountSrc.find( line ); auto it = as.ipCountSrc.find( line );
if( it == ipcountSrc.end() ) if( it == as.ipCountSrc.end() )
{ {
ipcountSrc.emplace( line, AddrStat{ 0, ccnt } ); as.ipCountSrc.emplace( line, AddrStat{ 0, ccnt } );
if( ipmaxSrc.ext < ccnt ) ipmaxSrc.ext = ccnt; if( as.ipMaxSrc.ext < ccnt ) as.ipMaxSrc.ext = ccnt;
} }
else else
{ {
const auto csum = it->second.ext + ccnt; const auto csum = it->second.ext + ccnt;
it->second.ext = csum; it->second.ext = csum;
if( ipmaxSrc.ext < csum ) ipmaxSrc.ext = csum; if( as.ipMaxSrc.ext < csum ) as.ipMaxSrc.ext = csum;
} }
iptotalSrc.ext += ccnt; as.ipTotalSrc.ext += ccnt;
} }
} }
} }

View File

@ -126,6 +126,15 @@ private:
} }
}; };
struct AddrStatData
{
AddrStat ipTotalSrc = {};
AddrStat ipTotalAsm = {};
AddrStat ipMaxSrc = {};
AddrStat ipMaxAsm = {};
unordered_flat_map<uint64_t, AddrStat> ipCountSrc, ipCountAsm;
};
public: public:
using GetWindowCallback = void*(*)(); using GetWindowCallback = void*(*)();
@ -149,20 +158,20 @@ private:
void RenderSimpleSourceView(); void RenderSimpleSourceView();
void RenderSymbolView( Worker& worker, View& view ); void RenderSymbolView( Worker& worker, View& view );
void RenderSymbolSourceView( const AddrStat& iptotal, const unordered_flat_map<uint64_t, AddrStat>& ipcount, const unordered_flat_map<uint64_t, AddrStat>& ipcountAsm, const AddrStat& ipmax, Worker& worker, const View& view ); void RenderSymbolSourceView( const AddrStatData& as, Worker& worker, const View& view );
uint64_t RenderSymbolAsmView( const AddrStat& iptotal, const unordered_flat_map<uint64_t, AddrStat>& ipcount, const AddrStat& ipmax, Worker& worker, View& view ); uint64_t RenderSymbolAsmView( const AddrStatData& as, Worker& worker, View& view );
void RenderLine( const Tokenizer::Line& line, int lineNum, const AddrStat& ipcnt, const AddrStat& iptotal, const AddrStat& ipmax, Worker* worker, const View* view ); void RenderLine( const Tokenizer::Line& line, int lineNum, const AddrStat& ipcnt, const AddrStatData& as, Worker* worker, const View* view );
void RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const AddrStat& iptotal, const AddrStat& ipmax, Worker& worker, uint64_t& jumpOut, int maxAddrLen, View& view ); void RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const AddrStatData& as, Worker& worker, uint64_t& jumpOut, int maxAddrLen, View& view );
void RenderHwLinePart( size_t cycles, size_t retired, size_t branchRetired, size_t branchMiss, size_t cacheRef, size_t cacheMiss, const ImVec2& ts ); void RenderHwLinePart( size_t cycles, size_t retired, size_t branchRetired, size_t branchMiss, size_t cacheRef, size_t cacheMiss, const ImVec2& ts );
void SelectLine( uint32_t line, const Worker* worker, bool changeAsmLine = true, uint64_t targetAddr = 0 ); void SelectLine( uint32_t line, const Worker* worker, bool changeAsmLine = true, uint64_t targetAddr = 0 );
void SelectAsmLines( uint32_t file, uint32_t line, const Worker& worker, bool changeAsmLine = true, uint64_t targetAddr = 0 ); void SelectAsmLines( uint32_t file, uint32_t line, const Worker& worker, bool changeAsmLine = true, uint64_t targetAddr = 0 );
void SelectAsmLinesHover( uint32_t file, uint32_t line, const Worker& worker ); void SelectAsmLinesHover( uint32_t file, uint32_t line, const Worker& worker );
void GatherIpHwStats( AddrStat& iptotalSrc, AddrStat& iptotalAsm, unordered_flat_map<uint64_t, AddrStat>& ipcountSrc, unordered_flat_map<uint64_t, AddrStat>& ipcountAsm, AddrStat& ipmaxSrc, AddrStat& ipmaxAsm, Worker& worker, const View& view, CostType cost ); void GatherIpHwStats( AddrStatData& as, Worker& worker, const View& view, CostType cost );
void GatherIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrStat& iptotalAsm, unordered_flat_map<uint64_t, AddrStat>& ipcountSrc, unordered_flat_map<uint64_t, AddrStat>& ipcountAsm, AddrStat& ipmaxSrc, AddrStat& ipmaxAsm, const Worker& worker, bool limitView, const View& view ); void GatherIpStats( uint64_t baseAddr, AddrStatData& as, const Worker& worker, bool limitView, const View& view );
void GatherAdditionalIpStats( uint64_t baseAddr, AddrStat& iptotalSrc, AddrStat& iptotalAsm, unordered_flat_map<uint64_t, AddrStat>& ipcountSrc, unordered_flat_map<uint64_t, AddrStat>& ipcountAsm, AddrStat& ipmaxSrc, AddrStat& ipmaxAsm, const Worker& worker, bool limitView, const View& view ); void GatherAdditionalIpStats( uint64_t baseAddr, AddrStatData& as, const Worker& worker, bool limitView, const View& view );
uint32_t CountAsmIpStats( uint64_t baseAddr, const Worker& worker, bool limitView, const View& view ); uint32_t CountAsmIpStats( uint64_t baseAddr, const Worker& worker, bool limitView, const View& view );
void CountHwStats( unordered_flat_map<uint64_t, AddrStat>& hwCountSrc, unordered_flat_map<uint64_t, AddrStat>& hwCountAsm, AddrStat& hwMaxSrc, AddrStat& hwMaxAsm, Worker& worker, const View& view ); void CountHwStats( unordered_flat_map<uint64_t, AddrStat>& hwCountSrc, unordered_flat_map<uint64_t, AddrStat>& hwCountAsm, AddrStat& hwMaxSrc, AddrStat& hwMaxAsm, Worker& worker, const View& view );