[Spice-devel] [PATCH] demarshall: Add safe method for unaligned byte access.

Frediano Ziglio fziglio at redhat.com
Fri Nov 27 04:04:55 PST 2015


> 
> On Wed, Nov 25, 2015 at 09:04:58AM -0500, Frediano Ziglio wrote:
> > > 
> > > Usefull for ARM. Enable with "USE_MEMCPY" define.
> > >  Should be better to add "--use-memcpy" to configure.ac
> > > 
> > > Signed-off-by: Anton D. Kachalov <mouse at yandex-team.ru>
> > 
> > Are you sure there are not other way except memcpy?
> 
> An alternate way which I proposed was to do
> uint16_t my_int = unaligned_int[0] | unaligned_int[1] << 8
> but Anton said it was likely to be slower than a memcpy. I don't know
> how these unaligned accesses are usually handled in ARM code.
> I found
> https://github.com/yura-pakhuchiy/snappy-c/commit/a33077391874b36fb4c430ff9ed5f6e437b65f6f
> doinng something similar, but that's about it.
> 
> Christophe
> 

Being architecture dependent usually the compiler is the best that know
how to do it.

In the gcc word speaking the trick is to create a packed structure,
turn off aliasing and packing, something like

struct unaligned_u16
{
    uint16_t u16;
} __attribute__((__may_alias__)) __attribute__((packed));

static inline uint16_t read_u16ua(const void *p)
{
   return ((struct unaligned_u16 *)p)->u16;
}

In other compilers the may_alias is not necessary and there are
usually other options for packed.

Now is up to the compiler do deal with it. One option is to use
more or less the code above. The other is to call some helper function
which compiler knows about and can have less register trash rules
(as they usually don't follow architecture ABI).

In a project I follow I have this crazy include to deal with these stuff:
https://github.com/FreeTDS/freetds/blob/master/include/freetds/bytes.h.

Frediano


More information about the Spice-devel mailing list