Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from M2LangDump. */
2 : : /* M2LangDump.mod provides support routines for the -flang-dump.
3 : :
4 : : Copyright (C) 2024-2025 Free Software Foundation, Inc.
5 : : Contributed by Gaius Mulley <gaiusmod2@gmail.com>.
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 (FALSE)
40 : : # define FALSE (1==0)
41 : : # endif
42 : :
43 : : #if defined(__cplusplus)
44 : : # undef NULL
45 : : # define NULL 0
46 : : #endif
47 : : #define _M2LangDump_C
48 : :
49 : : #include "GM2LangDump.h"
50 : : # include "GSYSTEM.h"
51 : : # include "GDynamicStrings.h"
52 : : # include "GSymbolTable.h"
53 : : # include "GM2Options.h"
54 : : # include "GM2AsmUtil.h"
55 : : # include "GM2GCCDeclare.h"
56 : : # include "GFormatStrings.h"
57 : : # include "GNameKey.h"
58 : : # include "GSymbolConversion.h"
59 : : # include "GM2LexBuf.h"
60 : : # include "GM2Printf.h"
61 : : # include "GM2Error.h"
62 : : # include "GM2Batch.h"
63 : : # include "Gm2misc.h"
64 : : # include "GStrLib.h"
65 : : # include "Glibc.h"
66 : : # include "GFIO.h"
67 : : # include "GSFIO.h"
68 : : # include "GStdIO.h"
69 : :
70 : : # define Debugging false
71 : : static FIO_File outputFile;
72 : : static bool declActive;
73 : : static bool quadActive;
74 : : static bool mustClose;
75 : : static unsigned int NoOfQuadDumps;
76 : : static unsigned int NoOfDeclDumps;
77 : :
78 : : /*
79 : : IsDumpRequiredTree - return TRUE if the gcc tree should be dumped.
80 : : */
81 : :
82 : : extern "C" bool M2LangDump_IsDumpRequiredTree (tree gcctree, bool default_);
83 : :
84 : : /*
85 : : IsDumpRequired - return TRUE if symbol sym should be dumped
86 : : according to the rules of the filter.
87 : : No filter specified will always return default.
88 : : The filter is a comma separated list. Each element
89 : : of the list can specify a symbol three ways.
90 : : Firstly by DECL name for example: m2pim_NumberIO_HexToStr
91 : : Secondly by qualified scope: [pathname.]NumberIO.HexToStr
92 : : Thirdly by filename and scope: NumberIO.mod:HexToStr
93 : : */
94 : :
95 : : extern "C" bool M2LangDump_IsDumpRequired (unsigned int sym, bool default_);
96 : :
97 : : /*
98 : : MakeQuadTemplate - return a template for the quad dump file.
99 : : */
100 : :
101 : : extern "C" DynamicStrings_String M2LangDump_MakeQuadTemplate (void);
102 : :
103 : : /*
104 : : MakeGimpleTemplate - return a template for the gimple dump file and assign
105 : : len to the max number of characters required to complete
106 : : a template (including a nul terminator).
107 : : */
108 : :
109 : : extern "C" DynamicStrings_String M2LangDump_MakeGimpleTemplate (unsigned int *len);
110 : :
111 : : /*
112 : : GetDumpFile - return the dump output file.
113 : : */
114 : :
115 : : extern "C" FIO_File M2LangDump_GetDumpFile (void);
116 : :
117 : : /*
118 : : CreateDumpQuad - create the dump file for a quad dump.
119 : : */
120 : :
121 : : extern "C" void M2LangDump_CreateDumpQuad (const char *title_, unsigned int _title_high);
122 : :
123 : : /*
124 : : CloseDumpQuad - close the dump output file.
125 : : */
126 : :
127 : : extern "C" void M2LangDump_CloseDumpQuad (void);
128 : :
129 : : /*
130 : : CreateDumpDecl - create the dump file for a decl dump.
131 : : */
132 : :
133 : : extern "C" void M2LangDump_CreateDumpDecl (const char *title_, unsigned int _title_high);
134 : :
135 : : /*
136 : : CloseDumpDecl - close the dump output file.
137 : : */
138 : :
139 : : extern "C" void M2LangDump_CloseDumpDecl (void);
140 : :
141 : : /*
142 : : Assert - call InternalError is NOT value.
143 : : */
144 : :
145 : : static void Assert (bool value);
146 : :
147 : : /*
148 : : DumpWrite - writes a single ch to the dump output.
149 : : */
150 : :
151 : : static void DumpWrite (char ch);
152 : :
153 : : /*
154 : : CloseDump - close the dump file and pop the default write procedure.
155 : : */
156 : :
157 : : static void CloseDump (void);
158 : :
159 : : /*
160 : : OpenDump - open filename as a dump file. The filename '-' is treated as stdout.
161 : : It pushes a write procedure to StdIO.
162 : : */
163 : :
164 : : static void OpenDump (DynamicStrings_String filename, unsigned int no);
165 : :
166 : : /*
167 : : AddRuleTextDump - filter on the textual name given to GCC.
168 : : */
169 : :
170 : : static void AddRuleTextDump (DynamicStrings_String rule);
171 : :
172 : : /*
173 : : AddRuleScopeQualidentDump -
174 : : */
175 : :
176 : : static void AddRuleScopeQualidentDump (DynamicStrings_String rule, int dot, unsigned int modsym);
177 : :
178 : : /*
179 : : AddRuleScopeDump -
180 : : */
181 : :
182 : : static void AddRuleScopeDump (DynamicStrings_String rule);
183 : :
184 : : /*
185 : : GenQualidentSymString - returns the qualified sym string (including
186 : : any nested procedure and modules).
187 : : */
188 : :
189 : : static DynamicStrings_String GenQualidentSymString (unsigned int sym);
190 : :
191 : : /*
192 : : IdentQualidentMatch - return TRUE if sym name matches symstr.
193 : : */
194 : :
195 : : static bool IdentQualidentMatch (unsigned int sym, DynamicStrings_String symstr);
196 : :
197 : : /*
198 : : IsRuleFilenameMatch - return TRUE if rule matches sym.
199 : : */
200 : :
201 : : static bool IsRuleFilenameMatch (DynamicStrings_String rule, unsigned int sym);
202 : :
203 : : /*
204 : : CheckRuleMatch - issue a warning if seenMatch is FALSE and this is the first time
205 : : the rule is matched.
206 : : */
207 : :
208 : : static void CheckRuleMatch (bool seenMatch, DynamicStrings_String rule);
209 : :
210 : : /*
211 : : AddRuleFilenameDump -
212 : : */
213 : :
214 : : static void AddRuleFilenameDump (DynamicStrings_String rule);
215 : :
216 : : /*
217 : : AddRuleSymToDump - call appropriate sub rule. FileName if : present.
218 : : Scope if . present otherwise assume a text rule.
219 : : */
220 : :
221 : : static void AddRuleSymToDump (DynamicStrings_String rule);
222 : :
223 : : /*
224 : : AddFilterListToDumpWatch -
225 : : */
226 : :
227 : : static void AddFilterListToDumpWatch (void * filter);
228 : :
229 : : /*
230 : : CreateDumpTitle - creates the underlined title.
231 : : */
232 : :
233 : : static void CreateDumpTitle (const char *title_, unsigned int _title_high);
234 : :
235 : : /*
236 : : Match - return TRUE if sym matches any of the filter rules.
237 : : */
238 : :
239 : : static bool Match (void * filter, unsigned int sym);
240 : :
241 : : /*
242 : : MatchRule - return TRUE if rule matches sym.
243 : : */
244 : :
245 : : static bool MatchRule (DynamicStrings_String rule, unsigned int sym);
246 : :
247 : : /*
248 : : MatchRuleFilenameScope - returns TRUE if rule contains filename.ext:qualident
249 : : and it matches sym.
250 : : */
251 : :
252 : : static bool MatchRuleFilenameScope (DynamicStrings_String rule, unsigned int sym);
253 : :
254 : : /*
255 : : MatchRuleScope - returns TRUE if rule contains a [libname.]qualified.ident
256 : : and it matches sym.
257 : : */
258 : :
259 : : static bool MatchRuleScope (DynamicStrings_String rule, unsigned int sym);
260 : :
261 : : /*
262 : : MatchRuleQualident - returns TRUE if rule matches qualified sym.
263 : : PostCondition: subrule will be deallocated upon exit.
264 : : TRUE is returned if rule matches qualified sym.
265 : : */
266 : :
267 : : static bool MatchRuleQualident (DynamicStrings_String rule, DynamicStrings_String subrule, int i, unsigned int sym);
268 : :
269 : : /*
270 : : QualifiedScope - PostCondition: true is returned is rule matches a qualified sym.
271 : : i is -1 if no more qualifications or libname is found.
272 : : scope will be the set to the last outer scope seen.
273 : : */
274 : :
275 : : static bool QualifiedScope (DynamicStrings_String rule, unsigned int sym, int *i, unsigned int *scope);
276 : :
277 : : /*
278 : : OptionalLibname - returns TRUE if rule[0..dot] matches syms libname or
279 : : if there is no libname the scope is a module or defimp
280 : : symbol.
281 : : */
282 : :
283 : : static bool OptionalLibname (DynamicStrings_String rule, unsigned int sym, int dot, unsigned int scope);
284 : :
285 : : /*
286 : : MatchRuleIdent - return TRUE if ident sym matches rule.
287 : : The ident must be in a module or defimp scope.
288 : : */
289 : :
290 : : static bool MatchRuleIdent (DynamicStrings_String rule, unsigned int sym);
291 : :
292 : : /*
293 : : MatchRuleText - returns TRUE if rule matches sym.
294 : : */
295 : :
296 : : static bool MatchRuleText (DynamicStrings_String rule, unsigned int sym);
297 : :
298 : : /*
299 : : TextCompareName - return TRUE if rule matches name.
300 : : */
301 : :
302 : : static bool TextCompareName (DynamicStrings_String rule, NameKey_Name name);
303 : :
304 : : /*
305 : : TextMatch - returns TRUE if rule matches text. Currently this
306 : : is a simple string compare, but could be extended
307 : : to implement regexp (seen in the rule).
308 : : */
309 : :
310 : : static bool TextMatch (DynamicStrings_String rule, DynamicStrings_String text);
311 : :
312 : : /*
313 : : CreateTemplate - create and return a template filename with extension.
314 : : If the user has specified "-" then "-" is returned otherwise
315 : : a template is formed from "dumpdir + filename + .%03dl.extension".
316 : : */
317 : :
318 : : static DynamicStrings_String CreateTemplate (DynamicStrings_String filename, DynamicStrings_String extension);
319 : :
320 : : /*
321 : : MakeDeclTemplate - return a template for the decl dump file.
322 : : */
323 : :
324 : : static DynamicStrings_String MakeDeclTemplate (void);
325 : :
326 : : /*
327 : : Init - initialize the module global variables.
328 : : */
329 : :
330 : : static void Init (void);
331 : :
332 : :
333 : : /*
334 : : Assert - call InternalError is NOT value.
335 : : */
336 : :
337 : 0 : static void Assert (bool value)
338 : : {
339 : 0 : if (! value)
340 : : {
341 : 0 : M2Error_InternalError ((const char *) "assert failed in M2LangDump", 27);
342 : : }
343 : 0 : }
344 : :
345 : :
346 : : /*
347 : : DumpWrite - writes a single ch to the dump output.
348 : : */
349 : :
350 : 0 : static void DumpWrite (char ch)
351 : : {
352 : 0 : FIO_WriteChar (outputFile, ch);
353 : 0 : }
354 : :
355 : :
356 : : /*
357 : : CloseDump - close the dump file and pop the default write procedure.
358 : : */
359 : :
360 : 0 : static void CloseDump (void)
361 : : {
362 : 0 : if (mustClose)
363 : : {
364 : 0 : FIO_Close (outputFile);
365 : 0 : mustClose = false;
366 : : }
367 : : else
368 : : {
369 : 0 : FIO_FlushBuffer (outputFile);
370 : : }
371 : 0 : StdIO_PopOutput ();
372 : 0 : outputFile = FIO_StdOut;
373 : 0 : }
374 : :
375 : :
376 : : /*
377 : : OpenDump - open filename as a dump file. The filename '-' is treated as stdout.
378 : : It pushes a write procedure to StdIO.
379 : : */
380 : :
381 : 0 : static void OpenDump (DynamicStrings_String filename, unsigned int no)
382 : : {
383 : 0 : if (DynamicStrings_EqualArray (filename, (const char *) "-", 1))
384 : : {
385 : 0 : mustClose = false;
386 : 0 : outputFile = FIO_StdOut;
387 : : }
388 : : else
389 : : {
390 : 0 : filename = FormatStrings_Sprintf1 (filename, (const unsigned char *) &no, (sizeof (no)-1));
391 : 0 : outputFile = SFIO_OpenToWrite (filename);
392 : 0 : mustClose = FIO_IsNoError (outputFile);
393 : : }
394 : 0 : filename = DynamicStrings_KillString (filename);
395 : 0 : StdIO_PushOutput ((StdIO_ProcWrite) {(StdIO_ProcWrite_t) DumpWrite});
396 : 0 : }
397 : :
398 : :
399 : : /*
400 : : AddRuleTextDump - filter on the textual name given to GCC.
401 : : */
402 : :
403 : 0 : static void AddRuleTextDump (DynamicStrings_String rule)
404 : : {
405 : 0 : unsigned int sym;
406 : 0 : NameKey_Name key;
407 : 0 : bool seenMatch;
408 : :
409 : 0 : sym = 1;
410 : 0 : seenMatch = false;
411 : 0 : key = NameKey_makekey (DynamicStrings_string (rule));
412 : 0 : while (sym <= (SymbolTable_FinalSymbol ()))
413 : : {
414 : 0 : if ((SymbolTable_IsProcedure (sym)) && (key == (M2AsmUtil_GetFullSymName (sym))))
415 : : {
416 : 0 : M2GCCDeclare_IncludeDumpSymbol (sym);
417 : 0 : seenMatch = true;
418 : : }
419 : 0 : sym += 1;
420 : : }
421 : 0 : CheckRuleMatch (seenMatch, rule);
422 : 0 : }
423 : :
424 : :
425 : : /*
426 : : AddRuleScopeQualidentDump -
427 : : */
428 : :
429 : 0 : static void AddRuleScopeQualidentDump (DynamicStrings_String rule, int dot, unsigned int modsym)
430 : : {
431 : 0 : DynamicStrings_String modstr;
432 : 0 : DynamicStrings_String idstr;
433 : 0 : int start;
434 : 0 : unsigned int sym;
435 : :
436 : 0 : start = dot+1;
437 : 0 : dot = DynamicStrings_Index (rule, '.', static_cast<unsigned int> (start));
438 : 0 : while (dot > 0)
439 : : {
440 : 0 : modstr = DynamicStrings_Slice (rule, start, dot);
441 : 0 : modsym = SymbolTable_GetLocalSym (modsym, NameKey_makekey (DynamicStrings_string (modstr)));
442 : 0 : if ((modsym != SymbolTable_NulSym) && (SymbolTable_IsModule (modsym)))
443 : : {
444 : 0 : start = dot+1;
445 : 0 : dot = DynamicStrings_Index (rule, '.', static_cast<unsigned int> (start));
446 : : }
447 : : else
448 : : {
449 : 0 : modstr = DynamicStrings_KillString (modstr);
450 : 0 : return;
451 : : }
452 : : }
453 : 0 : idstr = DynamicStrings_Slice (rule, start, 0);
454 : 0 : sym = SymbolTable_GetLocalSym (modsym, NameKey_makekey (DynamicStrings_string (idstr)));
455 : 0 : if (sym == SymbolTable_NulSym)
456 : : {
457 : 0 : CheckRuleMatch (false, rule);
458 : : }
459 : : else
460 : : {
461 : 0 : M2GCCDeclare_IncludeDumpSymbol (sym);
462 : : }
463 : : }
464 : :
465 : :
466 : : /*
467 : : AddRuleScopeDump -
468 : : */
469 : :
470 : 0 : static void AddRuleScopeDump (DynamicStrings_String rule)
471 : : {
472 : 0 : unsigned int modsym;
473 : 0 : DynamicStrings_String libstr;
474 : 0 : DynamicStrings_String modstr;
475 : 0 : int start;
476 : 0 : int dot;
477 : :
478 : 0 : dot = DynamicStrings_Index (rule, '.', 0);
479 : 0 : Assert (dot != -1);
480 : 0 : libstr = static_cast<DynamicStrings_String> (NULL);
481 : 0 : modstr = DynamicStrings_Slice (rule, 0, dot);
482 : 0 : modsym = M2Batch_Get (NameKey_makekey (DynamicStrings_string (modstr)));
483 : 0 : if (modsym == SymbolTable_NulSym)
484 : : {
485 : : /* avoid dangling else. */
486 : 0 : libstr = modstr;
487 : 0 : start = dot+1;
488 : 0 : dot = DynamicStrings_Index (rule, '.', static_cast<unsigned int> (start));
489 : 0 : if (dot > 0)
490 : : {
491 : 0 : modstr = DynamicStrings_Slice (rule, start, dot);
492 : 0 : modsym = M2Batch_Get (NameKey_makekey (DynamicStrings_string (modstr)));
493 : 0 : if ((modsym != SymbolTable_NulSym) && ((NameKey_makekey (DynamicStrings_string (libstr))) == (SymbolTable_GetLibName (modsym))))
494 : : {
495 : 0 : AddRuleScopeQualidentDump (rule, dot, modsym);
496 : : }
497 : : }
498 : : }
499 : : else
500 : : {
501 : 0 : AddRuleScopeQualidentDump (rule, dot, modsym);
502 : : }
503 : 0 : }
504 : :
505 : :
506 : : /*
507 : : GenQualidentSymString - returns the qualified sym string (including
508 : : any nested procedure and modules).
509 : : */
510 : :
511 : 0 : static DynamicStrings_String GenQualidentSymString (unsigned int sym)
512 : : {
513 : 0 : DynamicStrings_String identstr;
514 : 0 : DynamicStrings_String qualidentstr;
515 : :
516 : 0 : qualidentstr = DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (sym)));
517 : 0 : while ((SymbolTable_GetScope (sym)) != SymbolTable_NulSym)
518 : : {
519 : 0 : sym = SymbolTable_GetScope (sym);
520 : 0 : identstr = DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (sym)));
521 : 0 : identstr = DynamicStrings_ConCatChar (identstr, '.');
522 : 0 : qualidentstr = DynamicStrings_ConCat (identstr, DynamicStrings_Mark (qualidentstr));
523 : : }
524 : 0 : return qualidentstr;
525 : : /* static analysis guarentees a RETURN statement will be used before here. */
526 : : __builtin_unreachable ();
527 : : }
528 : :
529 : :
530 : : /*
531 : : IdentQualidentMatch - return TRUE if sym name matches symstr.
532 : : */
533 : :
534 : 0 : static bool IdentQualidentMatch (unsigned int sym, DynamicStrings_String symstr)
535 : : {
536 : 0 : bool success;
537 : 0 : DynamicStrings_String qualidentstr;
538 : :
539 : 0 : qualidentstr = GenQualidentSymString (sym);
540 : 0 : success = DynamicStrings_Equal (qualidentstr, symstr);
541 : 0 : qualidentstr = DynamicStrings_KillString (qualidentstr);
542 : 0 : return success;
543 : : /* static analysis guarentees a RETURN statement will be used before here. */
544 : : __builtin_unreachable ();
545 : : }
546 : :
547 : :
548 : : /*
549 : : IsRuleFilenameMatch - return TRUE if rule matches sym.
550 : : */
551 : :
552 : 0 : static bool IsRuleFilenameMatch (DynamicStrings_String rule, unsigned int sym)
553 : : {
554 : 0 : DynamicStrings_String fname;
555 : 0 : DynamicStrings_String modstr;
556 : 0 : DynamicStrings_String symstr;
557 : 0 : DynamicStrings_String filename;
558 : 0 : unsigned int tokenno;
559 : 0 : int dot;
560 : 0 : int colon;
561 : 0 : bool success;
562 : :
563 : 0 : tokenno = SymbolTable_GetDeclaredMod (sym);
564 : 0 : filename = M2LexBuf_FindFileNameFromToken (tokenno, 0);
565 : 0 : fname = static_cast<DynamicStrings_String> (NULL);
566 : 0 : symstr = static_cast<DynamicStrings_String> (NULL);
567 : 0 : modstr = static_cast<DynamicStrings_String> (NULL);
568 : 0 : success = false;
569 : 0 : colon = DynamicStrings_Index (rule, ':', 0);
570 : 0 : if (colon > 0)
571 : : {
572 : 0 : fname = DynamicStrings_Slice (rule, 0, colon);
573 : 0 : if (DynamicStrings_Equal (fname, filename))
574 : : {
575 : 0 : if (((int ) (DynamicStrings_Length (rule))) > colon)
576 : : {
577 : 0 : symstr = DynamicStrings_Slice (rule, colon+1, 0);
578 : 0 : dot = DynamicStrings_ReverseIndex (symstr, '.', -1);
579 : 0 : if (dot >= 0)
580 : : {
581 : 0 : success = IdentQualidentMatch (sym, symstr);
582 : : }
583 : : else
584 : : {
585 : 0 : success = (SymbolTable_GetSymName (sym)) == (NameKey_makekey (DynamicStrings_string (symstr)));
586 : : }
587 : : }
588 : : }
589 : : }
590 : 0 : fname = DynamicStrings_KillString (fname);
591 : 0 : modstr = DynamicStrings_KillString (modstr);
592 : 0 : symstr = DynamicStrings_KillString (symstr);
593 : 0 : return success;
594 : : /* static analysis guarentees a RETURN statement will be used before here. */
595 : : __builtin_unreachable ();
596 : : }
597 : :
598 : :
599 : : /*
600 : : CheckRuleMatch - issue a warning if seenMatch is FALSE and this is the first time
601 : : the rule is matched.
602 : : */
603 : :
604 : 0 : static void CheckRuleMatch (bool seenMatch, DynamicStrings_String rule)
605 : : {
606 : 0 : DynamicStrings_String message;
607 : :
608 : 0 : if ((NoOfDeclDumps == 1) && ! seenMatch)
609 : : {
610 : 0 : message = DynamicStrings_InitString ((const char *) "no symbol matching: %qs has been found when applying the dump filter", 68);
611 : 0 : m2misc_warning_m2_dump_filter (DynamicStrings_string (message), DynamicStrings_string (rule));
612 : : }
613 : 0 : }
614 : :
615 : :
616 : : /*
617 : : AddRuleFilenameDump -
618 : : */
619 : :
620 : 0 : static void AddRuleFilenameDump (DynamicStrings_String rule)
621 : : {
622 : 0 : unsigned int sym;
623 : 0 : bool seenMatch;
624 : :
625 : 0 : sym = 1;
626 : 0 : seenMatch = false;
627 : 0 : while (sym <= (SymbolTable_FinalSymbol ()))
628 : : {
629 : 0 : if ((SymbolTable_IsProcedure (sym)) && (IsRuleFilenameMatch (rule, sym)))
630 : : {
631 : 0 : M2GCCDeclare_IncludeDumpSymbol (sym);
632 : 0 : seenMatch = true;
633 : : }
634 : 0 : sym += 1;
635 : : }
636 : 0 : CheckRuleMatch (seenMatch, rule);
637 : 0 : }
638 : :
639 : :
640 : : /*
641 : : AddRuleSymToDump - call appropriate sub rule. FileName if : present.
642 : : Scope if . present otherwise assume a text rule.
643 : : */
644 : :
645 : 0 : static void AddRuleSymToDump (DynamicStrings_String rule)
646 : : {
647 : 0 : if ((DynamicStrings_Index (rule, ':', 0)) != -1)
648 : : {
649 : : /* Filename and scope rule. */
650 : 0 : AddRuleFilenameDump (rule);
651 : : }
652 : 0 : else if ((DynamicStrings_Index (rule, '.', 0)) != -1)
653 : : {
654 : : /* avoid dangling else. */
655 : : /* Modula-2 scoping tests. */
656 : 0 : AddRuleScopeDump (rule);
657 : : }
658 : : else
659 : : {
660 : : /* avoid dangling else. */
661 : : /* Text decl tests. */
662 : 0 : AddRuleTextDump (rule);
663 : : }
664 : 0 : }
665 : :
666 : :
667 : : /*
668 : : AddFilterListToDumpWatch -
669 : : */
670 : :
671 : 0 : static void AddFilterListToDumpWatch (void * filter)
672 : : {
673 : 0 : DynamicStrings_String rule;
674 : 0 : DynamicStrings_String full;
675 : 0 : int start;
676 : 0 : int i;
677 : :
678 : 0 : full = DynamicStrings_InitStringCharStar (filter);
679 : 0 : start = 0;
680 : 0 : do {
681 : 0 : i = DynamicStrings_Index (full, ',', static_cast<unsigned int> (start));
682 : 0 : if (i == -1)
683 : : {
684 : 0 : rule = DynamicStrings_Slice (full, start, 0);
685 : : }
686 : : else
687 : : {
688 : 0 : rule = DynamicStrings_Slice (full, start, i);
689 : : }
690 : 0 : AddRuleSymToDump (rule);
691 : 0 : rule = DynamicStrings_KillString (rule);
692 : 0 : start = i+1;
693 : 0 : } while (! (i == -1));
694 : 0 : full = DynamicStrings_KillString (full);
695 : 0 : }
696 : :
697 : :
698 : : /*
699 : : CreateDumpTitle - creates the underlined title.
700 : : */
701 : :
702 : 0 : static void CreateDumpTitle (const char *title_, unsigned int _title_high)
703 : : {
704 : 0 : unsigned int len;
705 : 0 : unsigned int text;
706 : 0 : unsigned int i;
707 : 0 : DynamicStrings_String s;
708 : 0 : char title[_title_high+1];
709 : :
710 : : /* make a local copy of each unbounded array. */
711 : 0 : memcpy (title, title_, _title_high+1);
712 : :
713 : 0 : s = FormatStrings_Sprintf0 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) title, _title_high)));
714 : 0 : s = DynamicStrings_KillString (SFIO_WriteS (M2LangDump_GetDumpFile (), s));
715 : 0 : len = StrLib_StrLen ((const char *) title, _title_high);
716 : 0 : i = 0;
717 : 0 : text = 0;
718 : 0 : while (i < len)
719 : : {
720 : 0 : if (title[i] == '\\')
721 : : {
722 : 0 : i += 2;
723 : : }
724 : : else
725 : : {
726 : 0 : i += 1;
727 : 0 : text += 1;
728 : : }
729 : : }
730 : 0 : s = DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "=", 1)), text);
731 : 0 : s = DynamicStrings_KillString (SFIO_WriteS (M2LangDump_GetDumpFile (), s));
732 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "\\n", 2);
733 : 0 : }
734 : :
735 : :
736 : : /*
737 : : Match - return TRUE if sym matches any of the filter rules.
738 : : */
739 : :
740 : 0 : static bool Match (void * filter, unsigned int sym)
741 : : {
742 : 0 : bool result;
743 : 0 : DynamicStrings_String rule;
744 : 0 : DynamicStrings_String full;
745 : 0 : int start;
746 : 0 : int i;
747 : :
748 : 0 : full = DynamicStrings_InitStringCharStar (filter);
749 : 0 : start = 0;
750 : 0 : do {
751 : 0 : i = DynamicStrings_Index (full, ',', static_cast<unsigned int> (start));
752 : 0 : if (i == -1)
753 : : {
754 : 0 : rule = DynamicStrings_Slice (full, start, 0);
755 : : }
756 : : else
757 : : {
758 : 0 : rule = DynamicStrings_Slice (full, start, i);
759 : : }
760 : 0 : result = MatchRule (rule, sym);
761 : 0 : rule = DynamicStrings_KillString (rule);
762 : 0 : if (result)
763 : : {
764 : 0 : full = DynamicStrings_KillString (full);
765 : 0 : return true;
766 : : }
767 : 0 : start = i+1;
768 : 0 : } while (! (i == -1));
769 : 0 : full = DynamicStrings_KillString (full);
770 : 0 : return false;
771 : : /* static analysis guarentees a RETURN statement will be used before here. */
772 : : __builtin_unreachable ();
773 : : }
774 : :
775 : :
776 : : /*
777 : : MatchRule - return TRUE if rule matches sym.
778 : : */
779 : :
780 : 0 : static bool MatchRule (DynamicStrings_String rule, unsigned int sym)
781 : : {
782 : 0 : if ((DynamicStrings_Index (rule, ':', 0)) != -1)
783 : : {
784 : : /* Filename and scope qualification tests. */
785 : 0 : return MatchRuleFilenameScope (rule, sym);
786 : : }
787 : 0 : else if ((DynamicStrings_Index (rule, '.', 0)) != -1)
788 : : {
789 : : /* avoid dangling else. */
790 : : /* Modula-2 scoping tests. */
791 : 0 : return MatchRuleScope (rule, sym);
792 : : }
793 : : else
794 : : {
795 : : /* avoid dangling else. */
796 : : /* Text decl tests. */
797 : 0 : return MatchRuleText (rule, sym);
798 : : }
799 : : /* static analysis guarentees a RETURN statement will be used before here. */
800 : : __builtin_unreachable ();
801 : : }
802 : :
803 : :
804 : : /*
805 : : MatchRuleFilenameScope - returns TRUE if rule contains filename.ext:qualident
806 : : and it matches sym.
807 : : */
808 : :
809 : 0 : static bool MatchRuleFilenameScope (DynamicStrings_String rule, unsigned int sym)
810 : : {
811 : 0 : DynamicStrings_String rulefile;
812 : 0 : DynamicStrings_String symfile;
813 : 0 : DynamicStrings_String subrule;
814 : :
815 : 0 : rulefile = DynamicStrings_Slice (rule, 0, DynamicStrings_Index (rule, ':', 0));
816 : : /* Do not deallocate symfile. */
817 : 0 : symfile = M2LexBuf_FindFileNameFromToken (SymbolTable_GetDeclaredMod (sym), 0);
818 : 0 : if (TextMatch (rulefile, symfile))
819 : : {
820 : 0 : subrule = DynamicStrings_Slice (rule, (DynamicStrings_Index (rule, ':', 0))+1, 0);
821 : 0 : if (MatchRuleScope (subrule, sym))
822 : : {
823 : 0 : subrule = DynamicStrings_KillString (subrule);
824 : 0 : return true;
825 : : }
826 : : }
827 : 0 : rulefile = DynamicStrings_KillString (rulefile);
828 : 0 : return false;
829 : : /* static analysis guarentees a RETURN statement will be used before here. */
830 : : __builtin_unreachable ();
831 : : }
832 : :
833 : :
834 : : /*
835 : : MatchRuleScope - returns TRUE if rule contains a [libname.]qualified.ident
836 : : and it matches sym.
837 : : */
838 : :
839 : 0 : static bool MatchRuleScope (DynamicStrings_String rule, unsigned int sym)
840 : : {
841 : 0 : int i;
842 : 0 : NameKey_Name name;
843 : :
844 : 0 : if (Debugging)
845 : : {
846 : : name = SymbolTable_GetSymName (sym);
847 : : M2Printf_printf2 ((const char *) "MatchRuleScope (%s, %a)\\n", 25, (const unsigned char *) &rule, (sizeof (rule)-1), (const unsigned char *) &name, (sizeof (name)-1));
848 : : }
849 : : /* Compare qualident right to left. */
850 : 0 : i = DynamicStrings_RIndex (rule, '.', 0);
851 : 0 : if (i == -1)
852 : : {
853 : : /* No qualification, just the ident. */
854 : 0 : return MatchRuleIdent (rule, sym);
855 : : }
856 : : else
857 : : {
858 : 0 : return MatchRuleQualident (rule, DynamicStrings_Slice (rule, i+1, 0), i, sym);
859 : : }
860 : : /* static analysis guarentees a RETURN statement will be used before here. */
861 : : __builtin_unreachable ();
862 : : }
863 : :
864 : :
865 : : /*
866 : : MatchRuleQualident - returns TRUE if rule matches qualified sym.
867 : : PostCondition: subrule will be deallocated upon exit.
868 : : TRUE is returned if rule matches qualified sym.
869 : : */
870 : :
871 : 0 : static bool MatchRuleQualident (DynamicStrings_String rule, DynamicStrings_String subrule, int i, unsigned int sym)
872 : : {
873 : 0 : unsigned int scope;
874 : :
875 : 0 : if (TextCompareName (subrule, SymbolTable_GetSymName (sym)))
876 : : {
877 : 0 : if (! (QualifiedScope (rule, sym, &i, &scope)))
878 : : {
879 : : return false;
880 : : }
881 : 0 : if (OptionalLibname (rule, sym, i, scope))
882 : : {
883 : : return true;
884 : : }
885 : : }
886 : 0 : subrule = DynamicStrings_KillString (subrule);
887 : 0 : if (Debugging)
888 : : {
889 : : M2Printf_printf0 ((const char *) "MatchRuleQualident FALSE\\n", 26);
890 : : }
891 : 0 : return false;
892 : : /* static analysis guarentees a RETURN statement will be used before here. */
893 : : __builtin_unreachable ();
894 : : }
895 : :
896 : :
897 : : /*
898 : : QualifiedScope - PostCondition: true is returned is rule matches a qualified sym.
899 : : i is -1 if no more qualifications or libname is found.
900 : : scope will be the set to the last outer scope seen.
901 : : */
902 : :
903 : 0 : static bool QualifiedScope (DynamicStrings_String rule, unsigned int sym, int *i, unsigned int *scope)
904 : : {
905 : 0 : DynamicStrings_String subrule;
906 : 0 : int j;
907 : 0 : NameKey_Name name;
908 : :
909 : 0 : if (Debugging)
910 : : {
911 : : name = SymbolTable_GetSymName (sym);
912 : : M2Printf_printf2 ((const char *) "seen ident name, QualifiedScope (rule = %s, %a)\\n", 49, (const unsigned char *) &rule, (sizeof (rule)-1), (const unsigned char *) &name, (sizeof (name)-1));
913 : : }
914 : 0 : (*scope) = sym;
915 : 0 : subrule = static_cast<DynamicStrings_String> (NULL);
916 : 0 : do {
917 : 0 : j = (*i);
918 : 0 : (*scope) = SymbolTable_GetScope ((*scope));
919 : 0 : (*i) = DynamicStrings_ReverseIndex (rule, '.', j-1);
920 : 0 : if (Debugging)
921 : : {
922 : : M2Printf_printf2 ((const char *) " reverseindex (rule = %s, '.', j = %d)\\n", 40, (const unsigned char *) &rule, (sizeof (rule)-1), (const unsigned char *) &j, (sizeof (j)-1));
923 : : M2Printf_printf1 ((const char *) " returns i = %d\\n", 20, (const unsigned char *) &(*i), (sizeof ((*i))-1));
924 : : }
925 : 0 : if ((*scope) != SymbolTable_NulSym)
926 : : {
927 : 0 : subrule = DynamicStrings_KillString (subrule);
928 : 0 : subrule = DynamicStrings_Slice (rule, (*i)+1, j);
929 : 0 : if (Debugging)
930 : : {
931 : : name = SymbolTable_GetSymName ((*scope));
932 : : M2Printf_printf2 ((const char *) "QualifiedScope (subrule = %s, %a)\\n", 35, (const unsigned char *) &subrule, (sizeof (subrule)-1), (const unsigned char *) &name, (sizeof (name)-1));
933 : : }
934 : 0 : if (! (TextCompareName (subrule, SymbolTable_GetSymName ((*scope)))))
935 : : {
936 : 0 : subrule = DynamicStrings_KillString (subrule);
937 : 0 : if (Debugging)
938 : : {
939 : : M2Printf_printf0 ((const char *) "QualifiedScope FALSE\\n", 22);
940 : : }
941 : 0 : return false;
942 : : }
943 : : }
944 : 0 : } while (! ((((*i) <= 0) || (SymbolTable_IsDefImp ((*scope)))) || (SymbolTable_IsModule ((*scope)))));
945 : 0 : subrule = DynamicStrings_KillString (subrule);
946 : 0 : return true;
947 : : /* static analysis guarentees a RETURN statement will be used before here. */
948 : : __builtin_unreachable ();
949 : : }
950 : :
951 : :
952 : : /*
953 : : OptionalLibname - returns TRUE if rule[0..dot] matches syms libname or
954 : : if there is no libname the scope is a module or defimp
955 : : symbol.
956 : : */
957 : :
958 : 0 : static bool OptionalLibname (DynamicStrings_String rule, unsigned int sym, int dot, unsigned int scope)
959 : : {
960 : 0 : DynamicStrings_String subrule;
961 : :
962 : 0 : if (dot > 0)
963 : : {
964 : : /* Check for optional libname. */
965 : 0 : subrule = DynamicStrings_Slice (rule, 0, dot);
966 : 0 : if (Debugging)
967 : : {
968 : : M2Printf_printf2 ((const char *) "checking for optional libname (subrule = %s, '.', dot = %d)\\n", 61, (const unsigned char *) &rule, (sizeof (rule)-1), (const unsigned char *) &dot, (sizeof (dot)-1));
969 : : }
970 : 0 : if (TextCompareName (subrule, SymbolTable_GetLibName (SymbolTable_GetModuleScope (sym))))
971 : : {
972 : 0 : subrule = DynamicStrings_KillString (subrule);
973 : 0 : if (Debugging)
974 : : {
975 : : M2Printf_printf0 ((const char *) "OptionalLibname TRUE\\n", 22);
976 : : }
977 : 0 : return true;
978 : : }
979 : 0 : subrule = DynamicStrings_KillString (subrule);
980 : : }
981 : 0 : else if ((scope != SymbolTable_NulSym) && ((SymbolTable_IsModule (scope)) || (SymbolTable_IsDefImp (scope))))
982 : : {
983 : : /* avoid dangling else. */
984 : 0 : if (Debugging)
985 : : {
986 : : M2Printf_printf0 ((const char *) "OptionalLibname TRUE\\n", 22);
987 : : }
988 : 0 : return true;
989 : : }
990 : : return false;
991 : : /* static analysis guarentees a RETURN statement will be used before here. */
992 : : __builtin_unreachable ();
993 : : }
994 : :
995 : :
996 : : /*
997 : : MatchRuleIdent - return TRUE if ident sym matches rule.
998 : : The ident must be in a module or defimp scope.
999 : : */
1000 : :
1001 : 0 : static bool MatchRuleIdent (DynamicStrings_String rule, unsigned int sym)
1002 : : {
1003 : 0 : unsigned int scope;
1004 : :
1005 : 0 : if (TextCompareName (rule, SymbolTable_GetSymName (sym)))
1006 : : {
1007 : 0 : scope = SymbolTable_GetScope (sym);
1008 : 0 : return (SymbolTable_IsModule (scope)) || (SymbolTable_IsDefImp (scope));
1009 : : }
1010 : : return false;
1011 : : /* static analysis guarentees a RETURN statement will be used before here. */
1012 : : __builtin_unreachable ();
1013 : : }
1014 : :
1015 : :
1016 : : /*
1017 : : MatchRuleText - returns TRUE if rule matches sym.
1018 : : */
1019 : :
1020 : 0 : static bool MatchRuleText (DynamicStrings_String rule, unsigned int sym)
1021 : : {
1022 : 0 : return TextCompareName (rule, M2AsmUtil_GetFullScopeAsmName (sym));
1023 : : /* static analysis guarentees a RETURN statement will be used before here. */
1024 : : __builtin_unreachable ();
1025 : : }
1026 : :
1027 : :
1028 : : /*
1029 : : TextCompareName - return TRUE if rule matches name.
1030 : : */
1031 : :
1032 : 0 : static bool TextCompareName (DynamicStrings_String rule, NameKey_Name name)
1033 : : {
1034 : 0 : bool result;
1035 : 0 : DynamicStrings_String text;
1036 : :
1037 : 0 : text = DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (name));
1038 : 0 : result = TextMatch (rule, text);
1039 : 0 : text = DynamicStrings_KillString (text);
1040 : 0 : return result;
1041 : : /* static analysis guarentees a RETURN statement will be used before here. */
1042 : : __builtin_unreachable ();
1043 : : }
1044 : :
1045 : :
1046 : : /*
1047 : : TextMatch - returns TRUE if rule matches text. Currently this
1048 : : is a simple string compare, but could be extended
1049 : : to implement regexp (seen in the rule).
1050 : : */
1051 : :
1052 : 0 : static bool TextMatch (DynamicStrings_String rule, DynamicStrings_String text)
1053 : : {
1054 : 0 : if (Debugging)
1055 : : {
1056 : : M2Printf_printf2 ((const char *) "TextMatch (%s, %s)\\n", 20, (const unsigned char *) &rule, (sizeof (rule)-1), (const unsigned char *) &text, (sizeof (text)-1));
1057 : : }
1058 : 0 : return DynamicStrings_Equal (rule, text);
1059 : : /* static analysis guarentees a RETURN statement will be used before here. */
1060 : : __builtin_unreachable ();
1061 : : }
1062 : :
1063 : :
1064 : : /*
1065 : : CreateTemplate - create and return a template filename with extension.
1066 : : If the user has specified "-" then "-" is returned otherwise
1067 : : a template is formed from "dumpdir + filename + .%03dl.extension".
1068 : : */
1069 : :
1070 : 0 : static DynamicStrings_String CreateTemplate (DynamicStrings_String filename, DynamicStrings_String extension)
1071 : : {
1072 : 0 : if (filename == NULL)
1073 : : {
1074 : : /* User has not specified a file. */
1075 : 0 : if ((M2Options_GetDumpDir ()) == NULL)
1076 : : {
1077 : 0 : filename = DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (SymbolTable_GetMainModule ())));
1078 : : }
1079 : : else
1080 : : {
1081 : 0 : filename = DynamicStrings_Dup (M2Options_GetDumpDir ());
1082 : 0 : filename = DynamicStrings_ConCat (filename, DynamicStrings_Mark (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (SymbolTable_GetMainModule ())))));
1083 : : }
1084 : 0 : filename = DynamicStrings_ConCat (filename, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".mod", 4)));
1085 : : }
1086 : : else
1087 : : {
1088 : : /* We need to duplicate the filename to create a new string before ConCat
1089 : : is used later on. */
1090 : 0 : filename = DynamicStrings_Dup (filename);
1091 : : }
1092 : 0 : if (! (DynamicStrings_EqualArray (filename, (const char *) "-", 1)))
1093 : : {
1094 : 0 : filename = DynamicStrings_ConCat (DynamicStrings_ConCat (filename, DynamicStrings_InitString ((const char *) ".%03dl.", 7)), extension);
1095 : : }
1096 : 0 : return filename;
1097 : : /* static analysis guarentees a RETURN statement will be used before here. */
1098 : : __builtin_unreachable ();
1099 : : }
1100 : :
1101 : :
1102 : : /*
1103 : : MakeDeclTemplate - return a template for the decl dump file.
1104 : : */
1105 : :
1106 : 0 : static DynamicStrings_String MakeDeclTemplate (void)
1107 : : {
1108 : 0 : return CreateTemplate (M2Options_GetDumpDeclFilename (), DynamicStrings_InitString ((const char *) "decl", 4));
1109 : : /* static analysis guarentees a RETURN statement will be used before here. */
1110 : : __builtin_unreachable ();
1111 : : }
1112 : :
1113 : :
1114 : : /*
1115 : : Init - initialize the module global variables.
1116 : : */
1117 : :
1118 : 15392 : static void Init (void)
1119 : : {
1120 : 15392 : NoOfQuadDumps = 0;
1121 : 15392 : NoOfDeclDumps = 0;
1122 : 15392 : declActive = false;
1123 : 15392 : quadActive = false;
1124 : 15392 : mustClose = false;
1125 : 15392 : outputFile = FIO_StdOut;
1126 : 0 : }
1127 : :
1128 : :
1129 : : /*
1130 : : IsDumpRequiredTree - return TRUE if the gcc tree should be dumped.
1131 : : */
1132 : :
1133 : 0 : extern "C" bool M2LangDump_IsDumpRequiredTree (tree gcctree, bool default_)
1134 : : {
1135 : 0 : unsigned int sym;
1136 : :
1137 : 0 : sym = SymbolConversion_Gcc2Mod (gcctree);
1138 : 0 : if (sym == SymbolTable_NulSym)
1139 : : {
1140 : : return default_;
1141 : : }
1142 : : else
1143 : : {
1144 : 0 : return M2LangDump_IsDumpRequired (sym, default_);
1145 : : }
1146 : : /* static analysis guarentees a RETURN statement will be used before here. */
1147 : : __builtin_unreachable ();
1148 : : }
1149 : :
1150 : :
1151 : : /*
1152 : : IsDumpRequired - return TRUE if symbol sym should be dumped
1153 : : according to the rules of the filter.
1154 : : No filter specified will always return default.
1155 : : The filter is a comma separated list. Each element
1156 : : of the list can specify a symbol three ways.
1157 : : Firstly by DECL name for example: m2pim_NumberIO_HexToStr
1158 : : Secondly by qualified scope: [pathname.]NumberIO.HexToStr
1159 : : Thirdly by filename and scope: NumberIO.mod:HexToStr
1160 : : */
1161 : :
1162 : 0 : extern "C" bool M2LangDump_IsDumpRequired (unsigned int sym, bool default_)
1163 : : {
1164 : 0 : DynamicStrings_String filter;
1165 : :
1166 : 0 : filter = static_cast<DynamicStrings_String> (M2Options_GetM2DumpFilter ());
1167 : 0 : if (filter == NULL)
1168 : : {
1169 : : return default_;
1170 : : }
1171 : : else
1172 : : {
1173 : 0 : return Match (reinterpret_cast <void *> (filter), sym);
1174 : : }
1175 : : /* static analysis guarentees a RETURN statement will be used before here. */
1176 : : __builtin_unreachable ();
1177 : : }
1178 : :
1179 : :
1180 : : /*
1181 : : MakeQuadTemplate - return a template for the quad dump file.
1182 : : */
1183 : :
1184 : 0 : extern "C" DynamicStrings_String M2LangDump_MakeQuadTemplate (void)
1185 : : {
1186 : 0 : return CreateTemplate (M2Options_GetDumpQuadFilename (), DynamicStrings_InitString ((const char *) "quad", 4));
1187 : : /* static analysis guarentees a RETURN statement will be used before here. */
1188 : : __builtin_unreachable ();
1189 : : }
1190 : :
1191 : :
1192 : : /*
1193 : : MakeGimpleTemplate - return a template for the gimple dump file and assign
1194 : : len to the max number of characters required to complete
1195 : : a template (including a nul terminator).
1196 : : */
1197 : :
1198 : 0 : extern "C" DynamicStrings_String M2LangDump_MakeGimpleTemplate (unsigned int *len)
1199 : : {
1200 : 0 : DynamicStrings_String filename;
1201 : :
1202 : 0 : filename = CreateTemplate (M2Options_GetDumpGimpleFilename (), DynamicStrings_InitString ((const char *) "gimple", 6));
1203 : 0 : (*len) = DynamicStrings_Length (filename); /* This is a short cut based on '%03d' format
1204 : : specifier used above. */
1205 : 0 : return filename; /* This is a short cut based on '%03d' format
1206 : : specifier used above. */
1207 : : /* static analysis guarentees a RETURN statement will be used before here. */
1208 : : __builtin_unreachable ();
1209 : : }
1210 : :
1211 : :
1212 : : /*
1213 : : GetDumpFile - return the dump output file.
1214 : : */
1215 : :
1216 : 0 : extern "C" FIO_File M2LangDump_GetDumpFile (void)
1217 : : {
1218 : 0 : return outputFile;
1219 : : /* static analysis guarentees a RETURN statement will be used before here. */
1220 : : __builtin_unreachable ();
1221 : : }
1222 : :
1223 : :
1224 : : /*
1225 : : CreateDumpQuad - create the dump file for a quad dump.
1226 : : */
1227 : :
1228 : 0 : extern "C" void M2LangDump_CreateDumpQuad (const char *title_, unsigned int _title_high)
1229 : : {
1230 : 0 : char title[_title_high+1];
1231 : :
1232 : : /* make a local copy of each unbounded array. */
1233 : 0 : memcpy (title, title_, _title_high+1);
1234 : :
1235 : 0 : Assert (! declActive);
1236 : 0 : Assert (! quadActive);
1237 : 0 : quadActive = true;
1238 : 0 : NoOfQuadDumps += 1;
1239 : 0 : OpenDump (M2LangDump_MakeQuadTemplate (), NoOfQuadDumps);
1240 : 0 : CreateDumpTitle ((const char *) title, _title_high);
1241 : 0 : }
1242 : :
1243 : :
1244 : : /*
1245 : : CloseDumpQuad - close the dump output file.
1246 : : */
1247 : :
1248 : 0 : extern "C" void M2LangDump_CloseDumpQuad (void)
1249 : : {
1250 : 0 : CloseDump ();
1251 : 0 : quadActive = false;
1252 : 0 : }
1253 : :
1254 : :
1255 : : /*
1256 : : CreateDumpDecl - create the dump file for a decl dump.
1257 : : */
1258 : :
1259 : 0 : extern "C" void M2LangDump_CreateDumpDecl (const char *title_, unsigned int _title_high)
1260 : : {
1261 : 0 : char title[_title_high+1];
1262 : :
1263 : : /* make a local copy of each unbounded array. */
1264 : 0 : memcpy (title, title_, _title_high+1);
1265 : :
1266 : 0 : if ((M2Options_GetM2DumpFilter ()) != NULL)
1267 : : {
1268 : 0 : Assert (! declActive);
1269 : 0 : Assert (! quadActive);
1270 : 0 : declActive = true;
1271 : 0 : NoOfDeclDumps += 1;
1272 : 0 : OpenDump (MakeDeclTemplate (), NoOfDeclDumps);
1273 : 0 : CreateDumpTitle ((const char *) title, _title_high);
1274 : 0 : AddFilterListToDumpWatch (M2Options_GetM2DumpFilter ());
1275 : : }
1276 : 0 : }
1277 : :
1278 : :
1279 : : /*
1280 : : CloseDumpDecl - close the dump output file.
1281 : : */
1282 : :
1283 : 0 : extern "C" void M2LangDump_CloseDumpDecl (void)
1284 : : {
1285 : 0 : if (declActive)
1286 : : {
1287 : 0 : CloseDump ();
1288 : 0 : declActive = false;
1289 : : }
1290 : 0 : }
1291 : :
1292 : 15392 : extern "C" void _M2_M2LangDump_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1293 : : {
1294 : 15392 : Init ();
1295 : 15392 : }
1296 : :
1297 : 0 : extern "C" void _M2_M2LangDump_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1298 : : {
1299 : 0 : }
|