source: trunk/third/gcc/gencodes.c @ 8834

Revision 8834, 3.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/* Generate from machine description:
2
3   - some macros CODE_FOR_... giving the insn_code_number value
4   for each of the defined standard insn names.
5   Copyright (C) 1987, 1991, 1995 Free Software Foundation, Inc.
6
7This file is part of GNU CC.
8
9GNU CC is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2, or (at your option)
12any later version.
13
14GNU CC is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with GNU CC; see the file COPYING.  If not, write to
21the Free Software Foundation, 59 Temple Place - Suite 330,
22Boston, MA 02111-1307, USA.  */
23
24
25#include <stdio.h>
26#include "hconfig.h"
27#include "rtl.h"
28#include "obstack.h"
29
30static struct obstack obstack;
31struct obstack *rtl_obstack = &obstack;
32
33#define obstack_chunk_alloc xmalloc
34#define obstack_chunk_free free
35
36extern void free ();
37extern rtx read_rtx ();
38
39char *xmalloc ();
40static void fatal ();
41void fancy_abort ();
42
43static int insn_code_number;
44
45static void
46gen_insn (insn)
47     rtx insn;
48{
49  /* Don't mention instructions whose names are the null string
50     or begin with '*'.  They are in the machine description just
51     to be recognized.  */
52  if (XSTR (insn, 0)[0] != 0 && XSTR (insn, 0)[0] != '*')
53    printf ("  CODE_FOR_%s = %d,\n", XSTR (insn, 0),
54            insn_code_number);
55}
56
57char *
58xmalloc (size)
59     unsigned size;
60{
61  register char *val = (char *) malloc (size);
62
63  if (val == 0)
64    fatal ("virtual memory exhausted");
65  return val;
66}
67
68char *
69xrealloc (ptr, size)
70     char *ptr;
71     unsigned size;
72{
73  char *result = (char *) realloc (ptr, size);
74  if (!result)
75    fatal ("virtual memory exhausted");
76  return result;
77}
78
79static void
80fatal (s, a1, a2)
81     char *s;
82{
83  fprintf (stderr, "gencodes: ");
84  fprintf (stderr, s, a1, a2);
85  fprintf (stderr, "\n");
86  exit (FATAL_EXIT_CODE);
87}
88
89/* More 'friendly' abort that prints the line and file.
90   config.h can #define abort fancy_abort if you like that sort of thing.  */
91
92void
93fancy_abort ()
94{
95  fatal ("Internal gcc abort.");
96}
97
98int
99main (argc, argv)
100     int argc;
101     char **argv;
102{
103  rtx desc;
104  FILE *infile;
105  register int c;
106
107  obstack_init (rtl_obstack);
108
109  if (argc <= 1)
110    fatal ("No input file name.");
111
112  infile = fopen (argv[1], "r");
113  if (infile == 0)
114    {
115      perror (argv[1]);
116      exit (FATAL_EXIT_CODE);
117    }
118
119  init_rtl ();
120
121  printf ("/* Generated automatically by the program `gencodes'\n\
122from the machine description file `md'.  */\n\n");
123
124  printf ("#ifndef MAX_INSN_CODE\n\n");
125
126  /* Read the machine description.  */
127
128  insn_code_number = 0;
129  printf ("enum insn_code {\n");
130
131  while (1)
132    {
133      c = read_skip_spaces (infile);
134      if (c == EOF)
135        break;
136      ungetc (c, infile);
137
138      desc = read_rtx (infile);
139      if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
140        {
141          gen_insn (desc);
142          insn_code_number++;
143        }
144      if (GET_CODE (desc) == DEFINE_PEEPHOLE
145          || GET_CODE (desc) == DEFINE_SPLIT)
146        {
147          insn_code_number++;
148        }
149    }
150
151  printf ("  CODE_FOR_nothing };\n");
152
153  printf ("\n#define MAX_INSN_CODE ((int) CODE_FOR_nothing)\n");
154
155  printf ("#endif /* MAX_INSN_CODE */\n");
156
157  fflush (stdout);
158  exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
159  /* NOTREACHED */
160  return 0;
161}
Note: See TracBrowser for help on using the repository browser.