OSDN Git Service

New.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Jan 2003 07:04:42 +0000 (07:04 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Jan 2003 07:04:42 +0000 (07:04 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61427 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/gcc.dg/tls/opt-5.c [new file with mode: 0644]

diff --git a/gcc/testsuite/gcc.dg/tls/opt-5.c b/gcc/testsuite/gcc.dg/tls/opt-5.c
new file mode 100644 (file)
index 0000000..d8a686d
--- /dev/null
@@ -0,0 +1,109 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* 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 int count;
+  int fd = -1;
+  int save_errno = __libc_errno;
+  struct stat64 st;
+  unsigned int attempts_min = 62 * 62 * 62;
+  unsigned int 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;
+}