OSDN Git Service

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