public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Alexandre Oliva <aoliva@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc(refs/users/aoliva/heads/testme)] [rs6000] adjust return_pc debug attrs
Date: Thu,  6 Apr 2023 06:35:12 +0000 (GMT)	[thread overview]
Message-ID: <20230406063512.E10C73858C2B@sourceware.org> (raw)

https://gcc.gnu.org/g:93ebc9cd2a4b0e299b9f0b9667e7ccfd9e580ef4

commit 93ebc9cd2a4b0e299b9f0b9667e7ccfd9e580ef4
Author: Alexandre Oliva <oliva@adacore.com>
Date:   Wed Apr 5 11:27:09 2023 -0300

    [rs6000] adjust return_pc debug attrs
    
    Some of the rs6000 call patterns, on some ABIs, issue multiple opcodes
    out of a single call insn, but the call (bl) or jump (b) is not always
    the last opcode in the sequence.
    
    This does not seem to be a problem for exception handling tables, but
    the return_pc attribute in the call graph output in dwarf2+ debug
    information, that takes the address of a label output right after the
    call, does not match the value of the link register even for non-tail
    calls.  E.g., with ABI_AIX or ABI_ELFv2, such code as:
    
      foo ();
    
    outputs:
    
      bl foo
      nop
     LVL#:
    [...]
      .8byte .LVL#  # DW_AT_call_return_pc
    
    but debug info consumers may rely on the return_pc address, and draw
    incorrect conclusions from its off-by-4 value.
    
    This patch uses the infrastructure for targets to add an offset to the
    label issued after the call_insn to set the call_return_pc attribute,
    on rs6000, to account for opcodes issued after actual call opcode as
    part of call insns output patterns.
    
    
    for  gcc/ChangeLog
    
            * config/rs6000/rs6000.cc (TARGET_CALL_OFFSET_RETURN_LABEL):
            Override.
            (rs6000_call_offset_return_label): New.

Diff:
---
 gcc/config/rs6000/rs6000.cc | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 3be5860dd9b..3d781699869 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -1760,6 +1760,9 @@ static const struct attribute_spec rs6000_attribute_table[] =
 
 #undef TARGET_UPDATE_IPA_FN_TARGET_INFO
 #define TARGET_UPDATE_IPA_FN_TARGET_INFO rs6000_update_ipa_fn_target_info
+
+#undef TARGET_CALL_OFFSET_RETURN_LABEL
+#define TARGET_CALL_OFFSET_RETURN_LABEL rs6000_call_offset_return_label
 \f
 
 /* Processor table.  */
@@ -14557,6 +14560,22 @@ rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p)
   return default_assemble_integer (x, size, aligned_p);
 }
 
+/* Return the offset to be added to the label output after CALL_INSN
+   to compute the address to be placed in DW_AT_call_return_pc.  */
+
+static int
+rs6000_call_offset_return_label (rtx_insn *call_insn)
+{
+  /* All rs6000 CALL_INSN output patterns start with a b or bl, always
+     a 4-byte instruction, but some output patterns issue other
+     opcodes afterwards.  The return label is issued after the entire
+     call insn, including any such post-call opcodes.  Instead of
+     figuring out which cases need adjustments, we compute the offset
+     back to the address of the call opcode proper, then add the
+     constant 4 bytes, to get the address after that opcode.  */
+  return 4 - get_attr_length (call_insn);
+}
+
 /* Return a template string for assembly to emit when making an
    external call.  FUNOP is the call mem argument operand number.  */

             reply	other threads:[~2023-04-06  6:35 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-06  6:35 Alexandre Oliva [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-05-29  6:59 Alexandre Oliva
2024-05-25  8:07 Alexandre Oliva
2023-03-30 14:07 Alexandre Oliva
2023-03-24  6:25 Alexandre Oliva
2023-03-23  3:48 Alexandre Oliva
2023-03-16 15:57 Alexandre Oliva
2023-03-16 14:23 Alexandre Oliva
2023-03-03 13:11 Alexandre Oliva

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230406063512.E10C73858C2B@sourceware.org \
    --to=aoliva@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).