(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
tree-ssa/
pr69196-1.c
       1  /* { dg-do compile { target sparc*-*-* i?86-*-* x86_64-*-* } } */
       2  /* { dg-options "-O2 -fdump-tree-thread1-details -fdisable-tree-ethread" } */
       3  
       4  /* { dg-final { scan-tree-dump "Did not thread around loop and would copy too many statements" "thread1" } } */
       5  
       6  
       7  typedef __builtin_va_list __gnuc_va_list;
       8  typedef __gnuc_va_list va_list;
       9  extern void rtems_putc(char c);
      10  
      11  void vprintk(
      12    const char *fmt,
      13    va_list ap
      14  )
      15  {
      16    for (; *fmt != '\0'; fmt++) {
      17      unsigned base = 0;
      18      unsigned width = 0;
      19      enum {
      20        LFLAG_INT,
      21        LFLAG_LONG,
      22        LFLAG_LONG_LONG
      23      } lflag = LFLAG_INT;
      24      _Bool minus = 0;
      25      _Bool sign = 0;
      26      char lead = ' ';
      27      char c = *fmt;
      28      long long num;
      29  
      30      if (c != '%') {
      31        rtems_putc(c);
      32        continue;
      33      }
      34  
      35      ++fmt; c = *fmt;
      36  
      37      if (c == '0') {
      38        lead = '0';
      39        ++fmt; c = *fmt;
      40      }
      41  
      42      if (c == '-') {
      43        minus = 1;
      44        ++fmt; c = *fmt;
      45      }
      46  
      47      while (c >= '0' && c <= '9' ) {
      48        width *= 10;
      49        width += ((unsigned) c - '0');
      50        ++fmt; c = *fmt;
      51      }
      52  
      53      if (c == 'l') {
      54        lflag = LFLAG_LONG;
      55        ++fmt; c = *fmt;
      56  
      57        if (c == 'l') {
      58          lflag = LFLAG_LONG_LONG;
      59          ++fmt; c = *fmt;
      60        }
      61      }
      62  
      63      if ( c == 'c' ) {
      64  
      65        char chr = (char) __builtin_va_arg(ap,int);
      66        rtems_putc(chr);
      67        continue;
      68      }
      69  
      70      if ( c == 's' ) {
      71        unsigned i, len;
      72        char *s, *str;
      73  
      74        str = __builtin_va_arg(ap,char *);
      75  
      76        if ( str == ((void *)0) ) {
      77          str = "";
      78        }
      79  
      80  
      81        for ( len=0, s=str ; *s ; len++, s++ )
      82          ;
      83  
      84  
      85        if ( !minus )
      86          for ( i=len ; i<width ; i++ )
      87            rtems_putc(' ');
      88  
      89  
      90        if (width == 0) {
      91            width = len;
      92        }
      93  
      94  
      95        for ( i=0 ; i<width && *str ; str++ )
      96          rtems_putc(*str);
      97  
      98  
      99        if ( minus )
     100          for ( i=len ; i<width ; i++ )
     101            rtems_putc(' ');
     102  
     103        continue;
     104      }
     105  
     106  
     107      if ( c == 'o' || c == 'O' ) {
     108        base = 8; sign = 0;
     109      } else if ( c == 'i' || c == 'I' ||
     110                  c == 'd' || c == 'D' ) {
     111        base = 10; sign = 1;
     112      } else if ( c == 'u' || c == 'U' ) {
     113        base = 10; sign = 0;
     114      } else if ( c == 'x' || c == 'X' ) {
     115        base = 16; sign = 0;
     116      } else if ( c == 'p' ) {
     117        base = 16; sign = 0; lflag = LFLAG_LONG;
     118      } else {
     119        rtems_putc(c);
     120        continue;
     121      }
     122  
     123      switch (lflag) {
     124        case LFLAG_LONG:
     125          num = sign ? (long long) __builtin_va_arg(ap,long)
     126            : (long long) __builtin_va_arg(ap,unsigned long);
     127          break;
     128        case LFLAG_LONG_LONG:
     129          num = __builtin_va_arg(ap,long long);
     130          break;
     131        case LFLAG_INT:
     132        default:
     133          num = sign ? (long long) __builtin_va_arg(ap,int)
     134            : (long long) __builtin_va_arg(ap,unsigned int);
     135          break;
     136      }
     137    }
     138  }