Fix build breakage on GNU/Linux AArch64, take 2
authorSergio Durigan Junior <sergiodj@redhat.com>
Sun, 10 Sep 2017 21:50:29 +0000 (17:50 -0400)
committerSergio Durigan Junior <sergiodj@redhat.com>
Sun, 10 Sep 2017 22:12:14 +0000 (18:12 -0400)
The last commit unfortunately was not enough to fix the build breakage
on AArch64.  I made a mistake and did not test it alone on BuildBot,
but along with another patch that was responsible for fixing the
breakage.

The failure is:

  In file included from /usr/include/string.h:640:0,
   from build-gnulib-gdbserver/import/string.h:41,
   from ../../../binutils-gdb/gdb/gdbserver/../common/common-defs.h:56,
   from ../../../binutils-gdb/gdb/gdbserver/server.h:22,
   from ../../../binutils-gdb/gdb/gdbserver/regcache.c:19:
  In function ‘void* memset(void*, int, size_t)’,
      inlined from ‘regcache* init_register_cache(regcache*, const target_desc*, unsigned char*)’ at ../../../binutils-gdb/gdb/gdbserver/regcache.c:150:50:
  /usr/include/aarch64-linux-gnu/bits/string3.h:81:32: 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 [-Werror]
 __warn_memset_zero_len ();
  ^
  In function ‘void* memset(void*, int, size_t)’,
      inlined from ‘regcache* get_thread_regcache(thread_info*, int)’ at ../../../binutils-gdb/gdb/gdbserver/regcache.c:57:60:
  /usr/include/aarch64-linux-gnu/bits/string3.h:81:32: 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 [-Werror]
 __warn_memset_zero_len ();

This is likely due to a GCC bug, because for some reason the compiler
assumes that the third argument to the memset:

  memset (regcache->register_status, REG_UNAVAILABLE,
  VEC_length (tdesc_reg_p, regcache->tdesc->reg_defs));

is always zero, which is not always true.

Anyway, the simple fix for this is to guard the memset calls with:

  if (!VEC_empty (tdesc_reg_p, regcache->tdesc->reg_defs))

This time, I made sure to regtest only this patch on BuildBot, and it
finally solved the breakage.

gdb/gdbserver/ChangeLog:
2017-09-10  Sergio Durigan Junior  <sergiodj@redhat.com>

* regcache.c (get_thread_regcache): Guard calls to "memset"
          with "!VEC_empty".

gdb/gdbserver/ChangeLog
gdb/gdbserver/regcache.c

index 345abb3e7314db0215379eaf0058417b62acc704..d9f80c9cf2a51a42afa4d933699faf3bb5d4625b 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-10  Sergio Durigan Junior  <sergiodj@redhat.com>
+
+       * regcache.c (get_thread_regcache): Guard calls to "memset"
+          with "!VEC_empty".
+
 2017-09-10  Sergio Durigan Junior  <sergiodj@redhat.com>
 
        * linux-low.c (handle_extended_wait): Use
index 43e78a5cf7c964cbe489a77c4cea23f55c895bb0..d1a534cc52a901653c92558bca51b8361cdde825 100644 (file)
@@ -53,8 +53,9 @@ get_thread_regcache (struct thread_info *thread, int fetch)
 
       current_thread = thread;
       /* Invalidate all registers, to prevent stale left-overs.  */
-      memset (regcache->register_status, REG_UNAVAILABLE,
-             VEC_length (tdesc_reg_p, regcache->tdesc->reg_defs));
+      if (!VEC_empty (tdesc_reg_p, regcache->tdesc->reg_defs))
+       memset (regcache->register_status, REG_UNAVAILABLE,
+               VEC_length (tdesc_reg_p, regcache->tdesc->reg_defs));
       fetch_inferior_registers (regcache, -1);
       current_thread = saved_thread;
       regcache->registers_valid = 1;
@@ -146,8 +147,9 @@ init_register_cache (struct regcache *regcache,
       regcache->registers_owned = 1;
       regcache->register_status
        = (unsigned char *) xmalloc (VEC_length (tdesc_reg_p, tdesc->reg_defs));
-      memset ((void *) regcache->register_status, REG_UNAVAILABLE,
-             VEC_length (tdesc_reg_p, tdesc->reg_defs));
+      if (!VEC_empty (tdesc_reg_p, tdesc->reg_defs))
+       memset ((void *) regcache->register_status, REG_UNAVAILABLE,
+               VEC_length (tdesc_reg_p, tdesc->reg_defs));
 #else
       gdb_assert_not_reached ("can't allocate memory from the heap");
 #endif