Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+120 −1 3 files
gcc/c-family/c-ada-spec.cc
+58−1modified
| @@ -1512 +1512 @@dump_ada_import (pretty_printer *buffer, tree t, int spc) | |||
| 1512 | 1512 | const bool is_stdcall | |
| 1513 | 1513 | = TREE_CODE (t) == FUNCTION_DECL | |
| 1514 | 1514 | && lookup_attribute ("stdcall", TYPE_ATTRIBUTES (TREE_TYPE (t))); | |
| 1515 | Added line. bool uses_vector_abi = false; | ||
| 1516 | Added line. const bool is_cpp_method | ||
| 1517 | Added line. = TREE_CODE (t) == FUNCTION_DECL | ||
| 1518 | Added line. && TREE_CODE (TREE_TYPE (t)) == METHOD_TYPE; | ||
| 1519 | Added line. | ||
| 1520 | Added line. if (TREE_CODE (t) == FUNCTION_DECL) | ||
| 1521 | Added line. { | ||
| 1522 | Added line. tree function_type = TREE_TYPE (t); | ||
| 1523 | Added line. | ||
| 1524 | Added line. uses_vector_abi = TREE_CODE (TREE_TYPE (function_type)) == VECTOR_TYPE; | ||
| 1525 | Added line. for (tree args = TYPE_ARG_TYPES (function_type); | ||
| 1526 | Added line. args && !uses_vector_abi; | ||
| 1527 | Added line. args = TREE_CHAIN (args)) | ||
| 1528 | Added line. uses_vector_abi = TREE_CODE (TREE_VALUE (args)) == VECTOR_TYPE; | ||
| 1529 | Added line. } | ||
| 1515 | 1530 | | |
| 1516 | 1531 | pp_string (buffer, "with Import => True, "); | |
| 1517 | 1532 | | |
| @@ -1519 +1534 @@dump_ada_import (pretty_printer *buffer, tree t, int spc) | |||
| 1519 | 1534 | | |
| 1520 | 1535 | if (is_stdcall) | |
| 1521 | 1536 | pp_string (buffer, "Convention => Stdcall, "); | |
| 1537 | Added line. else if (uses_vector_abi && !is_cpp_method) | ||
| 1538 | Added line. /* GNAT foreign conventions can pass the representative Ada array by | ||
| 1539 | Added line. reference before vector_type changes its machine mode. Free functions | ||
| 1540 | Added line. therefore use the Ada convention's native vector mode; C++ methods keep | ||
| 1541 | Added line. CPP convention for their implicit object and dispatch-table slot. */ | ||
| 1542 | Added line. pp_string (buffer, "Convention => Ada, "); | ||
| 1522 | 1543 | else if (name[0] == '_' && name[1] == 'Z') | |
| 1523 | 1544 | pp_string (buffer, "Convention => CPP, "); | |
| 1524 | 1545 | else | |
| @@ -2130 +2168 @@dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc, | |||
| 2130 | 2168 | break; | |
| 2131 | 2169 | | |
| 2132 | 2170 | case VECTOR_TYPE: | |
| 2133 | Removed line. pp_string (buffer, "<vector>"); | ||
| 2171 | Added line. if (name_only && TYPE_NAME (node)) | ||
| 2172 | Added line. dump_ada_node (buffer, TYPE_NAME (node), node, spc, limited_access, | ||
| 2173 | Added line. true); | ||
| 2174 | Added line. else | ||
| 2175 | Added line. { | ||
| 2176 | Added line. unsigned HOST_WIDE_INT subparts; | ||
| 2177 | Added line. if (!TYPE_VECTOR_SUBPARTS (node).is_constant (&subparts)) | ||
| 2178 | Added line. pp_string (buffer, "<scalable_vector>"); | ||
| 2179 | Added line. else | ||
| 2180 | Added line. { | ||
| 2181 | Added line. pp_string (buffer, "array (0 .. "); | ||
| 2182 | Added line. pp_unsigned_wide_integer (buffer, subparts - 1); | ||
| 2183 | Added line. pp_string (buffer, ") of "); | ||
| 2184 | Added line. dump_ada_node (buffer, TREE_TYPE (node), node, spc, limited_access, | ||
| 2185 | Added line. true); | ||
| 2186 | Added line. } | ||
| 2187 | Added line. } | ||
| 2134 | 2188 | break; | |
| 2135 | 2189 | | |
| 2136 | 2190 | case COMPLEX_TYPE: | |
| @@ -2983 +3034 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 2983 | 3034 | pp_string (buffer, "type "); | |
| 2984 | 3035 | break; | |
| 2985 | 3036 | | |
| 3037 | Added line. case VECTOR_TYPE: | ||
| 3038 | Added line. pp_string (buffer, "type "); | ||
| 3039 | Added line. break; | ||
| 3040 | Added line. | ||
| 2986 | 3041 | case FUNCTION_TYPE: | |
| 2987 | 3042 | pp_string (buffer, "-- skipped function type "); | |
| 2988 | 3043 | dump_ada_node (buffer, t, type, spc, false, true); | |
| @@ -3314 +3369 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 3314 | 3369 | { | |
| 3315 | 3370 | pp_string (buffer, "; -- "); | |
| 3316 | 3371 | dump_sloc (buffer, t); | |
| 3372 | Added line. | ||
| 3373 | Added line. if (TREE_CODE (t) == TYPE_DECL | ||
| 3374 | Added line. && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE) | ||
| 3375 | Added line. { | ||
| 3376 | Added line. newline_and_indent (buffer, spc); | ||
| 3377 | Added line. pp_string (buffer, "for "); | ||
| 3378 | Added line. dump_ada_node (buffer, t, type, spc, false, true); | ||
| 3379 | Added line. pp_string (buffer, "'Alignment use "); | ||
| 3380 | Added line. pp_decimal_int (buffer, | ||
| 3381 | Added line. TYPE_ALIGN (TREE_TYPE (t)) / BITS_PER_UNIT); | ||
| 3382 | Added line. pp_semicolon (buffer); | ||
| 3383 | Added line. newline_and_indent (buffer, spc); | ||
| 3384 | Added line. pp_string (buffer, "pragma Machine_Attribute ("); | ||
| 3385 | Added line. dump_ada_node (buffer, t, type, spc, false, true); | ||
| 3386 | Added line. pp_string (buffer, ", \"vector_type\");"); | ||
| 3387 | Added line. } | ||
| 3317 | 3388 | } | |
| 3318 | 3389 | | |
| 3319 | 3390 | return 1; | |
gcc/testsuite/g++.dg/ada-spec/vector-types.C
+49−0new file
| @@ -0 +1 @@ | |||
| 1 | Added line. /* { dg-do compile } */ | ||
| 2 | Added line. /* { dg-options "-fdump-ada-spec-slim" } */ | ||
| 3 | Added line. /* { dg-final { scan-file vector_types_c.ads "type Int_Vector is array \(0 .. 3\) of int;" } } */ | ||
| 4 | Added line. /* { dg-final { scan-file vector_types_c.ads "for Int_Vector'Alignment use 16;" } } */ | ||
| 5 | Added line. /* { dg-final { scan-file vector_types_c.ads "pragma Machine_Attribute \(Int_Vector, \"vector_type\"\);" } } */ | ||
| 6 | Added line. /* { dg-final { scan-file vector_types_c.ads "type Double_Vector is array \(0 .. 1\) of double;" } } */ | ||
| 7 | Added line. /* { dg-final { scan-file-times vector_types_c.ads "Convention => Ada" 3 } } */ | ||
| 8 | Added line. /* { dg-final { scan-file vector_types_c.ads "function cpp_transform_vector" } } */ | ||
| 9 | Added line. /* { dg-final { scan-file vector_types_c.ads "function transform" } } */ | ||
| 10 | Added line. | ||
| 11 | Added line. typedef int Int_Vector __attribute__((vector_size(16))); | ||
| 12 | Added line. typedef double Double_Vector __attribute__((vector_size(16))); | ||
| 13 | Added line. | ||
| 14 | Added line. Int_Vector | ||
| 15 | Added line. vector_identity (Int_Vector value) | ||
| 16 | Added line. { | ||
| 17 | Added line. return value; | ||
| 18 | Added line. } | ||
| 19 | Added line. | ||
| 20 | Added line. Double_Vector | ||
| 21 | Added line. double_vector_identity (Double_Vector value) | ||
| 22 | Added line. { | ||
| 23 | Added line. return value; | ||
| 24 | Added line. } | ||
| 25 | Added line. | ||
| 26 | Added line. class Vector_Object | ||
| 27 | Added line. { | ||
| 28 | Added line. public: | ||
| 29 | Added line. virtual ~Vector_Object () = default; | ||
| 30 | Added line. virtual Int_Vector transform (Int_Vector value) { return value; } | ||
| 31 | Added line. }; | ||
| 32 | Added line. | ||
| 33 | Added line. extern "C" Vector_Object *create_vector_object () | ||
| 34 | Added line. { | ||
| 35 | Added line. return new Vector_Object; | ||
| 36 | Added line. } | ||
| 37 | Added line. | ||
| 38 | Added line. extern "C" void delete_vector_object (Vector_Object *object) | ||
| 39 | Added line. { | ||
| 40 | Added line. delete object; | ||
| 41 | Added line. } | ||
| 42 | Added line. | ||
| 43 | Added line. extern "C" Int_Vector | ||
| 44 | Added line. cpp_transform_vector (Vector_Object *object, Int_Vector value) | ||
| 45 | Added line. { | ||
| 46 | Added line. return object->transform (value); | ||
| 47 | Added line. } | ||
| 48 | Added line. | ||
| 49 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
gcc/testsuite/g++.dg/ada-spec/scalable-vector.C
+13−0new file
| @@ -0 +1 @@ | |||
| 1 | Added line. /* { dg-do compile { target aarch64*-*-linux* } } */ | ||
| 2 | Added line. /* { dg-options "-march=armv8-a+sve -fdump-ada-spec-slim" } */ | ||
| 3 | Added line. /* { dg-final { scan-file scalable_vector_c.ads "<scalable_vector>" } } */ | ||
| 4 | Added line. | ||
| 5 | Added line. #include <arm_sve.h> | ||
| 6 | Added line. | ||
| 7 | Added line. svint32_t | ||
| 8 | Added line. scalable_identity (svint32_t value) | ||
| 9 | Added line. { | ||
| 10 | Added line. return value; | ||
| 11 | Added line. } | ||
| 12 | Added line. | ||
| 13 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 14 | | ||