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

            Bug ID: 114366
           Summary: computed labels do not reflect true values of
                    instruction pointer ranges when function is inlined
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: godmar at gmail dot com
  Target Milestone: ---

Created attachment 57718
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=57718&action=edit
using labels as values example

Hi, we recently got tripped up by the following:

```c
#include <assert.h>

void *beginPtr, *endPtr;
int x;
static void smallfunction(void)
{
    beginPtr = &&begin;
    endPtr = &&end;
begin:
    x++;
end:
}

int
main()
{
    smallfunction();
    assert(beginPtr < endPtr);
}
```
When compiled with `-O0`, this program completes successfully. When compiled
with `-O2`, this program fails its assertion because the following assembly
code is produced:

```
.L2:
.L3:
    leaq    .L2(%rip), %rdx
    leaq    .L3(%rip), %rax
    addl    $1, x(%rip)
```

which IMO should be something like:
```
.L2:
    leaq    .L2(%rip), %rdx
    leaq    .L3(%rip), %rax
    addl    $1, x(%rip)
.L3:
```

I understand that using labels as values is a GCC extension, and I have read
the comment in the documentation [1] that warns that &&foo might have a
different value if a function is inlined.  (Adding the noinline attribute fixes
the problem at the cost of some performance.)  Also note that "different
values" is not the same as not being computed correctly.

We encountered this problem building an exception handler.

I will note that gcc will not inline the function if the computed values are
actually used in a goto statement; when trying to force it to inline it, it
throws an error.

Is this a bug, or undocumented behavior? Perhaps the documentation should be
clarified.  

[1] https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

Reply via email to