summaryrefslogtreecommitdiff
path: root/gcc/gensupport.c
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2006-01-23 15:15:12 +0000
committerZack Weinberg <zack@gcc.gnu.org>2006-01-23 15:15:12 +0000
commit0458fe77b852f0dc55fd301376ff2a60c52b2ec4 (patch)
tree04e7c2430e813b518ab2f021d422bd49f8d865ec /gcc/gensupport.c
parent1c7352cde8a759e414b61d3aeaf40eda67f8dd75 (diff)
downloadgcc-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.c52
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;
+}