diff options
author | Andrew Cagney <cagney@redhat.com> | 2002-03-24 00:43:28 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2002-03-24 00:43:28 +0000 |
commit | e7b564aa85a5d135b65798288784ed9ae9ad9687 (patch) | |
tree | 159daf9f3b7e5e7e8a443d0aa3eac38724b2b5ca /sim/igen | |
parent | 18a642a148311e89d544b2547d610c07a147feb7 (diff) | |
download | gdb-e7b564aa85a5d135b65798288784ed9ae9ad9687.zip gdb-e7b564aa85a5d135b65798288784ed9ae9ad9687.tar.gz gdb-e7b564aa85a5d135b65798288784ed9ae9ad9687.tar.bz2 |
* gen.c (format_name_cmp): New function.
(insn_list_insert): Use the instruction field name as an
additional key. Different field names indicate different
semantics.
Diffstat (limited to 'sim/igen')
-rw-r--r-- | sim/igen/ChangeLog | 7 | ||||
-rw-r--r-- | sim/igen/gen.c | 25 |
2 files changed, 31 insertions, 1 deletions
diff --git a/sim/igen/ChangeLog b/sim/igen/ChangeLog index a65864b..a0d69a5 100644 --- a/sim/igen/ChangeLog +++ b/sim/igen/ChangeLog @@ -1,3 +1,10 @@ +2002-03-23 Andrew Cagney <ac131313@redhat.com> + + * gen.c (format_name_cmp): New function. + (insn_list_insert): Use the instruction field name as an + additional key. Different field names indicate different + semantics. + 2002-03-07 Chris Demetriou <cgd@broadcom.com> * igen.c (print_itrace_format): Add support for a new "%#lx" format. diff --git a/sim/igen/gen.c b/sim/igen/gen.c index de88619..7c24b46 100644 --- a/sim/igen/gen.c +++ b/sim/igen/gen.c @@ -308,7 +308,18 @@ new_opcode_bits (opcode_bits *old_bits, } } - +/* Same as strcmp(). */ +static int +format_name_cmp (const char *l, const char *r) +{ + if (l == NULL && r == NULL) + return 0; + if (l != NULL && r == NULL) + return -1; + if (l == NULL && r != NULL) + return +1; + return strcmp (l, r); +} typedef enum { @@ -351,6 +362,18 @@ insn_list_insert (insn_list **cur_insn_ptr, else if (cmp > 0) continue; + /* key#4 sort according to the format-name. If two apparently + identical instructions have unique format-names, then the + instructions are different. This is because the + format-name's use is overloaded, it not only indicates the + format name but also provides a unique semantic name for the + function. */ + cmp = format_name_cmp (insn->format_name, (*cur_insn_ptr)->insn->format_name); + if (cmp < 0) + break; + else if (cmp > 0) + continue; + /* duplicate keys, report problem */ switch (duplicate_action) { |