* defs.h (enum language): Add language_java.

* java-exp.y, java-lang.c, java-lang.h, java-valprint.c:  New files.
	* Makefile.in:  Upadte for new files.
	* objfiles.c (allocate_objfile):  Allow NULL bfd argument.
	* symfile.c (deduce_language_from_filename):  Recognize .java.
This commit is contained in:
Per Bothner 1997-04-18 02:22:18 +00:00
parent 6e236775b5
commit 7a9eb4c45a
8 changed files with 2174 additions and 34 deletions

View file

@ -1,3 +1,11 @@
Thu Apr 17 14:30:04 1997 Per Bothner <bothner@deneb.cygnus.com>
* defs.h (enum language): Add language_java.
* java-exp.y, java-lang.c, java-lang.h, java-valprint.c: New files.
* Makefile.in: Upadte for new files.
* objfiles.c (allocate_objfile): Allow NULL bfd argument.
* symfile.c (deduce_language_from_filename): Recognize .java.
Thu Apr 17 02:20:23 1997 Doug Evans <dje@canuck.cygnus.com> Thu Apr 17 02:20:23 1997 Doug Evans <dje@canuck.cygnus.com>
* m32r-stub.c (stash_registers): Rewrite. * m32r-stub.c (stash_registers): Rewrite.

View file

@ -1,4 +1,4 @@
# Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 # Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
# Free Software Foundation, Inc. # Free Software Foundation, Inc.
# This file is part of GDB. # This file is part of GDB.
@ -357,6 +357,7 @@ SFILES = bcache.c blockframe.c breakpoint.c buildsym.c c-exp.y \
elfread.c environ.c eval.c expprint.c \ elfread.c environ.c eval.c expprint.c \
f-exp.y f-lang.c f-typeprint.c f-valprint.c findvar.c \ f-exp.y f-lang.c f-typeprint.c f-valprint.c findvar.c \
gdbtypes.c infcmd.c inflow.c infrun.c language.c \ gdbtypes.c infcmd.c inflow.c infrun.c language.c \
java-exp.y java-lang.c java-valprint.c \
m2-exp.y m2-lang.c m2-typeprint.c m2-valprint.c main.c maint.c \ m2-exp.y m2-lang.c m2-typeprint.c m2-valprint.c main.c maint.c \
mem-break.c minsyms.c mipsread.c nlmread.c objfiles.c parse.c \ mem-break.c minsyms.c mipsread.c nlmread.c objfiles.c parse.c \
printcmd.c remote.c remote-nrom.c scm-exp.c scm-lang.c scm-valprint.c \ printcmd.c remote.c remote-nrom.c scm-exp.c scm-lang.c scm-valprint.c \
@ -383,6 +384,7 @@ remote-sim_h = $(INCLUDE_DIR)/remote-sim.h
dcache_h = dcache.h dcache_h = dcache.h
remote_utils_h = $(dcache_h) serial.h target.h remote-utils.h $(remote-sim_h) remote_utils_h = $(dcache_h) serial.h target.h remote-utils.h $(remote-sim_h)
readline_headers = \ readline_headers = \
$(READLINE_SRC)/chardefs.h \ $(READLINE_SRC)/chardefs.h \
$(READLINE_SRC)/history.h \ $(READLINE_SRC)/history.h \
@ -425,7 +427,7 @@ HFILES_NO_SRCDIR = bcache.h buildsym.h call-cmds.h coff-solib.h defs.h \
gdb-stabs.h $(inferior_h) language.h minimon.h monitor.h \ gdb-stabs.h $(inferior_h) language.h minimon.h monitor.h \
objfiles.h parser-defs.h partial-stab.h serial.h signals.h solib.h \ objfiles.h parser-defs.h partial-stab.h serial.h signals.h solib.h \
symfile.h stabsread.h target.h terminal.h typeprint.h xcoffsolib.h \ symfile.h stabsread.h target.h terminal.h typeprint.h xcoffsolib.h \
c-lang.h ch-lang.h f-lang.h m2-lang.h \ c-lang.h ch-lang.h f-lang.h java-lang.h m2-lang.h \
complaints.h valprint.h \ complaints.h valprint.h \
29k-share/udi/udiids.h 29k-share/udi_soc nindy-share/b.out.h \ 29k-share/udi/udiids.h 29k-share/udi_soc nindy-share/b.out.h \
nindy-share/block_io.h nindy-share/coff.h \ nindy-share/block_io.h nindy-share/coff.h \
@ -471,7 +473,8 @@ COMMON_OBS = version.o blockframe.o breakpoint.o findvar.o stack.o thread.o \
exec.o bcache.o objfiles.o minsyms.o maint.o demangle.o \ exec.o bcache.o objfiles.o minsyms.o maint.o demangle.o \
dbxread.o coffread.o elfread.o \ dbxread.o coffread.o elfread.o \
dwarfread.o dwarf2read.o mipsread.o stabsread.o corefile.o \ dwarfread.o dwarf2read.o mipsread.o stabsread.o corefile.o \
c-lang.o ch-exp.o ch-lang.o f-lang.o m2-lang.o \ c-lang.o ch-exp.o ch-lang.o f-lang.o \
java-lang.o java-valprint.o m2-lang.o \
scm-exp.o scm-lang.o scm-valprint.o complaints.o typeprint.o \ scm-exp.o scm-lang.o scm-valprint.o complaints.o typeprint.o \
c-typeprint.o ch-typeprint.o f-typeprint.o m2-typeprint.o \ c-typeprint.o ch-typeprint.o f-typeprint.o m2-typeprint.o \
c-valprint.o cp-valprint.o ch-valprint.o f-valprint.o m2-valprint.o \ c-valprint.o cp-valprint.o ch-valprint.o f-valprint.o m2-valprint.o \
@ -490,8 +493,8 @@ NTSSTART = kdb-start.o
SUBDIRS = doc testsuite nlm SUBDIRS = doc testsuite nlm
# For now, shortcut the "configure GDB for fewer languages" stuff. # For now, shortcut the "configure GDB for fewer languages" stuff.
YYFILES = c-exp.tab.c f-exp.tab.c m2-exp.tab.c YYFILES = c-exp.tab.c java-exp.tab.c f-exp.tab.c m2-exp.tab.c
YYOBJ = c-exp.tab.o f-exp.tab.o m2-exp.tab.o YYOBJ = c-exp.tab.o java-exp.tab.o f-exp.tab.o m2-exp.tab.o
# Things which need to be built when making a distribution. # Things which need to be built when making a distribution.
@ -543,7 +546,14 @@ install-only:
$(INSTALL_DATA) $(srcdir)/gdb.1 $(man1dir)/$$transformed_name.1 $(INSTALL_DATA) $(srcdir)/gdb.1 $(man1dir)/$$transformed_name.1
# start-sanitize-gdbtk # start-sanitize-gdbtk
if [ x"$(ENABLE_GDBTK)" != x ] ; then \ if [ x"$(ENABLE_GDBTK)" != x ] ; then \
$(INSTALL_DATA) $(srcdir)/gdbtk.tcl $(datadir)/gdbtk.tcl ; \ echo "Making directory gdbtcl"; \
mkdir $(datadir)/gdbtcl; \
chmod 755 $(datadir)/gdbtcl; \
cd $(srcdir)/gdbtcl ; \
for i in * ; \
do \
$(INSTALL_DATA) $$i $(datadir)/gdbtcl/$$i ; \
done ; \
else \ else \
true ; \ true ; \
fi fi
@ -559,11 +569,6 @@ uninstall: force
true ; \ true ; \
fi ; \ fi ; \
rm -f $(bindir)/$$transformed_name $(man1dir)/$$transformed_name.1 rm -f $(bindir)/$$transformed_name $(man1dir)/$$transformed_name.1
# start-sanitize-gdbtk
if [ x"$(ENABLE_GDBTK)" != x ] ; then \
rm -f $(datadir)/gdbtk.tcl ; \
fi
# end-sanitize-gdbtk
@$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do @$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do
# We do this by grepping through sources. If that turns out to be too slow, # We do this by grepping through sources. If that turns out to be too slow,
@ -635,10 +640,10 @@ libgdb-files: $(LIBGDBDEPS) Makefile.in
saber_gdb: $(SFILES) $(DEPFILES) copying.c version.c saber_gdb: $(SFILES) $(DEPFILES) copying.c version.c
#setopt load_flags $(CFLAGS) $(BFD_CFLAGS) -DHOST_SYS=SUN4_SYS #setopt load_flags $(CFLAGS) $(BFD_CFLAGS) -DHOST_SYS=SUN4_SYS
#load ./init.c $(SFILES) #load ./init.c $(SFILES)
#unload $(srcdir)/c-exp.y $(srcdir)/m2-exp.y #unload $(srcdir)/c-exp.y $(srcdir)/java-exp.y $(srcdir)/m2-exp.y
#unload vx-share/*.h #unload vx-share/*.h
#unload nindy-share/[A-Z]* #unload nindy-share/[A-Z]*
#load c-exp.tab.c m2-exp.tab.c #load c-exp.tab.c java-exp.tab.c m2-exp.tab.c
#load copying.c version.c #load copying.c version.c
#load ../opcodes/libopcodes.a #load ../opcodes/libopcodes.a
#load ../libiberty/libiberty.a #load ../libiberty/libiberty.a
@ -733,7 +738,7 @@ clean mostlyclean:
# functionality described is if the distributed files are unmodified. # functionality described is if the distributed files are unmodified.
distclean: clean distclean: clean
@$(MAKE) $(FLAGS_TO_PASS) DO=distclean "DODIRS=$(SUBDIRS)" subdir_do @$(MAKE) $(FLAGS_TO_PASS) DO=distclean "DODIRS=$(SUBDIRS)" subdir_do
rm -f nm.h tm.h xm.h config.status config.h stamp-h rm -f nm.h tm.h xm.h config.status config.h stamp-h .gdbinit
rm -f y.output yacc.acts yacc.tmp y.tab.h rm -f y.output yacc.acts yacc.tmp y.tab.h
rm -f config.log config.cache rm -f config.log config.cache
rm -f Makefile rm -f Makefile
@ -742,7 +747,7 @@ maintainer-clean realclean: clean
@echo "This command is intended for maintainers to use;" @echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild." @echo "it deletes files that may require special tools to rebuild."
@$(MAKE) $(FLAGS_TO_PASS) DO=maintainer-clean "DODIRS=$(SUBDIRS)" subdir_do @$(MAKE) $(FLAGS_TO_PASS) DO=maintainer-clean "DODIRS=$(SUBDIRS)" subdir_do
rm -f c-exp.tab.c f-exp.tab.c m2-exp.tab.c rm -f c-exp.tab.c java-exp.tab.c f-exp.tab.c m2-exp.tab.c
rm -f TAGS $(INFOFILES) rm -f TAGS $(INFOFILES)
rm -f nm.h tm.h xm.h config.status rm -f nm.h tm.h xm.h config.status
rm -f y.output yacc.acts yacc.tmp rm -f y.output yacc.acts yacc.tmp
@ -821,6 +826,19 @@ c-exp.tab.c: c-exp.y
-rm y.tab.c -rm y.tab.c
mv c-exp.new ./c-exp.tab.c mv c-exp.new ./c-exp.tab.c
java-exp.tab.o: java-exp.tab.c
java-exp.tab.c: java-exp.y
$(YACC) $(YFLAGS) $(srcdir)/java-exp.y
-sed -e '/extern.*malloc/d' \
-e '/extern.*realloc/d' \
-e '/extern.*free/d' \
-e '/include.*malloc.h/d' \
-e 's/malloc/xmalloc/g' \
-e 's/realloc/xrealloc/g' \
< y.tab.c > java-exp.new
-rm y.tab.c
mv java-exp.new ./java-exp.tab.c
f-exp.tab.o: f-exp.tab.c f-exp.tab.o: f-exp.tab.c
f-exp.tab.c: f-exp.y c-exp.tab.c f-exp.tab.c: f-exp.y c-exp.tab.c
$(YACC) $(YFLAGS) $(srcdir)/f-exp.y $(YACC) $(YFLAGS) $(srcdir)/f-exp.y
@ -852,7 +870,7 @@ m2-exp.tab.c: m2-exp.y
mv m2-exp.new ./m2-exp.tab.c mv m2-exp.new ./m2-exp.tab.c
# These files are updated atomically, so make never has to remove them # These files are updated atomically, so make never has to remove them
.PRECIOUS: m2-exp.tab.c f-exp.tab.c c-exp.tab.c .PRECIOUS: m2-exp.tab.c java-exp.tab.c f-exp.tab.c c-exp.tab.c
lint: $(LINTFILES) lint: $(LINTFILES)
$(LINT) $(INCLUDE_CFLAGS) $(LINTFLAGS) $(LINTFILES) \ $(LINT) $(INCLUDE_CFLAGS) $(LINTFLAGS) $(LINTFILES) \
@ -1140,7 +1158,7 @@ fork-child.o: fork-child.c $(wait_h) $(defs_h) $(gdbcore_h) \
gdbtk.o: gdbtk.c $(defs_h) $(symtab_h) $(inferior_h) $(command_h) \ gdbtk.o: gdbtk.c $(defs_h) $(symtab_h) $(inferior_h) $(command_h) \
$(bfd_h) symfile.h objfiles.h target.h gdb_string.h $(bfd_h) symfile.h objfiles.h target.h gdb_string.h
$(CC) -c $(INTERNAL_CFLAGS) $(TCL_CFLAGS) $(TK_CFLAGS) $(X11_CFLAGS) \ $(CC) -c $(INTERNAL_CFLAGS) $(TCL_CFLAGS) $(TK_CFLAGS) $(X11_CFLAGS) \
$(srcdir)/gdbtk.c -DGDBTK_FILENAME=\"$(datadir)/gdbtk.tcl\" $(srcdir)/gdbtk.c -DGDBTK_LIBRARY=\"$(datadir)/gdbtcl\"
# end-sanitize-gdbtk # end-sanitize-gdbtk
gdbtypes.o: gdbtypes.c $(bfd_h) complaints.h $(defs_h) $(expression_h) \ gdbtypes.o: gdbtypes.c $(bfd_h) complaints.h $(defs_h) $(expression_h) \
@ -1506,6 +1524,10 @@ symtab.o: symtab.c call-cmds.h $(defs_h) $(expression_h) $(frame_h) \
tahoe-tdep.o: tahoe-tdep.c $(OP_INCLUDE)/tahoe.h $(defs_h) \ tahoe-tdep.o: tahoe-tdep.c $(OP_INCLUDE)/tahoe.h $(defs_h) \
$(symtab_h) $(symtab_h)
#start-sanitize-tic80
tic80-tdep.o: tic80-tdep.c $(defs_h)
#end-sanitize-tic80
target.o: target.c $(bfd_h) $(defs_h) $(gdbcmd_h) $(inferior_h) \ target.o: target.c $(bfd_h) $(defs_h) $(gdbcmd_h) $(inferior_h) \
objfiles.h symfile.h target.h gdb_string.h objfiles.h symfile.h target.h gdb_string.h
@ -1576,6 +1598,10 @@ c-exp.tab.o: c-exp.tab.c c-lang.h $(defs_h) $(expression_h) \
$(gdbtypes_h) language.h parser-defs.h $(symtab_h) $(value_h) \ $(gdbtypes_h) language.h parser-defs.h $(symtab_h) $(value_h) \
$(bfd_h) objfiles.h symfile.h $(bfd_h) objfiles.h symfile.h
java-exp.tab.o: java-exp.tab.c java-lang.h $(defs_h) $(expression_h) \
$(gdbtypes_h) language.h parser-defs.h $(symtab_h) $(value_h) \
$(bfd_h) objfiles.h symfile.h
f-exp.tab.o: f-exp.tab.c f-lang.h $(defs_h) $(expression_h) \ f-exp.tab.o: f-exp.tab.c f-lang.h $(defs_h) $(expression_h) \
language.h parser-defs.h $(value_h) $(bfd_h) objfiles.h symfile.h language.h parser-defs.h $(value_h) $(bfd_h) objfiles.h symfile.h

View file

@ -134,6 +134,7 @@ enum language
language_auto, /* Placeholder for automatic setting */ language_auto, /* Placeholder for automatic setting */
language_c, /* C */ language_c, /* C */
language_cplus, /* C++ */ language_cplus, /* C++ */
language_java, /* Java */
language_chill, /* Chill */ language_chill, /* Chill */
language_fortran, /* Fortran */ language_fortran, /* Fortran */
language_m2, /* Modula-2 */ language_m2, /* Modula-2 */
@ -231,11 +232,11 @@ extern void request_quit PARAMS ((int));
extern void do_cleanups PARAMS ((struct cleanup *)); extern void do_cleanups PARAMS ((struct cleanup *));
extern void do_final_cleanups PARAMS ((struct cleanup *)); extern void do_final_cleanups PARAMS ((struct cleanup *));
extern void do_my_cleanups PARAMS ((struct cleanup *, struct cleanup *)); extern void do_my_cleanups PARAMS ((struct cleanup **, struct cleanup *));
extern void discard_cleanups PARAMS ((struct cleanup *)); extern void discard_cleanups PARAMS ((struct cleanup *));
extern void discard_final_cleanups PARAMS ((struct cleanup *)); extern void discard_final_cleanups PARAMS ((struct cleanup *));
extern void discard_my_cleanups PARAMS ((struct cleanup *, struct cleanup *)); extern void discard_my_cleanups PARAMS ((struct cleanup **, struct cleanup *));
/* The bare make_cleanup function is one of those rare beasts that /* The bare make_cleanup function is one of those rare beasts that
takes almost any type of function as the first arg and anything that takes almost any type of function as the first arg and anything that
@ -254,15 +255,15 @@ extern struct cleanup *make_cleanup ();
extern struct cleanup * extern struct cleanup *
make_final_cleanup PARAMS ((void (*function) (void *), void *)); make_final_cleanup PARAMS ((void (*function) (void *), void *));
extern struct cleanup * extern struct cleanup *
make_my_cleanup PARAMS ((struct cleanup *, void (*function) (void *), void *)); make_my_cleanup PARAMS ((struct cleanup **, void (*function) (void *), void *));
extern struct cleanup *save_cleanups PARAMS ((void)); extern struct cleanup *save_cleanups PARAMS ((void));
extern struct cleanup *save_final_cleanups PARAMS ((void)); extern struct cleanup *save_final_cleanups PARAMS ((void));
extern struct cleanup *save_my_cleanups PARAMS ((struct cleanup *)); extern struct cleanup *save_my_cleanups PARAMS ((struct cleanup **));
extern void restore_cleanups PARAMS ((struct cleanup *)); extern void restore_cleanups PARAMS ((struct cleanup *));
extern void restore_final_cleanups PARAMS ((struct cleanup *)); extern void restore_final_cleanups PARAMS ((struct cleanup *));
extern void restore_my_cleanups PARAMS ((struct cleanup *, struct cleanup *)); extern void restore_my_cleanups PARAMS ((struct cleanup **, struct cleanup *));
extern void free_current_contents PARAMS ((char **)); extern void free_current_contents PARAMS ((char **));
@ -549,6 +550,8 @@ enum val_prettyprint
#define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF for 32-bits */ #define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF for 32-bits */
#endif #endif
#ifndef LONGEST
#ifdef BFD64 #ifdef BFD64
/* This is to make sure that LONGEST is at least as big as CORE_ADDR. */ /* This is to make sure that LONGEST is at least as big as CORE_ADDR. */
@ -558,18 +561,25 @@ enum val_prettyprint
#else /* No BFD64 */ #else /* No BFD64 */
#ifndef LONGEST
# ifdef CC_HAS_LONG_LONG # ifdef CC_HAS_LONG_LONG
# define LONGEST long long # define LONGEST long long
# define ULONGEST unsigned long long # define ULONGEST unsigned long long
# else # else
# define LONGEST long /* BFD_HOST_64_BIT is defined for some hosts that don't have long long
# define ULONGEST unsigned long (e.g. i386-windows) so try it. */
# ifdef BFD_HOST_64_BIT
# define LONGEST BFD_HOST_64_BIT
# define ULONGEST BFD_HOST_U_64_BIT
# else
# define LONGEST long
# define ULONGEST unsigned long
# endif
# endif # endif
#endif
#endif /* No BFD64 */ #endif /* No BFD64 */
#endif /* ! LONGEST */
/* Convert a LONGEST to an int. This is used in contexts (e.g. number of /* Convert a LONGEST to an int. This is used in contexts (e.g. number of
arguments to a function, number in a value history, register number, etc.) arguments to a function, number in a value history, register number, etc.)
where the value must not be larger than can fit in an int. */ where the value must not be larger than can fit in an int. */

1228
gdb/java-exp.y Normal file

File diff suppressed because it is too large Load diff

727
gdb/java-lang.c Normal file
View file

@ -0,0 +1,727 @@
/* Java language support routines for GDB, the GNU debugger.
Copyright 1997 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 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. */
#include "defs.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"
#include "parser-defs.h"
#include "language.h"
#include "gdbtypes.h"
#include "symtab.h"
#include "symfile.h"
#include "objfiles.h"
#include "gdb_string.h"
#include "value.h"
#include "c-lang.h"
#include "java-lang.h"
struct type *java_int_type;
struct type *java_byte_type;
struct type *java_short_type;
struct type *java_long_type;
struct type *java_boolean_type;
struct type *java_char_type;
struct type *java_float_type;
struct type *java_double_type;
struct type *java_void_type;
struct type *java_object_type;
/* This objfile contains symtabs that have been dynamically created
to record dynamically loaded Java classes and dynamically
compiled java methods. */
struct objfile *dynamics_objfile = NULL;
struct objfile *
get_dynamics_objfile ()
{
if (dynamics_objfile == NULL)
{
dynamics_objfile = allocate_objfile (NULL, 0);
}
return dynamics_objfile;
}
#if 1
/* symtab contains classes read from the inferior. */
static struct symtab *class_symtab = NULL;
/* Maximum number of class in class_symtab before relocation is needed. */
static int class_symtab_space;
struct symtab *
get_java_class_symtab ()
{
if (class_symtab == NULL)
{
struct objfile *objfile = get_dynamics_objfile();
struct blockvector *bv;
struct block *bl;
class_symtab = allocate_symtab ("<java-classes>", objfile);
class_symtab->language = language_java;
bv = (struct blockvector *)
obstack_alloc (&objfile->symbol_obstack, sizeof (struct blockvector));
BLOCKVECTOR_NBLOCKS (bv) = 1;
BLOCKVECTOR (class_symtab) = bv;
/* Allocate dummy STATIC_BLOCK. */
bl = (struct block *)
obstack_alloc (&objfile->symbol_obstack, sizeof (struct block));
BLOCK_NSYMS (bl) = 0;
BLOCK_START (bl) = 0;
BLOCK_END (bl) = 0;
BLOCK_FUNCTION (bl) = NULL;
BLOCK_SUPERBLOCK (bl) = NULL;
BLOCK_GCC_COMPILED (bl) = 0;
BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) = bl;
/* Allocate GLOBAL_BLOCK. This has to be relocatable. */
class_symtab_space = 128;
bl = (struct block *)
mmalloc (objfile->md,
sizeof (struct block)
+ ((class_symtab_space - 1) * sizeof (struct symbol *)));
*bl = *BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl;
class_symtab->free_ptr = (char *) bl;
}
return class_symtab;
}
static void
add_class_symtab_symbol (sym)
struct symbol *sym;
{
struct symtab *symtab = get_java_class_symtab ();
struct blockvector *bv = BLOCKVECTOR (symtab);
struct block *bl = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
if (BLOCK_NSYMS (bl) >= class_symtab_space)
{
/* Need to re-allocate. */
class_symtab_space *= 2;
bl = (struct block *)
mrealloc (symtab->objfile->md, bl,
sizeof (struct block)
+ ((class_symtab_space - 1) * sizeof (struct symbol *)));
class_symtab->free_ptr = (char *) bl;
BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl;
}
BLOCK_SYM (bl, BLOCK_NSYMS (bl)) = sym;
BLOCK_NSYMS (bl) = BLOCK_NSYMS (bl) + 1;
}
struct symbol *
add_class_symbol (type, addr)
struct type *type;
CORE_ADDR addr;
{
struct symbol *sym;
sym = (struct symbol *)
obstack_alloc (&dynamics_objfile->symbol_obstack, sizeof (struct symbol));
memset (sym, 0, sizeof (struct symbol));
SYMBOL_LANGUAGE (sym) = language_java;
SYMBOL_NAME (sym) = TYPE_NAME (type);
SYMBOL_CLASS (sym) = LOC_TYPEDEF;
/* SYMBOL_VALUE (sym) = valu;*/
SYMBOL_TYPE (sym) = type;
SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
SYMBOL_VALUE_ADDRESS (sym) = addr;
return sym;
}
#endif
struct type *
java_lookup_class (name)
char *name;
{
struct symbol *sym;
sym = lookup_symbol (name, expression_context_block, STRUCT_NAMESPACE,
(int *) 0, (struct symtab **) NULL);
if (sym == NULL)
{
/* FIXME - should search inferior's symbol table. */
return NULL;
}
return SYMBOL_TYPE (sym);
}
/* Return a nul-terminated string (allocated on OBSTACK) for
a name given by NAME (which has type Utf8Const*). */
char *
get_java_utf8_name (obstack, name)
struct obstack *obstack;
value_ptr name;
{
char *chrs;
value_ptr temp = name;
int name_length = (int) value_as_long
(value_struct_elt (&temp, NULL, "length", NULL, "structure"));
temp = name;
temp = value_struct_elt (&temp, NULL, "data", NULL, "structure");
chrs = obstack_alloc (obstack, name_length+1);
chrs [name_length] = '\0';
read_memory_section (VALUE_ADDRESS (temp) + VALUE_OFFSET (temp),
chrs, name_length, NULL);
return chrs;
}
value_ptr
java_class_from_object (obj_val)
value_ptr obj_val;
{
value_ptr dtable_val = value_struct_elt (&obj_val, NULL, "dtable", NULL, "structure");
return value_struct_elt (&dtable_val, NULL, "class", NULL, "structure");
}
/* Check if CLASS_IS_PRIMITIVE(value of clas): */
int
java_class_is_primitive (clas)
value_ptr clas;
{
value_ptr dtable = value_struct_elt (&clas, NULL, "dtable", NULL, "struct");
CORE_ADDR i = value_as_pointer (dtable);
return (int) (i & 0x7fffffff) == (int) 0x7fffffff;
}
/* Read a Kaffe Class object, and generated a gdb (TYPE_CODE_STRUCT) type. */
struct type *
type_from_class (clas)
value_ptr clas;
{
struct type *type;
struct type *tsuper;
int ninterfaces, nfields;
char *name;
value_ptr temp;
struct objfile *objfile = get_dynamics_objfile();
value_ptr utf8_name, fields, field, method, methods;
int name_length;
char *nptr;
CORE_ADDR addr;
struct block *bl;
int i, j;
int type_is_object = 0;
int is_array = 0;
int nmethods;
struct fn_field *fn_fields;
struct fn_fieldlist *fn_fieldlists;
char *unqualified_name;
type = check_typedef (VALUE_TYPE (clas));
if (TYPE_CODE (type) == TYPE_CODE_PTR)
{
if (value_logical_not (clas))
return NULL;
clas = value_ind (clas);
}
addr = VALUE_ADDRESS (clas) + VALUE_OFFSET (clas);
get_java_class_symtab ();
bl = BLOCKVECTOR_BLOCK (BLOCKVECTOR (class_symtab), GLOBAL_BLOCK);
for (i = BLOCK_NSYMS (bl); --i >= 0; )
{
struct symbol *sym = BLOCK_SYM (bl, i);
if (SYMBOL_VALUE_ADDRESS (sym) == addr)
return SYMBOL_TYPE (sym);
}
if (java_class_is_primitive (clas))
{
value_ptr sig;
temp = clas;
sig = value_struct_elt (&temp, NULL, "msize", NULL, "structure");
return java_primitive_type (value_as_long (sig));
}
/* Get Class name. */
/* if clasloader non-null, prepend loader address. FIXME */
temp = clas;
utf8_name = value_struct_elt (&temp, NULL, "name", NULL, "structure");
name = get_java_utf8_name (&objfile->type_obstack, utf8_name);
type = alloc_type (objfile);
TYPE_CODE (type) = TYPE_CODE_STRUCT;
INIT_CPLUS_SPECIFIC (type);
if (name[0] == '[')
{
is_array = 1;
temp = clas;
/* Set array element type. */
temp = value_struct_elt (&temp, NULL, "methods", NULL, "structure");
VALUE_TYPE (temp) = lookup_pointer_type (VALUE_TYPE (clas));
TYPE_TARGET_TYPE (type) = type_from_class (temp);
}
unqualified_name = name;
for (nptr = name; *nptr != 0; nptr++)
{
if (*nptr == '/')
{
*nptr = '.';
unqualified_name = nptr+1;
}
}
ALLOCATE_CPLUS_STRUCT_TYPE (type);
TYPE_NAME (type) = name;
add_class_symtab_symbol (add_class_symbol (type, addr));
temp = clas;
temp = value_struct_elt (&temp, NULL, "superclass", NULL, "structure");
if (name != NULL && strcmp (name, "java.lang.Object") == 0)
{
tsuper = get_java_object_type ();
if (tsuper && TYPE_CODE (tsuper) == TYPE_CODE_PTR)
tsuper = TYPE_TARGET_TYPE (tsuper);
type_is_object = 1;
}
else
tsuper = type_from_class (temp);
#if 1
ninterfaces = 0;
#else
temp = clas;
ninterfaces = value_as_long (value_struct_elt (&temp, NULL, "interface_len", NULL, "structure"));
#endif
TYPE_N_BASECLASSES (type) = (tsuper == NULL ? 0 : 1) + ninterfaces;
temp = clas;
nfields = value_as_long (value_struct_elt (&temp, NULL, "nfields", NULL, "structure"));
nfields += TYPE_N_BASECLASSES (type);
TYPE_NFIELDS (type) = nfields;
TYPE_FIELDS (type) = (struct field *)
TYPE_ALLOC (type, sizeof (struct field) * nfields);
memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields);
TYPE_FIELD_PRIVATE_BITS (type) =
(B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
B_CLRALL (TYPE_FIELD_PRIVATE_BITS (type), nfields);
TYPE_FIELD_PROTECTED_BITS (type) =
(B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
B_CLRALL (TYPE_FIELD_PROTECTED_BITS (type), nfields);
TYPE_FIELD_IGNORE_BITS (type) =
(B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
B_CLRALL (TYPE_FIELD_IGNORE_BITS (type), nfields);
TYPE_FIELD_VIRTUAL_BITS (type) = (B_TYPE *)
TYPE_ALLOC (type, B_BYTES (TYPE_N_BASECLASSES (type)));
B_CLRALL (TYPE_FIELD_VIRTUAL_BITS (type), TYPE_N_BASECLASSES (type));
if (tsuper != NULL)
{
TYPE_BASECLASS (type, 0) = tsuper;
if (type_is_object)
SET_TYPE_FIELD_PRIVATE (type, 0);
}
temp = clas;
temp = value_struct_elt (&temp, NULL, "bfsize", NULL, "structure");
TYPE_LENGTH (type) = JAVA_OBJECT_SIZE + value_as_long (temp);
fields = NULL;
for (i = TYPE_N_BASECLASSES (type); i < nfields; i++)
{
int accflags;
int boffset;
struct type *ftype;
if (fields == NULL)
{
temp = clas;
fields = value_struct_elt (&temp, NULL, "fields", NULL, "structure");
field = value_ind (fields);
}
else
{ /* Re-use field value for next field. */
VALUE_ADDRESS (field) += TYPE_LENGTH (VALUE_TYPE (field));
VALUE_LAZY (field) = 1;
}
temp = field;
temp = value_struct_elt (&temp, NULL, "name", NULL, "structure");
TYPE_FIELD_NAME (type, i) =
get_java_utf8_name (&objfile->type_obstack, temp);
temp = field;
accflags = value_as_long (value_struct_elt (&temp, NULL, "accflags",
NULL, "structure"));
boffset = value_as_long (value_struct_elt (&temp, NULL, "boffset",
NULL, "structure"));
if (accflags & 0x0001) /* public access */
{
/* ??? */
}
if (accflags & 0x0002) /* private access */
{
SET_TYPE_FIELD_PRIVATE (type, i);
}
if (accflags & 0x0004) /* protected access */
{
SET_TYPE_FIELD_PROTECTED (type, i);
}
if (accflags & 0x0008) /* ACC_STATIC */
{
TYPE_FIELD_BITPOS (type, i) = -1;
/* Hack for TYPE_FIELD_STATIC_PHYSNAME to prevent a crash. FIXME. */
type->fields[i].bitsize = (long) "???";
}
else
TYPE_FIELD_BITPOS (type, i) = 8 * (JAVA_OBJECT_SIZE + boffset);
if (accflags & 0x8000) /* FIELD_UNRESOLVED_FLAG */
{
TYPE_FIELD_TYPE (type, i) = get_java_object_type (); /* FIXME */
}
else
{
struct type *ftype;
temp = field;
temp = value_struct_elt (&temp, NULL, "type", NULL, "structure");
ftype = type_from_class (temp);
if (TYPE_CODE (ftype) == TYPE_CODE_STRUCT)
ftype = lookup_pointer_type (ftype);
TYPE_FIELD_TYPE (type, i) = ftype;
}
}
temp = clas;
nmethods = value_as_long (value_struct_elt (&temp, NULL, "nmethods",
NULL, "structure"));
TYPE_NFN_FIELDS_TOTAL (type) = nmethods;
j = nmethods * sizeof (struct fn_field);
fn_fields = (struct fn_field*)
obstack_alloc (&dynamics_objfile->symbol_obstack, j);
memset (fn_fields, 0, j);
fn_fieldlists = (struct fn_fieldlist*)
alloca (nmethods * sizeof (struct fn_fieldlist));
methods = NULL;
for (i = 0; i < nmethods; i++)
{
char *mname;
int k;
if (methods == NULL)
{
temp = clas;
methods = value_struct_elt (&temp, NULL, "methods", NULL, "structure");
method = value_ind (methods);
}
else
{ /* Re-use method value for next method. */
VALUE_ADDRESS (method) += TYPE_LENGTH (VALUE_TYPE (method));
VALUE_LAZY (method) = 1;
}
/* Get method name. */
temp = method;
temp = value_struct_elt (&temp, NULL, "name", NULL, "structure");
mname = get_java_utf8_name (&objfile->type_obstack, temp);
if (strcmp (mname, "<init>") == 0)
mname = unqualified_name;
/* Check for an existing method with the same name.
* This makes building the fn_fieldslists an O(nmethods**2)
* operation. That could be using hashing, but I doubt it
* is worth it. Note that we do maintain the order of methods
* in the inferior's Method table (as long as that is grouped
* by method name), which I think is desirable. --PB */
for (k = 0, j = TYPE_NFN_FIELDS (type); ; )
{
if (--j < 0)
{ /* No match - new method name. */
j = TYPE_NFN_FIELDS(type)++;
fn_fieldlists[j].name = mname;
fn_fieldlists[j].length = 1;
fn_fieldlists[j].fn_fields = &fn_fields[i];
k = i;
break;
}
if (strcmp (mname, fn_fieldlists[j].name) == 0)
{ /* Found an existing method with the same name. */
int l;
if (mname != unqualified_name)
obstack_free (&objfile->type_obstack, mname);
mname = fn_fieldlists[j].name;
fn_fieldlists[j].length++;
k = i - k; /* Index of new slot. */
/* Shift intervening fn_fields (between k and i) down. */
for (l = i; l > k; l--) fn_fields[l] = fn_fields[l-1];
for (l = TYPE_NFN_FIELDS (type); --l > j; )
fn_fieldlists[l].fn_fields++;
break;
}
k += fn_fieldlists[j].length;
}
fn_fields[k].physname = "";
fn_fields[k].is_stub = 1;
fn_fields[k].type = make_function_type (java_void_type, NULL); /* FIXME*/
TYPE_CODE (fn_fields[k].type) = TYPE_CODE_METHOD;
}
j = TYPE_NFN_FIELDS(type) * sizeof (struct fn_fieldlist);
TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist*)
obstack_alloc (&dynamics_objfile->symbol_obstack, j);
memcpy (TYPE_FN_FIELDLISTS (type), fn_fieldlists, j);
return type;
}
struct type*
get_java_object_type ()
{
return java_object_type;
}
int
is_object_type (type)
struct type *type;
{
CHECK_TYPEDEF (type);
if (TYPE_CODE (type) == TYPE_CODE_PTR)
{
struct type *ttype = check_typedef (TYPE_TARGET_TYPE (type));
char *name;
if (TYPE_CODE (ttype) != TYPE_CODE_STRUCT)
return 0;
while (TYPE_N_BASECLASSES (ttype) > 0)
ttype = TYPE_BASECLASS (ttype, 0);
name = TYPE_NAME (ttype);
if (name != NULL && strcmp (name, "java.lang.Object") == 0)
return 1;
name = TYPE_NFIELDS (ttype) > 0 ? TYPE_FIELD_NAME (ttype, 0) : (char*)0;
if (name != NULL && strcmp (name, "dtable") == 0)
{
if (java_object_type == NULL)
java_object_type = type;
return 1;
}
}
return 0;
}
struct type*
java_primitive_type (signature)
int signature;
{
switch (signature)
{
case 'B': return java_byte_type;
case 'S': return java_short_type;
case 'I': return java_int_type;
case 'J': return java_long_type;
case 'Z': return java_boolean_type;
case 'C': return java_char_type;
case 'F': return java_float_type;
case 'D': return java_double_type;
case 'V': return java_void_type;
}
error ("unknown signature '%c' for primitive type", (char) signature);
}
/* Return the type of TYPE followed by DIMS pairs of [ ].
If DIMS == 0, TYPE is returned. */
struct type *
java_array_type (type, dims)
struct type *type;
int dims;
{
if (dims == 0)
return type;
error ("array types not implemented");
}
/* Create a Java string in the inferior from a (Utf8) literal. */
value_ptr
java_value_string (ptr, len)
char *ptr;
int len;
{
error ("not implemented - java_value_string"); /* FIXME */
}
static value_ptr
evaluate_subexp_java (expect_type, exp, pos, noside)
struct type *expect_type;
register struct expression *exp;
register int *pos;
enum noside noside;
{
int pc = *pos;
int i;
enum exp_opcode op = exp->elts[*pos].opcode;
value_ptr arg1;
switch (op)
{
case UNOP_IND:
if (noside == EVAL_SKIP)
goto standard;
(*pos)++;
arg1 = evaluate_subexp_standard (expect_type, exp, pos, EVAL_NORMAL);
if (is_object_type (VALUE_TYPE (arg1)))
{
struct type *type = type_from_class (java_class_from_object (arg1));
arg1 = value_cast (lookup_pointer_type (type), arg1);
}
if (noside == EVAL_SKIP)
goto nosideret;
return value_ind (arg1);
case OP_STRING:
(*pos)++;
i = longest_to_int (exp->elts[pc + 1].longconst);
(*pos) += 3 + BYTES_TO_EXP_ELEM (i + 1);
if (noside == EVAL_SKIP)
goto nosideret;
return java_value_string (&exp->elts[pc + 2].string, i);
}
standard:
return evaluate_subexp_standard (expect_type, exp, pos, noside);
nosideret:
return value_from_longest (builtin_type_long, (LONGEST) 1);
}
static struct type *
java_create_fundamental_type (objfile, typeid)
struct objfile *objfile;
int typeid;
{
switch (typeid)
{
case FT_VOID: return java_void_type;
case FT_BOOLEAN: return java_boolean_type;
case FT_CHAR: return java_char_type;
case FT_FLOAT: return java_float_type;
case FT_DBL_PREC_FLOAT: return java_double_type;
case FT_BYTE: case FT_SIGNED_CHAR: return java_byte_type;
case FT_SHORT: case FT_SIGNED_SHORT: return java_short_type;
case FT_INTEGER: case FT_SIGNED_INTEGER: return java_int_type;
case FT_LONG: case FT_SIGNED_LONG: return java_long_type;
}
return c_create_fundamental_type (objfile, typeid);
}
/* Table mapping opcodes into strings for printing operators
and precedences of the operators. */
const struct op_print java_op_print_tab[] =
{
{",", BINOP_COMMA, PREC_COMMA, 0},
{"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
{"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
{"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
{"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
{"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
{"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
{"==", BINOP_EQUAL, PREC_EQUAL, 0},
{"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
{"<=", BINOP_LEQ, PREC_ORDER, 0},
{">=", BINOP_GEQ, PREC_ORDER, 0},
{">", BINOP_GTR, PREC_ORDER, 0},
{"<", BINOP_LESS, PREC_ORDER, 0},
{">>", BINOP_RSH, PREC_SHIFT, 0},
{"<<", BINOP_LSH, PREC_SHIFT, 0},
#if 0
{">>>", BINOP_???, PREC_SHIFT, 0},
#endif
{"+", BINOP_ADD, PREC_ADD, 0},
{"-", BINOP_SUB, PREC_ADD, 0},
{"*", BINOP_MUL, PREC_MUL, 0},
{"/", BINOP_DIV, PREC_MUL, 0},
{"%", BINOP_REM, PREC_MUL, 0},
{"-", UNOP_NEG, PREC_PREFIX, 0},
{"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
{"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
{"*", UNOP_IND, PREC_PREFIX, 0},
#if 0
{"instanceof", ???, ???, 0},
#endif
{"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
{"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
{NULL, 0, 0, 0}
};
const struct language_defn java_language_defn = {
"java", /* Language name */
language_java,
c_builtin_types,
range_check_off,
type_check_off,
java_parse,
java_error,
evaluate_subexp_java,
c_printchar, /* Print a character constant */
c_printstr, /* Function to print string constant */
java_create_fundamental_type, /* Create fundamental type in this language */
c_print_type, /* Print a type using appropriate syntax */
java_val_print, /* Print a value using appropriate syntax */
java_value_print, /* Print a top-level value */
{"", "", "", ""}, /* Binary format info */
{"0%lo", "0", "o", ""}, /* Octal format info */
{"%ld", "", "d", ""}, /* Decimal format info */
{"0x%lx", "0x", "x", ""}, /* Hex format info */
java_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
&builtin_type_char, /* Type of string elements */
LANG_MAGIC
};
void
_initialize_jave_language ()
{
java_int_type = init_type (TYPE_CODE_INT, 4, 0, "int", NULL);
java_short_type = init_type (TYPE_CODE_INT, 2, 0, "short", NULL);
java_long_type = init_type (TYPE_CODE_INT, 8, 0, "long", NULL);
java_byte_type = init_type (TYPE_CODE_INT, 1, 0, "byte", NULL);
java_boolean_type= init_type (TYPE_CODE_BOOL, 1, 0, "boolean", NULL);
java_char_type = init_type (TYPE_CODE_CHAR, 2, 0, "char", NULL);
java_float_type = init_type (TYPE_CODE_FLT, 4, 0, "float", NULL);
java_double_type = init_type (TYPE_CODE_FLT, 8, 0, "double", NULL);
java_void_type = init_type (TYPE_CODE_VOID, 1, 0, "void", NULL);
add_language (&java_language_defn);
}
/* Cleanup code that should be urn on every "run".
We need some hook to have this actually be called ... FIXME */
void java_rerun_cleanup ()
{
if (class_symtab != NULL)
{
free_symtab (class_symtab); /* ??? */
class_symtab = NULL;
}
if (dynamics_objfile != NULL)
{
free_objfile (dynamics_objfile);
dynamics_objfile = NULL;
}
java_object_type = NULL;
}

63
gdb/java-lang.h Normal file
View file

@ -0,0 +1,63 @@
/* Java language support definitions for GDB, the GNU debugger.
Copyright 1997 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 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. */
extern int
java_parse PARAMS ((void)); /* Defined in java-exp.y */
extern void
java_error PARAMS ((char *)); /* Defined in java-exp.y */
#define JAVA_OBJECT_SIZE (6 * 4) /* sizeof (struct Object) FIXME ! */
extern struct type *java_int_type;
extern struct type *java_byte_type;
extern struct type *java_short_type;
extern struct type *java_long_type;
extern struct type *java_boolean_type;
extern struct type *java_char_type;
extern struct type *java_float_type;
extern struct type *java_double_type;
extern struct type *java_void_type;
/* This objfile contains symtabs that have been dynamically created
to record dynamically loaded Java classes and dynamically
compiled java methods. */
extern struct objfile *dynamics_objfile;
extern int
java_val_print PARAMS ((struct type *, char *, CORE_ADDR, GDB_FILE *, int, int,
int, enum val_prettyprint));
extern int
java_value_print PARAMS ((struct value *, GDB_FILE *, int,
enum val_prettyprint));
extern value_ptr java_class_from_object PARAMS ((value_ptr));
extern struct type *type_from_class PARAMS ((struct value*));
extern struct type *java_primitive_type PARAMS ((int));
extern struct type *java_array_type PARAMS ((struct type*, int));
extern struct type *get_java_object_type ();
extern struct type * java_lookup_class PARAMS((char *));
extern int is_object_type PARAMS ((struct type*));

74
gdb/java-valprint.c Normal file
View file

@ -0,0 +1,74 @@
/* Support for printing Java values for GDB, the GNU debugger.
Copyright 1997 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 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. */
#include "defs.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"
#include "value.h"
#include "demangle.h"
#include "valprint.h"
#include "language.h"
#include "java-lang.h"
int
java_value_print (val, stream, format, pretty)
value_ptr val;
GDB_FILE *stream;
int format;
enum val_prettyprint pretty;
{
struct type *type = VALUE_TYPE (val);
if (TYPE_CODE (type) == TYPE_CODE_PTR)
{
fprintf_filtered (stream, "(");
type_print (TYPE_TARGET_TYPE (type), "", stream, -1);
fprintf_filtered (stream, ") ");
}
return (val_print (VALUE_TYPE (val), VALUE_CONTENTS (val),
VALUE_ADDRESS (val) + VALUE_OFFSET (val),
stream, format, 1, 0, pretty));
}
int
java_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
pretty)
struct type *type;
char *valaddr;
CORE_ADDR address;
GDB_FILE *stream;
int format;
int deref_ref;
int recurse;
enum val_prettyprint pretty;
{
if (is_object_type (type))
{
CORE_ADDR obj_addr = unpack_pointer (type, valaddr);
if (obj_addr != 0)
{
value_ptr obj_val
= value_at (TYPE_TARGET_TYPE (type), obj_addr, NULL);
type = type_from_class (java_class_from_object (obj_val));
type = lookup_pointer_type (type);
}
}
return c_val_print (type, valaddr, address, stream, format,
deref_ref, recurse, pretty);
}

View file

@ -130,6 +130,7 @@ allocate_objfile (abfd, mapped)
mapped |= mapped_symbol_files; mapped |= mapped_symbol_files;
#if !defined(NO_MMALLOC) && defined(HAVE_MMAP) #if !defined(NO_MMALLOC) && defined(HAVE_MMAP)
if (abfd != NULL)
{ {
/* If we can support mapped symbol files, try to open/reopen the /* If we can support mapped symbol files, try to open/reopen the
@ -254,15 +255,18 @@ allocate_objfile (abfd, mapped)
{ {
mfree (objfile -> md, objfile -> name); mfree (objfile -> md, objfile -> name);
} }
objfile -> name = mstrsave (objfile -> md, bfd_get_filename (abfd)); if (abfd != NULL)
objfile -> mtime = bfd_get_mtime (abfd);
/* Build section table. */
if (build_objfile_section_table (objfile))
{ {
error ("Can't find the file sections in `%s': %s", objfile -> name = mstrsave (objfile -> md, bfd_get_filename (abfd));
objfile -> name, bfd_errmsg (bfd_get_error ())); objfile -> mtime = bfd_get_mtime (abfd);
/* Build section table. */
if (build_objfile_section_table (objfile))
{
error ("Can't find the file sections in `%s': %s",
objfile -> name, bfd_errmsg (bfd_get_error ()));
}
} }
/* Add this file onto the tail of the linked list of other such files. */ /* Add this file onto the tail of the linked list of other such files. */