* gcc.c-torture/compile/20010102-1.c: New test.
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>
Wed, 3 Jan 2001 04:39:40 +0000 (04:39 +0000)
committerKaveh Ghazi <ghazi@gcc.gnu.org>
Wed, 3 Jan 2001 04:39:40 +0000 (04:39 +0000)
From-SVN: r38646

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20010102-1.c [new file with mode: 0644]

index b339afaff891239e417762f824f95d8bb7a70af7..e591e1bd4d5663a3589c45c1ab3cf4726abd7fbb 100644 (file)
@@ -1,3 +1,7 @@
+2001-01-02  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * gcc.c-torture/compile/20010102-1.c: New test.
+
 2001-01-02  Andreas Jaeger  <aj@suse.de>
 
        * gcc.dg/noreturn-3.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20010102-1.c b/gcc/testsuite/gcc.c-torture/compile/20010102-1.c
new file mode 100644 (file)
index 0000000..a409b56
--- /dev/null
@@ -0,0 +1,101 @@
+/* This testcase derives from gnu obstack.c/obstack.h and failed with
+   -O3 -funroll-all-loops, or -O1 -frename-registers -funroll-loops on
+   sparc-sun-solaris2.7.
+
+   Copyright (C) 2001  Free Software Foundation.  */
+
+# define PTR_INT_TYPE __PTRDIFF_TYPE__
+
+struct _obstack_chunk
+{
+  char  *limit;
+  struct _obstack_chunk *prev;
+  char contents[4];
+};
+
+struct obstack
+{
+  long chunk_size;
+  struct _obstack_chunk *chunk;
+  char *object_base;
+  char *next_free;
+  char *chunk_limit;
+  PTR_INT_TYPE temp;
+  int   alignment_mask;
+  struct _obstack_chunk *(*chunkfun) (void *, long);
+  void (*freefun) (void *, struct _obstack_chunk *);
+  void *extra_arg;
+  unsigned use_extra_arg:1;
+  unsigned maybe_empty_object:1;
+  unsigned alloc_failed:1;
+};
+
+extern void _obstack_newchunk (struct obstack *, int);
+
+struct fooalign {char x; double d;};
+#define DEFAULT_ALIGNMENT  \
+  ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
+union fooround {long x; double d;};
+#define DEFAULT_ROUNDING (sizeof (union fooround))
+
+#ifndef COPYING_UNIT
+#define COPYING_UNIT int
+#endif
+
+#define CALL_CHUNKFUN(h, size) \
+  (((h) -> use_extra_arg) \
+   ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
+   : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
+
+#define CALL_FREEFUN(h, old_chunk) \
+  do { \
+    if ((h) -> use_extra_arg) \
+      (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
+    else \
+      (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
+  } while (0)
+
+void
+_obstack_newchunk (h, length)
+     struct obstack *h;
+     int length;
+{
+  register struct _obstack_chunk *old_chunk = h->chunk;
+  register struct _obstack_chunk *new_chunk;
+  register long        new_size;
+  register long obj_size = h->next_free - h->object_base;
+  register long i;
+  long already;
+
+  new_size = (obj_size + length) + (obj_size >> 3) + 100;
+  if (new_size < h->chunk_size)
+    new_size = h->chunk_size;
+
+  new_chunk = CALL_CHUNKFUN (h, new_size);
+  h->chunk = new_chunk;
+  new_chunk->prev = old_chunk;
+  new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
+
+  if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
+    {
+      for (i = obj_size / sizeof (COPYING_UNIT) - 1;
+          i >= 0; i--)
+       ((COPYING_UNIT *)new_chunk->contents)[i]
+         = ((COPYING_UNIT *)h->object_base)[i];
+      already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
+    }
+  else
+    already = 0;
+  for (i = already; i < obj_size; i++)
+    new_chunk->contents[i] = h->object_base[i];
+
+  if (h->object_base == old_chunk->contents && ! h->maybe_empty_object)
+    {
+      new_chunk->prev = old_chunk->prev;
+      CALL_FREEFUN (h, old_chunk);
+    }
+
+  h->object_base = new_chunk->contents;
+  h->next_free = h->object_base + obj_size;
+  h->maybe_empty_object = 0;
+}