Annotation of GNUtools/cc/cp-edsel.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.