1/* { dg-do compile } */
2/* { dg-options "-O2" } */
3/* { dg-require-effective-target tls } */
4/* Sched1 moved {load_tp} pattern between strlen call and the copy
5   of the hard return value to its pseudo.  This resulted in a
6   reload abort, since the hard register was not spillable.  */
7
8extern __thread int __libc_errno __attribute__ ((tls_model ("initial-exec")));
9
10struct stat64
11  {
12    long dummy[4];
13  };
14typedef __SIZE_TYPE__ size_t;
15typedef unsigned long long uint64_t;
16typedef int __mode_t;
17
18extern size_t strlen (__const char *__s) __attribute__ ((__pure__));
19extern int strcmp (__const char *__s1, __const char *__s2)
20     __attribute__ ((__pure__));
21
22extern int __open64 (__const char *__file, int __oflag, ...);
23extern int __open (__const char *__file, int __oflag, ...);
24extern int __mkdir (__const char *__path, __mode_t __mode);
25extern int __lxstat64 (int __ver, __const char *__filename,
26                       struct stat64 *__stat_buf) ;
27
28static const char letters[] =
29"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
30
31int
32__gen_tempname (char *tmpl, int kind)
33{
34  int len;
35  char *XXXXXX;
36  static uint64_t value;
37  uint64_t random_time_bits;
38  unsigned long count;
39  int fd = -1;
40  int save_errno = __libc_errno;
41  struct stat64 st;
42  unsigned long attempts_min = 62L * 62L * 62L;
43  unsigned long attempts = attempts_min < 238328 ? 238328 : attempts_min;
44
45  len = strlen (tmpl);
46  if (len < 6 || strcmp(&tmpl[len - 6], "XXXXXX"))
47    {
48      (__libc_errno = (22));
49      return -1;
50    }
51
52  XXXXXX = &tmpl[len - 6];
53
54  for (count = 0; count < attempts; value += 7777, ++count)
55    {
56      uint64_t v = value;
57
58      XXXXXX[0] = letters[v % 62];
59      v /= 62;
60      XXXXXX[1] = letters[v % 62];
61      v /= 62;
62      XXXXXX[2] = letters[v % 62];
63      v /= 62;
64      XXXXXX[3] = letters[v % 62];
65      v /= 62;
66      XXXXXX[4] = letters[v % 62];
67      v /= 62;
68      XXXXXX[5] = letters[v % 62];
69
70      switch (kind)
71        {
72        case 0:
73          fd = __open (tmpl, 02 | 01000 | 04000, 0400 | 0200);
74          break;
75
76        case 1:
77          fd = __open64 (tmpl, 02 | 01000 | 04000, 0400 | 0200);
78          break;
79
80        case 2:
81          fd = __mkdir (tmpl, 0400 | 0200 | 0100);
82          break;
83
84        case 3:
85          if (__lxstat64 (2, tmpl, &st) < 0)
86            {
87              if (__libc_errno == 2)
88                {
89                  (__libc_errno = (save_errno));
90                  return 0;
91                }
92              else
93
94                return -1;
95            }
96          continue;
97        }
98
99      if (fd >= 0)
100        {
101          (__libc_errno = (save_errno));
102          return fd;
103        }
104      else if (__libc_errno != 17)
105        return -1;
106    }
107
108  (__libc_errno = (17));
109  return -1;
110}
111