| Index: tools/ignition/linux_perf_report.py
|
| diff --git a/tools/ignition/linux_perf_report.py b/tools/ignition/linux_perf_report.py
|
| index eaf85b3f91efd21dd62fa5ba9d78d559a6e3fab6..69db37cbae4b276005a06e510e007378a0a96f8e 100755
|
| --- a/tools/ignition/linux_perf_report.py
|
| +++ b/tools/ignition/linux_perf_report.py
|
| @@ -52,6 +52,8 @@ examples:
|
|
|
| COMPILER_SYMBOLS_RE = re.compile(
|
| r"v8::internal::(?:\(anonymous namespace\)::)?Compile|v8::internal::Parser")
|
| +JIT_CODE_SYMBOLS_RE = re.compile(
|
| + r"(LazyCompile|Compile|Eval|Script):(\*|~)")
|
|
|
|
|
| def strip_function_parameters(symbol):
|
| @@ -70,7 +72,8 @@ def strip_function_parameters(symbol):
|
| return symbol[:-pos]
|
|
|
|
|
| -def collapsed_callchains_generator(perf_stream, show_all=False,
|
| +def collapsed_callchains_generator(perf_stream, hide_other=False,
|
| + hide_compiler=False, hide_jit=False,
|
| show_full_signatures=False):
|
| current_chain = []
|
| skip_until_end_of_chain = False
|
| @@ -85,7 +88,8 @@ def collapsed_callchains_generator(perf_stream, show_all=False,
|
|
|
| # Empty line signals the end of the callchain.
|
| if not line:
|
| - if not skip_until_end_of_chain and current_chain and show_all:
|
| + if (not skip_until_end_of_chain and current_chain
|
| + and not hide_other):
|
| current_chain.append("[other]")
|
| yield current_chain
|
| # Reset parser status.
|
| @@ -101,14 +105,26 @@ def collapsed_callchains_generator(perf_stream, show_all=False,
|
| symbol = line.split(" ", 1)[1].split("+", 1)[0]
|
| if not show_full_signatures:
|
| symbol = strip_function_parameters(symbol)
|
| +
|
| + # Avoid chains of [unknown]
|
| + if (symbol == "[unknown]" and current_chain and
|
| + current_chain[-1] == "[unknown]"):
|
| + continue
|
| +
|
| current_chain.append(symbol)
|
|
|
| if symbol.startswith("BytecodeHandler:"):
|
| + current_chain.append("[interpreter]")
|
| yield current_chain
|
| skip_until_end_of_chain = True
|
| + elif JIT_CODE_SYMBOLS_RE.match(symbol):
|
| + if not hide_jit:
|
| + current_chain.append("[jit]")
|
| + yield current_chain
|
| + skip_until_end_of_chain = True
|
| elif symbol == "Stub:CEntryStub" and compiler_symbol_in_chain:
|
| - if show_all:
|
| - current_chain[-1] = "[compiler]"
|
| + if not hide_compiler:
|
| + current_chain.append("[compiler]")
|
| yield current_chain
|
| skip_until_end_of_chain = True
|
| elif COMPILER_SYMBOLS_RE.match(symbol):
|
| @@ -181,8 +197,18 @@ def parse_command_line():
|
| dest="output_flamegraph"
|
| )
|
| command_line_parser.add_argument(
|
| - "--show-all", "-a",
|
| - help="show samples outside Ignition bytecode handlers",
|
| + "--hide-other",
|
| + help="Hide other samples",
|
| + action="store_true"
|
| + )
|
| + command_line_parser.add_argument(
|
| + "--hide-compiler",
|
| + help="Hide samples during compilation",
|
| + action="store_true"
|
| + )
|
| + command_line_parser.add_argument(
|
| + "--hide-jit",
|
| + help="Hide samples from JIT code execution",
|
| action="store_true"
|
| )
|
| command_line_parser.add_argument(
|
| @@ -210,8 +236,8 @@ def main():
|
| stdout=subprocess.PIPE)
|
|
|
| callchains = collapsed_callchains_generator(
|
| - perf.stdout, program_options.show_all,
|
| - program_options.show_full_signatures)
|
| + perf.stdout, program_options.hide_other, program_options.hide_compiler,
|
| + program_options.hide_jit, program_options.show_full_signatures)
|
|
|
| if program_options.output_flamegraph:
|
| write_flamegraph_input_file(program_options.output_stream, callchains)
|
|
|