Files
binutils-gdb/gdb/jv-lang.c
nobody 13c00c2345 This commit was manufactured by cvs2svn to create branch 'readline_4_3
-import-branch'.

Sprout from kseitz_interps-20020528-branch 2002-06-19 16:55:29 UTC nobody 'This commit was manufactured by cvs2svn to create branch'
Cherrypick from kseitz_interps-20020528-branch 2002-07-22 19:56:08 UTC nobody 'This commit was manufactured by cvs2svn to create branch':
    bfd/cpu-ip2k.c
    bfd/vaxbsd.c
    gdb/config/i386/nm-x86-64linux.h
    gdb/config/i386/tm-x86-64linux.h
    gdb/config/vax/tm-vaxbsd.h
    gdb/gdb_locale.h
    gdb/i386obsd-nat.c
    include/elf/ip2k.h
    opcodes/ip2k-asm.c
    opcodes/ip2k-desc.c
    opcodes/ip2k-desc.h
    opcodes/ip2k-dis.c
    opcodes/ip2k-ibld.c
    opcodes/ip2k-opc.c
    opcodes/ip2k-opc.h
Cherrypick from kseitz_interps-20020528-branch 2002-08-09 15:39:20 UTC nobody 'This commit was manufactured by cvs2svn to create branch':
    bfd/elf32-ppcqnx.c
    bfd/elfarmqnx-nabi.c
    bfd/elfn32-mips.c
    gdb/config/powerpc/aix432.mh
    gdb/gdb_obstack.h
    gdb/mips-irix-tdep.c
    gdb/solib-irix.c
    include/gdb/sim-h8300.h
    opcodes/po/pt_BR.po
Cherrypick from kseitz_interps-20020528-branch 2002-05-28 18:43:09 UTC nobody 'This commit was manufactured by cvs2svn to create branch':
    gdb/event-loop.c
    gdb/event-top.h
    gdb/mi/mi-cmds.c
    gdb/mi/mi-cmds.h
    gdb/mi/mi-main.c
    gdb/wrapper.c
    gdb/wrapper.h
Cherrypick from master 2002-08-24 00:40:59 UTC Mark Kettenis <kettenis@gnu.org> '* valprint.c (print_longest) [CC_HAS_LONG_LONG &&':
    ChangeLog
    MAINTAINERS
    Makefile.in
    bfd/ChangeLog
    bfd/ChangeLog-0001
    bfd/Makefile.am
    bfd/Makefile.in
    bfd/aout-adobe.c
    bfd/aout-ns32k.c
    bfd/aout-target.h
    bfd/aout-tic30.c
    bfd/aoutf1.h
    bfd/aoutx.h
    bfd/archive.c
    bfd/archures.c
    bfd/armnetbsd.c
    bfd/bfd-in.h
    bfd/bfd-in2.h
    bfd/bfd.c
    bfd/binary.c
    bfd/bout.c
    bfd/cache.c
    bfd/coff-a29k.c
    bfd/coff-alpha.c
    bfd/coff-i386.c
    bfd/coff-mips.c
    bfd/coff-or32.c
    bfd/coff-rs6000.c
    bfd/coff64-rs6000.c
    bfd/coffcode.h
    bfd/coffgen.c
    bfd/cofflink.c
    bfd/config.bfd
    bfd/configure
    bfd/configure.in
    bfd/corefile.c
    bfd/cpu-h8300.c
    bfd/cpu-ns32k.c
    bfd/cpu-powerpc.c
    bfd/doc/ChangeLog
    bfd/doc/Makefile.am
    bfd/doc/Makefile.in
    bfd/doc/bfdint.texi
    bfd/doc/header.sed
    bfd/dwarf2.c
    bfd/ecoff.c
    bfd/ecofflink.c
    bfd/elf-bfd.h
    bfd/elf-eh-frame.c
    bfd/elf-hppa.h
    bfd/elf-m10200.c
    bfd/elf-m10300.c
    bfd/elf-strtab.c
    bfd/elf.c
    bfd/elf32-arc.c
    bfd/elf32-arm.h
    bfd/elf32-avr.c
    bfd/elf32-cris.c
    bfd/elf32-d10v.c
    bfd/elf32-d30v.c
    bfd/elf32-dlx.c
    bfd/elf32-fr30.c
    bfd/elf32-frv.c
    bfd/elf32-h8300.c
    bfd/elf32-hppa.c
    bfd/elf32-i370.c
    bfd/elf32-i386.c
    bfd/elf32-i386qnx.c
    bfd/elf32-i860.c
    bfd/elf32-ip2k.c
    bfd/elf32-m32r.c
    bfd/elf32-m68hc11.c
    bfd/elf32-m68hc12.c
    bfd/elf32-m68k.c
    bfd/elf32-mcore.c
    bfd/elf32-mips.c
    bfd/elf32-openrisc.c
    bfd/elf32-or32.c
    bfd/elf32-ppc.c
    bfd/elf32-qnx.h
    bfd/elf32-s390.c
    bfd/elf32-sh.c
    bfd/elf32-sh64.c
    bfd/elf32-shqnx.c
    bfd/elf32-sparc.c
    bfd/elf32-v850.c
    bfd/elf32-vax.c
    bfd/elf32-xstormy16.c
    bfd/elf64-alpha.c
    bfd/elf64-hppa.c
    bfd/elf64-mips.c
    bfd/elf64-mmix.c
    bfd/elf64-ppc.c
    bfd/elf64-ppc.h
    bfd/elf64-s390.c
    bfd/elf64-sh64.c
    bfd/elf64-sparc.c
    bfd/elf64-x86-64.c
    bfd/elfarm-nabi.c
    bfd/elfarm-oabi.c
    bfd/elfcode.h
    bfd/elfcore.h
    bfd/elflink.c
    bfd/elflink.h
    bfd/elfxx-ia64.c
    bfd/elfxx-mips.c
    bfd/elfxx-mips.h
    bfd/elfxx-target.h
    bfd/format.c
    bfd/hash.c
    bfd/i386linux.c
    bfd/i386lynx.c
    bfd/i386msdos.c
    bfd/i386os9k.c
    bfd/ieee.c
    bfd/ihex.c
    bfd/libaout.h
    bfd/libbfd-in.h
    bfd/libbfd.c
    bfd/libbfd.h
    bfd/libcoff-in.h
    bfd/libcoff.h
    bfd/libxcoff.h
    bfd/linker.c
    bfd/m68klinux.c
    bfd/merge.c
    bfd/mmo.c
    bfd/nlm-target.h
    bfd/nlm32-alpha.c
    bfd/nlm32-i386.c
    bfd/nlm32-ppc.c
    bfd/nlm32-sparc.c
    bfd/nlmcode.h
    bfd/ns32k.h
    bfd/ns32knetbsd.c
    bfd/oasys.c
    bfd/opncls.c
    bfd/pdp11.c
    bfd/pe-i386.c
    bfd/peXXigen.c
    bfd/pei-i386.c
    bfd/peicode.h
    bfd/po/SRC-POTFILES.in
    bfd/po/es.po
    bfd/po/fr.po
    bfd/po/sv.po
    bfd/po/tr.po
    bfd/ppcboot.c
    bfd/reloc.c
    bfd/reloc16.c
    bfd/section.c
    bfd/som.c
    bfd/sparclinux.c
    bfd/srec.c
    bfd/stabs.c
    bfd/sunos.c
    bfd/syms.c
    bfd/targets.c
    bfd/tekhex.c
    bfd/vaxnetbsd.c
    bfd/versados.c
    bfd/version.h
    bfd/vms-gsd.c
    bfd/vms-misc.c
    bfd/vms.c
    bfd/xcoff-target.h
    bfd/xcofflink.c
    config-ml.in
    config.guess
    config.sub
    config/ChangeLog
    configure
    configure.in
    contrib/ChangeLog
    contrib/texi2pod.pl
    etc/ChangeLog
    etc/texi2pod.pl
    gdb/ChangeLog
    gdb/MAINTAINERS
    gdb/Makefile.in
    gdb/NEWS
    gdb/PROBLEMS
    gdb/README
    gdb/abug-rom.c
    gdb/ada-exp.y
    gdb/ada-lang.c
    gdb/ada-lang.h
    gdb/ada-tasks.c
    gdb/ada-typeprint.c
    gdb/ada-valprint.c
    gdb/aix-thread.c
    gdb/alpha-osf1-tdep.c
    gdb/alpha-tdep.c
    gdb/arc-tdep.c
    gdb/arch-utils.c
    gdb/arch-utils.h
    gdb/arm-linux-tdep.c
    gdb/arm-tdep.c
    gdb/avr-tdep.c
    gdb/ax-general.c
    gdb/bcache.c
    gdb/bcache.h
    gdb/blockframe.c
    gdb/breakpoint.c
    gdb/breakpoint.h
    gdb/buildsym.c
    gdb/buildsym.h
    gdb/c-exp.y
    gdb/c-lang.c
    gdb/c-typeprint.c
    gdb/ch-exp.c
    gdb/ch-lang.c
    gdb/ch-lang.h
    gdb/ch-typeprint.c
    gdb/ch-valprint.c
    gdb/cli/cli-cmds.c
    gdb/cli/cli-decode.c
    gdb/cli/cli-decode.h
    gdb/cli/cli-dump.c
    gdb/cli/cli-script.c
    gdb/cli/cli-setshow.c
    gdb/coffread.c
    gdb/command.h
    gdb/config.in
    gdb/config/alpha/alpha.mt
    gdb/config/alpha/nm-linux.h
    gdb/config/alpha/tm-alphalinux.h
    gdb/config/arc/arc.mt
    gdb/config/arc/tm-arc.h
    gdb/config/arm/nm-linux.h
    gdb/config/arm/tm-linux.h
    gdb/config/arm/xm-nbsd.h
    gdb/config/d30v/d30v.mt
    gdb/config/d30v/tm-d30v.h
    gdb/config/djgpp/fnchange.lst
    gdb/config/fr30/fr30.mt
    gdb/config/fr30/tm-fr30.h
    gdb/config/frv/frv.mt
    gdb/config/frv/tm-frv.h
    gdb/config/h8300/tm-h8300.h
    gdb/config/h8500/tm-h8500.h
    gdb/config/i386/i386aix.mh
    gdb/config/i386/i386aix.mt
    gdb/config/i386/i386aout.mt
    gdb/config/i386/i386gnu.mh
    gdb/config/i386/i386gnu.mt
    gdb/config/i386/i386m3.mh
    gdb/config/i386/i386m3.mt
    gdb/config/i386/i386mach.mh
    gdb/config/i386/i386nw.mt
    gdb/config/i386/i386os9k.mt
    gdb/config/i386/i386sco5.mt
    gdb/config/i386/i386sol2.mh
    gdb/config/i386/i386sol2.mt
    gdb/config/i386/i386v.mt
    gdb/config/i386/nm-fbsd.h
    gdb/config/i386/nm-i386.h
    gdb/config/i386/nm-i386aix.h
    gdb/config/i386/nm-i386bsd.h
    gdb/config/i386/nm-i386gnu.h
    gdb/config/i386/nm-i386lynx.h
    gdb/config/i386/nm-i386mach.h
    gdb/config/i386/nm-i386sco.h
    gdb/config/i386/nm-i386sco5.h
    gdb/config/i386/nm-i386sol2.h
    gdb/config/i386/nm-i386v.h
    gdb/config/i386/nm-i386v4.h
    gdb/config/i386/nm-i386v42mp.h
    gdb/config/i386/nm-linux.h
    gdb/config/i386/nm-m3.h
    gdb/config/i386/nm-ptx4.h
    gdb/config/i386/obsd.mh
    gdb/config/i386/tm-cygwin.h
    gdb/config/i386/tm-fbsd.h
    gdb/config/i386/tm-go32.h
    gdb/config/i386/tm-i386.h
    gdb/config/i386/tm-i386aix.h
    gdb/config/i386/tm-i386lynx.h
    gdb/config/i386/tm-i386m3.h
    gdb/config/i386/tm-i386mk.h
    gdb/config/i386/tm-i386sol2.h
    gdb/config/i386/tm-i386v4.h
    gdb/config/i386/tm-linux.h
    gdb/config/i386/tm-nbsd.h
    gdb/config/i386/tm-nbsdaout.h
    gdb/config/i386/tm-ptx.h
    gdb/config/i386/tm-ptx4.h
    gdb/config/i386/tm-symmetry.h
    gdb/config/i386/tm-vxworks.h
    gdb/config/i386/x86-64linux.mh
    gdb/config/i386/x86-64linux.mt
    gdb/config/i386/xm-i386aix.h
    gdb/config/i386/xm-i386m3.h
    gdb/config/i386/xm-i386mach.h
    gdb/config/i386/xm-i386mk.h
    gdb/config/i386/xm-i386v4.h
    gdb/config/i386/xm-nbsd.h
    gdb/config/i386/xm-ptx.h
    gdb/config/i386/xm-ptx4.h
    gdb/config/i960/mon960.mt
    gdb/config/i960/nindy960.mt
    gdb/config/i960/tm-i960.h
    gdb/config/i960/tm-mon960.h
    gdb/config/i960/tm-nindy960.h
    gdb/config/i960/tm-vx960.h
    gdb/config/i960/vxworks960.mt
    gdb/config/ia64/ia64.mt
    gdb/config/ia64/nm-aix.h
    gdb/config/ia64/nm-linux.h
    gdb/config/ia64/tm-aix.h
    gdb/config/ia64/tm-linux.h
    gdb/config/ia64/xm-aix.h
    gdb/config/m32r/tm-m32r.h
    gdb/config/m68k/apollo68b.mh
    gdb/config/m68k/apollo68b.mt
    gdb/config/m68k/apollo68v.mh
    gdb/config/m68k/hp300bsd.mh
    gdb/config/m68k/hp300bsd.mt
    gdb/config/m68k/hp300hpux.mh
    gdb/config/m68k/hp300hpux.mt
    gdb/config/m68k/nm-linux.h
    gdb/config/m68k/nm-m68klynx.h
    gdb/config/m68k/nm-sysv4.h
    gdb/config/m68k/tm-delta68.h
    gdb/config/m68k/tm-linux.h
    gdb/config/m68k/tm-m68k.h
    gdb/config/m68k/tm-m68klynx.h
    gdb/config/m68k/tm-m68kv4.h
    gdb/config/m68k/tm-sun2os4.h
    gdb/config/m68k/tm-sun3os4.h
    gdb/config/m68k/tm-vx68.h
    gdb/config/m68k/xm-m68kv4.h
    gdb/config/m68k/xm-nbsd.h
    gdb/config/m88k/delta88.mh
    gdb/config/m88k/delta88.mt
    gdb/config/m88k/delta88v4.mh
    gdb/config/m88k/delta88v4.mt
    gdb/config/m88k/m88k.mh
    gdb/config/m88k/m88k.mt
    gdb/config/m88k/nm-delta88v4.h
    gdb/config/m88k/nm-m88k.h
    gdb/config/m88k/tm-delta88.h
    gdb/config/m88k/tm-delta88v4.h
    gdb/config/m88k/tm-m88k.h
    gdb/config/m88k/xm-delta88.h
    gdb/config/m88k/xm-delta88v4.h
    gdb/config/m88k/xm-dgux.h
    gdb/config/mcore/mcore.mt
    gdb/config/mips/irix5.mt
    gdb/config/mips/irix6.mh
    gdb/config/mips/irix6.mt
    gdb/config/mips/nm-irix5.h
    gdb/config/mips/nm-linux.h
    gdb/config/mips/tm-embed.h
    gdb/config/mips/tm-irix5.h
    gdb/config/mips/tm-irix6.h
    gdb/config/mips/tm-linux.h
    gdb/config/mips/tm-mips.h
    gdb/config/mips/tm-mips64.h
    gdb/config/mips/tm-mipsm3.h
    gdb/config/mips/tm-mipsv4.h
    gdb/config/mips/tm-nbsd.h
    gdb/config/mips/tm-vxmips.h
    gdb/config/mips/xm-irix5.h
    gdb/config/mips/xm-mipsv4.h
    gdb/config/mn10200/tm-mn10200.h
    gdb/config/ns32k/xm-nbsd.h
    gdb/config/pa/hppa.mt
    gdb/config/pa/nm-hppao.h
    gdb/config/pa/tm-hppa.h
    gdb/config/pa/tm-hppa64.h
    gdb/config/powerpc/aix.mt
    gdb/config/powerpc/linux.mh
    gdb/config/powerpc/linux.mt
    gdb/config/powerpc/nbsd.mh
    gdb/config/powerpc/nbsd.mt
    gdb/config/powerpc/nm-linux.h
    gdb/config/powerpc/ppc-eabi.mt
    gdb/config/powerpc/ppc-sim.mt
    gdb/config/powerpc/ppcle-eabi.mt
    gdb/config/powerpc/ppcle-sim.mt
    gdb/config/powerpc/tm-linux.h
    gdb/config/powerpc/tm-vxworks.h
    gdb/config/powerpc/vxworks.mt
    gdb/config/powerpc/xm-aix.h
    gdb/config/rs6000/aix4.mt
    gdb/config/rs6000/nm-rs6000ly.h
    gdb/config/rs6000/rs6000.mt
    gdb/config/rs6000/rs6000lynx.mt
    gdb/config/rs6000/tm-rs6000.h
    gdb/config/rs6000/tm-rs6000ly.h
    gdb/config/rs6000/xm-aix4.h
    gdb/config/sh/tm-linux.h
    gdb/config/sparc/nbsdaout.mh
    gdb/config/sparc/nbsdelf.mh
    gdb/config/sparc/nm-linux.h
    gdb/config/sparc/nm-nbsd.h
    gdb/config/sparc/nm-sparclynx.h
    gdb/config/sparc/nm-sun4sol2.h
    gdb/config/sparc/tm-linux.h
    gdb/config/sparc/tm-nbsd.h
    gdb/config/sparc/tm-sp64.h
    gdb/config/sparc/tm-sp64linux.h
    gdb/config/sparc/tm-sp64sim.h
    gdb/config/sparc/tm-sparc.h
    gdb/config/sparc/tm-sparclet.h
    gdb/config/sparc/tm-sparclynx.h
    gdb/config/sparc/tm-sun4os4.h
    gdb/config/sparc/tm-sun4sol2.h
    gdb/config/sparc/tm-vxsparc.h
    gdb/config/sparc/xm-sun4sol2.h
    gdb/config/tm-linux.h
    gdb/config/vax/nm-vax.h
    gdb/config/vax/tm-vax.h
    gdb/config/vax/vax.mt
    gdb/config/z8k/tm-z8k.h
    gdb/configure
    gdb/configure.host
    gdb/configure.in
    gdb/configure.tgt
    gdb/corefile.c
    gdb/cp-valprint.c
    gdb/cpu32bug-rom.c
    gdb/cris-tdep.c
    gdb/cxux-nat.c
    gdb/d10v-tdep.c
    gdb/d30v-tdep.c
    gdb/dbug-rom.c
    gdb/dbxread.c
    gdb/defs.h
    gdb/doc/ChangeLog
    gdb/doc/gdb.texinfo
    gdb/doc/gdbint.texinfo
    gdb/doc/stabs.texinfo
    gdb/doublest.c
    gdb/dst.h
    gdb/dstread.c
    gdb/dwarf2cfi.c
    gdb/dwarf2read.c
    gdb/dwarfread.c
    gdb/elfread.c
    gdb/eval.c
    gdb/event-top.c
    gdb/expprint.c
    gdb/expression.h
    gdb/f-exp.y
    gdb/f-typeprint.c
    gdb/fbsd-proc.c
    gdb/findvar.c
    gdb/fr30-tdep.c
    gdb/frame.c
    gdb/frame.h
    gdb/frv-tdep.c
    gdb/gcore.c
    gdb/gdb-events.c
    gdb/gdb-events.h
    gdb/gdb-events.sh
    gdb/gdb_indent.sh
    gdb/gdbarch.c
    gdb/gdbarch.h
    gdb/gdbarch.sh
    gdb/gdbinit.in
    gdb/gdbserver/ChangeLog
    gdb/gdbserver/Makefile.in
    gdb/gdbserver/acconfig.h
    gdb/gdbserver/aclocal.m4
    gdb/gdbserver/config.in
    gdb/gdbserver/configure
    gdb/gdbserver/configure.in
    gdb/gdbserver/configure.srv
    gdb/gdbserver/gdbreplay.c
    gdb/gdbserver/i387-fp.c
    gdb/gdbserver/i387-fp.h
    gdb/gdbserver/inferiors.c
    gdb/gdbserver/linux-arm-low.c
    gdb/gdbserver/linux-i386-low.c
    gdb/gdbserver/linux-low.c
    gdb/gdbserver/linux-low.h
    gdb/gdbserver/linux-mips-low.c
    gdb/gdbserver/linux-ppc-low.c
    gdb/gdbserver/linux-sh-low.c
    gdb/gdbserver/linux-x86-64-low.c
    gdb/gdbserver/regcache.c
    gdb/gdbserver/regcache.h
    gdb/gdbserver/remote-utils.c
    gdb/gdbserver/server.c
    gdb/gdbserver/server.h
    gdb/gdbserver/target.c
    gdb/gdbserver/target.h
    gdb/gdbtypes.c
    gdb/gdbtypes.h
    gdb/gnu-v2-abi.c
    gdb/gnu-v3-abi.c
    gdb/h8300-tdep.c
    gdb/h8500-tdep.c
    gdb/hpread.c
    gdb/i386-linux-nat.c
    gdb/i386-linux-tdep.c
    gdb/i386-nat.c
    gdb/i386-sol2-tdep.c
    gdb/i386-tdep.c
    gdb/i386-tdep.h
    gdb/i386aix-nat.c
    gdb/i386b-nat.c
    gdb/i386bsd-nat.c
    gdb/i386bsd-tdep.c
    gdb/i386fbsd-nat.c
    gdb/i386gnu-nat.c
    gdb/i386gnu-tdep.c
    gdb/i386ly-tdep.c
    gdb/i386m3-nat.c
    gdb/i386mach-nat.c
    gdb/i386nbsd-tdep.c
    gdb/i386v-nat.c
    gdb/i386v4-nat.c
    gdb/i387-tdep.c
    gdb/i387-tdep.h
    gdb/i960-tdep.c
    gdb/ia64-tdep.c
    gdb/infcmd.c
    gdb/inferior.h
    gdb/infrun.c
    gdb/irix5-nat.c
    gdb/jv-exp.y
    gdb/jv-lang.c
    gdb/language.c
    gdb/language.h
    gdb/linux-proc.c
    gdb/m2-exp.y
    gdb/m32r-tdep.c
    gdb/m68hc11-tdep.c
    gdb/m68k-tdep.c
    gdb/m68klinux-nat.c
    gdb/m88k-nat.c
    gdb/m88k-tdep.c
    gdb/macrocmd.c
    gdb/macroexp.c
    gdb/macroscope.c
    gdb/macrotab.c
    gdb/macrotab.h
    gdb/main.c
    gdb/maint.c
    gdb/mcore-tdep.c
    gdb/mdebugread.c
    gdb/memattr.c
    gdb/mi/ChangeLog
    gdb/mi/gdbmi.texinfo
    gdb/mi/mi-cmd-disas.c
    gdb/mi/mi-cmd-var.c
    gdb/minsyms.c
    gdb/mips-linux-tdep.c
    gdb/mips-tdep.c
    gdb/mn10200-tdep.c
    gdb/mn10300-tdep.c
    gdb/mon960-rom.c
    gdb/monitor.c
    gdb/monitor.h
    gdb/ns32k-tdep.c
    gdb/objfiles.c
    gdb/objfiles.h
    gdb/os9kread.c
    gdb/osabi.c
    gdb/osabi.h
    gdb/p-exp.y
    gdb/p-typeprint.c
    gdb/p-valprint.c
    gdb/pa64solib.c
    gdb/parse.c
    gdb/parser-defs.h
    gdb/ppc-linux-nat.c
    gdb/ppc-linux-tdep.c
    gdb/ppc-tdep.h
    gdb/ppcnbsd-nat.c
    gdb/ppcnbsd-tdep.c
    gdb/printcmd.c
    gdb/proc-api.c
    gdb/procfs.c
    gdb/rdi-share/devsw.c
    gdb/rdi-share/host.h
    gdb/rdi-share/hostchan.c
    gdb/rdi-share/hostchan.h
    gdb/rdi-share/serdrv.c
    gdb/rdi-share/serpardr.c
    gdb/rdi-share/unixcomm.c
    gdb/regcache.c
    gdb/regcache.h
    gdb/remote-bug.c
    gdb/remote-es.c
    gdb/remote-est.c
    gdb/remote-nindy.c
    gdb/remote-nrom.c
    gdb/remote-os9k.c
    gdb/remote-rdi.c
    gdb/remote-rdp.c
    gdb/remote-sim.c
    gdb/remote-vx960.c
    gdb/remote.c
    gdb/rom68k-rom.c
    gdb/rs6000-nat.c
    gdb/rs6000-tdep.c
    gdb/s390-nat.c
    gdb/s390-tdep.c
    gdb/ser-e7kpc.c
    gdb/sh-tdep.c
    gdb/signals/signals.c
    gdb/solib-osf.c
    gdb/solib-svr4.c
    gdb/somsolib.c
    gdb/source.c
    gdb/sparc-tdep.c
    gdb/sparcl-tdep.c
    gdb/stabsread.c
    gdb/stabsread.h
    gdb/stack.c
    gdb/std-regs.c
    gdb/symfile.c
    gdb/symmisc.c
    gdb/symtab.c
    gdb/symtab.h
    gdb/target.c
    gdb/target.h
    gdb/testsuite/ChangeLog
    gdb/testsuite/Makefile.in
    gdb/testsuite/config/gdbserver.exp
    gdb/testsuite/configure
    gdb/testsuite/configure.in
    gdb/testsuite/gdb.arch/altivec-abi.exp
    gdb/testsuite/gdb.asm/asm-source.exp
    gdb/testsuite/gdb.base/attach.exp
    gdb/testsuite/gdb.base/call-ar-st.exp
    gdb/testsuite/gdb.base/d10v.ld
    gdb/testsuite/gdb.base/ending-run.exp
    gdb/testsuite/gdb.base/interrupt.exp
    gdb/testsuite/gdb.base/long_long.exp
    gdb/testsuite/gdb.base/overlays.exp
    gdb/testsuite/gdb.base/page.exp
    gdb/testsuite/gdb.base/readline.exp
    gdb/testsuite/gdb.base/return.exp
    gdb/testsuite/gdb.base/selftest.exp
    gdb/testsuite/gdb.base/shlib-call.exp
    gdb/testsuite/gdb.chill/ChangeLog
    gdb/testsuite/gdb.chill/builtins.exp
    gdb/testsuite/gdb.chill/callch.exp
    gdb/testsuite/gdb.chill/chillvars.exp
    gdb/testsuite/gdb.chill/enum.exp
    gdb/testsuite/gdb.chill/gch1041.exp
    gdb/testsuite/gdb.chill/gch1272.exp
    gdb/testsuite/gdb.chill/gch1280.exp
    gdb/testsuite/gdb.chill/gch922.exp
    gdb/testsuite/gdb.chill/gch981.exp
    gdb/testsuite/gdb.chill/misc.exp
    gdb/testsuite/gdb.chill/powerset.exp
    gdb/testsuite/gdb.chill/pr-4975.exp
    gdb/testsuite/gdb.chill/pr-5016.exp
    gdb/testsuite/gdb.chill/pr-5020.exp
    gdb/testsuite/gdb.chill/pr-5022.exp
    gdb/testsuite/gdb.chill/pr-5646.exp
    gdb/testsuite/gdb.chill/pr-5984.exp
    gdb/testsuite/gdb.chill/pr-6292.exp
    gdb/testsuite/gdb.chill/pr-6632.exp
    gdb/testsuite/gdb.chill/pr-8134.exp
    gdb/testsuite/gdb.chill/pr-8136.exp
    gdb/testsuite/gdb.chill/pr-8405.exp
    gdb/testsuite/gdb.chill/pr-8742.exp
    gdb/testsuite/gdb.chill/pr-8894.exp
    gdb/testsuite/gdb.chill/pr-9095.exp
    gdb/testsuite/gdb.chill/pr-9946.exp
    gdb/testsuite/gdb.chill/result.exp
    gdb/testsuite/gdb.chill/string.exp
    gdb/testsuite/gdb.chill/tests1.exp
    gdb/testsuite/gdb.chill/tests2.exp
    gdb/testsuite/gdb.chill/tuples.exp
    gdb/testsuite/gdb.chill/xstruct.exp
    gdb/testsuite/gdb.fortran/exprs.exp
    gdb/testsuite/gdb.fortran/types.exp
    gdb/testsuite/gdb.hp/configure
    gdb/testsuite/gdb.hp/configure.in
    gdb/testsuite/gdb.java/jv-print.exp
    gdb/testsuite/gdb.threads/print-threads.c
    gdb/testsuite/gdb.threads/print-threads.exp
    gdb/testsuite/gdb.threads/schedlock.c
    gdb/testsuite/gdb.threads/schedlock.exp
    gdb/testsuite/lib/gdb.exp
    gdb/thread.c
    gdb/top.c
    gdb/tracepoint.c
    gdb/tui/ChangeLog
    gdb/tui/tui.c
    gdb/typeprint.c
    gdb/ui-file.c
    gdb/ui-file.h
    gdb/ui-out.c
    gdb/utils.c
    gdb/uw-thread.c
    gdb/v850-tdep.c
    gdb/valarith.c
    gdb/valops.c
    gdb/valprint.c
    gdb/value.h
    gdb/values.c
    gdb/varobj.c
    gdb/vax-tdep.c
    gdb/vax-tdep.h
    gdb/version.in
    gdb/win32-nat.c
    gdb/wince.c
    gdb/x86-64-linux-nat.c
    gdb/x86-64-tdep.c
    gdb/x86-64-tdep.h
    gdb/xcoffread.c
    gdb/xstormy16-tdep.c
    gdb/z8k-tdep.c
    include/ChangeLog
    include/bfdlink.h
    include/demangle.h
    include/dis-asm.h
    include/elf/ChangeLog
    include/elf/alpha.h
    include/elf/common.h
    include/elf/dwarf2.h
    include/elf/i370.h
    include/elf/m68hc11.h
    include/elf/sh.h
    include/elf/vax.h
    include/fibheap.h
    include/gdb/ChangeLog
    include/gdb/remote-sim.h
    include/gdb/sim-d10v.h
    include/gdb/sim-sh.h
    include/getopt.h
    include/hashtab.h
    include/libiberty.h
    include/opcode/ChangeLog
    include/opcode/a29k.h
    include/opcode/convex.h
    include/opcode/dlx.h
    include/opcode/i386.h
    include/opcode/m68hc11.h
    include/opcode/mips.h
    include/opcode/or32.h
    include/opcode/ppc.h
    include/partition.h
    include/sort.h
    include/splay-tree.h
    libiberty/ChangeLog
    libiberty/Makefile.in
    libiberty/configure
    libiberty/configure.in
    libiberty/cp-demangle.c
    libiberty/cplus-dem.c
    libiberty/hashtab.c
    libiberty/lbasename.c
    libiberty/regex.c
    libiberty/testsuite/demangle-expected
    ltcf-cxx.sh
    opcodes/ChangeLog
    opcodes/Makefile.am
    opcodes/Makefile.in
    opcodes/a29k-dis.c
    opcodes/configure
    opcodes/configure.in
    opcodes/d10v-opc.c
    opcodes/disassemble.c
    opcodes/h8300-dis.c
    opcodes/ia64-asmtab.c
    opcodes/ia64-opc-b.c
    opcodes/m68hc11-dis.c
    opcodes/m68hc11-opc.c
    opcodes/m68k-dis.c
    opcodes/mips-dis.c
    opcodes/mips-opc.c
    opcodes/or32-dis.c
    opcodes/po/POTFILES.in
    opcodes/po/es.po
    opcodes/po/fr.po
    opcodes/po/id.po
    opcodes/po/sv.po
    opcodes/po/tr.po
    opcodes/ppc-dis.c
    opcodes/ppc-opc.c
    opcodes/sparc-dis.c
    opcodes/z8k-dis.c
    opcodes/z8k-opc.h
    opcodes/z8kgen.c
    readline/ChangeLog.gdb
    readline/doc/rluserman.texinfo
    readline/examples/rlfe.c
    readline/rlprivate.h
    readline/rlshell.h
    readline/support/config.guess
    readline/support/config.sub
    readline/xmalloc.h
    sim/ChangeLog
    sim/Makefile.in
    sim/README-HACKING
    sim/arm/ChangeLog
    sim/arm/Makefile.in
    sim/arm/armcopro.c
    sim/arm/armemu.c
    sim/arm/armos.c
    sim/arm/armos.h
    sim/arm/configure
    sim/arm/wrapper.c
    sim/common/ChangeLog
    sim/common/Make-common.in
    sim/common/aclocal.m4
    sim/common/callback.c
    sim/common/gennltvals.sh
    sim/common/gentmap.c
    sim/common/hw-events.c
    sim/common/nltvals.def
    sim/common/run-sim.h
    sim/common/run.c
    sim/common/sim-basics.h
    sim/common/sim-events.c
    sim/common/sim-fpu.c
    sim/common/sim-load.c
    sim/common/sim-memopt.c
    sim/common/sim-resume.c
    sim/common/syscall.c
    sim/configure
    sim/configure.in
    sim/d10v/ChangeLog
    sim/d10v/Makefile.in
    sim/d10v/configure
    sim/d10v/d10v_sim.h
    sim/d10v/gencode.c
    sim/d10v/interp.c
    sim/d30v/ChangeLog
    sim/d30v/Makefile.in
    sim/d30v/alu.h
    sim/d30v/configure
    sim/d30v/cpu.c
    sim/d30v/cpu.h
    sim/d30v/d30v-insns
    sim/d30v/dc-short
    sim/d30v/engine.c
    sim/d30v/ic-d30v
    sim/d30v/sim-calls.c
    sim/d30v/sim-main.h
    sim/erc32/ChangeLog
    sim/erc32/interf.c
    sim/erc32/sis.h
    sim/fr30/ChangeLog
    sim/fr30/Makefile.in
    sim/fr30/README
    sim/fr30/TODO
    sim/fr30/arch.c
    sim/fr30/arch.h
    sim/fr30/configure
    sim/fr30/configure.in
    sim/fr30/cpu.c
    sim/fr30/cpu.h
    sim/fr30/cpuall.h
    sim/fr30/decode.c
    sim/fr30/decode.h
    sim/fr30/devices.c
    sim/fr30/fr30-sim.h
    sim/fr30/fr30.c
    sim/fr30/mloop.in
    sim/fr30/model.c
    sim/fr30/sem-switch.c
    sim/fr30/sem.c
    sim/fr30/sim-if.c
    sim/fr30/sim-main.h
    sim/fr30/traps.c
    sim/h8300/ChangeLog
    sim/h8300/Makefile.in
    sim/h8300/compile.c
    sim/h8500/ChangeLog
    sim/h8500/compile.c
    sim/i960/ChangeLog
    sim/igen/ChangeLog
    sim/igen/Makefile.in
    sim/igen/compare_igen_models
    sim/igen/configure
    sim/igen/gen-engine.c
    sim/igen/gen-icache.c
    sim/igen/gen.c
    sim/igen/igen.c
    sim/igen/lf.c
    sim/m32r/ChangeLog
    sim/m68hc11/ChangeLog
    sim/m68hc11/Makefile.in
    sim/m68hc11/configure
    sim/m68hc11/dv-m68hc11.c
    sim/m68hc11/dv-m68hc11eepr.c
    sim/m68hc11/gencode.c
    sim/m68hc11/interp.c
    sim/m68hc11/m68hc11_sim.c
    sim/m68hc11/sim-main.h
    sim/mcore/ChangeLog
    sim/mcore/interp.c
    sim/mips/ChangeLog
    sim/mips/Makefile.in
    sim/mips/configure
    sim/mips/configure.in
    sim/mips/cp1.c
    sim/mips/interp.c
    sim/mips/mips.igen
    sim/mips/sim-main.c
    sim/mips/sim-main.h
    sim/mn10200/ChangeLog
    sim/mn10200/Makefile.in
    sim/mn10200/mn10200_sim.h
    sim/mn10300/ChangeLog
    sim/mn10300/Makefile.in
    sim/mn10300/configure
    sim/mn10300/mn10300_sim.h
    sim/mn10300/tconfig.in
    sim/ppc/ChangeLog
    sim/ppc/Makefile.in
    sim/ppc/gen-idecode.c
    sim/ppc/gen-model.c
    sim/ppc/lf.c
    sim/ppc/main.c
    sim/ppc/psim.c
    sim/ppc/sim_calls.c
    sim/sh/ChangeLog
    sim/sh/Makefile.in
    sim/sh/interp.c
    sim/testsuite/ChangeLog
    sim/v850/ChangeLog
    sim/v850/configure
    sim/v850/simops.c
    sim/z8k/ChangeLog
    sim/z8k/Makefile.in
    sim/z8k/iface.c
    sim/z8k/support.c
    sim/z8k/writecode.c
    texinfo/texinfo.tex
Cherrypick from FSF 2002-08-23 22:02:32 UTC Elena Zannoni <ezannoni@kwikemart.cygnus.com> 'import of readline-4.3':
    readline/examples/excallback.c
Delete:
    gdb/29k-share/README
    gdb/29k-share/udi/udi2go32.c
    gdb/29k-share/udi/udiids.h
    gdb/29k-share/udi/udip2soc.c
    gdb/29k-share/udi/udiphcfg.h
    gdb/29k-share/udi/udiphunix.h
    gdb/29k-share/udi/udiproc.h
    gdb/29k-share/udi/udipt29k.h
    gdb/29k-share/udi/udiptcfg.h
    gdb/29k-share/udi/udisoc.h
    gdb/29k-share/udi/udr.c
    gdb/29k-share/udi_soc
    gdb/ada-exp.tab.c
    gdb/ada-lex.c
    gdb/cli/cli-interp.c
    gdb/config/i386/nm-gnu.h
    gdb/config/i386/nm-x86-64.h
    gdb/config/i386/obsd.mt
    gdb/config/i386/tm-i386gnu.h
    gdb/config/i386/tm-i386nw.h
    gdb/config/i386/tm-i386sco5.h
    gdb/config/i386/tm-i386v.h
    gdb/config/i386/tm-obsd.h
    gdb/config/i386/xm-i386gnu.h
    gdb/config/mcore/tm-mcore.h
    gdb/config/romp/rtbsd.mh
    gdb/config/romp/xm-rtbsd.h
    gdb/config/sparc/nbsdaout.mt
    gdb/config/sparc/nbsdelf.mt
    gdb/config/sparc/tm-nbsdaout.h
    gdb/config/sparc/xm-nbsd.h
    gdb/interps.c
    gdb/interps.h
    gdb/mi/mi-events.c
    gdb/mi/mi-interp.c
    gdb/mi/mi.h
    gdb/remote-vx29k.c
    gdb/testsuite/gdb.hp/gdb.threads-hp/Makefile.in
    gdb/testsuite/gdb.hp/gdb.threads-hp/configure
    gdb/testsuite/gdb.hp/gdb.threads-hp/configure.in
    include/callback.h
    include/remote-sim.h
    sim/tic80/ChangeLog
    sim/tic80/Makefile.in
    sim/tic80/acconfig.h
    sim/tic80/alu.h
    sim/tic80/config.in
    sim/tic80/configure
    sim/tic80/configure.in
    sim/tic80/cpu.h
    sim/tic80/interp.c
    sim/tic80/misc.c
    sim/tic80/sim-calls.c
    sim/tic80/sim-main.h
    sim/tic80/tic80.dc
    sim/tic80/tic80.ic
    sim/tic80/tic80.igen
    sim/w65/ChangeLog
    sim/w65/Makefile.in
    sim/w65/acconfig.h
    sim/w65/config.in
    sim/w65/configure
    sim/w65/configure.in
    sim/w65/gencode.c
    sim/w65/interp.c
    sim/w65/interp.h
    sim/w65/run.c
    sim/z8k/list.c
2002-08-24 00:41:00 +00:00

1099 lines
31 KiB
C

/* Java language support routines for GDB, the GNU debugger.
Copyright 1997, 1998, 1999, 2000 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 "jv-lang.h"
#include "gdbcore.h"
#include <ctype.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;
/* Local functions */
extern void _initialize_java_language (void);
static int java_demangled_signature_length (char *);
static void java_demangled_signature_copy (char *, char *);
static struct symtab *get_java_class_symtab (void);
static char *get_java_utf8_name (struct obstack *obstack, struct value *name);
static int java_class_is_primitive (struct value *clas);
static struct type *java_lookup_type (char *signature);
static struct value *java_value_string (char *ptr, int len);
static void java_emit_char (int c, struct ui_file * stream, int quoter);
/* This objfile contains symtabs that have been dynamically created
to record dynamically loaded Java classes and dynamically
compiled java methods. */
static struct objfile *dynamics_objfile = NULL;
static struct type *java_link_class_type (struct type *, struct value *);
static struct objfile *
get_dynamics_objfile (void)
{
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;
static struct symtab *
get_java_class_symtab (void)
{
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_HASHTABLE (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 = xmmalloc (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 (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 = xmrealloc (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;
}
static struct symbol *add_class_symbol (struct type *type, CORE_ADDR addr);
static struct symbol *
add_class_symbol (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_TAG_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 (char *name)
{
struct symbol *sym;
sym = lookup_symbol (name, expression_context_block, STRUCT_NAMESPACE,
(int *) 0, (struct symtab **) NULL);
if (sym != NULL)
return SYMBOL_TYPE (sym);
#if 0
CORE_ADDR addr;
if (called from parser)
{
call lookup_class (or similar) in inferior;
if not
found:
return NULL;
addr = found in inferior;
}
else
addr = 0;
struct type *type;
type = alloc_type (objfile);
TYPE_CODE (type) = TYPE_CODE_STRUCT;
INIT_CPLUS_SPECIFIC (type);
TYPE_TAG_NAME (type) = obsavestring (name, strlen (name), &objfile->type_obstack);
TYPE_FLAGS (type) |= TYPE_FLAG_STUB;
TYPE ? = addr;
return type;
#else
/* FIXME - should search inferior's symbol table. */
return NULL;
#endif
}
/* Return a nul-terminated string (allocated on OBSTACK) for
a name given by NAME (which has type Utf8Const*). */
char *
get_java_utf8_name (struct obstack *obstack, struct value *name)
{
char *chrs;
struct value *temp = name;
int name_length;
CORE_ADDR data_addr;
temp = value_struct_elt (&temp, NULL, "length", NULL, "structure");
name_length = (int) value_as_long (temp);
data_addr = VALUE_ADDRESS (temp) + VALUE_OFFSET (temp)
+ TYPE_LENGTH (VALUE_TYPE (temp));
chrs = obstack_alloc (obstack, name_length + 1);
chrs[name_length] = '\0';
read_memory (data_addr, chrs, name_length);
return chrs;
}
struct value *
java_class_from_object (struct value *obj_val)
{
/* This is all rather inefficient, since the offsets of vtable and
class are fixed. FIXME */
struct value *vtable_val;
if (TYPE_CODE (VALUE_TYPE (obj_val)) == TYPE_CODE_PTR
&& TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (obj_val))) == 0)
obj_val = value_at (get_java_object_type (),
value_as_address (obj_val), NULL);
vtable_val = value_struct_elt (&obj_val, NULL, "vtable", NULL, "structure");
return value_struct_elt (&vtable_val, NULL, "class", NULL, "structure");
}
/* Check if CLASS_IS_PRIMITIVE(value of clas): */
static int
java_class_is_primitive (struct value *clas)
{
struct value *vtable = value_struct_elt (&clas, NULL, "vtable", NULL, "struct");
CORE_ADDR i = value_as_address (vtable);
return (int) (i & 0x7fffffff) == (int) 0x7fffffff;
}
/* Read a GCJ Class object, and generated a gdb (TYPE_CODE_STRUCT) type. */
struct type *
type_from_class (struct value *clas)
{
struct type *type;
char *name;
struct value *temp;
struct objfile *objfile;
struct value *utf8_name;
char *nptr;
CORE_ADDR addr;
struct block *bl;
int i;
int is_array = 0;
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);
#if 0
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);
}
#endif
objfile = get_dynamics_objfile ();
if (java_class_is_primitive (clas))
{
struct value *sig;
temp = clas;
sig = value_struct_elt (&temp, NULL, "method_count", 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);
for (nptr = name; *nptr != 0; nptr++)
{
if (*nptr == '/')
*nptr = '.';
}
type = java_lookup_class (name);
if (type != NULL)
return type;
type = alloc_type (objfile);
TYPE_CODE (type) = TYPE_CODE_STRUCT;
INIT_CPLUS_SPECIFIC (type);
if (name[0] == '[')
{
char *signature = name;
int namelen = java_demangled_signature_length (signature);
if (namelen > strlen (name))
name = obstack_alloc (&objfile->type_obstack, namelen + 1);
java_demangled_signature_copy (name, signature);
name[namelen] = '\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);
}
ALLOCATE_CPLUS_STRUCT_TYPE (type);
TYPE_TAG_NAME (type) = name;
add_class_symtab_symbol (add_class_symbol (type, addr));
return java_link_class_type (type, clas);
}
/* Fill in class TYPE with data from the CLAS value. */
struct type *
java_link_class_type (struct type *type, struct value *clas)
{
struct value *temp;
char *unqualified_name;
char *name = TYPE_TAG_NAME (type);
int ninterfaces, nfields, nmethods;
int type_is_object = 0;
struct fn_field *fn_fields;
struct fn_fieldlist *fn_fieldlists;
struct value *fields;
struct value *methods;
struct value *method = NULL;
struct value *field = NULL;
int i, j;
struct objfile *objfile = get_dynamics_objfile ();
struct type *tsuper;
unqualified_name = strrchr (name, '.');
if (unqualified_name == NULL)
unqualified_name = name;
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, "field_count", NULL, "structure"));
nfields += TYPE_N_BASECLASSES (type);
nfields++; /* Add one for dummy "class" field. */
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);
}
i = strlen (name);
if (i > 2 && name[i - 1] == ']' && tsuper != NULL)
{
/* FIXME */
TYPE_LENGTH (type) = TYPE_LENGTH (tsuper) + 4; /* size with "length" */
}
else
{
temp = clas;
temp = value_struct_elt (&temp, NULL, "size_in_bytes", NULL, "structure");
TYPE_LENGTH (type) = value_as_long (temp);
}
fields = NULL;
nfields--; /* First set up dummy "class" field. */
SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields),
VALUE_ADDRESS (clas) + VALUE_OFFSET (clas));
TYPE_FIELD_NAME (type, nfields) = "class";
TYPE_FIELD_TYPE (type, nfields) = VALUE_TYPE (clas);
SET_TYPE_FIELD_PRIVATE (type, nfields);
for (i = TYPE_N_BASECLASSES (type); i < nfields; i++)
{
int accflags;
int boffset;
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"));
temp = field;
temp = value_struct_elt (&temp, NULL, "info", 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 */
SET_FIELD_PHYSADDR (TYPE_FIELD (type, i), boffset);
else
TYPE_FIELD_BITPOS (type, i) = 8 * 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, "method_count",
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;
}
static struct type *java_object_type;
struct type *
get_java_object_type (void)
{
if (java_object_type == NULL)
{
struct symbol *sym;
sym = lookup_symbol ("java.lang.Object", NULL, STRUCT_NAMESPACE,
(int *) 0, (struct symtab **) NULL);
if (sym == NULL)
error ("cannot find java.lang.Object");
java_object_type = SYMBOL_TYPE (sym);
}
return java_object_type;
}
int
get_java_object_header_size (void)
{
struct type *objtype = get_java_object_type ();
if (objtype == NULL)
return (2 * TARGET_PTR_BIT / TARGET_CHAR_BIT);
else
return TYPE_LENGTH (objtype);
}
int
is_object_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_TAG_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, "vtable") == 0)
{
if (java_object_type == NULL)
java_object_type = type;
return 1;
}
}
return 0;
}
struct type *
java_primitive_type (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);
}
/* If name[0 .. namelen-1] is the name of a primitive Java type,
return that type. Otherwise, return NULL. */
struct type *
java_primitive_type_from_name (char *name, int namelen)
{
switch (name[0])
{
case 'b':
if (namelen == 4 && memcmp (name, "byte", 4) == 0)
return java_byte_type;
if (namelen == 7 && memcmp (name, "boolean", 7) == 0)
return java_boolean_type;
break;
case 'c':
if (namelen == 4 && memcmp (name, "char", 4) == 0)
return java_char_type;
case 'd':
if (namelen == 6 && memcmp (name, "double", 6) == 0)
return java_double_type;
break;
case 'f':
if (namelen == 5 && memcmp (name, "float", 5) == 0)
return java_float_type;
break;
case 'i':
if (namelen == 3 && memcmp (name, "int", 3) == 0)
return java_int_type;
break;
case 'l':
if (namelen == 4 && memcmp (name, "long", 4) == 0)
return java_long_type;
break;
case 's':
if (namelen == 5 && memcmp (name, "short", 5) == 0)
return java_short_type;
break;
case 'v':
if (namelen == 4 && memcmp (name, "void", 4) == 0)
return java_void_type;
break;
}
return NULL;
}
/* Return the length (in bytes) of demangled name of the Java type
signature string SIGNATURE. */
static int
java_demangled_signature_length (char *signature)
{
int array = 0;
for (; *signature == '['; signature++)
array += 2; /* Two chars for "[]". */
switch (signature[0])
{
case 'L':
/* Subtract 2 for 'L' and ';'. */
return strlen (signature) - 2 + array;
default:
return strlen (TYPE_NAME (java_primitive_type (signature[0]))) + array;
}
}
/* Demangle the Java type signature SIGNATURE, leaving the result in RESULT. */
static void
java_demangled_signature_copy (char *result, char *signature)
{
int array = 0;
char *ptr;
int i;
while (*signature == '[')
{
array++;
signature++;
}
switch (signature[0])
{
case 'L':
/* Subtract 2 for 'L' and ';', but add 1 for final nul. */
signature++;
ptr = result;
for (; *signature != ';' && *signature != '\0'; signature++)
{
if (*signature == '/')
*ptr++ = '.';
else
*ptr++ = *signature;
}
break;
default:
ptr = TYPE_NAME (java_primitive_type (signature[0]));
i = strlen (ptr);
strcpy (result, ptr);
ptr = result + i;
break;
}
while (--array >= 0)
{
*ptr++ = '[';
*ptr++ = ']';
}
}
/* Return the demangled name of the Java type signature string SIGNATURE,
as a freshly allocated copy. */
char *
java_demangle_type_signature (char *signature)
{
int length = java_demangled_signature_length (signature);
char *result = xmalloc (length + 1);
java_demangled_signature_copy (result, signature);
result[length] = '\0';
return result;
}
struct type *
java_lookup_type (char *signature)
{
switch (signature[0])
{
case 'L':
case '[':
error ("java_lookup_type not fully implemented");
default:
return java_primitive_type (signature[0]);
}
}
/* Return the type of TYPE followed by DIMS pairs of [ ].
If DIMS == 0, TYPE is returned. */
struct type *
java_array_type (struct type *type, int dims)
{
struct type *range_type;
while (dims-- > 0)
{
range_type = create_range_type (NULL, builtin_type_int, 0, 0);
/* FIXME This is bogus! Java arrays are not gdb arrays! */
type = create_array_type (NULL, type, range_type);
}
return type;
}
/* Create a Java string in the inferior from a (Utf8) literal. */
static struct value *
java_value_string (char *ptr, int len)
{
error ("not implemented - java_value_string"); /* FIXME */
}
/* Print the character C on STREAM as part of the contents of a literal
string whose delimiter is QUOTER. Note that that format for printing
characters and strings is language specific. */
static void
java_emit_char (int c, struct ui_file *stream, int quoter)
{
switch (c)
{
case '\\':
case '\'':
fprintf_filtered (stream, "\\%c", c);
break;
case '\b':
fputs_filtered ("\\b", stream);
break;
case '\t':
fputs_filtered ("\\t", stream);
break;
case '\n':
fputs_filtered ("\\n", stream);
break;
case '\f':
fputs_filtered ("\\f", stream);
break;
case '\r':
fputs_filtered ("\\r", stream);
break;
default:
if (isprint (c))
fputc_filtered (c, stream);
else
fprintf_filtered (stream, "\\u%.4x", (unsigned int) c);
break;
}
}
static struct value *
evaluate_subexp_java (struct type *expect_type, register struct expression *exp,
register int *pos, enum noside noside)
{
int pc = *pos;
int i;
char *name;
enum exp_opcode op = exp->elts[*pos].opcode;
struct value *arg1;
struct value *arg2;
struct type *type;
switch (op)
{
case UNOP_IND:
if (noside == EVAL_SKIP)
goto standard;
(*pos)++;
arg1 = evaluate_subexp_java (NULL_TYPE, exp, pos, EVAL_NORMAL);
if (is_object_type (VALUE_TYPE (arg1)))
{
struct type *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 BINOP_SUBSCRIPT:
(*pos)++;
arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
if (noside == EVAL_SKIP)
goto nosideret;
/* If the user attempts to subscript something that is not an
array or pointer type (like a plain int variable for example),
then report this as an error. */
COERCE_REF (arg1);
type = check_typedef (VALUE_TYPE (arg1));
if (TYPE_CODE (type) == TYPE_CODE_PTR)
type = check_typedef (TYPE_TARGET_TYPE (type));
name = TYPE_NAME (type);
if (name == NULL)
name = TYPE_TAG_NAME (type);
i = name == NULL ? 0 : strlen (name);
if (TYPE_CODE (type) == TYPE_CODE_STRUCT
&& i > 2 && name[i - 1] == ']')
{
CORE_ADDR address;
long length, index;
struct type *el_type;
char buf4[4];
struct value *clas = java_class_from_object (arg1);
struct value *temp = clas;
/* Get CLASS_ELEMENT_TYPE of the array type. */
temp = value_struct_elt (&temp, NULL, "methods",
NULL, "structure");
VALUE_TYPE (temp) = VALUE_TYPE (clas);
el_type = type_from_class (temp);
if (TYPE_CODE (el_type) == TYPE_CODE_STRUCT)
el_type = lookup_pointer_type (el_type);
if (noside == EVAL_AVOID_SIDE_EFFECTS)
return value_zero (el_type, VALUE_LVAL (arg1));
address = value_as_address (arg1);
address += JAVA_OBJECT_SIZE;
read_memory (address, buf4, 4);
length = (long) extract_signed_integer (buf4, 4);
index = (long) value_as_long (arg2);
if (index >= length || index < 0)
error ("array index (%ld) out of bounds (length: %ld)",
index, length);
address = (address + 4) + index * TYPE_LENGTH (el_type);
return value_at (el_type, address, NULL);
}
else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
{
if (noside == EVAL_AVOID_SIDE_EFFECTS)
return value_zero (TYPE_TARGET_TYPE (type), VALUE_LVAL (arg1));
else
return value_subscript (arg1, arg2);
}
if (name)
error ("cannot subscript something of type `%s'", name);
else
error ("cannot subscript requested type");
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);
case STRUCTOP_STRUCT:
arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside);
/* Convert object field (such as TYPE.class) to reference. */
if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_STRUCT)
arg1 = value_addr (arg1);
return arg1;
default:
break;
}
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 (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,
case_sensitive_on,
java_parse,
java_error,
evaluate_subexp_java,
c_printchar, /* Print a character constant */
c_printstr, /* Function to print string constant */
java_emit_char, /* Function to print a single character */
java_create_fundamental_type, /* Create fundamental type in this language */
java_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 */
0, /* not c-style arrays */
0, /* String lower bound */
&builtin_type_char, /* Type of string elements */
LANG_MAGIC
};
void
_initialize_java_language (void)
{
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, TYPE_FLAG_UNSIGNED, "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 run on every "run".
We should use make_run_cleanup to have this be called.
But will that mess up values in value histry? FIXME */
extern void java_rerun_cleanup (void);
void
java_rerun_cleanup (void)
{
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;
}