diff options
Diffstat (limited to 'contrib/gcc/rtl.c')
-rw-r--r-- | contrib/gcc/rtl.c | 86 |
1 files changed, 67 insertions, 19 deletions
diff --git a/contrib/gcc/rtl.c b/contrib/gcc/rtl.c index 396566d..6b04bcd 100644 --- a/contrib/gcc/rtl.c +++ b/contrib/gcc/rtl.c @@ -1,5 +1,5 @@ /* Allocate and read RTL for GNU C Compiler. - Copyright (C) 1987, 1988, 1991, 1994, 1997 Free Software Foundation, Inc. + Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998 Free Software Foundation, Inc. This file is part of GNU CC. @@ -58,13 +58,15 @@ char *rtx_name[] = { #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) NAME, -char *mode_name[(int) MAX_MACHINE_MODE] = { +char *mode_name[(int) MAX_MACHINE_MODE + 1] = { #include "machmode.def" #ifdef EXTRA_CC_MODES - EXTRA_CC_NAMES + EXTRA_CC_NAMES, #endif - + /* Add an extra field to avoid a core dump if someone tries to convert + MAX_MACHINE_MODE to a string. */ + "" }; #undef DEF_MACHMODE @@ -107,14 +109,23 @@ int mode_unit_size[(int) MAX_MACHINE_MODE] = { use this. */ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) \ - (enum machine_mode) WIDER, + (unsigned char) WIDER, -enum machine_mode mode_wider_mode[(int) MAX_MACHINE_MODE] = { +unsigned char mode_wider_mode[(int) MAX_MACHINE_MODE] = { #include "machmode.def" /* machine modes are documented here */ }; #undef DEF_MACHMODE +#define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) \ + ((SIZE) * BITS_PER_UNIT >= HOST_BITS_PER_WIDE_INT) ? ~(unsigned HOST_WIDE_INT)0 : ((unsigned HOST_WIDE_INT) 1 << (SIZE) * BITS_PER_UNIT) - 1, + +/* Indexed by machine mode, gives mask of significant bits in mode. */ + +unsigned HOST_WIDE_INT mode_mask_array[(int) MAX_MACHINE_MODE] = { +#include "machmode.def" +}; + /* Indexed by mode class, gives the narrowest mode for each class. */ enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS]; @@ -173,7 +184,8 @@ char *note_insn_name[] = { 0 , "NOTE_INSN_DELETED", "NOTE_INSN_DELETED_LABEL", "NOTE_INSN_FUNCTION_BEG", "NOTE_INSN_EH_REGION_BEG", "NOTE_INSN_EH_REGION_END", "NOTE_REPEATED_LINE_NUMBER", "NOTE_INSN_RANGE_START", - "NOTE_INSN_RANGE_END", "NOTE_INSN_LIVE" }; + "NOTE_INSN_RANGE_END", "NOTE_INSN_LIVE", + "NOTE_INSN_BASIC_BLOCK" }; char *reg_note_name[] = { "", "REG_DEAD", "REG_INC", "REG_EQUIV", "REG_WAS_0", "REG_EQUAL", "REG_RETVAL", "REG_LIBCALL", @@ -181,9 +193,11 @@ char *reg_note_name[] = { "", "REG_DEAD", "REG_INC", "REG_EQUIV", "REG_WAS_0", "REG_CC_SETTER", "REG_CC_USER", "REG_LABEL", "REG_DEP_ANTI", "REG_DEP_OUTPUT", "REG_BR_PROB", "REG_EXEC_COUNT", "REG_NOALIAS", "REG_SAVE_AREA", - "REG_BR_PRED", "REG_EH_CONTEXT" }; + "REG_BR_PRED", "REG_EH_CONTEXT", + "REG_FRAME_RELATED_EXPR", "REG_EH_REGION", + "REG_EH_RETHROW" }; -static void dump_and_abort PROTO((int, int, FILE *)); +static void dump_and_abort PROTO((int, int, FILE *)) ATTRIBUTE_NORETURN; static void read_name PROTO((char *, FILE *)); /* Allocate an rtx vector of N elements. @@ -241,9 +255,7 @@ rtx_alloc (code) one int, but we don't want to assume that and it isn't very portable anyway; this is. */ - length = (sizeof (struct rtx_def) - sizeof (rtunion) - 1) / sizeof (int); - for (; length >= 0; length--) - ((int *) rt)[length] = 0; + memset (rt, 0, sizeof (struct rtx_def) - sizeof (rtunion)); PUT_CODE (rt, code); @@ -308,11 +320,24 @@ copy_rtx (orig) } copy = rtx_alloc (code); - PUT_MODE (copy, GET_MODE (orig)); - copy->in_struct = orig->in_struct; - copy->volatil = orig->volatil; - copy->unchanging = orig->unchanging; - copy->integrated = orig->integrated; + + /* Copy the various flags, and other information. We assume that + all fields need copying, and then clear the fields that should + not be copied. That is the sensible default behavior, and forces + us to explicitly document why we are *not* copying a flag. */ + memcpy (copy, orig, sizeof (struct rtx_def) - sizeof (rtunion)); + + /* We do not copy the USED flag, which is used as a mark bit during + walks over the RTL. */ + copy->used = 0; + + /* We do not copy JUMP, CALL, or FRAME_RELATED for INSNs. */ + if (GET_RTX_CLASS (code) == 'i') + { + copy->jump = 0; + copy->call = 0; + copy->frame_related = 0; + } format_ptr = GET_RTX_FORMAT (GET_CODE (copy)); @@ -463,6 +488,28 @@ copy_most_rtx (orig, may_share) } return copy; } + +/* Create a new copy of an rtx. Only copy just one level. */ +rtx +shallow_copy_rtx (orig) + rtx orig; +{ + register int i; + register char *format_ptr; + register RTX_CODE code = GET_CODE (orig); + register rtx copy = rtx_alloc (code); + + PUT_MODE (copy, GET_MODE (orig)); + copy->in_struct = orig->in_struct; + copy->volatil = orig->volatil; + copy->unchanging = orig->unchanging; + copy->integrated = orig->integrated; + + for (i = 0; i < GET_RTX_LENGTH (code); i++) + copy->fld[i] = orig->fld[i]; + + return copy; +} /* Subroutines of read_rtx. */ @@ -889,10 +936,11 @@ init_rtl () for (i = (int) CCmode + 1; i < (int) MAX_MACHINE_MODE; i++) { mode_class[i] = MODE_CC; + mode_mask_array[i] = mode_mask_array[(int) CCmode]; mode_size[i] = mode_size[(int) CCmode]; mode_unit_size[i] = mode_unit_size[(int) CCmode]; - mode_wider_mode[i - 1] = (enum machine_mode) i; - mode_wider_mode[i] = VOIDmode; + mode_wider_mode[i - 1] = i; + mode_wider_mode[i] = (unsigned char)VOIDmode; } #endif |