This commit was manufactured by cvs2svn to create tag 'FreeBSD-release/1.0'.
[unix-history] / gnu / usr.bin / cc / cc1plus / cp-edsel.c
CommitLineData
9bf86ebb
PR
1/* Interface to LUCID Cadillac system for GNU compiler.
2 Copyright (C) 1988, 1992, 1993 Free Software Foundation, Inc.
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
18the 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
39void init_cadillac ();
40
41extern char *input_filename;
42extern int lineno;
43
44/* Put random information we might want to get back from
45 Cadillac here. */
46typedef 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;
77static cadillac_struct cadillacObj;
78
79/* Nonzero if in the process of exiting. */
80static int exiting;
81
82void cadillac_note_source ();
83static void CWriteLanguageDecl ();
84static void CWriteLanguageType ();
85static void CWriteTopLevel ();
86static void cadillac_note_filepos ();
87static void cadillac_process_request (), cadillac_process_requests ();
88static void cadillac_switch_source ();
89static void exit_cadillac ();
90
91/* Blocking test. */
92static int
93readable_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
104static CObjectType *tree_to_cadillac_map;
105struct obstack cadillac_obstack;
106
107\f
108#include "stack.h"
109
110struct 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
121static struct context_level *context_stack;
122
123static struct context_level *
124push_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
136static struct context_level *
137pop_context_level (stack)
138 struct context_level *stack;
139{
140 stack = (struct context_level *)pop_stack_level (stack);
141 return stack;
142}
143
144void
145init_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
212static void
213cadillac_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
224static void
225cadillac_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\f
291void
292cadillac_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
305static void
306cadillac_printf (msg, name)
307{
308 if (cadillacObj.messages)
309 printf ("[%s,%4d] %s `%s'\n", input_filename, lineno, msg, name);
310}
311
312void
313cadillac_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
343void
344cadillac_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
375void
376cadillac_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
398void
399cadillac_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
418void
419cadillac_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
434void
435cadillac_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
465void
466cadillac_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
500void
501cadillac_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
534void
535cadillac_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
556void
557cadillac_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
570void
571cadillac_push_class (type)
572 tree type;
573{
574}
575
576void
577cadillac_pop_class ()
578{
579}
580
581void
582cadillac_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
599void
600cadillac_pop_lang ()
601{
602 Connection *conn = cadillacObj.conn;
603
604 CWriteHeader (conn, ForeignLinkageMType, LinkPop);
605 CWriteRequestBuffer (conn);
606 cadillac_process_requests (conn);
607}
608
609void
610cadillac_finish_stmt ()
611{
612}
613\f
614void
615cadillac_note_source ()
616{
617 cadillacObj.lineno = lineno;
618 cadillacObj.filename = input_filename;
619}
620
621static void
622CWriteTopLevel (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
638static void
639cadillac_note_filepos ()
640{
641 extern FILE *finput;
642 int pos = ftell (finput);
643 CWriteSomething (cadillacObj.conn, &pos, sizeof (BITS32));
644}
645
646void
647cadillac_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
661void
662cadillac_push_source ()
663{
664 cadillacObj.depth += 1;
665 cadillac_switch_source (1);
666}
667
668void
669cadillac_pop_source ()
670{
671 cadillacObj.depth -= 1;
672 cadillac_switch_source (0);
673}
674
675struct cadillac_mdep
676{
677 short object_type;
678 char linkage;
679 char access;
680 short length;
681};
682
683static void
684CWriteLanguageElem (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
702static void
703CWriteLanguageDecl (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
739static void
740CWriteLanguageType (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
775static void
776CWriteUseObject (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\f
823/* Here's how we exit under cadillac. */
824
825static void
826exit_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. */
857void init_cadillac () {}
858void cadillac_start () {}
859void cadillac_start_decl (decl)
860 tree decl;
861{}
862void
863cadillac_finish_decl (decl)
864 tree decl;
865{}
866void
867cadillac_start_function (fndecl)
868 tree fndecl;
869{}
870void
871cadillac_finish_function (fndecl)
872 tree fndecl;
873{}
874void
875cadillac_finish_anon_union (decl)
876 tree decl;
877{}
878void
879cadillac_start_enum (type)
880 tree type;
881{}
882void
883cadillac_finish_enum (type)
884 tree type;
885{}
886void
887cadillac_start_struct (type)
888 tree type;
889{}
890void
891cadillac_finish_struct (type)
892 tree type;
893{}
894void
895cadillac_finish_exception (type)
896 tree type;
897{}
898void
899cadillac_push_class (type)
900 tree type;
901{}
902void
903cadillac_pop_class ()
904{}
905void
906cadillac_push_lang (name)
907 tree name;
908{}
909void
910cadillac_pop_lang ()
911{}
912void
913cadillac_note_source ()
914{}
915void
916cadillac_finish_stmt ()
917{}
918void
919cadillac_switch_source ()
920{}
921void
922cadillac_push_source ()
923{}
924void
925cadillac_pop_source ()
926{}
927#endif