We add new field types Valid_Uint, Unat, Upos, Nonzero_Uint,
which have predicates that assert the value is a proper
Uint value (i.e. not No_Uint), and that the value is
appropriate. It is not clear that Nonzero_Uint is needed,
but it is useful in testing; we can always remove it later.

We use the new field types for Alignment (which requires
changes) and a few others (which were easy). We intend to
use these for other fields as well. For example, Esize should
be of type Valid_Uint.

Fields of these new subtypes have no default (unlike Uint fields, which
still default to Uint_0); it is required to set them before calling
the getter. This patch fixes various places where that was not true
(so far, mainly for Alignment).

The "unknown" state of Alignment is now represented by the initial zero
value (instead of Uint_0). Unfortunately, we often set Alignment to some
value, and then set it back to unknown, so we need Init_Alignment to
call Reinit_Field_To_Zero. We intend to change other fields, such as
Esize, in a similar way.

Note that "initial zero value" and Uint_0 are two different things.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

        * uintp.ads, types.h: New subtypes of Uint: Valid_Uint, Unat,
        Upos, Nonzero_Uint with predicates. These correspond to new
        field types in Gen_IL.
        * gen_il-types.ads (Valid_Uint, Unat, Upos, Nonzero_Uint): New
        field types.
        * einfo-utils.ads, einfo-utils.adb, fe.h (Known_Alignment,
        Init_Alignment): Use the initial zero value to represent
        "unknown". This will ensure that if Alignment is called before
        Set_Alignment, the compiler will blow up (if assertions are
        enabled).
        * atree.ads, atree.adb, atree.h, gen_il-gen.adb
        (Get_Valid_32_Bit_Field): New generic low-level getter for
        subtypes of Uint.
        (Copy_Alignment): New procedure to copy Alignment field even
        when Unknown.
        (Init_Object_Size_Align, Init_Size_Align): Do not bypass the
        Init_ procedures.
        * exp_pakd.adb, freeze.adb, layout.adb, repinfo.adb,
        sem_util.adb: Protect calls to Alignment with Known_Alignment.
        Use Copy_Alignment when it might be unknown.
        * gen_il-gen-gen_entities.adb (Alignment,
        String_Literal_Length): Use type Unat instead of Uint, to ensure
        that the field is always Set_ before we get it, and that it is
        set to a nonnegative value.
        (Enumeration_Pos): Unat.
        (Enumeration_Rep): Valid_Uint. Can be negative, but must be
        valid before fetching.
        (Discriminant_Number): Upos.
        (Renaming_Map): Remove.
        * gen_il-gen-gen_nodes.adb (Char_Literal_Value, Reason): Unat.
        (Intval, Corresponding_Integer_Value): Valid_Uint.
        * gen_il-internals.ads: New functions for dealing with special
        defaults and new subtypes of Uint.
        * scans.ads: Correct comments.
        * scn.adb (Post_Scan): Do not set Intval to No_Uint; that is no
        longer allowed.
        * sem_ch13.adb (Analyze_Enumeration_Representation_Clause): Do
        not set Enumeration_Rep to No_Uint; that is no longer allowed.
        (Offset_Value): Protect calls to Alignment with Known_Alignment.
        * sem_prag.adb (Set_Atomic_VFA): Do not use Uint_0 to mean
        "unknown"; call Init_Alignment instead.
        * sinfo.ads: Minor comment fix.
        * treepr.adb: Deal with printing of new field types.
        * einfo.ads, gen_il-fields.ads (Renaming_Map): Remove.
        * gcc-interface/decl.c (gnat_to_gnu_entity): Use Known_Alignment
        before calling Alignment. This preserve some probably buggy
        behavior: if the alignment is not set, it previously defaulted
        to Uint_0; we now make that explicit.  Use Copy_Alignment,
        because "Set_Alignment (Y, Alignment (X));" no longer works when
        the Alignment of X has not yet been set.
        * gcc-interface/trans.c (process_freeze_entity): Use
        Copy_Alignment.

Attachment: patch.diff.gz
Description: application/gzip

Reply via email to