This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
minor xtensa-isa changes
- From: Bob Wilson <bwilson at tensilica dot com>
- To: binutils at sources dot redhat dot com
- Date: Tue, 22 Mar 2005 11:43:38 -0800
- Subject: minor xtensa-isa changes
- Organization: Tensilica, Inc.
This patch has some minor changes to the xtensa-isa files. On at least some
versions of Solaris, bsearch crashes when given a null pointer even if the count
is zero, so the patch adds guards for this condition around calls to bsearch.
If you look closely, you will see that this is currently irrelevant for binutils
since none of the pointers in question are ever null. The real motivation for
the patch is to make my life easier -- I also maintain somewhat different
versions of these files for Tensilica, and I'm trying to keep them in sync.
Thus, the patch also has some minor changes to comments and whitespace.
Committed on mainline and 2.16 branch.
include ChangeLog:
2005-03-22 Bob Wilson <bob.wilson@acm.org>
* xtensa-isa.h: Update a comment and whitespace.
bfd ChangeLog:
2005-03-22 Bob Wilson <bob.wilson@acm.org>
* xtensa-isa.c (xtensa_opcode_lookup, xtensa_state_lookup,
xtensa_sysreg_lookup_name, xtensa_interface_lookup,
xtensa_funcUnit_lookup): Skip bsearch call if count is zero.
(xtensa_opcode_decode): Rearrange code.
Index: bfd/xtensa-isa.c
===================================================================
RCS file: /cvs/src/src/bfd/xtensa-isa.c,v
retrieving revision 1.5
diff -u -p -r1.5 xtensa-isa.c
--- bfd/xtensa-isa.c 20 Feb 2005 14:59:07 -0000 1.5
+++ bfd/xtensa-isa.c 22 Mar 2005 19:22:03 -0000
@@ -63,6 +63,7 @@ xtensa_isa_error_msg (xtensa_isa isa __a
} \
} while (0)
+
/* Instruction buffers. */
@@ -406,9 +407,9 @@ xtensa_isa_length_from_chars (xtensa_isa
int
xtensa_isa_num_pipe_stages (xtensa_isa isa)
{
- int num_opcodes, num_uses;
xtensa_opcode opcode;
xtensa_funcUnit_use *use;
+ int num_opcodes, num_uses;
int i, stage, max_stage = XTENSA_UNDEFINED;
num_opcodes = xtensa_isa_num_opcodes (isa);
@@ -653,7 +654,7 @@ xtensa_opcode
xtensa_opcode_lookup (xtensa_isa isa, const char *opname)
{
xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
- xtensa_lookup_entry entry, *result;
+ xtensa_lookup_entry entry, *result = 0;
if (!opname || !*opname)
{
@@ -662,9 +663,13 @@ xtensa_opcode_lookup (xtensa_isa isa, co
return XTENSA_UNDEFINED;
}
- entry.key = opname;
- result = bsearch (&entry, intisa->opname_lookup_table, intisa->num_opcodes,
- sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
+ if (intisa->num_opcodes != 0)
+ {
+ entry.key = opname;
+ result = bsearch (&entry, intisa->opname_lookup_table,
+ intisa->num_opcodes, sizeof (xtensa_lookup_entry),
+ xtensa_isa_name_compare);
+ }
if (!result)
{
@@ -691,12 +696,12 @@ xtensa_opcode_decode (xtensa_isa isa, xt
slot_id = intisa->formats[fmt].slot_id[slot];
opc = (intisa->slots[slot_id].opcode_decode_fn) (slotbuf);
- if (opc == XTENSA_UNDEFINED)
- {
- xtisa_errno = xtensa_isa_bad_opcode;
- strcpy (xtisa_error_msg, "cannot decode opcode");
- }
- return opc;
+ if (opc != XTENSA_UNDEFINED)
+ return opc;
+
+ xtisa_errno = xtensa_isa_bad_opcode;
+ strcpy (xtisa_error_msg, "cannot decode opcode");
+ return XTENSA_UNDEFINED;
}
@@ -1288,6 +1293,7 @@ xtensa_stateOperand_inout (xtensa_isa is
return iclass->stateOperands[stOp].inout;
}
+
/* Interface Operands. */
@@ -1438,6 +1444,7 @@ xtensa_regfile_num_entries (xtensa_isa i
return intisa->regfiles[rf].num_entries;
}
+
/* Processor States. */
@@ -1457,7 +1464,7 @@ xtensa_state
xtensa_state_lookup (xtensa_isa isa, const char *name)
{
xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
- xtensa_lookup_entry entry, *result;
+ xtensa_lookup_entry entry, *result = 0;
if (!name || !*name)
{
@@ -1466,9 +1473,12 @@ xtensa_state_lookup (xtensa_isa isa, con
return XTENSA_UNDEFINED;
}
- entry.key = name;
- result = bsearch (&entry, intisa->state_lookup_table, intisa->num_states,
- sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
+ if (intisa->num_states != 0)
+ {
+ entry.key = name;
+ result = bsearch (&entry, intisa->state_lookup_table, intisa->num_states,
+ sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
+ }
if (!result)
{
@@ -1509,6 +1519,7 @@ xtensa_state_is_exported (xtensa_isa isa
return 0;
}
+
/* Sysregs. */
@@ -1548,7 +1559,7 @@ xtensa_sysreg
xtensa_sysreg_lookup_name (xtensa_isa isa, const char *name)
{
xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
- xtensa_lookup_entry entry, *result;
+ xtensa_lookup_entry entry, *result = 0;
if (!name || !*name)
{
@@ -1557,9 +1568,13 @@ xtensa_sysreg_lookup_name (xtensa_isa is
return XTENSA_UNDEFINED;
}
- entry.key = name;
- result = bsearch (&entry, intisa->sysreg_lookup_table, intisa->num_sysregs,
- sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
+ if (intisa->num_sysregs != 0)
+ {
+ entry.key = name;
+ result = bsearch (&entry, intisa->sysreg_lookup_table,
+ intisa->num_sysregs, sizeof (xtensa_lookup_entry),
+ xtensa_isa_name_compare);
+ }
if (!result)
{
@@ -1600,6 +1615,7 @@ xtensa_sysreg_is_user (xtensa_isa isa, x
return 0;
}
+
/* Interfaces. */
@@ -1619,7 +1635,7 @@ xtensa_interface
xtensa_interface_lookup (xtensa_isa isa, const char *ifname)
{
xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
- xtensa_lookup_entry entry, *result;
+ xtensa_lookup_entry entry, *result = 0;
if (!ifname || !*ifname)
{
@@ -1628,10 +1644,13 @@ xtensa_interface_lookup (xtensa_isa isa,
return XTENSA_UNDEFINED;
}
- entry.key = ifname;
- result = bsearch (&entry, intisa->interface_lookup_table,
- intisa->num_interfaces,
- sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
+ if (intisa->num_interfaces != 0)
+ {
+ entry.key = ifname;
+ result = bsearch (&entry, intisa->interface_lookup_table,
+ intisa->num_interfaces, sizeof (xtensa_lookup_entry),
+ xtensa_isa_name_compare);
+ }
if (!result)
{
@@ -1690,6 +1709,7 @@ xtensa_interface_class_id (xtensa_isa is
return intisa->interfaces[intf].class_id;
}
+
/* Functional Units. */
@@ -1709,7 +1729,7 @@ xtensa_funcUnit
xtensa_funcUnit_lookup (xtensa_isa isa, const char *fname)
{
xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
- xtensa_lookup_entry entry, *result;
+ xtensa_lookup_entry entry, *result = 0;
if (!fname || !*fname)
{
@@ -1718,10 +1738,13 @@ xtensa_funcUnit_lookup (xtensa_isa isa,
return XTENSA_UNDEFINED;
}
- entry.key = fname;
- result = bsearch (&entry, intisa->funcUnit_lookup_table,
- intisa->num_funcUnits,
- sizeof (xtensa_lookup_entry), xtensa_isa_name_compare);
+ if (intisa->num_funcUnits != 0)
+ {
+ entry.key = fname;
+ result = bsearch (&entry, intisa->funcUnit_lookup_table,
+ intisa->num_funcUnits, sizeof (xtensa_lookup_entry),
+ xtensa_isa_name_compare);
+ }
if (!result)
{
Index: include/xtensa-isa.h
===================================================================
RCS file: /cvs/src/src/include/xtensa-isa.h,v
retrieving revision 1.4
diff -u -p -r1.4 xtensa-isa.h
--- include/xtensa-isa.h 20 Feb 2005 14:59:04 -0000 1.4
+++ include/xtensa-isa.h 22 Mar 2005 19:22:04 -0000
@@ -65,7 +65,7 @@ extern "C" {
typedef struct xtensa_isa_opaque { int unused; } *xtensa_isa;
-/* Opcodes, formats, regfiles, states, sysregs, ctypes, and protos are
+/* Most of the Xtensa ISA entities (e.g., opcodes, regfiles, etc.) are
represented here using sequential integers beginning with 0. The
specific values are only fixed for a particular instantiation of an
xtensa_isa structure, so these values should only be used
@@ -168,6 +168,7 @@ xtensa_isa_errno (xtensa_isa isa);
extern char *
xtensa_isa_error_msg (xtensa_isa isa);
+
/* Instruction buffers. */
@@ -215,6 +216,7 @@ extern void
xtensa_insnbuf_from_chars (xtensa_isa isa, xtensa_insnbuf insn,
const unsigned char *cp, int num_chars);
+
/* ISA information. */
@@ -279,6 +281,7 @@ xtensa_isa_num_interfaces (xtensa_isa is
extern int
xtensa_isa_num_funcUnits (xtensa_isa isa);
+
/* Instruction formats. */
@@ -342,6 +345,7 @@ extern int
xtensa_format_set_slot (xtensa_isa isa, xtensa_format fmt, int slot,
xtensa_insnbuf insn, const xtensa_insnbuf slotbuf);
+
/* Opcode information. */
@@ -412,7 +416,6 @@ xtensa_opcode_is_call (xtensa_isa isa, x
extern int
xtensa_opcode_num_operands (xtensa_isa isa, xtensa_opcode opc);
-
extern int
xtensa_opcode_num_stateOperands (xtensa_isa isa, xtensa_opcode opc);
@@ -438,6 +441,7 @@ xtensa_opcode_num_funcUnit_uses (xtensa_
extern xtensa_funcUnit_use *
xtensa_opcode_funcUnit_use (xtensa_isa isa, xtensa_opcode opc, int u);
+
/* Operand information. */
@@ -572,6 +576,7 @@ extern int
xtensa_operand_undo_reloc (xtensa_isa isa, xtensa_opcode opc, int opnd,
uint32 *valp, uint32 pc);
+
/* State Operands. */
@@ -588,6 +593,7 @@ xtensa_stateOperand_state (xtensa_isa is
extern char
xtensa_stateOperand_inout (xtensa_isa isa, xtensa_opcode opc, int stOp);
+
/* Interface Operands. */
@@ -598,6 +604,7 @@ extern xtensa_interface
xtensa_interfaceOperand_interface (xtensa_isa isa, xtensa_opcode opc,
int ifOp);
+
/* Register Files. */
@@ -651,6 +658,7 @@ xtensa_regfile_num_bits (xtensa_isa isa,
extern int
xtensa_regfile_num_entries (xtensa_isa isa, xtensa_regfile rf);
+
/* Processor States. */
@@ -680,6 +688,7 @@ xtensa_state_num_bits (xtensa_isa isa, x
extern int
xtensa_state_is_exported (xtensa_isa isa, xtensa_state st);
+
/* Sysregs ("special registers" and "user registers"). */
@@ -717,6 +726,7 @@ xtensa_sysreg_number (xtensa_isa isa, xt
extern int
xtensa_sysreg_is_user (xtensa_isa isa, xtensa_sysreg sysreg);
+
/* Interfaces. */
@@ -768,6 +778,7 @@ xtensa_interface_has_side_effect (xtensa
extern int
xtensa_interface_class_id (xtensa_isa isa, xtensa_interface intf);
+
/* Functional Units. */