cranelift: Add a flag for preserving frame pointers (#4469)

Preserving frame pointers -- even inside leaf functions -- makes it easy to
capture the stack of a running program, without requiring any side tables or
metadata (like `.eh_frame` sections). Many sampling profilers and similar tools
walk frame pointers to capture stacks. Enabling this option will play nice with
those tools.
This commit is contained in:
Nick Fitzgerald
2022-07-20 08:02:21 -07:00
committed by GitHub
parent 6e099720af
commit 22d91a7c84
8 changed files with 96 additions and 7 deletions

View File

@@ -1410,12 +1410,13 @@ impl<M: ABIMachineSpec> ABICallee for ABICalleeImpl<M> {
if !self.call_conv.extends_baldrdash() {
self.fixed_frame_storage_size += total_stacksize;
self.setup_frame = M::is_frame_setup_needed(
self.is_leaf,
self.stack_args_size(),
clobbered_callee_saves.len(),
self.fixed_frame_storage_size,
);
self.setup_frame = self.flags.preserve_frame_pointers()
|| M::is_frame_setup_needed(
self.is_leaf,
self.stack_args_size(),
clobbered_callee_saves.len(),
self.fixed_frame_storage_size,
);
insts.extend(
M::gen_debug_frame_info(self.call_conv, &self.flags, &self.isa_flags).into_iter(),

View File

@@ -541,6 +541,7 @@ enable_atomics = true
enable_safepoints = false
enable_llvm_abi_extensions = false
unwind_info = true
preserve_frame_pointers = false
machine_code_cfg_info = false
emit_all_ones_funcaddrs = false
enable_probestack = true