1
0
mirror of https://github.com/wolfpld/tracy synced 2025-04-29 04:23:51 +00:00

Calculate inline symbols list earlier.

This commit is contained in:
Bartosz Taudul 2024-09-24 18:59:51 +02:00
parent 9b9a883d07
commit ae2a7c60b8
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3

View File

@ -270,6 +270,100 @@ void View::DrawSamplesStatistics( Vector<SymList>& data, int64_t timeRange, Accu
}
}
}
Vector<SymList> inSymList;
if( !m_statSeparateInlines && !hasNoSamples && v.count > 0 && v.symAddr != 0 && expand )
{
assert( v.count > 0 );
assert( symlen != 0 );
auto inSym = m_worker.GetInlineSymbolList( v.symAddr, symlen );
assert( inSym != nullptr );
const auto symEnd = v.symAddr + symlen;
if( !m_mergeInlines )
{
while( *inSym < symEnd )
{
auto sit = inlineMap.find( *inSym );
if( sit != inlineMap.end() )
{
inSymList.push_back( SymList { *inSym, sit->second.incl, sit->second.excl } );
}
else
{
inSymList.push_back( SymList { *inSym, 0, 0 } );
}
inSym++;
}
}
else
{
unordered_flat_map<uint32_t, uint64_t> mergeMap;
unordered_flat_map<uint64_t, SymList> outMap;
while( *inSym < symEnd )
{
auto symAddr = *inSym;
auto sit = inlineMap.find( symAddr );
auto sym = symMap.find( symAddr );
assert( sym != symMap.end() );
auto mit = mergeMap.find( sym->second.name.Idx() );
if( mit == mergeMap.end() )
{
mergeMap.emplace( sym->second.name.Idx(), symAddr );
}
else
{
symAddr = mit->second;
}
if( sit != inlineMap.end() )
{
auto oit = outMap.find( symAddr );
if( oit == outMap.end() )
{
outMap.emplace( symAddr, SymList { symAddr, sit->second.incl, sit->second.excl, 1 } );
}
else
{
oit->second.incl += sit->second.incl;
oit->second.excl += sit->second.excl;
oit->second.count++;
}
}
else
{
auto oit = outMap.find( symAddr );
if( oit == outMap.end() )
{
outMap.emplace( symAddr, SymList { symAddr, 0, 0, 1 } );
}
else
{
oit->second.count++;
}
}
inSym++;
}
inSymList.reserve( outMap.size() );
for( auto& v : outMap )
{
inSymList.push_back( v.second );
}
}
auto statIt = inlineMap.find( v.symAddr );
if( statIt != inlineMap.end() )
{
inSymList.push_back( SymList { v.symAddr, statIt->second.incl, statIt->second.excl } );
}
if( accumulationMode == AccumulationMode::SelfOnly )
{
pdqsort_branchless( inSymList.begin(), inSymList.end(), []( const auto& l, const auto& r ) { return l.excl != r.excl ? l.excl > r.excl : l.symAddr < r.symAddr; } );
}
else
{
pdqsort_branchless( inSymList.begin(), inSymList.end(), []( const auto& l, const auto& r ) { return l.incl != l.incl ? l.incl > r.incl : l.symAddr < r.symAddr; } );
}
}
if( hasNoSamples )
{
if( isKernel )
@ -419,97 +513,7 @@ void View::DrawSamplesStatistics( Vector<SymList>& data, int64_t timeRange, Accu
if( !m_statSeparateInlines && expand )
{
assert( v.count > 0 );
assert( symlen != 0 );
const auto revBaseCnt = 100.0 / baseCnt;
auto inSym = m_worker.GetInlineSymbolList( v.symAddr, symlen );
assert( inSym != nullptr );
const auto symEnd = v.symAddr + symlen;
Vector<SymList> inSymList;
if( !m_mergeInlines )
{
while( *inSym < symEnd )
{
auto sit = inlineMap.find( *inSym );
if( sit != inlineMap.end() )
{
inSymList.push_back( SymList { *inSym, sit->second.incl, sit->second.excl } );
}
else
{
inSymList.push_back( SymList { *inSym, 0, 0 } );
}
inSym++;
}
}
else
{
unordered_flat_map<uint32_t, uint64_t> mergeMap;
unordered_flat_map<uint64_t, SymList> outMap;
while( *inSym < symEnd )
{
auto symAddr = *inSym;
auto sit = inlineMap.find( symAddr );
auto sym = symMap.find( symAddr );
assert( sym != symMap.end() );
auto mit = mergeMap.find( sym->second.name.Idx() );
if( mit == mergeMap.end() )
{
mergeMap.emplace( sym->second.name.Idx(), symAddr );
}
else
{
symAddr = mit->second;
}
if( sit != inlineMap.end() )
{
auto oit = outMap.find( symAddr );
if( oit == outMap.end() )
{
outMap.emplace( symAddr, SymList { symAddr, sit->second.incl, sit->second.excl, 1 } );
}
else
{
oit->second.incl += sit->second.incl;
oit->second.excl += sit->second.excl;
oit->second.count++;
}
}
else
{
auto oit = outMap.find( symAddr );
if( oit == outMap.end() )
{
outMap.emplace( symAddr, SymList { symAddr, 0, 0, 1 } );
}
else
{
oit->second.count++;
}
}
inSym++;
}
inSymList.reserve( outMap.size() );
for( auto& v : outMap )
{
inSymList.push_back( v.second );
}
}
auto statIt = inlineMap.find( v.symAddr );
if( statIt != inlineMap.end() )
{
inSymList.push_back( SymList { v.symAddr, statIt->second.incl, statIt->second.excl } );
}
if( accumulationMode == AccumulationMode::SelfOnly )
{
pdqsort_branchless( inSymList.begin(), inSymList.end(), []( const auto& l, const auto& r ) { return l.excl != r.excl ? l.excl > r.excl : l.symAddr < r.symAddr; } );
}
else
{
pdqsort_branchless( inSymList.begin(), inSymList.end(), []( const auto& l, const auto& r ) { return l.incl != l.incl ? l.incl > r.incl : l.symAddr < r.symAddr; } );
}
ImGui::Indent();
for( auto& iv : inSymList )
{