]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/m2/mc-boot/Gkeyc.c
Update copyright years.
[thirdparty/gcc.git] / gcc / m2 / mc-boot / Gkeyc.c
CommitLineData
1eee94d3
GM
1/* do not edit automatically generated by mc from keyc. */
2/* keyc maintains the C name scope and avoids C/C++ name conflicts.
83ffe9cd 3 Copyright (C) 2016-2023 Free Software Foundation, Inc.
1eee94d3
GM
4
5This file is part of GNU Modula-2.
6
7GNU Modula-2 is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License along
18with gm2; see the file COPYING. If not, write to the Free Software
19Foundation, 51 Franklin Street, Fifth Floor,
20Boston, MA 02110-1301, USA. */
21
22#include "config.h"
23#include "system.h"
24# if !defined (PROC_D)
25# define PROC_D
26 typedef void (*PROC_t) (void);
27 typedef struct { PROC_t proc; } PROC;
28# endif
29
30# if !defined (TRUE)
31# define TRUE (1==1)
32# endif
33
34# if !defined (FALSE)
35# define FALSE (1==0)
36# endif
37
38# include "GStorage.h"
39# include "Gmcrts.h"
40#if defined(__cplusplus)
41# undef NULL
42# define NULL 0
43#endif
44#define _keyc_H
45#define _keyc_C
46
47# include "GmcPretty.h"
48# include "GStorage.h"
49# include "GDynamicStrings.h"
50# include "GsymbolKey.h"
51# include "GnameKey.h"
52# include "GmcOptions.h"
53# include "GM2RTS.h"
54
55#if !defined (decl_node_D)
56# define decl_node_D
57 typedef void *decl_node;
58#endif
59
60typedef struct keyc__T1_r keyc__T1;
61
62typedef keyc__T1 *keyc_scope;
63
64struct keyc__T1_r {
65 decl_node scoped;
66 symbolKey_symbolTree symbols;
67 keyc_scope next;
68 };
69
70static keyc_scope stack;
71static keyc_scope freeList;
72static symbolKey_symbolTree keywords;
73static symbolKey_symbolTree macros;
74static unsigned int initializedCP;
75static unsigned int initializedGCC;
76static unsigned int seenIntMin;
77static unsigned int seenUIntMin;
78static unsigned int seenLongMin;
79static unsigned int seenULongMin;
80static unsigned int seenCharMin;
81static unsigned int seenUCharMin;
82static unsigned int seenIntMax;
83static unsigned int seenUIntMax;
84static unsigned int seenLongMax;
85static unsigned int seenULongMax;
86static unsigned int seenCharMax;
87static unsigned int seenUCharMax;
88static unsigned int seenLabs;
89static unsigned int seenAbs;
90static unsigned int seenFabs;
91static unsigned int seenFabsl;
92static unsigned int seenSize_t;
93static unsigned int seenSSize_t;
94static unsigned int seenUnistd;
95static unsigned int seenSysTypes;
96static unsigned int seenThrow;
97static unsigned int seenFree;
98static unsigned int seenMalloc;
99static unsigned int seenStorage;
100static unsigned int seenProc;
101static unsigned int seenTrue;
102static unsigned int seenFalse;
103static unsigned int seenNull;
104static unsigned int seenMemcpy;
105static unsigned int seenException;
106static unsigned int seenComplex;
107static unsigned int seenM2RTS;
108static unsigned int seenStrlen;
109static unsigned int seenCtype;
110
111/*
112 useUnistd - need to use unistd.h call using open/close/read/write require this header.
113*/
114
115extern "C" void keyc_useUnistd (void);
116
117/*
118 useThrow - use the throw function.
119*/
120
121extern "C" void keyc_useThrow (void);
122
123/*
124 useStorage - indicate we have used storage.
125*/
126
127extern "C" void keyc_useStorage (void);
128
129/*
130 useFree - indicate we have used free.
131*/
132
133extern "C" void keyc_useFree (void);
134
135/*
136 useMalloc - indicate we have used malloc.
137*/
138
139extern "C" void keyc_useMalloc (void);
140
141/*
142 useProc - indicate we have used proc.
143*/
144
145extern "C" void keyc_useProc (void);
146
147/*
148 useTrue - indicate we have used TRUE.
149*/
150
151extern "C" void keyc_useTrue (void);
152
153/*
154 useFalse - indicate we have used FALSE.
155*/
156
157extern "C" void keyc_useFalse (void);
158
159/*
160 useNull - indicate we have used NULL.
161*/
162
163extern "C" void keyc_useNull (void);
164
165/*
166 useMemcpy - indicate we have used memcpy.
167*/
168
169extern "C" void keyc_useMemcpy (void);
170
171/*
172 useIntMin - indicate we have used INT_MIN.
173*/
174
175extern "C" void keyc_useIntMin (void);
176
177/*
178 useUIntMin - indicate we have used UINT_MIN.
179*/
180
181extern "C" void keyc_useUIntMin (void);
182
183/*
184 useLongMin - indicate we have used LONG_MIN.
185*/
186
187extern "C" void keyc_useLongMin (void);
188
189/*
190 useULongMin - indicate we have used ULONG_MIN.
191*/
192
193extern "C" void keyc_useULongMin (void);
194
195/*
196 useCharMin - indicate we have used CHAR_MIN.
197*/
198
199extern "C" void keyc_useCharMin (void);
200
201/*
202 useUCharMin - indicate we have used UCHAR_MIN.
203*/
204
205extern "C" void keyc_useUCharMin (void);
206
207/*
208 useIntMax - indicate we have used INT_MAX.
209*/
210
211extern "C" void keyc_useIntMax (void);
212
213/*
214 useUIntMax - indicate we have used UINT_MAX.
215*/
216
217extern "C" void keyc_useUIntMax (void);
218
219/*
220 useLongMax - indicate we have used LONG_MAX.
221*/
222
223extern "C" void keyc_useLongMax (void);
224
225/*
226 useULongMax - indicate we have used ULONG_MAX.
227*/
228
229extern "C" void keyc_useULongMax (void);
230
231/*
232 useCharMax - indicate we have used CHAR_MAX.
233*/
234
235extern "C" void keyc_useCharMax (void);
236
237/*
238 useUCharMax - indicate we have used UChar_MAX.
239*/
240
241extern "C" void keyc_useUCharMax (void);
242
243/*
244 useSize_t - indicate we have used size_t.
245*/
246
247extern "C" void keyc_useSize_t (void);
248
249/*
250 useSSize_t - indicate we have used ssize_t.
251*/
252
253extern "C" void keyc_useSSize_t (void);
254
255/*
256 useLabs - indicate we have used labs.
257*/
258
259extern "C" void keyc_useLabs (void);
260
261/*
262 useAbs - indicate we have used abs.
263*/
264
265extern "C" void keyc_useAbs (void);
266
267/*
268 useFabs - indicate we have used fabs.
269*/
270
271extern "C" void keyc_useFabs (void);
272
273/*
274 useFabsl - indicate we have used fabsl.
275*/
276
277extern "C" void keyc_useFabsl (void);
278
279/*
280 useException - use the exceptions module, mcrts.
281*/
282
283extern "C" void keyc_useException (void);
284
285/*
286 useComplex - use the complex data type.
287*/
288
289extern "C" void keyc_useComplex (void);
290
291/*
292 useM2RTS - indicate we have used M2RTS in the converted code.
293*/
294
295extern "C" void keyc_useM2RTS (void);
296
297/*
298 useStrlen - indicate we have used strlen in the converted code.
299*/
300
301extern "C" void keyc_useStrlen (void);
302
303/*
304 useCtype - indicate we have used the toupper function.
305*/
306
307extern "C" void keyc_useCtype (void);
308
309/*
310 genDefs - generate definitions or includes for all
311 macros and prototypes used.
312*/
313
314extern "C" void keyc_genDefs (mcPretty_pretty p);
315
316/*
317 genConfigSystem - generate include files for config.h and system.h
318 within the GCC framework.
319*/
320
321extern "C" void keyc_genConfigSystem (mcPretty_pretty p);
322
323/*
324 enterScope - enter a scope defined by, n.
325*/
326
327extern "C" void keyc_enterScope (decl_node n);
328
329/*
330 leaveScope - leave the scope defined by, n.
331*/
332
333extern "C" void keyc_leaveScope (decl_node n);
334
335/*
336 cname - attempts to declare a symbol with name, n, in the
337 current scope. If there is no conflict with the
338 target language then NIL is returned, otherwise
339 a mangled name is returned as a String.
340 If scopes is FALSE then only the keywords and
341 macros are detected for a clash (all scoping
342 is ignored).
343*/
344
345extern "C" DynamicStrings_String keyc_cname (nameKey_Name n, unsigned int scopes);
346
347/*
348 cnamen - attempts to declare a symbol with name, n, in the
349 current scope. If there is no conflict with the
350 target language then NIL is returned, otherwise
351 a mangled name is returned as a Name
352 If scopes is FALSE then only the keywords and
353 macros are detected for a clash (all scoping
354 is ignored).
355*/
356
357extern "C" nameKey_Name keyc_cnamen (nameKey_Name n, unsigned int scopes);
358
359/*
360 cp - include C++ keywords and standard declarations to avoid.
361*/
362
363extern "C" void keyc_cp (void);
364
365/*
366 checkGccConfigSystem - issues the GCC include config.h, include system.h
367 instead of the standard host include.
368*/
369
370static void checkGccConfigSystem (mcPretty_pretty p);
371
372/*
373 checkCtype -
374*/
375
376static void checkCtype (mcPretty_pretty p);
377
378/*
379 checkAbs - check to see if the abs family, size_t or ssize_t have been used.
380*/
381
382static void checkAbs (mcPretty_pretty p);
383
384/*
385 checkLimits -
386*/
387
388static void checkLimits (mcPretty_pretty p);
389
390/*
391 checkFreeMalloc -
392*/
393
394static void checkFreeMalloc (mcPretty_pretty p);
395
396/*
397 checkStorage -
398*/
399
400static void checkStorage (mcPretty_pretty p);
401
402/*
403 checkProc -
404*/
405
406static void checkProc (mcPretty_pretty p);
407
408/*
409 checkTrue -
410*/
411
412static void checkTrue (mcPretty_pretty p);
413
414/*
415 checkFalse -
416*/
417
418static void checkFalse (mcPretty_pretty p);
419
420/*
421 checkNull -
422*/
423
424static void checkNull (mcPretty_pretty p);
425
426/*
427 checkMemcpy -
428*/
429
430static void checkMemcpy (mcPretty_pretty p);
431
432/*
433 checkM2RTS -
434*/
435
436static void checkM2RTS (mcPretty_pretty p);
437
438/*
439 checkException - check to see if exceptions were used.
440*/
441
442static void checkException (mcPretty_pretty p);
443
444/*
445 checkThrow - check to see if the throw function is used.
446*/
447
448static void checkThrow (mcPretty_pretty p);
449
450/*
451 checkUnistd - check to see if the unistd.h header file is required.
452*/
453
454static void checkUnistd (mcPretty_pretty p);
455
456/*
457 checkComplex - check to see if the type complex was used.
458*/
459
460static void checkComplex (mcPretty_pretty p);
461
462/*
463 checkSysTypes - emit header for sys/types.h if necessary.
464*/
465
466static void checkSysTypes (mcPretty_pretty p);
467
468/*
469 fixNullPointerConst - fixup for NULL on some C++11 systems.
470*/
471
472static void fixNullPointerConst (mcPretty_pretty p);
473
474/*
475 new -
476*/
477
478static keyc_scope new_ (decl_node n);
479
480/*
481 mangle1 - returns TRUE if name is unique if we add _
482 to its end.
483*/
484
485static unsigned int mangle1 (nameKey_Name n, DynamicStrings_String *m, unsigned int scopes);
486
487/*
488 mangle2 - returns TRUE if name is unique if we prepend _
489 to, n.
490*/
491
492static unsigned int mangle2 (nameKey_Name n, DynamicStrings_String *m, unsigned int scopes);
493
494/*
495 mangleN - keep adding '_' to the end of n until it
496 no longer clashes.
497*/
498
499static unsigned int mangleN (nameKey_Name n, DynamicStrings_String *m, unsigned int scopes);
500
501/*
502 clash - returns TRUE if there is a clash with name, n,
503 in the current scope or C keywords or C macros.
504*/
505
506static unsigned int clash (nameKey_Name n, unsigned int scopes);
507
508/*
509 initCP - add the extra keywords and standard definitions used by C++.
510*/
511
512static void initCP (void);
513
514/*
515 add -
516*/
517
518static void add (symbolKey_symbolTree s, const char *a_, unsigned int _a_high);
519
520/*
521 initMacros - macros and library function names to avoid.
522*/
523
524static void initMacros (void);
525
526/*
527 initKeywords - keywords to avoid.
528*/
529
530static void initKeywords (void);
531
532/*
533 init -
534*/
535
536static void init (void);
537
538
539/*
540 checkGccConfigSystem - issues the GCC include config.h, include system.h
541 instead of the standard host include.
542*/
543
544static void checkGccConfigSystem (mcPretty_pretty p)
545{
546 if (mcOptions_getGccConfigSystem ())
547 {
548 if (! initializedGCC)
549 {
550 initializedGCC = TRUE;
551 mcPretty_print (p, (const char *) "#include \"config.h\"\\n", 21);
552 mcPretty_print (p, (const char *) "#include \"system.h\"\\n", 21);
553 }
554 }
555}
556
557
558/*
559 checkCtype -
560*/
561
562static void checkCtype (mcPretty_pretty p)
563{
564 if (seenCtype)
565 {
566 checkGccConfigSystem (p);
567 if (mcOptions_getGccConfigSystem ())
568 {
569 /* GCC header files use a safe variant. */
570 mcPretty_print (p, (const char *) "#include <safe-ctype.h>\\n", 25);
571 }
572 else
573 {
574 mcPretty_print (p, (const char *) "#include <ctype.h>\\n", 20);
575 }
576 }
577}
578
579
580/*
581 checkAbs - check to see if the abs family, size_t or ssize_t have been used.
582*/
583
584static void checkAbs (mcPretty_pretty p)
585{
586 if (((((seenLabs || seenAbs) || seenFabs) || seenFabsl) || seenSize_t) || seenSSize_t)
587 {
588 checkGccConfigSystem (p);
589 if (! (mcOptions_getGccConfigSystem ()))
590 {
591 mcPretty_print (p, (const char *) "#include <stdlib.h>\\n", 21);
592 }
593 }
594}
595
596
597/*
598 checkLimits -
599*/
600
601static void checkLimits (mcPretty_pretty p)
602{
603 if ((((((((((((((seenMemcpy || seenIntMin) || seenUIntMin) || seenLongMin) || seenULongMin) || seenCharMin) || seenUCharMin) || seenUIntMin) || seenIntMax) || seenUIntMax) || seenLongMax) || seenULongMax) || seenCharMax) || seenUCharMax) || seenUIntMax)
604 {
605 checkGccConfigSystem (p);
606 if (! (mcOptions_getGccConfigSystem ()))
607 {
608 mcPretty_print (p, (const char *) "#include <limits.h>\\n", 21);
609 }
610 }
611}
612
613
614/*
615 checkFreeMalloc -
616*/
617
618static void checkFreeMalloc (mcPretty_pretty p)
619{
620 if (seenFree || seenMalloc)
621 {
622 checkGccConfigSystem (p);
623 if (! (mcOptions_getGccConfigSystem ()))
624 {
625 mcPretty_print (p, (const char *) "#include <stdlib.h>\\n", 21);
626 }
627 }
628}
629
630
631/*
632 checkStorage -
633*/
634
635static void checkStorage (mcPretty_pretty p)
636{
637 if (seenStorage)
638 {
639 mcPretty_print (p, (const char *) "# include \"", 13);
640 mcPretty_prints (p, mcOptions_getHPrefix ());
641 mcPretty_print (p, (const char *) "Storage.h\"\\n", 12);
642 }
643}
644
645
646/*
647 checkProc -
648*/
649
650static void checkProc (mcPretty_pretty p)
651{
652 if (seenProc)
653 {
654 mcPretty_print (p, (const char *) "# if !defined (PROC_D)\\n", 26);
655 mcPretty_print (p, (const char *) "# define PROC_D\\n", 22);
656 mcPretty_print (p, (const char *) " typedef void (*PROC_t) (void);\\n", 39);
657 mcPretty_print (p, (const char *) " typedef struct { PROC_t proc; } PROC;\\n", 46);
658 mcPretty_print (p, (const char *) "# endif\\n\\n", 13);
659 }
660}
661
662
663/*
664 checkTrue -
665*/
666
667static void checkTrue (mcPretty_pretty p)
668{
669 if (seenTrue)
670 {
671 mcPretty_print (p, (const char *) "# if !defined (TRUE)\\n", 24);
672 mcPretty_print (p, (const char *) "# define TRUE (1==1)\\n", 27);
673 mcPretty_print (p, (const char *) "# endif\\n\\n", 13);
674 }
675}
676
677
678/*
679 checkFalse -
680*/
681
682static void checkFalse (mcPretty_pretty p)
683{
684 if (seenFalse)
685 {
686 mcPretty_print (p, (const char *) "# if !defined (FALSE)\\n", 25);
687 mcPretty_print (p, (const char *) "# define FALSE (1==0)\\n", 28);
688 mcPretty_print (p, (const char *) "# endif\\n\\n", 13);
689 }
690}
691
692
693/*
694 checkNull -
695*/
696
697static void checkNull (mcPretty_pretty p)
698{
699 if (seenNull)
700 {
701 checkGccConfigSystem (p);
702 if (! (mcOptions_getGccConfigSystem ()))
703 {
704 mcPretty_print (p, (const char *) "#include <stddef.h>\\n", 21);
705 }
706 }
707}
708
709
710/*
711 checkMemcpy -
712*/
713
714static void checkMemcpy (mcPretty_pretty p)
715{
716 if (seenMemcpy || seenStrlen)
717 {
718 checkGccConfigSystem (p);
719 if (! (mcOptions_getGccConfigSystem ()))
720 {
721 mcPretty_print (p, (const char *) "#include <string.h>\\n", 21);
722 }
723 }
724}
725
726
727/*
728 checkM2RTS -
729*/
730
731static void checkM2RTS (mcPretty_pretty p)
732{
733 if (seenM2RTS)
734 {
735 mcPretty_print (p, (const char *) "# include \"", 13);
736 mcPretty_prints (p, mcOptions_getHPrefix ());
737 mcPretty_print (p, (const char *) "M2RTS.h\"\\n", 10);
738 }
739}
740
741
742/*
743 checkException - check to see if exceptions were used.
744*/
745
746static void checkException (mcPretty_pretty p)
747{
748 if (seenException)
749 {
750 mcPretty_print (p, (const char *) "# include \"Gmcrts.h\"\\n", 24);
751 }
752}
753
754
755/*
756 checkThrow - check to see if the throw function is used.
757*/
758
759static void checkThrow (mcPretty_pretty p)
760{
761 if (seenThrow)
762 {
763 /* print (p, '# include "sys/cdefs.h"
764 ') ; */
765 mcPretty_print (p, (const char *) "#ifndef __cplusplus\\n", 21);
766 mcPretty_print (p, (const char *) "extern void throw (unsigned int);\\n", 35);
767 mcPretty_print (p, (const char *) "#endif\\n", 8);
768 }
769}
770
771
772/*
773 checkUnistd - check to see if the unistd.h header file is required.
774*/
775
776static void checkUnistd (mcPretty_pretty p)
777{
778 if (seenUnistd)
779 {
780 checkGccConfigSystem (p);
781 if (! (mcOptions_getGccConfigSystem ()))
782 {
783 mcPretty_print (p, (const char *) "#include <unistd.h>\\n", 21);
784 }
785 }
786}
787
788
789/*
790 checkComplex - check to see if the type complex was used.
791*/
792
793static void checkComplex (mcPretty_pretty p)
794{
795 if (seenComplex)
796 {
797 checkGccConfigSystem (p);
798 if (! (mcOptions_getGccConfigSystem ()))
799 {
800 mcPretty_print (p, (const char *) "# include <complex.h>\\n", 25);
801 }
802 }
803}
804
805
806/*
807 checkSysTypes - emit header for sys/types.h if necessary.
808*/
809
810static void checkSysTypes (mcPretty_pretty p)
811{
812 if (seenSysTypes)
813 {
814 checkGccConfigSystem (p);
815 if (! (mcOptions_getGccConfigSystem ()))
816 {
817 mcPretty_print (p, (const char *) "# include <sys/types.h>\\n", 27);
818 }
819 }
820}
821
822
823/*
824 fixNullPointerConst - fixup for NULL on some C++11 systems.
825*/
826
827static void fixNullPointerConst (mcPretty_pretty p)
828{
829 if (seenNull)
830 {
831 mcPretty_print (p, (const char *) "#if defined(__cplusplus)\\n", 26);
832 mcPretty_print (p, (const char *) "# undef NULL\\n", 16);
833 mcPretty_print (p, (const char *) "# define NULL 0\\n", 19);
834 mcPretty_print (p, (const char *) "#endif\\n", 8);
835 }
836}
837
838
839/*
840 new -
841*/
842
843static keyc_scope new_ (decl_node n)
844{
845 keyc_scope s;
846
847 if (freeList == NULL)
848 {
849 Storage_ALLOCATE ((void **) &s, sizeof (keyc__T1));
850 }
851 else
852 {
853 s = freeList;
854 freeList = freeList->next;
855 }
856 return s;
857 /* static analysis guarentees a RETURN statement will be used before here. */
858 __builtin_unreachable ();
859}
860
861
862/*
863 mangle1 - returns TRUE if name is unique if we add _
864 to its end.
865*/
866
867static unsigned int mangle1 (nameKey_Name n, DynamicStrings_String *m, unsigned int scopes)
868{
869 (*m) = DynamicStrings_KillString ((*m));
870 (*m) = DynamicStrings_InitStringCharStar (nameKey_keyToCharStar (n));
871 (*m) = DynamicStrings_ConCatChar ((*m), '_');
872 return ! (clash (nameKey_makekey (DynamicStrings_string ((*m))), scopes));
873 /* static analysis guarentees a RETURN statement will be used before here. */
874 __builtin_unreachable ();
875}
876
877
878/*
879 mangle2 - returns TRUE if name is unique if we prepend _
880 to, n.
881*/
882
883static unsigned int mangle2 (nameKey_Name n, DynamicStrings_String *m, unsigned int scopes)
884{
885 (*m) = DynamicStrings_KillString ((*m));
886 (*m) = DynamicStrings_InitStringCharStar (nameKey_keyToCharStar (n));
887 (*m) = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "_", 1), DynamicStrings_Mark ((*m)));
888 return ! (clash (nameKey_makekey (DynamicStrings_string ((*m))), scopes));
889 /* static analysis guarentees a RETURN statement will be used before here. */
890 __builtin_unreachable ();
891}
892
893
894/*
895 mangleN - keep adding '_' to the end of n until it
896 no longer clashes.
897*/
898
899static unsigned int mangleN (nameKey_Name n, DynamicStrings_String *m, unsigned int scopes)
900{
901 (*m) = DynamicStrings_KillString ((*m));
902 (*m) = DynamicStrings_InitStringCharStar (nameKey_keyToCharStar (n));
903 for (;;)
904 {
905 (*m) = DynamicStrings_ConCatChar ((*m), '_');
906 if (! (clash (nameKey_makekey (DynamicStrings_string ((*m))), scopes)))
907 {
908 return TRUE;
909 }
910 }
911 ReturnException ("../../gcc-git-devel-modula2/gcc/m2/mc/keyc.def", 20, 1);
912 __builtin_unreachable ();
913}
914
915
916/*
917 clash - returns TRUE if there is a clash with name, n,
918 in the current scope or C keywords or C macros.
919*/
920
921static unsigned int clash (nameKey_Name n, unsigned int scopes)
922{
923 if (((symbolKey_getSymKey (macros, n)) != NULL) || ((symbolKey_getSymKey (keywords, n)) != NULL))
924 {
925 return TRUE;
926 }
927 return scopes && ((symbolKey_getSymKey (stack->symbols, n)) != NULL);
928 /* static analysis guarentees a RETURN statement will be used before here. */
929 __builtin_unreachable ();
930}
931
932
933/*
934 initCP - add the extra keywords and standard definitions used by C++.
935*/
936
937static void initCP (void)
938{
939 add (keywords, (const char *) "delete", 6);
940 add (keywords, (const char *) "try", 3);
941 add (keywords, (const char *) "catch", 5);
942 add (keywords, (const char *) "operator", 8);
943 add (keywords, (const char *) "complex", 7);
944 add (keywords, (const char *) "export", 6);
945 add (keywords, (const char *) "public", 6);
946}
947
948
949/*
950 add -
951*/
952
953static void add (symbolKey_symbolTree s, const char *a_, unsigned int _a_high)
954{
955 char a[_a_high+1];
956
957 /* make a local copy of each unbounded array. */
958 memcpy (a, a_, _a_high+1);
959
960 symbolKey_putSymKey (s, nameKey_makeKey ((const char *) a, _a_high), reinterpret_cast<void *> (DynamicStrings_InitString ((const char *) a, _a_high)));
961}
962
963
964/*
965 initMacros - macros and library function names to avoid.
966*/
967
968static void initMacros (void)
969{
970 macros = symbolKey_initTree ();
971 add (macros, (const char *) "FILE", 4);
972 add (macros, (const char *) "EOF", 3);
973 add (macros, (const char *) "stdio", 5);
974 add (macros, (const char *) "stdout", 6);
975 add (macros, (const char *) "stderr", 6);
976 add (macros, (const char *) "write", 5);
977 add (macros, (const char *) "read", 4);
978 add (macros, (const char *) "exit", 4);
979 add (macros, (const char *) "abs", 3);
980 add (macros, (const char *) "optarg", 6);
981 add (macros, (const char *) "div", 3);
982 add (macros, (const char *) "sin", 3);
983 add (macros, (const char *) "cos", 3);
984 add (macros, (const char *) "tan", 3);
985 add (macros, (const char *) "log10", 5);
986 add (macros, (const char *) "trunc", 5);
987 add (macros, (const char *) "I", 1);
988 add (macros, (const char *) "csqrt", 5);
989 add (macros, (const char *) "strlen", 6);
990 add (macros, (const char *) "strcpy", 6);
991 add (macros, (const char *) "free", 4);
992 add (macros, (const char *) "malloc", 6);
993 add (macros, (const char *) "time", 4);
994 add (macros, (const char *) "main", 4);
995 add (macros, (const char *) "true", 4);
996 add (macros, (const char *) "false", 5);
997 add (macros, (const char *) "sigfpe", 6);
998}
999
1000
1001/*
1002 initKeywords - keywords to avoid.
1003*/
1004
1005static void initKeywords (void)
1006{
1007 keywords = symbolKey_initTree ();
1008 add (keywords, (const char *) "auto", 4);
1009 add (keywords, (const char *) "break", 5);
1010 add (keywords, (const char *) "case", 4);
1011 add (keywords, (const char *) "char", 4);
1012 add (keywords, (const char *) "const", 5);
1013 add (keywords, (const char *) "continue", 8);
1014 add (keywords, (const char *) "default", 7);
1015 add (keywords, (const char *) "do", 2);
1016 add (keywords, (const char *) "double", 6);
1017 add (keywords, (const char *) "else", 4);
1018 add (keywords, (const char *) "enum", 4);
1019 add (keywords, (const char *) "extern", 6);
1020 add (keywords, (const char *) "float", 5);
1021 add (keywords, (const char *) "for", 3);
1022 add (keywords, (const char *) "goto", 4);
1023 add (keywords, (const char *) "if", 2);
1024 add (keywords, (const char *) "int", 3);
1025 add (keywords, (const char *) "long", 4);
1026 add (keywords, (const char *) "register", 8);
1027 add (keywords, (const char *) "return", 6);
1028 add (keywords, (const char *) "short", 5);
1029 add (keywords, (const char *) "signed", 6);
1030 add (keywords, (const char *) "sizeof", 6);
1031 add (keywords, (const char *) "static", 6);
1032 add (keywords, (const char *) "struct", 6);
1033 add (keywords, (const char *) "switch", 6);
1034 add (keywords, (const char *) "typedef", 7);
1035 add (keywords, (const char *) "union", 5);
1036 add (keywords, (const char *) "unsigned", 8);
1037 add (keywords, (const char *) "void", 4);
1038 add (keywords, (const char *) "volatile", 8);
1039 add (keywords, (const char *) "while", 5);
1040 add (keywords, (const char *) "and", 3);
1041 add (keywords, (const char *) "or", 2);
1042 add (keywords, (const char *) "not", 3);
1043 add (keywords, (const char *) "throw", 5);
1044 add (keywords, (const char *) "new", 3);
1045}
1046
1047
1048/*
1049 init -
1050*/
1051
1052static void init (void)
1053{
1054 seenUnistd = FALSE;
1055 seenThrow = FALSE;
1056 seenFree = FALSE;
1057 seenMalloc = FALSE;
1058 seenStorage = FALSE;
1059 seenProc = FALSE;
1060 seenTrue = FALSE;
1061 seenFalse = FALSE;
1062 seenNull = FALSE;
1063 seenMemcpy = FALSE;
1064 seenIntMin = FALSE;
1065 seenUIntMin = FALSE;
1066 seenLongMin = FALSE;
1067 seenULongMin = FALSE;
1068 seenCharMin = FALSE;
1069 seenUCharMin = FALSE;
1070 seenUIntMin = FALSE;
1071 seenIntMax = FALSE;
1072 seenUIntMax = FALSE;
1073 seenLongMax = FALSE;
1074 seenULongMax = FALSE;
1075 seenCharMax = FALSE;
1076 seenUCharMax = FALSE;
1077 seenUIntMax = FALSE;
1078 seenLabs = FALSE;
1079 seenAbs = FALSE;
1080 seenFabs = FALSE;
1081 seenFabsl = FALSE;
1082 seenException = FALSE;
1083 seenComplex = FALSE;
1084 seenM2RTS = FALSE;
1085 seenStrlen = FALSE;
1086 seenCtype = FALSE;
1087 seenSize_t = FALSE;
1088 seenSSize_t = FALSE;
1089 seenSysTypes = FALSE;
1090 initializedCP = FALSE;
1091 initializedGCC = FALSE;
1092 stack = NULL;
1093 freeList = NULL;
1094 initKeywords ();
1095 initMacros ();
1096}
1097
1098
1099/*
1100 useUnistd - need to use unistd.h call using open/close/read/write require this header.
1101*/
1102
1103extern "C" void keyc_useUnistd (void)
1104{
1105 seenUnistd = TRUE;
1106}
1107
1108
1109/*
1110 useThrow - use the throw function.
1111*/
1112
1113extern "C" void keyc_useThrow (void)
1114{
1115 seenThrow = TRUE;
1116}
1117
1118
1119/*
1120 useStorage - indicate we have used storage.
1121*/
1122
1123extern "C" void keyc_useStorage (void)
1124{
1125 seenStorage = TRUE;
1126}
1127
1128
1129/*
1130 useFree - indicate we have used free.
1131*/
1132
1133extern "C" void keyc_useFree (void)
1134{
1135 seenFree = TRUE;
1136}
1137
1138
1139/*
1140 useMalloc - indicate we have used malloc.
1141*/
1142
1143extern "C" void keyc_useMalloc (void)
1144{
1145 seenMalloc = TRUE;
1146}
1147
1148
1149/*
1150 useProc - indicate we have used proc.
1151*/
1152
1153extern "C" void keyc_useProc (void)
1154{
1155 seenProc = TRUE;
1156}
1157
1158
1159/*
1160 useTrue - indicate we have used TRUE.
1161*/
1162
1163extern "C" void keyc_useTrue (void)
1164{
1165 seenTrue = TRUE;
1166}
1167
1168
1169/*
1170 useFalse - indicate we have used FALSE.
1171*/
1172
1173extern "C" void keyc_useFalse (void)
1174{
1175 seenFalse = TRUE;
1176}
1177
1178
1179/*
1180 useNull - indicate we have used NULL.
1181*/
1182
1183extern "C" void keyc_useNull (void)
1184{
1185 seenNull = TRUE;
1186}
1187
1188
1189/*
1190 useMemcpy - indicate we have used memcpy.
1191*/
1192
1193extern "C" void keyc_useMemcpy (void)
1194{
1195 seenMemcpy = TRUE;
1196}
1197
1198
1199/*
1200 useIntMin - indicate we have used INT_MIN.
1201*/
1202
1203extern "C" void keyc_useIntMin (void)
1204{
1205 seenIntMin = TRUE;
1206}
1207
1208
1209/*
1210 useUIntMin - indicate we have used UINT_MIN.
1211*/
1212
1213extern "C" void keyc_useUIntMin (void)
1214{
1215 seenUIntMin = TRUE;
1216}
1217
1218
1219/*
1220 useLongMin - indicate we have used LONG_MIN.
1221*/
1222
1223extern "C" void keyc_useLongMin (void)
1224{
1225 seenLongMin = TRUE;
1226}
1227
1228
1229/*
1230 useULongMin - indicate we have used ULONG_MIN.
1231*/
1232
1233extern "C" void keyc_useULongMin (void)
1234{
1235 seenULongMin = TRUE;
1236}
1237
1238
1239/*
1240 useCharMin - indicate we have used CHAR_MIN.
1241*/
1242
1243extern "C" void keyc_useCharMin (void)
1244{
1245 seenCharMin = TRUE;
1246}
1247
1248
1249/*
1250 useUCharMin - indicate we have used UCHAR_MIN.
1251*/
1252
1253extern "C" void keyc_useUCharMin (void)
1254{
1255 seenUCharMin = TRUE;
1256}
1257
1258
1259/*
1260 useIntMax - indicate we have used INT_MAX.
1261*/
1262
1263extern "C" void keyc_useIntMax (void)
1264{
1265 seenIntMax = TRUE;
1266}
1267
1268
1269/*
1270 useUIntMax - indicate we have used UINT_MAX.
1271*/
1272
1273extern "C" void keyc_useUIntMax (void)
1274{
1275 seenUIntMax = TRUE;
1276}
1277
1278
1279/*
1280 useLongMax - indicate we have used LONG_MAX.
1281*/
1282
1283extern "C" void keyc_useLongMax (void)
1284{
1285 seenLongMax = TRUE;
1286}
1287
1288
1289/*
1290 useULongMax - indicate we have used ULONG_MAX.
1291*/
1292
1293extern "C" void keyc_useULongMax (void)
1294{
1295 seenULongMax = TRUE;
1296}
1297
1298
1299/*
1300 useCharMax - indicate we have used CHAR_MAX.
1301*/
1302
1303extern "C" void keyc_useCharMax (void)
1304{
1305 seenCharMax = TRUE;
1306}
1307
1308
1309/*
1310 useUCharMax - indicate we have used UChar_MAX.
1311*/
1312
1313extern "C" void keyc_useUCharMax (void)
1314{
1315 seenUCharMax = TRUE;
1316}
1317
1318
1319/*
1320 useSize_t - indicate we have used size_t.
1321*/
1322
1323extern "C" void keyc_useSize_t (void)
1324{
1325 seenSize_t = TRUE;
1326}
1327
1328
1329/*
1330 useSSize_t - indicate we have used ssize_t.
1331*/
1332
1333extern "C" void keyc_useSSize_t (void)
1334{
1335 seenSSize_t = TRUE;
1336 seenSysTypes = TRUE;
1337}
1338
1339
1340/*
1341 useLabs - indicate we have used labs.
1342*/
1343
1344extern "C" void keyc_useLabs (void)
1345{
1346 seenLabs = TRUE;
1347}
1348
1349
1350/*
1351 useAbs - indicate we have used abs.
1352*/
1353
1354extern "C" void keyc_useAbs (void)
1355{
1356 seenAbs = TRUE;
1357}
1358
1359
1360/*
1361 useFabs - indicate we have used fabs.
1362*/
1363
1364extern "C" void keyc_useFabs (void)
1365{
1366 seenFabs = TRUE;
1367}
1368
1369
1370/*
1371 useFabsl - indicate we have used fabsl.
1372*/
1373
1374extern "C" void keyc_useFabsl (void)
1375{
1376 seenFabsl = TRUE;
1377}
1378
1379
1380/*
1381 useException - use the exceptions module, mcrts.
1382*/
1383
1384extern "C" void keyc_useException (void)
1385{
1386 seenException = TRUE;
1387}
1388
1389
1390/*
1391 useComplex - use the complex data type.
1392*/
1393
1394extern "C" void keyc_useComplex (void)
1395{
1396 seenComplex = TRUE;
1397}
1398
1399
1400/*
1401 useM2RTS - indicate we have used M2RTS in the converted code.
1402*/
1403
1404extern "C" void keyc_useM2RTS (void)
1405{
1406 seenM2RTS = TRUE;
1407}
1408
1409
1410/*
1411 useStrlen - indicate we have used strlen in the converted code.
1412*/
1413
1414extern "C" void keyc_useStrlen (void)
1415{
1416 seenStrlen = TRUE;
1417}
1418
1419
1420/*
1421 useCtype - indicate we have used the toupper function.
1422*/
1423
1424extern "C" void keyc_useCtype (void)
1425{
1426 seenCtype = TRUE;
1427}
1428
1429
1430/*
1431 genDefs - generate definitions or includes for all
1432 macros and prototypes used.
1433*/
1434
1435extern "C" void keyc_genDefs (mcPretty_pretty p)
1436{
1437 checkFreeMalloc (p);
1438 checkProc (p);
1439 checkTrue (p);
1440 checkFalse (p);
1441 checkNull (p);
1442 checkMemcpy (p);
1443 checkLimits (p);
1444 checkAbs (p);
1445 checkStorage (p);
1446 checkException (p);
1447 checkComplex (p);
1448 checkCtype (p);
1449 checkUnistd (p);
1450 checkSysTypes (p);
1451 checkM2RTS (p);
1452 checkThrow (p);
1453 fixNullPointerConst (p);
1454}
1455
1456
1457/*
1458 genConfigSystem - generate include files for config.h and system.h
1459 within the GCC framework.
1460*/
1461
1462extern "C" void keyc_genConfigSystem (mcPretty_pretty p)
1463{
1464 checkGccConfigSystem (p);
1465}
1466
1467
1468/*
1469 enterScope - enter a scope defined by, n.
1470*/
1471
1472extern "C" void keyc_enterScope (decl_node n)
1473{
1474 keyc_scope s;
1475
1476 s = new_ (n);
1477 s->scoped = n;
1478 s->symbols = symbolKey_initTree ();
1479 s->next = stack;
1480 stack = s;
1481}
1482
1483
1484/*
1485 leaveScope - leave the scope defined by, n.
1486*/
1487
1488extern "C" void keyc_leaveScope (decl_node n)
1489{
1490 keyc_scope s;
1491
1492 if (n == stack->scoped)
1493 {
1494 s = stack;
1495 stack = stack->next;
1496 s->scoped = static_cast<decl_node> (NULL);
1497 symbolKey_killTree (&s->symbols);
1498 s->next = NULL;
1499 }
1500 else
1501 {
1502 M2RTS_HALT (-1);
1503 __builtin_unreachable ();
1504 }
1505}
1506
1507
1508/*
1509 cname - attempts to declare a symbol with name, n, in the
1510 current scope. If there is no conflict with the
1511 target language then NIL is returned, otherwise
1512 a mangled name is returned as a String.
1513 If scopes is FALSE then only the keywords and
1514 macros are detected for a clash (all scoping
1515 is ignored).
1516*/
1517
1518extern "C" DynamicStrings_String keyc_cname (nameKey_Name n, unsigned int scopes)
1519{
1520 DynamicStrings_String m;
1521
1522 m = static_cast<DynamicStrings_String> (NULL);
1523 if (clash (n, scopes))
1524 {
1525 if (((mangle1 (n, &m, scopes)) || (mangle2 (n, &m, scopes))) || (mangleN (n, &m, scopes)))
1526 {
1527 /* avoid dangling else. */
1528 if (scopes)
1529 {
1530 /* no longer a clash with, m, so add it to the current scope. */
1531 n = nameKey_makekey (DynamicStrings_string (m));
1532 symbolKey_putSymKey (stack->symbols, n, reinterpret_cast<void *> (m));
1533 }
1534 }
1535 else
1536 {
1537 /* mangleN must always succeed. */
1538 M2RTS_HALT (-1);
1539 __builtin_unreachable ();
1540 }
1541 }
1542 else if (scopes)
1543 {
1544 /* avoid dangling else. */
1545 /* no clash, add it to the current scope. */
1546 symbolKey_putSymKey (stack->symbols, n, reinterpret_cast<void *> (DynamicStrings_InitStringCharStar (nameKey_keyToCharStar (n))));
1547 }
1548 return m;
1549 /* static analysis guarentees a RETURN statement will be used before here. */
1550 __builtin_unreachable ();
1551}
1552
1553
1554/*
1555 cnamen - attempts to declare a symbol with name, n, in the
1556 current scope. If there is no conflict with the
1557 target language then NIL is returned, otherwise
1558 a mangled name is returned as a Name
1559 If scopes is FALSE then only the keywords and
1560 macros are detected for a clash (all scoping
1561 is ignored).
1562*/
1563
1564extern "C" nameKey_Name keyc_cnamen (nameKey_Name n, unsigned int scopes)
1565{
1566 DynamicStrings_String m;
1567
1568 m = static_cast<DynamicStrings_String> (NULL);
1569 if (clash (n, scopes))
1570 {
1571 if (((mangle1 (n, &m, scopes)) || (mangle2 (n, &m, scopes))) || (mangleN (n, &m, scopes)))
1572 {
1573 /* avoid dangling else. */
1574 n = nameKey_makekey (DynamicStrings_string (m));
1575 if (scopes)
1576 {
1577 /* no longer a clash with, m, so add it to the current scope. */
1578 symbolKey_putSymKey (stack->symbols, n, reinterpret_cast<void *> (m));
1579 }
1580 }
1581 else
1582 {
1583 /* mangleN must always succeed. */
1584 M2RTS_HALT (-1);
1585 __builtin_unreachable ();
1586 }
1587 }
1588 else if (scopes)
1589 {
1590 /* avoid dangling else. */
1591 /* no clash, add it to the current scope. */
1592 symbolKey_putSymKey (stack->symbols, n, reinterpret_cast<void *> (DynamicStrings_InitStringCharStar (nameKey_keyToCharStar (n))));
1593 }
1594 m = DynamicStrings_KillString (m);
1595 return n;
1596 /* static analysis guarentees a RETURN statement will be used before here. */
1597 __builtin_unreachable ();
1598}
1599
1600
1601/*
1602 cp - include C++ keywords and standard declarations to avoid.
1603*/
1604
1605extern "C" void keyc_cp (void)
1606{
1607 if (! initializedCP)
1608 {
1609 initializedCP = TRUE;
1610 initCP ();
1611 }
1612}
1613
1614extern "C" void _M2_keyc_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
1615{
1616 init ();
1617}
1618
1619extern "C" void _M2_keyc_finish (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
1620{
1621}