diff options
author | John Högberg <john@erlang.org> | 2023-02-02 10:45:54 +0100 |
---|---|---|
committer | John Högberg <john@erlang.org> | 2023-02-06 09:30:55 +0100 |
commit | 9202747f16e13fce4e625aa7c1193afccb32d571 (patch) | |
tree | bc1428694b6ed405f0cdf659b8d3947dd12b3f82 /erts/emulator/beam | |
parent | b6bb1c9ae9467117cc40d0dc91cdb9b3ec9e96ca (diff) | |
download | erlang-9202747f16e13fce4e625aa7c1193afccb32d571.tar.gz |
erts: Add `+JPperf no_fp` option to suppress frame pointers
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/erl_init.c | 15 | ||||
-rw-r--r-- | erts/emulator/beam/jit/beam_asm.h | 13 | ||||
-rw-r--r-- | erts/emulator/beam/jit/beam_jit_main.cpp | 6 |
3 files changed, 23 insertions, 11 deletions
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index ab3823d51a..1d7e3e951a 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -651,7 +651,7 @@ void erts_usage(void) #ifdef BEAMASM erts_fprintf(stderr, "-JDdump bool enable or disable dumping of generated assembly code for each module loaded\n"); - erts_fprintf(stderr, "-JPperf bool enable or disable support for perf on Linux\n"); + erts_fprintf(stderr, "-JPperf true|false|dump|map|fp|no_fp enable or disable support for perf on Linux\n"); erts_fprintf(stderr, "\n"); #endif @@ -1731,13 +1731,18 @@ erl_start(int argc, char **argv) #ifdef HAVE_LINUX_PERF_SUPPORT if (sys_strcmp(arg, "true") == 0) { - erts_jit_perf_support = BEAMASM_PERF_DUMP|BEAMASM_PERF_MAP; + erts_jit_perf_support |= BEAMASM_PERF_ENABLED; } else if (sys_strcmp(arg, "false") == 0) { - erts_jit_perf_support = 0; + erts_jit_perf_support &= ~BEAMASM_PERF_ENABLED; } else if (sys_strcmp(arg, "dump") == 0) { - erts_jit_perf_support = BEAMASM_PERF_DUMP; + erts_jit_perf_support |= BEAMASM_PERF_DUMP; } else if (sys_strcmp(arg, "map") == 0) { - erts_jit_perf_support = BEAMASM_PERF_MAP; + erts_jit_perf_support |= BEAMASM_PERF_MAP | + BEAMASM_PERF_FP; + } else if (sys_strcmp(arg, "fp") == 0) { + erts_jit_perf_support |= BEAMASM_PERF_FP; + } else if (sys_strcmp(arg, "no_fp") == 0) { + erts_jit_perf_support &= ~BEAMASM_PERF_FP; } else { erts_fprintf(stderr, "bad +JPperf support flag %s\n", arg); erts_usage(); diff --git a/erts/emulator/beam/jit/beam_asm.h b/erts/emulator/beam/jit/beam_asm.h index 13f5142b7b..d1901325a2 100644 --- a/erts/emulator/beam/jit/beam_asm.h +++ b/erts/emulator/beam/jit/beam_asm.h @@ -33,9 +33,16 @@ /* Global configuration variables */ # ifdef HAVE_LINUX_PERF_SUPPORT -# define BEAMASM_PERF_DUMP (1 << 0) -# define BEAMASM_PERF_MAP (1 << 1) -extern int erts_jit_perf_support; +enum beamasm_perf_flags { + BEAMASM_PERF_DUMP = (1 << 0), + BEAMASM_PERF_MAP = (1 << 1), + BEAMASM_PERF_FP = (1 << 2), + + BEAMASM_PERF_ENABLED = + BEAMASM_PERF_DUMP | BEAMASM_PERF_MAP | BEAMASM_PERF_FP, + BEAMASM_PERF_DISABLED = 0, +}; +extern enum beamasm_perf_flags erts_jit_perf_support; # endif void beamasm_init(void); diff --git a/erts/emulator/beam/jit/beam_jit_main.cpp b/erts/emulator/beam/jit/beam_jit_main.cpp index a478b5625d..ea68459fea 100644 --- a/erts/emulator/beam/jit/beam_jit_main.cpp +++ b/erts/emulator/beam/jit/beam_jit_main.cpp @@ -40,7 +40,7 @@ ErtsFrameLayout ERTS_WRITE_UNLIKELY(erts_frame_layout); /* Global configuration variables (under the `+J` prefix) */ #ifdef HAVE_LINUX_PERF_SUPPORT -int erts_jit_perf_support; +enum beamasm_perf_flags erts_jit_perf_support; #endif /* @@ -140,7 +140,7 @@ static JitAllocator *pick_allocator() { #if defined(HAVE_LINUX_PERF_SUPPORT) /* `perf` has a hard time showing symbols for dual-mapped memory, so we'll * use single-mapped memory when enabled. */ - if (erts_jit_perf_support & (BEAMASM_PERF_DUMP | BEAMASM_PERF_MAP)) { + if (erts_jit_perf_support & BEAMASM_PERF_ENABLED) { if (auto *alloc = create_allocator(&single_params)) { return alloc; } @@ -220,7 +220,7 @@ void beamasm_init() { * frame pointers are disabled or unsupported. */ #if defined(ERLANG_FRAME_POINTERS) # ifdef HAVE_LINUX_PERF_SUPPORT - if (erts_jit_perf_support & BEAMASM_PERF_MAP) { + if (erts_jit_perf_support & BEAMASM_PERF_FP) { erts_frame_layout = ERTS_FRAME_LAYOUT_FP_RA; } else { erts_frame_layout = ERTS_FRAME_LAYOUT_RA; |