|
|
1.1 root 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.
1.1.1.4 ! root 5: Copyright (C) 1987, 1991, 1995 Free Software Foundation, Inc.
1.1 root 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
1.1.1.4 ! root 21: the Free Software Foundation, 59 Temple Place - Suite 330,
! 22: Boston, MA 02111-1307, USA. */
1.1 root 23:
24:
25: #include <stdio.h>
1.1.1.3 root 26: #include "hconfig.h"
1.1 root 27: #include "rtl.h"
28: #include "obstack.h"
29:
30: static struct obstack obstack;
31: struct obstack *rtl_obstack = &obstack;
32:
33: #define obstack_chunk_alloc xmalloc
34: #define obstack_chunk_free free
35:
36: extern void free ();
1.1.1.2 root 37: extern rtx read_rtx ();
1.1 root 38:
39: char *xmalloc ();
40: static void fatal ();
41: void fancy_abort ();
42:
43: static int insn_code_number;
44:
45: static void
46: gen_insn (insn)
47: rtx insn;
48: {
1.1.1.4 ! root 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] != '*')
1.1 root 53: printf (" CODE_FOR_%s = %d,\n", XSTR (insn, 0),
54: insn_code_number);
55: }
56:
57: char *
58: xmalloc (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:
68: char *
69: xrealloc (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:
79: static void
80: fatal (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:
92: void
93: fancy_abort ()
94: {
95: fatal ("Internal gcc abort.");
96: }
97:
98: int
99: main (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\
122: from 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.