This is the bulk of the implementation of pragma Volatile_Full_Access.  It is 
piggybacked on the existing support for atomic accesses in gigi and generates 
the load-modify-store sequences when need be.

Tested on x86_64-suse-linux, applied on the mainline.


2015-05-25  Eric Botcazou  <ebotca...@adacore.com>

        * gcc-interface/gigi.h (build_atomic_load): Adjust prototype.
        (build_atomic_store): Likewise.
        (build_load_modify_store): Declare.
        (VECTOR_TYPE_P): Delete.
        * gcc-interface/decl.c (gnat_to_gnu_entity): Replace Is_Atomic with
        Is_Atomic_Or_VFA throughout.
        <E_Array_Type>: Build a variant of the XUA type instead of forcing
        TYPE_VOLATILE on it.
        <E_Array_Subtype>: Use the main variant of the base type.
        Do not force TYPE_VOLATILE on the type being built.
        <E_Record_Type>: Likewise.
        <E_Array_Subtype>: Likewise.
        <E_Subprogram_Type>: Rename local variable.
        Add Atomic qualifier in conjunction with Volatile on types if needed.
        Force BLKmode for by-ref types only at the end of the processing.
        Change qualifiers only after changing the mode of the type.  Set
        TYPE_UNIVERSAL_ALIASING_P on the type directly.
        (check_ok_for_atomic_type): Issue specific error message for VFA.
        (gnat_to_gnu_component_type): Replace Is_Atomic with
        Is_Atomic_Or_VFA throughout.
        * gcc-interface/misc.c (gnat_get_alias_set): Test
        TYPE_UNIVERSAL_ALIASING_P on the type directly.
        * gcc-interface/trans.c (lvalue_required_p): Replace Is_Atomic with
        Is_Atomic_Or_VFA throughout.  Add missing guard.
        (node_is_atomic): New predicate.
        (node_has_volatile_full_access): Likewise.
        (gnat_strip_type_conversion): New function.
        (outer_atomic_access_required_p): New predicate.
        (atomic_sync_required_p): Rename into...
        (atomic_access_required_p): ...this.  Add SYNC parameter, scan the
        parent node first and then look for the atomic setting.  Add support
        for Volatile_Full_Access.
        (Call_to_gnu): Add atomic_access and outer_atomic_access parameters
        and adjusts calls to above functions.  Use load-modify-store sequence
        for updates of In/Out and Out parameters if required, as well as for
        moving the result to the target if required.  Add couple of missing
        guards.
        (gnat_to_gnu): Adjust calls to above functions.
        <N_Object_Renaming_Declaration>: If the renamed object has side-effects
        evaluate only its address.
        <N_Assignment_Statement>: Adjust call to Call_to_gnu.  Use load-modify
        store sequence if required.
        <N_Function_Call>: Adjust call to Call_to_gnu.
        (extract_values): Adjust comment.
        * gcc-interface/utils2.c (build_atomic_load): Add SYNC parameter and
        use relaxed memory model if it is not set.
        (build_atomic_store): Likewise.
        (call_is_atomic_load): New predicate.
        (build_load_modify_store): New function.
        (build_binary_op) <MODIFY_EXPR>: Accept SAVE_EXPR on the LHS.
        (gnat_stabilize_reference) <CALL_EXPR>: Deal with atomic loads.


2015-05-25  Eric Botcazou  <ebotca...@adacore.com>

        * gnat.dg/vfa1_1.adb: New test.
        * gnat.dg/vfa1_2.adb: Likewise.
        * gnat.dg/vfa1_3.adb: Likewise.
        * gnat.dg/vfa1_4.adb: Likewise.
        * gnat.dg/vfa1_pkg.ads: New helper.


-- 
Eric Botcazou

Reply via email to