Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Feb 2007 16:21:09 +0000 (UTC)
From:      Bruce Evans <bde@FreeBSD.org>
To:        src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/amd64/include pcpu.h src/sys/i386/include pcpu.h
Message-ID:  <200702061621.l16GLAdD002830@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
bde         2007-02-06 16:21:09 UTC

  FreeBSD src repository

  Modified files:
    sys/amd64/include    pcpu.h 
    sys/i386/include     pcpu.h 
  Log:
  Simplified PCPU_GET() and PCPU_SET().  We must copy through a temporary
  variable to avoid invalid constraints in dead code.  Use an array of
  u_char's (inside a struct) instead of a char/short/int/long variable so
  that the variable and its accesses can be spelled in the same way in all
  cases and code doesn't need to be cloned just to hold the spelling
  differences.
  
  Fixed strict-aliasing errors in PCPU_SET() and in the amd64 PCPU_GET().
  Cast to (void *) as in rev.1.37 of the i386 version where the errors
  were fixed for the i386 PCPU_GET() only.  It would be more correct to
  copy to and from the temp. variable using memcpy(), but then an
  ifdef tangle would be required to ensure using the builtin memcpy().
  We depend on fairly aggressive optimization to put the temp. variable
  only in a register despite it being copied using
  *(type *)(void *)&anothertype and could depend on this when using
  memcpy() too.  This seems to work right even for -O0, but the -O0 case
  has not been completely tested.
  
  This change gives identical object code for all object files in LINT
  on amd64 (except for one file with a __TIME__ stamp).  For LINT on
  i386 it gives unimportant differences in instruction order and padding
  in a few object files.  This was only tested for -O.
  
  This change (actually a previous version of it) gives the following
  reductions in the number of object files in LINT that fail to compile
  with -O2 but without the -fno-strict-aliasing kludge:
  - amd64: 29 (down from 211)
  - i386: 36 (down from 47)
  
  gcc-3.4.6 actually allows the invalid constraints that result from not
  using the temp. variable, at least with -O[1-2], but gcc-3.3.3 crashes
  on them and I don't want to depend on compiler bugs.
  
  Revision  Changes    Path
  1.45      +18 -48    src/sys/amd64/include/pcpu.h
  1.47      +18 -36    src/sys/i386/include/pcpu.h



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200702061621.l16GLAdD002830>