]>
Commit | Line | Data |
---|---|---|
ada55151 NS |
1 | /* Vector API for GNU compiler. |
2 | Copyright (C) 2004 Free Software Foundation, Inc. | |
3 | Contributed by Nathan Sidwell <nathan@codesourcery.com> | |
4 | ||
5 | This file is part of GCC. | |
6 | ||
7 | GCC is free software; you can redistribute it and/or modify it under | |
8 | the terms of the GNU General Public License as published by the Free | |
9 | Software Foundation; either version 2, or (at your option) any later | |
10 | version. | |
11 | ||
12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 | for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with GCC; see the file COPYING. If not, write to the Free | |
19 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA | |
20 | 02111-1307, USA. */ | |
21 | ||
22 | #include "config.h" | |
23 | #include "system.h" | |
24 | #include "ggc.h" | |
25 | #include "vec.h" | |
26 | #include "errors.h" | |
27 | #include "coretypes.h" | |
28 | #include "tree.h" | |
29 | ||
30 | struct vec_prefix | |
31 | { | |
3cbf09de NS |
32 | unsigned num; |
33 | unsigned alloc; | |
ada55151 NS |
34 | void *vec[1]; |
35 | }; | |
36 | ||
7de5bccc NS |
37 | /* Ensure there are at least RESERVE free slots in VEC, if RESERVE >= |
38 | 0. If RESERVE < 0 increase the current allocation exponentially. | |
39 | VEC can be NULL, to create a new vector. */ | |
ada55151 NS |
40 | |
41 | void * | |
4c254e68 | 42 | vec_gc_p_reserve (void *vec, int reserve MEM_STAT_DECL) |
ada55151 | 43 | { |
4c254e68 NS |
44 | return vec_gc_o_reserve (vec, reserve, |
45 | offsetof (struct vec_prefix, vec), sizeof (void *) | |
46 | PASS_MEM_STAT); | |
ada55151 NS |
47 | } |
48 | ||
7de5bccc NS |
49 | /* Ensure there are at least RESERVE free slots in VEC, if RESERVE >= |
50 | 0. If RESERVE < 0, increase the current allocation exponentially. | |
51 | VEC can be NULL, in which case a new vector is created. The | |
2a7e31df | 52 | vector's trailing array is at VEC_OFFSET offset and consists of |
7de5bccc | 53 | ELT_SIZE sized elements. */ |
ada55151 NS |
54 | |
55 | void * | |
4c254e68 NS |
56 | vec_gc_o_reserve (void *vec, int reserve, size_t vec_offset, size_t elt_size |
57 | MEM_STAT_DECL) | |
ada55151 NS |
58 | { |
59 | struct vec_prefix *pfx = vec; | |
3cbf09de | 60 | unsigned alloc = pfx ? pfx->num : 0; |
ada55151 | 61 | |
7de5bccc NS |
62 | if (reserve >= 0) |
63 | alloc += reserve; | |
64 | else if (alloc) | |
65 | alloc *= 2; | |
ada55151 | 66 | else |
7de5bccc NS |
67 | alloc = 4; |
68 | ||
69 | if (pfx && pfx->alloc >= alloc) | |
70 | abort (); | |
ada55151 | 71 | |
7de5bccc NS |
72 | vec = ggc_realloc_stat (vec, vec_offset + alloc * elt_size PASS_MEM_STAT); |
73 | ((struct vec_prefix *)vec)->alloc = alloc; | |
74 | if (!pfx) | |
75 | ((struct vec_prefix *)vec)->num = 0; | |
ada55151 NS |
76 | |
77 | return vec; | |
78 | } | |
79 | ||
4c254e68 NS |
80 | /* Explicitly release a vector. */ |
81 | ||
82 | void | |
83 | vec_gc_free (void *vec) | |
84 | { | |
85 | ggc_free (vec); | |
86 | } | |
87 | ||
88 | /* Ensure there are at least RESERVE free slots in VEC, if RESERVE >= | |
89 | 0. If RESERVE < 0 increase the current allocation exponentially. | |
90 | VEC can be NULL, to create a new vector. */ | |
91 | ||
92 | void * | |
93 | vec_heap_p_reserve (void *vec, int reserve MEM_STAT_DECL) | |
94 | { | |
95 | return vec_heap_o_reserve (vec, reserve, | |
96 | offsetof (struct vec_prefix, vec), sizeof (void *) | |
97 | PASS_MEM_STAT); | |
98 | } | |
99 | ||
100 | /* Ensure there are at least RESERVE free slots in VEC, if RESERVE >= | |
101 | 0. If RESERVE < 0, increase the current allocation exponentially. | |
102 | VEC can be NULL, in which case a new vector is created. The | |
103 | vector's trailing array is at VEC_OFFSET offset and consists of | |
104 | ELT_SIZE sized elements. */ | |
105 | ||
106 | void * | |
107 | vec_heap_o_reserve (void *vec, int reserve, size_t vec_offset, size_t elt_size | |
108 | MEM_STAT_DECL) | |
109 | { | |
110 | struct vec_prefix *pfx = vec; | |
111 | unsigned alloc = pfx ? pfx->num : 0; | |
112 | ||
113 | if (reserve >= 0) | |
114 | alloc += reserve; | |
115 | else if (alloc) | |
116 | alloc *= 2; | |
117 | else | |
118 | alloc = 4; | |
119 | ||
120 | if (pfx && pfx->alloc >= alloc) | |
121 | abort (); | |
122 | ||
123 | vec = xrealloc (vec, vec_offset + alloc * elt_size); | |
124 | ((struct vec_prefix *)vec)->alloc = alloc; | |
125 | if (!pfx) | |
126 | ((struct vec_prefix *)vec)->num = 0; | |
127 | ||
128 | return vec; | |
129 | } | |
130 | ||
131 | /* Explicitly release a vector. */ | |
132 | ||
133 | void | |
134 | vec_heap_free (void *vec) | |
135 | { | |
136 | free (vec); | |
137 | } | |
138 | ||
ada55151 NS |
139 | #if ENABLE_CHECKING |
140 | /* Issue a vector domain error, and then fall over. */ | |
141 | ||
142 | void | |
143 | vec_assert_fail (const char *op, const char *struct_name, | |
dae1dd2e | 144 | const char *file, unsigned int line, const char *function) |
ada55151 NS |
145 | { |
146 | internal_error ("vector %s %s domain error, in %s at %s:%u", | |
70ce47b5 | 147 | struct_name, op, function, trim_filename (file), line); |
ada55151 NS |
148 | } |
149 | #endif |