From bf3989207ee7c50926aa7ca28cf1e13983e809b5 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Thu, 12 Apr 2018 07:17:29 +0000 Subject: [PATCH] [nvptx] Fix handling of extern var with flexible array member 2018-04-12 Tom de Vries PR target/85296 * config/nvptx/nvptx.c (flexible_array_member_type_p): New function. (nvptx_assemble_decl_begin): Add undefined param. Declare undefined array with flexible array member as array without given dimension. (nvptx_assemble_undefined_decl): Set nvptx_assemble_decl_begin call argument for undefined param to true. From-SVN: r259337 --- gcc/ChangeLog | 9 +++++++++ gcc/config/nvptx/nvptx.c | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ff66dd4ba53..c4d0882950a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-04-12 Tom de Vries + + PR target/85296 + * config/nvptx/nvptx.c (flexible_array_member_type_p): New function. + (nvptx_assemble_decl_begin): Add undefined param. Declare undefined + array with flexible array member as array without given dimension. + (nvptx_assemble_undefined_decl): Set nvptx_assemble_decl_begin call + argument for undefined param to true. + 2018-04-11 Aaron Sawdey PR target/85321 diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index a9a3053f336..131b495098e 100644 --- a/gcc/config/nvptx/nvptx.c +++ b/gcc/config/nvptx/nvptx.c @@ -2021,6 +2021,30 @@ nvptx_output_ascii (FILE *, const char *str, unsigned HOST_WIDE_INT size) nvptx_assemble_value (str[i], 1); } +/* Return true if TYPE is a record type where the last field is an array without + given dimension. */ + +static bool +flexible_array_member_type_p (const_tree type) +{ + if (TREE_CODE (type) != RECORD_TYPE) + return false; + + const_tree last_field = NULL_TREE; + for (const_tree f = TYPE_FIELDS (type); f; f = TREE_CHAIN (f)) + last_field = f; + + if (!last_field) + return false; + + const_tree last_field_type = TREE_TYPE (last_field); + if (TREE_CODE (last_field_type) != ARRAY_TYPE) + return false; + + return (! TYPE_DOMAIN (last_field_type) + || ! TYPE_MAX_VALUE (TYPE_DOMAIN (last_field_type))); +} + /* Emit a PTX variable decl and prepare for emission of its initializer. NAME is the symbol name and SETION the PTX data area. The type is TYPE, object size SIZE and alignment is ALIGN. @@ -2031,11 +2055,18 @@ nvptx_output_ascii (FILE *, const char *str, unsigned HOST_WIDE_INT size) static void nvptx_assemble_decl_begin (FILE *file, const char *name, const char *section, - const_tree type, HOST_WIDE_INT size, unsigned align) + const_tree type, HOST_WIDE_INT size, unsigned align, + bool undefined = false) { bool atype = (TREE_CODE (type) == ARRAY_TYPE) && (TYPE_DOMAIN (type) == NULL_TREE); + if (undefined && flexible_array_member_type_p (type)) + { + size = 0; + atype = true; + } + while (TREE_CODE (type) == ARRAY_TYPE) type = TREE_TYPE (type); @@ -2172,7 +2203,7 @@ nvptx_assemble_undefined_decl (FILE *file, const char *name, const_tree decl) tree size = DECL_SIZE_UNIT (decl); nvptx_assemble_decl_begin (file, name, section_for_decl (decl), TREE_TYPE (decl), size ? tree_to_shwi (size) : 0, - DECL_ALIGN (decl)); + DECL_ALIGN (decl), true); nvptx_assemble_decl_end (); } -- 2.30.2