source: trunk/third/gcc/cp/edsel.c @ 8834

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