From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by sourceware.org (Postfix) with ESMTP id 05F85386102D for ; Wed, 8 Jul 2020 15:47:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 05F85386102D Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-232-6tX5vepPPTuZvI9diauSOg-1; Wed, 08 Jul 2020 11:46:59 -0400 X-MC-Unique: 6tX5vepPPTuZvI9diauSOg-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B7613107B0E1; Wed, 8 Jul 2020 15:46:58 +0000 (UTC) Received: from blade.nx (ovpn-114-154.ams2.redhat.com [10.36.114.154]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3D2505D9C9; Wed, 8 Jul 2020 15:46:57 +0000 (UTC) Received: from blade.com (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id 6F574816CCA9; Wed, 8 Jul 2020 16:46:56 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Subject: [PATCH v2] Skip VLA structure field tests when compiling with clang Date: Wed, 8 Jul 2020 16:46:55 +0100 Message-Id: <1594223215-21455-1-git-send-email-gbenson@redhat.com> In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-14.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Jul 2020 15:47:06 -0000 Hi Luis, Luis Machado wrote: > As a general comment (for this and other patches like this), I think > the preprocessor blocks intermixed with the test code make it harder > to follow and update the test. > > If clang claims it will never support a particular feature, then > maybe we should ... separate the bits clang doesn't support and put > it into a separate test that clang-compiled hosts should skip? Thanks for the review. I've made that change, the updated patch is below. I checked it on Fedora 31 x86_64, GCC and clang. Is it ok to commit? Cheers Gary -- Clang fails to compile gdb.base/vla-datatypes.c with the following error: fields must have a constant size: 'variable length array in structure' extension will never be supported. This patch factors the affected tests out into a new testcase, vla-struct-fields.{exp,c}, which is skipped when the testcase is compiled using clang, gdb/testsuite/ChangeLog: * gdb.base/vla-datatypes.c (vla_factory): Factor out sections defining and using VLA structure fields into... * gdb.base/vla-struct-fields.c: New file. * gdb.base/vla-datatypes.exp: Factor out VLA structure field tests into... * gdb.base/vla-struct-fields.exp: New file. --- gdb/testsuite/ChangeLog | 9 +++ gdb/testsuite/gdb.base/vla-datatypes.c | 53 -------------- gdb/testsuite/gdb.base/vla-datatypes.exp | 24 ------- gdb/testsuite/gdb.base/vla-struct-fields.c | 104 +++++++++++++++++++++++++++ gdb/testsuite/gdb.base/vla-struct-fields.exp | 67 +++++++++++++++++ 5 files changed, 180 insertions(+), 77 deletions(-) create mode 100644 gdb/testsuite/gdb.base/vla-struct-fields.c create mode 100644 gdb/testsuite/gdb.base/vla-struct-fields.exp diff --git a/gdb/testsuite/gdb.base/vla-datatypes.c b/gdb/testsuite/gdb.base/vla-datatypes.c index 682319f..d8b835a 100644 --- a/gdb/testsuite/gdb.base/vla-datatypes.c +++ b/gdb/testsuite/gdb.base/vla-datatypes.c @@ -46,49 +46,6 @@ struct foo BAR bar_vla[n]; int i; - struct vla_struct - { - int something; - int vla_field[n]; - }; - /* Define a typedef for a VLA structure. */ - typedef struct vla_struct vla_struct_typedef; - vla_struct_typedef vla_struct_object; - - struct inner_vla_struct - { - int something; - int vla_field[n]; - int after; - } inner_vla_struct_object; - - /* Define a structure which uses a typedef for the VLA field - to make sure that GDB creates the proper type for this field, - preventing a possible assertion failure (see gdb/21356). */ - struct vla_struct_typedef_struct_member - { - int something; - vla_struct_typedef vla_object; - } vla_struct_typedef_struct_member_object; - - union vla_union - { - int vla_field[n]; - } vla_union_object; - - /* Like vla_struct_typedef_struct_member but a union type. */ - union vla_struct_typedef_union_member - { - int something; - vla_struct_typedef vla_object; - } vla_struct_typedef_union_member_object; - - vla_struct_object.something = n; - inner_vla_struct_object.something = n; - inner_vla_struct_object.after = n; - vla_struct_typedef_struct_member_object.something = n * 2; - vla_struct_typedef_struct_member_object.vla_object.something = n * 3; - vla_struct_typedef_union_member_object.vla_object.something = n + 1; for (i = 0; i < n; i++) { int_vla[i] = i*2; @@ -104,13 +61,6 @@ struct foo foo_vla[i].a = i*2; bar_vla[i].x = i*2; bar_vla[i].y.a = i*2; - vla_struct_object.vla_field[i] = i*2; - vla_union_object.vla_field[i] = i*2; - inner_vla_struct_object.vla_field[i] = i*2; - vla_struct_typedef_struct_member_object.vla_object.vla_field[i] - = i * 3; - vla_struct_typedef_union_member_object.vla_object.vla_field[i] - = i * 3 - 1; } size_t int_size = sizeof(int_vla); /* vlas_filled */ @@ -124,9 +74,6 @@ struct foo size_t uchar_size = sizeof(unsigned_char_vla); size_t foo_size = sizeof(foo_vla); size_t bar_size = sizeof(bar_vla); - size_t vla_struct_object_size = sizeof(vla_struct_object); - size_t vla_union_object_size = sizeof(vla_union_object); - size_t inner_vla_struct_object_size = sizeof(inner_vla_struct_object); return; /* break_end_of_vla_factory */ } diff --git a/gdb/testsuite/gdb.base/vla-datatypes.exp b/gdb/testsuite/gdb.base/vla-datatypes.exp index e8d8457..201f051 100644 --- a/gdb/testsuite/gdb.base/vla-datatypes.exp +++ b/gdb/testsuite/gdb.base/vla-datatypes.exp @@ -41,14 +41,6 @@ gdb_test "print foo_vla" \ "\\\{\\\{a = 0\\\}, \\\{a = 2\\\}, \\\{a = 4\\\}, \\\{a = 6\\\}, \\\{a = 8\\\}\\\}" gdb_test "print bar_vla" \ "\\\{\\\{x = 0, y = \\\{a = 0\\\}\\\}, \\\{x = 2, y = \\\{a = 2\\\}\\\}, \\\{x = 4, y = \\\{a = 4\\\}\\\}, \\\{x = 6, y = \\\{a = 6\\\}\\\}, \\\{x = 8, y = \\\{a = 8\\\}\\\}\\\}" -gdb_test "print vla_struct_object" \ - "\\\{something = 5, vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}" -gdb_test "print vla_union_object" \ - "\\\{vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}" -gdb_test "print vla_struct_typedef_struct_member_object" \ - "\\\{something = 10, vla_object = \\\{something = 15, vla_field = \\\{0, 3, 6, 9, 12\\\}\\\}\\\}" -gdb_test "print vla_struct_typedef_union_member_object" \ - "\\\{something = 6, vla_object = \\\{something = 6, vla_field = \\\{-1, 2, 5, 8, 11\\\}\\\}\\\}" # Check whatis of VLA's. gdb_test "whatis int_vla" "type = int \\\[5\\\]" @@ -65,8 +57,6 @@ gdb_test "whatis unsigned_short_vla" \ gdb_test "whatis unsigned_char_vla" "type = unsigned char \\\[5\\\]" gdb_test "whatis foo_vla" "type = struct foo \\\[5\\\]" gdb_test "whatis bar_vla" "type = BAR \\\[5\\\]" -gdb_test "whatis vla_struct_object" "type = vla_struct_typedef" -gdb_test "whatis vla_union_object" "type = union vla_union" # Check ptype of VLA's. gdb_test "ptype int_vla" "type = int \\\[5\\\]" @@ -82,10 +72,6 @@ gdb_test "ptype unsigned_char_vla" "type = unsigned char \\\[5\\\]" gdb_test "ptype foo_vla" "type = struct foo {\r\n\\s+int a;\r\n} \\\[5\\\]" gdb_test "ptype bar_vla" \ "type = struct bar {\r\n\\s+int x;\r\n\\s+struct foo y;\r\n} \\\[5\\\]" -gdb_test "ptype vla_struct_object" \ - "type = struct vla_struct {\r\n\\s+int something;\r\n\\s+int vla_field\\\[5\\\];\r\n}" -gdb_test "ptype vla_union_object" \ - "type = union vla_union {\r\n\\s+int vla_field\\\[5\\\];\r\n}" # Check the size of the VLA's. gdb_breakpoint [gdb_get_line_number "break_end_of_vla_factory"] @@ -109,10 +95,6 @@ gdb_test "print uchar_size == sizeof(unsigned_char_vla)" " = 1" \ "size of unsigned_char_vla" gdb_test "print foo_size == sizeof(foo_vla)" " = 1" "size of foo_vla" gdb_test "print bar_size == sizeof(bar_vla)" " = 1" "size of bar_vla" -gdb_test "print vla_struct_object_size == sizeof(vla_struct_object)" \ - " = 1" "size of vla_struct_object" -gdb_test "print vla_union_object_size == sizeof(vla_union_object)" \ - " = 1" "size of vla_union_object" # Check side effects for sizeof argument. set sizeof_int [get_sizeof "int" 4] @@ -130,9 +112,3 @@ gdb_test "print int_vla\[0\]" " = 42" \ gdb_test "whatis ++int_vla\[0\]" "type = int" gdb_test "print int_vla\[0\]" " = 42" \ "print int_vla\[0\] - whatis no side effects" - -# Fails due to incorrect debugging information generated by GCC. -setup_xfail "*-*-*" -gdb_test \ - "print inner_vla_struct_object_size == sizeof(inner_vla_struct_object)" \ - " = 1" "size of inner_vla_struct_object" diff --git a/gdb/testsuite/gdb.base/vla-struct-fields.c b/gdb/testsuite/gdb.base/vla-struct-fields.c new file mode 100644 index 0000000..ef236a7 --- /dev/null +++ b/gdb/testsuite/gdb.base/vla-struct-fields.c @@ -0,0 +1,104 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014-2020 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#define SIZE 5 + +struct foo +{ + int a; +}; + +typedef struct bar +{ + int x; + struct foo y; +} BAR; + +void +vla_factory (int n) +{ + struct vla_struct + { + int something; + int vla_field[n]; + }; + /* Define a typedef for a VLA structure. */ + typedef struct vla_struct vla_struct_typedef; + vla_struct_typedef vla_struct_object; + + struct inner_vla_struct + { + int something; + int vla_field[n]; + int after; + } inner_vla_struct_object; + + /* Define a structure which uses a typedef for the VLA field + to make sure that GDB creates the proper type for this field, + preventing a possible assertion failure (see gdb/21356). */ + struct vla_struct_typedef_struct_member + { + int something; + vla_struct_typedef vla_object; + } vla_struct_typedef_struct_member_object; + + union vla_union + { + int vla_field[n]; + } vla_union_object; + + /* Like vla_struct_typedef_struct_member but a union type. */ + union vla_struct_typedef_union_member + { + int something; + vla_struct_typedef vla_object; + } vla_struct_typedef_union_member_object; + int i; + + vla_struct_object.something = n; + inner_vla_struct_object.something = n; + inner_vla_struct_object.after = n; + vla_struct_typedef_struct_member_object.something = n * 2; + vla_struct_typedef_struct_member_object.vla_object.something = n * 3; + vla_struct_typedef_union_member_object.vla_object.something = n + 1; + + for (i = 0; i < n; i++) + { + vla_struct_object.vla_field[i] = i*2; + vla_union_object.vla_field[i] = i*2; + inner_vla_struct_object.vla_field[i] = i*2; + vla_struct_typedef_struct_member_object.vla_object.vla_field[i] + = i * 3; + vla_struct_typedef_union_member_object.vla_object.vla_field[i] + = i * 3 - 1; + } + + size_t vla_struct_object_size + = sizeof(vla_struct_object); /* vlas_filled */ + size_t vla_union_object_size = sizeof(vla_union_object); + size_t inner_vla_struct_object_size = sizeof(inner_vla_struct_object); + + return; /* break_end_of_vla_factory */ +} + +int +main (void) +{ + vla_factory(SIZE); + return 0; +} diff --git a/gdb/testsuite/gdb.base/vla-struct-fields.exp b/gdb/testsuite/gdb.base/vla-struct-fields.exp new file mode 100644 index 0000000..150a328 --- /dev/null +++ b/gdb/testsuite/gdb.base/vla-struct-fields.exp @@ -0,0 +1,67 @@ +# Copyright 2014-2020 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +standard_testfile + +# Clang says it will never support variable length arrays in structures. +if {[test_compiler_info clang*]} { + unsupported "compiler does not variable length arrays in structure" + return +} + +if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { + return -1 +} + +if ![runto_main] { + return -1 +} + +gdb_breakpoint [gdb_get_line_number "vlas_filled"] +gdb_continue_to_breakpoint "vlas_filled" + +# Check the values of VLA's. +gdb_test "print vla_struct_object" \ + "\\\{something = 5, vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}" +gdb_test "print vla_union_object" \ + "\\\{vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}" +gdb_test "print vla_struct_typedef_struct_member_object" \ + "\\\{something = 10, vla_object = \\\{something = 15, vla_field = \\\{0, 3, 6, 9, 12\\\}\\\}\\\}" +gdb_test "print vla_struct_typedef_union_member_object" \ + "\\\{something = 6, vla_object = \\\{something = 6, vla_field = \\\{-1, 2, 5, 8, 11\\\}\\\}\\\}" + +# Check whatis of VLA's. +gdb_test "whatis vla_struct_object" "type = vla_struct_typedef" +gdb_test "whatis vla_union_object" "type = union vla_union" + +# Check ptype of VLA's. +gdb_test "ptype vla_struct_object" \ + "type = struct vla_struct {\r\n\\s+int something;\r\n\\s+int vla_field\\\[5\\\];\r\n}" +gdb_test "ptype vla_union_object" \ + "type = union vla_union {\r\n\\s+int vla_field\\\[5\\\];\r\n}" + +# Check the size of the VLA's. +gdb_breakpoint [gdb_get_line_number "break_end_of_vla_factory"] +gdb_continue_to_breakpoint "break_end_of_vla_factory" +gdb_test "print vla_struct_object_size == sizeof(vla_struct_object)" \ + " = 1" "size of vla_struct_object" +gdb_test "print vla_union_object_size == sizeof(vla_union_object)" \ + " = 1" "size of vla_union_object" + +# Fails due to incorrect debugging information generated by GCC. +setup_xfail "*-*-*" +gdb_test \ + "print inner_vla_struct_object_size == sizeof(inner_vla_struct_object)" \ + " = 1" "size of inner_vla_struct_object" -- 1.8.3.1