| 2006-05-19 Jakub Jelinek <jakub@redhat.com> |
| |
| * dwarf2out.c (gen_subprogram_die): If -fno-frame-base-loclist, |
| set frame base to hard fp or stack pointer. |
| * toplev.c (flag_frame_base_loclist): New variable. |
| (f_options): Add -fframe-base-loclist. |
| * flags.h (flag_frame_base_loclist): New extern. |
| * common.opt (frame-base-loclist): New flag. |
| * opts.c (common_handle_option): Handle -f{,no-}frame-base-loclist. |
| |
| |
| |
| @@ -11389,33 +11389,35 @@ gen_subprogram_die (tree decl, dw_die_re |
| #endif |
| |
| #ifdef DWARF2_UNWIND_INFO |
| - /* We define the "frame base" as the function's CFA. This is more |
| - convenient for several reasons: (1) It's stable across the prologue |
| - and epilogue, which makes it better than just a frame pointer, |
| - (2) With dwarf3, there exists a one-byte encoding that allows us |
| - to reference the .debug_frame data by proxy, but failing that, |
| - (3) We can at least reuse the code inspection and interpretation |
| - code that determines the CFA position at various points in the |
| - function. */ |
| - /* ??? Use some command-line or configury switch to enable the use |
| - of dwarf3 DW_OP_call_frame_cfa. At present there are no dwarf |
| - consumers that understand it; fall back to "pure" dwarf2 and |
| - convert the CFA data into a location list. */ |
| - { |
| - dw_loc_list_ref list = convert_cfa_to_loc_list (); |
| - if (list->dw_loc_next) |
| - add_AT_loc_list (subr_die, DW_AT_frame_base, list); |
| - else |
| - add_AT_loc (subr_die, DW_AT_frame_base, list->expr); |
| - } |
| + if (flag_frame_base_loclist) |
| + { |
| + /* We define the "frame base" as the function's CFA. This is more |
| + convenient for several reasons: (1) It's stable across the prologue |
| + and epilogue, which makes it better than just a frame pointer, |
| + (2) With dwarf3, there exists a one-byte encoding that allows us |
| + to reference the .debug_frame data by proxy, but failing that, |
| + (3) We can at least reuse the code inspection and interpretation |
| + code that determines the CFA position at various points in the |
| + function. */ |
| + /* ??? Use some command-line or configury switch to enable the use |
| + of dwarf3 DW_OP_call_frame_cfa. At present there are no dwarf |
| + consumers that understand it; fall back to "pure" dwarf2 and |
| + convert the CFA data into a location list. */ |
| + dw_loc_list_ref list = convert_cfa_to_loc_list (); |
| + if (list->dw_loc_next) |
| + add_AT_loc_list (subr_die, DW_AT_frame_base, list); |
| + else |
| + add_AT_loc (subr_die, DW_AT_frame_base, list->expr); |
| |
| - /* Compute a displacement from the "steady-state frame pointer" to |
| - the CFA. The former is what all stack slots and argument slots |
| - will reference in the rtl; the later is what we've told the |
| - debugger about. We'll need to adjust all frame_base references |
| - by this displacement. */ |
| - compute_frame_pointer_to_cfa_displacement (); |
| -#else |
| + /* Compute a displacement from the "steady-state frame pointer" to |
| + the CFA. The former is what all stack slots and argument slots |
| + will reference in the rtl; the later is what we've told the |
| + debugger about. We'll need to adjust all frame_base references |
| + by this displacement. */ |
| + compute_frame_pointer_to_cfa_displacement (); |
| + } |
| + else |
| +#endif |
| /* For targets which support DWARF2, but not DWARF2 call-frame info, |
| we just use the stack pointer or frame pointer. */ |
| /* ??? Should investigate getting better info via callbacks, or else |
| @@ -11425,7 +11427,6 @@ gen_subprogram_die (tree decl, dw_die_re |
| = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx; |
| add_AT_loc (subr_die, DW_AT_frame_base, reg_loc_descriptor (fp_reg)); |
| } |
| -#endif |
| |
| #if 0 |
| /* ??? This fails for nested inline functions, because context_display |
| |
| |
| @@ -961,6 +961,10 @@ int flag_tracer = 0; |
| |
| int flag_unit_at_a_time = 0; |
| |
| +/* Nonzero if DWARF2 DW_AT_frame_base can be a location list. */ |
| + |
| +int flag_frame_base_loclist = 1; |
| + |
| /* Nonzero if we should track variables. When |
| flag_var_tracking == AUTODETECT_FLAG_VAR_TRACKING it will be set according |
| to optimize, debug_info_level and debug_hooks in process_options (). */ |
| @@ -1165,7 +1169,8 @@ static const lang_independent_options f_ |
| { "trapv", &flag_trapv, 1 }, |
| { "wrapv", &flag_wrapv, 1 }, |
| { "new-ra", &flag_new_regalloc, 1 }, |
| - { "var-tracking", &flag_var_tracking, 1} |
| + { "var-tracking", &flag_var_tracking, 1}, |
| + { "frame-base-loclist", &flag_frame_base_loclist, 1} |
| }; |
| |
| /* Here is a table, controlled by the tm.h file, listing each -m switch |
| |
| |
| @@ -746,6 +746,9 @@ extern int flag_remove_unreachable_funct |
| /* Nonzero if we should track variables. */ |
| extern int flag_var_tracking; |
| |
| +/* Nonzero if DWARF2 DW_AT_frame_base can be a location list. */ |
| +extern int flag_frame_base_loclist; |
| + |
| /* A string that's used when a random name is required. NULL means |
| to make it really random. */ |
| |
| |
| |
| @@ -718,6 +718,10 @@ fvar-tracking |
| Common |
| Perform variable tracking |
| |
| +fframe-base-loclist |
| +Common |
| +Allow use of DWARF2 location lists for frame base |
| + |
| fverbose-asm |
| Common |
| Add extra commentary to assembler output |
| |
| |
| @@ -1461,6 +1461,10 @@ common_handle_option (size_t scode, cons |
| flag_var_tracking = value; |
| break; |
| |
| + case OPT_fframe_base_loclist: |
| + flag_frame_base_loclist = value; |
| + break; |
| + |
| case OPT_fverbose_asm: |
| flag_verbose_asm = value; |
| break; |