mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-23 06:44:35 +00:00
Sort symbols list only when actually needed.
This commit is contained in:
parent
b978a7c652
commit
864d7e4e47
@ -506,7 +506,7 @@ void SourceView::OpenSource( const char* fileName, int line, const View& view, c
|
|||||||
assert( !m_source.empty() );
|
assert( !m_source.empty() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void SourceView::OpenSymbol( const char* fileName, int line, uint64_t baseAddr, uint64_t symAddr, const Worker& worker, const View& view )
|
void SourceView::OpenSymbol( const char* fileName, int line, uint64_t baseAddr, uint64_t symAddr, Worker& worker, const View& view )
|
||||||
{
|
{
|
||||||
m_targetLine = line;
|
m_targetLine = line;
|
||||||
m_targetAddr = symAddr;
|
m_targetAddr = symAddr;
|
||||||
|
@ -146,7 +146,7 @@ public:
|
|||||||
void SetCpuId( uint32_t cpuid );
|
void SetCpuId( uint32_t cpuid );
|
||||||
|
|
||||||
void OpenSource( const char* fileName, int line, const View& view, const Worker& worker );
|
void OpenSource( const char* fileName, int line, const View& view, const Worker& worker );
|
||||||
void OpenSymbol( const char* fileName, int line, uint64_t baseAddr, uint64_t symAddr, const Worker& worker, const View& view );
|
void OpenSymbol( const char* fileName, int line, uint64_t baseAddr, uint64_t symAddr, Worker& worker, const View& view );
|
||||||
void Render( Worker& worker, View& view );
|
void Render( Worker& worker, View& view );
|
||||||
|
|
||||||
void CalcInlineStats( bool val ) { m_calcInlineStats = val; }
|
void CalcInlineStats( bool val ) { m_calcInlineStats = val; }
|
||||||
|
@ -2545,15 +2545,17 @@ const char* Worker::GetSymbolCode( uint64_t sym, uint32_t& len ) const
|
|||||||
return it->second.data;
|
return it->second.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t Worker::GetSymbolForAddress( uint64_t address ) const
|
uint64_t Worker::GetSymbolForAddress( uint64_t address )
|
||||||
{
|
{
|
||||||
|
DoPostponedSymbols();
|
||||||
auto it = std::lower_bound( m_data.symbolLoc.begin(), m_data.symbolLoc.end(), address, [] ( const auto& l, const auto& r ) { return l.addr + l.len < r; } );
|
auto it = std::lower_bound( m_data.symbolLoc.begin(), m_data.symbolLoc.end(), address, [] ( const auto& l, const auto& r ) { return l.addr + l.len < r; } );
|
||||||
if( it == m_data.symbolLoc.end() || address < it->addr ) return 0;
|
if( it == m_data.symbolLoc.end() || address < it->addr ) return 0;
|
||||||
return it->addr;
|
return it->addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t Worker::GetSymbolForAddress( uint64_t address, uint32_t& offset ) const
|
uint64_t Worker::GetSymbolForAddress( uint64_t address, uint32_t& offset )
|
||||||
{
|
{
|
||||||
|
DoPostponedSymbols();
|
||||||
auto it = std::lower_bound( m_data.symbolLoc.begin(), m_data.symbolLoc.end(), address, [] ( const auto& l, const auto& r ) { return l.addr + l.len < r; } );
|
auto it = std::lower_bound( m_data.symbolLoc.begin(), m_data.symbolLoc.end(), address, [] ( const auto& l, const auto& r ) { return l.addr + l.len < r; } );
|
||||||
if( it == m_data.symbolLoc.end() || address < it->addr ) return 0;
|
if( it == m_data.symbolLoc.end() || address < it->addr ) return 0;
|
||||||
offset = address - it->addr;
|
offset = address - it->addr;
|
||||||
@ -2595,8 +2597,9 @@ const Vector<uint64_t>* Worker::GetAddressesForLocation( uint32_t fileStringIdx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint64_t* Worker::GetInlineSymbolList( uint64_t sym, uint32_t len ) const
|
const uint64_t* Worker::GetInlineSymbolList( uint64_t sym, uint32_t len )
|
||||||
{
|
{
|
||||||
|
DoPostponedInlineSymbols();
|
||||||
auto it = std::lower_bound( m_data.symbolLocInline.begin(), m_data.symbolLocInline.end(), sym );
|
auto it = std::lower_bound( m_data.symbolLocInline.begin(), m_data.symbolLocInline.end(), sym );
|
||||||
if( it == m_data.symbolLocInline.end() ) return nullptr;
|
if( it == m_data.symbolLocInline.end() ) return nullptr;
|
||||||
if( *it >= sym + len ) return nullptr;
|
if( *it >= sym + len ) return nullptr;
|
||||||
@ -4295,9 +4298,41 @@ void Worker::HandleFrameName( uint64_t name, const char* str, size_t sz )
|
|||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Worker::DoPostponedSymbols()
|
||||||
|
{
|
||||||
|
if( m_data.newSymbolsIndex >= 0 )
|
||||||
|
{
|
||||||
|
#ifdef NO_PARALLEL_SORT
|
||||||
|
pdqsort_branchless( m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } );
|
||||||
|
#else
|
||||||
|
std::sort( std::execution::par_unseq, m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } );
|
||||||
|
#endif
|
||||||
|
const auto ms = std::lower_bound( m_data.symbolLoc.begin(), m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc[m_data.newSymbolsIndex], [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } );
|
||||||
|
std::inplace_merge( ms, m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } );
|
||||||
|
m_data.newSymbolsIndex = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worker::DoPostponedInlineSymbols()
|
||||||
|
{
|
||||||
|
if( m_data.newInlineSymbolsIndex >= 0 )
|
||||||
|
{
|
||||||
|
#ifdef NO_PARALLEL_SORT
|
||||||
|
pdqsort_branchless( m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline.end() );
|
||||||
|
#else
|
||||||
|
std::sort( std::execution::par_unseq, m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline.end() );
|
||||||
|
#endif
|
||||||
|
const auto ms = std::lower_bound( m_data.symbolLocInline.begin(), m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline[m_data.newInlineSymbolsIndex] );
|
||||||
|
std::inplace_merge( ms, m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline.end() );
|
||||||
|
m_data.newInlineSymbolsIndex = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Worker::DoPostponedWorkAll()
|
void Worker::DoPostponedWorkAll()
|
||||||
{
|
{
|
||||||
DoPostponedWork();
|
DoPostponedWork();
|
||||||
|
DoPostponedSymbols();
|
||||||
|
DoPostponedInlineSymbols();
|
||||||
|
|
||||||
for( auto& plot : m_data.plots.Data() )
|
for( auto& plot : m_data.plots.Data() )
|
||||||
{
|
{
|
||||||
@ -4362,29 +4397,6 @@ void Worker::DoPostponedWork()
|
|||||||
m_data.newContextSwitchesReceived = false;
|
m_data.newContextSwitchesReceived = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( m_data.newSymbolsIndex >= 0 )
|
|
||||||
{
|
|
||||||
#ifdef NO_PARALLEL_SORT
|
|
||||||
pdqsort_branchless( m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } );
|
|
||||||
#else
|
|
||||||
std::sort( std::execution::par_unseq, m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } );
|
|
||||||
#endif
|
|
||||||
const auto ms = std::lower_bound( m_data.symbolLoc.begin(), m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc[m_data.newSymbolsIndex], [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } );
|
|
||||||
std::inplace_merge( ms, m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } );
|
|
||||||
m_data.newSymbolsIndex = -1;
|
|
||||||
}
|
|
||||||
if( m_data.newInlineSymbolsIndex >= 0 )
|
|
||||||
{
|
|
||||||
#ifdef NO_PARALLEL_SORT
|
|
||||||
pdqsort_branchless( m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline.end() );
|
|
||||||
#else
|
|
||||||
std::sort( std::execution::par_unseq, m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline.end() );
|
|
||||||
#endif
|
|
||||||
const auto ms = std::lower_bound( m_data.symbolLocInline.begin(), m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline[m_data.newInlineSymbolsIndex] );
|
|
||||||
std::inplace_merge( ms, m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline.end() );
|
|
||||||
m_data.newInlineSymbolsIndex = -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TRACY_NO_STATISTICS
|
#ifndef TRACY_NO_STATISTICS
|
||||||
|
@ -511,13 +511,13 @@ public:
|
|||||||
const SymbolData* GetSymbolData( uint64_t sym ) const;
|
const SymbolData* GetSymbolData( uint64_t sym ) const;
|
||||||
bool HasSymbolCode( uint64_t sym ) const;
|
bool HasSymbolCode( uint64_t sym ) const;
|
||||||
const char* GetSymbolCode( uint64_t sym, uint32_t& len ) const;
|
const char* GetSymbolCode( uint64_t sym, uint32_t& len ) const;
|
||||||
uint64_t GetSymbolForAddress( uint64_t address ) const;
|
uint64_t GetSymbolForAddress( uint64_t address );
|
||||||
uint64_t GetSymbolForAddress( uint64_t address, uint32_t& offset ) const;
|
uint64_t GetSymbolForAddress( uint64_t address, uint32_t& offset );
|
||||||
uint64_t GetInlineSymbolForAddress( uint64_t address ) const;
|
uint64_t GetInlineSymbolForAddress( uint64_t address ) const;
|
||||||
bool HasInlineSymbolAddresses() const { return !m_data.codeSymbolMap.empty(); }
|
bool HasInlineSymbolAddresses() const { return !m_data.codeSymbolMap.empty(); }
|
||||||
StringIdx GetLocationForAddress( uint64_t address, uint32_t& line ) const;
|
StringIdx GetLocationForAddress( uint64_t address, uint32_t& line ) const;
|
||||||
const Vector<uint64_t>* GetAddressesForLocation( uint32_t fileStringIdx, uint32_t line ) const;
|
const Vector<uint64_t>* GetAddressesForLocation( uint32_t fileStringIdx, uint32_t line ) const;
|
||||||
const uint64_t* GetInlineSymbolList( uint64_t sym, uint32_t len ) const;
|
const uint64_t* GetInlineSymbolList( uint64_t sym, uint32_t len );
|
||||||
|
|
||||||
#ifndef TRACY_NO_STATISTICS
|
#ifndef TRACY_NO_STATISTICS
|
||||||
const VarArray<CallstackFrameId>& GetParentCallstack( uint32_t idx ) const { return *m_data.parentCallstackPayload[idx]; }
|
const VarArray<CallstackFrameId>& GetParentCallstack( uint32_t idx ) const { return *m_data.parentCallstackPayload[idx]; }
|
||||||
@ -623,6 +623,8 @@ public:
|
|||||||
|
|
||||||
std::pair<uint64_t, uint64_t> GetTextureCompressionBytes() const { return std::make_pair( m_texcomp.GetInputBytesCount(), m_texcomp.GetOutputBytesCount() ); }
|
std::pair<uint64_t, uint64_t> GetTextureCompressionBytes() const { return std::make_pair( m_texcomp.GetInputBytesCount(), m_texcomp.GetOutputBytesCount() ); }
|
||||||
|
|
||||||
|
void DoPostponedSymbols();
|
||||||
|
void DoPostponedInlineSymbols();
|
||||||
void DoPostponedWork();
|
void DoPostponedWork();
|
||||||
void DoPostponedWorkAll();
|
void DoPostponedWorkAll();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user