/* Generate from machine description:
- some #define configuration flags.
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)
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. */
struct obstack
*rtl_obstack
= &obstack
;
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
/* flags to determine output of machine description dependent #define's. */
int max_recog_operands_flag
;
int max_dup_operands_flag
;
int max_clobbers_per_insn_flag
;
int register_constraint_flag
;
int clobbers_seen_this_insn
;
int dup_operands_seen_this_insn
;
register char *format_ptr
;
clobbers_seen_this_insn
++;
if (XINT (part
, 0) > max_recog_operands_flag
)
max_recog_operands_flag
= XINT (part
, 0);
if (XSTR (part
, 2) && *XSTR (part
, 2))
register_constraint_flag
= 1;
if (XINT (part
, 0) > max_recog_operands_flag
)
max_recog_operands_flag
= XINT (part
, 0);
/* Now scan the rtl'x in the vector inside the match_operator. */
if (GET_CODE (XEXP (part
, 0)) == MATCH_OPERAND
)
++dup_operands_seen_this_insn
;
if (XINT (part
, 0) > max_recog_operands_flag
)
max_recog_operands_flag
= XINT (part
, 0);
case REG
: case CONST_INT
: case SYMBOL_REF
:
format_ptr
= GET_RTX_FORMAT (GET_CODE (part
));
for (i
= 0; i
< GET_RTX_LENGTH (GET_CODE (part
)); i
++)
walk_insn_part (XEXP (part
, i
));
if (XVEC (part
, i
) != NULL
)
for (j
= 0; j
< XVECLEN (part
, i
); j
++)
walk_insn_part (XVECEXP (part
, i
, j
));
/* Walk the insn pattern to gather the #define's status. */
clobbers_seen_this_insn
= 0;
dup_operands_seen_this_insn
= 0;
for (i
= 0; i
< XVECLEN (insn
, 1); i
++)
walk_insn_part (XVECEXP (insn
, 1, i
));
if (clobbers_seen_this_insn
> max_clobbers_per_insn_flag
)
max_clobbers_per_insn_flag
= clobbers_seen_this_insn
;
if (dup_operands_seen_this_insn
> max_dup_operands_flag
)
max_dup_operands_flag
= dup_operands_seen_this_insn
;
/* Similar but scan a define_expand. */
/* Walk the insn pattern to gather the #define's status. */
/* Note that we don't bother recording the number of MATCH_DUPs
that occur in a gen_expand, because only reload cares about that. */
for (i
= 0; i
< XVECLEN (insn
, 1); i
++)
/* Compute the maximum SETs and CLOBBERS
in any one of the sub-insns;
don't sum across all of them. */
clobbers_seen_this_insn
= 0;
walk_insn_part (XVECEXP (insn
, 1, i
));
if (clobbers_seen_this_insn
> max_clobbers_per_insn_flag
)
max_clobbers_per_insn_flag
= clobbers_seen_this_insn
;
/* Look through the patterns that are matched
to compute the maximum operand number. */
for (i
= 0; i
< XVECLEN (peep
, 0); i
++)
walk_insn_part (XVECEXP (peep
, 0, i
));
register int val
= malloc (size
);
fatal ("virtual memory exhausted");
int result
= realloc (ptr
, size
);
fatal ("virtual memory exhausted");
fprintf (stderr
, "genconfig: ");
fprintf (stderr
, s
, a1
, a2
);
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
fatal ("Internal gcc abort.");
obstack_init (rtl_obstack
);
fatal ("No input file name.");
infile
= fopen (argv
[1], "r");
printf ("/* Generated automatically by the program `genconfig'\n\
from the machine description file `md'. */\n\n");
/* Read the machine description. */
c
= read_skip_spaces (infile
);
desc
= read_rtx (infile
);
if (GET_CODE (desc
) == DEFINE_INSN
)
if (GET_CODE (desc
) == DEFINE_EXPAND
)
if (GET_CODE (desc
) == DEFINE_PEEPHOLE
)
/* 3 more than needed for this md file, for the sake of asm constructs. */
printf ("\n#define MAX_RECOG_OPERANDS %d\n", max_recog_operands_flag
+ 4);
if (max_dup_operands_flag
== 0)
max_dup_operands_flag
= 1;
printf ("\n#define MAX_DUP_OPERANDS %d\n", max_dup_operands_flag
);
if (register_constraint_flag
)
printf ("#define REGISTER_CONSTRAINTS\n");
exit (ferror (stdout
) != 0 ? FATAL_EXIT_CODE
: SUCCESS_EXIT_CODE
);