On Thu, 29 Oct 2015, Bernd Schmidt wrote:
> On 10/28/2015 08:29 PM, Alexander Monakov wrote:
>
> > Anything wrong with the simple fix: pick an integer type with the largest
> > size
> > dividing the original struct type size?
>
> Try it and run it through the testsuite.
The following patch passes testing with
make -k check-c DEJAGNU=.../dejagnu.exp
RUNTESTFLAGS=--target_board=nvptx-none-run
with no new regressions, and fixes 1 test:
-FAIL: gcc.dg/compat/struct-align-1 c_compat_x_tst.o-c_compat_y_tst.o execute
OK?
Thanks.
Alexander
nvptx: fix chunk size selection for structure types
* config/nvptx/nvptx.c (nvptx_ptx_type_for_output): New. Handle
COMPLEX_TYPE like ARRAY_TYPE. Drop special handling of scalar types.
Fix handling of structure types by choosing integer type that divides
original size evenly. Split out from and use it...
(init_output_initializer): ...here.
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index b541666..3a0cac2 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -1692,6 +1692,29 @@ nvptx_assemble_decl_end (void)
fprintf (asm_out_file, ";\n");
}
+/* Return a type suitable to output initializers for TYPE. */
+static const_tree
+nvptx_ptx_type_for_output (const_tree type)
+{
+ /* Avoid picking a larger type than the underlying type. */
+ if (TREE_CODE (type) == ARRAY_TYPE
+ || TREE_CODE (type) == COMPLEX_TYPE)
+ type = TREE_TYPE (type);
+ int sz = int_size_in_bytes (type);
+ if (sz < 0)
+ return char_type_node;
+ /* Size of the output type must divide that of original type. Initializers
+ with pointers to objects need a pointer-sized type. These requirements
+ may be contradictory for packed structs, but giving priority to first at
+ least allows to output some initializers correctly. Here we pick largest
+ suitable integer type without deeper inspection. */
+ return (sz % 8 || !TARGET_ABI64
+ ? (sz % 4
+ ? (sz % 2 ? char_type_node : short_integer_type_node)
+ : integer_type_node)
+ : long_integer_type_node);
+}
+
/* Start a declaration of a variable of TYPE with NAME to
FILE. IS_PUBLIC says whether this will be externally visible.
Here we just write the linker hint and decide on the chunk size
@@ -1705,15 +1728,7 @@ init_output_initializer (FILE *file, const char *name,
const_tree type,
assemble_name_raw (file, name);
fputc ('\n', file);
- if (TREE_CODE (type) == ARRAY_TYPE)
- type = TREE_TYPE (type);
- int sz = int_size_in_bytes (type);
- if ((TREE_CODE (type) != INTEGER_TYPE
- && TREE_CODE (type) != ENUMERAL_TYPE
- && TREE_CODE (type) != REAL_TYPE)
- || sz < 0
- || sz > HOST_BITS_PER_WIDE_INT)
- type = ptr_type_node;
+ type = nvptx_ptx_type_for_output (type);
decl_chunk_size = int_size_in_bytes (type);
decl_chunk_mode = int_mode_for_mode (TYPE_MODE (type));
decl_offset = 0;