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 
8 extern __thread int __libc_errno __attribute__ ((tls_model ("initial-exec")));
9 
10 struct stat64
11   {
12     long dummy[4];
13   };
14 typedef __SIZE_TYPE__ size_t;
15 typedef unsigned long long uint64_t;
16 typedef int __mode_t;
17 
18 extern size_t strlen (__const char *__s) __attribute__ ((__pure__));
19 extern int strcmp (__const char *__s1, __const char *__s2)
20      __attribute__ ((__pure__));
21 
22 extern int __open64 (__const char *__file, int __oflag, ...);
23 extern int __open (__const char *__file, int __oflag, ...);
24 extern int __mkdir (__const char *__path, __mode_t __mode);
25 extern int __lxstat64 (int __ver, __const char *__filename,
26                        struct stat64 *__stat_buf) ;
27 
28 static const char letters[] =
29 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
30 
31 int
__gen_tempname(char * tmpl,int kind)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