• Seth Brenith's avatar
    [diagnostics] Support --turbo-profiling for builtins · 18c73676
    Seth Brenith authored
    Currently, if d8 is run with the --turbo-profiling flag, it prints info
    about every TurboFan-compiled function. This info includes the number of
    times that each basic block in the function was run. It also includes
    text representations of the function's schedule and code, so that the
    person reading the output can associate counters with blocks of code.
    
    The data about each function is currently stored in a
    BasicBlockProfiler::Data instance, which is attached to a list owned by
    the singleton BasicBlockProfiler. Each Data contains an
    std::vector<uint32_t> which represents how many times each block in the
    function has executed. The generated code for each block uses a raw
    pointer into the storage of that vector to implement incrementing the
    counter.
    
    With this change, if you compile with v8_enable_builtins_profiling and
    then run with --turbo-profiling, d8 will print that same info about
    builtins too.
    
    In order to generate code that can survive being serialized to a
    snapshot and reloaded, this change uses counters in the JS heap instead
    of a std::vector outside the JS heap. The steps for instrumentation are
    as follows:
    
    1. Between scheduling and instruction selection, add code to increment
       the counter for each block. The counters array doesn't yet exist at
       this point, and allocation is disallowed, so at this point the code
       refers to a special marker value.
    2. During finalization of the code, allocate a BasicBlockProfilingData
       object on the JS heap containing data equivalent to what is stored in
       BasicBlockProfiler::Data. This includes a ByteArray that is big
       enough to store the counters for each block.
    3. Patch the reference in the BuiltinsConstantsTableBuilder so that
       instead of referring to the marker object, it now refers to this
       ByteArray. Also add the BasicBlockProfilingData object to a list that
       is attached to the heap roots so it can be easily accessed for
       printing.
    
    Because these steps include modifying the BuiltinsConstantsTableBuilder,
    this procedure is only applicable to builtins. Runtime-generated code
    still uses raw pointers into std::vector instances. In order to keep
    divergence between these code paths to a minimum, most work is done
    referring to instances of BasicBlockProfiler::Data (the C++ class), and
    functions are provided to copy back and forth between that type and
    BasicBlockProfilingData (the JS heap object).
    
    This change is intended only to make --turbo-profiling work consistently
    on more kinds of functions, but with some further work, this data could
    form the basis for:
    - code coverage info for fuzzers, and/or
    - hot-path info for profile-guided optimization.
    
    Bug: v8:10470, v8:9119
    Change-Id: Ib556a5bc3abe67cdaa2e3ee62702a2a08b11cb61
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2159738
    Commit-Queue: Seth Brenith <seth.brenith@microsoft.com>
    Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
    Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#67944}
    18c73676
Name
Last commit
Last update
..
blink_tests Loading commit data...
cfi Loading commit data...
clusterfuzz Loading commit data...
debug_helper Loading commit data...
dev Loading commit data...
gcmole Loading commit data...
generate_shim_headers Loading commit data...
heap-stats Loading commit data...
ignition Loading commit data...
jsfunfuzz Loading commit data...
link_clicker.extension Loading commit data...
mb Loading commit data...
memory Loading commit data...
msan Loading commit data...
ninja Loading commit data...
node Loading commit data...
perf Loading commit data...
profview Loading commit data...
profviz Loading commit data...
release Loading commit data...
sanitizers Loading commit data...
snapshot Loading commit data...
sodium Loading commit data...
testrunner Loading commit data...
toolchain Loading commit data...
torque Loading commit data...
tracing/proto-converter Loading commit data...
turbolizer Loading commit data...
ubsan Loading commit data...
unittests Loading commit data...
v8.xcodeproj Loading commit data...
v8windbg Loading commit data...
valgrind/asan Loading commit data...
vim Loading commit data...
visual_studio Loading commit data...
wasm Loading commit data...
wasm-compilation-hints Loading commit data...
BUILD.gn Loading commit data...
DEPS Loading commit data...
Makefile.tags Loading commit data...
OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
SourceMap.js Loading commit data...
__init__.py Loading commit data...
adb-d8.py Loading commit data...
android-build.sh Loading commit data...
android-ll-prof.sh Loading commit data...
android-run.py Loading commit data...
android-sync.sh Loading commit data...
arguments.js Loading commit data...
avg.py Loading commit data...
bash-completion.sh Loading commit data...
bigint-tester.py Loading commit data...
callstats.html Loading commit data...
callstats.py Loading commit data...
callstats.py.vpython Loading commit data...
callstats_groups.py Loading commit data...
check-inline-includes.sh Loading commit data...
check-static-initializers.sh Loading commit data...
check-unused-bailouts.sh Loading commit data...
check-unused-symbols.sh Loading commit data...
codemap.js Loading commit data...
collect_deprecation_stats.sh Loading commit data...
compare-table-gen.js Loading commit data...
compare_torque_output.py Loading commit data...
consarray.js Loading commit data...
cpu.sh Loading commit data...
cross_build_gcc.sh Loading commit data...
csvparser.js Loading commit data...
deprecation_stats.py Loading commit data...
detect-builtins.js Loading commit data...
disasm.py Loading commit data...
draw_instruction_graph.sh Loading commit data...
dump-cpp.py Loading commit data...
dumpcpp-driver.js Loading commit data...
dumpcpp.js Loading commit data...
eval_gc_nvp.py Loading commit data...
eval_gc_time.sh Loading commit data...
find-commit-for-patch.py Loading commit data...
find_depot_tools.py Loading commit data...
freebsd-tick-processor Loading commit data...
fuzz-harness.sh Loading commit data...
gc-nvp-to-csv.py Loading commit data...
gc-nvp-trace-processor.py Loading commit data...
gc_nvp_common.py Loading commit data...
gdb-v8-support.py Loading commit data...
gdbinit Loading commit data...
gen-inlining-tests.py Loading commit data...
gen-keywords-gen-h.py Loading commit data...
gen-postmortem-metadata.py Loading commit data...
generate-builtins-tests.py Loading commit data...
generate-header-include-checks.py Loading commit data...
generate-runtime-call-stats.py Loading commit data...
generate-ten-powers.scm Loading commit data...
get_landmines.py Loading commit data...
grokdump.py Loading commit data...
ic-explorer.html Loading commit data...
ic-processor Loading commit data...
ic-processor-driver.js Loading commit data...
ic-processor.js Loading commit data...
inspect-d8.js Loading commit data...
linux-tick-processor Loading commit data...
ll_prof.py Loading commit data...
lldb_commands.py Loading commit data...
locs.py Loading commit data...
logreader.js Loading commit data...
mac-nm Loading commit data...
mac-tick-processor Loading commit data...
map-processor Loading commit data...
map-processor-driver.js Loading commit data...
map-processor.html Loading commit data...
map-processor.js Loading commit data...
objdump-v8 Loading commit data...
parse-processor Loading commit data...
parse-processor-driver.js Loading commit data...
parse-processor.html Loading commit data...
parse-processor.js Loading commit data...
perf-compare.py Loading commit data...
plot-timer-events Loading commit data...
predictable_wrapper.py Loading commit data...
profile.js Loading commit data...
profile_view.js Loading commit data...
regexp-sequences.py Loading commit data...
run-clang-tidy.py Loading commit data...
run-llprof.sh Loading commit data...
run-num-fuzzer.py Loading commit data...
run-perf.sh Loading commit data...
run-tests.py Loading commit data...
run-wasm-api-tests.py Loading commit data...
run.py Loading commit data...
run_perf.py Loading commit data...
shell-utils.h Loading commit data...
splaytree.js Loading commit data...
stats-viewer.py Loading commit data...
test262-results-parser.js Loading commit data...
tick-processor.html Loading commit data...
tickprocessor-driver.js Loading commit data...
tickprocessor.js Loading commit data...
trace-maps-processor.py Loading commit data...
try_perf.py Loading commit data...
turbolizer-perf.py Loading commit data...
update-object-macros-undef.py Loading commit data...
v8_presubmit.py Loading commit data...
v8heapconst.py Loading commit data...
whitespace.txt Loading commit data...
windbg.js Loading commit data...
windows-tick-processor.bat Loading commit data...