diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2004-02-02 13:32:01 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2004-02-02 13:32:01 +0100 |
commit | 6e937c1c5c91aa000bbb549e2dcd8290fcc20a7d (patch) | |
tree | 30150d4eda55a02c6bc00f9262c17b795a63423d /gcc/ada/utils.c | |
parent | d560b0aa2ab4f07365674f3a7d2e4a4626c363c5 (diff) | |
download | gcc-6e937c1c5c91aa000bbb549e2dcd8290fcc20a7d.zip gcc-6e937c1c5c91aa000bbb549e2dcd8290fcc20a7d.tar.gz gcc-6e937c1c5c91aa000bbb549e2dcd8290fcc20a7d.tar.bz2 |
[multiple changes]
2004-02-02 Vincent Celier <celier@gnat.com>
* gprcmd.adb (Check_Args): If condition is false, print the invoked
comment before the usage.
Gprcmd: Fail when command is not recognized.
(Usage): Document command "prefix"
* g-md5.adb (Digest): Process last block.
(Update): Do not process last block. Store remaining characters and
length in Context.
* g-md5.ads (Update): Document that several call to update are
equivalent to one call with the concatenated string.
(Context): Add fields to allow new Update behaviour.
* fname-uf.ads/adb (Get_File_Name): New Boolean parameter May_Fail,
defaulted to False.
When May_Fail is True and no existing file can be found, return No_File.
* 6vcstrea.adb: Inlined functions are now wrappers to implementation
functions.
* lib-writ.adb (Write_With_Lines): When body file does not exist, use
spec file name instead on the W line.
2004-02-02 Robert Dewar <dewar@gnat.com>
* ali.adb: Read and acquire info from new format restrictions lines
* bcheck.adb: Add circuits for checking restrictions with parameters
* bindgen.adb: Output dummy restrictions data
To be changed later
* ali.ads, checks.adb, exp_aggr.adb, exp_attr.adb, exp_ch11.adb,
exp_ch3.adb, exp_ch5.adb, exp_ch6.adb, exp_ch7.adb, exp_util.adb,
freeze.adb, gnat1drv.adb, sem_attr.adb, sem_ch10.adb, sem_ch11.adb,
sem_ch12.adb, targparm.adb, targparm.ads, tbuild.adb, sem_ch2.adb,
sem_elab.adb, sem_res.adb: Minor changes for new restrictions handling.
* exp_ch9.adb (Build_Master_Entity): Cleanup the code (also suppresses
the warning message on access to possibly uninitialized variable S)
Minor changes for new restrictions handling.
* gnatbind.adb: Minor reformatting
Minor changes for new restrictions handling
Move circuit for -r processing here from bcheck (cleaner)
* gnatcmd.adb, gnatlink.adb: Minor reformatting
* lib-writ.adb: Output new format restrictions lines
* lib-writ.ads: Document new R format lines for new restrictions
handling.
* s-restri.ads/adb: New files
* Makefile.rtl: Add entry for s-restri.ads/adb
* par-ch3.adb: Fix bad error messages starting with upper case letter
Minor reformatting
* restrict.adb: Major rewrite throughout for new restrictions handling
Major point is to handle restrictions with parameters
* restrict.ads: Major changes in interface to handle restrictions with
parameters. Also generally simplifies setting of restrictions.
* snames.ads/adb: New entry for proper handling of No_Requeue
* sem_ch3.adb (Count_Tasks): New circuitry for implementing Max_Tasks
restriction counting.
Other minor changes for new restrictions handling
* sem_prag.adb: No_Requeue is a synonym for No_Requeue_Statements.
Restriction_Warnings now allows full parameter notation
Major rewrite of Restrictions for new restrictions handling
2004-02-02 Javier Miranda <miranda@gnat.com>
* par-ch3.adb (P_Identifier_Declarations): Give support to the Ada 0Y
syntax rule for object renaming declarations.
(P_Array_Type_Definition): Give support for the Ada 0Y syntax rule for
component definitions.
* sem_ch3.adb (Analyze_Component_Declaration): Give support to access
components.
(Array_Type_Declaration): Give support to access components. In addition
it was also modified to reflect the name of the object in anonymous
array types. The old code did not take into account that it is possible
to have an unconstrained anonymous array with an initial value.
(Check_Or_Process_Discriminants): Allow access discriminant in
non-limited types.
(Process_Discriminants): Allow access discriminant in non-limited types
Initialize the new Access_Definition field in N_Object_Renaming_Decl
node. Change Ada0Y to Ada 0Y in comments
* sem_ch4.adb (Find_Equality_Types): Allow anonymous access types in
equality operators.
Change Ada0Y to Ada 0Y in comments
* sem_ch8.adb (Analyze_Object_Renaming): Give support to access
renamings Change Ada0Y to Ada 0Y in comments
* sem_type.adb (Find_Unique_Type): Give support to the equality
operators for universal access types
Change Ada0Y to Ada 0Y in comments
* sinfo.adb (Access_Definition, Set_Access_Definition): New subprograms
* sinfo.ads (N_Component_Definition): Addition of Access_Definition
field.
(N_Object_Renaming_Declaration): Addition of Access_Definition field
Change Ada0Y to Ada 0Y in comments
* sprint.adb (Sprint_Node_Actual): Give support to the new syntax for
component definition and object renaming nodes
Change Ada0Y to Ada 0Y in comments
2004-02-02 Jose Ruiz <ruiz@act-europe.fr>
* restrict.adb: Use the new restriction identifier
No_Requeue_Statements instead of the old No_Requeue for defining the
restricted profile.
* sem_ch9.adb (Analyze_Requeue): Check the new restriction
No_Requeue_Statements.
* s-rident.ads: Adding restriction No_Requeue_Statements (AI-00249)
that supersedes the GNAT specific restriction No_Requeue. The later is
kept for backward compatibility.
2004-02-02 Ed Schonberg <schonberg@gnat.com>
* lib.ads, i-cobol.ads, * s-stoele.ads, s-thread.ads, style.ads,
5staprop.adb, atree.adb, atree.ads, g-crc32.ads: Remove redundant
pragma and fix incorrect ones.
* sem_prag.adb For pragma Inline and pragma Pure_Function, emit a
warning if the pragma is redundant.
2004-02-02 Thomas Quinot <quinot@act-europe.fr>
* 5staprop.adb: Add missing 'constant' keywords.
* Makefile.in: use consistent value for SYMLIB on
platforms where libaddr2line is supported.
2004-02-02 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* utils.c (end_subprog_body): Do not call rest_of_compilation if just
annotating types.
2004-02-02 Olivier Hainque <hainque@act-europe.fr>
* init.c (__gnat_install_handler): Setup an alternate stack for signal
handlers in the environment thread. This allows proper propagation of
an exception on stack overflows in this thread even when the builtin
ABI stack-checking scheme is used without support for a stack reserve
region.
* utils.c (create_field_decl): Augment the head comment about bitfield
creation, and don't account for DECL_BIT_FIELD in DECL_NONADDRESSABLE_P
here, because the former is not accurate enough at this point.
Let finish_record_type decide instead.
Don't make a bitfield if the field is to be addressable.
Always set a size for the field if the record is packed, to ensure the
checks for bitfield creation are triggered.
(finish_record_type): During last pass over the fields, clear
DECL_BIT_FIELD when possible in the !STRICT_ALIGNMENT case, as this is
not covered by the calls to layout_decl. Adjust DECL_NONADDRESSABLE_P
from DECL_BIT_FIELD.
From-SVN: r77110
Diffstat (limited to 'gcc/ada/utils.c')
-rw-r--r-- | gcc/ada/utils.c | 82 |
1 files changed, 58 insertions, 24 deletions
diff --git a/gcc/ada/utils.c b/gcc/ada/utils.c index b58ccde..dbc71a4 100644 --- a/gcc/ada/utils.c +++ b/gcc/ada/utils.c @@ -748,17 +748,21 @@ finish_record_type (tree record_type, } /* At this point, the position and size of each field is known. It was - either set before entry by a rep clause, or by laying out the type - above. We now make a pass through the fields (in reverse order for - QUAL_UNION_TYPEs) to compute the Ada size; the GCC size and alignment - (for rep'ed records that are not padding types); and the mode (for - rep'ed records). */ + either set before entry by a rep clause, or by laying out the type above. + + We now run a pass over the fields (in reverse order for QUAL_UNION_TYPEs) + to compute the Ada size; the GCC size and alignment (for rep'ed records + that are not padding types); and the mode (for rep'ed records). We also + clear the DECL_BIT_FIELD indication for the cases we know have not been + handled yet, and adjust DECL_NONADDRESSABLE_P accordingly. */ if (code == QUAL_UNION_TYPE) fieldlist = nreverse (fieldlist); for (field = fieldlist; field; field = TREE_CHAIN (field)) { + tree pos = bit_position (field); + tree type = TREE_TYPE (field); tree this_size = DECL_SIZE (field); tree this_size_unit = DECL_SIZE_UNIT (field); @@ -780,6 +784,16 @@ finish_record_type (tree record_type, && TYPE_ADA_SIZE (type) != 0) this_ada_size = TYPE_ADA_SIZE (type); + /* Clear DECL_BIT_FIELD for the cases layout_decl does not handle. */ + if (DECL_BIT_FIELD (field) && !STRICT_ALIGNMENT + && value_factor_p (pos, BITS_PER_UNIT) + && operand_equal_p (this_size, TYPE_SIZE (type), 0)) + DECL_BIT_FIELD (field) = 0; + + /* If we still have DECL_BIT_FIELD set at this point, we know the field + is technically not addressable. */ + DECL_NONADDRESSABLE_P (field) |= DECL_BIT_FIELD (field); + if (has_rep && ! DECL_BIT_FIELD (field)) TYPE_ALIGN (record_type) = MAX (TYPE_ALIGN (record_type), DECL_ALIGN (field)); @@ -812,9 +826,9 @@ finish_record_type (tree record_type, QUAL_UNION_TYPE, we need to take into account the previous size in the case of empty variants. */ ada_size - = merge_sizes (ada_size, bit_position (field), this_ada_size, + = merge_sizes (ada_size, pos, this_ada_size, TREE_CODE (type) == QUAL_UNION_TYPE, has_rep); - size = merge_sizes (size, bit_position (field), this_size, + size = merge_sizes (size, pos, this_size, TREE_CODE (type) == QUAL_UNION_TYPE, has_rep); size_unit = merge_sizes (size_unit, byte_position (field), this_size_unit, @@ -1392,30 +1406,42 @@ create_field_decl (tree field_name, if (packed && TYPE_MODE (field_type) == BLKmode) DECL_ALIGN (field_decl) = BITS_PER_UNIT; - /* If a size is specified, use it. Otherwise, see if we have a size - to use that may differ from the natural size of the object. */ + /* If a size is specified, use it. Otherwise, if the record type is packed + compute a size to use, which may differ from the object's natural size. + We always set a size in this case to trigger the checks for bitfield + creation below, which is typically required when no position has been + specified. */ if (size != 0) size = convert (bitsizetype, size); - else if (packed) + else if (packed == 1) { - if (packed == 1 && ! operand_equal_p (rm_size (field_type), - TYPE_SIZE (field_type), 0)) - size = rm_size (field_type); + size = rm_size (field_type); /* For a constant size larger than MAX_FIXED_MODE_SIZE, round up to - byte. */ - if (size != 0 && TREE_CODE (size) == INTEGER_CST - && compare_tree_int (size, MAX_FIXED_MODE_SIZE) > 0) - size = round_up (size, BITS_PER_UNIT); + byte. */ + if (TREE_CODE (size) == INTEGER_CST + && compare_tree_int (size, MAX_FIXED_MODE_SIZE) > 0) + size = round_up (size, BITS_PER_UNIT); } /* Make a bitfield if a size is specified for two reasons: first if the size differs from the natural size. Second, if the alignment is insufficient. - There are a number of ways the latter can be true. But never make a - bitfield if the type of the field has a nonconstant size. */ + There are a number of ways the latter can be true. + We never make a bitfield if the type of the field has a nonconstant size, + or if it is claimed to be addressable, because no such entity requiring + bitfield operations should reach here. + + We do *preventively* make a bitfield when there might be the need for it + but we don't have all the necessary information to decide, as is the case + of a field with no specified position in a packed record. + + We also don't look at STRICT_ALIGNMENT here, and rely on later processing + in layout_decl or finish_record_type to clear the bit_field indication if + it is in fact not needed. */ if (size != 0 && TREE_CODE (size) == INTEGER_CST && TREE_CODE (TYPE_SIZE (field_type)) == INTEGER_CST + && ! addressable && (! operand_equal_p (TYPE_SIZE (field_type), size, 0) || (pos != 0 && ! value_zerop (size_binop (TRUNC_MOD_EXPR, pos, @@ -1479,10 +1505,15 @@ create_field_decl (tree field_name, if (AGGREGATE_TYPE_P (field_type)) addressable = 1; - /* Mark the decl as nonaddressable if it either is indicated so semantically - or if it is a bit field. */ - DECL_NONADDRESSABLE_P (field_decl) - = ! addressable || DECL_BIT_FIELD (field_decl); + /* Mark the decl as nonaddressable if it is indicated so semantically, + meaning we won't ever attempt to take the address of the field. + + It may also be "technically" nonaddressable, meaning that even if we + attempt to take the field's address we will actually get the address of a + copy. This is the case for true bitfields, but the DECL_BIT_FIELD value + we have at this point is not accurate enough, so we don't account for + this here and let finish_record_type decide. */ + DECL_NONADDRESSABLE_P (field_decl) = ! addressable; return field_decl; } @@ -1884,7 +1915,10 @@ end_subprog_body (void) if (function_nesting_depth > 1) ggc_push_context (); - rest_of_compilation (current_function_decl); + /* If we're only annotating types, don't actually compile this + function. */ + if (!type_annotate_only) + rest_of_compilation (current_function_decl); if (function_nesting_depth > 1) ggc_pop_context (); |