FYI: avoid bogus RTTI message with java

Tom Tromey tromey@redhat.com
Tue Jul 5 14:38:00 GMT 2011


I'm checking this in on the trunk.

Right now, trying to print a Java string yields:

(gdb) p q.hi
$1 = warning: RTTI symbol not found for class 'java::lang::String'
java.lang.Stringwarning: RTTI symbol not found for class 'java::lang::String'
 "stuff"

Those warnings are bogus -- gcj-compiled objects have a vtable, but gcj
doesn't emit RTTI the same way that g++ does.

This patch fixes the problem.  We just note that a type came from a Java
CU and short-circuit the RTTI search in this case.  This is always ok
because Java does not have multiple inheritance or enclosing objects.
The new flag fits in an existing hole in cplus_struct_type, so this has
no memory use impact.

New test case included.  Surprisingly, string printing doesn't seem to
be tested by gdb.java before this.

With the patch the output is:

(gdb) p q.hi
$1 = java.lang.String "stuff"

Built and regtested by the buildbot.

Tom

2011-07-05  Tom Tromey  <tromey@redhat.com>

	* gnu-v3-abi.c (gnuv3_rtti_type): Check TYPE_CPLUS_REALLY_JAVA.
	* gdbtypes.h (struct cplus_struct_type) <is_java>: New field.
	(TYPE_CPLUS_REALLY_JAVA): New macro.
	* dwarf2read.c (process_structure_scope): Set
	TYPE_CPLUS_REALLY_JAVA.

2011-07-05  Tom Tromey  <tromey@redhat.com>

	* gdb.java/jprint.java (jprint.hi): New field.
	* gdb.java/jprint.exp: Print string.

diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 3ffe1ee..d86487a 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -7492,6 +7492,9 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
 	}
 
       do_cleanups (back_to);
+
+      if (HAVE_CPLUS_STRUCT (type))
+	TYPE_CPLUS_REALLY_JAVA (type) = cu->language == language_java;
     }
 
   quirk_gcc_member_function_pointer (type, cu->objfile);
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 3b62453..1e96293 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -705,6 +705,9 @@ struct cplus_struct_type
        dynamic.  Zero if not yet computed.  */
     int is_dynamic : 2;
 
+    /* Non-zero if this type came from a Java CU.  */
+    unsigned int is_java : 1;
+
     /* For derived classes, the number of base classes is given by
        n_baseclasses and virtual_field_bits is a bit vector containing
        one bit per base class.  If the base class is virtual, the
@@ -991,6 +994,7 @@ extern void allocate_gnat_aux_type (struct type *);
 #define BASETYPE_VIA_PUBLIC(thistype, index) \
   ((!TYPE_FIELD_PRIVATE(thistype, index)) && (!TYPE_FIELD_PROTECTED(thistype, index)))
 #define TYPE_CPLUS_DYNAMIC(thistype) TYPE_CPLUS_SPECIFIC (thistype)->is_dynamic
+#define TYPE_CPLUS_REALLY_JAVA(thistype) TYPE_CPLUS_SPECIFIC (thistype)->is_java
 
 #define BASETYPE_VIA_VIRTUAL(thistype, index) \
   (TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits == NULL ? 0 \
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
index 25a437b..6c6f92c 100644
--- a/gdb/gnu-v3-abi.c
+++ b/gdb/gnu-v3-abi.c
@@ -287,6 +287,10 @@ gnuv3_rtti_type (struct value *value,
   if (TYPE_CODE (values_type) != TYPE_CODE_CLASS)
     return NULL;
 
+  /* Java doesn't have RTTI following the C++ ABI.  */
+  if (TYPE_CPLUS_REALLY_JAVA (values_type))
+    return NULL;
+
   /* Determine architecture.  */
   gdbarch = get_type_arch (values_type);
 
diff --git a/gdb/testsuite/gdb.java/jprint.exp b/gdb/testsuite/gdb.java/jprint.exp
index 682715a..81d8ad1 100644
--- a/gdb/testsuite/gdb.java/jprint.exp
+++ b/gdb/testsuite/gdb.java/jprint.exp
@@ -70,4 +70,6 @@ if [set_lang_java] then {
     # so GDB will report these as "optimized out". See gcc/43260.
     setup_xfail *-*-* gcc/43260
     gdb_test "print *jprint.props" " = .*" "print a java.util.Properties"
+
+    gdb_test "print jprint.hi" "= java.lang.String \"hi maude\"" "print a java.lang.String"
 }
diff --git a/gdb/testsuite/gdb.java/jprint.java b/gdb/testsuite/gdb.java/jprint.java
index 01ebdbc..b4385ab 100644
--- a/gdb/testsuite/gdb.java/jprint.java
+++ b/gdb/testsuite/gdb.java/jprint.java
@@ -1,6 +1,6 @@
 // jprint.java test program.
 //
-// Copyright 2004, 2010
+// Copyright 2004, 2010, 2011
 // Free Software Foundation, Inc.
 //
 // Written by Jeff Johnston <jjohnstn@redhat.com> 
@@ -42,6 +42,7 @@ class jvclass {
     
 public class jprint extends jvclass {
   public static Properties props = new Properties ();
+  public static String hi = "hi maude";
 
   public int dothat (int x) {
     int y = x + 3;



More information about the Gdb-patches mailing list