Hello,

I have some code (preprocessed source attached below), that gives me
an ICE when compiled with optimisations enabled (either -O or -O2):

    $ msp430-gcc -save-temps -c -O2 cmd.c
    cmd.c: In function `cmd_read':
    cmd.c:50: Internal compiler error in redirect_edge_and_branch, at 
cfgrtl.c:902
    Please submit a full bug report,
    with preprocessed source if appropriate.
    See <URL:http://gcc.gnu.org/bugs.html> for instructions.


I use GCC 3.2.3 with mspgcc patches from less than an hour ago.


Best wishes,
   --Daniel


# 1 "cmd.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "cmd.c"



# 1 "/usr/local/lib/gcc-lib/msp430/3.2.3/include/stddef.h" 1 3 4
# 151 "/usr/local/lib/gcc-lib/msp430/3.2.3/include/stddef.h" 3 4
typedef int ptrdiff_t;
# 213 "/usr/local/lib/gcc-lib/msp430/3.2.3/include/stddef.h" 3 4
typedef unsigned int size_t;
# 325 "/usr/local/lib/gcc-lib/msp430/3.2.3/include/stddef.h" 3 4
typedef int wchar_t;
# 5 "cmd.c" 2

# 1 "cmd.h" 1






enum cmd_status { CMD_OK, CMD_QUIT, CMD_UNKNOWN };

struct cmd_cfg {
        const char *prompt;
        char (*getc)(void);
        void (*putc)(char);
        enum cmd_status (*eval)(const char *, size_t);
};


void cmd_loop(const struct cmd_cfg *cfg);
# 7 "cmd.c" 2
# 18 "cmd.c"
static char cmd_buf[32];

static void
cmd_puts(const struct cmd_cfg *cfg, const char *str)
{
        while (*str != '\0')
                (*(cfg)->putc)(*str++);
}

size_t
cmd_read(const struct cmd_cfg *cfg)
{
        char c;
        char *end = cmd_buf + sizeof cmd_buf;
        char *p = cmd_buf;

        for (;;) {
                c = (*(cfg)->getc)();
                switch (c) {
                case '\r':
                        cmd_puts(cfg, "\r\n");
                        return p - cmd_buf;
                case '\n':
                        continue;
                case '\b':
                        if (p > cmd_buf) { --p; cmd_puts(cfg, "\b \b"); }
                        break;

                default:
                        if (p < end) { *p++ = c; (*(cfg)->putc)(c); }
                }
        }
}


void
cmd_loop(const struct cmd_cfg *cfg)
{
        size_t len;
        for (;;) {
                cmd_puts(cfg, cfg->prompt);
                len = cmd_read(cfg);
                switch ((*(cfg)->eval)(cmd_buf, len)) {
                case CMD_OK:
                        break;
                case CMD_UNKNOWN:
                        cmd_puts(cfg, "?" "\r\n");
                        break;
                case CMD_QUIT:
                        cmd_puts(cfg, "bye..." "\r\n");
                        return;
                }
        }
}

Reply via email to