Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from M2Swig. */
2 : : /* M2Swig.mod generates a swig interface file for the main module.
3 : :
4 : : Copyright (C) 2008-2024 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 : : #include "config.h"
24 : : #include "system.h"
25 : : #include "gcc-consolidation.h"
26 : :
27 : : #include <stdbool.h>
28 : : # if !defined (PROC_D)
29 : : # define PROC_D
30 : : typedef void (*PROC_t) (void);
31 : : typedef struct { PROC_t proc; } PROC;
32 : : # endif
33 : :
34 : : # if !defined (TRUE)
35 : : # define TRUE (1==1)
36 : : # endif
37 : :
38 : : # if !defined (FALSE)
39 : : # define FALSE (1==0)
40 : : # endif
41 : :
42 : : # include "GStorage.h"
43 : : # include "Gmcrts.h"
44 : : #define _M2Swig_C
45 : :
46 : : #include "GM2Swig.h"
47 : : # include "GStorage.h"
48 : : # include "GM2Options.h"
49 : : # include "GSFIO.h"
50 : : # include "GFIO.h"
51 : : # include "GNameKey.h"
52 : : # include "GM2Error.h"
53 : : # include "GM2Printf.h"
54 : : # include "GM2AsmUtil.h"
55 : : # include "GSYSTEM.h"
56 : : # include "GDynamicStrings.h"
57 : : # include "GLists.h"
58 : : # include "GM2Quads.h"
59 : : # include "GM2System.h"
60 : : # include "GM2Bitset.h"
61 : : # include "GIndexing.h"
62 : : # include "GM2Scope.h"
63 : : # include "GM2Base.h"
64 : : # include "GSymbolTable.h"
65 : : # include "GM2BasicBlock.h"
66 : :
67 : : typedef struct M2Swig__T1_r M2Swig__T1;
68 : :
69 : : typedef M2Swig__T1 *M2Swig_UnboundedSig;
70 : :
71 : : struct M2Swig__T1_r {
72 : : unsigned int type;
73 : : NameKey_Name name;
74 : : };
75 : :
76 : : static bool includedArray;
77 : : static Indexing_Index uKey;
78 : : static unsigned int mainModule;
79 : : static Lists_List Done;
80 : : static Lists_List ToDo;
81 : : static FIO_File f;
82 : : static DynamicStrings_String name;
83 : : static bool FirstBasicBlock;
84 : : static bool Input;
85 : : static bool Output;
86 : : static bool InOut;
87 : : static bool CanGuess;
88 : : static bool IsKnown;
89 : : static unsigned int rs;
90 : : static unsigned int ws;
91 : :
92 : : /*
93 : : GenerateSwigFile - if the -fswig option was specified then generate
94 : : a swig interface file for the main module.
95 : : */
96 : :
97 : : extern "C" void M2Swig_GenerateSwigFile (unsigned int sym);
98 : :
99 : : /*
100 : : DoExported - includes, sym, into the, ToDo, list.
101 : : */
102 : :
103 : : static void DoExported (unsigned int sym);
104 : :
105 : : /*
106 : : MoveToDone - moves a sym to the, Done, list,
107 : : providing that it is not already on it.
108 : : It returns TRUE if the lists were modified.
109 : : */
110 : :
111 : : static bool MoveToDone (unsigned int sym);
112 : :
113 : : /*
114 : : MoveToToDo - moves a sym to the, ToDo, list,
115 : : providing that it is not already on it.
116 : : It returns TRUE if the lists were modified.
117 : : */
118 : :
119 : : static bool MoveToToDo (unsigned int sym);
120 : : static bool TryBase (unsigned int sym);
121 : :
122 : : /*
123 : : TrySystem - returns TRUE if sym can be moved to the done list.
124 : : */
125 : :
126 : : static bool TrySystem (unsigned int sym);
127 : :
128 : : /*
129 : : TryMove - tries to move sym to the done queue as long
130 : : as type is known.
131 : : */
132 : :
133 : : static bool TryMove (unsigned int sym, unsigned int type);
134 : :
135 : : /*
136 : : TryType -
137 : : */
138 : :
139 : : static bool TryType (unsigned int sym);
140 : :
141 : : /*
142 : : TryVar -
143 : : */
144 : :
145 : : static bool TryVar (unsigned int sym);
146 : :
147 : : /*
148 : : TryProcedure -
149 : : */
150 : :
151 : : static bool TryProcedure (unsigned int sym);
152 : :
153 : : /*
154 : : TryUnbounded -
155 : : */
156 : :
157 : : static bool TryUnbounded (unsigned int sym);
158 : :
159 : : /*
160 : : TryParameter -
161 : : */
162 : :
163 : : static bool TryParameter (unsigned int sym);
164 : :
165 : : /*
166 : : TryDependents - returns TRUE if any alteration occurred to any
167 : : of the lists.
168 : : */
169 : :
170 : : static bool TryDependents (unsigned int sym);
171 : :
172 : : /*
173 : : DoResolveOrder - resolves the declaration order for swig (C).
174 : : */
175 : :
176 : : static void DoResolveOrder (void);
177 : :
178 : : /*
179 : : DoName -
180 : : */
181 : :
182 : : static void DoName (unsigned int sym);
183 : :
184 : : /*
185 : : DoParamName -
186 : : */
187 : :
188 : : static void DoParamName (unsigned int sym);
189 : :
190 : : /*
191 : : DoVar -
192 : : */
193 : :
194 : : static void DoVar (unsigned int sym);
195 : :
196 : : /*
197 : : DoType -
198 : : */
199 : :
200 : : static void DoType (unsigned int sym);
201 : :
202 : : /*
203 : : DoUnbounded -
204 : : */
205 : :
206 : : static void DoUnbounded (unsigned int sym);
207 : :
208 : : /*
209 : : DoBasicBlock -
210 : : */
211 : :
212 : : static void DoBasicBlock (M2BasicBlock_BasicBlock bb);
213 : :
214 : : /*
215 : : DetermineParameter -
216 : : */
217 : :
218 : : static void DetermineParameter (unsigned int procedure, unsigned int param);
219 : :
220 : : /*
221 : : PrintDirection -
222 : : */
223 : :
224 : : static void PrintDirection (void);
225 : :
226 : : /*
227 : : CalculateVarDirective -
228 : : */
229 : :
230 : : static void CalculateVarDirective (unsigned int procedure, unsigned int param, bool annotate);
231 : :
232 : : /*
233 : : AnnotateProcedure -
234 : : */
235 : :
236 : : static void AnnotateProcedure (unsigned int sym);
237 : :
238 : : /*
239 : : DoProcedure -
240 : : */
241 : :
242 : : static bool DoProcedure (unsigned int sym);
243 : :
244 : : /*
245 : : DoWriteSymbol -
246 : : */
247 : :
248 : : static void DoWriteSymbol (unsigned int sym);
249 : :
250 : : /*
251 : : DoCheckExported -
252 : : */
253 : :
254 : : static void DoCheckExported (unsigned int sym);
255 : :
256 : : /*
257 : : IsUnique - returns TRUE if the combination of, n, and, t,
258 : : is unique.
259 : : */
260 : :
261 : : static bool IsUnique (NameKey_Name n, unsigned int t);
262 : :
263 : : /*
264 : : IsTypeUnique - returns TRUE if type, t, has not been entered yet.
265 : : */
266 : :
267 : : static bool IsTypeUnique (unsigned int t);
268 : :
269 : : /*
270 : : DoCheckUnbounded -
271 : : */
272 : :
273 : : static void DoCheckUnbounded (unsigned int sym);
274 : :
275 : : /*
276 : : DoWriteFile -
277 : : */
278 : :
279 : : static void DoWriteFile (unsigned int sym);
280 : :
281 : : /*
282 : : DoGenerateSwig -
283 : : */
284 : :
285 : : static void DoGenerateSwig (unsigned int sym);
286 : :
287 : : /*
288 : : Init -
289 : : */
290 : :
291 : : static void Init (void);
292 : :
293 : : /*
294 : : Kill -
295 : : */
296 : :
297 : : static void Kill (void);
298 : :
299 : :
300 : : /*
301 : : DoExported - includes, sym, into the, ToDo, list.
302 : : */
303 : :
304 : 0 : static void DoExported (unsigned int sym)
305 : : {
306 : 0 : Lists_IncludeItemIntoList (ToDo, sym);
307 : 0 : }
308 : :
309 : :
310 : : /*
311 : : MoveToDone - moves a sym to the, Done, list,
312 : : providing that it is not already on it.
313 : : It returns TRUE if the lists were modified.
314 : : */
315 : :
316 : 0 : static bool MoveToDone (unsigned int sym)
317 : : {
318 : 0 : if (Lists_IsItemInList (Done, sym))
319 : : {
320 : : return false;
321 : : }
322 : 0 : else if (Lists_IsItemInList (ToDo, sym))
323 : : {
324 : : /* avoid dangling else. */
325 : 0 : Lists_RemoveItemFromList (ToDo, sym);
326 : 0 : Lists_IncludeItemIntoList (Done, sym);
327 : 0 : return true;
328 : : }
329 : 0 : Lists_IncludeItemIntoList (Done, sym);
330 : 0 : return true;
331 : : /* static analysis guarentees a RETURN statement will be used before here. */
332 : : __builtin_unreachable ();
333 : : }
334 : :
335 : :
336 : : /*
337 : : MoveToToDo - moves a sym to the, ToDo, list,
338 : : providing that it is not already on it.
339 : : It returns TRUE if the lists were modified.
340 : : */
341 : :
342 : 0 : static bool MoveToToDo (unsigned int sym)
343 : : {
344 : 0 : if (Lists_IsItemInList (Done, sym))
345 : : {
346 : 0 : M2Error_InternalError ((const char *) "not expecting to get here", 25);
347 : : }
348 : 0 : else if (Lists_IsItemInList (ToDo, sym))
349 : : {
350 : : /* avoid dangling else. */
351 : : return false;
352 : : }
353 : : else
354 : : {
355 : : /* avoid dangling else. */
356 : 0 : Lists_IncludeItemIntoList (ToDo, sym);
357 : 0 : return true;
358 : : }
359 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2Swig.def", 20, 1);
360 : : __builtin_unreachable ();
361 : : }
362 : :
363 : 0 : static bool TryBase (unsigned int sym)
364 : : {
365 : : /*
366 : : Trybase - returns TRUE
367 : : */
368 : 0 : if (((((((((((sym == M2Base_Cardinal) || (sym == M2Base_Integer)) || (sym == M2Base_LongInt)) || (sym == M2Base_LongCard)) || (sym == M2Base_Char)) || (sym == M2Base_ShortCard)) || (sym == M2Base_ShortInt)) || (sym == M2Base_Real)) || (sym == M2Base_LongReal)) || (sym == M2Base_ShortReal)) || (sym == M2Base_Boolean))
369 : : {
370 : 0 : return MoveToDone (sym);
371 : : }
372 : : else
373 : : {
374 : : return false;
375 : : }
376 : : /* static analysis guarentees a RETURN statement will be used before here. */
377 : : __builtin_unreachable ();
378 : : }
379 : :
380 : :
381 : : /*
382 : : TrySystem - returns TRUE if sym can be moved to the done list.
383 : : */
384 : :
385 : 0 : static bool TrySystem (unsigned int sym)
386 : : {
387 : 0 : if (((((sym == M2Bitset_Bitset) || (sym == M2System_Address)) || (sym == M2System_Byte)) || (sym == M2System_Loc)) || (sym == M2System_Word))
388 : : {
389 : 0 : return MoveToDone (sym);
390 : : }
391 : : else
392 : : {
393 : : return false;
394 : : }
395 : : /* static analysis guarentees a RETURN statement will be used before here. */
396 : : __builtin_unreachable ();
397 : : }
398 : :
399 : :
400 : : /*
401 : : TryMove - tries to move sym to the done queue as long
402 : : as type is known.
403 : : */
404 : :
405 : 0 : static bool TryMove (unsigned int sym, unsigned int type)
406 : : {
407 : 0 : if (Lists_IsItemInList (Done, type))
408 : : {
409 : : /* avoid dangling else. */
410 : 0 : if (MoveToDone (sym))
411 : : {
412 : : return true;
413 : : }
414 : : }
415 : : else
416 : : {
417 : 0 : if (MoveToToDo (sym))
418 : : {
419 : : return true;
420 : : }
421 : : }
422 : : return false;
423 : : /* static analysis guarentees a RETURN statement will be used before here. */
424 : : __builtin_unreachable ();
425 : : }
426 : :
427 : :
428 : : /*
429 : : TryType -
430 : : */
431 : :
432 : 0 : static bool TryType (unsigned int sym)
433 : : {
434 : 0 : unsigned int type;
435 : 0 : bool result;
436 : :
437 : 0 : type = SymbolTable_GetType (sym);
438 : 0 : result = TryDependents (type);
439 : 0 : if (TryMove (sym, type))
440 : : {
441 : : return true;
442 : : }
443 : : else
444 : : {
445 : 0 : return result;
446 : : }
447 : : /* static analysis guarentees a RETURN statement will be used before here. */
448 : : __builtin_unreachable ();
449 : : }
450 : :
451 : :
452 : : /*
453 : : TryVar -
454 : : */
455 : :
456 : 0 : static bool TryVar (unsigned int sym)
457 : : {
458 : 0 : unsigned int type;
459 : 0 : bool result;
460 : :
461 : 0 : type = SymbolTable_GetType (sym);
462 : 0 : result = TryDependents (type);
463 : 0 : if (TryMove (sym, type))
464 : : {
465 : : return true;
466 : : }
467 : : else
468 : : {
469 : 0 : return result;
470 : : }
471 : : /* static analysis guarentees a RETURN statement will be used before here. */
472 : : __builtin_unreachable ();
473 : : }
474 : :
475 : :
476 : : /*
477 : : TryProcedure -
478 : : */
479 : :
480 : 0 : static bool TryProcedure (unsigned int sym)
481 : : {
482 : 0 : unsigned int son;
483 : 0 : unsigned int p;
484 : 0 : unsigned int i;
485 : 0 : unsigned int type;
486 : 0 : bool solved;
487 : 0 : bool result;
488 : :
489 : 0 : type = SymbolTable_GetType (sym);
490 : 0 : result = false;
491 : 0 : solved = true;
492 : 0 : if (type != SymbolTable_NulSym)
493 : : {
494 : 0 : if (TryDependents (type))
495 : : {
496 : : result = true;
497 : : }
498 : 0 : if (! (Lists_IsItemInList (Done, type)))
499 : : {
500 : : solved = false;
501 : : }
502 : : }
503 : 0 : p = SymbolTable_NoOfParamAny (sym);
504 : 0 : i = 1;
505 : 0 : while (i <= p)
506 : : {
507 : 0 : son = SymbolTable_GetNthParamAny (sym, i);
508 : 0 : if (TryDependents (son))
509 : : {
510 : 0 : result = true;
511 : : }
512 : 0 : if (! (Lists_IsItemInList (Done, son)))
513 : : {
514 : 0 : solved = false;
515 : : }
516 : 0 : i += 1;
517 : : }
518 : 0 : if (solved)
519 : : {
520 : : /* avoid dangling else. */
521 : 0 : if (MoveToDone (sym))
522 : : {
523 : : return true;
524 : : }
525 : : }
526 : : else
527 : : {
528 : 0 : if (MoveToToDo (sym))
529 : : {
530 : : return true;
531 : : }
532 : : }
533 : : return result;
534 : : /* static analysis guarentees a RETURN statement will be used before here. */
535 : : __builtin_unreachable ();
536 : : }
537 : :
538 : :
539 : : /*
540 : : TryUnbounded -
541 : : */
542 : :
543 : 0 : static bool TryUnbounded (unsigned int sym)
544 : : {
545 : 0 : unsigned int type;
546 : 0 : bool result;
547 : :
548 : 0 : type = SymbolTable_GetType (sym);
549 : 0 : result = TryDependents (type);
550 : 0 : if (TryMove (sym, type))
551 : : {
552 : : return true;
553 : : }
554 : : else
555 : : {
556 : 0 : return result;
557 : : }
558 : : /* static analysis guarentees a RETURN statement will be used before here. */
559 : : __builtin_unreachable ();
560 : : }
561 : :
562 : :
563 : : /*
564 : : TryParameter -
565 : : */
566 : :
567 : 0 : static bool TryParameter (unsigned int sym)
568 : : {
569 : 0 : unsigned int type;
570 : 0 : bool result;
571 : :
572 : 0 : type = SymbolTable_GetType (sym);
573 : 0 : result = TryDependents (type);
574 : 0 : if (TryMove (sym, type))
575 : : {
576 : : return true;
577 : : }
578 : : else
579 : : {
580 : 0 : return result;
581 : : }
582 : : /* static analysis guarentees a RETURN statement will be used before here. */
583 : : __builtin_unreachable ();
584 : : }
585 : :
586 : :
587 : : /*
588 : : TryDependents - returns TRUE if any alteration occurred to any
589 : : of the lists.
590 : : */
591 : :
592 : 0 : static bool TryDependents (unsigned int sym)
593 : : {
594 : 0 : if (M2Base_IsBaseType (sym))
595 : : {
596 : 0 : return TryBase (sym);
597 : : }
598 : 0 : else if (M2System_IsSystemType (sym))
599 : : {
600 : : /* avoid dangling else. */
601 : 0 : return TrySystem (sym);
602 : : }
603 : 0 : else if (SymbolTable_IsType (sym))
604 : : {
605 : : /* avoid dangling else. */
606 : 0 : return TryType (sym);
607 : : }
608 : 0 : else if (SymbolTable_IsParameter (sym))
609 : : {
610 : : /* avoid dangling else. */
611 : 0 : return TryParameter (sym);
612 : : }
613 : 0 : else if (SymbolTable_IsProcedure (sym))
614 : : {
615 : : /* avoid dangling else. */
616 : 0 : return TryProcedure (sym);
617 : : }
618 : 0 : else if (SymbolTable_IsConstString (sym))
619 : : {
620 : : /* avoid dangling else. */
621 : 0 : return MoveToDone (sym);
622 : : }
623 : 0 : else if (SymbolTable_IsConstLit (sym))
624 : : {
625 : : /* avoid dangling else. */
626 : 0 : return MoveToDone (sym);
627 : : }
628 : 0 : else if ((SymbolTable_IsVar (sym)) && ((SymbolTable_GetMode (sym)) == SymbolTable_ImmediateValue))
629 : : {
630 : : /* avoid dangling else. */
631 : 0 : return MoveToDone (sym);
632 : : }
633 : 0 : else if (SymbolTable_IsVar (sym))
634 : : {
635 : : /* avoid dangling else. */
636 : 0 : return TryVar (sym);
637 : : }
638 : 0 : else if (SymbolTable_IsUnbounded (sym))
639 : : {
640 : : /* avoid dangling else. */
641 : 0 : return TryUnbounded (sym);
642 : : }
643 : : else
644 : : {
645 : : /* avoid dangling else. */
646 : : return false;
647 : : }
648 : : /* static analysis guarentees a RETURN statement will be used before here. */
649 : : __builtin_unreachable ();
650 : : }
651 : :
652 : :
653 : : /*
654 : : DoResolveOrder - resolves the declaration order for swig (C).
655 : : */
656 : :
657 : 0 : static void DoResolveOrder (void)
658 : : {
659 : 0 : unsigned int sym;
660 : 0 : unsigned int i;
661 : 0 : unsigned int n;
662 : 0 : bool movement;
663 : :
664 : 0 : do {
665 : 0 : n = Lists_NoOfItemsInList (ToDo);
666 : 0 : movement = false;
667 : 0 : i = 1;
668 : 0 : while ((i <= n) && ! movement)
669 : : {
670 : 0 : sym = static_cast<unsigned int> (Lists_GetItemFromList (ToDo, i));
671 : 0 : movement = TryDependents (sym);
672 : 0 : i += 1;
673 : : }
674 : 0 : } while (! (! movement));
675 : 0 : }
676 : :
677 : :
678 : : /*
679 : : DoName -
680 : : */
681 : :
682 : 0 : static void DoName (unsigned int sym)
683 : : {
684 : 0 : NameKey_Name n;
685 : :
686 : 0 : n = M2AsmUtil_GetFullScopeAsmName (sym);
687 : 0 : M2Printf_fprintf1 (f, (const char *) "%a", 2, (const unsigned char *) &n, (sizeof (n)-1));
688 : 0 : }
689 : :
690 : :
691 : : /*
692 : : DoParamName -
693 : : */
694 : :
695 : 0 : static void DoParamName (unsigned int sym)
696 : : {
697 : 0 : NameKey_Name n;
698 : :
699 : 0 : n = SymbolTable_GetSymName (sym);
700 : 0 : M2Printf_fprintf1 (f, (const char *) "%a", 2, (const unsigned char *) &n, (sizeof (n)-1));
701 : 0 : }
702 : :
703 : :
704 : : /*
705 : : DoVar -
706 : : */
707 : :
708 : 0 : static void DoVar (unsigned int sym)
709 : : {
710 : 0 : M2Printf_fprintf0 (f, (const char *) "extern \"C\" ", 11);
711 : 0 : DoType (SymbolTable_GetType (sym));
712 : 0 : M2Printf_fprintf0 (f, (const char *) " ", 1);
713 : 0 : DoName (sym);
714 : 0 : M2Printf_fprintf0 (f, (const char *) ";\\n", 3);
715 : 0 : }
716 : :
717 : :
718 : : /*
719 : : DoType -
720 : : */
721 : :
722 : 0 : static void DoType (unsigned int sym)
723 : : {
724 : 0 : if (SymbolTable_IsPointer (sym))
725 : : {
726 : 0 : DoType (SymbolTable_GetType (sym));
727 : 0 : M2Printf_fprintf0 (f, (const char *) " *", 2);
728 : : }
729 : 0 : else if (sym == M2Base_Cardinal)
730 : : {
731 : : /* avoid dangling else. */
732 : 0 : M2Printf_fprintf0 (f, (const char *) "unsigned int", 12);
733 : : }
734 : 0 : else if (sym == M2Base_Integer)
735 : : {
736 : : /* avoid dangling else. */
737 : 0 : M2Printf_fprintf0 (f, (const char *) "int", 3);
738 : : }
739 : 0 : else if (sym == M2Base_Boolean)
740 : : {
741 : : /* avoid dangling else. */
742 : 0 : M2Printf_fprintf0 (f, (const char *) "unsigned int", 12);
743 : : }
744 : 0 : else if (sym == M2Base_LongInt)
745 : : {
746 : : /* avoid dangling else. */
747 : 0 : M2Printf_fprintf0 (f, (const char *) "long long int", 13);
748 : : }
749 : 0 : else if (sym == M2Base_LongCard)
750 : : {
751 : : /* avoid dangling else. */
752 : 0 : M2Printf_fprintf0 (f, (const char *) "long long unsigned int", 22);
753 : : }
754 : 0 : else if (sym == M2Base_Char)
755 : : {
756 : : /* avoid dangling else. */
757 : 0 : M2Printf_fprintf0 (f, (const char *) "char", 4);
758 : : }
759 : 0 : else if (sym == M2Base_ShortCard)
760 : : {
761 : : /* avoid dangling else. */
762 : 0 : M2Printf_fprintf0 (f, (const char *) "short unsigned int", 18);
763 : : }
764 : 0 : else if (sym == M2Base_ShortInt)
765 : : {
766 : : /* avoid dangling else. */
767 : 0 : M2Printf_fprintf0 (f, (const char *) "short int", 9);
768 : : }
769 : 0 : else if (sym == M2Base_Real)
770 : : {
771 : : /* avoid dangling else. */
772 : 0 : M2Printf_fprintf0 (f, (const char *) "double", 6);
773 : : }
774 : 0 : else if (sym == M2Base_LongReal)
775 : : {
776 : : /* avoid dangling else. */
777 : 0 : M2Printf_fprintf0 (f, (const char *) "long double", 11);
778 : : }
779 : 0 : else if (sym == M2Base_ShortReal)
780 : : {
781 : : /* avoid dangling else. */
782 : 0 : M2Printf_fprintf0 (f, (const char *) "float", 5);
783 : : }
784 : 0 : else if (sym == M2Bitset_Bitset)
785 : : {
786 : : /* avoid dangling else. */
787 : 0 : M2Printf_fprintf0 (f, (const char *) "unsigned int", 12);
788 : : }
789 : 0 : else if (sym == M2System_Address)
790 : : {
791 : : /* avoid dangling else. */
792 : 0 : M2Printf_fprintf0 (f, (const char *) "void *", 6);
793 : : }
794 : 0 : else if (sym == M2System_Byte)
795 : : {
796 : : /* avoid dangling else. */
797 : 0 : M2Printf_fprintf0 (f, (const char *) "unsigned char", 13);
798 : : }
799 : 0 : else if (sym == M2System_Loc)
800 : : {
801 : : /* avoid dangling else. */
802 : 0 : M2Printf_fprintf0 (f, (const char *) "unsigned char", 13);
803 : : }
804 : 0 : else if (sym == M2System_Word)
805 : : {
806 : : /* avoid dangling else. */
807 : 0 : M2Printf_fprintf0 (f, (const char *) "unsigned int", 12);
808 : : }
809 : 0 : }
810 : :
811 : :
812 : : /*
813 : : DoUnbounded -
814 : : */
815 : :
816 : 0 : static void DoUnbounded (unsigned int sym)
817 : : {
818 : 0 : NameKey_Name n;
819 : 0 : unsigned int type;
820 : :
821 : 0 : type = SymbolTable_GetType (sym);
822 : 0 : DoType (SymbolTable_GetType (type));
823 : 0 : n = SymbolTable_GetSymName (sym);
824 : 0 : M2Printf_fprintf2 (f, (const char *) " *_m2_address_%a, int _m2_high_%a", 33, (const unsigned char *) &n, (sizeof (n)-1), (const unsigned char *) &n, (sizeof (n)-1));
825 : 0 : }
826 : :
827 : :
828 : : /*
829 : : DoBasicBlock -
830 : : */
831 : :
832 : 0 : static void DoBasicBlock (M2BasicBlock_BasicBlock bb)
833 : : {
834 : 0 : unsigned int start;
835 : 0 : unsigned int end;
836 : :
837 : 0 : start = M2BasicBlock_GetBasicBlockStart (bb);
838 : 0 : end = M2BasicBlock_GetBasicBlockEnd (bb);
839 : 0 : if (M2Quads_IsProcedureScope (start))
840 : : {
841 : : /* skip this basic block, as this will not modify the parameter */
842 : : return;
843 : : }
844 : 0 : else if (IsKnown || CanGuess)
845 : : {
846 : : /* avoid dangling else. */
847 : : /* already resolved */
848 : : return;
849 : : }
850 : : else
851 : : {
852 : : /* avoid dangling else. */
853 : 0 : if ((ws == 0) && (rs == 0))
854 : : {
855 : 0 : FirstBasicBlock = false;
856 : : }
857 : 0 : else if (rs == 0)
858 : : {
859 : : /* avoid dangling else. */
860 : : /* only written */
861 : 0 : if (ws <= end)
862 : : {
863 : 0 : Output = true;
864 : 0 : if (FirstBasicBlock)
865 : : {
866 : 0 : IsKnown = true;
867 : : }
868 : : else
869 : : {
870 : 0 : CanGuess = true;
871 : : }
872 : 0 : FirstBasicBlock = false;
873 : : }
874 : : }
875 : 0 : else if (ws == 0)
876 : : {
877 : : /* avoid dangling else. */
878 : : /* only read */
879 : 0 : Input = true;
880 : 0 : if ((rs <= end) && FirstBasicBlock)
881 : : {
882 : 0 : IsKnown = true;
883 : : }
884 : : else
885 : : {
886 : 0 : CanGuess = true;
887 : : }
888 : 0 : FirstBasicBlock = false;
889 : : }
890 : 0 : else if (rs <= ws)
891 : : {
892 : : /* avoid dangling else. */
893 : : /* read before write */
894 : 0 : InOut = true;
895 : 0 : if (((rs <= end) && (ws <= end)) && FirstBasicBlock)
896 : : {
897 : 0 : IsKnown = true;
898 : : }
899 : : else
900 : : {
901 : 0 : CanGuess = true;
902 : : }
903 : 0 : FirstBasicBlock = false;
904 : : }
905 : : else
906 : : {
907 : : /* avoid dangling else. */
908 : : /* must be written before read */
909 : 0 : Output = true;
910 : 0 : if (((rs <= end) && (ws <= end)) && FirstBasicBlock)
911 : : {
912 : 0 : IsKnown = true;
913 : : }
914 : : else
915 : : {
916 : 0 : CanGuess = true;
917 : : }
918 : 0 : FirstBasicBlock = false;
919 : : }
920 : : }
921 : : }
922 : :
923 : :
924 : : /*
925 : : DetermineParameter -
926 : : */
927 : :
928 : 0 : static void DetermineParameter (unsigned int procedure, unsigned int param)
929 : : {
930 : 0 : M2Scope_ScopeBlock sb;
931 : 0 : M2BasicBlock_BasicBlock bb;
932 : 0 : unsigned int we;
933 : 0 : unsigned int re;
934 : :
935 : 0 : sb = M2Scope_InitScopeBlock (procedure);
936 : 0 : bb = M2BasicBlock_InitBasicBlocks (sb);
937 : 0 : Input = false;
938 : 0 : Output = false;
939 : 0 : InOut = false;
940 : 0 : CanGuess = false;
941 : 0 : IsKnown = false;
942 : 0 : FirstBasicBlock = true;
943 : 0 : SymbolTable_GetReadQuads (param, SymbolTable_RightValue, &rs, &re);
944 : 0 : SymbolTable_GetWriteQuads (param, SymbolTable_RightValue, &ws, &we);
945 : 0 : M2BasicBlock_ForeachBasicBlockDo (bb, (M2BasicBlock_BasicBlockProc) {(M2BasicBlock_BasicBlockProc_t) DoBasicBlock});
946 : 0 : M2BasicBlock_KillBasicBlocks (&bb);
947 : 0 : M2Scope_KillScopeBlock (&sb);
948 : 0 : }
949 : :
950 : :
951 : : /*
952 : : PrintDirection -
953 : : */
954 : :
955 : 0 : static void PrintDirection (void)
956 : : {
957 : 0 : if (Input)
958 : : {
959 : 0 : M2Printf_fprintf0 (f, (const char *) "INPUT", 5);
960 : : }
961 : 0 : else if (Output)
962 : : {
963 : : /* avoid dangling else. */
964 : 0 : M2Printf_fprintf0 (f, (const char *) "OUTPUT", 6);
965 : : }
966 : : else
967 : : {
968 : : /* avoid dangling else. */
969 : 0 : M2Printf_fprintf0 (f, (const char *) "INOUT", 5);
970 : : }
971 : 0 : }
972 : :
973 : :
974 : : /*
975 : : CalculateVarDirective -
976 : : */
977 : :
978 : 0 : static void CalculateVarDirective (unsigned int procedure, unsigned int param, bool annotate)
979 : : {
980 : 0 : unsigned int sym;
981 : :
982 : 0 : sym = SymbolTable_GetParameterShadowVar (param);
983 : 0 : if (sym == SymbolTable_NulSym)
984 : : {
985 : 0 : M2Error_InternalError ((const char *) "why did we get here", 19);
986 : : }
987 : : else
988 : : {
989 : 0 : DetermineParameter (procedure, sym);
990 : 0 : if (annotate)
991 : : {
992 : 0 : DoParamName (sym);
993 : 0 : if (IsKnown)
994 : : {
995 : 0 : M2Printf_fprintf0 (f, (const char *) " is known to be an ", 19);
996 : 0 : PrintDirection ();
997 : : }
998 : 0 : else if (CanGuess)
999 : : {
1000 : : /* avoid dangling else. */
1001 : 0 : M2Printf_fprintf0 (f, (const char *) " is guessed to be an ", 21);
1002 : 0 : PrintDirection ();
1003 : : }
1004 : : else
1005 : : {
1006 : : /* avoid dangling else. */
1007 : 0 : M2Printf_fprintf0 (f, (const char *) " is unknown", 11);
1008 : : }
1009 : : }
1010 : : else
1011 : : {
1012 : 0 : M2Printf_fprintf0 (f, (const char *) "*", 1);
1013 : 0 : if (IsKnown || CanGuess)
1014 : : {
1015 : 0 : PrintDirection ();
1016 : : }
1017 : : else
1018 : : {
1019 : 0 : DoParamName (sym);
1020 : : }
1021 : : }
1022 : : }
1023 : 0 : }
1024 : :
1025 : :
1026 : : /*
1027 : : AnnotateProcedure -
1028 : : */
1029 : :
1030 : 0 : static void AnnotateProcedure (unsigned int sym)
1031 : : {
1032 : 0 : unsigned int son;
1033 : 0 : unsigned int p;
1034 : 0 : unsigned int i;
1035 : 0 : bool needComma;
1036 : :
1037 : 0 : M2Printf_fprintf0 (f, (const char *) "/* Parameter: ", 14);
1038 : 0 : p = SymbolTable_NoOfParamAny (sym);
1039 : 0 : i = 1;
1040 : 0 : needComma = false;
1041 : 0 : while (i <= p)
1042 : : {
1043 : 0 : son = SymbolTable_GetNthParamAny (sym, i);
1044 : 0 : if (SymbolTable_IsParameterVar (son))
1045 : : {
1046 : 0 : if (needComma)
1047 : : {
1048 : 0 : M2Printf_fprintf0 (f, (const char *) ",\\n ", 6);
1049 : : }
1050 : 0 : CalculateVarDirective (sym, son, true);
1051 : 0 : needComma = true;
1052 : : }
1053 : 0 : i += 1;
1054 : : }
1055 : 0 : M2Printf_fprintf0 (f, (const char *) ". */\\n\\n", 9);
1056 : 0 : }
1057 : :
1058 : :
1059 : : /*
1060 : : DoProcedure -
1061 : : */
1062 : :
1063 : 0 : static bool DoProcedure (unsigned int sym)
1064 : : {
1065 : 0 : unsigned int son;
1066 : 0 : unsigned int p;
1067 : 0 : unsigned int i;
1068 : 0 : bool found;
1069 : :
1070 : 0 : found = false;
1071 : 0 : M2Printf_fprintf0 (f, (const char *) "extern \"C\" ", 11);
1072 : 0 : if ((SymbolTable_GetType (sym)) == SymbolTable_NulSym)
1073 : : {
1074 : 0 : M2Printf_fprintf0 (f, (const char *) "void", 4);
1075 : : }
1076 : : else
1077 : : {
1078 : 0 : DoType (SymbolTable_GetType (sym));
1079 : : }
1080 : 0 : M2Printf_fprintf0 (f, (const char *) " ", 1);
1081 : 0 : DoName (sym);
1082 : 0 : M2Printf_fprintf0 (f, (const char *) " (", 2);
1083 : 0 : p = SymbolTable_NoOfParamAny (sym);
1084 : 0 : if (p == 0)
1085 : : {
1086 : 0 : M2Printf_fprintf0 (f, (const char *) "void", 4);
1087 : : }
1088 : : else
1089 : : {
1090 : : i = 1;
1091 : 0 : while (i <= p)
1092 : : {
1093 : 0 : son = SymbolTable_GetNthParamAny (sym, i);
1094 : 0 : if (SymbolTable_IsUnboundedParamAny (sym, i))
1095 : : {
1096 : 0 : DoUnbounded (son);
1097 : : }
1098 : : else
1099 : : {
1100 : 0 : DoType (SymbolTable_GetType (son));
1101 : 0 : M2Printf_fprintf0 (f, (const char *) " ", 1);
1102 : 0 : if (SymbolTable_IsParameterVar (son))
1103 : : {
1104 : 0 : found = true;
1105 : 0 : CalculateVarDirective (sym, son, false);
1106 : : }
1107 : : else
1108 : : {
1109 : 0 : DoParamName (son);
1110 : : }
1111 : : }
1112 : 0 : if (i < p)
1113 : : {
1114 : 0 : M2Printf_fprintf0 (f, (const char *) ", ", 2);
1115 : : }
1116 : 0 : i += 1;
1117 : : }
1118 : : }
1119 : 0 : M2Printf_fprintf0 (f, (const char *) ");\\n", 4);
1120 : 0 : return found;
1121 : : /* static analysis guarentees a RETURN statement will be used before here. */
1122 : : __builtin_unreachable ();
1123 : : }
1124 : :
1125 : :
1126 : : /*
1127 : : DoWriteSymbol -
1128 : : */
1129 : :
1130 : 0 : static void DoWriteSymbol (unsigned int sym)
1131 : : {
1132 : 0 : if (M2Base_IsBaseType (sym))
1133 : : {} /* empty. */
1134 : 0 : else if (M2System_IsSystemType (sym))
1135 : : {
1136 : : /* avoid dangling else. */
1137 : : }
1138 : 0 : else if (SymbolTable_IsType (sym))
1139 : : {
1140 : : /* avoid dangling else. */
1141 : : }
1142 : 0 : else if (SymbolTable_IsProcedure (sym))
1143 : : {
1144 : : /* avoid dangling else. */
1145 : 0 : if (DoProcedure (sym))
1146 : : {
1147 : 0 : AnnotateProcedure (sym);
1148 : : }
1149 : : }
1150 : 0 : else if (SymbolTable_IsConstString (sym))
1151 : : {
1152 : : /* avoid dangling else. */
1153 : : }
1154 : 0 : else if (SymbolTable_IsConstLit (sym))
1155 : : {
1156 : : /* avoid dangling else. */
1157 : : }
1158 : 0 : else if ((SymbolTable_IsVar (sym)) && ((SymbolTable_GetMode (sym)) == SymbolTable_ImmediateValue))
1159 : : {
1160 : : /* avoid dangling else. */
1161 : : }
1162 : 0 : else if (SymbolTable_IsVar (sym))
1163 : : {
1164 : : /* avoid dangling else. */
1165 : 0 : DoVar (sym);
1166 : : }
1167 : 0 : }
1168 : :
1169 : :
1170 : : /*
1171 : : DoCheckExported -
1172 : : */
1173 : :
1174 : 0 : static void DoCheckExported (unsigned int sym)
1175 : : {
1176 : 0 : if (SymbolTable_IsExported (mainModule, sym))
1177 : : {
1178 : 0 : DoWriteSymbol (sym);
1179 : : }
1180 : 0 : }
1181 : :
1182 : :
1183 : : /*
1184 : : IsUnique - returns TRUE if the combination of, n, and, t,
1185 : : is unique.
1186 : : */
1187 : :
1188 : 0 : static bool IsUnique (NameKey_Name n, unsigned int t)
1189 : : {
1190 : 0 : M2Swig_UnboundedSig p;
1191 : 0 : unsigned int h;
1192 : 0 : unsigned int i;
1193 : :
1194 : 0 : i = 1;
1195 : 0 : h = Indexing_HighIndice (uKey);
1196 : 0 : while (i <= h)
1197 : : {
1198 : 0 : p = static_cast<M2Swig_UnboundedSig> (Indexing_GetIndice (uKey, i));
1199 : 0 : if ((p->type == t) && (p->name == n))
1200 : : {
1201 : : return false;
1202 : : }
1203 : 0 : i += 1;
1204 : : }
1205 : 0 : h += 1;
1206 : 0 : Storage_ALLOCATE ((void **) &p, sizeof (M2Swig__T1));
1207 : 0 : p->type = t;
1208 : 0 : p->name = n;
1209 : 0 : Indexing_PutIndice (uKey, h, reinterpret_cast <void *> (p));
1210 : 0 : return true;
1211 : : /* static analysis guarentees a RETURN statement will be used before here. */
1212 : : __builtin_unreachable ();
1213 : : }
1214 : :
1215 : :
1216 : : /*
1217 : : IsTypeUnique - returns TRUE if type, t, has not been entered yet.
1218 : : */
1219 : :
1220 : 0 : static bool IsTypeUnique (unsigned int t)
1221 : : {
1222 : 0 : M2Swig_UnboundedSig p;
1223 : 0 : unsigned int h;
1224 : 0 : unsigned int i;
1225 : :
1226 : 0 : i = 1;
1227 : 0 : h = Indexing_HighIndice (uKey);
1228 : 0 : while (i <= h)
1229 : : {
1230 : 0 : p = static_cast<M2Swig_UnboundedSig> (Indexing_GetIndice (uKey, i));
1231 : 0 : if (p->type == t)
1232 : : {
1233 : : return false;
1234 : : }
1235 : 0 : i += 1;
1236 : : }
1237 : : return true;
1238 : : /* static analysis guarentees a RETURN statement will be used before here. */
1239 : : __builtin_unreachable ();
1240 : : }
1241 : :
1242 : :
1243 : : /*
1244 : : DoCheckUnbounded -
1245 : : */
1246 : :
1247 : 0 : static void DoCheckUnbounded (unsigned int sym)
1248 : : {
1249 : 0 : NameKey_Name name;
1250 : 0 : unsigned int type;
1251 : 0 : bool typeUnique;
1252 : :
1253 : 0 : if ((SymbolTable_IsParameter (sym)) && (SymbolTable_IsParameterUnbounded (sym)))
1254 : : {
1255 : 0 : name = SymbolTable_GetSymName (sym);
1256 : 0 : type = SymbolTable_GetType (SymbolTable_GetType (sym));
1257 : 0 : typeUnique = IsTypeUnique (type);
1258 : 0 : if (IsUnique (name, type))
1259 : : {
1260 : 0 : if (! includedArray)
1261 : : {
1262 : 0 : includedArray = true;
1263 : 0 : M2Printf_fprintf0 (f, (const char *) "%%include \"carrays.i\"\\n", 23);
1264 : : }
1265 : 0 : M2Printf_fprintf0 (f, (const char *) "%%", 2);
1266 : 0 : M2Printf_fprintf0 (f, (const char *) "apply (char *STRING, int LENGTH) { (", 36);
1267 : 0 : DoUnbounded (sym);
1268 : 0 : M2Printf_fprintf0 (f, (const char *) ") };\\n", 6);
1269 : 0 : if (typeUnique)
1270 : : {
1271 : 0 : M2Printf_fprintf0 (f, (const char *) "%%array_functions(", 18);
1272 : 0 : DoType (type);
1273 : 0 : M2Printf_fprintf0 (f, (const char *) ", ", 2);
1274 : 0 : DoType (type);
1275 : 0 : M2Printf_fprintf0 (f, (const char *) "Array);\\n", 9);
1276 : : }
1277 : : }
1278 : : }
1279 : 0 : }
1280 : :
1281 : :
1282 : : /*
1283 : : DoWriteFile -
1284 : : */
1285 : :
1286 : 0 : static void DoWriteFile (unsigned int sym)
1287 : : {
1288 : 0 : NameKey_Name n;
1289 : :
1290 : 0 : mainModule = sym;
1291 : 0 : n = SymbolTable_GetSymName (sym);
1292 : 0 : M2Printf_fprintf0 (f, (const char *) "/* Automatically generated by gm2 -fswig. */\\n", 47);
1293 : 0 : M2Printf_fprintf0 (f, (const char *) "%%", 2);
1294 : 0 : M2Printf_fprintf1 (f, (const char *) "module %a\\n\\n", 13, (const unsigned char *) &n, (sizeof (n)-1));
1295 : 0 : M2Printf_fprintf0 (f, (const char *) "%%", 2);
1296 : 0 : M2Printf_fprintf1 (f, (const char *) "include exception.i\\n\\n", 23, (const unsigned char *) &n, (sizeof (n)-1));
1297 : 0 : M2Printf_fprintf0 (f, (const char *) "%%", 2);
1298 : 0 : M2Printf_fprintf0 (f, (const char *) "exception {\\n", 13);
1299 : 0 : M2Printf_fprintf0 (f, (const char *) " try {\\n", 9);
1300 : 0 : M2Printf_fprintf0 (f, (const char *) " $action\\n", 14);
1301 : 0 : M2Printf_fprintf0 (f, (const char *) " } catch (int i) {\\n", 21);
1302 : 0 : M2Printf_fprintf0 (f, (const char *) " return NULL;\\n", 19);
1303 : 0 : M2Printf_fprintf0 (f, (const char *) " }\\n", 5);
1304 : 0 : M2Printf_fprintf0 (f, (const char *) "}\\n\\n", 5);
1305 : 0 : Lists_ForeachItemInListDo (Done, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DoCheckUnbounded});
1306 : 0 : M2Printf_fprintf0 (f, (const char *) "\\n%%{\\n", 7);
1307 : 0 : Lists_ForeachItemInListDo (Done, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DoCheckExported});
1308 : 0 : M2Printf_fprintf0 (f, (const char *) "%%}\\n\\n", 7);
1309 : 0 : Lists_ForeachItemInListDo (Done, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DoCheckExported});
1310 : 0 : }
1311 : :
1312 : :
1313 : : /*
1314 : : DoGenerateSwig -
1315 : : */
1316 : :
1317 : 0 : static void DoGenerateSwig (unsigned int sym)
1318 : : {
1319 : 0 : Init ();
1320 : 0 : name = DynamicStrings_ConCat (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (SymbolTable_GetSymName (sym))), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".i", 2)));
1321 : 0 : f = SFIO_OpenToWrite (name);
1322 : 0 : SymbolTable_ForeachExportedDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DoExported});
1323 : 0 : DoResolveOrder ();
1324 : 0 : DoWriteFile (sym);
1325 : 0 : FIO_Close (f);
1326 : 0 : name = DynamicStrings_KillString (name);
1327 : 0 : Kill ();
1328 : 0 : }
1329 : :
1330 : :
1331 : : /*
1332 : : Init -
1333 : : */
1334 : :
1335 : 0 : static void Init (void)
1336 : : {
1337 : 0 : Lists_InitList (&Done);
1338 : 0 : Lists_InitList (&ToDo);
1339 : 0 : uKey = Indexing_InitIndex (1);
1340 : 0 : includedArray = false;
1341 : 0 : }
1342 : :
1343 : :
1344 : : /*
1345 : : Kill -
1346 : : */
1347 : :
1348 : 0 : static void Kill (void)
1349 : : {
1350 : 0 : Lists_KillList (&Done);
1351 : 0 : Lists_KillList (&ToDo);
1352 : 0 : uKey = Indexing_KillIndex (uKey);
1353 : 0 : }
1354 : :
1355 : :
1356 : : /*
1357 : : GenerateSwigFile - if the -fswig option was specified then generate
1358 : : a swig interface file for the main module.
1359 : : */
1360 : :
1361 : 13201 : extern "C" void M2Swig_GenerateSwigFile (unsigned int sym)
1362 : : {
1363 : 13201 : if (M2Options_GenerateSwig)
1364 : : {
1365 : 0 : DoGenerateSwig (sym);
1366 : : }
1367 : 13201 : }
1368 : :
1369 : 14232 : extern "C" void _M2_M2Swig_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1370 : : {
1371 : 14232 : }
1372 : :
1373 : 0 : extern "C" void _M2_M2Swig_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1374 : : {
1375 : 0 : }
|