diff options
author | Andrew Burgess <aburgess@redhat.com> | 2022-10-12 11:45:53 +0100 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2022-10-19 14:32:22 +0100 |
commit | d0a7ca87ab208d72b2c6a9d44e30fe20c3c0542e (patch) | |
tree | 046252c76230145d9c6afad2a6c975bfe6334c50 /sim/erc32 | |
parent | e5961d2be503149aaa40927c0a9501c06ca980e5 (diff) | |
download | fsf-binutils-gdb-d0a7ca87ab208d72b2c6a9d44e30fe20c3c0542e.zip fsf-binutils-gdb-d0a7ca87ab208d72b2c6a9d44e30fe20c3c0542e.tar.gz fsf-binutils-gdb-d0a7ca87ab208d72b2c6a9d44e30fe20c3c0542e.tar.bz2 |
sim/erc32: avoid dereferencing type-punned pointer warnings
When building the erc32 simulator I get a few warnings like this:
/tmp/build/sim/../../src/sim/erc32/exec.c:1377:21: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
1377 | sregs->fs[rd] = *((float32 *) & ddata[0]);
| ~^~~~~~~~~~~~~~~~~~~~~~~
The type of '& ddata[0]' will be 'uint32_t *', which is what triggers
the warning.
This commit makes use of memcpy when performing the type-punning,
which resolves the above warnings.
With this change, I now see no warnings when compiling exec.c, which
means that the line in Makefile.in that disables -Werror can be
removed.
There should be no change in behaviour after this commit.
Diffstat (limited to 'sim/erc32')
-rw-r--r-- | sim/erc32/Makefile.in | 3 | ||||
-rw-r--r-- | sim/erc32/exec.c | 7 |
2 files changed, 4 insertions, 6 deletions
diff --git a/sim/erc32/Makefile.in b/sim/erc32/Makefile.in index 786ae1d..41830aa 100644 --- a/sim/erc32/Makefile.in +++ b/sim/erc32/Makefile.in @@ -32,9 +32,6 @@ SIM_EXTRA_CLEAN = clean-sis # behaviour of UART interrupt routines ... SIM_EXTRA_CFLAGS += -DFAST_UART -I$(srcroot) -# Some modules don't build cleanly yet. -exec.o: SIM_WERROR_CFLAGS = - ## COMMON_POST_CONFIG_FRAG # `sis' doesn't need interf.o. diff --git a/sim/erc32/exec.c b/sim/erc32/exec.c index ef93692..26d48c0 100644 --- a/sim/erc32/exec.c +++ b/sim/erc32/exec.c @@ -1345,7 +1345,7 @@ dispatch_instruction(struct pstate *sregs) if (mexc) { sregs->trap = TRAP_DEXC; } else { - sregs->fs[rd] = *((float32 *) & data); + memcpy (&sregs->fs[rd], &data, sizeof (sregs->fs[rd])); } break; case LDDF: @@ -1373,11 +1373,12 @@ dispatch_instruction(struct pstate *sregs) } else { rd &= 0x1E; sregs->flrd = rd; - sregs->fs[rd] = *((float32 *) & ddata[0]); + memcpy (&sregs->fs[rd], &ddata[0], sizeof (sregs->fs[rd])); #ifdef STAT sregs->nload++; /* Double load counts twice */ #endif - sregs->fs[rd + 1] = *((float32 *) & ddata[1]); + memcpy (&sregs->fs[rd + 1], &ddata[1], + sizeof (sregs->fs[rd + 1])); sregs->ltime = ebase.simtime + sregs->icnt + FLSTHOLD + sregs->hold + sregs->fhold; } |