diff options
author | Zack Weinberg <zackw@panix.com> | 2006-01-23 15:15:12 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2006-01-23 15:15:12 +0000 |
commit | 0458fe77b852f0dc55fd301376ff2a60c52b2ec4 (patch) | |
tree | 04e7c2430e813b518ab2f021d422bd49f8d865ec /gcc/gensupport.c | |
parent | 1c7352cde8a759e414b61d3aeaf40eda67f8dd75 (diff) | |
download | gcc-0458fe77b852f0dc55fd301376ff2a60c52b2ec4.tar.gz |
r110124@banpei: zack | 2006-01-22 14:45:55 -0800
r110124@banpei: zack | 2006-01-22 14:45:55 -0800
* gensupport.c: Define get_insn_name and record_insn_name here.
(read_md_rtx): Call record_insn_name as appropriate.
* genattr.c, genattrtab.c, gencodes.c, genconfig.c, genemit.c
* genextract.c, genflags.c, genopinit.c, genoutput.c, genpeep.c
* genpreds.c, genrecog.c: Don't define get_insn_name nor
record_insn_name.
* Makefile.in (BUILD_SUPPORT, BUILD_PRINT): Fold into BUILD_RTL.
(BUILD_VARRAY): Delete.
(genprognormal): Rename genprogmd. Fold in all programs from
genprognoprint; also attrtab.
(build/genattrtab): Just mention genautomata.o and varray.o.
Reorganize a bit, add comments to make the categories clearer.
From-SVN: r110120
Diffstat (limited to 'gcc/gensupport.c')
-rw-r--r-- | gcc/gensupport.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/gcc/gensupport.c b/gcc/gensupport.c index 94d27aca975..bbac33a2c88 100644 --- a/gcc/gensupport.c +++ b/gcc/gensupport.c @@ -118,6 +118,7 @@ static void process_define_cond_exec (void); static void process_include (rtx, int); static char *save_string (const char *, int); static void init_predicate_table (void); +static void record_insn_name (int, const char *); void message_with_line (int lineno, const char *msg, ...) @@ -1104,6 +1105,10 @@ read_md_rtx (int *lineno, int *seqnr) sequence_num++; else if (insn_elision) goto discard; + + /* *seqnr is used here so the name table will match caller's + idea of insn numbering, whether or not elision is active. */ + record_insn_name (*seqnr, XSTR (desc, 0)); break; case DEFINE_SPLIT: @@ -1373,3 +1378,50 @@ init_predicate_table (void) add_predicate (pred); } } + +/* These functions allow linkage with print-rtl.c. Also, some generators + like to annotate their output with insn names. */ + +/* Holds an array of names indexed by insn_code_number. */ +static char **insn_name_ptr = 0; +static int insn_name_ptr_size = 0; + +const char * +get_insn_name (int code) +{ + if (code < insn_name_ptr_size) + return insn_name_ptr[code]; + else + return NULL; +} + +static void +record_insn_name (int code, const char *name) +{ + static const char *last_real_name = "insn"; + static int last_real_code = 0; + char *new; + + if (insn_name_ptr_size <= code) + { + int new_size; + new_size = (insn_name_ptr_size ? insn_name_ptr_size * 2 : 512); + insn_name_ptr = xrealloc (insn_name_ptr, sizeof(char *) * new_size); + memset (insn_name_ptr + insn_name_ptr_size, 0, + sizeof(char *) * (new_size - insn_name_ptr_size)); + insn_name_ptr_size = new_size; + } + + if (!name || name[0] == '\0') + { + new = xmalloc (strlen (last_real_name) + 10); + sprintf (new, "%s+%d", last_real_name, code - last_real_code); + } + else + { + last_real_name = new = xstrdup (name); + last_real_code = code; + } + + insn_name_ptr[code] = new; +} |