Mercurial > hg > CbC > CbC_gcc
diff gcc/testsuite/gcc.dg/tree-ssa/pr69196-1.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr69196-1.c Fri Oct 27 22:46:09 2017 +0900 @@ -0,0 +1,138 @@ +/* { dg-do compile { target sparc*-*-* i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -fdump-tree-thread1-details -fdisable-tree-ethread" } */ + +/* { dg-final { scan-tree-dump "FSM did not thread around loop and would copy too many statements" "thread1" } } */ + + +typedef __builtin_va_list __gnuc_va_list; +typedef __gnuc_va_list va_list; +extern void rtems_putc(char c); + +void vprintk( + const char *fmt, + va_list ap +) +{ + for (; *fmt != '\0'; fmt++) { + unsigned base = 0; + unsigned width = 0; + enum { + LFLAG_INT, + LFLAG_LONG, + LFLAG_LONG_LONG + } lflag = LFLAG_INT; + _Bool minus = 0; + _Bool sign = 0; + char lead = ' '; + char c = *fmt; + long long num; + + if (c != '%') { + rtems_putc(c); + continue; + } + + ++fmt; c = *fmt; + + if (c == '0') { + lead = '0'; + ++fmt; c = *fmt; + } + + if (c == '-') { + minus = 1; + ++fmt; c = *fmt; + } + + while (c >= '0' && c <= '9' ) { + width *= 10; + width += ((unsigned) c - '0'); + ++fmt; c = *fmt; + } + + if (c == 'l') { + lflag = LFLAG_LONG; + ++fmt; c = *fmt; + + if (c == 'l') { + lflag = LFLAG_LONG_LONG; + ++fmt; c = *fmt; + } + } + + if ( c == 'c' ) { + + char chr = (char) __builtin_va_arg(ap,int); + rtems_putc(chr); + continue; + } + + if ( c == 's' ) { + unsigned i, len; + char *s, *str; + + str = __builtin_va_arg(ap,char *); + + if ( str == ((void *)0) ) { + str = ""; + } + + + for ( len=0, s=str ; *s ; len++, s++ ) + ; + + + if ( !minus ) + for ( i=len ; i<width ; i++ ) + rtems_putc(' '); + + + if (width == 0) { + width = len; + } + + + for ( i=0 ; i<width && *str ; str++ ) + rtems_putc(*str); + + + if ( minus ) + for ( i=len ; i<width ; i++ ) + rtems_putc(' '); + + continue; + } + + + if ( c == 'o' || c == 'O' ) { + base = 8; sign = 0; + } else if ( c == 'i' || c == 'I' || + c == 'd' || c == 'D' ) { + base = 10; sign = 1; + } else if ( c == 'u' || c == 'U' ) { + base = 10; sign = 0; + } else if ( c == 'x' || c == 'X' ) { + base = 16; sign = 0; + } else if ( c == 'p' ) { + base = 16; sign = 0; lflag = LFLAG_LONG; + } else { + rtems_putc(c); + continue; + } + + switch (lflag) { + case LFLAG_LONG: + num = sign ? (long long) __builtin_va_arg(ap,long) + : (long long) __builtin_va_arg(ap,unsigned long); + break; + case LFLAG_LONG_LONG: + num = __builtin_va_arg(ap,long long); + break; + case LFLAG_INT: + default: + num = sign ? (long long) __builtin_va_arg(ap,int) + : (long long) __builtin_va_arg(ap,unsigned int); + break; + } + } +}