Annotation of GNUtools/cc/genflags.c, revision 1.1

1.1     ! root        1: /* Generate from machine description:
        !             2: 
        !             3:    - some flags HAVE_... saying which simple standard instructions are
        !             4:    available for this machine.
        !             5:    Copyright (C) 1987, 1991 Free Software Foundation, Inc.
        !             6: 
        !             7: This file is part of GNU CC.
        !             8: 
        !             9: GNU CC is free software; you can redistribute it and/or modify
        !            10: it under the terms of the GNU General Public License as published by
        !            11: the Free Software Foundation; either version 2, or (at your option)
        !            12: any later version.
        !            13: 
        !            14: GNU CC is distributed in the hope that it will be useful,
        !            15: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            16: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            17: GNU General Public License for more details.
        !            18: 
        !            19: You should have received a copy of the GNU General Public License
        !            20: along with GNU CC; see the file COPYING.  If not, write to
        !            21: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            22: 
        !            23: 
        !            24: #include <stdio.h>
        !            25: #include "hconfig.h"
        !            26: #include "rtl.h"
        !            27: #include "obstack.h"
        !            28: 
        !            29: static struct obstack obstack;
        !            30: struct obstack *rtl_obstack = &obstack;
        !            31: 
        !            32: #define obstack_chunk_alloc xmalloc
        !            33: #define obstack_chunk_free free
        !            34: 
        !            35: extern void free ();
        !            36: extern rtx read_rtx ();
        !            37: 
        !            38: char *xmalloc ();
        !            39: static void fatal ();
        !            40: void fancy_abort ();
        !            41: 
        !            42: /* Names for patterns.  Need to allow linking with print-rtl.  */
        !            43: char **insn_name_ptr;
        !            44: 
        !            45: /* Obstacks to remember normal, and call insns.  */
        !            46: static struct obstack call_obstack, normal_obstack;
        !            47: 
        !            48: /* Max size of names encountered.  */
        !            49: static int max_id_len;
        !            50: 
        !            51: /* Count the number of match_operand's found.  */
        !            52: static int
        !            53: num_operands (x)
        !            54:      rtx x;
        !            55: {
        !            56:   int count = 0;
        !            57:   int i, j;
        !            58:   enum rtx_code code = GET_CODE (x);
        !            59:   char *format_ptr = GET_RTX_FORMAT (code);
        !            60: 
        !            61:   if (code == MATCH_OPERAND)
        !            62:     return 1;
        !            63: 
        !            64:   if (code == MATCH_OPERATOR || code == MATCH_PARALLEL)
        !            65:     count++;
        !            66: 
        !            67:   for (i = 0; i < GET_RTX_LENGTH (code); i++)
        !            68:     {
        !            69:       switch (*format_ptr++)
        !            70:        {
        !            71:        case 'u':
        !            72:        case 'e':
        !            73:          count += num_operands (XEXP (x, i));
        !            74:          break;
        !            75: 
        !            76:        case 'E':
        !            77:          if (XVEC (x, i) != NULL)
        !            78:            for (j = 0; j < XVECLEN (x, i); j++)
        !            79:              count += num_operands (XVECEXP (x, i, j));
        !            80: 
        !            81:          break;
        !            82:        }
        !            83:     }
        !            84: 
        !            85:   return count;
        !            86: }
        !            87: 
        !            88: /* Print out prototype information for a function.  */
        !            89: static void
        !            90: gen_proto (insn)
        !            91:      rtx insn;
        !            92: {
        !            93:   int num = num_operands (insn);
        !            94:   printf ("extern rtx gen_%-*s PROTO((", max_id_len, XSTR (insn, 0));
        !            95: 
        !            96:   if (num == 0)
        !            97:     printf ("void");
        !            98:   else
        !            99:     {
        !           100:       while (num-- > 1)
        !           101:        printf ("rtx, ");
        !           102: 
        !           103:       printf ("rtx");
        !           104:     }
        !           105: 
        !           106:   printf ("));\n");
        !           107: }
        !           108: 
        !           109: /* Print out a function declaration without a prototype.  */
        !           110: static void
        !           111: gen_nonproto (insn)
        !           112:      rtx insn;
        !           113: {
        !           114:   printf ("extern rtx gen_%s ();\n", XSTR (insn, 0));
        !           115: }
        !           116: 
        !           117: static void
        !           118: gen_insn (insn)
        !           119:      rtx insn;
        !           120: {
        !           121:   char *name = XSTR (insn, 0);
        !           122:   char *p;
        !           123:   struct obstack *obstack_ptr;
        !           124:   int len;
        !           125: 
        !           126:   /* Don't mention instructions whose names are the null string.
        !           127:      They are in the machine description just to be recognized.  */
        !           128:   len = strlen (name);
        !           129:   if (len == 0)
        !           130:     return;
        !           131: 
        !           132:   if (len > max_id_len)
        !           133:     max_id_len = len;
        !           134: 
        !           135:   printf ("#define HAVE_%s ", name);
        !           136:   if (strlen (XSTR (insn, 2)) == 0)
        !           137:     printf ("1\n");
        !           138:   else
        !           139:     {
        !           140:       /* Write the macro definition, putting \'s at the end of each line,
        !           141:         if more than one.  */
        !           142:       printf ("(");
        !           143:       for (p = XSTR (insn, 2); *p; p++)
        !           144:        {
        !           145:          if (*p == '\n')
        !           146:            printf (" \\\n");
        !           147:          else
        !           148:            printf ("%c", *p);
        !           149:        }
        !           150:       printf (")\n");
        !           151:     }
        !           152: 
        !           153:   /* Save the current insn, so that we can later put out appropriate
        !           154:      prototypes.  At present, most md files have the wrong number of
        !           155:      arguments for the call insns (call, call_value, call_pop,
        !           156:      call_value_pop) ignoring the extra arguments that are passed for
        !           157:      some machines, so by default, turn off the prototype.  */
        !           158: 
        !           159:   obstack_ptr = (name[0] == 'c'
        !           160:                 && (!strcmp (name, "call")
        !           161:                     || !strcmp (name, "call_value")
        !           162:                     || !strcmp (name, "call_pop")
        !           163:                     || !strcmp (name, "call_value_pop")))
        !           164:     ? &call_obstack : &normal_obstack;
        !           165: 
        !           166:   obstack_grow (obstack_ptr, &insn, sizeof (rtx));
        !           167: }
        !           168: 
        !           169: char *
        !           170: xmalloc (size)
        !           171:      unsigned size;
        !           172: {
        !           173:   register char *val = (char *) malloc (size);
        !           174: 
        !           175:   if (val == 0)
        !           176:     fatal ("virtual memory exhausted");
        !           177: 
        !           178:   return val;
        !           179: }
        !           180: 
        !           181: char *
        !           182: xrealloc (ptr, size)
        !           183:      char *ptr;
        !           184:      unsigned size;
        !           185: {
        !           186:   char *result = (char *) realloc (ptr, size);
        !           187:   if (!result)
        !           188:     fatal ("virtual memory exhausted");
        !           189:   return result;
        !           190: }
        !           191: 
        !           192: static void
        !           193: fatal (s, a1, a2)
        !           194:      char *s;
        !           195: {
        !           196:   fprintf (stderr, "genflags: ");
        !           197:   fprintf (stderr, s, a1, a2);
        !           198:   fprintf (stderr, "\n");
        !           199:   exit (FATAL_EXIT_CODE);
        !           200: }
        !           201: 
        !           202: /* More 'friendly' abort that prints the line and file.
        !           203:    config.h can #define abort fancy_abort if you like that sort of thing.  */
        !           204: 
        !           205: void
        !           206: fancy_abort ()
        !           207: {
        !           208:   fatal ("Internal gcc abort.");
        !           209: }
        !           210: 
        !           211: int
        !           212: main (argc, argv)
        !           213:      int argc;
        !           214:      char **argv;
        !           215: {
        !           216:   rtx desc;
        !           217:   rtx dummy;
        !           218:   rtx *call_insns;
        !           219:   rtx *normal_insns;
        !           220:   rtx *insn_ptr;
        !           221:   FILE *infile;
        !           222:   register int c;
        !           223: 
        !           224:   obstack_init (rtl_obstack);
        !           225:   obstack_init (&call_obstack);
        !           226:   obstack_init (&normal_obstack);
        !           227: 
        !           228:   if (argc <= 1)
        !           229:     fatal ("No input file name.");
        !           230: 
        !           231:   infile = fopen (argv[1], "r");
        !           232:   if (infile == 0)
        !           233:     {
        !           234:       perror (argv[1]);
        !           235:       exit (FATAL_EXIT_CODE);
        !           236:     }
        !           237: 
        !           238:   init_rtl ();
        !           239: 
        !           240:   printf ("/* Generated automatically by the program `genflags'\n\
        !           241: from the machine description file `md'.  */\n\n");
        !           242: 
        !           243:   /* Read the machine description.  */
        !           244: 
        !           245:   while (1)
        !           246:     {
        !           247:       c = read_skip_spaces (infile);
        !           248:       if (c == EOF)
        !           249:        break;
        !           250:       ungetc (c, infile);
        !           251: 
        !           252:       desc = read_rtx (infile);
        !           253:       if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
        !           254:        gen_insn (desc);
        !           255:     }
        !           256: 
        !           257:   /* Print out the prototypes now.  */
        !           258:   dummy = (rtx)0;
        !           259:   obstack_grow (&call_obstack, &dummy, sizeof (rtx));
        !           260:   call_insns = (rtx *) obstack_finish (&call_obstack);
        !           261: 
        !           262:   obstack_grow (&normal_obstack, &dummy, sizeof (rtx));
        !           263:   normal_insns = (rtx *) obstack_finish (&normal_obstack);
        !           264: 
        !           265:   printf ("\n#ifndef NO_MD_PROTOTYPES\n");
        !           266:   for (insn_ptr = normal_insns; *insn_ptr; insn_ptr++)
        !           267:     gen_proto (*insn_ptr);
        !           268: 
        !           269:   printf ("\n#ifdef MD_CALL_PROTOTYPES\n");
        !           270:   for (insn_ptr = call_insns; *insn_ptr; insn_ptr++)
        !           271:     gen_proto (*insn_ptr);
        !           272: 
        !           273:   printf ("\n#else /* !MD_CALL_PROTOTYPES */\n");
        !           274:   for (insn_ptr = call_insns; *insn_ptr; insn_ptr++)
        !           275:     gen_nonproto (*insn_ptr);
        !           276: 
        !           277:   printf ("#endif /* !MD_CALL_PROTOTYPES */\n");
        !           278:   printf ("\n#else  /* NO_MD_PROTOTYPES */\n");
        !           279:   for (insn_ptr = normal_insns; *insn_ptr; insn_ptr++)
        !           280:     gen_nonproto (*insn_ptr);
        !           281: 
        !           282:   for (insn_ptr = call_insns; *insn_ptr; insn_ptr++)
        !           283:     gen_nonproto (*insn_ptr);
        !           284: 
        !           285:   printf ("#endif  /* NO_MD_PROTOTYPES */\n");
        !           286: 
        !           287:   fflush (stdout);
        !           288:   exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
        !           289:   /* NOTREACHED */
        !           290:   return 0;
        !           291: }

unix.superglobalmegacorp.com

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