GDB multi-build failure in lm32-opc.c file

Pierre Muller muller@ics.u-strasbg.fr
Sat Feb 14 16:36:00 GMT 2009


   The easiest was finally to add an
  if (num_macros >= 1)
before the memset call.
   When num_macros is zero, the call gets
optimized out, and thus no warning is issued.
   It turned out to be necessary for 3 files.

   I had one more warning in  tic54x-dis.c file
about a call to sprintf with only two arguments.
Not sure the fix is the right one there...

This is the simplest changes I found to be able to complete
a multi-build on i386 Ubuntu.

   Could you check these in under the obvious rule?

Pierre Muller

GDB pascal language maintainer.




Index: opcodes/lm32-opc.c
===================================================================
RCS file: /cvs/src/src/opcodes/lm32-opc.c,v
retrieving revision 1.1
diff -u -p -r1.1 lm32-opc.c
--- opcodes/lm32-opc.c	23 Dec 2008 19:10:25 -0000	1.1
+++ opcodes/lm32-opc.c	14 Feb 2009 16:26:20 -0000
@@ -844,7 +844,8 @@ lm32_cgen_init_opcode_table (CGEN_CPU_DE
    const CGEN_OPCODE *oc = & lm32_cgen_macro_insn_opcode_table[0];
    CGEN_INSN *insns = xmalloc (num_macros * sizeof (CGEN_INSN));

-  memset (insns, 0, num_macros * sizeof (CGEN_INSN));
+  if (num_macros >= 1)
+    memset (insns, 0, num_macros * sizeof (CGEN_INSN));
    for (i = 0; i < num_macros; ++i)
      {
        insns[i].base = &ib[i];
Index: opcodes/mt-opc.c
===================================================================
RCS file: /cvs/src/src/opcodes/mt-opc.c,v
retrieving revision 1.3
diff -u -p -r1.3 mt-opc.c
--- opcodes/mt-opc.c	5 Jul 2007 09:49:02 -0000	1.3
+++ opcodes/mt-opc.c	14 Feb 2009 16:26:20 -0000
@@ -914,8 +914,8 @@ mt_cgen_init_opcode_table (CGEN_CPU_DESC
    const CGEN_IBASE *ib = & mt_cgen_macro_insn_table[0];
    const CGEN_OPCODE *oc = & mt_cgen_macro_insn_opcode_table[0];
    CGEN_INSN *insns = xmalloc (num_macros * sizeof (CGEN_INSN));
-
-  memset (insns, 0, num_macros * sizeof (CGEN_INSN));
+  if (num_macros >= 1)
+    memset (insns, 0, num_macros * sizeof (CGEN_INSN));
    for (i = 0; i < num_macros; ++i)
      {
        insns[i].base = &ib[i];
Index: opcodes/tic54x-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/tic54x-dis.c,v
retrieving revision 1.10
diff -u -p -r1.10 tic54x-dis.c
--- opcodes/tic54x-dis.c	5 Jul 2007 09:49:02 -0000	1.10
+++ opcodes/tic54x-dis.c	14 Feb 2009 16:26:21 -0000
@@ -380,7 +380,7 @@ print_instruction (info, memaddr, opcode
          case OP_CC3:
          {
            const char *code[] = { "eq", "lt", "gt", "neq" };
-          sprintf (operand[i], code[CC3 (opcode)]);
+          sprintf (operand[i], "%s", code[CC3 (opcode)]);
            info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
            break;
          }
Index: opcodes/xc16x-opc.c
===================================================================
RCS file: /cvs/src/src/opcodes/xc16x-opc.c,v
retrieving revision 1.2
diff -u -p -r1.2 xc16x-opc.c
--- opcodes/xc16x-opc.c	5 Jul 2007 09:49:02 -0000	1.2
+++ opcodes/xc16x-opc.c	14 Feb 2009 16:26:22 -0000
@@ -3041,7 +3041,8 @@ xc16x_cgen_init_opcode_table (CGEN_CPU_D
    const CGEN_OPCODE *oc = & xc16x_cgen_macro_insn_opcode_table[0];
    CGEN_INSN *insns = xmalloc (num_macros * sizeof (CGEN_INSN));

-  memset (insns, 0, num_macros * sizeof (CGEN_INSN));
+  if (num_macros >= 1)
+    memset (insns, 0, num_macros * sizeof (CGEN_INSN));
    for (i = 0; i < num_macros; ++i)
      {
        insns[i].base = &ib[i];


> Pierre Muller wrote:
>
>> lm32-opc.o
>> cc1: warnings being treated as errors
>> In function ?memset?,
>>     inlined from ?lm32_cgen_init_opcode_table? at
>> ../../src/opcodes/lm32-opc.c:847:
>> /usr/include/bits/string3.h:82: error: call to ?__warn_memset_zero_len?
>> declared with attribute warning: memset used with constant zero length
>> parameter; this could be due to transposed parameters
>> make[3]: *** [lm32-opc.lo] Error 1
>>
>> Seems to suggest that CGEN_INSN type is
>> still opaque and thus of unknown size...
>
>   Nah, otherwise you'd get an error about trying to use an incomplete
> definition; sizeof() wouldn't just return zero.  So looking at that line in
> lm32-opc.c,
>
>
>    837  void
>    838  lm32_cgen_init_opcode_table (CGEN_CPU_DESC cd)
>    839  {
>    840    int i;
>    841    int num_macros = (sizeof (lm32_cgen_macro_insn_table) /
>    842                      sizeof (lm32_cgen_macro_insn_table[0]));
>    843    const CGEN_IBASE *ib = & lm32_cgen_macro_insn_table[0];
>    844    const CGEN_OPCODE *oc = & lm32_cgen_macro_insn_opcode_table[0];
>    845    CGEN_INSN *insns = xmalloc (num_macros * sizeof (CGEN_INSN));
>    846
>    847    memset (insns, 0, num_macros * sizeof (CGEN_INSN));
>
>
> it must be the case that num_macros is zero.  And indeed:
>
>    742  static const CGEN_IBASE lm32_cgen_macro_insn_table[] =
>    743  {
>    744  };
>
>   I would guess something went wrong when it got autogenerated, or   
> conceivably
> it's supposed to be empty but the warning on zero-size memset is   
> new?  LM32 is
> a very recent port, only added in December.  As a workaround, you could
> probably add a single dummy entry just to get it to compile, as long as you
> don't try debugging any LM32 executables you should be ok.  Something as
> simple as an empty default initialiser:
>
>    742  static const CGEN_IBASE lm32_cgen_macro_insn_table[] =
>    743  {
> 		{  }
>    744  };
>
> ought to do the trick.
>
>     cheers,
>       DaveK
>
>
>






More information about the Binutils mailing list