annotate gcc/testsuite/gcc.c-torture/compile/20010102-1.c @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* This testcase derives from gnu obstack.c/obstack.h and failed with
kono
parents:
diff changeset
2 -O3 -funroll-all-loops, or -O1 -frename-registers -funroll-loops on
kono
parents:
diff changeset
3 sparc-sun-solaris2.7.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 Copyright (C) 2001 Free Software Foundation. */
kono
parents:
diff changeset
6
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
7 /* { dg-require-effective-target indirect_calls } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
8
111
kono
parents:
diff changeset
9 # define PTR_INT_TYPE __PTRDIFF_TYPE__
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 struct _obstack_chunk
kono
parents:
diff changeset
12 {
kono
parents:
diff changeset
13 char *limit;
kono
parents:
diff changeset
14 struct _obstack_chunk *prev;
kono
parents:
diff changeset
15 char contents[4];
kono
parents:
diff changeset
16 };
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 struct obstack
kono
parents:
diff changeset
19 {
kono
parents:
diff changeset
20 long chunk_size;
kono
parents:
diff changeset
21 struct _obstack_chunk *chunk;
kono
parents:
diff changeset
22 char *object_base;
kono
parents:
diff changeset
23 char *next_free;
kono
parents:
diff changeset
24 char *chunk_limit;
kono
parents:
diff changeset
25 PTR_INT_TYPE temp;
kono
parents:
diff changeset
26 int alignment_mask;
kono
parents:
diff changeset
27 struct _obstack_chunk *(*chunkfun) (void *, long);
kono
parents:
diff changeset
28 void (*freefun) (void *, struct _obstack_chunk *);
kono
parents:
diff changeset
29 void *extra_arg;
kono
parents:
diff changeset
30 unsigned use_extra_arg:1;
kono
parents:
diff changeset
31 unsigned maybe_empty_object:1;
kono
parents:
diff changeset
32 unsigned alloc_failed:1;
kono
parents:
diff changeset
33 };
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 extern void _obstack_newchunk (struct obstack *, int);
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 struct fooalign {char x; double d;};
kono
parents:
diff changeset
38 #define DEFAULT_ALIGNMENT \
kono
parents:
diff changeset
39 ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
kono
parents:
diff changeset
40 union fooround {long x; double d;};
kono
parents:
diff changeset
41 #define DEFAULT_ROUNDING (sizeof (union fooround))
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 #ifndef COPYING_UNIT
kono
parents:
diff changeset
44 #define COPYING_UNIT int
kono
parents:
diff changeset
45 #endif
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 #define CALL_CHUNKFUN(h, size) \
kono
parents:
diff changeset
48 (((h) -> use_extra_arg) \
kono
parents:
diff changeset
49 ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
kono
parents:
diff changeset
50 : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 #define CALL_FREEFUN(h, old_chunk) \
kono
parents:
diff changeset
53 do { \
kono
parents:
diff changeset
54 if ((h) -> use_extra_arg) \
kono
parents:
diff changeset
55 (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
kono
parents:
diff changeset
56 else \
kono
parents:
diff changeset
57 (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
kono
parents:
diff changeset
58 } while (0)
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 void
kono
parents:
diff changeset
61 _obstack_newchunk (h, length)
kono
parents:
diff changeset
62 struct obstack *h;
kono
parents:
diff changeset
63 int length;
kono
parents:
diff changeset
64 {
kono
parents:
diff changeset
65 register struct _obstack_chunk *old_chunk = h->chunk;
kono
parents:
diff changeset
66 register struct _obstack_chunk *new_chunk;
kono
parents:
diff changeset
67 register long new_size;
kono
parents:
diff changeset
68 register long obj_size = h->next_free - h->object_base;
kono
parents:
diff changeset
69 register long i;
kono
parents:
diff changeset
70 long already;
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 new_size = (obj_size + length) + (obj_size >> 3) + 100;
kono
parents:
diff changeset
73 if (new_size < h->chunk_size)
kono
parents:
diff changeset
74 new_size = h->chunk_size;
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 new_chunk = CALL_CHUNKFUN (h, new_size);
kono
parents:
diff changeset
77 h->chunk = new_chunk;
kono
parents:
diff changeset
78 new_chunk->prev = old_chunk;
kono
parents:
diff changeset
79 new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
kono
parents:
diff changeset
82 {
kono
parents:
diff changeset
83 for (i = obj_size / sizeof (COPYING_UNIT) - 1;
kono
parents:
diff changeset
84 i >= 0; i--)
kono
parents:
diff changeset
85 ((COPYING_UNIT *)new_chunk->contents)[i]
kono
parents:
diff changeset
86 = ((COPYING_UNIT *)h->object_base)[i];
kono
parents:
diff changeset
87 already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
kono
parents:
diff changeset
88 }
kono
parents:
diff changeset
89 else
kono
parents:
diff changeset
90 already = 0;
kono
parents:
diff changeset
91 for (i = already; i < obj_size; i++)
kono
parents:
diff changeset
92 new_chunk->contents[i] = h->object_base[i];
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 if (h->object_base == old_chunk->contents && ! h->maybe_empty_object)
kono
parents:
diff changeset
95 {
kono
parents:
diff changeset
96 new_chunk->prev = old_chunk->prev;
kono
parents:
diff changeset
97 CALL_FREEFUN (h, old_chunk);
kono
parents:
diff changeset
98 }
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 h->object_base = new_chunk->contents;
kono
parents:
diff changeset
101 h->next_free = h->object_base + obj_size;
kono
parents:
diff changeset
102 h->maybe_empty_object = 0;
kono
parents:
diff changeset
103 }