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;
}
}
}