From patchwork Mon Aug 18 17:38:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Brobecker X-Patchwork-Id: 2423 Received: (qmail 17897 invoked by alias); 18 Aug 2014 17:38:52 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 17808 invoked by uid 89); 18 Aug 2014 17:38:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Mon, 18 Aug 2014 17:38:50 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 37DAE11632F for ; Mon, 18 Aug 2014 13:38:48 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id jh3kbr365RTR for ; Mon, 18 Aug 2014 13:38:48 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 09C941162A9 for ; Mon, 18 Aug 2014 13:38:48 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id F2B68410E6; Mon, 18 Aug 2014 19:38:46 +0200 (CEST) From: Joel Brobecker To: gdb-patches@sourceware.org Subject: [pushed 4/4] DW_AT_data_location and DW_OP_push_object_address testcase. Date: Mon, 18 Aug 2014 19:38:37 +0200 Message-Id: <1408383517-29205-5-git-send-email-brobecker@adacore.com> In-Reply-To: <1408383517-29205-1-git-send-email-brobecker@adacore.com> References: <1408383517-29205-1-git-send-email-brobecker@adacore.com> This testcase allows us to test the proper processing of both DW_AT_data_location and DW_OP_push_object_address using a hand-crafted testcase duplicating how we expect the Ada compiler to represent unbounded arrays. gdb/testsuite/ChangeLog: * gdb.dwarf2/data-loc.c, gdb.dwarf2/data-loc.exp: New files. --- gdb/testsuite/ChangeLog | 4 + gdb/testsuite/gdb.dwarf2/data-loc.c | 46 ++++++++ gdb/testsuite/gdb.dwarf2/data-loc.exp | 191 ++++++++++++++++++++++++++++++++++ 3 files changed, 241 insertions(+) create mode 100644 gdb/testsuite/gdb.dwarf2/data-loc.c create mode 100644 gdb/testsuite/gdb.dwarf2/data-loc.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 553f695..a90d85e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-08-18 Joel Brobecker + + * gdb.dwarf2/data-loc.c, gdb.dwarf2/data-loc.exp: New files. + 2014-08-15 Siva Chandra Reddy PR c++/17132 diff --git a/gdb/testsuite/gdb.dwarf2/data-loc.c b/gdb/testsuite/gdb.dwarf2/data-loc.c new file mode 100644 index 0000000..ebb9a51 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/data-loc.c @@ -0,0 +1,46 @@ +/* Copyright 2014 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +/* This C file provides some global variables laid out in a way + that mimicks what the GNAT Ada compiler calls "fat pointers". + These fat pointers are the memory representation used by + the compiler to handle dynamic arrays. + + Debugging information on how to decode that data into an array + will be generated separately by the testcase using that file. */ + +struct fat_pointer +{ + int *data; + int *bounds; +}; + +int table_1_data[] = {1, 2, 3}; +int table_1_bounds[] = {1, 3}; +struct fat_pointer table_1 = {table_1_data, table_1_bounds}; + +int table_2_data[] = {5, 8, 13, 21, 34}; +int table_2_bounds[] = {2, 6}; +struct fat_pointer table_2 = {table_2_data, table_2_bounds}; + +int +main (void) +{ + table_1.bounds[1] = 2; + table_2.bounds[1] = 3; + return 0; +} diff --git a/gdb/testsuite/gdb.dwarf2/data-loc.exp b/gdb/testsuite/gdb.dwarf2/data-loc.exp new file mode 100644 index 0000000..859962a --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/data-loc.exp @@ -0,0 +1,191 @@ +# Copyright 2014 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 . +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +standard_testfile data-loc.c data-loc-dw.S + +# We need to know the size of integer and address types in order +# to write some of the debugging info we'd like to generate. +# +# For that, we ask GDB by debugging our data-loc.c program. +# Any program would do, but since we already have data-loc.c +# specifically for this testcase, might as well use that. + +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { + untested ${testfile}.exp + return -1 +} + +# Make some DWARF for the test. +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + cu {} { + DW_TAG_compile_unit { + {DW_AT_language @DW_LANG_Ada95} + {DW_AT_name foo.adb} + {DW_AT_comp_dir /tmp} + } { + declare_labels integer_label array_label + + integer_label: DW_TAG_base_type { + {DW_AT_byte_size 4 DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_name integer} + } + + array_label: DW_TAG_array_type { + {DW_AT_name foo__array_type} + {DW_AT_type :$integer_label} + {DW_AT_data_location { + DW_OP_push_object_address + DW_OP_deref + } SPECIAL_expr} + {external 1 flag} + } { + DW_TAG_subrange_type { + {DW_AT_type :$integer_label} + {DW_AT_lower_bound { + DW_OP_push_object_address + DW_OP_plus_uconst [get_sizeof "void *" 96] + DW_OP_deref + DW_OP_deref_size [get_sizeof "int" 4] + } SPECIAL_expr} + {DW_AT_upper_bound { + DW_OP_push_object_address + DW_OP_plus_uconst [get_sizeof "void *" 96] + DW_OP_deref + DW_OP_plus_uconst [get_sizeof "int" 4] + DW_OP_deref_size [get_sizeof "int" 4] + } SPECIAL_expr} + {DW_AT_upper_bound 5 DW_FORM_data1} + } + } + DW_TAG_typedef { + {DW_AT_name foo__array_type} + {DW_AT_type :$array_label} + } + DW_TAG_variable { + {DW_AT_name foo__three} + {DW_AT_type :$array_label} + {DW_AT_location { + DW_OP_addr table_1 + } SPECIAL_expr} + {external 1 flag} + } + DW_TAG_variable { + {DW_AT_name foo__five} + {DW_AT_type :$array_label} + {DW_AT_location { + DW_OP_addr table_2 + } SPECIAL_expr} + {external 1 flag} + } + } + } +} + +# Now that we've generated the DWARF debugging info, rebuild our +# program using our debug info instead of the info generated by +# the compiler. + +if { [prepare_for_testing ${testfile}.exp ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + return -1 +} + +if ![runto_main] { + return -1 +} + +gdb_test_no_output "set language ada" + +gdb_test "print foo.three" \ + " = \\(1, 2, 3\\)" + +gdb_test "ptype foo.three" \ + "type = array \\(1 .. 3\\) of integer" + +gdb_test "print foo.three(1)" \ + " = 1" + +gdb_test "print foo.three(2)" \ + " = 2" + +gdb_test "print foo.three(3)" \ + " = 3" + +gdb_test "print foo.three'first" \ + " = 1" + +gdb_test "print foo.three'last" \ + " = 3" + +gdb_test "print foo.three'length" \ + " = 3" + +gdb_test "print foo.five" \ + " = \\(2 => 5, 8, 13, 21, 34\\)" + +gdb_test "ptype foo.five" \ + "type = array \\(2 .. 6\\) of integer" + +gdb_test "ptype foo.array_type" \ + "type = array \\(<>\\) of integer" + +gdb_test "print foo.five(2)" \ + " = 5" + +gdb_test "print foo.five(3)" \ + " = 8" + +gdb_test "print foo.five(4)" \ + " = 13" + +gdb_test "print foo.five(5)" \ + " = 21" + +gdb_test "print foo.five(6)" \ + " = 34" + +gdb_test "print foo.five'first" \ + " = 2" + +gdb_test "print foo.five'last" \ + " = 6" + +gdb_test "print foo.five'length" \ + " = 5" + +gdb_test_no_output "set lang c" + +gdb_test "print foo__three" \ + " = \\{1, 2, 3\\}" + +gdb_test "ptype foo__three" \ + "type = integer \\\[3\\\]" + +gdb_test "print foo__five" \ + " = \\{5, 8, 13, 21, 34\\}" + +gdb_test "ptype foo__five" \ + "type = integer \\\[5\\\]" + +gdb_test "ptype foo__array_type" \ + "type = integer \\\[variable length\\\]"