mirror of
https://github.com/jlfwong/speedscope.git
synced 2024-11-26 07:35:55 +03:00
import: callgrind.ts: Improved collection of file names associated with functions
When called function is within an inlined code block, it should use file names provided by 'fi' or 'fe' commands. Also, when 'fn' command is called, it sets the current file name to the value provided in the previous 'fl' call. Also, the file associated with 'fn' should be stored separately so that it is not overwritten by new 'fl' calls (Callgrind does not tell whether there can be multiple 'fl' calls without following 'fn' calls, and this should guard the parser from associating the wrong new file name with the previous 'fn' function). This modification fixes detached call stacks, which were created when one function has been called from inline block without the file source update, which led to duplicated entries, which were later not removed when determining root functions. Signed-off-by: Grzegorz Latosinski <glatosinski@antmicro.com>
This commit is contained in:
parent
0121cf9342
commit
20bc6cebee
@ -342,6 +342,8 @@ class CallgrindParser {
|
|||||||
|
|
||||||
private filename: string | null = null
|
private filename: string | null = null
|
||||||
private functionName: string | null = null
|
private functionName: string | null = null
|
||||||
|
private functionFile: string | null = null
|
||||||
|
private currentFunctionFile: string | null = null
|
||||||
private calleeFilename: string | null = null
|
private calleeFilename: string | null = null
|
||||||
private calleeFunctionName: string | null = null
|
private calleeFunctionName: string | null = null
|
||||||
|
|
||||||
@ -396,7 +398,7 @@ class CallgrindParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private frameInfo(): FrameInfo {
|
private frameInfo(): FrameInfo {
|
||||||
const file = this.filename || '(unknown)'
|
const file = this.functionFile || '(unknown)'
|
||||||
const name = this.functionName || '(unknown)'
|
const name = this.functionName || '(unknown)'
|
||||||
const key = `${file}:${name}`
|
const key = `${file}:${name}`
|
||||||
return {key, name, file}
|
return {key, name, file}
|
||||||
@ -445,23 +447,29 @@ class CallgrindParser {
|
|||||||
case 'fe':
|
case 'fe':
|
||||||
case 'fi': {
|
case 'fi': {
|
||||||
// fe/fi are used to indicate the source-file of a function definition
|
// fe/fi are used to indicate the source-file of a function definition
|
||||||
// changed mid-definition. This is for inlined code, but doesn't
|
// changed mid-definition. This is for inlined code, but when a function
|
||||||
// indicate that we've actually switched to referring to a different
|
// is called from within the inlined code, it is indicated that it
|
||||||
// function, so we mostly ignore it.
|
// comes from file marked by fe/fi.
|
||||||
//
|
this.filename = this.parseNameWithCompression(value, this.savedFileNames)
|
||||||
// We still need to do the parseNameWithCompression call in case a name
|
|
||||||
// is defined and then referenced later on for name compression.
|
|
||||||
this.parseNameWithCompression(value, this.savedFileNames)
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'fl': {
|
case 'fl': {
|
||||||
this.filename = this.parseNameWithCompression(value, this.savedFileNames)
|
this.filename = this.parseNameWithCompression(value, this.savedFileNames)
|
||||||
|
// The 'fl' needs to be stored in order to reset current filename upon
|
||||||
|
// consecutive 'fn' calls
|
||||||
|
this.currentFunctionFile = this.filename
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'fn': {
|
case 'fn': {
|
||||||
|
// the file for a function defined with 'fn' always comes from 'fl'
|
||||||
|
// It also resets the current filename to previous 'fl' value, as in KCacheGrind:
|
||||||
|
// https://github.com/KDE/kcachegrind/blob/ea4314db2785cb8f279fe884ee7f82445642b692/libcore/cachegrindloader.cpp#L808
|
||||||
|
if (this.filename !== this.currentFunctionFile) this.filename = this.currentFunctionFile
|
||||||
this.functionName = this.parseNameWithCompression(value, this.savedFunctionNames)
|
this.functionName = this.parseNameWithCompression(value, this.savedFunctionNames)
|
||||||
|
// store function file associated with 'fn' function
|
||||||
|
this.functionFile = this.filename
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user