/* { dg-do compile } */ /* { dg-options "-O2" } */ /* { dg-require-effective-target tls } */ /* Sched1 moved {load_tp} pattern between strlen call and the copy of the hard return value to its pseudo. This resulted in a reload abort, since the hard register was not spillable. */ extern __thread int __libc_errno __attribute__ ((tls_model ("initial-exec"))); struct stat64 { long dummy[4]; }; typedef __SIZE_TYPE__ size_t; typedef unsigned long long uint64_t; typedef int __mode_t; extern size_t strlen (__const char *__s) __attribute__ ((__pure__)); extern int strcmp (__const char *__s1, __const char *__s2) __attribute__ ((__pure__)); extern int __open64 (__const char *__file, int __oflag, ...); extern int __open (__const char *__file, int __oflag, ...); extern int __mkdir (__const char *__path, __mode_t __mode); extern int __lxstat64 (int __ver, __const char *__filename, struct stat64 *__stat_buf) ; static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; int __gen_tempname (char *tmpl, int kind) { int len; char *XXXXXX; static uint64_t value; uint64_t random_time_bits; unsigned long count; int fd = -1; int save_errno = __libc_errno; struct stat64 st; unsigned long attempts_min = 62L * 62L * 62L; unsigned long attempts = attempts_min < 238328 ? 238328 : attempts_min; len = strlen (tmpl); if (len < 6 || strcmp(&tmpl[len - 6], "XXXXXX")) { (__libc_errno = (22)); return -1; } XXXXXX = &tmpl[len - 6]; for (count = 0; count < attempts; value += 7777, ++count) { uint64_t v = value; XXXXXX[0] = letters[v % 62]; v /= 62; XXXXXX[1] = letters[v % 62]; v /= 62; XXXXXX[2] = letters[v % 62]; v /= 62; XXXXXX[3] = letters[v % 62]; v /= 62; XXXXXX[4] = letters[v % 62]; v /= 62; XXXXXX[5] = letters[v % 62]; switch (kind) { case 0: fd = __open (tmpl, 02 | 01000 | 04000, 0400 | 0200); break; case 1: fd = __open64 (tmpl, 02 | 01000 | 04000, 0400 | 0200); break; case 2: fd = __mkdir (tmpl, 0400 | 0200 | 0100); break; case 3: if (__lxstat64 (2, tmpl, &st) < 0) { if (__libc_errno == 2) { (__libc_errno = (save_errno)); return 0; } else return -1; } continue; } if (fd >= 0) { (__libc_errno = (save_errno)); return fd; } else if (__libc_errno != 17) return -1; } (__libc_errno = (17)); return -1; }