Viewing file: opt-5.c (2.7 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { 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; }
|