ada: Refine upper array bound for bit packed array
commit047269320d433e4024fcb3580f638bcb2aca7664
authorMarc Poulhiès <poulhies@adacore.com>
Fri, 8 Sep 2023 15:15:48 +0000 (8 15:15 +0000)
committerMarc Poulhiès <poulhies@adacore.com>
Tue, 19 Sep 2023 11:26:42 +0000 (19 13:26 +0200)
tree0734467aac08433e2acd7b56df0b41df00e833ca
parent54c16824f0f05313bfc7df5e625f108b4ff7c636
ada: Refine upper array bound for bit packed array

When using bit-packed arrays, the compiler creates new array subtypes of
1-bit component indexed by integers. The existing routine checks the
index subtype to find the min/max values. Bit-packed arrays being
indexed by integers, the routines gives up as returning the maximum
possible integer carries no useful information.

This change adds a simple max_value routine that can evaluate very
simple expressions by substituting variables by their min/max value.
Bit-packed array subtypes are currently declared as:

  subtype bp_array is packed_bytes1 (0 .. integer((1 * Var +  7) / 8 - 1));

The simple max_value evaluator handles the bare minimum for this
expression pattern.

gcc/ada/ChangeLog:

* gcc-interface/utils.cc (max_value): New.
* gcc-interface/gigi.h (max_value): New.
* gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Array_Subtype>:
When computing gnu_min/gnu_max, try to use max_value if there is
an initial expression.
gcc/ada/gcc-interface/decl.cc
gcc/ada/gcc-interface/gigi.h
gcc/ada/gcc-interface/utils.cc