xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/stor-layout.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg /* Definitions and declarations for stor-layout.c.
2*8feb0f0bSmrg    Copyright (C) 2013-2020 Free Software Foundation, Inc.
31debfc3dSmrg 
41debfc3dSmrg This file is part of GCC.
51debfc3dSmrg 
61debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
71debfc3dSmrg the terms of the GNU General Public License as published by the Free
81debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
91debfc3dSmrg version.
101debfc3dSmrg 
111debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
121debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
131debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
141debfc3dSmrg for more details.
151debfc3dSmrg 
161debfc3dSmrg You should have received a copy of the GNU General Public License
171debfc3dSmrg along with GCC; see the file COPYING3.  If not see
181debfc3dSmrg <http://www.gnu.org/licenses/>.  */
191debfc3dSmrg 
201debfc3dSmrg #ifndef GCC_STOR_LAYOUT_H
211debfc3dSmrg #define GCC_STOR_LAYOUT_H
221debfc3dSmrg 
231debfc3dSmrg extern void set_min_and_max_values_for_integral_type (tree, int, signop);
241debfc3dSmrg extern void fixup_signed_type (tree);
251debfc3dSmrg extern unsigned int update_alignment_for_field (record_layout_info, tree,
261debfc3dSmrg                                                 unsigned int);
271debfc3dSmrg extern record_layout_info start_record_layout (tree);
281debfc3dSmrg extern tree bit_from_pos (tree, tree);
291debfc3dSmrg extern tree byte_from_pos (tree, tree);
301debfc3dSmrg extern void pos_from_bit (tree *, tree *, unsigned int, tree);
311debfc3dSmrg extern void normalize_offset (tree *, tree *, unsigned int);
321debfc3dSmrg extern tree rli_size_unit_so_far (record_layout_info);
331debfc3dSmrg extern tree rli_size_so_far (record_layout_info);
341debfc3dSmrg extern void normalize_rli (record_layout_info);
351debfc3dSmrg extern void place_field (record_layout_info, tree);
361debfc3dSmrg extern void compute_record_mode (tree);
371debfc3dSmrg extern void finish_bitfield_layout (tree);
381debfc3dSmrg extern void finish_record_layout (record_layout_info, int);
391debfc3dSmrg extern unsigned int element_precision (const_tree);
401debfc3dSmrg extern void finalize_size_functions (void);
411debfc3dSmrg extern void fixup_unsigned_type (tree);
421debfc3dSmrg extern void initialize_sizetypes (void);
431debfc3dSmrg 
441debfc3dSmrg /* Finish up a builtin RECORD_TYPE. Give it a name and provide its
451debfc3dSmrg    fields. Optionally specify an alignment, and then lay it out.  */
461debfc3dSmrg extern void finish_builtin_struct (tree, const char *, tree, tree);
471debfc3dSmrg 
481debfc3dSmrg /* Given a VAR_DECL, PARM_DECL, RESULT_DECL or FIELD_DECL node,
491debfc3dSmrg    calculates the DECL_SIZE, DECL_SIZE_UNIT, DECL_ALIGN and DECL_MODE
501debfc3dSmrg    fields.  Call this only once for any given decl node.
511debfc3dSmrg 
521debfc3dSmrg    Second argument is the boundary that this field can be assumed to
531debfc3dSmrg    be starting at (in bits).  Zero means it can be assumed aligned
541debfc3dSmrg    on any boundary that may be needed.  */
551debfc3dSmrg extern void layout_decl (tree, unsigned);
561debfc3dSmrg 
571debfc3dSmrg /* Given a ..._TYPE node, calculate the TYPE_SIZE, TYPE_SIZE_UNIT,
581debfc3dSmrg    TYPE_ALIGN and TYPE_MODE fields.  If called more than once on one
591debfc3dSmrg    node, does nothing except for the first time.  */
601debfc3dSmrg extern void layout_type (tree);
611debfc3dSmrg 
621debfc3dSmrg /* Return the least alignment in bytes required for type TYPE.  */
631debfc3dSmrg extern unsigned int min_align_of_type (tree);
641debfc3dSmrg 
651debfc3dSmrg /* Construct various nodes representing fract or accum data types.  */
661debfc3dSmrg extern tree make_fract_type (int, int, int);
671debfc3dSmrg extern tree make_accum_type (int, int, int);
681debfc3dSmrg 
691debfc3dSmrg #define make_signed_fract_type(P) make_fract_type (P, 0, 0)
701debfc3dSmrg #define make_unsigned_fract_type(P) make_fract_type (P, 1, 0)
711debfc3dSmrg #define make_sat_signed_fract_type(P) make_fract_type (P, 0, 1)
721debfc3dSmrg #define make_sat_unsigned_fract_type(P) make_fract_type (P, 1, 1)
731debfc3dSmrg #define make_signed_accum_type(P) make_accum_type (P, 0, 0)
741debfc3dSmrg #define make_unsigned_accum_type(P) make_accum_type (P, 1, 0)
751debfc3dSmrg #define make_sat_signed_accum_type(P) make_accum_type (P, 0, 1)
761debfc3dSmrg #define make_sat_unsigned_accum_type(P) make_accum_type (P, 1, 1)
771debfc3dSmrg 
781debfc3dSmrg #define make_or_reuse_signed_fract_type(P) \
791debfc3dSmrg 		make_or_reuse_fract_type (P, 0, 0)
801debfc3dSmrg #define make_or_reuse_unsigned_fract_type(P) \
811debfc3dSmrg 		make_or_reuse_fract_type (P, 1, 0)
821debfc3dSmrg #define make_or_reuse_sat_signed_fract_type(P) \
831debfc3dSmrg 		make_or_reuse_fract_type (P, 0, 1)
841debfc3dSmrg #define make_or_reuse_sat_unsigned_fract_type(P) \
851debfc3dSmrg 		make_or_reuse_fract_type (P, 1, 1)
861debfc3dSmrg #define make_or_reuse_signed_accum_type(P) \
871debfc3dSmrg 		make_or_reuse_accum_type (P, 0, 0)
881debfc3dSmrg #define make_or_reuse_unsigned_accum_type(P) \
891debfc3dSmrg 		make_or_reuse_accum_type (P, 1, 0)
901debfc3dSmrg #define make_or_reuse_sat_signed_accum_type(P) \
911debfc3dSmrg 		make_or_reuse_accum_type (P, 0, 1)
921debfc3dSmrg #define make_or_reuse_sat_unsigned_accum_type(P) \
931debfc3dSmrg 		make_or_reuse_accum_type (P, 1, 1)
941debfc3dSmrg 
951debfc3dSmrg extern tree make_signed_type (int);
961debfc3dSmrg extern tree make_unsigned_type (int);
971debfc3dSmrg 
981debfc3dSmrg /* Return the mode for data of a given size SIZE and mode class CLASS.
991debfc3dSmrg    If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
1001debfc3dSmrg    The value is BLKmode if no other mode is found.  This is like
1011debfc3dSmrg    mode_for_size, but is passed a tree.  */
102a2dc1f3fSmrg extern opt_machine_mode mode_for_size_tree (const_tree, enum mode_class, int);
1031debfc3dSmrg 
1041debfc3dSmrg extern tree bitwise_type_for_mode (machine_mode);
1051debfc3dSmrg 
1061debfc3dSmrg /* Given a VAR_DECL, PARM_DECL or RESULT_DECL, clears the results of
1071debfc3dSmrg    a previous call to layout_decl and calls it again.  */
1081debfc3dSmrg extern void relayout_decl (tree);
1091debfc3dSmrg 
1101debfc3dSmrg /* variable_size (EXP) is like save_expr (EXP) except that it
1111debfc3dSmrg    is for the special case of something that is part of a
1121debfc3dSmrg    variable size for a data type.  It makes special arrangements
1131debfc3dSmrg    to compute the value at the right time when the data type
1141debfc3dSmrg    belongs to a function parameter.  */
1151debfc3dSmrg extern tree variable_size (tree);
1161debfc3dSmrg 
1171debfc3dSmrg #endif  // GCC_STOR_LAYOUT_H
118