]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/tls/opt-5.c
Makefile.in (libgcc-support, [...]): Add emutls.c.
[thirdparty/gcc.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 }