https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121424

            Bug ID: 121424
           Summary: Debug info associates return instruction with inlined
                    function
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jryans at gmail dot com
  Target Milestone: ---

Created attachment 62065
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62065&action=edit
example.c

When compiling the attached program with recent GCC versions, we see that
`skip_prefix` is inlined into `cleanup_path` (as requested), but if we look at
the debug info from e.g. GCC 16 we see:

0x00000087:     DW_TAG_inlined_subroutine
                  DW_AT_abstract_origin (0x000000d6 "skip_prefix")
                  DW_AT_ranges  (0x0000000c
                     [0x0000000000000000, 0x0000000000000000)
                     [0x0000000000000008, 0x0000000000000020))

...which includes a `ret` instruction:

0x1f: ret

I would not expect an inlined subroutine's instruction ranges to include a
return instruction like this, as that would seem to clearly be part of the
parent out-of-line function (`cleanup_path` in this case) behaviour.

This behaviour seems to be present for quite a long ways back in GCC history...
I was able to confirm it is present at least back to the GCC 11 series, but it
may go much further back as well.

If we compare GCC to Clang here, Clang shows the expected behaviour (no returns
associated with the inlined instruction ranges).

Also available on Compiler Explorer: https://godbolt.org/z/5q1s65WPE

Reply via email to