Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from M2AsmUtil. */
2 : : /* M2AsmUtil.mod provides utilities relating symbols in the SymbolTable.
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 (FALSE)
36 : : # define FALSE (1==0)
37 : : # endif
38 : :
39 : : #define _M2AsmUtil_C
40 : :
41 : : #include "GM2AsmUtil.h"
42 : : # include "GSFIO.h"
43 : : # include "GFIO.h"
44 : : # include "GDynamicStrings.h"
45 : : # include "GStdIO.h"
46 : : # include "GStrIO.h"
47 : : # include "GNameKey.h"
48 : : # include "GM2Options.h"
49 : : # include "GM2Printf.h"
50 : : # include "GSymbolTable.h"
51 : : # include "GM2Error.h"
52 : : # include "Gm2configure.h"
53 : :
54 : : # define Debugging false
55 : :
56 : : /*
57 : : GetFullSymName - returns the NameKey for the symbol name (which also
58 : : may contain the module name).
59 : : */
60 : :
61 : : extern "C" NameKey_Name M2AsmUtil_GetFullSymName (unsigned int sym);
62 : :
63 : : /*
64 : : GetFullScopeAsmName - returns the fully qualified name for the symbol.
65 : : This will take the format
66 : : [DefImpModule|Module]_{InnerModule}_{Procedure}_SymbolName
67 : : */
68 : :
69 : : extern "C" NameKey_Name M2AsmUtil_GetFullScopeAsmName (unsigned int sym);
70 : :
71 : : /*
72 : : StringToKey - returns a Name, from a string and destroys the string.
73 : : */
74 : :
75 : : static NameKey_Name StringToKey (DynamicStrings_String s);
76 : :
77 : : /*
78 : : SymNeedsModulePrefix - return TRUE if symbol mod is required to have a prefix.
79 : : */
80 : :
81 : : static bool SymNeedsModulePrefix (unsigned int sym, unsigned int mod);
82 : :
83 : : /*
84 : : GetModulePrefix - returns a String containing the module prefix
85 : : for module, ModSym, providing symbol, Sym, is exported.
86 : : Name is marked if it is appended onto the new string.
87 : : */
88 : :
89 : : static DynamicStrings_String GetModulePrefix (DynamicStrings_String Name, unsigned int Sym, unsigned int ModSym);
90 : :
91 : : /*
92 : : GetFullScopePrefix - returns a String containing the full scope prefix
93 : : for symbol, Sym. It honours IsExportQualified.
94 : : Name is marked if it is appended onto the new string.
95 : : */
96 : :
97 : : static DynamicStrings_String GetFullScopePrefix (DynamicStrings_String Name, unsigned int Scope, unsigned int Sym);
98 : :
99 : :
100 : : /*
101 : : StringToKey - returns a Name, from a string and destroys the string.
102 : : */
103 : :
104 : 3582845 : static NameKey_Name StringToKey (DynamicStrings_String s)
105 : : {
106 : 3582845 : NameKey_Name k;
107 : :
108 : 3582845 : k = NameKey_makekey (DynamicStrings_string (s));
109 : 3582845 : s = DynamicStrings_KillString (s);
110 : 3582845 : return k;
111 : : /* static analysis guarentees a RETURN statement will be used before here. */
112 : : __builtin_unreachable ();
113 : : }
114 : :
115 : :
116 : : /*
117 : : SymNeedsModulePrefix - return TRUE if symbol mod is required to have a prefix.
118 : : */
119 : :
120 : 3091415 : static bool SymNeedsModulePrefix (unsigned int sym, unsigned int mod)
121 : : {
122 : 3091415 : if (SymbolTable_IsDefImp (mod))
123 : : {
124 : 2385464 : if (SymbolTable_IsExportUnQualified (sym))
125 : : {
126 : : return false;
127 : : }
128 : : else
129 : : {
130 : : /* We need to force the prefix if whole program is used otherwise
131 : : local symbols from multipl modules might conflict. */
132 : 2000832 : return M2Options_WholeProgram || (SymbolTable_IsExportQualified (sym));
133 : : }
134 : : }
135 : 705951 : else if (SymbolTable_IsModule (mod))
136 : : {
137 : : /* avoid dangling else. */
138 : 122930 : return M2Options_WholeProgram;
139 : : }
140 : : return false;
141 : : /* static analysis guarentees a RETURN statement will be used before here. */
142 : : __builtin_unreachable ();
143 : : }
144 : :
145 : :
146 : : /*
147 : : GetModulePrefix - returns a String containing the module prefix
148 : : for module, ModSym, providing symbol, Sym, is exported.
149 : : Name is marked if it is appended onto the new string.
150 : : */
151 : :
152 : 3182327 : static DynamicStrings_String GetModulePrefix (DynamicStrings_String Name, unsigned int Sym, unsigned int ModSym)
153 : : {
154 : 3182327 : if ((ModSym != SymbolTable_NulSym) && (ModSym != (SymbolTable_GetBaseModule ())))
155 : : {
156 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
157 : 3093989 : if ((SymbolTable_IsInnerModule (Sym)) || (SymbolTable_IsInnerModule (ModSym)))
158 : : {
159 : 2574 : return DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (ModSym))), '_'), GetModulePrefix (Name, ModSym, SymbolTable_GetScope (ModSym)));
160 : : }
161 : 3091415 : else if (SymNeedsModulePrefix (Sym, ModSym))
162 : : {
163 : : /* avoid dangling else. */
164 : 1612044 : return DynamicStrings_ConCatChar (DynamicStrings_ConCat (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (ModSym))), DynamicStrings_Mark (Name)), '_');
165 : : }
166 : : }
167 : : return Name;
168 : : /* static analysis guarentees a RETURN statement will be used before here. */
169 : : __builtin_unreachable ();
170 : : }
171 : :
172 : :
173 : : /*
174 : : GetFullScopePrefix - returns a String containing the full scope prefix
175 : : for symbol, Sym. It honours IsExportQualified.
176 : : Name is marked if it is appended onto the new string.
177 : : */
178 : :
179 : 403092 : static DynamicStrings_String GetFullScopePrefix (DynamicStrings_String Name, unsigned int Scope, unsigned int Sym)
180 : : {
181 : 403092 : if (Sym != SymbolTable_NulSym)
182 : : {
183 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
184 : 403092 : if (SymbolTable_IsInnerModule (Scope))
185 : : {
186 : 0 : return DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (Scope))), '_'), GetFullScopePrefix (Name, SymbolTable_GetScope (Scope), Sym));
187 : : }
188 : 403092 : else if ((SymbolTable_IsDefImp (Scope)) && (SymbolTable_IsExportQualified (Sym)))
189 : : {
190 : : /* avoid dangling else. */
191 : 355450 : return DynamicStrings_ConCatChar (DynamicStrings_ConCat (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (Scope))), DynamicStrings_Mark (Name)), '_');
192 : : }
193 : 47642 : else if (SymbolTable_IsProcedure (Scope))
194 : : {
195 : : /* avoid dangling else. */
196 : 0 : return DynamicStrings_ConCatChar (DynamicStrings_ConCat (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (Scope))), DynamicStrings_Mark (Name)), '_');
197 : : }
198 : : }
199 : : return Name;
200 : : /* static analysis guarentees a RETURN statement will be used before here. */
201 : : __builtin_unreachable ();
202 : : }
203 : :
204 : :
205 : : /*
206 : : GetFullSymName - returns the NameKey for the symbol name (which also
207 : : may contain the module name).
208 : : */
209 : :
210 : 3517952 : extern "C" NameKey_Name M2AsmUtil_GetFullSymName (unsigned int sym)
211 : : {
212 : 3517952 : DynamicStrings_String libname;
213 : 3517952 : DynamicStrings_String fullsymname;
214 : 3517952 : DynamicStrings_String module;
215 : 3517952 : unsigned int scope;
216 : :
217 : 3517952 : if ((SymbolTable_IsProcedure (sym)) && (SymbolTable_IsMonoName (sym)))
218 : : {
219 : 338199 : return SymbolTable_GetSymName (sym);
220 : : }
221 : : else
222 : : {
223 : 3179753 : scope = SymbolTable_GetScope (sym);
224 : 3179753 : module = GetModulePrefix (DynamicStrings_InitString ((const char *) "", 0), sym, scope);
225 : 3179753 : fullsymname = DynamicStrings_ConCat (module, DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (sym))));
226 : 3179753 : if (((SymbolTable_IsVar (sym)) || (SymbolTable_IsProcedure (sym))) && (SymbolTable_IsExportQualified (sym)))
227 : : {
228 : 1533218 : while (! (SymbolTable_IsDefImp (scope)))
229 : : {
230 : 0 : scope = SymbolTable_GetScope (scope);
231 : : }
232 : 1533218 : if ((SymbolTable_GetLibName (scope)) != NameKey_NulName)
233 : : {
234 : 1533218 : if (Debugging)
235 : : {
236 : : M2Printf_printf1 ((const char *) "before sym = %s , ", 19, (const unsigned char *) &fullsymname, (sizeof (fullsymname)-1));
237 : : }
238 : 1533218 : libname = DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetLibName (scope)));
239 : 1533218 : if (! (DynamicStrings_EqualArray (libname, (const char *) "", 0)))
240 : : {
241 : 1511791 : if (Debugging)
242 : : {
243 : : M2Printf_printf1 ((const char *) "libname = %s , ", 16, (const unsigned char *) &libname, (sizeof (libname)-1));
244 : : }
245 : 1511791 : fullsymname = DynamicStrings_ConCat (DynamicStrings_ConCatChar (libname, '_'), fullsymname);
246 : : }
247 : : if (Debugging)
248 : : {
249 : : M2Printf_printf1 ((const char *) "after sym = %s\\n", 16, (const unsigned char *) &fullsymname, (sizeof (fullsymname)-1));
250 : : }
251 : : }
252 : : }
253 : 3179753 : return StringToKey (fullsymname);
254 : : }
255 : : /* static analysis guarentees a RETURN statement will be used before here. */
256 : : __builtin_unreachable ();
257 : : }
258 : :
259 : :
260 : : /*
261 : : GetFullScopeAsmName - returns the fully qualified name for the symbol.
262 : : This will take the format
263 : : [DefImpModule|Module]_{InnerModule}_{Procedure}_SymbolName
264 : : */
265 : :
266 : 403092 : extern "C" NameKey_Name M2AsmUtil_GetFullScopeAsmName (unsigned int sym)
267 : : {
268 : 403092 : DynamicStrings_String leader;
269 : 403092 : unsigned int scope;
270 : :
271 : 403092 : scope = SymbolTable_GetScope (sym);
272 : 403092 : if (m2configure_UseUnderscoreForC)
273 : : {
274 : : leader = DynamicStrings_InitString ((const char *) "_", 1);
275 : : }
276 : : else
277 : : {
278 : 403092 : leader = DynamicStrings_InitString ((const char *) "", 0);
279 : : }
280 : 403092 : if ((SymbolTable_IsProcedure (sym)) && (SymbolTable_IsMonoName (sym)))
281 : : {
282 : 0 : return StringToKey (DynamicStrings_ConCat (leader, DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (sym)))));
283 : : }
284 : : else
285 : : {
286 : 403092 : return StringToKey (DynamicStrings_ConCat (GetFullScopePrefix (leader, scope, sym), DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (sym)))));
287 : : }
288 : : /* static analysis guarentees a RETURN statement will be used before here. */
289 : : __builtin_unreachable ();
290 : : }
291 : :
292 : 15392 : extern "C" void _M2_M2AsmUtil_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
293 : : {
294 : 15392 : }
295 : :
296 : 0 : extern "C" void _M2_M2AsmUtil_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
297 : : {
298 : 0 : }
|