From 6bb0a66a9932e8f03e43edb007cb407ac45dbcbd Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 25 May 2010 18:19:11 +0200 Subject: [PATCH] re PR debug/43260 (Java static class members lack DWARF location info) PR debug/43260 * java-tree.h (pending_static_fields): New extern declaration. (java_write_globals): New prototype. * lang.c (LANG_HOOKS_WRITE_GLOBALS): Define. * decl.c (java_mark_class_local): When clearing DECL_EXTERNAL of a static field push it into pending_static_fields vector. * class.c (pending_static_fields): New variable. (add_field): If static field is not DECL_EXTERNAL, push it into pending_static_fields vector. (java_write_globals): New function. From-SVN: r159828 --- gcc/java/ChangeLog | 13 +++++++++++++ gcc/java/class.c | 21 ++++++++++++++++++++- gcc/java/decl.c | 6 +++++- gcc/java/java-tree.h | 6 +++++- gcc/java/lang.c | 4 +++- 5 files changed, 46 insertions(+), 4 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index b0382bb8731..ce1a98b192e 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,16 @@ +2010-05-25 Jakub Jelinek + + PR debug/43260 + * java-tree.h (pending_static_fields): New extern declaration. + (java_write_globals): New prototype. + * lang.c (LANG_HOOKS_WRITE_GLOBALS): Define. + * decl.c (java_mark_class_local): When clearing DECL_EXTERNAL + of a static field push it into pending_static_fields vector. + * class.c (pending_static_fields): New variable. + (add_field): If static field is not DECL_EXTERNAL, push it into + pending_static_fields vector. + (java_write_globals): New function. + 2010-05-24 Nathan Froyd * expr.c (quick_stack): Change type to a VEC. Update comment. diff --git a/gcc/java/class.c b/gcc/java/class.c index 83759a56bec..919d698de0f 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -1,6 +1,6 @@ /* Functions related to building classes and their related objects. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -109,6 +109,10 @@ static GTY(()) VEC(tree,gc) *registered_class; currently being compiled. */ static GTY(()) tree this_classdollar; +/* A list of static class fields. This is to emit proper debug + info for them. */ +VEC(tree,gc) *pending_static_fields; + /* Return the node that most closely represents the class whose name is IDENT. Start the search from NODE (followed by its siblings). Return NULL if an appropriate node does not exist. */ @@ -873,6 +877,8 @@ add_field (tree klass, tree name, tree field_type, int flags) /* Considered external unless we are compiling it into this object file. */ DECL_EXTERNAL (field) = (is_compiled_class (klass) != 2); + if (!DECL_EXTERNAL (field)) + VEC_safe_push (tree, gc, pending_static_fields, field); } return field; @@ -3224,4 +3230,17 @@ in_same_package (tree name1, tree name2) return (pkg1 == pkg2); } +/* lang_hooks.decls.final_write_globals: perform final processing on + global variables. */ + +void +java_write_globals (void) +{ + tree *vec = VEC_address (tree, pending_static_fields); + int len = VEC_length (tree, pending_static_fields); + write_global_declarations (); + emit_debug_global_declarations (vec, len); + VEC_free (tree, gc, pending_static_fields); +} + #include "gt-java-class.h" diff --git a/gcc/java/decl.c b/gcc/java/decl.c index 9cb3c75076e..f78d68359eb 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -2000,7 +2000,11 @@ java_mark_class_local (tree klass) for (t = TYPE_FIELDS (klass); t ; t = TREE_CHAIN (t)) if (FIELD_STATIC (t)) - java_mark_decl_local (t); + { + if (DECL_EXTERNAL (t)) + VEC_safe_push (tree, gc, pending_static_fields, t); + java_mark_decl_local (t); + } for (t = TYPE_METHODS (klass); t ; t = TREE_CHAIN (t)) if (!METHOD_ABSTRACT (t)) diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index fad667d5f49..dc16eb2bc10 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -1,7 +1,7 @@ /* Definitions for parsing and type checking for the GNU compiler for the Java(TM) language. Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -1231,6 +1231,10 @@ extern void rewrite_reflection_indexes (void *); int cxx_keyword_p (const char *name, int length); +extern GTY(()) VEC(tree,gc) *pending_static_fields; + +extern void java_write_globals (void); + #define DECL_FINAL(DECL) DECL_LANG_FLAG_3 (DECL) /* Access flags etc for a method (a FUNCTION_DECL): */ diff --git a/gcc/java/lang.c b/gcc/java/lang.c index a85f68a3316..c55b5e0510f 100644 --- a/gcc/java/lang.c +++ b/gcc/java/lang.c @@ -1,6 +1,6 @@ /* Java(TM) language-specific utility routines. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -136,6 +136,8 @@ struct GTY(()) language_function { #define LANG_HOOKS_DECL_PRINTABLE_NAME lang_printable_name #undef LANG_HOOKS_PRINT_ERROR_FUNCTION #define LANG_HOOKS_PRINT_ERROR_FUNCTION java_print_error_function +#undef LANG_HOOKS_WRITE_GLOBALS +#define LANG_HOOKS_WRITE_GLOBALS java_write_globals #undef LANG_HOOKS_TYPE_FOR_MODE #define LANG_HOOKS_TYPE_FOR_MODE java_type_for_mode -- 2.30.2