Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Mike Frysinger <vapier@gentoo.org>
To: Jiri Gaisler <jiri@gaisler.se>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH v2 10/22] sim/erc32: Switched emulated memory to host endian order.
Date: Mon, 23 Feb 2015 19:39:00 -0000	[thread overview]
Message-ID: <20150223193927.GC13523@vapier> (raw)
In-Reply-To: <54EA61F2.6080303@gaisler.se>

[-- Attachment #1: Type: text/plain, Size: 2791 bytes --]

On 23 Feb 2015 00:10, Jiri Gaisler wrote:
> On 02/22/2015 09:51 PM, Mike Frysinger wrote:
> > On 19 Feb 2015 23:31, Jiri Gaisler wrote:
> >> +	    *((unsigned short *) &(mem[waddr])) = *data & 0x0ffff;
> > 
> > this violates strict aliasing.  you can't cast the RHS side like this.  it also 
> > violates alignment since the buffer is passed in as unsigned char *.

err, i obviously meant LHS there

> I don't fully agree on this. *mem holds the pointer to romb or ramb,
> which are defined as unsigned char arrays. However, their definition is
> is preceded with an integer define:
> 
> static uint32   mem_blockprot;	/* RAM block write protection enabled */
> static unsigned char	romb[ROM_SZ];
> static unsigned char	ramb[RAM_END - RAM_START];
> 
> This means that romb and ramb are aligned on a 4-byte boundary
> on systems where this matters (SPARC, ARM). When casting to short,
> waddr is always aligned on 2, when casting to integer waddr is
> always aligned on 4. So the casting really works without getting
> an alignment error. Can I rather document this instead of using
> a slower memcpy()? In cpu simulation, performance is essential and
> every (host) instruction counts.

afaik, nowhere are you guaranteed that the memory layout will match the decl 
order of your code.  there's no reason gcc/ld couldn't reorder those objects 
as long as the declared alignment is maintained.  if you wanted to do that, you 
would have to create a union instead like:
static union {
  unsigned char u8[ROM_SZ];
  uint16_t u16[ROM_SZ / 2];
  uint32_t u32[ROM_SZ / 4];
} romb;

and then pass in romb.u8 or romb.u16 or whatever.

even if the memory order was guaranteed, gcc cannot infer that level of 
alignment.  it would (rightly) complain that strict aliasing was being violated.

> > you should use memcpy() instead.  on systems where unaligned access are OK, gcc 
> > should optimize it down to a few load/stores anyways.
> 
> memcpy() does have some overhead compared to a single store ...

i think you misread what i said.  on hosts, like x86_64, there is no call to 
memcpy().  gcc will replace it with the exact asm insns required.  in this case 
(a 16bit store), that's what you'll get.

$ cat test.c
int main(int argc, char *argv[]) {
    memcpy(argv[0], &argc, 4);
    puts(argv[0]);
    return 0;
}

$ gcc -O3 -S -o - test.c
main:
        .cfi_startproc
        subq    $8, %rsp
        .cfi_def_cfa_offset 16
/* these two insns are the memcpy */
        movq    (%rsi), %rax
        movl    %edi, (%rax)
/* here is the call to puts */
        movq    (%rsi), %rdi
        call    puts
        xorl    %eax, %eax
        addq    $8, %rsp
        .cfi_def_cfa_offset 8
        ret
        .cfi_endproc
-mike

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

  reply	other threads:[~2015-02-23 19:39 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-19 22:32 [PATCH v2 00/22] Update of the SPARC SIS simulator Jiri Gaisler
2015-02-19 22:32 ` [PATCH v2 21/22] sim/erc32: Add data watchpoint support Jiri Gaisler
2015-02-19 22:32 ` [PATCH v2 02/22] sim/erc32: Corrected wrong CPU implementation and version ID in psr Jiri Gaisler
2015-02-22  4:15   ` Mike Frysinger
2015-02-19 22:32 ` [PATCH v2 19/22] sim/erc32: Add support for LEON2 processor emulation Jiri Gaisler
2015-02-22 21:06   ` Mike Frysinger
2015-02-19 22:32 ` [PATCH v2 16/22] sim/erc32: Use readline.h for readline types and functions Jiri Gaisler
2015-02-22 20:58   ` Mike Frysinger
2015-02-19 22:32 ` [PATCH v2 20/22] sim/erc32: Updated documentation Jiri Gaisler
2015-02-19 22:32 ` [PATCH v2 14/22] sim/erc32: Use gdb callback for UART I/O when linked with gdb Jiri Gaisler
2015-02-22 21:02   ` Mike Frysinger
2015-02-19 22:32 ` [PATCH v2 17/22] sim/erc32: Move local extern declarations into sis.h Jiri Gaisler
2015-02-22 20:59   ` Mike Frysinger
2015-02-19 22:32 ` [PATCH v2 11/22] sim/erc32: use SIM_AC_OPTION_HOSTENDIAN to probe for host endianess Jiri Gaisler
2015-02-22 20:52   ` Mike Frysinger
2015-02-19 22:32 ` [PATCH v2 01/22] sim/erc32: Disassembly in stand-alone mode did not work Jiri Gaisler
2015-02-22  4:10   ` Mike Frysinger
2015-02-19 22:32 ` [PATCH v2 05/22] sim/erc32: Remove unused defines in Makefile and switch off statistics Jiri Gaisler
2015-02-22  4:24   ` Mike Frysinger
2015-02-19 22:32 ` [PATCH v2 06/22] sim/erc32: Fix incorrect simulator performance report Jiri Gaisler
2015-02-22  4:29   ` Mike Frysinger
2015-02-19 22:32 ` [PATCH v2 22/22] Add watchpoint support to gdb simulator interface Jiri Gaisler
2015-02-19 22:32 ` [PATCH v2 12/22] sim/erc32: Use memory_iread() function for instruction fetching Jiri Gaisler
2015-02-22 20:54   ` Mike Frysinger
2015-02-19 22:33 ` [PATCH v2 13/22] sim/erc32: Fix a few compiler warnings Jiri Gaisler
2015-02-22 20:56   ` Mike Frysinger
2015-02-19 22:33 ` [PATCH v2 09/22] sim/erc32: Removed type mismatch " Jiri Gaisler
2015-02-22  4:43   ` Mike Frysinger
2015-02-19 22:33 ` [PATCH v2 08/22] sim/erc32: Added -v command line switch for verbose output Jiri Gaisler
2015-02-22  4:34   ` Mike Frysinger
2015-02-19 22:33 ` [PATCH v2 07/22] sim/erc32: File loading via command line did not work Jiri Gaisler
2015-02-22  4:32   ` Mike Frysinger
2015-02-19 22:33 ` [PATCH v2 10/22] sim/erc32: Switched emulated memory to host endian order Jiri Gaisler
2015-02-22 20:51   ` Mike Frysinger
2015-02-22 23:10     ` Jiri Gaisler
2015-02-23 19:39       ` Mike Frysinger [this message]
2015-02-19 22:33 ` [PATCH v2 04/22] sim/erc32: Use fenv.h for host FPU access Jiri Gaisler
2015-02-22  4:24   ` Mike Frysinger
2015-02-19 22:33 ` [PATCH v2 03/22] sim/erc32: Perform pseudo-init if binary linked to non-zero address Jiri Gaisler
2015-02-22  4:17   ` Mike Frysinger
2015-02-19 22:33 ` [PATCH v2 18/22] sim/erc32: Add support for LEON3 processor emulation Jiri Gaisler
2015-02-19 22:33 ` [PATCH v2 15/22] sim/erc32: Access memory subsystem through struct memsys Jiri Gaisler
2015-02-22 21:01   ` Mike Frysinger
2015-02-21 19:29 ` [PATCH v2 00/22] Update of the SPARC SIS simulator Mike Frysinger
2015-02-21 20:26   ` Jiri Gaisler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150223193927.GC13523@vapier \
    --to=vapier@gentoo.org \
    --cc=gdb-patches@sourceware.org \
    --cc=jiri@gaisler.se \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox