|
|
1.1 root 1: /* Interface to LUCID Cadillac system for GNU compiler.
2: Copyright (C) 1988, 1992, 1993 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20: #include "config.h"
21:
22: #include "tree.h"
23: #include "flags.h"
24: #include <stdio.h>
25: #include "cp-tree.h"
26: #include "obstack.h"
27:
28: #ifdef CADILLAC
29: #include <compilerreq.h>
30: #include <compilerconn.h>
31: #include <sys/time.h>
32: #include <sys/types.h>
33: #include <errno.h>
34: #include <sys/file.h>
35:
36: #define obstack_chunk_alloc xmalloc
37: #define obstack_chunk_free free
38:
39: void init_cadillac ();
40:
41: extern char *input_filename;
42: extern int lineno;
43:
44: /* Put random information we might want to get back from
45: Cadillac here. */
46: typedef struct
47: {
48: /* The connection to the Cadillac kernel. */
49: Connection *conn;
50:
51: /* Input and output file descriptors for Cadillac. */
52: short fd_input, fd_output;
53:
54: /* #include nesting of current file. */
55: short depth;
56:
57: /* State variables for the connection. */
58: char messages;
59: char conversion;
60: char emission;
61: char process_until;
62:
63: /* #if level of current file. */
64: int iflevel;
65:
66: /* Line number that starts current source file. */
67: int lineno;
68:
69: /* Name of current file. */
70: char *filename;
71:
72: /* Where to stop processing (if process_until is set). */
73: char *end_filename;
74: int end_position;
75:
76: } cadillac_struct;
77: static cadillac_struct cadillacObj;
78:
79: /* Nonzero if in the process of exiting. */
80: static int exiting;
81:
82: void cadillac_note_source ();
83: static void CWriteLanguageDecl ();
84: static void CWriteLanguageType ();
85: static void CWriteTopLevel ();
86: static void cadillac_note_filepos ();
87: static void cadillac_process_request (), cadillac_process_requests ();
88: static void cadillac_switch_source ();
89: static void exit_cadillac ();
90:
91: /* Blocking test. */
92: static int
93: readable_p (fd)
94: int fd;
95: {
96: fd_set f;
97:
98: FD_ZERO (&f);
99: FD_SET (fd, &f);
100:
101: return select (32, &f, NULL, NULL, 0) == 1;
102: }
103:
104: static CObjectType *tree_to_cadillac_map;
105: struct obstack cadillac_obstack;
106:
107:
108: #include "stack.h"
109:
110: struct context_level
111: {
112: struct stack_level base;
113:
114: tree context;
115: };
116:
117: /* Stack for maintaining contexts (in case functions or types are nested).
118: When defining a struct type, the `context' field is the RECORD_TYPE.
119: When defining a function, the `context' field is the FUNCTION_DECL. */
120:
121: static struct context_level *context_stack;
122:
123: static struct context_level *
124: push_context_level (stack, obstack)
125: struct stack_level *stack;
126: struct obstack *obstack;
127: {
128: struct context_level tem;
129:
130: tem.base.prev = stack;
131: return (struct context_level *)push_stack_level (obstack, &tem, sizeof (tem));
132: }
133:
134: /* Discard a level of search allocation. */
135:
136: static struct context_level *
137: pop_context_level (stack)
138: struct context_level *stack;
139: {
140: stack = (struct context_level *)pop_stack_level (stack);
141: return stack;
142: }
143:
144: void
145: init_cadillac ()
146: {
147: extern FILE *finput;
148: extern int errno;
149: CCompilerMessage* req;
150: cadillac_struct *cp = &cadillacObj;
151: int i;
152:
153: if (! flag_cadillac)
154: return;
155:
156: tree_to_cadillac_map = (CObjectType*) xmalloc (sizeof (CObjectType) * LAST_CPLUS_TREE_CODE);
157: for (i = 0; i < LAST_CPLUS_TREE_CODE; i++)
158: tree_to_cadillac_map[i] = MiscOType;
159: tree_to_cadillac_map[RECORD_TYPE] = StructOType;
160: tree_to_cadillac_map[UNION_TYPE] = UnionOType;
161: tree_to_cadillac_map[ENUMERAL_TYPE] = EnumTypeOType;
162: tree_to_cadillac_map[TYPE_DECL] = TypedefOType;
163: tree_to_cadillac_map[VAR_DECL] = VariableOType;
164: tree_to_cadillac_map[CONST_DECL] = EnumConstantOType;
165: tree_to_cadillac_map[FUNCTION_DECL] = FunctionOType;
166: tree_to_cadillac_map[FIELD_DECL] = FieldOType;
167:
168: #ifdef sun
169: on_exit (&exit_cadillac, 0);
170: #endif
171:
172: gcc_obstack_init (&cadillac_obstack);
173:
174: /* Yow! This is the way Cadillac was designed to deal with
175: Oregon C++ compiler! */
176: cp->fd_input = flag_cadillac;
177: cp->fd_output = flag_cadillac;
178:
179: /* Start in "turned-on" state. */
180: cp->messages = 1;
181: cp->conversion = 1;
182: cp->emission = 1;
183:
184: /* Establish a connection with Cadillac here. */
185: cp->conn = NewConnection (cp, cp->fd_input, cp->fd_output);
186:
187: CWriteHeader (cp->conn, WaitingMType, 0);
188: CWriteRequestBuffer (cp->conn);
189:
190: if (!readable_p (cp->fd_input))
191: ;
192:
193: req = CReadCompilerMessage (cp->conn);
194:
195: if (!req)
196: switch (errno)
197: {
198: case EWOULDBLOCK:
199: sleep (5);
200: return;
201:
202: case 0:
203: fatal ("init_cadillac: EOF on connection to kernel, exiting\n");
204: break;
205:
206: default:
207: perror ("Editor to kernel connection");
208: exit (0);
209: }
210: }
211:
212: static void
213: cadillac_process_requests (conn)
214: Connection *conn;
215: {
216: CCompilerMessage *req;
217: while (req = (CCompilerMessage*) CPeekNextRequest (conn))
218: {
219: req = CReadCompilerMessage (conn);
220: cadillac_process_request (&cadillacObj, req);
221: }
222: }
223:
224: static void
225: cadillac_process_request (cp, req)
226: cadillac_struct *cp;
227: CCompilerMessage *req;
228: {
229: if (! req)
230: return;
231:
232: switch (req->reqType)
233: {
234: case ProcessUntilMType:
235: if (cp->process_until)
236: my_friendly_abort (23);
237: cp->process_until = 1;
238: /* This is not really right. */
239: cp->end_position = ((CCompilerCommand*)req)->processuntil.position;
240: #if 0
241: cp->end_filename = req->processuntil.filename;
242: #endif
243: break;
244:
245: case CommandMType:
246: switch (req->header.data)
247: {
248: case MessagesOnCType:
249: cp->messages = 1;
250: break;
251: case MessagesOffCType:
252: cp->messages = 0;
253: break;
254: case ConversionOnCType:
255: cp->conversion = 1;
256: break;
257: case ConversionOffCType:
258: cp->conversion = 0;
259: break;
260: case EmissionOnCType:
261: cp->emission = 1;
262: break;
263: case EmissionOffCType:
264: cp->emission = 0;
265: break;
266:
267: case FinishAnalysisCType:
268: return;
269:
270: case PuntAnalysisCType:
271: case ContinueAnalysisCType:
272: case GotoFileposCType:
273: case OpenSucceededCType:
274: case OpenFailedCType:
275: fprintf (stderr, "request type %d not implemented\n", req->reqType);
276: return;
277:
278: case DieCType:
279: if (! exiting)
280: my_friendly_abort (24);
281: return;
282:
283: }
284: break;
285:
286: default:
287: fatal ("unknown request type %d", req->reqType);
288: }
289: }
290:
291: void
292: cadillac_start ()
293: {
294: Connection *conn = cadillacObj.conn;
295: CCompilerMessage *req;
296:
297: /* Let Cadillac know that we start in C++ language scope. */
298: CWriteHeader (conn, ForeignLinkageMType, LinkCPlus);
299: CWriteLength (conn);
300: CWriteRequestBuffer (conn);
301:
302: cadillac_process_requests (conn);
303: }
304:
305: static void
306: cadillac_printf (msg, name)
307: {
308: if (cadillacObj.messages)
309: printf ("[%s,%4d] %s `%s'\n", input_filename, lineno, msg, name);
310: }
311:
312: void
313: cadillac_start_decl (decl)
314: tree decl;
315: {
316: Connection *conn = cadillacObj.conn;
317: CObjectType object_type = tree_to_cadillac_map [TREE_CODE (decl)];
318:
319: if (context_stack)
320: switch (TREE_CODE (context_stack->context))
321: {
322: case FUNCTION_DECL:
323: /* Currently, cadillac only implements top-level forms. */
324: return;
325: case RECORD_TYPE:
326: case UNION_TYPE:
327: cadillac_printf ("start class-level decl", IDENTIFIER_POINTER (DECL_NAME (decl)));
328: break;
329: default:
330: my_friendly_abort (25);
331: }
332: else
333: {
334: cadillac_printf ("start top-level decl", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
335: CWriteTopLevel (conn, StartMType);
336: }
337:
338: CWriteLanguageDecl (conn, decl, tree_to_cadillac_map[TREE_CODE (decl)]);
339: CWriteRequestBuffer (conn);
340: cadillac_process_requests (conn);
341: }
342:
343: void
344: cadillac_finish_decl (decl)
345: tree decl;
346: {
347: Connection *conn = cadillacObj.conn;
348:
349: if (context_stack)
350: switch (TREE_CODE (context_stack->context))
351: {
352: case FUNCTION_DECL:
353: return;
354: case RECORD_TYPE:
355: case UNION_TYPE:
356: cadillac_printf ("end class-level decl", IDENTIFIER_POINTER (DECL_NAME (decl)));
357: CWriteHeader (conn, EndDefMType, 0);
358: CWriteLength (conn);
359: break;
360: default:
361: my_friendly_abort (26);
362: }
363: else
364: {
365: cadillac_printf ("end top-level decl", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
366: CWriteHeader (conn, EndDefMType, 0);
367: CWriteLength (conn);
368: CWriteTopLevel (conn, StopMType);
369: }
370:
371: CWriteRequestBuffer (conn);
372: cadillac_process_requests (conn);
373: }
374:
375: void
376: cadillac_start_function (fndecl)
377: tree fndecl;
378: {
379: Connection *conn = cadillacObj.conn;
380:
381: if (context_stack)
382: /* nested functions not yet handled. */
383: my_friendly_abort (27);
384:
385: cadillac_printf ("start top-level function", lang_printable_name (fndecl));
386: context_stack = push_context_level (context_stack, &cadillac_obstack);
387: context_stack->context = fndecl;
388:
389: CWriteTopLevel (conn, StartMType);
390: my_friendly_assert (TREE_CODE (fndecl) == FUNCTION_DECL, 202);
391: CWriteLanguageDecl (conn, fndecl,
392: (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE
393: ? MemberFnOType : FunctionOType));
394: CWriteRequestBuffer (conn);
395: cadillac_process_requests (conn);
396: }
397:
398: void
399: cadillac_finish_function (fndecl)
400: tree fndecl;
401: {
402: Connection *conn = cadillacObj.conn;
403:
404: cadillac_printf ("end top-level function", lang_printable_name (fndecl));
405: context_stack = pop_context_level (context_stack);
406:
407: if (context_stack)
408: /* nested functions not yet implemented. */
409: my_friendly_abort (28);
410:
411: CWriteHeader (conn, EndDefMType, 0);
412: CWriteLength (conn);
413: CWriteTopLevel (conn, StopMType);
414: CWriteRequestBuffer (conn);
415: cadillac_process_requests (conn);
416: }
417:
418: void
419: cadillac_finish_anon_union (decl)
420: tree decl;
421: {
422: Connection *conn = cadillacObj.conn;
423:
424: if (! global_bindings_p ())
425: return;
426: cadillac_printf ("finish top-level anon union", "");
427: CWriteHeader (conn, EndDefMType, 0);
428: CWriteLength (conn);
429: CWriteTopLevel (conn, StopMType);
430: CWriteRequestBuffer (conn);
431: cadillac_process_requests (conn);
432: }
433:
434: void
435: cadillac_start_enum (type)
436: tree type;
437: {
438: Connection *conn = cadillacObj.conn;
439:
440: tree name = TYPE_NAME (type);
441:
442: if (TREE_CODE (name) == TYPE_DECL)
443: name = DECL_NAME (name);
444:
445: if (context_stack)
446: switch (TREE_CODE (context_stack->context))
447: {
448: case FUNCTION_DECL:
449: return;
450: case RECORD_TYPE:
451: case UNION_TYPE:
452: break;
453: default:
454: my_friendly_abort (29);
455: }
456: else
457: {
458: cadillac_printf ("start top-level enum", IDENTIFIER_POINTER (name));
459: CWriteTopLevel (conn, StartMType);
460: }
461:
462: CWriteLanguageType (conn, type, tree_to_cadillac_map[ENUMERAL_TYPE]);
463: }
464:
465: void
466: cadillac_finish_enum (type)
467: tree type;
468: {
469: Connection *conn = cadillacObj.conn;
470: tree name = TYPE_NAME (type);
471:
472: if (TREE_CODE (name) == TYPE_DECL)
473: name = DECL_NAME (name);
474:
475: if (context_stack)
476: switch (TREE_CODE (context_stack->context))
477: {
478: case FUNCTION_DECL:
479: return;
480: case RECORD_TYPE:
481: case UNION_TYPE:
482: CWriteHeader (conn, EndDefMType, 0);
483: CWriteLength (conn);
484: break;
485: default:
486: my_friendly_abort (30);
487: }
488: else
489: {
490: CWriteHeader (conn, EndDefMType, 0);
491: CWriteLength (conn);
492: cadillac_printf ("finish top-level enum", IDENTIFIER_POINTER (name));
493: CWriteTopLevel (conn, StopMType);
494: }
495:
496: CWriteRequestBuffer (conn);
497: cadillac_process_requests (conn);
498: }
499:
500: void
501: cadillac_start_struct (type)
502: tree type;
503: {
504: Connection *conn = cadillacObj.conn;
505: tree name = TYPE_NAME (type);
506:
507: if (TREE_CODE (name) == TYPE_DECL)
508: name = DECL_NAME (name);
509:
510: if (context_stack)
511: switch (TREE_CODE (context_stack->context))
512: {
513: case FUNCTION_DECL:
514: return;
515: case RECORD_TYPE:
516: case UNION_TYPE:
517: return;
518: default:
519: my_friendly_abort (31);
520: }
521: else
522: {
523: cadillac_printf ("start struct", IDENTIFIER_POINTER (name));
524: CWriteTopLevel (conn, StartMType);
525: }
526:
527: context_stack = push_context_level (context_stack, &cadillac_obstack);
528: context_stack->context = type;
529:
530: CWriteLanguageType (conn, type,
531: TYPE_LANG_SPECIFIC (type) && CLASSTYPE_DECLARED_CLASS (type) ? ClassOType : tree_to_cadillac_map[TREE_CODE (type)]);
532: }
533:
534: void
535: cadillac_finish_struct (type)
536: tree type;
537: {
538: Connection *conn = cadillacObj.conn;
539: tree name = TYPE_NAME (type);
540:
541: if (TREE_CODE (name) == TYPE_DECL)
542: name = DECL_NAME (name);
543:
544: context_stack = pop_context_level (context_stack);
545: if (context_stack)
546: return;
547:
548: cadillac_printf ("finish struct", IDENTIFIER_POINTER (name));
549: CWriteHeader (conn, EndDefMType, 0);
550: CWriteLength (conn);
551: CWriteTopLevel (conn, StopMType);
552: CWriteRequestBuffer (conn);
553: cadillac_process_requests (conn);
554: }
555:
556: void
557: cadillac_finish_exception (type)
558: tree type;
559: {
560: Connection *conn = cadillacObj.conn;
561:
562: fatal ("cadillac_finish_exception");
563: CWriteHeader (conn, EndDefMType, 0);
564: CWriteLength (conn);
565: CWriteTopLevel (conn, StopMType);
566: CWriteRequestBuffer (conn);
567: cadillac_process_requests (conn);
568: }
569:
570: void
571: cadillac_push_class (type)
572: tree type;
573: {
574: }
575:
576: void
577: cadillac_pop_class ()
578: {
579: }
580:
581: void
582: cadillac_push_lang (name)
583: tree name;
584: {
585: Connection *conn = cadillacObj.conn;
586: CLinkLanguageType m;
587:
588: if (name == lang_name_cplusplus)
589: m = LinkCPlus;
590: else if (name == lang_name_c)
591: m = LinkC;
592: else
593: my_friendly_abort (32);
594: CWriteHeader (conn, ForeignLinkageMType, m);
595: CWriteRequestBuffer (conn);
596: cadillac_process_requests (conn);
597: }
598:
599: void
600: cadillac_pop_lang ()
601: {
602: Connection *conn = cadillacObj.conn;
603:
604: CWriteHeader (conn, ForeignLinkageMType, LinkPop);
605: CWriteRequestBuffer (conn);
606: cadillac_process_requests (conn);
607: }
608:
609: void
610: cadillac_finish_stmt ()
611: {
612: }
613:
614: void
615: cadillac_note_source ()
616: {
617: cadillacObj.lineno = lineno;
618: cadillacObj.filename = input_filename;
619: }
620:
621: static void
622: CWriteTopLevel (conn, m)
623: Connection *conn;
624: CMessageSubType m;
625: {
626: static context_id = 0;
627: CWriteHeader (conn, TopLevelFormMType, m);
628: cadillac_note_filepos ();
629:
630: /* Eventually, this will point somewhere into the digest file. */
631: context_id += 1;
632: CWriteSomething (conn, &context_id, sizeof (BITS32));
633:
634: CWriteSomething (conn, &cadillacObj.iflevel, sizeof (BITS32));
635: CWriteLength (conn);
636: }
637:
638: static void
639: cadillac_note_filepos ()
640: {
641: extern FILE *finput;
642: int pos = ftell (finput);
643: CWriteSomething (cadillacObj.conn, &pos, sizeof (BITS32));
644: }
645:
646: void
647: cadillac_switch_source (startflag)
648: int startflag;
649: {
650: Connection *conn = cadillacObj.conn;
651: /* Send out the name of the source file being compiled. */
652:
653: CWriteHeader (conn, SourceFileMType, startflag ? StartMType : StopMType);
654: CWriteSomething (conn, &cadillacObj.depth, sizeof (BITS16));
655: CWriteVstring0 (conn, input_filename);
656: CWriteLength (conn);
657: CWriteRequestBuffer (conn);
658: cadillac_process_requests (conn);
659: }
660:
661: void
662: cadillac_push_source ()
663: {
664: cadillacObj.depth += 1;
665: cadillac_switch_source (1);
666: }
667:
668: void
669: cadillac_pop_source ()
670: {
671: cadillacObj.depth -= 1;
672: cadillac_switch_source (0);
673: }
674:
675: struct cadillac_mdep
676: {
677: short object_type;
678: char linkage;
679: char access;
680: short length;
681: };
682:
683: static void
684: CWriteLanguageElem (conn, p, name)
685: Connection *conn;
686: struct cadillac_mdep *p;
687: char *name;
688: {
689: CWriteSomething (conn, &p->object_type, sizeof (BITS16));
690: CWriteSomething (conn, &p->linkage, sizeof (BITS8));
691: CWriteSomething (conn, &p->access, sizeof (BITS8));
692: CWriteSomething (conn, &p->length, sizeof (BITS16));
693: CWriteVstring0 (conn, name);
694:
695: #if 0
696: /* Don't write date_type. */
697: CWriteVstring0 (conn, "");
698: #endif
699: CWriteLength (conn);
700: }
701:
702: static void
703: CWriteLanguageDecl (conn, decl, object_type)
704: Connection *conn;
705: tree decl;
706: CObjectType object_type;
707: {
708: struct cadillac_mdep foo;
709: tree name;
710:
711: CWriteHeader (conn, LanguageElementMType, StartDefineMType);
712: foo.object_type = object_type;
713: if (decl_type_context (decl))
714: {
715: foo.linkage = ParentLinkage;
716: if (TREE_PRIVATE (decl))
717: foo.access = PrivateAccess;
718: else if (TREE_PROTECTED (decl))
719: foo.access = ProtectedAccess;
720: else
721: foo.access = PublicAccess;
722: }
723: else
724: {
725: if (TREE_PUBLIC (decl))
726: foo.linkage = GlobalLinkage;
727: else
728: foo.linkage = FileLinkage;
729: foo.access = PublicAccess;
730: }
731: name = DECL_NAME (decl);
732: foo.length = IDENTIFIER_LENGTH (name);
733:
734: CWriteLanguageElem (conn, &foo, IDENTIFIER_POINTER (name));
735: CWriteRequestBuffer (conn);
736: cadillac_process_requests (conn);
737: }
738:
739: static void
740: CWriteLanguageType (conn, type, object_type)
741: Connection *conn;
742: tree type;
743: CObjectType object_type;
744: {
745: struct cadillac_mdep foo;
746: tree name = TYPE_NAME (type);
747:
748: CWriteHeader (conn, LanguageElementMType, StartDefineMType);
749: foo.object_type = object_type;
750: if (current_class_type)
751: {
752: foo.linkage = ParentLinkage;
753: if (TREE_PRIVATE (type))
754: foo.access = PrivateAccess;
755: else if (TREE_PROTECTED (type))
756: foo.access = ProtectedAccess;
757: else
758: foo.access = PublicAccess;
759: }
760: else
761: {
762: foo.linkage = NoLinkage;
763: foo.access = PublicAccess;
764: }
765: if (TREE_CODE (name) == TYPE_DECL)
766: name = DECL_NAME (name);
767:
768: foo.length = IDENTIFIER_LENGTH (name);
769:
770: CWriteLanguageElem (conn, &foo, IDENTIFIER_POINTER (name));
771: CWriteRequestBuffer (conn);
772: cadillac_process_requests (conn);
773: }
774:
775: static void
776: CWriteUseObject (conn, type, object_type, use)
777: Connection *conn;
778: tree type;
779: CObjectType object_type;
780: CMessageSubType use;
781: {
782: struct cadillac_mdep foo;
783: tree name = NULL_TREE;
784:
785: CWriteHeader (conn, LanguageElementMType, use);
786: foo.object_type = object_type;
787: if (current_class_type)
788: {
789: foo.linkage = ParentLinkage;
790: if (TREE_PRIVATE (type))
791: foo.access = PrivateAccess;
792: else if (TREE_PROTECTED (type))
793: foo.access = ProtectedAccess;
794: else
795: foo.access = PublicAccess;
796: }
797: else
798: {
799: foo.linkage = NoLinkage;
800: foo.access = PublicAccess;
801: }
802: switch (TREE_CODE (type))
803: {
804: case VAR_DECL:
805: case FIELD_DECL:
806: case TYPE_DECL:
807: case CONST_DECL:
808: case FUNCTION_DECL:
809: name = DECL_NAME (type);
810: break;
811:
812: default:
813: my_friendly_abort (33);
814: }
815:
816: foo.length = IDENTIFIER_LENGTH (name);
817:
818: CWriteLanguageElem (conn, &foo, IDENTIFIER_POINTER (name));
819: CWriteRequestBuffer (conn);
820: cadillac_process_requests (conn);
821: }
822:
823: /* Here's how we exit under cadillac. */
824:
825: static void
826: exit_cadillac ()
827: {
828: extern int errorcount;
829:
830: Connection *conn = cadillacObj.conn;
831:
832: if (flag_cadillac)
833: {
834: CCompilerMessage *req;
835:
836: CWriteHeader (conn, FinishedMType,
837: errorcount ? 0 : CsObjectWritten | CsComplete);
838: /* Bye, bye! */
839: CWriteRequestBuffer (conn);
840:
841: /* Block on read. */
842: while (! readable_p (cadillacObj.fd_input))
843: {
844: if (exiting)
845: my_friendly_abort (34);
846: exiting = 1;
847: }
848: exiting = 1;
849:
850: req = CReadCompilerMessage (conn);
851: cadillac_process_request (&cadillacObj, req);
852: }
853: }
854:
855: #else
856: /* Stubs. */
857: void init_cadillac () {}
858: void cadillac_start () {}
859: void cadillac_start_decl (decl)
860: tree decl;
861: {}
862: void
863: cadillac_finish_decl (decl)
864: tree decl;
865: {}
866: void
867: cadillac_start_function (fndecl)
868: tree fndecl;
869: {}
870: void
871: cadillac_finish_function (fndecl)
872: tree fndecl;
873: {}
874: void
875: cadillac_finish_anon_union (decl)
876: tree decl;
877: {}
878: void
879: cadillac_start_enum (type)
880: tree type;
881: {}
882: void
883: cadillac_finish_enum (type)
884: tree type;
885: {}
886: void
887: cadillac_start_struct (type)
888: tree type;
889: {}
890: void
891: cadillac_finish_struct (type)
892: tree type;
893: {}
894: void
895: cadillac_finish_exception (type)
896: tree type;
897: {}
898: void
899: cadillac_push_class (type)
900: tree type;
901: {}
902: void
903: cadillac_pop_class ()
904: {}
905: void
906: cadillac_push_lang (name)
907: tree name;
908: {}
909: void
910: cadillac_pop_lang ()
911: {}
912: void
913: cadillac_note_source ()
914: {}
915: void
916: cadillac_finish_stmt ()
917: {}
918: void
919: cadillac_switch_source ()
920: {}
921: void
922: cadillac_push_source ()
923: {}
924: void
925: cadillac_pop_source ()
926: {}
927: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.