This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

minor xtensa-isa changes


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.  */
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]