I just found this email with the exact patch I was looking for. Thank
you Gabriel, this is very helpful !

Does anyone know if it's going to be included in the official CIL distribution ?

Olivier

On Fri, Jan 15, 2010 at 6:22 PM, Gabriel Kerneis <kern...@pps.jussieu.fr> wrote:
> A bit hackish, but it has to since atomic builtins are overloaded to
> work on multiple types.  Types are not checked very carefully, but the
> parameters are cast properly, according to the type of the first one.
> http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html
> ---
>  src/check.ml           |    2 +
>  src/cil.ml             |   23 ++++
>  src/frontc/cabs2cil.ml |   53 ++++++++-
>  test/small1/sync-1.c   |  280 
> ++++++++++++++++++++++++++++++++++++++++++++++++
>  test/small1/sync-2.c   |  169 +++++++++++++++++++++++++++++
>  test/small1/sync-3.c   |  188 ++++++++++++++++++++++++++++++++
>  test/testcil.pl        |    3 +
>  7 files changed, 712 insertions(+), 6 deletions(-)
>  create mode 100644 test/small1/sync-1.c
>  create mode 100644 test/small1/sync-2.c
>  create mode 100644 test/small1/sync-3.c
>
> diff --git a/src/check.ml b/src/check.ml
> index cda292c..736287f 100644
> --- a/src/check.ml
> +++ b/src/check.ml
> @@ -805,6 +805,8 @@ and checkInstr (i: instr) =
>           (* Now check the return value*)
>       (match dest, unrollType rt with
>         None, TVoid _ -> ()
> +      (* Avoid spurious warnings for atomic builtins *)
> +      | Some _, TVoid [Attr ("overloaded", [])] -> ()
>       | Some _, TVoid _ -> ignore (warn "void value is assigned")
>       | None, _ -> () (* "Call of function is not assigned" *)
>       | Some destlv, rt' ->
> diff --git a/src/cil.ml b/src/cil.ml
> index a7bb129..a4602a4 100644
> --- a/src/cil.ml
> +++ b/src/cil.ml
> @@ -3025,6 +3025,29 @@ let initGccBuiltins () : unit =
>   H.add h "__builtin_ia32_unpcklps" (v4sfType, [v4sfType; v4sfType], false);
>   H.add h "__builtin_ia32_maxps" (v4sfType, [v4sfType; v4sfType], false);
>
> +  (* Atomic Builtins *)
> +  (* These builtins are overloaded, hence the "magic" void type with
> +     __overloaded__ attribute, used to suppress warnings in cabs2cil.ml.
> +     For the same reason, we do not specify the type of the parameters. *)
> +  H.add h "__sync_fetch_and_add" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_fetch_and_sub" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_fetch_and_or" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_fetch_and_and" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_fetch_and_xor" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_fetch_and_nand" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_add_and_fetch" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_sub_and_fetch" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_or_and_fetch" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_and_and_fetch" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_xor_and_fetch" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_nand_and_fetch" (TVoid[Attr("overloaded",[])], [ ], true);
> +  H.add h "__sync_bool_compare_and_swap" (TInt (IBool, []), [ ], true);
> +  H.add h "__sync_val_compare_and_swap" (TVoid[Attr("overloaded",[])], [ ],
> +    true);
> +  H.add h "__sync_synchronize" (voidType, [ ], true);
> +  H.add h "__sync_lock_test_and_set" (TVoid[Attr("overloaded",[])], [ ], 
> true);
> +  H.add h "__sync_lock_release" (voidType, [ ], true);
> +
>   if hasbva then begin
>     H.add h "__builtin_va_end" (voidType, [ TBuiltin_va_list [] ], false);
>     H.add h "__builtin_varargs_start"
> diff --git a/src/frontc/cabs2cil.ml b/src/frontc/cabs2cil.ml
> index d6002bd..8b940cc 100644
> --- a/src/frontc/cabs2cil.ml
> +++ b/src/frontc/cabs2cil.ml
> @@ -3968,7 +3968,8 @@ and doExp (asconst: bool)   (* This expression is used 
> as a constant *)
>         in
>         let argTypesList = argsToList argTypes in
>         (* Drop certain qualifiers from the result type *)
> -        let resType' = typeRemoveAttributes ["warn_unused_result"] resType in
> +        let resType' =
> +          ref (typeRemoveAttributes ["warn_unused_result"] resType) in
>         (* Before we do the arguments we try to intercept a few builtins. For
>          * these we have defined then with a different type, so we do not
>          * want to give warnings. We'll just leave the arguments of these
> @@ -4073,7 +4074,47 @@ and doExp (asconst: bool)   (* This expression is used 
> as a constant *)
>         (* Try to intercept some builtins *)
>         (match !pf with
>           Lval(Var fv, NoOffset) -> begin
> -            if fv.vname = "__builtin_va_arg" then begin
> +            (* Atomic builtins are overloaded: check the type of the
> +               arguments and fix the return type accordingly.
> +               No trick needed for __sync_synchronize,
> +               __sync_bool_compare_and_swap and __sync_lock_release.
> +               Some consistency checks are left to the compiler, we do
> +               as few as we can here to ensure a correct translation. *)
> +            if fv.vname = "__sync_fetch_and_add" ||
> +               fv.vname = "__sync_fetch_and_sub" ||
> +               fv.vname = "__sync_fetch_and_or"  ||
> +               fv.vname = "__sync_fetch_and_and" ||
> +               fv.vname = "__sync_fetch_and_xor" ||
> +               fv.vname = "__sync_fetch_and_nand"||
> +               fv.vname = "__sync_add_and_fetch" ||
> +               fv.vname = "__sync_sub_and_fetch" ||
> +               fv.vname = "__sync_or_and_fetch"  ||
> +               fv.vname = "__sync_and_and_fetch" ||
> +               fv.vname = "__sync_xor_and_fetch" ||
> +               fv.vname = "__sync_nand_and_fetch" ||
> +               fv.vname = "__sync_lock_test_and_set" then begin
> +              match !pargs  with
> +                ptr :: value :: q -> begin match typeOf ptr with
> +                TPtr (vtype, _) ->
> +                    let cast v = snd (castTo (typeOf v) vtype v) in
> +                    resType' := vtype;
> +                    pargs := ptr :: cast value :: q
> +                | _ ->
> +                  ignore (warn "Invalid call to %s" fv.vname) end
> +              | _ ->
> +                  ignore (warn "Invalid call to %s" fv.vname)
> +            end else if fv.vname = "__sync_val_compare_and_swap" then begin
> +              match !pargs  with
> +                ptr :: oldval :: newval :: q -> begin match typeOf ptr with
> +                TPtr (vtype, _) ->
> +                    let cast v = snd (castTo (typeOf v) vtype v) in
> +                    resType' := vtype;
> +                    pargs := ptr :: cast oldval :: cast newval :: q
> +                | _ ->
> +                  ignore (warn "Invalid call to %s" fv.vname) end
> +              | _ ->
> +                  ignore (warn "Invalid call to %s" fv.vname)
> +            end else if fv.vname = "__builtin_va_arg" then begin
>               match !pargs with
>                 marker :: SizeOf resTyp :: _ -> begin
>                   (* Make a variable of the desired type *)
> @@ -4218,14 +4259,14 @@ and doExp (asconst: bool)   (* This expression is 
> used as a constant *)
>           match !pwhat with
>             ADrop -> addCall None zero intType
>
> -          | AType -> prestype := resType'
> +          | AType -> prestype := !resType'
>
>           | ASet(lv, vtype) when !pis__builtin_va_arg ->
>               (* Make an exception here for __builtin_va_arg *)
>               addCall None (Lval(lv)) vtype
>
> -          | ASet(lv, vtype) when !doCollapseCallCast ||
> -              (Util.equals (typeSig vtype) (typeSig resType'))
> +          | ASet(lv, vtype) when !doCollapseCallCast ||
> +              (Util.equals (typeSig vtype) (typeSig !resType'))
>               ->
>               (* We can assign the result directly to lv *)
>               addCall (Some lv) (Lval(lv)) vtype
> @@ -4234,7 +4275,7 @@ and doExp (asconst: bool)   (* This expression is used 
> as a constant *)
>               let restype'' =
>                 match !pwhat with
>                   AExp (Some t) when !doCollapseCallCast -> t
> -                | _ -> resType'
> +                | _ -> !resType'
>               in
>               let descr = dprintf "%a(%a)" dd_exp !pf
>                             (docList ~sep:(text ", ") (dd_exp ())) !pargs in
> diff --git a/test/small1/sync-1.c b/test/small1/sync-1.c
> new file mode 100644
> index 0000000..530ce72
> --- /dev/null
> +++ b/test/small1/sync-1.c
> @@ -0,0 +1,280 @@
> +// From c-torture
> +/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" 
> "" { target *-*-* } 0 } */
> +/* { dg-message "note: '__sync_nand_and_fetch' changed semantics in GCC 4.4" 
> "" { target *-*-* } 0 } */
> +
> +/* Validate that each of the __sync builtins compiles.  This won't
> +   necessarily link, since the target might not support the builtin,
> +   so this may result in external library calls.  */
> +
> +signed char sc;
> +unsigned char uc;
> +signed short ss;
> +unsigned short us;
> +signed int si;
> +unsigned int ui;
> +signed long sl;
> +unsigned long ul;
> +signed long long sll;
> +unsigned long long ull;
> +void *vp;
> +int *ip;
> +struct S { struct S *next; int x; } *sp;
> +
> +void test_op_ignore (void)
> +{
> +  (void) __sync_fetch_and_add (&sc, 1);
> +  (void) __sync_fetch_and_add (&uc, 1);
> +  (void) __sync_fetch_and_add (&ss, 1);
> +  (void) __sync_fetch_and_add (&us, 1);
> +  (void) __sync_fetch_and_add (&si, 1);
> +  (void) __sync_fetch_and_add (&ui, 1);
> +  (void) __sync_fetch_and_add (&sl, 1);
> +  (void) __sync_fetch_and_add (&ul, 1);
> +  (void) __sync_fetch_and_add (&sll, 1);
> +  (void) __sync_fetch_and_add (&ull, 1);
> +
> +  (void) __sync_fetch_and_sub (&sc, 1);
> +  (void) __sync_fetch_and_sub (&uc, 1);
> +  (void) __sync_fetch_and_sub (&ss, 1);
> +  (void) __sync_fetch_and_sub (&us, 1);
> +  (void) __sync_fetch_and_sub (&si, 1);
> +  (void) __sync_fetch_and_sub (&ui, 1);
> +  (void) __sync_fetch_and_sub (&sl, 1);
> +  (void) __sync_fetch_and_sub (&ul, 1);
> +  (void) __sync_fetch_and_sub (&sll, 1);
> +  (void) __sync_fetch_and_sub (&ull, 1);
> +
> +  (void) __sync_fetch_and_or (&sc, 1);
> +  (void) __sync_fetch_and_or (&uc, 1);
> +  (void) __sync_fetch_and_or (&ss, 1);
> +  (void) __sync_fetch_and_or (&us, 1);
> +  (void) __sync_fetch_and_or (&si, 1);
> +  (void) __sync_fetch_and_or (&ui, 1);
> +  (void) __sync_fetch_and_or (&sl, 1);
> +  (void) __sync_fetch_and_or (&ul, 1);
> +  (void) __sync_fetch_and_or (&sll, 1);
> +  (void) __sync_fetch_and_or (&ull, 1);
> +
> +  (void) __sync_fetch_and_xor (&sc, 1);
> +  (void) __sync_fetch_and_xor (&uc, 1);
> +  (void) __sync_fetch_and_xor (&ss, 1);
> +  (void) __sync_fetch_and_xor (&us, 1);
> +  (void) __sync_fetch_and_xor (&si, 1);
> +  (void) __sync_fetch_and_xor (&ui, 1);
> +  (void) __sync_fetch_and_xor (&sl, 1);
> +  (void) __sync_fetch_and_xor (&ul, 1);
> +  (void) __sync_fetch_and_xor (&sll, 1);
> +  (void) __sync_fetch_and_xor (&ull, 1);
> +
> +  (void) __sync_fetch_and_and (&sc, 1);
> +  (void) __sync_fetch_and_and (&uc, 1);
> +  (void) __sync_fetch_and_and (&ss, 1);
> +  (void) __sync_fetch_and_and (&us, 1);
> +  (void) __sync_fetch_and_and (&si, 1);
> +  (void) __sync_fetch_and_and (&ui, 1);
> +  (void) __sync_fetch_and_and (&sl, 1);
> +  (void) __sync_fetch_and_and (&ul, 1);
> +  (void) __sync_fetch_and_and (&sll, 1);
> +  (void) __sync_fetch_and_and (&ull, 1);
> +
> +  (void) __sync_fetch_and_nand (&sc, 1);
> +  (void) __sync_fetch_and_nand (&uc, 1);
> +  (void) __sync_fetch_and_nand (&ss, 1);
> +  (void) __sync_fetch_and_nand (&us, 1);
> +  (void) __sync_fetch_and_nand (&si, 1);
> +  (void) __sync_fetch_and_nand (&ui, 1);
> +  (void) __sync_fetch_and_nand (&sl, 1);
> +  (void) __sync_fetch_and_nand (&ul, 1);
> +  (void) __sync_fetch_and_nand (&sll, 1);
> +  (void) __sync_fetch_and_nand (&ull, 1);
> +}
> +
> +void test_fetch_and_op (void)
> +{
> +  sc = __sync_fetch_and_add (&sc, 11);
> +  uc = __sync_fetch_and_add (&uc, 11);
> +  ss = __sync_fetch_and_add (&ss, 11);
> +  us = __sync_fetch_and_add (&us, 11);
> +  si = __sync_fetch_and_add (&si, 11);
> +  ui = __sync_fetch_and_add (&ui, 11);
> +  sl = __sync_fetch_and_add (&sl, 11);
> +  ul = __sync_fetch_and_add (&ul, 11);
> +  sll = __sync_fetch_and_add (&sll, 11);
> +  ull = __sync_fetch_and_add (&ull, 11);
> +
> +  sc = __sync_fetch_and_sub (&sc, 11);
> +  uc = __sync_fetch_and_sub (&uc, 11);
> +  ss = __sync_fetch_and_sub (&ss, 11);
> +  us = __sync_fetch_and_sub (&us, 11);
> +  si = __sync_fetch_and_sub (&si, 11);
> +  ui = __sync_fetch_and_sub (&ui, 11);
> +  sl = __sync_fetch_and_sub (&sl, 11);
> +  ul = __sync_fetch_and_sub (&ul, 11);
> +  sll = __sync_fetch_and_sub (&sll, 11);
> +  ull = __sync_fetch_and_sub (&ull, 11);
> +
> +  sc = __sync_fetch_and_or (&sc, 11);
> +  uc = __sync_fetch_and_or (&uc, 11);
> +  ss = __sync_fetch_and_or (&ss, 11);
> +  us = __sync_fetch_and_or (&us, 11);
> +  si = __sync_fetch_and_or (&si, 11);
> +  ui = __sync_fetch_and_or (&ui, 11);
> +  sl = __sync_fetch_and_or (&sl, 11);
> +  ul = __sync_fetch_and_or (&ul, 11);
> +  sll = __sync_fetch_and_or (&sll, 11);
> +  ull = __sync_fetch_and_or (&ull, 11);
> +
> +  sc = __sync_fetch_and_xor (&sc, 11);
> +  uc = __sync_fetch_and_xor (&uc, 11);
> +  ss = __sync_fetch_and_xor (&ss, 11);
> +  us = __sync_fetch_and_xor (&us, 11);
> +  si = __sync_fetch_and_xor (&si, 11);
> +  ui = __sync_fetch_and_xor (&ui, 11);
> +  sl = __sync_fetch_and_xor (&sl, 11);
> +  ul = __sync_fetch_and_xor (&ul, 11);
> +  sll = __sync_fetch_and_xor (&sll, 11);
> +  ull = __sync_fetch_and_xor (&ull, 11);
> +
> +  sc = __sync_fetch_and_and (&sc, 11);
> +  uc = __sync_fetch_and_and (&uc, 11);
> +  ss = __sync_fetch_and_and (&ss, 11);
> +  us = __sync_fetch_and_and (&us, 11);
> +  si = __sync_fetch_and_and (&si, 11);
> +  ui = __sync_fetch_and_and (&ui, 11);
> +  sl = __sync_fetch_and_and (&sl, 11);
> +  ul = __sync_fetch_and_and (&ul, 11);
> +  sll = __sync_fetch_and_and (&sll, 11);
> +  ull = __sync_fetch_and_and (&ull, 11);
> +
> +  sc = __sync_fetch_and_nand (&sc, 11);
> +  uc = __sync_fetch_and_nand (&uc, 11);
> +  ss = __sync_fetch_and_nand (&ss, 11);
> +  us = __sync_fetch_and_nand (&us, 11);
> +  si = __sync_fetch_and_nand (&si, 11);
> +  ui = __sync_fetch_and_nand (&ui, 11);
> +  sl = __sync_fetch_and_nand (&sl, 11);
> +  ul = __sync_fetch_and_nand (&ul, 11);
> +  sll = __sync_fetch_and_nand (&sll, 11);
> +  ull = __sync_fetch_and_nand (&ull, 11);
> +}
> +
> +void test_op_and_fetch (void)
> +{
> +  sc = __sync_add_and_fetch (&sc, uc);
> +  uc = __sync_add_and_fetch (&uc, uc);
> +  ss = __sync_add_and_fetch (&ss, uc);
> +  us = __sync_add_and_fetch (&us, uc);
> +  si = __sync_add_and_fetch (&si, uc);
> +  ui = __sync_add_and_fetch (&ui, uc);
> +  sl = __sync_add_and_fetch (&sl, uc);
> +  ul = __sync_add_and_fetch (&ul, uc);
> +  sll = __sync_add_and_fetch (&sll, uc);
> +  ull = __sync_add_and_fetch (&ull, uc);
> +
> +  sc = __sync_sub_and_fetch (&sc, uc);
> +  uc = __sync_sub_and_fetch (&uc, uc);
> +  ss = __sync_sub_and_fetch (&ss, uc);
> +  us = __sync_sub_and_fetch (&us, uc);
> +  si = __sync_sub_and_fetch (&si, uc);
> +  ui = __sync_sub_and_fetch (&ui, uc);
> +  sl = __sync_sub_and_fetch (&sl, uc);
> +  ul = __sync_sub_and_fetch (&ul, uc);
> +  sll = __sync_sub_and_fetch (&sll, uc);
> +  ull = __sync_sub_and_fetch (&ull, uc);
> +
> +  sc = __sync_or_and_fetch (&sc, uc);
> +  uc = __sync_or_and_fetch (&uc, uc);
> +  ss = __sync_or_and_fetch (&ss, uc);
> +  us = __sync_or_and_fetch (&us, uc);
> +  si = __sync_or_and_fetch (&si, uc);
> +  ui = __sync_or_and_fetch (&ui, uc);
> +  sl = __sync_or_and_fetch (&sl, uc);
> +  ul = __sync_or_and_fetch (&ul, uc);
> +  sll = __sync_or_and_fetch (&sll, uc);
> +  ull = __sync_or_and_fetch (&ull, uc);
> +
> +  sc = __sync_xor_and_fetch (&sc, uc);
> +  uc = __sync_xor_and_fetch (&uc, uc);
> +  ss = __sync_xor_and_fetch (&ss, uc);
> +  us = __sync_xor_and_fetch (&us, uc);
> +  si = __sync_xor_and_fetch (&si, uc);
> +  ui = __sync_xor_and_fetch (&ui, uc);
> +  sl = __sync_xor_and_fetch (&sl, uc);
> +  ul = __sync_xor_and_fetch (&ul, uc);
> +  sll = __sync_xor_and_fetch (&sll, uc);
> +  ull = __sync_xor_and_fetch (&ull, uc);
> +
> +  sc = __sync_and_and_fetch (&sc, uc);
> +  uc = __sync_and_and_fetch (&uc, uc);
> +  ss = __sync_and_and_fetch (&ss, uc);
> +  us = __sync_and_and_fetch (&us, uc);
> +  si = __sync_and_and_fetch (&si, uc);
> +  ui = __sync_and_and_fetch (&ui, uc);
> +  sl = __sync_and_and_fetch (&sl, uc);
> +  ul = __sync_and_and_fetch (&ul, uc);
> +  sll = __sync_and_and_fetch (&sll, uc);
> +  ull = __sync_and_and_fetch (&ull, uc);
> +
> +  sc = __sync_nand_and_fetch (&sc, uc);
> +  uc = __sync_nand_and_fetch (&uc, uc);
> +  ss = __sync_nand_and_fetch (&ss, uc);
> +  us = __sync_nand_and_fetch (&us, uc);
> +  si = __sync_nand_and_fetch (&si, uc);
> +  ui = __sync_nand_and_fetch (&ui, uc);
> +  sl = __sync_nand_and_fetch (&sl, uc);
> +  ul = __sync_nand_and_fetch (&ul, uc);
> +  sll = __sync_nand_and_fetch (&sll, uc);
> +  ull = __sync_nand_and_fetch (&ull, uc);
> +}
> +
> +void test_compare_and_swap (void)
> +{
> +  sc = __sync_val_compare_and_swap (&sc, uc, sc);
> +  uc = __sync_val_compare_and_swap (&uc, uc, sc);
> +  ss = __sync_val_compare_and_swap (&ss, uc, sc);
> +  us = __sync_val_compare_and_swap (&us, uc, sc);
> +  si = __sync_val_compare_and_swap (&si, uc, sc);
> +  ui = __sync_val_compare_and_swap (&ui, uc, sc);
> +  sl = __sync_val_compare_and_swap (&sl, uc, sc);
> +  ul = __sync_val_compare_and_swap (&ul, uc, sc);
> +  sll = __sync_val_compare_and_swap (&sll, uc, sc);
> +  ull = __sync_val_compare_and_swap (&ull, uc, sc);
> +
> +  ui = __sync_bool_compare_and_swap (&sc, uc, sc);
> +  ui = __sync_bool_compare_and_swap (&uc, uc, sc);
> +  ui = __sync_bool_compare_and_swap (&ss, uc, sc);
> +  ui = __sync_bool_compare_and_swap (&us, uc, sc);
> +  ui = __sync_bool_compare_and_swap (&si, uc, sc);
> +  ui = __sync_bool_compare_and_swap (&ui, uc, sc);
> +  ui = __sync_bool_compare_and_swap (&sl, uc, sc);
> +  ui = __sync_bool_compare_and_swap (&ul, uc, sc);
> +  ui = __sync_bool_compare_and_swap (&sll, uc, sc);
> +  ui = __sync_bool_compare_and_swap (&ull, uc, sc);
> +}
> +
> +void test_lock (void)
> +{
> +  sc = __sync_lock_test_and_set (&sc, 1);
> +  uc = __sync_lock_test_and_set (&uc, 1);
> +  ss = __sync_lock_test_and_set (&ss, 1);
> +  us = __sync_lock_test_and_set (&us, 1);
> +  si = __sync_lock_test_and_set (&si, 1);
> +  ui = __sync_lock_test_and_set (&ui, 1);
> +  sl = __sync_lock_test_and_set (&sl, 1);
> +  ul = __sync_lock_test_and_set (&ul, 1);
> +  sll = __sync_lock_test_and_set (&sll, 1);
> +  ull = __sync_lock_test_and_set (&ull, 1);
> +
> +  __sync_synchronize ();
> +
> +  __sync_lock_release (&sc);
> +  __sync_lock_release (&uc);
> +  __sync_lock_release (&ss);
> +  __sync_lock_release (&us);
> +  __sync_lock_release (&si);
> +  __sync_lock_release (&ui);
> +  __sync_lock_release (&sl);
> +  __sync_lock_release (&ul);
> +  __sync_lock_release (&sll);
> +  __sync_lock_release (&ull);
> +}
> diff --git a/test/small1/sync-2.c b/test/small1/sync-2.c
> new file mode 100644
> index 0000000..b4e9bb7
> --- /dev/null
> +++ b/test/small1/sync-2.c
> @@ -0,0 +1,169 @@
> +// From c-torture
> +/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" 
> "" { target *-*-* } 0 } */
> +
> +/* Validate that each of the __sync builtins compiles.  This won't
> +   necessarily link, since the target might not support the builtin,
> +   so this may result in external library calls.  */
> +
> +signed char sc;
> +unsigned char uc;
> +signed short ss;
> +unsigned short us;
> +signed int si;
> +unsigned int ui;
> +signed long sl;
> +unsigned long ul;
> +signed long long sll;
> +unsigned long long ull;
> +
> +void test_op_ignore (void)
> +{
> +  (void) __sync_fetch_and_add (&sc, -1);
> +  (void) __sync_fetch_and_add (&uc, -1);
> +  (void) __sync_fetch_and_add (&ss, -1);
> +  (void) __sync_fetch_and_add (&us, -1);
> +  (void) __sync_fetch_and_add (&si, -1);
> +  (void) __sync_fetch_and_add (&ui, -1);
> +  (void) __sync_fetch_and_add (&sl, -1);
> +  (void) __sync_fetch_and_add (&ul, -1);
> +  (void) __sync_fetch_and_add (&sll, -1);
> +  (void) __sync_fetch_and_add (&ull, -1);
> +
> +  (void) __sync_fetch_and_sub (&sc, -1);
> +  (void) __sync_fetch_and_sub (&uc, -1);
> +  (void) __sync_fetch_and_sub (&ss, -1);
> +  (void) __sync_fetch_and_sub (&us, -1);
> +  (void) __sync_fetch_and_sub (&si, -1);
> +  (void) __sync_fetch_and_sub (&ui, -1);
> +  (void) __sync_fetch_and_sub (&sl, -1);
> +  (void) __sync_fetch_and_sub (&ul, -1);
> +  (void) __sync_fetch_and_sub (&sll, -1);
> +  (void) __sync_fetch_and_sub (&ull, -1);
> +
> +  (void) __sync_fetch_and_or (&sc, -1);
> +  (void) __sync_fetch_and_or (&uc, -1);
> +  (void) __sync_fetch_and_or (&ss, -1);
> +  (void) __sync_fetch_and_or (&us, -1);
> +  (void) __sync_fetch_and_or (&si, -1);
> +  (void) __sync_fetch_and_or (&ui, -1);
> +  (void) __sync_fetch_and_or (&sl, -1);
> +  (void) __sync_fetch_and_or (&ul, -1);
> +  (void) __sync_fetch_and_or (&sll, -1);
> +  (void) __sync_fetch_and_or (&ull, -1);
> +
> +  (void) __sync_fetch_and_xor (&sc, -1);
> +  (void) __sync_fetch_and_xor (&uc, -1);
> +  (void) __sync_fetch_and_xor (&ss, -1);
> +  (void) __sync_fetch_and_xor (&us, -1);
> +  (void) __sync_fetch_and_xor (&si, -1);
> +  (void) __sync_fetch_and_xor (&ui, -1);
> +  (void) __sync_fetch_and_xor (&sl, -1);
> +  (void) __sync_fetch_and_xor (&ul, -1);
> +  (void) __sync_fetch_and_xor (&sll, -1);
> +  (void) __sync_fetch_and_xor (&ull, -1);
> +
> +  (void) __sync_fetch_and_and (&sc, -1);
> +  (void) __sync_fetch_and_and (&uc, -1);
> +  (void) __sync_fetch_and_and (&ss, -1);
> +  (void) __sync_fetch_and_and (&us, -1);
> +  (void) __sync_fetch_and_and (&si, -1);
> +  (void) __sync_fetch_and_and (&ui, -1);
> +  (void) __sync_fetch_and_and (&sl, -1);
> +  (void) __sync_fetch_and_and (&ul, -1);
> +  (void) __sync_fetch_and_and (&sll, -1);
> +  (void) __sync_fetch_and_and (&ull, -1);
> +
> +  (void) __sync_fetch_and_nand (&sc, -1);
> +  (void) __sync_fetch_and_nand (&uc, -1);
> +  (void) __sync_fetch_and_nand (&ss, -1);
> +  (void) __sync_fetch_and_nand (&us, -1);
> +  (void) __sync_fetch_and_nand (&si, -1);
> +  (void) __sync_fetch_and_nand (&ui, -1);
> +  (void) __sync_fetch_and_nand (&sl, -1);
> +  (void) __sync_fetch_and_nand (&ul, -1);
> +  (void) __sync_fetch_and_nand (&sll, -1);
> +  (void) __sync_fetch_and_nand (&ull, -1);
> +}
> +
> +void test_fetch_and_op (void)
> +{
> +  sc = __sync_fetch_and_add (&sc, -11);
> +  uc = __sync_fetch_and_add (&uc, -11);
> +  ss = __sync_fetch_and_add (&ss, -11);
> +  us = __sync_fetch_and_add (&us, -11);
> +  si = __sync_fetch_and_add (&si, -11);
> +  ui = __sync_fetch_and_add (&ui, -11);
> +  sl = __sync_fetch_and_add (&sl, -11);
> +  ul = __sync_fetch_and_add (&ul, -11);
> +  sll = __sync_fetch_and_add (&sll, -11);
> +  ull = __sync_fetch_and_add (&ull, -11);
> +
> +  sc = __sync_fetch_and_sub (&sc, -11);
> +  uc = __sync_fetch_and_sub (&uc, -11);
> +  ss = __sync_fetch_and_sub (&ss, -11);
> +  us = __sync_fetch_and_sub (&us, -11);
> +  si = __sync_fetch_and_sub (&si, -11);
> +  ui = __sync_fetch_and_sub (&ui, -11);
> +  sl = __sync_fetch_and_sub (&sl, -11);
> +  ul = __sync_fetch_and_sub (&ul, -11);
> +  sll = __sync_fetch_and_sub (&sll, -11);
> +  ull = __sync_fetch_and_sub (&ull, -11);
> +
> +  sc = __sync_fetch_and_or (&sc, -11);
> +  uc = __sync_fetch_and_or (&uc, -11);
> +  ss = __sync_fetch_and_or (&ss, -11);
> +  us = __sync_fetch_and_or (&us, -11);
> +  si = __sync_fetch_and_or (&si, -11);
> +  ui = __sync_fetch_and_or (&ui, -11);
> +  sl = __sync_fetch_and_or (&sl, -11);
> +  ul = __sync_fetch_and_or (&ul, -11);
> +  sll = __sync_fetch_and_or (&sll, -11);
> +  ull = __sync_fetch_and_or (&ull, -11);
> +
> +  sc = __sync_fetch_and_xor (&sc, -11);
> +  uc = __sync_fetch_and_xor (&uc, -11);
> +  ss = __sync_fetch_and_xor (&ss, -11);
> +  us = __sync_fetch_and_xor (&us, -11);
> +  si = __sync_fetch_and_xor (&si, -11);
> +  ui = __sync_fetch_and_xor (&ui, -11);
> +  sl = __sync_fetch_and_xor (&sl, -11);
> +  ul = __sync_fetch_and_xor (&ul, -11);
> +  sll = __sync_fetch_and_xor (&sll, -11);
> +  ull = __sync_fetch_and_xor (&ull, -11);
> +
> +  sc = __sync_fetch_and_and (&sc, -11);
> +  uc = __sync_fetch_and_and (&uc, -11);
> +  ss = __sync_fetch_and_and (&ss, -11);
> +  us = __sync_fetch_and_and (&us, -11);
> +  si = __sync_fetch_and_and (&si, -11);
> +  ui = __sync_fetch_and_and (&ui, -11);
> +  sl = __sync_fetch_and_and (&sl, -11);
> +  ul = __sync_fetch_and_and (&ul, -11);
> +  sll = __sync_fetch_and_and (&sll, -11);
> +  ull = __sync_fetch_and_and (&ull, -11);
> +
> +  sc = __sync_fetch_and_nand (&sc, -11);
> +  uc = __sync_fetch_and_nand (&uc, -11);
> +  ss = __sync_fetch_and_nand (&ss, -11);
> +  us = __sync_fetch_and_nand (&us, -11);
> +  si = __sync_fetch_and_nand (&si, -11);
> +  ui = __sync_fetch_and_nand (&ui, -11);
> +  sl = __sync_fetch_and_nand (&sl, -11);
> +  ul = __sync_fetch_and_nand (&ul, -11);
> +  sll = __sync_fetch_and_nand (&sll, -11);
> +  ull = __sync_fetch_and_nand (&ull, -11);
> +}
> +
> +void test_lock (void)
> +{
> +  sc = __sync_lock_test_and_set (&sc, -1);
> +  uc = __sync_lock_test_and_set (&uc, -1);
> +  ss = __sync_lock_test_and_set (&ss, -1);
> +  us = __sync_lock_test_and_set (&us, -1);
> +  si = __sync_lock_test_and_set (&si, -1);
> +  ui = __sync_lock_test_and_set (&ui, -1);
> +  sl = __sync_lock_test_and_set (&sl, -1);
> +  ul = __sync_lock_test_and_set (&ul, -1);
> +  sll = __sync_lock_test_and_set (&sll, -1);
> +  ull = __sync_lock_test_and_set (&ull, -1);
> +}
> diff --git a/test/small1/sync-3.c b/test/small1/sync-3.c
> new file mode 100644
> index 0000000..96ac2b7
> --- /dev/null
> +++ b/test/small1/sync-3.c
> @@ -0,0 +1,188 @@
> +// From c-torture
> +/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" 
> "" { target *-*-* } 0 } */
> +
> +/* Validate that each of the __sync builtins compiles.  This won't
> +   necessarily link, since the target might not support the builtin,
> +   so this may result in external library calls.  */
> +
> +void test_op_ignore (void)
> +{
> +signed char sc[2];
> +unsigned char uc[2];
> +signed short ss[2];
> +unsigned short us[2];
> +signed int si[2];
> +unsigned int ui[2];
> +signed long sl[2];
> +unsigned long ul[2];
> +signed long long sll[2];
> +unsigned long long ull[2];
> +  (void) __sync_fetch_and_add (&sc[1], -1);
> +  (void) __sync_fetch_and_add (&uc[1], -1);
> +  (void) __sync_fetch_and_add (&ss[1], -1);
> +  (void) __sync_fetch_and_add (&us[1], -1);
> +  (void) __sync_fetch_and_add (&si[1], -1);
> +  (void) __sync_fetch_and_add (&ui[1], -1);
> +  (void) __sync_fetch_and_add (&sl[1], -1);
> +  (void) __sync_fetch_and_add (&ul[1], -1);
> +  (void) __sync_fetch_and_add (&sll[1], -1);
> +  (void) __sync_fetch_and_add (&ull[1], -1);
> +
> +  (void) __sync_fetch_and_sub (&sc[1], -1);
> +  (void) __sync_fetch_and_sub (&uc[1], -1);
> +  (void) __sync_fetch_and_sub (&ss[1], -1);
> +  (void) __sync_fetch_and_sub (&us[1], -1);
> +  (void) __sync_fetch_and_sub (&si[1], -1);
> +  (void) __sync_fetch_and_sub (&ui[1], -1);
> +  (void) __sync_fetch_and_sub (&sl[1], -1);
> +  (void) __sync_fetch_and_sub (&ul[1], -1);
> +  (void) __sync_fetch_and_sub (&sll[1], -1);
> +  (void) __sync_fetch_and_sub (&ull[1], -1);
> +
> +  (void) __sync_fetch_and_or (&sc[1], -1);
> +  (void) __sync_fetch_and_or (&uc[1], -1);
> +  (void) __sync_fetch_and_or (&ss[1], -1);
> +  (void) __sync_fetch_and_or (&us[1], -1);
> +  (void) __sync_fetch_and_or (&si[1], -1);
> +  (void) __sync_fetch_and_or (&ui[1], -1);
> +  (void) __sync_fetch_and_or (&sl[1], -1);
> +  (void) __sync_fetch_and_or (&ul[1], -1);
> +  (void) __sync_fetch_and_or (&sll[1], -1);
> +  (void) __sync_fetch_and_or (&ull[1], -1);
> +
> +  (void) __sync_fetch_and_xor (&sc[1], -1);
> +  (void) __sync_fetch_and_xor (&uc[1], -1);
> +  (void) __sync_fetch_and_xor (&ss[1], -1);
> +  (void) __sync_fetch_and_xor (&us[1], -1);
> +  (void) __sync_fetch_and_xor (&si[1], -1);
> +  (void) __sync_fetch_and_xor (&ui[1], -1);
> +  (void) __sync_fetch_and_xor (&sl[1], -1);
> +  (void) __sync_fetch_and_xor (&ul[1], -1);
> +  (void) __sync_fetch_and_xor (&sll[1], -1);
> +  (void) __sync_fetch_and_xor (&ull[1], -1);
> +
> +  (void) __sync_fetch_and_and (&sc[1], -1);
> +  (void) __sync_fetch_and_and (&uc[1], -1);
> +  (void) __sync_fetch_and_and (&ss[1], -1);
> +  (void) __sync_fetch_and_and (&us[1], -1);
> +  (void) __sync_fetch_and_and (&si[1], -1);
> +  (void) __sync_fetch_and_and (&ui[1], -1);
> +  (void) __sync_fetch_and_and (&sl[1], -1);
> +  (void) __sync_fetch_and_and (&ul[1], -1);
> +  (void) __sync_fetch_and_and (&sll[1], -1);
> +  (void) __sync_fetch_and_and (&ull[1], -1);
> +
> +  (void) __sync_fetch_and_nand (&sc[1], -1);
> +  (void) __sync_fetch_and_nand (&uc[1], -1);
> +  (void) __sync_fetch_and_nand (&ss[1], -1);
> +  (void) __sync_fetch_and_nand (&us[1], -1);
> +  (void) __sync_fetch_and_nand (&si[1], -1);
> +  (void) __sync_fetch_and_nand (&ui[1], -1);
> +  (void) __sync_fetch_and_nand (&sl[1], -1);
> +  (void) __sync_fetch_and_nand (&ul[1], -1);
> +  (void) __sync_fetch_and_nand (&sll[1], -1);
> +  (void) __sync_fetch_and_nand (&ull[1], -1);
> +}
> +
> +void test_fetch_and_op (void)
> +{
> +signed char sc[2];
> +unsigned char uc[2];
> +signed short ss[2];
> +unsigned short us[2];
> +signed int si[2];
> +unsigned int ui[2];
> +signed long sl[2];
> +unsigned long ul[2];
> +signed long long sll[2];
> +unsigned long long ull[2];
> +  sc[1] = __sync_fetch_and_add (&sc[1], -11);
> +  uc[1] = __sync_fetch_and_add (&uc[1], -11);
> +  ss[1] = __sync_fetch_and_add (&ss[1], -11);
> +  us[1] = __sync_fetch_and_add (&us[1], -11);
> +  si[1] = __sync_fetch_and_add (&si[1], -11);
> +  ui[1] = __sync_fetch_and_add (&ui[1], -11);
> +  sl[1] = __sync_fetch_and_add (&sl[1], -11);
> +  ul[1] = __sync_fetch_and_add (&ul[1], -11);
> +  sll[1] = __sync_fetch_and_add (&sll[1], -11);
> +  ull[1] = __sync_fetch_and_add (&ull[1], -11);
> +
> +  sc[1] = __sync_fetch_and_sub (&sc[1], -11);
> +  uc[1] = __sync_fetch_and_sub (&uc[1], -11);
> +  ss[1] = __sync_fetch_and_sub (&ss[1], -11);
> +  us[1] = __sync_fetch_and_sub (&us[1], -11);
> +  si[1] = __sync_fetch_and_sub (&si[1], -11);
> +  ui[1] = __sync_fetch_and_sub (&ui[1], -11);
> +  sl[1] = __sync_fetch_and_sub (&sl[1], -11);
> +  ul[1] = __sync_fetch_and_sub (&ul[1], -11);
> +  sll[1] = __sync_fetch_and_sub (&sll[1], -11);
> +  ull[1] = __sync_fetch_and_sub (&ull[1], -11);
> +
> +  sc[1] = __sync_fetch_and_or (&sc[1], -11);
> +  uc[1] = __sync_fetch_and_or (&uc[1], -11);
> +  ss[1] = __sync_fetch_and_or (&ss[1], -11);
> +  us[1] = __sync_fetch_and_or (&us[1], -11);
> +  si[1] = __sync_fetch_and_or (&si[1], -11);
> +  ui[1] = __sync_fetch_and_or (&ui[1], -11);
> +  sl[1] = __sync_fetch_and_or (&sl[1], -11);
> +  ul[1] = __sync_fetch_and_or (&ul[1], -11);
> +  sll[1] = __sync_fetch_and_or (&sll[1], -11);
> +  ull[1] = __sync_fetch_and_or (&ull[1], -11);
> +
> +  sc[1] = __sync_fetch_and_xor (&sc[1], -11);
> +  uc[1] = __sync_fetch_and_xor (&uc[1], -11);
> +  ss[1] = __sync_fetch_and_xor (&ss[1], -11);
> +  us[1] = __sync_fetch_and_xor (&us[1], -11);
> +  si[1] = __sync_fetch_and_xor (&si[1], -11);
> +  ui[1] = __sync_fetch_and_xor (&ui[1], -11);
> +  sl[1] = __sync_fetch_and_xor (&sl[1], -11);
> +  ul[1] = __sync_fetch_and_xor (&ul[1], -11);
> +  sll[1] = __sync_fetch_and_xor (&sll[1], -11);
> +  ull[1] = __sync_fetch_and_xor (&ull[1], -11);
> +
> +  sc[1] = __sync_fetch_and_and (&sc[1], -11);
> +  uc[1] = __sync_fetch_and_and (&uc[1], -11);
> +  ss[1] = __sync_fetch_and_and (&ss[1], -11);
> +  us[1] = __sync_fetch_and_and (&us[1], -11);
> +  si[1] = __sync_fetch_and_and (&si[1], -11);
> +  ui[1] = __sync_fetch_and_and (&ui[1], -11);
> +  sl[1] = __sync_fetch_and_and (&sl[1], -11);
> +  ul[1] = __sync_fetch_and_and (&ul[1], -11);
> +  sll[1] = __sync_fetch_and_and (&sll[1], -11);
> +  ull[1] = __sync_fetch_and_and (&ull[1], -11);
> +
> +  sc[1] = __sync_fetch_and_nand (&sc[1], -11);
> +  uc[1] = __sync_fetch_and_nand (&uc[1], -11);
> +  ss[1] = __sync_fetch_and_nand (&ss[1], -11);
> +  us[1] = __sync_fetch_and_nand (&us[1], -11);
> +  si[1] = __sync_fetch_and_nand (&si[1], -11);
> +  ui[1] = __sync_fetch_and_nand (&ui[1], -11);
> +  sl[1] = __sync_fetch_and_nand (&sl[1], -11);
> +  ul[1] = __sync_fetch_and_nand (&ul[1], -11);
> +  sll[1] = __sync_fetch_and_nand (&sll[1], -11);
> +  ull[1] = __sync_fetch_and_nand (&ull[1], -11);
> +}
> +
> +void test_lock (void)
> +{
> +signed char sc[2];
> +unsigned char uc[2];
> +signed short ss[2];
> +unsigned short us[2];
> +signed int si[2];
> +unsigned int ui[2];
> +signed long sl[2];
> +unsigned long ul[2];
> +signed long long sll[2];
> +unsigned long long ull[2];
> +  sc[1] = __sync_lock_test_and_set (&sc[1], -1);
> +  uc[1] = __sync_lock_test_and_set (&uc[1], -1);
> +  ss[1] = __sync_lock_test_and_set (&ss[1], -1);
> +  us[1] = __sync_lock_test_and_set (&us[1], -1);
> +  si[1] = __sync_lock_test_and_set (&si[1], -1);
> +  ui[1] = __sync_lock_test_and_set (&ui[1], -1);
> +  sl[1] = __sync_lock_test_and_set (&sl[1], -1);
> +  ul[1] = __sync_lock_test_and_set (&ul[1], -1);
> +  sll[1] = __sync_lock_test_and_set (&sll[1], -1);
> +  ull[1] = __sync_lock_test_and_set (&ull[1], -1);
> +}
> diff --git a/test/testcil.pl b/test/testcil.pl
> index faf0ff7..adbc679 100644
> --- a/test/testcil.pl
> +++ b/test/testcil.pl
> @@ -554,6 +554,9 @@ addTest("testrun/builtin3 ");
>  addTest("testrun/builtin_choose_expr");
>  addTest("testrun/builtin4 ");
>  addTest("test/builtin5 ");
> +addTest("test/sync-1 _GNUCC=1");
> +addTest("test/sync-2 _GNUCC=1");
> +addTest("test/sync-3 _GNUCC=1");
>  addTest("testrun/comparisons");
>  addTest("testrun/assign");
>
> --
> 1.6.5
>
>
> ------------------------------------------------------------------------------
> Throughout its 18-year history, RSA Conference consistently attracts the
> world's best and brightest in the field, creating opportunities for Conference
> attendees to learn about information security's most important issues through
> interactions with peers, luminaries and emerging and established companies.
> http://p.sf.net/sfu/rsaconf-dev2dev
> _______________________________________________
> CIL-users mailing list
> CIL-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/cil-users
>

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
CIL-users mailing list
CIL-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cil-users

Reply via email to