OSDN Git Service

Add gcc.dg/pr45506.c.
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 3 Sep 2010 14:40:36 +0000 (14:40 +0000)
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 3 Sep 2010 14:40:36 +0000 (14:40 +0000)
2010-09-03  H.J. Lu  <hongjiu.lu@intel.com>

PR tree-optimization/45506
* gcc.dg/pr45506.c: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163821 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr45506.c [new file with mode: 0644]

index 8df8979..6772020 100644 (file)
@@ -1,3 +1,8 @@
+2010-09-03  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR tree-optimization/45506
+       * gcc.dg/pr45506.c: New.
+
 2010-09-03  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/45476
diff --git a/gcc/testsuite/gcc.dg/pr45506.c b/gcc/testsuite/gcc.dg/pr45506.c
new file mode 100644 (file)
index 0000000..e934dc9
--- /dev/null
@@ -0,0 +1,47 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-g -O -w" } */
+
+typedef unsigned _GCC_ATTR_ALIGN_u32t;
+typedef _GCC_ATTR_ALIGN_u32t _Uint32t __attribute__((__aligned__(4)));
+typedef int _Intptrt __attribute__((__mode__(__pointer__)));
+typedef unsigned int _Uintptrt __attribute__((__mode__(__pointer__)));
+typedef _Intptrt ptrdiff_t;
+typedef _Uintptrt uintptr_t;
+typedef _Uint32t Elf32_Word;
+typedef struct list_head list_head_t;
+
+struct list_head {
+  list_head_t *next;
+};
+
+struct object { };
+
+struct objlist {
+  struct object *object;
+};
+
+static uintptr_t ldd(void *frame) __attribute__((__used__));
+static list_head_t *_dl_all_objects_ptr;
+static void fini_array(struct object *const obj) {
+  if ((dynvec(obj,(unsigned)26)) != ((Elf32_Word)-1)) {
+    unsigned i;
+    const unsigned funcs = (dynvec(obj,(unsigned)28)) / 4;
+    const Elf32_Word fa = (dynvec(obj,(unsigned)26));
+    const int *const p = relative_relocp(obj);
+    for (i = (funcs ? (funcs - 1) : 0U); i != 0U; i--) {
+      void (*const func)(void) = (void *) p[i];
+      (*func)();
+    }
+  }
+}
+static void _do_exit_fini(void) {
+  const struct objlist *o;
+  for (((o)) = ((void *)(((list_head_t *)(_dl_all_objects_ptr))->next));
+       !((((o))) == ((void *)((list_head_t *)(_dl_all_objects_ptr))));
+       ((o)) = ((void *)(((list_head_t *)((o)))->next)))
+    fini_array (o->object);
+}
+static uintptr_t ldd (void *frame) {
+  atexit(_do_exit_fini);
+}