Initial import, 0.1 + pk 0.2.4-B1
[unix-history] / gnu / usr.bin / gcc1 / cc1 / gencodes.c
/* Generate from machine description:
- some macros CODE_FOR_... giving the insn_code_number value
for each of the defined standard insn names.
Copyright (C) 1987 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include "config.h"
#include "rtl.h"
#include "obstack.h"
struct obstack obstack;
struct obstack *rtl_obstack = &obstack;
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
extern int xmalloc ();
extern void free ();
void fatal ();
void fancy_abort ();
int insn_code_number;
void
gen_insn (insn)
rtx insn;
{
/* Don't mention instructions whose names are the null string.
They are in the machine description just to be recognized. */
if (strlen (XSTR (insn, 0)) != 0)
printf (" CODE_FOR_%s = %d,\n", XSTR (insn, 0),
insn_code_number);
}
int
xmalloc (size)
{
register int val = malloc (size);
if (val == 0)
fatal ("virtual memory exhausted");
return val;
}
int
xrealloc (ptr, size)
char *ptr;
int size;
{
int result = realloc (ptr, size);
if (!result)
fatal ("virtual memory exhausted");
return result;
}
void
fatal (s, a1, a2)
char *s;
{
fprintf (stderr, "gencodes: ");
fprintf (stderr, s, a1, a2);
fprintf (stderr, "\n");
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
\f
int
main (argc, argv)
int argc;
char **argv;
{
rtx desc;
FILE *infile;
extern rtx read_rtx ();
register int c;
obstack_init (rtl_obstack);
if (argc <= 1)
fatal ("No input file name.");
infile = fopen (argv[1], "r");
if (infile == 0)
{
perror (argv[1]);
exit (FATAL_EXIT_CODE);
}
init_rtl ();
printf ("/* Generated automatically by the program `gencodes'\n\
from the machine description file `md'. */\n\n");
printf ("#ifndef MAX_INSN_CODE\n\n");
/* Read the machine description. */
insn_code_number = 0;
printf ("enum insn_code {\n");
while (1)
{
c = read_skip_spaces (infile);
if (c == EOF)
break;
ungetc (c, infile);
desc = read_rtx (infile);
if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
{
gen_insn (desc);
insn_code_number++;
}
if (GET_CODE (desc) == DEFINE_PEEPHOLE)
{
insn_code_number++;
}
}
printf (" CODE_FOR_nothing };\n");
printf ("\n#define MAX_INSN_CODE ((int) CODE_FOR_nothing)\n");
printf ("#endif /* MAX_INSN_CODE */\n");
fflush (stdout);
exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
}