From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id 95F91385B536; Thu, 23 Mar 2023 03:48:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 95F91385B536 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1679543288; bh=Zj78O2a12xkjXuGCaES5XHApJoMGMwZQ4DGK032exlI=; h=From:To:Subject:Date:From; b=JaJ4Sbsa2UIIycyV0hGrtnr9nxb/Vq5Ozcnfbt9IOmMxeX4ipPm2XBVpMXZNwNOsE 3rOZ30kqPbTiVQRwQzhiOxpJJc1J8LkBCVt0mw8AcOUbXx12ftHuaw4ki2qCQJI+D+ gp6SFFjwEnGE0AXrXTeya9wXaf3uCcABtZgpAY4o= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Alexandre Oliva To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] enable adjustment of return_pc debug attrs X-Act-Checkin: gcc X-Git-Author: Alexandre Oliva X-Git-Refname: refs/users/aoliva/heads/testme X-Git-Oldrev: 9e80775af75b3f3e9c35cd31723be0c008dc184d X-Git-Newrev: cec5a04e13d8c868a8231afa344f444187d7f8b4 Message-Id: <20230323034808.95F91385B536@sourceware.org> Date: Thu, 23 Mar 2023 03:48:08 +0000 (GMT) List-Id: https://gcc.gnu.org/g:cec5a04e13d8c868a8231afa344f444187d7f8b4 commit cec5a04e13d8c868a8231afa344f444187d7f8b4 Author: Alexandre Oliva Date: Thu Mar 23 00:44:58 2023 -0300 enable adjustment of return_pc debug attrs This patch introduces infrastructure for targets to add an offset to the label issued after the call_insn to set the call_return_pc attribute. This will be used on rs6000, that sometimes issues another instruction after the call proper as part of a call insn. for gcc/ChangeLog * target.def (call_offset_return_label): New hook. * gcc/doc/tm.texi.in (TARGET_CALL_OFFSET_RETURN_LABEL): Add placeholder. * gcc/doc/tm.texi: Rebuild. * dwarf2out.cc (struct call_arg_loc_node): Record call_insn instad of call_arg_loc_note. (add_AT_lbl_id): Add optional offset argument. (gen_call_site_die): Compute and pass on a return pc offset. (gen_subprogram_die): Move call_arg_loc_note computation... (dwarf2out_var_location): ... from here. Set call_insn. Diff: --- gcc/doc/tm.texi | 7 +++++++ gcc/doc/tm.texi.in | 2 ++ gcc/dwarf2out.cc | 26 +++++++++++++++++--------- gcc/target.def | 9 +++++++++ 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 4bb48c5428c..83ebe3d51b7 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -5426,6 +5426,13 @@ except the last are treated as named. You need not define this hook if it always returns @code{false}. @end deftypefn +@deftypefn {Target Hook} int TARGET_CALL_OFFSET_RETURN_LABEL (rtx_insn *@var{call_insn}) +While generating call-site debug info for a CALL insn, or a SEQUENCE +insn starting with a CALL, this target hook is invoked to compute the +offset to be added to the debug label emitted after the call to obtain +the return address that should be recorded as the return PC. +@end deftypefn + @deftypefn {Target Hook} void TARGET_CALL_ARGS (rtx, @var{tree}) While generating RTL for a function call, this target hook is invoked once for each argument passed to the function, either a register returned by diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index f7ab5d48a63..89dfe94953d 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -3785,6 +3785,8 @@ These machine description macros help implement varargs: @hook TARGET_STRICT_ARGUMENT_NAMING +@hook TARGET_CALL_OFFSET_RETURN_LABEL + @hook TARGET_CALL_ARGS @hook TARGET_END_CALL_ARGS diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc index 1711ad2c2da..d1db918c439 100644 --- a/gcc/dwarf2out.cc +++ b/gcc/dwarf2out.cc @@ -3584,7 +3584,7 @@ typedef struct var_loc_list_def var_loc_list; /* Call argument location list. */ struct GTY ((chain_next ("%h.next"))) call_arg_loc_node { - rtx GTY (()) call_arg_loc_note; + rtx_insn * GTY (()) call_insn; const char * GTY (()) label; tree GTY (()) block; bool tail_call_p; @@ -3768,7 +3768,8 @@ static void remove_addr_table_entry (addr_table_entry *); static void add_AT_addr (dw_die_ref, enum dwarf_attribute, rtx, bool); static inline rtx AT_addr (dw_attr_node *); static void add_AT_symview (dw_die_ref, enum dwarf_attribute, const char *); -static void add_AT_lbl_id (dw_die_ref, enum dwarf_attribute, const char *); +static void add_AT_lbl_id (dw_die_ref, enum dwarf_attribute, const char *, + int = 0); static void add_AT_lineptr (dw_die_ref, enum dwarf_attribute, const char *); static void add_AT_macptr (dw_die_ref, enum dwarf_attribute, const char *); static void add_AT_range_list (dw_die_ref, enum dwarf_attribute, @@ -5327,14 +5328,17 @@ add_AT_symview (dw_die_ref die, enum dwarf_attribute attr_kind, static inline void add_AT_lbl_id (dw_die_ref die, enum dwarf_attribute attr_kind, - const char *lbl_id) + const char *lbl_id, int offset) { dw_attr_node attr; attr.dw_attr = attr_kind; attr.dw_attr_val.val_class = dw_val_class_lbl_id; attr.dw_attr_val.val_entry = NULL; - attr.dw_attr_val.v.val_lbl_id = xstrdup (lbl_id); + if (!offset) + attr.dw_attr_val.v.val_lbl_id = xstrdup (lbl_id); + else + attr.dw_attr_val.v.val_lbl_id = xasprintf ("%s%+i", lbl_id, offset); if (dwarf_split_debug_info) attr.dw_attr_val.val_entry = add_addr_table_entry (attr.dw_attr_val.v.val_lbl_id, @@ -23405,7 +23409,9 @@ gen_call_site_die (tree decl, dw_die_ref subr_die, if (stmt_die == NULL) stmt_die = subr_die; die = new_die (dwarf_TAG (DW_TAG_call_site), stmt_die, NULL_TREE); - add_AT_lbl_id (die, dwarf_AT (DW_AT_call_return_pc), ca_loc->label); + add_AT_lbl_id (die, dwarf_AT (DW_AT_call_return_pc), + ca_loc->label, + targetm.calls.call_offset_return_label (ca_loc->call_insn)); if (ca_loc->tail_call_p) add_AT_flag (die, dwarf_AT (DW_AT_call_tail_call), 1); if (ca_loc->symbol_ref) @@ -24092,11 +24098,14 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) { dw_die_ref die = NULL; rtx tloc = NULL_RTX, tlocc = NULL_RTX; + rtx call_arg_loc_note + = find_reg_note (ca_loc->call_insn, + REG_CALL_ARG_LOCATION, NULL_RTX); rtx arg, next_arg; tree arg_decl = NULL_TREE; - for (arg = (ca_loc->call_arg_loc_note != NULL_RTX - ? XEXP (ca_loc->call_arg_loc_note, 0) + for (arg = (call_arg_loc_note != NULL_RTX + ? XEXP (call_arg_loc_note, 0) : NULL_RTX); arg; arg = next_arg) { @@ -28125,8 +28134,7 @@ create_label: = ggc_cleared_alloc (); rtx_insn *prev = call_insn; - ca_loc->call_arg_loc_note - = find_reg_note (call_insn, REG_CALL_ARG_LOCATION, NULL_RTX); + ca_loc->call_insn = call_insn; ca_loc->next = NULL; ca_loc->label = last_label; gcc_assert (prev diff --git a/gcc/target.def b/gcc/target.def index 1b9c882229e..38c72670fef 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -4722,6 +4722,15 @@ not generate any instructions in this case.", int *pretend_args_size, int second_time), default_setup_incoming_varargs) +DEFHOOK +(call_offset_return_label, + "While generating call-site debug info for a CALL insn, or a SEQUENCE\n\ +insn starting with a CALL, this target hook is invoked to compute the\n\ +offset to be added to the debug label emitted after the call to obtain\n\ +the return address that should be recorded as the return PC.", + int, (rtx_insn *call_insn), + hook_int_rtx_insn_0) + DEFHOOK (call_args, "While generating RTL for a function call, this target hook is invoked once\n\