From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 819 invoked by alias); 24 Aug 2004 18:53:25 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 811 invoked from network); 24 Aug 2004 18:53:24 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 24 Aug 2004 18:53:24 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i7OIrOS0031129 for ; Tue, 24 Aug 2004 14:53:24 -0400 Received: from pobox.toronto.redhat.com (pobox.toronto.redhat.com [172.16.14.4]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i7OIrOa20392; Tue, 24 Aug 2004 14:53:24 -0400 Received: from touchme.toronto.redhat.com (IDENT:postfix@touchme.toronto.redhat.com [172.16.14.9]) by pobox.toronto.redhat.com (8.12.8/8.12.8) with ESMTP id i7OIrNse009291; Tue, 24 Aug 2004 14:53:23 -0400 Received: from redhat.com (toocool.toronto.redhat.com [172.16.14.72]) by touchme.toronto.redhat.com (Postfix) with ESMTP id A998480001E; Tue, 24 Aug 2004 14:53:23 -0400 (EDT) Message-ID: <412B8EA3.3090406@redhat.com> Date: Tue, 24 Aug 2004 18:53:00 -0000 From: Jeff Johnston User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 MIME-Version: 1.0 To: Daniel Jacobowitz Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA]: Java Inferior Call Take 3 References: <40A9264C.4060404@redhat.com> <20040617030603.GC23443@nevyn.them.org> <40D20494.2020608@redhat.com> <20040619235857.GA18759@nevyn.them.org> <16598.64375.217285.743094@cuddles.cambridge.redhat.com> <16601.25623.949217.642524@cuddles.cambridge.redhat.com> <20040623134742.GA24612@nevyn.them.org> <40D9FC3B.3030700@redhat.com> <20040623230138.GA6426@nevyn.them.org> <40EB1DDD.4070603@redhat.com> <20040816203502.GB14885@nevyn.them.org> In-Reply-To: <20040816203502.GB14885@nevyn.them.org> Content-Type: multipart/mixed; boundary="------------090805020307070601070407" X-SW-Source: 2004-08/txt/msg00654.txt.bz2 This is a multi-part message in MIME format. --------------090805020307070601070407 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2673 Here is the revised patch. 2004-08-24 Jeff Johnston * dwarf2read.c (typename_concat): Change prototype to accept dwarf2_cu struct pointer as argument. Change function to use new argument to determine language. If language is Java, use "." as separator, otherwise, use "::". (partial_die_parent_scope): Change comment to include java. Check language to determine if Java "." or C++ "::" separator should be used. (add_partial_symbol): Enhance tests for C++ to also test for Java. (guess_structure_name): Ditto. (read_subroutine_type): Ditto. (new_symbol): Ditto. (read_structure_type): Add Java vtable support. (read_namespace): Add Java support. * jv-exp.y (FuncStart): New pattern. (MethodInvocation): Add support for simple function calls. Change warning message for other forms of inferior call currently not supported. * valarith.c (value_subscript): Treat an array with upper-bound of -1 as unknown size. gdb/testsuite/ChangeLog: 2004-08-24 Jeff Johnston * gdb.java/jprint.exp: New test for java inferior call. * gdb.java/jprint.java: Ditto. Daniel Jacobowitz wrote: > On Tue, Jul 06, 2004 at 05:47:09PM -0400, Jeff Johnston wrote: > >>Daniel Jacobowitz wrote: >> >>>On Wed, Jun 23, 2004 at 05:55:07PM -0400, Jeff Johnston wrote: >>> >>> >>>>Daniel Jacobowitz wrote: >>>> >>>> >>>>>On Wed, Jun 23, 2004 at 12:05:59PM +0100, Andrew Haley wrote: >>>>> >>>>> >>>>> >>>>>>This patch is now in mainline. Is there anything else you need? >>>>> >>>>> >>>>>Yes. Two sets of questions left, one for Jeff and one [plus a little >>>>>bit] for you... >>>>> >>>>> >>>>>Jeff, one test still fails: calling addprint. I think this is mostly a >>>>>GDB problem rather than GCC. Before starting the program I see this: >>>>> >>>> >>>>Let me take a look at it. It is not failing in my all-patches-applied >>>>build. Perhaps in splitting the patches up, I screwed up and missed >>>>something. >>> >>> >>>Thanks. >>> >> >>Ok, I figured out what piece I left out and have remade the patch. I can't >>remember where we are on this regarding the workaround for gcc debug-info, >>but at least you will be able to run the test with the full functionality >>now. Please let me know what is needed next as I want to move this forward. > > > Hi Jeff, > > With Andrew's latest GCJ change, you can remove the bit I objected to for > method names. After that I'm happy with the patch. A dwarf2read > maintainer will need to have final review on the dwarf2read bits, so > you may want to post a final patch and ping them. > --------------090805020307070601070407 Content-Type: text/plain; name="java-call.patch2" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="java-call.patch2" Content-length: 13809 Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.151 diff -u -p -r1.151 dwarf2read.c --- dwarf2read.c 7 May 2004 14:29:33 -0000 1.151 +++ dwarf2read.c 24 Aug 2004 18:45:20 -0000 @@ -788,7 +788,8 @@ static void read_type_die (struct die_in static char *determine_prefix (struct die_info *die, struct dwarf2_cu *); -static char *typename_concat (const char *prefix, const char *suffix); +static char *typename_concat (const char *prefix, const char *suffix, + struct dwarf2_cu *); static void read_typedef (struct die_info *, struct dwarf2_cu *); @@ -1502,7 +1503,8 @@ scan_partial_symbols (struct partial_die /* Functions used to compute the fully scoped name of a partial DIE. Normally, this is simple. For C++, the parent DIE's fully scoped - name is concatenated with "::" and the partial DIE's name. + name is concatenated with "::" and the partial DIE's name. For + Java, the same thing occurs except that "." is used instead of "::". Enumerators are an exception; they use the scope of their parent enumeration type, i.e. the name of the enumeration type is not prepended to the enumerator. @@ -1558,7 +1560,7 @@ partial_die_parent_scope (struct partial parent->scope = parent->name; else parent->scope = obconcat (&cu->comp_unit_obstack, grandparent_scope, - "::", parent->name); + cu->language == language_java ? "." : "::", parent->name); } else if (parent->tag == DW_TAG_enumeration_type) /* Enumerators should not get the name of the enumeration as a prefix. */ @@ -1590,7 +1592,11 @@ partial_die_full_name (struct partial_di if (parent_scope == NULL) return NULL; else - return concat (parent_scope, "::", pdi->name, NULL); + { + if (cu->language == language_java) + return concat (parent_scope, ".", pdi->name, NULL); + return concat (parent_scope, "::", pdi->name, NULL); + } } static void @@ -1708,14 +1714,16 @@ add_partial_symbol (struct partial_die_i return; add_psymbol_to_list (actual_name, strlen (actual_name), STRUCT_DOMAIN, LOC_TYPEDEF, - cu->language == language_cplus + (cu->language == language_cplus + || cu->language == language_java) ? &objfile->global_psymbols : &objfile->static_psymbols, 0, (CORE_ADDR) 0, cu->language, objfile); - if (cu->language == language_cplus) + if (cu->language == language_cplus + || cu->language == language_java) { - /* For C++, these implicitly act as typedefs as well. */ + /* For C++ and Java, these implicitly act as typedefs as well. */ add_psymbol_to_list (actual_name, strlen (actual_name), VAR_DOMAIN, LOC_TYPEDEF, &objfile->global_psymbols, @@ -1725,7 +1733,8 @@ add_partial_symbol (struct partial_die_i case DW_TAG_enumerator: add_psymbol_to_list (actual_name, strlen (actual_name), VAR_DOMAIN, LOC_CONST, - cu->language == language_cplus + (cu->language == language_cplus + || cu->language == language_java) ? &objfile->global_psymbols : &objfile->static_psymbols, 0, (CORE_ADDR) 0, cu->language, objfile); @@ -1805,7 +1814,8 @@ static void guess_structure_name (struct partial_die_info *struct_pdi, struct dwarf2_cu *cu) { - if (cu->language == language_cplus + if ((cu->language == language_cplus + || cu->language == language_java) && cu->has_namespace_info == 0 && struct_pdi->has_children) { @@ -2460,7 +2470,8 @@ read_func_scope (struct die_info *die, s if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu)) return; - if (cu->language == language_cplus) + if (cu->language == language_cplus + || cu->language == language_java) { struct die_info *spec_die = die_specification (die, cu); @@ -3292,7 +3303,8 @@ read_structure_type (struct die_info *di attr = dwarf2_attr (die, DW_AT_name, cu); if (attr && DW_STRING (attr)) { - if (cu->language == language_cplus) + if (cu->language == language_cplus + || cu->language == language_java) { char *new_prefix = determine_class_name (die, cu); TYPE_TAG_NAME (type) = obsavestring (new_prefix, @@ -3398,6 +3410,9 @@ read_structure_type (struct die_info *di { static const char vptr_name[] = {'_', 'v', 'p', 't', 'r', '\0'}; + static const char vtable_name[] = + {'v', 't', 'a', 'b', 'l', 'e', '\0'}; + int i; /* Our own class provides vtbl ptr. */ @@ -3407,10 +3422,18 @@ read_structure_type (struct die_info *di { char *fieldname = TYPE_FIELD_NAME (t, i); - if ((strncmp (fieldname, vptr_name, - strlen (vptr_name) - 1) - == 0) - && is_cplus_marker (fieldname[strlen (vptr_name)])) + if (cu->language == language_java + && (strncmp (fieldname, vtable_name, + strlen (vtable_name) - 1) + == 0)) + { + TYPE_VPTR_FIELDNO (type) = i; + break; + } + else if ((strncmp (fieldname, vptr_name, + strlen (vptr_name) - 1) + == 0) + && is_cplus_marker (fieldname[strlen (vptr_name)])) { TYPE_VPTR_FIELDNO (type) = i; break; @@ -3502,7 +3525,9 @@ read_enumeration_type (struct die_info * TYPE_TAG_NAME (type) = obconcat (&objfile->objfile_obstack, processing_current_prefix, processing_current_prefix[0] == '\0' - ? "" : "::", + ? "" : + cu->language == language_java + ? "." : "::", name); } else @@ -3527,7 +3552,7 @@ read_enumeration_type (struct die_info * } /* Determine the name of the type represented by DIE, which should be - a named C++ compound type. Return the name in question; the caller + a named C++ or Java compound type. Return the name in question; the caller is responsible for xfree()'ing it. */ static char * @@ -3573,7 +3598,8 @@ determine_class_name (struct die_info *d { const char *name = dwarf2_name (die, cu); new_prefix = typename_concat (processing_current_prefix, - name ? name : "<>"); + name ? name : "<>", + cu); } if (back_to != NULL) @@ -3810,7 +3836,10 @@ read_namespace (struct die_info *die, st char *temp_name = alloca (strlen (previous_prefix) + 2 + strlen(name) + 1); strcpy (temp_name, previous_prefix); - strcat (temp_name, "::"); + if (cu->language == language_java) + strcat (temp_name, "."); + else + strcat (temp_name, "::"); strcat (temp_name, name); processing_current_prefix = temp_name; @@ -4099,10 +4128,11 @@ read_subroutine_type (struct die_info *d type = die_type (die, cu); ftype = lookup_function_type (type); - /* All functions in C++ have prototypes. */ + /* All functions in C++ and Java have prototypes. */ attr = dwarf2_attr (die, DW_AT_prototyped, cu); if ((attr && (DW_UNSND (attr) != 0)) - || cu->language == language_cplus) + || cu->language == language_cplus + || cu->language == language_java) TYPE_FLAGS (ftype) |= TYPE_FLAG_PROTOTYPED; if (die->child != NULL) @@ -4753,7 +4783,8 @@ load_partial_dies (bfd *abfd, char *info else if (building_psymtab) add_psymbol_to_list (part_die->name, strlen (part_die->name), VAR_DOMAIN, LOC_CONST, - cu->language == language_cplus + (cu->language == language_cplus + || cu->language == language_java) ? &cu->objfile->global_psymbols : &cu->objfile->static_psymbols, 0, (CORE_ADDR) 0, cu->language, cu->objfile); @@ -6357,7 +6388,8 @@ new_symbol (struct die_info *die, struct read_structure_type, and the correct name is saved in the type. */ - if (cu->language == language_cplus) + if (cu->language == language_cplus + || cu->language == language_java) { struct type *type = SYMBOL_TYPE (sym); @@ -6374,7 +6406,7 @@ new_symbol (struct die_info *die, struct } { - /* NOTE: carlton/2003-11-10: C++ class symbols shouldn't + /* NOTE: carlton/2003-11-10: C++ and Java class symbols shouldn't really ever be static objects: otherwise, if you try to, say, break of a class's method and you're in a file which doesn't mention that class, it won't work unless @@ -6385,15 +6417,17 @@ new_symbol (struct die_info *die, struct struct pending **list_to_add; list_to_add = (cu->list_in_scope == &file_symbols - && cu->language == language_cplus + && (cu->language == language_cplus + || cu->language == language_java) ? &global_symbols : cu->list_in_scope); add_symbol_to_list (sym, list_to_add); - /* The semantics of C++ state that "struct foo { ... }" also + /* The semantics of C++ and Java state that "struct foo { ... }" also defines a typedef for "foo". Synthesize a typedef symbol so that "ptype foo" works as expected. */ - if (cu->language == language_cplus) + if (cu->language == language_cplus + || cu->language == language_java) { struct symbol *typedef_sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack, @@ -6415,7 +6449,8 @@ new_symbol (struct die_info *die, struct { SYMBOL_LINKAGE_NAME (sym) = obconcat (&objfile->objfile_obstack, processing_current_prefix, - "::", + cu->language == language_java + ? "." : "::", name); } SYMBOL_CLASS (sym) = LOC_TYPEDEF; @@ -6434,7 +6469,8 @@ new_symbol (struct die_info *die, struct { SYMBOL_LINKAGE_NAME (sym) = obconcat (&objfile->objfile_obstack, processing_current_prefix, - "::", + cu->language == language_java + ? "." : "::", name); } attr = dwarf2_attr (die, DW_AT_const_value, cu); @@ -6449,7 +6485,8 @@ new_symbol (struct die_info *die, struct struct pending **list_to_add; list_to_add = (cu->list_in_scope == &file_symbols - && cu->language == language_cplus + && (cu->language == language_cplus + || cu->language == language_java) ? &global_symbols : cu->list_in_scope); add_symbol_to_list (sym, list_to_add); @@ -6758,7 +6795,8 @@ determine_prefix (struct die_info *die, { struct die_info *parent; - if (cu->language != language_cplus) + if (cu->language != language_cplus + && cu->language != language_java) return NULL; parent = die->parent; @@ -6784,7 +6822,8 @@ determine_prefix (struct die_info *die, char *parent_prefix = determine_prefix (parent, cu); char *retval = typename_concat (parent_prefix, namespace_name (parent, &dummy, - cu)); + cu), + cu); xfree (parent_prefix); return retval; } @@ -6818,11 +6857,11 @@ determine_prefix (struct die_info *die, } /* Return a newly-allocated string formed by concatenating PREFIX, - "::", and SUFFIX, except that if PREFIX is NULL or the empty + "::" or ".", and SUFFIX, except that if PREFIX is NULL or the empty string, just return a copy of SUFFIX. */ static char * -typename_concat (const char *prefix, const char *suffix) +typename_concat (const char *prefix, const char *suffix, struct dwarf2_cu *cu) { if (prefix == NULL || prefix[0] == '\0') return xstrdup (suffix); @@ -6831,7 +6870,10 @@ typename_concat (const char *prefix, con char *retval = xmalloc (strlen (prefix) + 2 + strlen (suffix) + 1); strcpy (retval, prefix); - strcat (retval, "::"); + if (cu->language == language_java) + strcat (retval, "."); + else + strcat (retval, "::"); strcat (retval, suffix); return retval; Index: jv-exp.y =================================================================== RCS file: /cvs/src/src/gdb/jv-exp.y,v retrieving revision 1.18 diff -u -p -r1.18 jv-exp.y --- jv-exp.y 23 Nov 2003 20:41:17 -0000 1.18 +++ jv-exp.y 24 Aug 2004 18:45:20 -0000 @@ -446,13 +446,22 @@ FieldAccess: /*| SUPER '.' SimpleName { FIXME } */ ; +FuncStart: + Name '(' + { push_expression_name ($1); } +; + MethodInvocation: - Name '(' ArgumentList_opt ')' - { error (_("Method invocation not implemented")); } + FuncStart + { start_arglist(); } + ArgumentList_opt ')' + { write_exp_elt_opcode (OP_FUNCALL); + write_exp_elt_longcst ((LONGEST) end_arglist ()); + write_exp_elt_opcode (OP_FUNCALL); } | Primary '.' SimpleName '(' ArgumentList_opt ')' - { error (_("Method invocation not implemented")); } + { error (_("Form of method invocation not implemented")); } | SUPER '.' SimpleName '(' ArgumentList_opt ')' - { error (_("Method invocation not implemented")); } + { error (_("Form of method invocation not implemented")); } ; ArrayAccess: Index: valarith.c =================================================================== RCS file: /cvs/src/src/gdb/valarith.c,v retrieving revision 1.22 diff -u -p -r1.22 valarith.c --- valarith.c 1 Apr 2004 12:08:30 -0000 1.22 +++ valarith.c 24 Aug 2004 18:45:20 -0000 @@ -202,7 +202,10 @@ value_subscript (struct value *array, st LONGEST index = value_as_long (idx); if (index >= lowerbound && index <= upperbound) return value_subscripted_rvalue (array, idx, lowerbound); - warning ("array or string index out of range"); + /* Emit warning unless we have an array of unknown size. + An array of unknown size has lowerbound 0 and upperbound -1. */ + if (upperbound > -1) + warning ("array or string index out of range"); /* fall doing C stuff */ c_style = 1; } --------------090805020307070601070407 Content-Type: text/plain; name="java-call-test.patch2" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="java-call-test.patch2" Content-length: 4892 Index: gdb.java/jprint.exp =================================================================== RCS file: gdb.java/jprint.exp diff -N gdb.java/jprint.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb.java/jprint.exp 24 Aug 2004 18:52:19 -0000 @@ -0,0 +1,80 @@ +# Copyright 2004 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# This file was written by Jeff Johnston. (jjohnstn@redhat.com) +# + +if $tracelevel then { + strace $tracelevel +} + +load_lib "java.exp" + +set testfile "jprint" +set srcfile ${srcdir}/$subdir/${testfile}.java +set binfile ${objdir}/${subdir}/${testfile} +if { [compile_java_from_source ${srcfile} ${binfile} "-g"] != "" } { + untested "Couldn't compile ${srcfile}" + return -1 +} + +# Set the current language to java. This counts as a test. If it +# fails, then we skip the other tests. + +proc set_lang_java {} { + global gdb_prompt + global binfile objdir subdir + + verbose "loading file '$binfile'" + gdb_load $binfile + + send_gdb "set language java\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "set language java (timeout)" ; return 0 } + } + + return [gdb_test "show language" ".* source language is \"java\".*" \ + "set language to \"java\""] +} + +set prms_id 0 +set bug_id 0 + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +gdb_test "set print sevenbit-strings" ".*" + +if ![set_lang_java] then { + # Ref PR gdb:java/1565. Don't use the simpler "break jmisc.main". + # As of 2004-02-24 it wasn't working and is being tested separatly. + runto "\'${testfile}.main(java.lang.String\[\])\'" + + gdb_test "p jvclass.addprint(4,5,6)" "sum is 15\r\n.*" "unambiguous static call" + + gdb_test "next" "" + gdb_test "next" "" + + gdb_test "p x.print(44)" "x is 44\r\n.*" "single argument print call" + gdb_test "p x.print(22,33)" "y is 33\r\n.*" "double argument print call" + gdb_test "call x.dothat(55)" "new value is 58\r\n.*= 62.*" "virtual fn call" + gdb_test "p x.addprint(1,2,3)" "sum is 6\r\n.*" "inherited static call" + gdb_test "call x.addk(44)" "adding k gives 121\r\n.*= 121.*" "inherited virtual fn call" +} Index: gdb.java/jprint.java =================================================================== RCS file: gdb.java/jprint.java diff -N gdb.java/jprint.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb.java/jprint.java 24 Aug 2004 18:52:19 -0000 @@ -0,0 +1,62 @@ +// jprint.java test program. +// +// Copyright 2004 +// Free Software Foundation, Inc. +// +// Written by Jeff Johnston +// Contributed by Red Hat +// +// 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 2 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, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, +// Boston, MA 02111-1307, USA. + +class jvclass { + public static int k; + static { + k = 77; + } + public static void addprint (int x, int y, int z) { + int sum = x + y + z; + System.out.println ("sum is " + sum); + } + + public int addk (int x) { + int sum = x + k; + System.out.println ("adding k gives " + sum); + return sum; + } +} + +public class jprint extends jvclass { + public int dothat (int x) { + int y = x + 3; + System.out.println ("new value is " + y); + return y + 4; + } + public static void print (int x) { + System.out.println("x is " + x); + } + public static void print (int x, int y) { + System.out.println("y is " + y); + } + public static void main(String[] args) { + jprint x = new jprint (); + x.print (44); + print (k, 33); + } +} + + --------------090805020307070601070407--