Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from SymbolConversion. */
2 : : /* SymbolConversion.mod mapping between m2 symbols and gcc symbols.
3 : :
4 : : Copyright (C) 2001-2025 Free Software Foundation, Inc.
5 : : Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
6 : :
7 : : This file is part of GNU Modula-2.
8 : :
9 : : GNU Modula-2 is free software; you can redistribute it and/or modify
10 : : it under the terms of the GNU General Public License as published by
11 : : the Free Software Foundation; either version 3, or (at your option)
12 : : any later version.
13 : :
14 : : GNU Modula-2 is distributed in the hope that it will be useful, but
15 : : WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 : : General Public License for more details.
18 : :
19 : : You should have received a copy of the GNU General Public License
20 : : along with GNU Modula-2; see the file COPYING3. If not see
21 : : <http://www.gnu.org/licenses/>. */
22 : :
23 : : #define INCLUDE_MEMORY
24 : : #include "config.h"
25 : : #include "system.h"
26 : : #include "gcc-consolidation.h"
27 : :
28 : : #include <stdbool.h>
29 : : # if !defined (PROC_D)
30 : : # define PROC_D
31 : : typedef void (*PROC_t) (void);
32 : : typedef struct { PROC_t proc; } PROC;
33 : : # endif
34 : :
35 : : # if !defined (TRUE)
36 : : # define TRUE (1==1)
37 : : # endif
38 : :
39 : : #if defined(__cplusplus)
40 : : # undef NULL
41 : : # define NULL 0
42 : : #endif
43 : : #define _SymbolConversion_C
44 : :
45 : : #include "GSymbolConversion.h"
46 : : # include "GNameKey.h"
47 : : # include "GIndexing.h"
48 : : # include "GSymbolTable.h"
49 : : # include "GM2Error.h"
50 : : # include "GM2ALU.h"
51 : : # include "Gm2block.h"
52 : : # include "Ggcctypes.h"
53 : : # include "GM2Printf.h"
54 : : # include "GStorage.h"
55 : : # include "GSYSTEM.h"
56 : :
57 : : # define USEPOISON true
58 : : # define GGCPOISON 0x0A5A5A5A5
59 : : typedef unsigned int *SymbolConversion_PtrToCardinal;
60 : :
61 : : static Indexing_Index mod2gcc;
62 : : static void * PoisonedSymbol;
63 : :
64 : : /*
65 : : Mod2Gcc - given a modula-2 symbol, sym, return the gcc equivalent.
66 : : */
67 : :
68 : : extern "C" tree SymbolConversion_Mod2Gcc (unsigned int sym);
69 : :
70 : : /*
71 : : Gcc2Mod - given a gcc tree return the modula-2 symbol.
72 : : */
73 : :
74 : : extern "C" unsigned int SymbolConversion_Gcc2Mod (tree tree);
75 : :
76 : : /*
77 : : AddModGcc - adds the tuple [ sym, gcc ] into the database.
78 : : */
79 : :
80 : : extern "C" void SymbolConversion_AddModGcc (unsigned int sym, tree gcc);
81 : :
82 : : /*
83 : : RemoveMod2Gcc - removes the gcc symbol from the lookup table.
84 : : */
85 : :
86 : : extern "C" void SymbolConversion_RemoveMod2Gcc (unsigned int sym);
87 : :
88 : : /*
89 : : GccKnowsAbout - returns TRUE if gcc knows about the symbol, sym.
90 : : */
91 : :
92 : : extern "C" bool SymbolConversion_GccKnowsAbout (unsigned int sym);
93 : :
94 : : /*
95 : : AddTemporaryKnown - adds a temporary gcc symbol against the modula-2 sym.
96 : : */
97 : :
98 : : extern "C" void SymbolConversion_AddTemporaryKnown (unsigned int sym);
99 : :
100 : : /*
101 : : RemoveTemporaryKnown - removes the temporary symbol.
102 : : */
103 : :
104 : : extern "C" void SymbolConversion_RemoveTemporaryKnown (unsigned int sym);
105 : :
106 : : /*
107 : : Poison - poisons a symbol.
108 : : */
109 : :
110 : : extern "C" void SymbolConversion_Poison (unsigned int sym);
111 : :
112 : : /*
113 : : Mod2GccWithoutGCCPoison - given a modula-2 symbol, sym, return
114 : : the gcc equivalent, it does not check to see
115 : : whether the gcc symbol has been poisoned.
116 : : */
117 : :
118 : : static tree Mod2GccWithoutGCCPoison (unsigned int sym);
119 : :
120 : : /*
121 : : Init - create both binary trees.
122 : : */
123 : :
124 : : static void Init (void);
125 : :
126 : :
127 : : /*
128 : : Mod2GccWithoutGCCPoison - given a modula-2 symbol, sym, return
129 : : the gcc equivalent, it does not check to see
130 : : whether the gcc symbol has been poisoned.
131 : : */
132 : :
133 : 659593 : static tree Mod2GccWithoutGCCPoison (unsigned int sym)
134 : : {
135 : 659593 : NameKey_Name n;
136 : 659593 : tree tr;
137 : :
138 : 659593 : if (Indexing_InBounds (mod2gcc, sym))
139 : : {
140 : 659593 : tr = (tree) (Indexing_GetIndice (mod2gcc, sym));
141 : 659593 : if (tr == PoisonedSymbol)
142 : : {
143 : 0 : n = SymbolTable_GetSymName (sym);
144 : : /* not poisoned by the garbage collector, but by the gm2 front end. */
145 : 0 : M2Printf_printf1 ((const char *) "the gm2 front end poisoned this symbol (%a)\\n", 45, (const unsigned char *) &n, (sizeof (n)-1));
146 : 0 : M2Error_InternalError ((const char *) "attempting to use a gcc symbol which is no longer in scope", 58);
147 : : }
148 : : return tr;
149 : : }
150 : : else
151 : : {
152 : : return NULL;
153 : : }
154 : : /* static analysis guarentees a RETURN statement will be used before here. */
155 : : __builtin_unreachable ();
156 : : }
157 : :
158 : :
159 : : /*
160 : : Init - create both binary trees.
161 : : */
162 : :
163 : 15392 : static void Init (void)
164 : : {
165 : 15392 : mod2gcc = Indexing_InitIndexTuned (1, (1024*1024) / 16, 16);
166 : 15392 : Storage_ALLOCATE (&PoisonedSymbol, 1);
167 : 15392 : }
168 : :
169 : :
170 : : /*
171 : : Mod2Gcc - given a modula-2 symbol, sym, return the gcc equivalent.
172 : : */
173 : :
174 : 32132031 : extern "C" tree SymbolConversion_Mod2Gcc (unsigned int sym)
175 : : {
176 : 32132031 : NameKey_Name n;
177 : 32132031 : SymbolConversion_PtrToCardinal t;
178 : 32132031 : tree tr;
179 : :
180 : 32132031 : if (USEPOISON)
181 : : {
182 : 32132031 : if (Indexing_InBounds (mod2gcc, sym))
183 : : {
184 : 31969513 : t = (SymbolConversion_PtrToCardinal) (Indexing_GetIndice (mod2gcc, sym));
185 : 31969513 : if ((t != NULL) && ((*t) == GGCPOISON))
186 : : {
187 : 0 : M2Error_InternalError ((const char *) "gcc symbol has been poisoned", 28);
188 : : }
189 : : }
190 : : }
191 : 32132031 : if (Indexing_InBounds (mod2gcc, sym))
192 : : {
193 : 31969513 : tr = (tree) (Indexing_GetIndice (mod2gcc, sym));
194 : 31969513 : if (tr == PoisonedSymbol)
195 : : {
196 : 0 : n = SymbolTable_GetSymName (sym);
197 : : /* not poisoned by the garbage collector, but by the gm2 front end */
198 : 0 : M2Printf_printf1 ((const char *) "the gm2 front end poisoned this symbol (%a)\\n", 45, (const unsigned char *) &n, (sizeof (n)-1));
199 : 0 : M2Error_InternalError ((const char *) "attempting to use a gcc symbol which is no longer in scope", 58);
200 : : }
201 : : return tr;
202 : : }
203 : : else
204 : : {
205 : : return NULL;
206 : : }
207 : : /* static analysis guarentees a RETURN statement will be used before here. */
208 : : __builtin_unreachable ();
209 : : }
210 : :
211 : :
212 : : /*
213 : : Gcc2Mod - given a gcc tree return the modula-2 symbol.
214 : : */
215 : :
216 : 0 : extern "C" unsigned int SymbolConversion_Gcc2Mod (tree tree)
217 : : {
218 : 0 : unsigned int high;
219 : 0 : unsigned int i;
220 : :
221 : 0 : i = 1;
222 : 0 : high = Indexing_HighIndice (mod2gcc);
223 : 0 : while (i <= high)
224 : : {
225 : 0 : if ((Indexing_GetIndice (mod2gcc, i)) == tree)
226 : : {
227 : : return i;
228 : : }
229 : 0 : i += 1;
230 : : }
231 : : return SymbolTable_NulSym;
232 : : /* static analysis guarentees a RETURN statement will be used before here. */
233 : : __builtin_unreachable ();
234 : : }
235 : :
236 : :
237 : : /*
238 : : AddModGcc - adds the tuple [ sym, gcc ] into the database.
239 : : */
240 : :
241 : 11172182 : extern "C" void SymbolConversion_AddModGcc (unsigned int sym, tree gcc)
242 : : {
243 : 11172182 : tree old;
244 : 11172182 : SymbolConversion_PtrToCardinal t;
245 : :
246 : 11172182 : if (gcc == (m2block_GetErrorNode ()))
247 : : {
248 : 0 : M2Error_InternalError ((const char *) "error node generated during symbol conversion", 45);
249 : : }
250 : 11172182 : if (USEPOISON)
251 : : {
252 : 11172182 : t = (SymbolConversion_PtrToCardinal) (gcc);
253 : 11172182 : if ((gcc != ((tree) (NULL))) && ((*t) == GGCPOISON))
254 : : {
255 : 0 : M2Error_InternalError ((const char *) "gcc symbol has been poisoned", 28);
256 : : }
257 : : }
258 : 11172182 : old = SymbolConversion_Mod2Gcc (sym);
259 : 11172182 : if (old == ((tree) (NULL)))
260 : : {
261 : : /* absent - add it */
262 : 10954054 : Indexing_PutIndice (mod2gcc, sym, gcc);
263 : 10954054 : if ((Indexing_GetIndice (mod2gcc, sym)) != gcc)
264 : : {
265 : 0 : M2Error_InternalError ((const char *) "failed to add gcc <-> mod2 symbol", 33);
266 : : }
267 : 10954054 : gcc = m2block_RememberConstant (gcc);
268 : : }
269 : : /* do nothing, as it is already stored */
270 : 218128 : else if (old == gcc)
271 : : {
272 : : /* avoid dangling else. */
273 : : }
274 : 0 : else if (old == (m2block_GetErrorNode ()))
275 : : {
276 : : /* avoid dangling else. */
277 : 0 : M2Error_InternalError ((const char *) "replacing a temporary symbol (currently unexpected)", 51);
278 : : }
279 : : else
280 : : {
281 : : /* avoid dangling else. */
282 : 0 : M2Error_InternalError ((const char *) "should not be replacing a symbol", 32);
283 : : }
284 : 11172182 : if ((SymbolTable_IsConst (sym)) && (! (SymbolTable_IsValueSolved (sym))))
285 : : {
286 : 333626 : M2ALU_PushTypeOfTree (sym, gcc);
287 : 333626 : SymbolTable_PopValue (sym);
288 : : }
289 : 11172182 : }
290 : :
291 : :
292 : : /*
293 : : RemoveMod2Gcc - removes the gcc symbol from the lookup table.
294 : : */
295 : :
296 : 0 : extern "C" void SymbolConversion_RemoveMod2Gcc (unsigned int sym)
297 : : {
298 : 0 : Indexing_PutIndice (mod2gcc, sym, NULL);
299 : 0 : }
300 : :
301 : :
302 : : /*
303 : : GccKnowsAbout - returns TRUE if gcc knows about the symbol, sym.
304 : : */
305 : :
306 : 30685647 : extern "C" bool SymbolConversion_GccKnowsAbout (unsigned int sym)
307 : : {
308 : 30685647 : return (Indexing_InBounds (mod2gcc, sym)) && ((Indexing_GetIndice (mod2gcc, sym)) != NULL);
309 : : /* static analysis guarentees a RETURN statement will be used before here. */
310 : : __builtin_unreachable ();
311 : : }
312 : :
313 : :
314 : : /*
315 : : AddTemporaryKnown - adds a temporary gcc symbol against the modula-2 sym.
316 : : */
317 : :
318 : 0 : extern "C" void SymbolConversion_AddTemporaryKnown (unsigned int sym)
319 : : {
320 : : /* we add the error node against symbol, sym. We expect it to be retacted later. */
321 : 0 : Indexing_PutIndice (mod2gcc, sym, m2block_GetErrorNode ());
322 : 0 : }
323 : :
324 : :
325 : : /*
326 : : RemoveTemporaryKnown - removes the temporary symbol.
327 : : */
328 : :
329 : 0 : extern "C" void SymbolConversion_RemoveTemporaryKnown (unsigned int sym)
330 : : {
331 : 0 : if ((SymbolConversion_Mod2Gcc (sym)) == (m2block_GetErrorNode ()))
332 : : {
333 : 0 : Indexing_PutIndice (mod2gcc, sym, NULL);
334 : : }
335 : : else
336 : : {
337 : 0 : M2Error_InternalError ((const char *) "attempting to remove a symbol which is not present in the tree", 62);
338 : : }
339 : 0 : }
340 : :
341 : :
342 : : /*
343 : : Poison - poisons a symbol.
344 : : */
345 : :
346 : 685577 : extern "C" void SymbolConversion_Poison (unsigned int sym)
347 : : {
348 : 685577 : void * a;
349 : :
350 : 685577 : if (! (SymbolTable_IsConst (sym)))
351 : : {
352 : 659593 : a = Mod2GccWithoutGCCPoison (sym);
353 : 659593 : if (a != NULL)
354 : : {
355 : 657085 : Indexing_PutIndice (mod2gcc, sym, PoisonedSymbol);
356 : : }
357 : : }
358 : 685577 : }
359 : :
360 : 15392 : extern "C" void _M2_SymbolConversion_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
361 : : {
362 : 15392 : Init ();
363 : 15392 : }
364 : :
365 : 0 : extern "C" void _M2_SymbolConversion_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
366 : : {
367 : 0 : }
|