public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/107840] New: ICE when compiling cursed setjmp/longjmp that uses __builtin_call_with_static_chain
@ 2022-11-23 16:44 gabravier at gmail dot com
  2022-11-23 16:59 ` [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps pinskia at gcc dot gnu.org
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: gabravier at gmail dot com @ 2022-11-23 16:44 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 107840
           Summary: ICE when compiling cursed setjmp/longjmp that uses
                    __builtin_call_with_static_chain
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gabravier at gmail dot com
  Target Milestone: ---

typedef __UINT16_TYPE__ uint16_t;
typedef __UINT32_TYPE__ uint32_t;
typedef __INTPTR_TYPE__ intptr_t;
#define unreachable __builtin_unreachable

typedef struct{
        const uint16_t mov1;
        const uint32_t addr;
        const uint16_t mov2;
        const void * const chain;
} __attribute__((packed)) thunk_struct;

#define NESTED_CHAIN(p) ({            \
        thunk_struct *__t = (void*)p; \
        __t->chain;                   \
})

#define NESTED_ADDR(p) ({                 \
        auto __p = (p);                   \
        thunk_struct *__t = (void*)__p;   \
        (typeof(__p))(intptr_t)__t->addr; \
})

#define NESTED_UPGRADE(self, ptr, args) ({                    \
        if(self != ptr)                                       \
                __builtin_call_with_static_chain(             \
                        NESTED_ADDR((typeof(self)*)ptr) args, \
                        NESTED_CHAIN(ptr)                     \
                );                                            \
})

typedef struct{
        // can't apply standard [[noreturn]] to function pointers
        [[gnu::noreturn]] void(*fun)(void*, int);
}xjmp_buf[1];

#define xsetjmp(env) ({                                 \
        __label__ trgt;                                 \
        int __xsetjmp_ret = 0;                          \
        [[noreturn]] void __jmp(void *self, int r){     \
                NESTED_UPGRADE(__jmp, self, (self, r)); \
                __xsetjmp_ret = r ?: 1;                 \
                goto trgt;                              \
        }                                               \
        env[0].fun = __jmp;                             \
        trgt:;                                          \
        int tmp = __xsetjmp_ret;                        \
        __xsetjmp_ret = 0;                              \
        tmp;                                            \
})

[[noreturn, gnu::always_inline]] inline void xlongjmp(xjmp_buf env, int r){
        ((void(*)(void*, int))NESTED_ADDR(env[0].fun))(env[0].fun, r);
        unreachable();
}

int main(){
        int a = 0;
        xjmp_buf test;
        void foo(xjmp_buf ctx){
                if(!xsetjmp(ctx)){
                        (volatile void)0;
                }
        }

        foo(test);
        xlongjmp(test, ++a);
}

Compiling this code with `-std=c2x` results in the following error:

<source>: In function 'foo':
<source>:60:14: error: label '({anonymous})' has incorrect context in bb 4
   60 |         void foo(xjmp_buf ctx){
      |              ^~~
during GIMPLE pass: cfg
dump file: /app/output.c.015t.cfg
<source>:60:14: internal compiler error: verify_flow_info failed
0x2008dee internal_error(char const*, ...)
        ???:0
0xaf90d7 verify_flow_info()
        ???:0
0x10447c7 cleanup_tree_cfg(unsigned int)
        ???:0
Please submit a full bug report, with preprocessed source (by using
-freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
Compiler returned: 1

(PS: I cannot seem to get more of the necessary information from Godbolt,
although the bug seems simple enough to reproduce without it. Still, this link
to the setup I got the bug in might help: https://godbolt.org/z/cd7f4Mdzd)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps
  2022-11-23 16:44 [Bug c/107840] New: ICE when compiling cursed setjmp/longjmp that uses __builtin_call_with_static_chain gabravier at gmail dot com
@ 2022-11-23 16:59 ` pinskia at gcc dot gnu.org
  2022-11-23 17:08 ` pinskia at gcc dot gnu.org
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-11-23 16:59 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I don't think it is directly __builtin_call_with_static_chain but rather the
non-local jump causing issues.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps
  2022-11-23 16:44 [Bug c/107840] New: ICE when compiling cursed setjmp/longjmp that uses __builtin_call_with_static_chain gabravier at gmail dot com
  2022-11-23 16:59 ` [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps pinskia at gcc dot gnu.org
@ 2022-11-23 17:08 ` pinskia at gcc dot gnu.org
  2022-11-23 17:09 ` pinskia at gcc dot gnu.org
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-11-23 17:08 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Created attachment 53955
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53955&action=edit
testcase not using C23 features

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps
  2022-11-23 16:44 [Bug c/107840] New: ICE when compiling cursed setjmp/longjmp that uses __builtin_call_with_static_chain gabravier at gmail dot com
  2022-11-23 16:59 ` [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps pinskia at gcc dot gnu.org
  2022-11-23 17:08 ` pinskia at gcc dot gnu.org
@ 2022-11-23 17:09 ` pinskia at gcc dot gnu.org
  2022-11-24 14:31 ` marxin at gcc dot gnu.org
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-11-23 17:09 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
With the testcase that does not use C23 features (which was only implemented in
GCC 13), we can get the ICE happening all the way back to at least GCC 6 with
-fchecking. GCC 5 didn't have -fchecking so I cannot check further back.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps
  2022-11-23 16:44 [Bug c/107840] New: ICE when compiling cursed setjmp/longjmp that uses __builtin_call_with_static_chain gabravier at gmail dot com
                   ` (2 preceding siblings ...)
  2022-11-23 17:09 ` pinskia at gcc dot gnu.org
@ 2022-11-24 14:31 ` marxin at gcc dot gnu.org
  2023-02-12 21:08 ` pinskia at gcc dot gnu.org
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: marxin at gcc dot gnu.org @ 2022-11-24 14:31 UTC (permalink / raw)
  To: gcc-bugs

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

Martin Liška <marxin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |marxin at gcc dot gnu.org
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2022-11-24
             Status|UNCONFIRMED                 |NEW

--- Comment #4 from Martin Liška <marxin at gcc dot gnu.org> ---
Also happens with 4.8.0+.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps
  2022-11-23 16:44 [Bug c/107840] New: ICE when compiling cursed setjmp/longjmp that uses __builtin_call_with_static_chain gabravier at gmail dot com
                   ` (3 preceding siblings ...)
  2022-11-24 14:31 ` marxin at gcc dot gnu.org
@ 2023-02-12 21:08 ` pinskia at gcc dot gnu.org
  2023-02-12 21:09 ` pinskia at gcc dot gnu.org
  2024-01-09  3:27 ` pinskia at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-02-12 21:08 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
*** Bug 108765 has been marked as a duplicate of this bug. ***

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps
  2022-11-23 16:44 [Bug c/107840] New: ICE when compiling cursed setjmp/longjmp that uses __builtin_call_with_static_chain gabravier at gmail dot com
                   ` (4 preceding siblings ...)
  2023-02-12 21:08 ` pinskia at gcc dot gnu.org
@ 2023-02-12 21:09 ` pinskia at gcc dot gnu.org
  2024-01-09  3:27 ` pinskia at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-02-12 21:09 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Reduced testcase:
```
int main()
{
  void foo(void)
  { 
    __label__ trgt; 
    void jmp(void)  {  goto trgt;     }
    trgt: ;
  }
  foo();
}
```

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps
  2022-11-23 16:44 [Bug c/107840] New: ICE when compiling cursed setjmp/longjmp that uses __builtin_call_with_static_chain gabravier at gmail dot com
                   ` (5 preceding siblings ...)
  2023-02-12 21:09 ` pinskia at gcc dot gnu.org
@ 2024-01-09  3:27 ` pinskia at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-01-09  3:27 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |DUPLICATE

--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Dup of bug 40317.

*** This bug has been marked as a duplicate of bug 40317 ***

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-01-09  3:27 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-23 16:44 [Bug c/107840] New: ICE when compiling cursed setjmp/longjmp that uses __builtin_call_with_static_chain gabravier at gmail dot com
2022-11-23 16:59 ` [Bug middle-end/107840] ICE when compiling cursed setjmp/longjmp nested function calls and non-local jumps pinskia at gcc dot gnu.org
2022-11-23 17:08 ` pinskia at gcc dot gnu.org
2022-11-23 17:09 ` pinskia at gcc dot gnu.org
2022-11-24 14:31 ` marxin at gcc dot gnu.org
2023-02-12 21:08 ` pinskia at gcc dot gnu.org
2023-02-12 21:09 ` pinskia at gcc dot gnu.org
2024-01-09  3:27 ` pinskia at gcc dot gnu.org

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).