#2049 SEGV with --reserve-regs-iy

z80 port (188)


The compiler crash with a SEGV when I try to compile some C files with a z80 target and the --reserve-regs-iy option.
I've attached an example of source which make the compiler crash.


  • Christophe Staïesse

    this make the compiler crash with -mz80 --reserve-regs-iy

  • Christophe Staïesse

    sorry I pushed on the wrong button :-)

    I've made a regression test and this bug occurs from revision 7537.

    How to reproduce this bug (I've used revision 7950):

    sdcc -mz80 --reserve-regs-iy reserve-regs-iy-bug.c

    Program received signal SIGSEGV, Segmentation fault.
    cheapMove (to=0x1, to_offset=0, from=0x81b5eec, from_offset=0) at gen.c:2800
    2800 if (to->type == AOP_ACC && from->type == AOP_ACC && to_offset == from_offset)

    But when I compile it with --oldralloc, it works fine.


  • Philipp Klaus Krause

    Hmm, for some reason emitCall thinks that the return value of printf() is used when using --reserve-regs-iy, and tries to assign it to a non-exisitng variable.


  • Christophe Staïesse

    Unfortunately, the problem persists even if you remove printf. In fact many source files makes the compiler crashes with this option.

    Try to compile the Z80 RTL with --reserve-regs-iy:

    cd device/lib/z80
    rm *.rel
    make -k SCC='$(top_builddir)/bin/sdcc -mz80 --reserve-regs-iy'

    On 105 C files, 86 caused a SEGV, 3 an ABRT and only 16 compiled with success.
    And from the 16 .asm generated, 10 contain references to IY.

    if you add --oldralloc, it works fine but some .asm still contains references to IY.

    The problem appears on revision 7537. On 7536, the RTL compile fines with --reserve-regs-iy but there are still references to IY.


  • Philipp Klaus Krause

    Thanks, knowing the revision # that introduced the bug helped.

    It seems the special handling ot --reserve-regs-iy was lost when factoring out some port-specific stuff from the generic register allocator code.

    I've got two ideas for a fix, one a quick hack, which might make it into the 3.2.0 release, and a cleaner, but bigger solution that seems to be a good long-term solution.


    P.S.: With the quick hack, regression tests pass when using --reserve-regs-iy, except for one failing test, and do not crash the compiler any more; I'll implement the cleaner solution in a branch later today.

    P.P.S.: --reserve-regs-iy isn't perfect yet: For functions that use more than 128 bytes of stack space for local variables or that have more than 128 bytes of parameters, iy is still used.

  • Philipp Klaus Krause

    • assigned_to: nobody --> spth
    • status: open --> closed
  • Philipp Klaus Krause

    Fixed in revision #7953.



Log in to post a comment.