[3/2] Add some more casts (2/2)
Commit Message
On 15-09-28 01:14 PM, Simon Marchi wrote:
> On 15-09-28 11:45 AM, Ulrich Weigand wrote:
>> Simon Marchi wrote:
>>
>>> @@ -1350,7 +1352,7 @@ ppu2spu_sniffer (const struct frame_unwind *self,
>>> info.bfd_arch_info = bfd_lookup_arch (bfd_arch_spu, bfd_mach_spu);
>>> info.byte_order = BFD_ENDIAN_BIG;
>>> info.osabi = GDB_OSABI_LINUX;
>>> - info.tdep_info = (void *) &data.id;
>>> + info.tdep_info = (struct gdbarch_tdep_info *) &data.id;
>>> data.gdbarch = gdbarch_find_by_info (info);
>>> if (!data.gdbarch)
>>> return 0;
>>
>> This causes compilation to fail (with the RHEL5 system compiler):
>>
>> gdb/ppc-linux-tdep.c: In function 'ppu2spu_sniffer':
>> gdb/ppc-linux-tdep.c:1355: warning: type-punning to incomplete type might break strict-aliasing rules
>>
>> The problem seems to be that "struct gdbarch_tdep_info" actually
>> does not exist and is not defined anywhere. The info.tdep_info
>> field is used as a generic pointer; different architectures use
>> it for diffferent purposes.
>>
>> Maybe in this case the correct fix would be to leave the (void *)
>> casts in place and actually change the type of the field to void * ...
>>
>> Bye,
>> Ulrich
>
> Thanks for pointing this out. I was able to reproduce it using a Centos 5
> docker container.
>
> Changing the field and the cast to void* is ok to me. I don't see any real
> value in casting to a pointer to a type that doesn't exist. Any other
> opinions?
Here is the proposed fix. Ok to push?
From 6878d6f114544cc58f5065b66026a706108debc5 Mon Sep 17 00:00:00 2001
From: Simon Marchi <simon.marchi@ericsson.com>
Date: Wed, 30 Sep 2015 10:14:09 -0400
Subject: [PATCH] gdbarch.h: Change gdbarch_info::tdep_info's type to void *
As reported by Ulrich here:
https://sourceware.org/ml/gdb-patches/2015-09/msg00604.html
The system compiler (gcc 4.1) in Centos 5 doesn't like that we cast to a
pointer to a type that doesn't exist. I see no real value in using this
kind iof construct over just using void *. So this patch changes the
tdep_info field to void * and removes the casts. Even in C++, we
should not need an explicit cast when assigning to a void *.
gdb/ChangeLog:
* gdbarch.sh (struct gdbarch_info): Change tdep_info's type to void *.
* gdbarch.h: Regenerate.
* i386-tdep.c (i386_gdbarch_init): Remove cast to
struct gdbarch_tdep_info *.
* mips-tdep.c (mips_gdbarch_init): Likewise.
* ppc-linux-tdep (ppu2spu_sniffer): Likewise.
* rs6000-tdep.c (rs6000_gdbarch_init): Likewise.
* spu-multiarch.c (spu_gdbarch): Likewise.
---
gdb/gdbarch.h | 2 +-
gdb/gdbarch.sh | 2 +-
gdb/i386-tdep.c | 2 +-
gdb/mips-tdep.c | 2 +-
gdb/ppc-linux-tdep.c | 2 +-
gdb/rs6000-tdep.c | 2 +-
gdb/spu-multiarch.c | 2 +-
7 files changed, 7 insertions(+), 7 deletions(-)
@@ -1561,7 +1561,7 @@ struct gdbarch_info
bfd *abfd;
/* Use default: NULL (ZERO). */
- struct gdbarch_tdep_info *tdep_info;
+ void *tdep_info;
/* Use default: GDB_OSABI_UNINITIALIZED (-1). */
enum gdb_osabi osabi;
@@ -1429,7 +1429,7 @@ struct gdbarch_info
bfd *abfd;
/* Use default: NULL (ZERO). */
- struct gdbarch_tdep_info *tdep_info;
+ void *tdep_info;
/* Use default: GDB_OSABI_UNINITIALIZED (-1). */
enum gdb_osabi osabi;
@@ -8478,7 +8478,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_insn_is_jump (gdbarch, i386_insn_is_jump);
/* Hook in ABI-specific overrides, if they have been registered. */
- info.tdep_info = (struct gdbarch_tdep_info *) tdesc_data;
+ info.tdep_info = tdesc_data;
gdbarch_init_osabi (info, gdbarch);
if (!i386_validate_tdesc_p (tdep, tdesc_data))
@@ -8898,7 +8898,7 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
mips_register_g_packet_guesses (gdbarch);
/* Hook in OS ABI-specific overrides, if they have been registered. */
- info.tdep_info = (struct gdbarch_tdep_info *) tdesc_data;
+ info.tdep_info = tdesc_data;
gdbarch_init_osabi (info, gdbarch);
/* The hook may have adjusted num_regs, fetch the final value and
@@ -1352,7 +1352,7 @@ ppu2spu_sniffer (const struct frame_unwind *self,
info.bfd_arch_info = bfd_lookup_arch (bfd_arch_spu, bfd_mach_spu);
info.byte_order = BFD_ENDIAN_BIG;
info.osabi = GDB_OSABI_LINUX;
- info.tdep_info = (struct gdbarch_tdep_info *) &data.id;
+ info.tdep_info = &data.id;
data.gdbarch = gdbarch_find_by_info (info);
if (!data.gdbarch)
return 0;
@@ -5993,7 +5993,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in ABI-specific overrides, if they have been registered. */
info.target_desc = tdesc;
- info.tdep_info = (struct gdbarch_tdep_info *) tdesc_data;
+ info.tdep_info = tdesc_data;
gdbarch_init_osabi (info, gdbarch);
switch (info.osabi)
@@ -107,7 +107,7 @@ spu_gdbarch (int spufs_fd)
info.bfd_arch_info = bfd_lookup_arch (bfd_arch_spu, bfd_mach_spu);
info.byte_order = BFD_ENDIAN_BIG;
info.osabi = GDB_OSABI_LINUX;
- info.tdep_info = (struct gdbarch_tdep_info *) &spufs_fd;
+ info.tdep_info = &spufs_fd;
return gdbarch_find_by_info (info);
}