summaryrefslogtreecommitdiff
path: root/erts/emulator/beam
diff options
context:
space:
mode:
authorJohn Högberg <john@erlang.org>2023-02-02 10:45:54 +0100
committerJohn Högberg <john@erlang.org>2023-02-06 09:30:55 +0100
commit9202747f16e13fce4e625aa7c1193afccb32d571 (patch)
treebc1428694b6ed405f0cdf659b8d3947dd12b3f82 /erts/emulator/beam
parentb6bb1c9ae9467117cc40d0dc91cdb9b3ec9e96ca (diff)
downloaderlang-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.c15
-rw-r--r--erts/emulator/beam/jit/beam_asm.h13
-rw-r--r--erts/emulator/beam/jit/beam_jit_main.cpp6
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;