__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 not defined on aarch64

Alexander Monakov amonakov@ispras.ru
Thu Jun 29 17:35:00 GMT 2017


On Thu, 29 Jun 2017, Alexander Monakov wrote:
> (but of course that's a nontrivial amount of work for a somewhat "academic"
> issue)

I think a practical approach is to give the user a degree of control by
introducing a tri-state compiler option controlling how double-word atomics
are to be emitted:

- -m128-bit-atomics=libcalls

  this is the current behavior, all doubleword atomics become libatomic API
  calls; I don't imagine anyone really likes that;

- -m128-bit-atomics=cas+loads

  all doubleword atomics, including loads, become cas/ll-sc loops; atomic loads
  from readonly memory may trap, but the user may know that their code never
  encounters that situation (e.g. if it's in control of how atomic objects are
  allocated, normally on stack or on heap);

  it would be binary-incompatible with the above option, but, again, acceptable
  in many situations where the atomic objects are not exposed to
  potentially-incompatible code;

  I think this is what users would actually want in practice;

- -m128-bit-atomics=cas-loads

  all doubleword atomics, *exluding loads*, become cas/ll-sc loops; atomic loads
  become calls; in the end the user gets a link error and needs to decide how to
  handle it:
  - either adjust the program such that no plain loads remain, or
  - resolve the link error by providing a definition that works via cas, if they
    know that their accesses won't trap (could be with a static inline function,
    so in the end there's no overhead),
  - use the solution with kernel+vdso assist from the previous mail :)

  this might eventually become the default compiler behavior.

Alexander



More information about the Gcc-help mailing list