Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+276 −1 4 files
gcc/c-family/c-ada-spec.cc
+109โ0modified
| @@ -2783 +2783 @@dump_ada_methods (pretty_printer *buffer, tree node, int spc) | |||
| 2783 | 2783 | return 1; | |
| 2784 | 2784 | } | |
| 2785 | 2785 | | |
| 2786 | Added line. /* Return true if NODE needs an explicit Ada layout to describe C++ tail | ||
| 2787 | Added line. padding, either because its object size exceeds its size as a base class or | ||
| 2788 | Added line. because it places a field in a direct base class's tail padding. */ | ||
| 2789 | Added line. | ||
| 2790 | Added line. static bool | ||
| 2791 | Added line. needs_tail_padding_layout (tree node) | ||
| 2792 | Added line. { | ||
| 2793 | Added line. if (!cpp_check || !RECORD_OR_UNION_TYPE_P (node)) | ||
| 2794 | Added line. return false; | ||
| 2795 | Added line. | ||
| 2796 | Added line. const int data_size = cpp_check (node, GET_AS_BASE_SIZE); | ||
| 2797 | Added line. const HOST_WIDE_INT object_size = int_size_in_bytes (node); | ||
| 2798 | Added line. return (data_size >= 0 && object_size > data_size) | ||
| 2799 | Added line. || cpp_check (node, REUSES_BASE_TAIL_PADDING); | ||
| 2800 | Added line. } | ||
| 2801 | Added line. | ||
| 2802 | Added line. /* Return true if all of NODE's fields that are visible in the generated Ada | ||
| 2803 | Added line. record have constant positions and sizes suitable for component clauses. */ | ||
| 2804 | Added line. | ||
| 2805 | Added line. static bool | ||
| 2806 | Added line. has_constant_field_layout (tree node) | ||
| 2807 | Added line. { | ||
| 2808 | Added line. for (tree field = TYPE_FIELDS (node); field; field = TREE_CHAIN (field)) | ||
| 2809 | Added line. if (TREE_CODE (field) == FIELD_DECL | ||
| 2810 | Added line. && DECL_NAME (field) | ||
| 2811 | Added line. && !DECL_VIRTUAL_P (field) | ||
| 2812 | Added line. && (!DECL_FIELD_OFFSET (field) | ||
| 2813 | Added line. || !DECL_FIELD_BIT_OFFSET (field) | ||
| 2814 | Added line. || !DECL_SIZE (field) | ||
| 2815 | Added line. || !tree_fits_uhwi_p (DECL_FIELD_OFFSET (field)) | ||
| 2816 | Added line. || !tree_fits_uhwi_p (DECL_FIELD_BIT_OFFSET (field)) | ||
| 2817 | Added line. || !tree_fits_uhwi_p (DECL_SIZE (field)) | ||
| 2818 | Added line. || tree_to_uhwi (DECL_SIZE (field)) == 0)) | ||
| 2819 | Added line. return false; | ||
| 2820 | Added line. | ||
| 2821 | Added line. return true; | ||
| 2822 | Added line. } | ||
| 2823 | Added line. | ||
| 2824 | Added line. /* Dump the size and component clauses needed to preserve NODE's C++ tail | ||
| 2825 | Added line. padding layout. TYPE is the declaration used for Ada name qualification. */ | ||
| 2826 | Added line. | ||
| 2827 | Added line. static void | ||
| 2828 | Added line. dump_ada_tail_padding_layout (pretty_printer *buffer, tree node, tree type, | ||
| 2829 | Added line. int spc) | ||
| 2830 | Added line. { | ||
| 2831 | Added line. const int data_size = cpp_check (node, GET_AS_BASE_SIZE); | ||
| 2832 | Added line. const HOST_WIDE_INT object_size = int_size_in_bytes (node); | ||
| 2833 | Added line. | ||
| 2834 | Added line. gcc_assert (data_size >= 0 && object_size >= 0); | ||
| 2835 | Added line. | ||
| 2836 | Added line. newline_and_indent (buffer, spc); | ||
| 2837 | Added line. pp_string (buffer, "for "); | ||
| 2838 | Added line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); | ||
| 2839 | Added line. pp_string (buffer, "'Size use "); | ||
| 2840 | Added line. pp_wide_integer (buffer, (HOST_WIDE_INT) data_size * BITS_PER_UNIT); | ||
| 2841 | Added line. pp_semicolon (buffer); | ||
| 2842 | Added line. | ||
| 2843 | Added line. newline_and_indent (buffer, spc); | ||
| 2844 | Added line. pp_string (buffer, "for "); | ||
| 2845 | Added line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); | ||
| 2846 | Added line. pp_string (buffer, "'Object_Size use "); | ||
| 2847 | Added line. pp_wide_integer (buffer, object_size * BITS_PER_UNIT); | ||
| 2848 | Added line. pp_semicolon (buffer); | ||
| 2849 | Added line. | ||
| 2850 | Added line. newline_and_indent (buffer, spc); | ||
| 2851 | Added line. pp_string (buffer, "for "); | ||
| 2852 | Added line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); | ||
| 2853 | Added line. pp_string (buffer, " use record"); | ||
| 2854 | Added line. | ||
| 2855 | Added line. for (tree field = TYPE_FIELDS (node); field; field = TREE_CHAIN (field)) | ||
| 2856 | Added line. if (TREE_CODE (field) == FIELD_DECL | ||
| 2857 | Added line. && DECL_NAME (field) | ||
| 2858 | Added line. && !DECL_VIRTUAL_P (field)) | ||
| 2859 | Added line. { | ||
| 2860 | Added line. const unsigned HOST_WIDE_INT bitpos | ||
| 2861 | Added line. = tree_to_uhwi (DECL_FIELD_OFFSET (field)) * BITS_PER_UNIT | ||
| 2862 | Added line. + tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field)); | ||
| 2863 | Added line. const unsigned HOST_WIDE_INT position = bitpos / BITS_PER_UNIT; | ||
| 2864 | Added line. const unsigned HOST_WIDE_INT first_bit = bitpos % BITS_PER_UNIT; | ||
| 2865 | Added line. const unsigned HOST_WIDE_INT last_bit | ||
| 2866 | Added line. = first_bit + tree_to_uhwi (DECL_SIZE (field)) - 1; | ||
| 2867 | Added line. | ||
| 2868 | Added line. newline_and_indent (buffer, spc + INDENT_INCR); | ||
| 2869 | Added line. dump_ada_decl_name (buffer, field, false); | ||
| 2870 | Added line. pp_string (buffer, " at "); | ||
| 2871 | Added line. pp_unsigned_wide_integer (buffer, position); | ||
| 2872 | Added line. pp_string (buffer, " range "); | ||
| 2873 | Added line. pp_unsigned_wide_integer (buffer, first_bit); | ||
| 2874 | Added line. pp_string (buffer, " .. "); | ||
| 2875 | Added line. pp_unsigned_wide_integer (buffer, last_bit); | ||
| 2876 | Added line. pp_semicolon (buffer); | ||
| 2877 | Added line. } | ||
| 2878 | Added line. | ||
| 2879 | Added line. newline_and_indent (buffer, spc); | ||
| 2880 | Added line. pp_string (buffer, "end record;"); | ||
| 2881 | Added line. } | ||
| 2882 | Added line. | ||
| 2786 | 2883 | /* Dump in BUFFER a forward declaration for TYPE present inside T. | |
| 2787 | 2884 | SPC is the indentation level. */ | |
| 2788 | 2885 | | |
| @@ -3816 +3913 @@dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested, | |||
| 3816 | 3913 | | |
| 3817 | 3914 | need_semicolon = !dump_ada_methods (buffer, node, spc); | |
| 3818 | 3915 | | |
| 3916 | Added line. if (needs_tail_padding_layout (node) && has_constant_field_layout (node)) | ||
| 3917 | Added line. { | ||
| 3918 | Added line. if (need_semicolon) | ||
| 3919 | Added line. { | ||
| 3920 | Added line. need_semicolon = false; | ||
| 3921 | Added line. pp_semicolon (buffer); | ||
| 3922 | Added line. } | ||
| 3923 | Added line. | ||
| 3924 | Added line. pp_newline (buffer); | ||
| 3925 | Added line. dump_ada_tail_padding_layout (buffer, node, type, spc); | ||
| 3926 | Added line. } | ||
| 3927 | Added line. | ||
| 3819 | 3928 | /* Print the static fields of the structure, if any. */ | |
| 3820 | 3929 | for (tree tmp = TYPE_FIELDS (node); tmp; tmp = TREE_CHAIN (tmp)) | |
| 3821 | 3930 | { | |
gcc/c-family/c-ada-spec.h
+3โ1modified
| @@ -25 +25 @@along with GCC; see the file COPYING3. If not see | |||
| 25 | 25 | /* In c-ada-spec.cc */ | |
| 26 | 26 | | |
| 27 | 27 | enum cpp_operation { | |
| 28 | Added line. GET_AS_BASE_SIZE, | ||
| 28 | 29 | GET_FUNCTION_QUALIFIERS, | |
| 29 | 30 | HAS_DEPENDENT_TEMPLATE_ARGS, | |
| 30 | 31 | IS_ABSTRACT, | |
| @@ -34 +35 @@enum cpp_operation { | |||
| 34 | 35 | IS_COPY_CONSTRUCTOR, | |
| 35 | 36 | IS_MOVE_CONSTRUCTOR, | |
| 36 | 37 | IS_TEMPLATE, | |
| 37 | Removed line. IS_TRIVIAL | ||
| 38 | Added line. IS_TRIVIAL, | ||
| 39 | Added line. REUSES_BASE_TAIL_PADDING | ||
| 38 | 40 | }; | |
| 39 | 41 | | |
| 40 | 42 | enum cpp_function_qualifier { | |
gcc/cp/decl2.cc
+50โ0modified
| @@ -5257 +5257 @@cpp_check (tree t, cpp_operation op) | |||
| 5257 | 5257 | { | |
| 5258 | 5258 | switch (op) | |
| 5259 | 5259 | { | |
| 5260 | Added line. case GET_AS_BASE_SIZE: | ||
| 5261 | Added line. { | ||
| 5262 | Added line. if (!CLASS_TYPE_P (t) || !COMPLETE_TYPE_P (t)) | ||
| 5263 | Added line. return -1; | ||
| 5264 | Added line. | ||
| 5265 | Added line. const HOST_WIDE_INT size | ||
| 5266 | Added line. = int_size_in_bytes (CLASSTYPE_AS_BASE (t)); | ||
| 5267 | Added line. return size >= 0 && size <= INT_MAX ? size : -1; | ||
| 5268 | Added line. } | ||
| 5260 | 5269 | case GET_FUNCTION_QUALIFIERS: | |
| 5261 | 5270 | { | |
| 5262 | 5271 | int qualifiers = 0; | |
| @@ -5305 +5314 @@cpp_check (tree t, cpp_operation op) | |||
| 5305 | 5314 | return TREE_CODE (t) == TEMPLATE_DECL; | |
| 5306 | 5315 | case IS_TRIVIAL: | |
| 5307 | 5316 | return trivial_type_p (t); | |
| 5317 | Added line. case REUSES_BASE_TAIL_PADDING: | ||
| 5318 | Added line. { | ||
| 5319 | Added line. if (!CLASS_TYPE_P (t) || !COMPLETE_TYPE_P (t) || !TYPE_BINFO (t)) | ||
| 5320 | Added line. return 0; | ||
| 5321 | Added line. | ||
| 5322 | Added line. for (unsigned int i = 0; | ||
| 5323 | Added line. i < BINFO_N_BASE_BINFOS (TYPE_BINFO (t)); | ||
| 5324 | Added line. ++i) | ||
| 5325 | Added line. { | ||
| 5326 | Added line. tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (t), i); | ||
| 5327 | Added line. if (BINFO_VIRTUAL_P (base_binfo) | ||
| 5328 | Added line. || !tree_fits_uhwi_p (BINFO_OFFSET (base_binfo))) | ||
| 5329 | Added line. continue; | ||
| 5330 | Added line. | ||
| 5331 | Added line. tree base_type = BINFO_TYPE (base_binfo); | ||
| 5332 | Added line. const HOST_WIDE_INT data_size | ||
| 5333 | Added line. = int_size_in_bytes (CLASSTYPE_AS_BASE (base_type)); | ||
| 5334 | Added line. const HOST_WIDE_INT object_size = int_size_in_bytes (base_type); | ||
| 5335 | Added line. if (data_size < 0 || object_size <= data_size) | ||
| 5336 | Added line. continue; | ||
| 5337 | Added line. | ||
| 5338 | Added line. const unsigned HOST_WIDE_INT base_offset | ||
| 5339 | Added line. = tree_to_uhwi (BINFO_OFFSET (base_binfo)); | ||
| 5340 | Added line. for (tree field = TYPE_FIELDS (t); field; | ||
| 5341 | Added line. field = DECL_CHAIN (field)) | ||
| 5342 | Added line. if (TREE_CODE (field) == FIELD_DECL | ||
| 5343 | Added line. && !DECL_ARTIFICIAL (field) | ||
| 5344 | Added line. && tree_fits_uhwi_p (bit_position (field))) | ||
| 5345 | Added line. { | ||
| 5346 | Added line. const unsigned HOST_WIDE_INT field_bitpos | ||
| 5347 | Added line. = tree_to_uhwi (bit_position (field)); | ||
| 5348 | Added line. if (field_bitpos | ||
| 5349 | Added line. >= (base_offset + data_size) * BITS_PER_UNIT | ||
| 5350 | Added line. && field_bitpos < ((base_offset + object_size) | ||
| 5351 | Added line. * BITS_PER_UNIT)) | ||
| 5352 | Added line. return 1; | ||
| 5353 | Added line. } | ||
| 5354 | Added line. } | ||
| 5355 | Added line. | ||
| 5356 | Added line. return 0; | ||
| 5357 | Added line. } | ||
| 5308 | 5358 | default: | |
| 5309 | 5359 | return 0; | |
| 5310 | 5360 | } | |
gcc/testsuite/g++.dg/ada-spec/inherited-tail-padding.C
+114โ0new file
| @@ -0 +1 @@ | |||
| 1 | Added line. /* { dg-do compile } */ | ||
| 2 | Added line. /* { dg-require-effective-target lp64 } */ | ||
| 3 | Added line. /* { dg-options "-fdump-ada-spec-slim" } */ | ||
| 4 | Added line. /* { dg-final { scan-file inherited_tail_padding_c.ads "for Tail_Base'Size use 96;" } } */ | ||
| 5 | Added line. /* { dg-final { scan-file inherited_tail_padding_c.ads "for Tail_Base'Object_Size use 128;" } } */ | ||
| 6 | Added line. /* { dg-final { scan-file inherited_tail_padding_c.ads "value_u at 8 range 0 .. 31;" } } */ | ||
| 7 | Added line. /* { dg-final { scan-file inherited_tail_padding_c.ads "extra_u at 12 range 0 .. 31;" } } */ | ||
| 8 | Added line. /* { dg-final { scan-file inherited_tail_padding_c.ads "for Plain_Base'Size use 24;" } } */ | ||
| 9 | Added line. /* { dg-final { scan-file inherited_tail_padding_c.ads "derived_char at 3 range 0 .. 7;" } } */ | ||
| 10 | Added line. /* { dg-final { scan-file inherited_tail_padding_c.ads "extra at 7 range 0 .. 7;" } } */ | ||
| 11 | Added line. | ||
| 12 | Added line. class Tail_Base | ||
| 13 | Added line. { | ||
| 14 | Added line. public: | ||
| 15 | Added line. Tail_Base (int value); | ||
| 16 | Added line. virtual ~Tail_Base (); | ||
| 17 | Added line. int value () const { return value_; } | ||
| 18 | Added line. | ||
| 19 | Added line. protected: | ||
| 20 | Added line. int value_; | ||
| 21 | Added line. }; | ||
| 22 | Added line. | ||
| 23 | Added line. class Tail_Derived : public Tail_Base | ||
| 24 | Added line. { | ||
| 25 | Added line. public: | ||
| 26 | Added line. Tail_Derived (int value, int extra); | ||
| 27 | Added line. ~Tail_Derived () override; | ||
| 28 | Added line. int extra () const { return extra_; } | ||
| 29 | Added line. | ||
| 30 | Added line. private: | ||
| 31 | Added line. int extra_; | ||
| 32 | Added line. }; | ||
| 33 | Added line. | ||
| 34 | Added line. Tail_Base::Tail_Base (int value) : value_ (value) {} | ||
| 35 | Added line. Tail_Base::~Tail_Base () = default; | ||
| 36 | Added line. Tail_Derived::Tail_Derived (int value, int extra) | ||
| 37 | Added line. : Tail_Base (value), extra_ (extra) {} | ||
| 38 | Added line. Tail_Derived::~Tail_Derived () = default; | ||
| 39 | Added line. | ||
| 40 | Added line. extern "C" unsigned long | ||
| 41 | Added line. cpp_base_size () | ||
| 42 | Added line. { | ||
| 43 | Added line. return sizeof (Tail_Base); | ||
| 44 | Added line. } | ||
| 45 | Added line. | ||
| 46 | Added line. extern "C" unsigned long | ||
| 47 | Added line. cpp_derived_size () | ||
| 48 | Added line. { | ||
| 49 | Added line. return sizeof (Tail_Derived); | ||
| 50 | Added line. } | ||
| 51 | Added line. | ||
| 52 | Added line. extern "C" int | ||
| 53 | Added line. cpp_value (const Tail_Derived *object) | ||
| 54 | Added line. { | ||
| 55 | Added line. return object->value (); | ||
| 56 | Added line. } | ||
| 57 | Added line. | ||
| 58 | Added line. extern "C" int | ||
| 59 | Added line. cpp_extra (const Tail_Derived *object) | ||
| 60 | Added line. { | ||
| 61 | Added line. return object->extra (); | ||
| 62 | Added line. } | ||
| 63 | Added line. | ||
| 64 | Added line. struct Plain_Base | ||
| 65 | Added line. { | ||
| 66 | Added line. short base_short; | ||
| 67 | Added line. char base_char; | ||
| 68 | Added line. Plain_Base () : base_short (1), base_char (2) {} | ||
| 69 | Added line. }; | ||
| 70 | Added line. | ||
| 71 | Added line. struct Plain_Derived : Plain_Base | ||
| 72 | Added line. { | ||
| 73 | Added line. char derived_char; | ||
| 74 | Added line. Plain_Derived () : derived_char (3) {} | ||
| 75 | Added line. }; | ||
| 76 | Added line. | ||
| 77 | Added line. struct Plain_Left | ||
| 78 | Added line. { | ||
| 79 | Added line. short left_short; | ||
| 80 | Added line. char left_char; | ||
| 81 | Added line. Plain_Left () : left_short (4), left_char (5) {} | ||
| 82 | Added line. }; | ||
| 83 | Added line. | ||
| 84 | Added line. struct Plain_Right | ||
| 85 | Added line. { | ||
| 86 | Added line. short right_short; | ||
| 87 | Added line. char right_char; | ||
| 88 | Added line. Plain_Right () : right_short (6), right_char (7) {} | ||
| 89 | Added line. }; | ||
| 90 | Added line. | ||
| 91 | Added line. struct Plain_Both : Plain_Left, Plain_Right | ||
| 92 | Added line. { | ||
| 93 | Added line. char extra; | ||
| 94 | Added line. Plain_Both () : extra (8) {} | ||
| 95 | Added line. }; | ||
| 96 | Added line. | ||
| 97 | Added line. extern "C" Plain_Derived *cpp_plain_create () { return new Plain_Derived; } | ||
| 98 | Added line. extern "C" void cpp_plain_delete (Plain_Derived *p) { delete p; } | ||
| 99 | Added line. extern "C" unsigned long cpp_plain_size () { return sizeof (Plain_Derived); } | ||
| 100 | Added line. extern "C" int cpp_plain_values (const Plain_Derived *p) | ||
| 101 | Added line. { | ||
| 102 | Added line. return p->base_short + p->base_char + p->derived_char; | ||
| 103 | Added line. } | ||
| 104 | Added line. | ||
| 105 | Added line. extern "C" Plain_Both *cpp_both_create () { return new Plain_Both; } | ||
| 106 | Added line. extern "C" void cpp_both_delete (Plain_Both *p) { delete p; } | ||
| 107 | Added line. extern "C" unsigned long cpp_both_plain_size () { return sizeof (Plain_Both); } | ||
| 108 | Added line. extern "C" int cpp_both_values (const Plain_Both *p) | ||
| 109 | Added line. { | ||
| 110 | Added line. return p->left_short + p->left_char + p->right_short | ||
| 111 | Added line. + p->right_char + p->extra; | ||
| 112 | Added line. } | ||
| 113 | Added line. | ||
| 114 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 115 | | ||