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

            Bug ID: 100049
           Summary: loop counter double increment with longjmp inside
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: clyon at gcc dot gnu.org
  Target Milestone: ---

Created attachment 50572
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50572&action=edit
Example code

As described in https://bugs.linaro.org/show_bug.cgi?id=5755

the following loop:
        for(i = 0; i < CNT; i++) {
                printf("Message %d\n", i);
                if (setjmp((&ctx.jmp_buf[ctx.cnt])->env) == 0) {
                        ++ctx.cnt;
                        do_jump();
                        --ctx.cnt;
                }
        }
has the following output:
Message 0
Message 2

It's sufficient to use -O2, and the offending code sequence is:
        bl      _setjmp
(*)     ldr     w1, [sp, 44]
        add     w1, w1, 1
        str     w1, [sp, 44]
        cbnz    w0, .L3
        [....]
        bl do_jump (which calls longjmp)


where w1 contains "i", the line marked (*) is where longjmp jumps to.

So "i" is incremented before calling longjmp, and a second time when longjmp
gives control back to the test() function.

The attached archive contains:
helper.h, helper.c
example.c
Makefile

Reply via email to