aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-lang.c
diff options
context:
space:
mode:
authornobody <>2002-09-07 00:00:05 +0000
committernobody <>2002-09-07 00:00:05 +0000
commitc1aa2a27e755c883b5c49b223120dfb712ea4e28 (patch)
treea98633075cd1f2b034b49446e83e522708d11f68 /gdb/ada-lang.c
parent2e3c0e2427295c9cc09a8a707dfba38d50e2ba30 (diff)
downloadgdb-sid-20020905-branch.zip
gdb-sid-20020905-branch.tar.gz
gdb-sid-20020905-branch.tar.bz2
This commit was manufactured by cvs2svn to create branchsid-20020905-branchpointsid-20020905-branch
'sid-20020905-branch'. Sprout from gdb_5_3-branch 2002-09-03 22:29:15 UTC nobody 'This commit was manufactured by cvs2svn to create branch 'gdb_5_3-branch'.' Cherrypick from master 2002-09-07 00:00:04 UTC Alan Modra <amodra@gmail.com> 'daily update': bfd/ChangeLog bfd/config.bfd bfd/version.h include/ChangeLog include/dis-asm.h libiberty/ChangeLog libiberty/regex.c opcodes/ChangeLog opcodes/disassemble.c opcodes/ppc-dis.c opcodes/ppc-opc.c Delete: djunpack.bat gdb/CONTRIBUTE gdb/COPYING gdb/ChangeLog gdb/ChangeLog-1990 gdb/ChangeLog-1991 gdb/ChangeLog-1992 gdb/ChangeLog-1993 gdb/ChangeLog-1994 gdb/ChangeLog-1995 gdb/ChangeLog-1996 gdb/ChangeLog-1997 gdb/ChangeLog-1998 gdb/ChangeLog-1999 gdb/ChangeLog-2000 gdb/ChangeLog-2001 gdb/ChangeLog-3.x gdb/MAINTAINERS gdb/Makefile.in gdb/NEWS gdb/PROBLEMS gdb/README gdb/TODO gdb/a68v-nat.c gdb/abug-rom.c gdb/acconfig.h gdb/acinclude.m4 gdb/aclocal.m4 gdb/ada-exp.y gdb/ada-lang.c gdb/ada-lang.h gdb/ada-lex.l gdb/ada-tasks.c gdb/ada-typeprint.c gdb/ada-valprint.c gdb/aix-thread.c gdb/alpha-linux-tdep.c gdb/alpha-nat.c gdb/alpha-osf1-tdep.c gdb/alpha-tdep.c gdb/alpha-tdep.h gdb/alphabsd-nat.c gdb/alphabsd-tdep.c gdb/alphabsd-tdep.h gdb/alphafbsd-tdep.c gdb/alphanbsd-tdep.c gdb/annotate.c gdb/annotate.h gdb/arc-tdep.c gdb/arch-utils.c gdb/arch-utils.h gdb/arm-linux-nat.c gdb/arm-linux-tdep.c gdb/arm-tdep.c gdb/arm-tdep.h gdb/armnbsd-nat.c gdb/armnbsd-tdep.c gdb/avr-tdep.c gdb/ax-gdb.c gdb/ax-gdb.h gdb/ax-general.c gdb/ax.h gdb/bcache.c gdb/bcache.h gdb/blockframe.c gdb/breakpoint.c gdb/breakpoint.h gdb/buildsym.c gdb/buildsym.h gdb/builtin-regs.c gdb/builtin-regs.h gdb/c-exp.y gdb/c-lang.c gdb/c-lang.h gdb/c-typeprint.c gdb/c-valprint.c gdb/call-cmds.h gdb/ch-exp.c gdb/ch-lang.c gdb/ch-lang.h gdb/ch-typeprint.c gdb/ch-valprint.c gdb/cli-out.c gdb/cli-out.h gdb/cli/cli-cmds.c gdb/cli/cli-cmds.h gdb/cli/cli-decode.c gdb/cli/cli-decode.h gdb/cli/cli-dump.c gdb/cli/cli-dump.h gdb/cli/cli-script.c gdb/cli/cli-script.h gdb/cli/cli-setshow.c gdb/cli/cli-setshow.h gdb/cli/cli-utils.c gdb/cli/cli-utils.h gdb/coff-solib.c gdb/coff-solib.h gdb/coffread.c gdb/command.h gdb/complaints.c gdb/complaints.h gdb/completer.c gdb/completer.h gdb/config.in gdb/config/alpha/alpha-linux.mh gdb/config/alpha/alpha-linux.mt gdb/config/alpha/alpha-osf1.mh gdb/config/alpha/alpha-osf1.mt gdb/config/alpha/alpha-osf2.mh gdb/config/alpha/alpha-osf3.mh gdb/config/alpha/alpha.mt gdb/config/alpha/fbsd.mh gdb/config/alpha/fbsd.mt gdb/config/alpha/nbsd.mh gdb/config/alpha/nbsd.mt gdb/config/alpha/nm-fbsd.h gdb/config/alpha/nm-linux.h gdb/config/alpha/nm-nbsd.h gdb/config/alpha/nm-osf.h gdb/config/alpha/nm-osf2.h gdb/config/alpha/nm-osf3.h gdb/config/alpha/tm-alpha.h gdb/config/alpha/tm-alphalinux.h gdb/config/alpha/tm-fbsd.h gdb/config/alpha/tm-nbsd.h gdb/config/alpha/xm-alphalinux.h gdb/config/alpha/xm-alphaosf.h gdb/config/arc/arc.mt gdb/config/arc/tm-arc.h gdb/config/arm/embed.mt gdb/config/arm/linux.mh gdb/config/arm/linux.mt gdb/config/arm/nbsd.mt gdb/config/arm/nbsdaout.mh gdb/config/arm/nbsdelf.mh gdb/config/arm/nm-linux.h gdb/config/arm/nm-nbsd.h gdb/config/arm/nm-nbsdaout.h gdb/config/arm/tm-arm.h gdb/config/arm/tm-embed.h gdb/config/arm/tm-linux.h gdb/config/arm/tm-wince.h gdb/config/arm/wince.mt gdb/config/arm/xm-linux.h gdb/config/arm/xm-nbsd.h gdb/config/avr/avr.mt gdb/config/cris/cris.mt gdb/config/cris/tm-cris.h gdb/config/d10v/d10v.mt gdb/config/d30v/d30v.mt gdb/config/d30v/tm-d30v.h gdb/config/djgpp/README gdb/config/djgpp/config.sed gdb/config/djgpp/djcheck.sh gdb/config/djgpp/djconfig.sh 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/h8300.mt gdb/config/h8300/tm-h8300.h gdb/config/h8500/h8500.mt gdb/config/h8500/tm-h8500.h gdb/config/i386/cygwin.mh gdb/config/i386/cygwin.mt gdb/config/i386/embed.mt gdb/config/i386/fbsd.mh gdb/config/i386/fbsd.mt gdb/config/i386/gdbserve.mt gdb/config/i386/go32.mh gdb/config/i386/go32.mt gdb/config/i386/i386aix.mh gdb/config/i386/i386aix.mt gdb/config/i386/i386aout.mt gdb/config/i386/i386bsd.mh gdb/config/i386/i386bsd.mt gdb/config/i386/i386dgux.mh gdb/config/i386/i386gnu.mh gdb/config/i386/i386gnu.mt gdb/config/i386/i386lynx.mh gdb/config/i386/i386lynx.mt gdb/config/i386/i386m3.mh gdb/config/i386/i386m3.mt gdb/config/i386/i386mach.mh gdb/config/i386/i386mk.mh gdb/config/i386/i386mk.mt gdb/config/i386/i386nw.mt gdb/config/i386/i386os9k.mt gdb/config/i386/i386sco.mh gdb/config/i386/i386sco4.mh gdb/config/i386/i386sco5.mh gdb/config/i386/i386sco5.mt gdb/config/i386/i386sol2.mh gdb/config/i386/i386sol2.mt gdb/config/i386/i386v.mh gdb/config/i386/i386v.mt gdb/config/i386/i386v32.mh gdb/config/i386/i386v4.mh gdb/config/i386/i386v4.mt gdb/config/i386/i386v42mp.mh gdb/config/i386/i386v42mp.mt gdb/config/i386/linux.mh gdb/config/i386/linux.mt gdb/config/i386/nbsd.mt gdb/config/i386/nbsdaout.mh gdb/config/i386/nbsdelf.mh gdb/config/i386/ncr3000.mh gdb/config/i386/ncr3000.mt gdb/config/i386/nm-cygwin.h gdb/config/i386/nm-fbsd.h gdb/config/i386/nm-go32.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-i386sco4.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-nbsd.h gdb/config/i386/nm-nbsdaout.h gdb/config/i386/nm-obsd.h gdb/config/i386/nm-ptx4.h gdb/config/i386/nm-symmetry.h gdb/config/i386/nm-x86-64linux.h gdb/config/i386/obsd.mh gdb/config/i386/ptx.mh gdb/config/i386/ptx.mt gdb/config/i386/ptx4.mh gdb/config/i386/ptx4.mt gdb/config/i386/symmetry.mh gdb/config/i386/symmetry.mt 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-i386bsd.h gdb/config/i386/tm-i386lynx.h gdb/config/i386/tm-i386m3.h gdb/config/i386/tm-i386mk.h gdb/config/i386/tm-i386os9k.h gdb/config/i386/tm-i386sol2.h gdb/config/i386/tm-i386v4.h gdb/config/i386/tm-i386v42mp.h gdb/config/i386/tm-linux.h gdb/config/i386/tm-nbsd.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/tm-x86-64linux.h gdb/config/i386/vxworks.mt gdb/config/i386/x86-64linux.mh gdb/config/i386/x86-64linux.mt gdb/config/i386/xm-cygwin.h gdb/config/i386/xm-go32.h gdb/config/i386/xm-i386.h gdb/config/i386/xm-i386aix.h gdb/config/i386/xm-i386bsd.h gdb/config/i386/xm-i386m3.h gdb/config/i386/xm-i386mach.h gdb/config/i386/xm-i386mk.h gdb/config/i386/xm-i386sco.h gdb/config/i386/xm-i386v.h gdb/config/i386/xm-i386v32.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/i386/xm-symmetry.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/aix.mh gdb/config/ia64/aix.mt gdb/config/ia64/ia64.mt gdb/config/ia64/linux.mh gdb/config/ia64/linux.mt gdb/config/ia64/nm-aix.h gdb/config/ia64/nm-linux.h gdb/config/ia64/tm-aix.h gdb/config/ia64/tm-ia64.h gdb/config/ia64/tm-linux.h gdb/config/ia64/xm-aix.h gdb/config/ia64/xm-linux.h gdb/config/m32r/m32r.mt gdb/config/m32r/tm-m32r.h gdb/config/m68hc11/m68hc11.mt gdb/config/m68k/3b1.mh gdb/config/m68k/3b1.mt gdb/config/m68k/apollo68b.mh gdb/config/m68k/apollo68b.mt gdb/config/m68k/apollo68v.mh gdb/config/m68k/cisco.mt gdb/config/m68k/delta68.mh gdb/config/m68k/delta68.mt gdb/config/m68k/dpx2.mh gdb/config/m68k/dpx2.mt gdb/config/m68k/es1800.mt gdb/config/m68k/hp300bsd.mh gdb/config/m68k/hp300bsd.mt gdb/config/m68k/hp300hpux.mh gdb/config/m68k/hp300hpux.mt gdb/config/m68k/linux.mh gdb/config/m68k/linux.mt gdb/config/m68k/m68klynx.mh gdb/config/m68k/m68klynx.mt gdb/config/m68k/m68kv4.mh gdb/config/m68k/m68kv4.mt gdb/config/m68k/monitor.mt gdb/config/m68k/nbsdaout.mh gdb/config/m68k/nbsdaout.mt gdb/config/m68k/nm-apollo68b.h gdb/config/m68k/nm-apollo68v.h gdb/config/m68k/nm-delta68.h gdb/config/m68k/nm-dpx2.h gdb/config/m68k/nm-hp300bsd.h gdb/config/m68k/nm-hp300hpux.h gdb/config/m68k/nm-linux.h gdb/config/m68k/nm-m68klynx.h gdb/config/m68k/nm-nbsd.h gdb/config/m68k/nm-nbsdaout.h gdb/config/m68k/nm-sun2.h gdb/config/m68k/nm-sun3.h gdb/config/m68k/nm-sysv4.h gdb/config/m68k/os68k.mt gdb/config/m68k/st2000.mt gdb/config/m68k/sun2os3.mh gdb/config/m68k/sun2os3.mt gdb/config/m68k/sun2os4.mh gdb/config/m68k/sun2os4.mt gdb/config/m68k/sun3os3.mh gdb/config/m68k/sun3os3.mt gdb/config/m68k/sun3os4.mh gdb/config/m68k/sun3os4.mt gdb/config/m68k/tm-3b1.h gdb/config/m68k/tm-apollo68b.h gdb/config/m68k/tm-cisco.h gdb/config/m68k/tm-delta68.h gdb/config/m68k/tm-dpx2.h gdb/config/m68k/tm-es1800.h gdb/config/m68k/tm-hp300bsd.h gdb/config/m68k/tm-hp300hpux.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-mac.h gdb/config/m68k/tm-monitor.h gdb/config/m68k/tm-nbsd.h gdb/config/m68k/tm-os68k.h gdb/config/m68k/tm-st2000.h gdb/config/m68k/tm-sun2.h gdb/config/m68k/tm-sun2os4.h gdb/config/m68k/tm-sun3.h gdb/config/m68k/tm-sun3os4.h gdb/config/m68k/tm-vx68.h gdb/config/m68k/vxworks68.mt gdb/config/m68k/xm-3b1.h gdb/config/m68k/xm-apollo68b.h gdb/config/m68k/xm-apollo68v.h gdb/config/m68k/xm-delta68.h gdb/config/m68k/xm-dpx2.h gdb/config/m68k/xm-hp300bsd.h gdb/config/m68k/xm-hp300hpux.h gdb/config/m68k/xm-linux.h gdb/config/m68k/xm-m68k.h gdb/config/m68k/xm-m68kv4.h gdb/config/m68k/xm-nbsd.h gdb/config/m68k/xm-sun2.h gdb/config/m68k/xm-sun3.h gdb/config/m68k/xm-sun3os4.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/bigmips.mt gdb/config/mips/bigmips64.mt gdb/config/mips/decstation.mh gdb/config/mips/decstation.mt gdb/config/mips/embed.mt gdb/config/mips/embed64.mt gdb/config/mips/embedl.mt gdb/config/mips/embedl64.mt gdb/config/mips/irix3.mh gdb/config/mips/irix3.mt gdb/config/mips/irix4.mh gdb/config/mips/irix5.mh gdb/config/mips/irix5.mt gdb/config/mips/irix6.mh gdb/config/mips/irix6.mt gdb/config/mips/linux.mh gdb/config/mips/linux.mt gdb/config/mips/littlemips.mh gdb/config/mips/littlemips.mt gdb/config/mips/mipsm3.mh gdb/config/mips/mipsm3.mt gdb/config/mips/mipsv4.mh gdb/config/mips/mipsv4.mt gdb/config/mips/nbsd.mh gdb/config/mips/nbsd.mt gdb/config/mips/news-mips.mh gdb/config/mips/nm-irix3.h gdb/config/mips/nm-irix4.h gdb/config/mips/nm-irix5.h gdb/config/mips/nm-irix6.h gdb/config/mips/nm-linux.h gdb/config/mips/nm-mips.h gdb/config/mips/nm-nbsd.h gdb/config/mips/nm-news-mips.h gdb/config/mips/nm-riscos.h gdb/config/mips/riscos.mh gdb/config/mips/tm-bigmips.h gdb/config/mips/tm-bigmips64.h gdb/config/mips/tm-embed.h gdb/config/mips/tm-embed64.h gdb/config/mips/tm-embedl.h gdb/config/mips/tm-embedl64.h gdb/config/mips/tm-irix3.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-tx39.h gdb/config/mips/tm-tx39l.h gdb/config/mips/tm-vr4100.h gdb/config/mips/tm-vr4300.h gdb/config/mips/tm-vr4300el.h gdb/config/mips/tm-vr4xxx.h gdb/config/mips/tm-vr4xxxel.h gdb/config/mips/tm-vr5000.h gdb/config/mips/tm-vr5000el.h gdb/config/mips/tm-vxmips.h gdb/config/mips/tm-wince.h gdb/config/mips/tx39.mt gdb/config/mips/tx39l.mt gdb/config/mips/vr4100.mt gdb/config/mips/vr4300.mt gdb/config/mips/vr4300el.mt gdb/config/mips/vr4xxx.mt gdb/config/mips/vr4xxxel.mt gdb/config/mips/vr5000.mt gdb/config/mips/vr5000el.mt gdb/config/mips/vxmips.mt gdb/config/mips/wince.mt gdb/config/mips/xm-irix3.h gdb/config/mips/xm-irix4.h gdb/config/mips/xm-irix5.h gdb/config/mips/xm-irix6.h gdb/config/mips/xm-linux.h gdb/config/mips/xm-mips.h gdb/config/mips/xm-mipsm3.h gdb/config/mips/xm-mipsv4.h gdb/config/mips/xm-riscos.h gdb/config/mn10200/mn10200.mt gdb/config/mn10200/tm-mn10200.h gdb/config/mn10300/mn10300.mt gdb/config/nm-gnu.h gdb/config/nm-linux.h gdb/config/nm-lynx.h gdb/config/nm-m3.h gdb/config/nm-nbsd.h gdb/config/nm-nbsdaout.h gdb/config/nm-sysv4.h gdb/config/none/nm-none.h gdb/config/none/none.mh gdb/config/none/none.mt gdb/config/none/tm-none.h gdb/config/none/xm-none.h gdb/config/ns32k/nbsdaout.mh gdb/config/ns32k/nbsdaout.mt gdb/config/ns32k/nm-nbsd.h gdb/config/ns32k/nm-nbsdaout.h gdb/config/ns32k/tm-nbsd.h gdb/config/ns32k/tm-ns32k.h gdb/config/ns32k/xm-nbsd.h gdb/config/pa/hppa.mt gdb/config/pa/hppa64.mt gdb/config/pa/hppabsd.mh gdb/config/pa/hppabsd.mt gdb/config/pa/hppahpux.mh gdb/config/pa/hppahpux.mt gdb/config/pa/hppaosf.mh gdb/config/pa/hppaosf.mt gdb/config/pa/hppapro.mt gdb/config/pa/hpux1020.mh gdb/config/pa/hpux1020.mt gdb/config/pa/hpux11.mh gdb/config/pa/hpux11.mt gdb/config/pa/hpux11w.mh gdb/config/pa/hpux11w.mt gdb/config/pa/nm-hppab.h gdb/config/pa/nm-hppah.h gdb/config/pa/nm-hppah11.h gdb/config/pa/nm-hppao.h gdb/config/pa/tm-hppa.h gdb/config/pa/tm-hppa64.h gdb/config/pa/tm-hppab.h gdb/config/pa/tm-hppah.h gdb/config/pa/tm-hppao.h gdb/config/pa/tm-pro.h gdb/config/pa/xm-hppab.h gdb/config/pa/xm-hppah.h gdb/config/pa/xm-pa.h gdb/config/powerpc/aix.mh gdb/config/powerpc/aix.mt gdb/config/powerpc/aix432.mh gdb/config/powerpc/gdbserve.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-aix.h gdb/config/powerpc/nm-linux.h gdb/config/powerpc/nm-nbsd.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-nbsd.h gdb/config/powerpc/tm-ppc-aix.h gdb/config/powerpc/tm-ppc-eabi.h gdb/config/powerpc/tm-ppc-sim.h gdb/config/powerpc/tm-ppcle-eabi.h gdb/config/powerpc/tm-ppcle-sim.h gdb/config/powerpc/tm-vxworks.h gdb/config/powerpc/vxworks.mt gdb/config/powerpc/xm-aix.h gdb/config/powerpc/xm-linux.h gdb/config/rs6000/aix4.mh gdb/config/rs6000/aix4.mt gdb/config/rs6000/nm-rs6000.h gdb/config/rs6000/nm-rs6000ly.h gdb/config/rs6000/rs6000.mh gdb/config/rs6000/rs6000.mt gdb/config/rs6000/rs6000lynx.mh gdb/config/rs6000/rs6000lynx.mt gdb/config/rs6000/tm-rs6000-aix4.h gdb/config/rs6000/tm-rs6000.h gdb/config/rs6000/tm-rs6000ly.h gdb/config/rs6000/xm-aix4.h gdb/config/rs6000/xm-rs6000.h gdb/config/s390/nm-linux.h gdb/config/s390/s390.mh gdb/config/s390/s390.mt gdb/config/s390/s390x.mt gdb/config/s390/tm-linux.h gdb/config/s390/tm-s390.h gdb/config/s390/xm-linux.h gdb/config/sh/embed.mt gdb/config/sh/linux.mt gdb/config/sh/nbsd.mh gdb/config/sh/nbsd.mt gdb/config/sh/nm-nbsd.h gdb/config/sh/tm-linux.h gdb/config/sh/tm-nbsd.h gdb/config/sh/tm-sh.h gdb/config/sh/tm-wince.h gdb/config/sh/wince.mt gdb/config/sparc/fbsd.mh gdb/config/sparc/fbsd.mt gdb/config/sparc/linux.mh gdb/config/sparc/linux.mt gdb/config/sparc/nbsd.mt gdb/config/sparc/nbsd64.mh gdb/config/sparc/nbsd64.mt gdb/config/sparc/nbsdaout.mh gdb/config/sparc/nbsdelf.mh gdb/config/sparc/nm-fbsd.h gdb/config/sparc/nm-linux.h gdb/config/sparc/nm-nbsd.h gdb/config/sparc/nm-nbsdaout.h gdb/config/sparc/nm-sparclynx.h gdb/config/sparc/nm-sun4os4.h gdb/config/sparc/nm-sun4sol2.h gdb/config/sparc/sp64.mt gdb/config/sparc/sp64linux.mt gdb/config/sparc/sp64sim.mt gdb/config/sparc/sp64sol2.mt gdb/config/sparc/sparc-em.mt gdb/config/sparc/sparclet.mt gdb/config/sparc/sparclite.mt gdb/config/sparc/sparclynx.mh gdb/config/sparc/sparclynx.mt gdb/config/sparc/sun4os4.mh gdb/config/sparc/sun4os4.mt gdb/config/sparc/sun4sol2.mh gdb/config/sparc/sun4sol2.mt gdb/config/sparc/tm-fbsd.h gdb/config/sparc/tm-linux.h gdb/config/sparc/tm-nbsd.h gdb/config/sparc/tm-nbsd64.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-sparclite.h gdb/config/sparc/tm-sparclynx.h gdb/config/sparc/tm-spc-em.h gdb/config/sparc/tm-sun4os4.h gdb/config/sparc/tm-sun4sol2.h gdb/config/sparc/tm-vxsparc.h gdb/config/sparc/vxsparc.mt gdb/config/sparc/xm-linux.h gdb/config/sparc/xm-sun4sol2.h gdb/config/tm-linux.h gdb/config/tm-lynx.h gdb/config/tm-sunos.h gdb/config/tm-sysv4.h gdb/config/tm-vxworks.h gdb/config/v850/v850.mt gdb/config/vax/nm-vax.h gdb/config/vax/tm-vax.h gdb/config/vax/tm-vaxbsd.h gdb/config/vax/vax.mt gdb/config/vax/vaxbsd.mh gdb/config/vax/vaxult.mh gdb/config/vax/vaxult2.mh gdb/config/vax/xm-vax.h gdb/config/vax/xm-vaxbsd.h gdb/config/vax/xm-vaxult.h gdb/config/vax/xm-vaxult2.h gdb/config/xm-aix4.h gdb/config/xm-nbsd.h gdb/config/xm-sysv4.h gdb/config/xstormy16/xstormy16.mt gdb/config/z8k/tm-z8k.h gdb/config/z8k/z8k.mt gdb/configure gdb/configure.host gdb/configure.in gdb/configure.tgt gdb/copying.awk gdb/copying.c gdb/core-aout.c gdb/core-regset.c gdb/core-sol2.c gdb/corefile.c gdb/corelow.c gdb/cp-abi.c gdb/cp-abi.h 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/dcache.c gdb/dcache.h gdb/defs.h gdb/delta68-nat.c gdb/demangle.c gdb/dink32-rom.c gdb/doc/ChangeLog gdb/doc/LRS gdb/doc/Makefile.in gdb/doc/a4rc.sed gdb/doc/agentexpr.texi gdb/doc/all-cfg.texi gdb/doc/annotate.texi gdb/doc/configure gdb/doc/configure.in gdb/doc/fdl.texi gdb/doc/gdb.texinfo gdb/doc/gdbint.texinfo gdb/doc/gpl.texi gdb/doc/lpsrc.sed gdb/doc/psrc.sed gdb/doc/refcard.tex gdb/doc/stabs.texinfo gdb/doublest.c gdb/doublest.h gdb/dpx2-nat.c gdb/dsrec.c gdb/dst.h gdb/dstread.c gdb/dve3900-rom.c gdb/dwarf2cfi.c gdb/dwarf2cfi.h gdb/dwarf2read.c gdb/dwarfread.c gdb/elfread.c gdb/environ.c gdb/environ.h gdb/eval.c gdb/event-loop.c gdb/event-loop.h gdb/event-top.c gdb/event-top.h gdb/exc_request.defs gdb/exec.c gdb/expprint.c gdb/expression.h gdb/f-exp.y gdb/f-lang.c gdb/f-lang.h gdb/f-typeprint.c gdb/f-valprint.c gdb/fbsd-proc.c gdb/findvar.c gdb/fork-child.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-stabs.h gdb/gdb.1 gdb/gdb.gdb gdb/gdb.h gdb/gdb_assert.h gdb/gdb_dirent.h gdb/gdb_indent.sh gdb/gdb_locale.h gdb/gdb_obstack.h gdb/gdb_proc_service.h gdb/gdb_regex.h gdb/gdb_stat.h gdb/gdb_string.h gdb/gdb_thread_db.h gdb/gdb_vfork.h gdb/gdb_wait.h gdb/gdbarch.c gdb/gdbarch.h gdb/gdbarch.sh gdb/gdbcmd.h gdb/gdbcore.h gdb/gdbinit.in gdb/gdbserver/ChangeLog gdb/gdbserver/Makefile.in gdb/gdbserver/README gdb/gdbserver/acconfig.h gdb/gdbserver/acinclude.m4 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/gdbserver.1 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-ia64-low.c gdb/gdbserver/linux-low.c gdb/gdbserver/linux-low.h gdb/gdbserver/linux-m68k-low.c gdb/gdbserver/linux-mips-low.c gdb/gdbserver/linux-ppc-low.c gdb/gdbserver/linux-s390-low.c gdb/gdbserver/linux-sh-low.c gdb/gdbserver/linux-x86-64-low.c gdb/gdbserver/low-hppabsd.c gdb/gdbserver/low-lynx.c gdb/gdbserver/low-nbsd.c gdb/gdbserver/low-sim.c gdb/gdbserver/low-sparc.c gdb/gdbserver/low-sun3.c gdb/gdbserver/mem-break.c gdb/gdbserver/mem-break.h gdb/gdbserver/proc-service.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/gdbserver/terminal.h gdb/gdbserver/thread-db.c gdb/gdbserver/utils.c gdb/gdbthread.h gdb/gdbtypes.c gdb/gdbtypes.h gdb/gnu-nat.c gdb/gnu-nat.h gdb/gnu-v2-abi.c gdb/gnu-v3-abi.c gdb/go32-nat.c gdb/gregset.h gdb/h8300-tdep.c gdb/h8500-tdep.c gdb/hp300ux-nat.c gdb/hpacc-abi.c gdb/hppa-tdep.c gdb/hppab-nat.c gdb/hppah-nat.c gdb/hppam3-nat.c gdb/hpread.c gdb/hpux-thread.c gdb/i386-linux-nat.c gdb/i386-linux-tdep.c gdb/i386-linux-tdep.h gdb/i386-nat.c gdb/i386-sol2-tdep.c gdb/i386-stub.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/i386obsd-nat.c gdb/i386v-nat.c gdb/i386v4-nat.c gdb/i387-tdep.c gdb/i387-tdep.h gdb/i960-tdep.c gdb/ia64-aix-nat.c gdb/ia64-aix-tdep.c gdb/ia64-linux-nat.c gdb/ia64-linux-tdep.c gdb/ia64-tdep.c gdb/inf-loop.c gdb/inf-loop.h gdb/infcmd.c gdb/inferior.h gdb/inflow.c gdb/infptrace.c gdb/infrun.c gdb/inftarg.c gdb/infttrace.c gdb/irix4-nat.c gdb/irix5-nat.c gdb/jv-exp.y gdb/jv-lang.c gdb/jv-lang.h gdb/jv-typeprint.c gdb/jv-valprint.c gdb/kod-cisco.c gdb/kod.c gdb/kod.h gdb/language.c gdb/language.h gdb/lin-lwp.c gdb/linespec.c gdb/linespec.h gdb/linux-proc.c gdb/lynx-nat.c gdb/m2-exp.y gdb/m2-lang.c gdb/m2-lang.h gdb/m2-typeprint.c gdb/m2-valprint.c gdb/m3-nat.c gdb/m32r-rom.c gdb/m32r-stub.c gdb/m32r-tdep.c gdb/m68hc11-tdep.c gdb/m68k-stub.c gdb/m68k-tdep.c gdb/m68klinux-nat.c gdb/m68knbsd-nat.c gdb/m68knbsd-tdep.c gdb/m88k-nat.c gdb/m88k-tdep.c gdb/macrocmd.c gdb/macroexp.c gdb/macroexp.h gdb/macroscope.c gdb/macroscope.h gdb/macrotab.c gdb/macrotab.h gdb/main.c gdb/maint.c gdb/mcore-rom.c gdb/mcore-tdep.c gdb/mdebugread.c gdb/mem-break.c gdb/memattr.c gdb/memattr.h gdb/mi/ChangeLog gdb/mi/gdbmi.texinfo gdb/mi/mi-cmd-break.c gdb/mi/mi-cmd-disas.c gdb/mi/mi-cmd-stack.c gdb/mi/mi-cmd-var.c gdb/mi/mi-cmds.c gdb/mi/mi-cmds.h gdb/mi/mi-console.c gdb/mi/mi-console.h gdb/mi/mi-getopt.c gdb/mi/mi-getopt.h gdb/mi/mi-main.c gdb/mi/mi-out.c gdb/mi/mi-out.h gdb/mi/mi-parse.c gdb/mi/mi-parse.h gdb/minimon.h gdb/minsyms.c gdb/mips-irix-tdep.c gdb/mips-linux-nat.c gdb/mips-linux-tdep.c gdb/mips-nat.c gdb/mips-tdep.c gdb/mipsm3-nat.c gdb/mipsnbsd-nat.c gdb/mipsnbsd-tdep.c gdb/mipsnbsd-tdep.h gdb/mipsread.c gdb/mipsv4-nat.c gdb/mn10200-tdep.c gdb/mn10300-tdep.c gdb/mon960-rom.c gdb/monitor.c gdb/monitor.h gdb/msg.defs gdb/msg_reply.defs gdb/nbsd-tdep.c gdb/nbsd-tdep.h gdb/nindy-share/Makefile gdb/nindy-share/Onindy.c gdb/nindy-share/README gdb/nindy-share/VERSION gdb/nindy-share/b.out.h gdb/nindy-share/block_io.h gdb/nindy-share/coff.h gdb/nindy-share/env.h gdb/nindy-share/nindy.c gdb/nindy-share/stop.h gdb/nindy-share/ttyflush.c gdb/nindy-tdep.c gdb/nlm/Makefile.in gdb/nlm/configure gdb/nlm/configure.in gdb/nlm/gdbserve.c gdb/nlm/gdbserve.def gdb/nlm/i386.c gdb/nlm/i386.h gdb/nlm/ppc.c gdb/nlm/ppc.h gdb/nlm/prelude.c gdb/nlmread.c gdb/notify.defs gdb/ns32k-tdep.c gdb/ns32k-tdep.h gdb/ns32knbsd-nat.c gdb/ns32knbsd-tdep.c gdb/objfiles.c gdb/objfiles.h gdb/ocd.c gdb/ocd.h gdb/op50-rom.c gdb/os9kread.c gdb/osabi.c gdb/osabi.h gdb/osf-share/AT386/cma_thread_io.h gdb/osf-share/HP800/cma_thread_io.h gdb/osf-share/README gdb/osf-share/RIOS/cma_thread_io.h gdb/osf-share/cma_attr.h gdb/osf-share/cma_deb_core.h gdb/osf-share/cma_debug_client.h gdb/osf-share/cma_errors.h gdb/osf-share/cma_handle.h gdb/osf-share/cma_init.h gdb/osf-share/cma_list.h gdb/osf-share/cma_mutex.h gdb/osf-share/cma_sched.h gdb/osf-share/cma_semaphore_defs.h gdb/osf-share/cma_sequence.h gdb/osf-share/cma_stack.h gdb/osf-share/cma_stack_int.h gdb/osf-share/cma_tcb_defs.h gdb/osf-share/cma_util.h gdb/osfsolib.c gdb/p-exp.y gdb/p-lang.c gdb/p-lang.h gdb/p-typeprint.c gdb/p-valprint.c gdb/pa64solib.c gdb/pa64solib.h gdb/parse.c gdb/parser-defs.h gdb/ppc-bdm.c gdb/ppc-linux-nat.c gdb/ppc-linux-tdep.c gdb/ppc-sysv-tdep.c gdb/ppc-tdep.h gdb/ppcbug-rom.c gdb/ppcnbsd-nat.c gdb/ppcnbsd-tdep.c gdb/ppcnbsd-tdep.h gdb/printcmd.c gdb/proc-api.c gdb/proc-events.c gdb/proc-flags.c gdb/proc-service.c gdb/proc-utils.h gdb/proc-why.c gdb/process_reply.defs gdb/procfs.c gdb/ptx4-nat.c gdb/rdi-share/Makefile.am gdb/rdi-share/Makefile.in gdb/rdi-share/README.CYGNUS gdb/rdi-share/aclocal.m4 gdb/rdi-share/adp.h gdb/rdi-share/adperr.h gdb/rdi-share/angel.h gdb/rdi-share/angel_bytesex.c gdb/rdi-share/angel_bytesex.h gdb/rdi-share/angel_endian.h gdb/rdi-share/ardi.c gdb/rdi-share/ardi.h gdb/rdi-share/armdbg.h gdb/rdi-share/buffers.h gdb/rdi-share/chandefs.h gdb/rdi-share/channels.h gdb/rdi-share/chanpriv.h gdb/rdi-share/configure gdb/rdi-share/configure.in gdb/rdi-share/crc.c gdb/rdi-share/crc.h gdb/rdi-share/dbg_conf.h gdb/rdi-share/dbg_cp.h gdb/rdi-share/dbg_hif.h gdb/rdi-share/dbg_rdi.h gdb/rdi-share/devclnt.h gdb/rdi-share/devices.h gdb/rdi-share/devsw.c gdb/rdi-share/devsw.h gdb/rdi-share/drivers.c gdb/rdi-share/drivers.h gdb/rdi-share/etherdrv.c gdb/rdi-share/ethernet.h gdb/rdi-share/host.h gdb/rdi-share/hostchan.c gdb/rdi-share/hostchan.h gdb/rdi-share/hsys.c gdb/rdi-share/hsys.h gdb/rdi-share/logging.c gdb/rdi-share/logging.h gdb/rdi-share/msgbuild.c gdb/rdi-share/msgbuild.h gdb/rdi-share/params.c gdb/rdi-share/params.h gdb/rdi-share/rx.c gdb/rdi-share/rxtx.h gdb/rdi-share/serdrv.c gdb/rdi-share/serpardr.c gdb/rdi-share/sys.h gdb/rdi-share/tx.c gdb/rdi-share/unixcomm.c gdb/rdi-share/unixcomm.h gdb/regcache.c gdb/regcache.h gdb/regformats/reg-arm.dat gdb/regformats/reg-i386-linux.dat gdb/regformats/reg-i386.dat gdb/regformats/reg-ia64.dat gdb/regformats/reg-m68k.dat gdb/regformats/reg-mips.dat gdb/regformats/reg-ppc.dat gdb/regformats/reg-s390.dat gdb/regformats/reg-s390x.dat gdb/regformats/reg-sh.dat gdb/regformats/reg-x86-64.dat gdb/regformats/regdat.sh gdb/regformats/regdef.h gdb/remote-array.c gdb/remote-bug.c gdb/remote-e7000.c gdb/remote-es.c gdb/remote-est.c gdb/remote-hms.c gdb/remote-mips.c gdb/remote-nindy.c gdb/remote-nrom.c gdb/remote-os9k.c gdb/remote-rdi.c gdb/remote-rdp.c gdb/remote-sds.c gdb/remote-sim.c gdb/remote-st.c gdb/remote-utils.c gdb/remote-utils.h gdb/remote-vx.c gdb/remote-vx68.c gdb/remote-vx960.c gdb/remote-vxmips.c gdb/remote-vxsparc.c gdb/remote.c gdb/remote.h gdb/reply_mig_hack.awk gdb/rom68k-rom.c gdb/rs6000-nat.c gdb/rs6000-tdep.c gdb/s390-nat.c gdb/s390-tdep.c gdb/saber.suppress gdb/scm-exp.c gdb/scm-lang.c gdb/scm-lang.h gdb/scm-tags.h gdb/scm-valprint.c gdb/ser-e7kpc.c gdb/ser-go32.c gdb/ser-pipe.c gdb/ser-tcp.c gdb/ser-unix.c gdb/ser-unix.h gdb/serial.c gdb/serial.h gdb/sh-stub.c gdb/sh-tdep.c gdb/sh-tdep.h gdb/sh3-rom.c gdb/shnbsd-nat.c gdb/shnbsd-tdep.c gdb/shnbsd-tdep.h gdb/signals/signals.c gdb/sim-regno.h gdb/sol-thread.c gdb/solib-aix5.c gdb/solib-irix.c gdb/solib-legacy.c gdb/solib-osf.c gdb/solib-sunos.c gdb/solib-svr4.c gdb/solib-svr4.h gdb/solib.c gdb/solib.h gdb/solist.h gdb/somread.c gdb/somsolib.c gdb/somsolib.h gdb/source.c gdb/source.h gdb/sparc-linux-nat.c gdb/sparc-nat.c gdb/sparc-stub.c gdb/sparc-tdep.c gdb/sparc64nbsd-nat.c gdb/sparcl-stub.c gdb/sparcl-tdep.c gdb/sparclet-rom.c gdb/sparclet-stub.c gdb/sparcnbsd-nat.c gdb/sparcnbsd-tdep.c gdb/sparcnbsd-tdep.h gdb/srec.h gdb/stabsread.c gdb/stabsread.h gdb/stack.c gdb/standalone.c gdb/std-regs.c gdb/stop-gdb.c gdb/sun3-nat.c gdb/symfile.c gdb/symfile.h gdb/symm-nat.c gdb/symm-tdep.c gdb/symmisc.c gdb/symtab.c gdb/symtab.h gdb/target.c gdb/target.h gdb/terminal.h gdb/testsuite/.gdbinit gdb/testsuite/ChangeLog gdb/testsuite/Makefile.in gdb/testsuite/TODO gdb/testsuite/aclocal.m4 gdb/testsuite/config/abug.exp gdb/testsuite/config/arm-ice.exp gdb/testsuite/config/cfdbug.exp gdb/testsuite/config/cpu32bug.exp gdb/testsuite/config/cygmon.exp gdb/testsuite/config/d10v.exp gdb/testsuite/config/dve.exp gdb/testsuite/config/est.exp gdb/testsuite/config/gdbserver.exp gdb/testsuite/config/h8300.exp gdb/testsuite/config/hmsirom.exp gdb/testsuite/config/hppro.exp gdb/testsuite/config/i386-bozo.exp gdb/testsuite/config/i960.exp gdb/testsuite/config/m32r-stub.exp gdb/testsuite/config/m32r.exp gdb/testsuite/config/m68k-emc.exp gdb/testsuite/config/mips-idt.exp gdb/testsuite/config/mips.exp gdb/testsuite/config/mn10300-eval.exp gdb/testsuite/config/monitor.exp gdb/testsuite/config/netware.exp gdb/testsuite/config/nind.exp gdb/testsuite/config/proelf.exp gdb/testsuite/config/rom68k.exp gdb/testsuite/config/sh.exp gdb/testsuite/config/sid.exp gdb/testsuite/config/sim.exp gdb/testsuite/config/slite.exp gdb/testsuite/config/sparclet.exp gdb/testsuite/config/udi.exp gdb/testsuite/config/unix.exp gdb/testsuite/config/unknown.exp gdb/testsuite/config/vr4300.exp gdb/testsuite/config/vr5000.exp gdb/testsuite/config/vx.exp gdb/testsuite/config/vxworks.exp gdb/testsuite/config/vxworks29k.exp gdb/testsuite/configure gdb/testsuite/configure.in gdb/testsuite/gdb.arch/Makefile.in gdb/testsuite/gdb.arch/altivec-abi.c gdb/testsuite/gdb.arch/altivec-abi.exp gdb/testsuite/gdb.arch/altivec-regs.c gdb/testsuite/gdb.arch/altivec-regs.exp gdb/testsuite/gdb.arch/configure gdb/testsuite/gdb.arch/configure.in gdb/testsuite/gdb.asm/Makefile.in gdb/testsuite/gdb.asm/arm.inc gdb/testsuite/gdb.asm/asm-source.exp gdb/testsuite/gdb.asm/asmsrc1.s gdb/testsuite/gdb.asm/asmsrc2.s gdb/testsuite/gdb.asm/common.inc gdb/testsuite/gdb.asm/configure gdb/testsuite/gdb.asm/configure.in gdb/testsuite/gdb.asm/d10v.inc gdb/testsuite/gdb.asm/i386.inc gdb/testsuite/gdb.asm/m32r.inc gdb/testsuite/gdb.asm/powerpc.inc gdb/testsuite/gdb.asm/s390.inc gdb/testsuite/gdb.asm/sparc.inc gdb/testsuite/gdb.asm/sparc64.inc gdb/testsuite/gdb.asm/v850.inc gdb/testsuite/gdb.asm/x86_64.inc gdb/testsuite/gdb.asm/xstormy16.inc gdb/testsuite/gdb.base/Makefile.in gdb/testsuite/gdb.base/a2-run.exp gdb/testsuite/gdb.base/all-bin.exp gdb/testsuite/gdb.base/all-types.c gdb/testsuite/gdb.base/annota1.c gdb/testsuite/gdb.base/annota1.exp gdb/testsuite/gdb.base/arithmet.exp gdb/testsuite/gdb.base/assign.exp gdb/testsuite/gdb.base/async.c gdb/testsuite/gdb.base/async.exp gdb/testsuite/gdb.base/attach.c gdb/testsuite/gdb.base/attach.exp gdb/testsuite/gdb.base/attach2.c gdb/testsuite/gdb.base/average.c gdb/testsuite/gdb.base/bar.c gdb/testsuite/gdb.base/baz.c gdb/testsuite/gdb.base/bitfields.c gdb/testsuite/gdb.base/bitfields.exp gdb/testsuite/gdb.base/bitops.exp gdb/testsuite/gdb.base/branches.c gdb/testsuite/gdb.base/break.c gdb/testsuite/gdb.base/break.exp gdb/testsuite/gdb.base/call-ar-st.c gdb/testsuite/gdb.base/call-ar-st.exp gdb/testsuite/gdb.base/call-rt-st.c gdb/testsuite/gdb.base/call-rt-st.exp gdb/testsuite/gdb.base/call-strs.c gdb/testsuite/gdb.base/call-strs.exp gdb/testsuite/gdb.base/callfuncs.c gdb/testsuite/gdb.base/callfuncs.exp gdb/testsuite/gdb.base/code-expr.exp gdb/testsuite/gdb.base/commands.exp gdb/testsuite/gdb.base/completion.exp gdb/testsuite/gdb.base/cond-expr.exp gdb/testsuite/gdb.base/condbreak.exp gdb/testsuite/gdb.base/configure gdb/testsuite/gdb.base/configure.in gdb/testsuite/gdb.base/consecutive.c gdb/testsuite/gdb.base/consecutive.exp gdb/testsuite/gdb.base/constvars.c gdb/testsuite/gdb.base/constvars.exp gdb/testsuite/gdb.base/corefile.exp gdb/testsuite/gdb.base/coremaker.c gdb/testsuite/gdb.base/coremaker2.c gdb/testsuite/gdb.base/cvexpr.c gdb/testsuite/gdb.base/cvexpr.exp gdb/testsuite/gdb.base/d10v.ld gdb/testsuite/gdb.base/d10vovly.c gdb/testsuite/gdb.base/dbx.exp gdb/testsuite/gdb.base/default.exp gdb/testsuite/gdb.base/define.exp gdb/testsuite/gdb.base/display.c gdb/testsuite/gdb.base/display.exp gdb/testsuite/gdb.base/dump.c gdb/testsuite/gdb.base/dump.exp gdb/testsuite/gdb.base/echo.exp gdb/testsuite/gdb.base/ena-dis-br.exp gdb/testsuite/gdb.base/ending-run.c gdb/testsuite/gdb.base/ending-run.exp gdb/testsuite/gdb.base/environ.exp gdb/testsuite/gdb.base/eval-skip.exp gdb/testsuite/gdb.base/execd-prog.c gdb/testsuite/gdb.base/exprs.c gdb/testsuite/gdb.base/exprs.exp gdb/testsuite/gdb.base/finish.exp gdb/testsuite/gdb.base/foll-exec.c gdb/testsuite/gdb.base/foll-exec.exp gdb/testsuite/gdb.base/foll-fork.c gdb/testsuite/gdb.base/foll-fork.exp gdb/testsuite/gdb.base/foll-vfork.c gdb/testsuite/gdb.base/foll-vfork.exp gdb/testsuite/gdb.base/foo.c gdb/testsuite/gdb.base/funcargs.c gdb/testsuite/gdb.base/funcargs.exp gdb/testsuite/gdb.base/gcore.c gdb/testsuite/gdb.base/gcore.exp gdb/testsuite/gdb.base/gdbvars.exp gdb/testsuite/gdb.base/grbx.c gdb/testsuite/gdb.base/help.exp gdb/testsuite/gdb.base/huge.c gdb/testsuite/gdb.base/huge.exp gdb/testsuite/gdb.base/info-proc.exp gdb/testsuite/gdb.base/int-type.c gdb/testsuite/gdb.base/interrupt.c gdb/testsuite/gdb.base/interrupt.exp gdb/testsuite/gdb.base/jump.c gdb/testsuite/gdb.base/jump.exp gdb/testsuite/gdb.base/langs.exp gdb/testsuite/gdb.base/langs0.c gdb/testsuite/gdb.base/langs1.c gdb/testsuite/gdb.base/langs1.f gdb/testsuite/gdb.base/langs2.c gdb/testsuite/gdb.base/langs2.cxx gdb/testsuite/gdb.base/list.exp gdb/testsuite/gdb.base/list0.c gdb/testsuite/gdb.base/list0.h gdb/testsuite/gdb.base/list1.c gdb/testsuite/gdb.base/logical.exp gdb/testsuite/gdb.base/long_long.c gdb/testsuite/gdb.base/long_long.exp gdb/testsuite/gdb.base/m32r.ld gdb/testsuite/gdb.base/m32rovly.c gdb/testsuite/gdb.base/macscp.exp gdb/testsuite/gdb.base/macscp1.c gdb/testsuite/gdb.base/macscp2.h gdb/testsuite/gdb.base/macscp3.h gdb/testsuite/gdb.base/macscp4.h gdb/testsuite/gdb.base/maint.exp gdb/testsuite/gdb.base/mips_pro.c gdb/testsuite/gdb.base/mips_pro.exp gdb/testsuite/gdb.base/miscexprs.c gdb/testsuite/gdb.base/miscexprs.exp gdb/testsuite/gdb.base/nodebug.c gdb/testsuite/gdb.base/nodebug.exp gdb/testsuite/gdb.base/opaque.exp gdb/testsuite/gdb.base/opaque0.c gdb/testsuite/gdb.base/opaque1.c gdb/testsuite/gdb.base/overlays.c gdb/testsuite/gdb.base/overlays.exp gdb/testsuite/gdb.base/ovlymgr.c gdb/testsuite/gdb.base/ovlymgr.h gdb/testsuite/gdb.base/page.exp gdb/testsuite/gdb.base/pointers.c gdb/testsuite/gdb.base/pointers.exp gdb/testsuite/gdb.base/printcmds.c gdb/testsuite/gdb.base/printcmds.exp gdb/testsuite/gdb.base/ptype.c gdb/testsuite/gdb.base/ptype.exp gdb/testsuite/gdb.base/radix.exp gdb/testsuite/gdb.base/readline.exp gdb/testsuite/gdb.base/recurse.c gdb/testsuite/gdb.base/recurse.exp gdb/testsuite/gdb.base/regs.exp gdb/testsuite/gdb.base/relational.exp gdb/testsuite/gdb.base/relocate.c gdb/testsuite/gdb.base/relocate.exp gdb/testsuite/gdb.base/remote.c gdb/testsuite/gdb.base/remote.exp gdb/testsuite/gdb.base/reread.exp gdb/testsuite/gdb.base/reread1.c gdb/testsuite/gdb.base/reread2.c gdb/testsuite/gdb.base/restore.c gdb/testsuite/gdb.base/restore.exp gdb/testsuite/gdb.base/return.c gdb/testsuite/gdb.base/return.exp gdb/testsuite/gdb.base/return2.c gdb/testsuite/gdb.base/return2.exp gdb/testsuite/gdb.base/run.c gdb/testsuite/gdb.base/scope.exp gdb/testsuite/gdb.base/scope0.c gdb/testsuite/gdb.base/scope1.c gdb/testsuite/gdb.base/sect-cmd.exp gdb/testsuite/gdb.base/selftest.exp gdb/testsuite/gdb.base/setshow.c gdb/testsuite/gdb.base/setshow.exp gdb/testsuite/gdb.base/setvar.c gdb/testsuite/gdb.base/setvar.exp gdb/testsuite/gdb.base/shlib-call.exp gdb/testsuite/gdb.base/shmain.c gdb/testsuite/gdb.base/shr1.c gdb/testsuite/gdb.base/shr2.c gdb/testsuite/gdb.base/sigall.c gdb/testsuite/gdb.base/sigall.exp gdb/testsuite/gdb.base/signals.c gdb/testsuite/gdb.base/signals.exp gdb/testsuite/gdb.base/sizeof.c gdb/testsuite/gdb.base/sizeof.exp gdb/testsuite/gdb.base/so-impl-ld.c gdb/testsuite/gdb.base/so-impl-ld.exp gdb/testsuite/gdb.base/so-indr-cl.c gdb/testsuite/gdb.base/so-indr-cl.exp gdb/testsuite/gdb.base/solib.c gdb/testsuite/gdb.base/solib.exp gdb/testsuite/gdb.base/solib1.c gdb/testsuite/gdb.base/solib2.c gdb/testsuite/gdb.base/ss.h gdb/testsuite/gdb.base/step-line.c gdb/testsuite/gdb.base/step-line.exp gdb/testsuite/gdb.base/step-line.inp gdb/testsuite/gdb.base/step-test.c gdb/testsuite/gdb.base/step-test.exp gdb/testsuite/gdb.base/structs.c gdb/testsuite/gdb.base/structs.exp gdb/testsuite/gdb.base/structs2.c gdb/testsuite/gdb.base/structs2.exp gdb/testsuite/gdb.base/sum.c gdb/testsuite/gdb.base/term.exp gdb/testsuite/gdb.base/twice.c gdb/testsuite/gdb.base/twice.exp gdb/testsuite/gdb.base/varargs.c gdb/testsuite/gdb.base/varargs.exp gdb/testsuite/gdb.base/vforked-prog.c gdb/testsuite/gdb.base/volatile.exp gdb/testsuite/gdb.base/watchpoint.c gdb/testsuite/gdb.base/watchpoint.exp gdb/testsuite/gdb.base/whatis-exp.exp gdb/testsuite/gdb.base/whatis.c gdb/testsuite/gdb.base/whatis.exp gdb/testsuite/gdb.c++/Makefile.in gdb/testsuite/gdb.c++/ambiguous.cc gdb/testsuite/gdb.c++/ambiguous.exp gdb/testsuite/gdb.c++/annota2.cc gdb/testsuite/gdb.c++/annota2.exp gdb/testsuite/gdb.c++/anon-union.cc gdb/testsuite/gdb.c++/anon-union.exp gdb/testsuite/gdb.c++/classes.exp gdb/testsuite/gdb.c++/configure gdb/testsuite/gdb.c++/configure.in gdb/testsuite/gdb.c++/cplusfuncs.cc gdb/testsuite/gdb.c++/cplusfuncs.exp gdb/testsuite/gdb.c++/ctti.exp gdb/testsuite/gdb.c++/cttiadd.cc gdb/testsuite/gdb.c++/cttiadd1.cc gdb/testsuite/gdb.c++/cttiadd2.cc gdb/testsuite/gdb.c++/cttiadd3.cc gdb/testsuite/gdb.c++/demangle.exp gdb/testsuite/gdb.c++/derivation.cc gdb/testsuite/gdb.c++/derivation.exp gdb/testsuite/gdb.c++/hang.H gdb/testsuite/gdb.c++/hang.exp gdb/testsuite/gdb.c++/hang1.C gdb/testsuite/gdb.c++/hang2.C gdb/testsuite/gdb.c++/hang3.C gdb/testsuite/gdb.c++/inherit.exp gdb/testsuite/gdb.c++/local.cc gdb/testsuite/gdb.c++/local.exp gdb/testsuite/gdb.c++/m-data.cc gdb/testsuite/gdb.c++/m-data.exp gdb/testsuite/gdb.c++/m-static.cc gdb/testsuite/gdb.c++/m-static.exp gdb/testsuite/gdb.c++/member-ptr.cc gdb/testsuite/gdb.c++/member-ptr.exp gdb/testsuite/gdb.c++/method.cc gdb/testsuite/gdb.c++/method.exp gdb/testsuite/gdb.c++/misc.cc gdb/testsuite/gdb.c++/misc.exp gdb/testsuite/gdb.c++/namespace.cc gdb/testsuite/gdb.c++/namespace.exp gdb/testsuite/gdb.c++/overload.cc gdb/testsuite/gdb.c++/overload.exp gdb/testsuite/gdb.c++/ovldbreak.cc gdb/testsuite/gdb.c++/ovldbreak.exp gdb/testsuite/gdb.c++/ref-types.cc gdb/testsuite/gdb.c++/ref-types.exp gdb/testsuite/gdb.c++/templates.cc gdb/testsuite/gdb.c++/templates.exp gdb/testsuite/gdb.c++/try_catch.cc gdb/testsuite/gdb.c++/try_catch.exp gdb/testsuite/gdb.c++/userdef.cc gdb/testsuite/gdb.c++/userdef.exp gdb/testsuite/gdb.c++/virtfunc.cc gdb/testsuite/gdb.c++/virtfunc.exp gdb/testsuite/gdb.chill/ChangeLog gdb/testsuite/gdb.chill/Makefile.in gdb/testsuite/gdb.chill/builtins.ch gdb/testsuite/gdb.chill/builtins.exp gdb/testsuite/gdb.chill/callch.ch gdb/testsuite/gdb.chill/callch.exp gdb/testsuite/gdb.chill/chexp.exp gdb/testsuite/gdb.chill/chillvars.ch gdb/testsuite/gdb.chill/chillvars.exp gdb/testsuite/gdb.chill/configure gdb/testsuite/gdb.chill/configure.in gdb/testsuite/gdb.chill/enum.ch gdb/testsuite/gdb.chill/enum.exp gdb/testsuite/gdb.chill/func1.ch gdb/testsuite/gdb.chill/gch1041.ch gdb/testsuite/gdb.chill/gch1041.exp gdb/testsuite/gdb.chill/gch1272.ch gdb/testsuite/gdb.chill/gch1272.exp gdb/testsuite/gdb.chill/gch1280.ch gdb/testsuite/gdb.chill/gch1280.exp gdb/testsuite/gdb.chill/gch922.ch gdb/testsuite/gdb.chill/gch922.exp gdb/testsuite/gdb.chill/gch981.ch gdb/testsuite/gdb.chill/gch981.exp gdb/testsuite/gdb.chill/misc.ch gdb/testsuite/gdb.chill/misc.exp gdb/testsuite/gdb.chill/powerset.ch gdb/testsuite/gdb.chill/powerset.exp gdb/testsuite/gdb.chill/pr-4975-grt.ch gdb/testsuite/gdb.chill/pr-4975.ch gdb/testsuite/gdb.chill/pr-4975.exp gdb/testsuite/gdb.chill/pr-5016.ch gdb/testsuite/gdb.chill/pr-5016.exp gdb/testsuite/gdb.chill/pr-5020.ch gdb/testsuite/gdb.chill/pr-5020.exp gdb/testsuite/gdb.chill/pr-5022.ch gdb/testsuite/gdb.chill/pr-5022.exp gdb/testsuite/gdb.chill/pr-5646-grt.ch gdb/testsuite/gdb.chill/pr-5646.ch gdb/testsuite/gdb.chill/pr-5646.exp gdb/testsuite/gdb.chill/pr-5984.ch gdb/testsuite/gdb.chill/pr-5984.exp gdb/testsuite/gdb.chill/pr-6292.ch gdb/testsuite/gdb.chill/pr-6292.exp gdb/testsuite/gdb.chill/pr-6632-grt.ch gdb/testsuite/gdb.chill/pr-6632.ch gdb/testsuite/gdb.chill/pr-6632.exp gdb/testsuite/gdb.chill/pr-8134.exp gdb/testsuite/gdb.chill/pr-8136.ch gdb/testsuite/gdb.chill/pr-8136.exp gdb/testsuite/gdb.chill/pr-8405.ch gdb/testsuite/gdb.chill/pr-8405.exp gdb/testsuite/gdb.chill/pr-8742.ch gdb/testsuite/gdb.chill/pr-8742.exp gdb/testsuite/gdb.chill/pr-8894-grt.ch gdb/testsuite/gdb.chill/pr-8894.ch gdb/testsuite/gdb.chill/pr-8894.exp gdb/testsuite/gdb.chill/pr-9095.ch gdb/testsuite/gdb.chill/pr-9095.exp gdb/testsuite/gdb.chill/pr-9946.ch gdb/testsuite/gdb.chill/pr-9946.exp gdb/testsuite/gdb.chill/result.ch gdb/testsuite/gdb.chill/result.exp gdb/testsuite/gdb.chill/string.ch gdb/testsuite/gdb.chill/string.exp gdb/testsuite/gdb.chill/tests1.ch gdb/testsuite/gdb.chill/tests1.exp gdb/testsuite/gdb.chill/tests2.ch gdb/testsuite/gdb.chill/tests2.exp gdb/testsuite/gdb.chill/tuples.ch gdb/testsuite/gdb.chill/tuples.exp gdb/testsuite/gdb.chill/xstruct-grt.ch gdb/testsuite/gdb.chill/xstruct.ch gdb/testsuite/gdb.chill/xstruct.exp gdb/testsuite/gdb.disasm/Makefile.in gdb/testsuite/gdb.disasm/am33.exp gdb/testsuite/gdb.disasm/am33.s gdb/testsuite/gdb.disasm/configure gdb/testsuite/gdb.disasm/configure.in gdb/testsuite/gdb.disasm/h8300s.exp gdb/testsuite/gdb.disasm/h8300s.s gdb/testsuite/gdb.disasm/hppa.exp gdb/testsuite/gdb.disasm/hppa.s gdb/testsuite/gdb.disasm/mn10200.exp gdb/testsuite/gdb.disasm/mn10200.s gdb/testsuite/gdb.disasm/mn10300.exp gdb/testsuite/gdb.disasm/mn10300.s gdb/testsuite/gdb.disasm/sh3.exp gdb/testsuite/gdb.disasm/sh3.s gdb/testsuite/gdb.fortran/exprs.exp gdb/testsuite/gdb.fortran/types.exp gdb/testsuite/gdb.gdb/xfullpath.exp gdb/testsuite/gdb.hp/Makefile.in gdb/testsuite/gdb.hp/configure gdb/testsuite/gdb.hp/configure.in gdb/testsuite/gdb.hp/gdb.aCC/Makefile.in gdb/testsuite/gdb.hp/gdb.aCC/configure gdb/testsuite/gdb.hp/gdb.aCC/configure.in gdb/testsuite/gdb.hp/gdb.aCC/exception.cc gdb/testsuite/gdb.hp/gdb.aCC/exception.exp gdb/testsuite/gdb.hp/gdb.aCC/optimize.c gdb/testsuite/gdb.hp/gdb.aCC/optimize.exp gdb/testsuite/gdb.hp/gdb.aCC/run.c gdb/testsuite/gdb.hp/gdb.aCC/watch-cmd.exp gdb/testsuite/gdb.hp/gdb.base-hp/Makefile.in gdb/testsuite/gdb.hp/gdb.base-hp/callfwmall.c gdb/testsuite/gdb.hp/gdb.base-hp/callfwmall.exp gdb/testsuite/gdb.hp/gdb.base-hp/configure gdb/testsuite/gdb.hp/gdb.base-hp/configure.in gdb/testsuite/gdb.hp/gdb.base-hp/dollar.c gdb/testsuite/gdb.hp/gdb.base-hp/dollar.exp gdb/testsuite/gdb.hp/gdb.base-hp/genso-thresh.c gdb/testsuite/gdb.hp/gdb.base-hp/hwwatchbus.c gdb/testsuite/gdb.hp/gdb.base-hp/hwwatchbus.exp gdb/testsuite/gdb.hp/gdb.base-hp/pxdb.c gdb/testsuite/gdb.hp/gdb.base-hp/pxdb.exp gdb/testsuite/gdb.hp/gdb.base-hp/reg-pa64.exp gdb/testsuite/gdb.hp/gdb.base-hp/reg-pa64.s gdb/testsuite/gdb.hp/gdb.base-hp/reg.exp gdb/testsuite/gdb.hp/gdb.base-hp/reg.s gdb/testsuite/gdb.hp/gdb.base-hp/sized-enum.c gdb/testsuite/gdb.hp/gdb.base-hp/sized-enum.exp gdb/testsuite/gdb.hp/gdb.base-hp/so-thresh.exp gdb/testsuite/gdb.hp/gdb.base-hp/so-thresh.mk gdb/testsuite/gdb.hp/gdb.base-hp/so-thresh.sh gdb/testsuite/gdb.hp/gdb.compat/Makefile.in gdb/testsuite/gdb.hp/gdb.compat/average.c gdb/testsuite/gdb.hp/gdb.compat/configure gdb/testsuite/gdb.hp/gdb.compat/configure.in gdb/testsuite/gdb.hp/gdb.compat/sum.c gdb/testsuite/gdb.hp/gdb.compat/xdb.c gdb/testsuite/gdb.hp/gdb.compat/xdb0.c gdb/testsuite/gdb.hp/gdb.compat/xdb0.h gdb/testsuite/gdb.hp/gdb.compat/xdb1.c gdb/testsuite/gdb.hp/gdb.compat/xdb1.exp gdb/testsuite/gdb.hp/gdb.compat/xdb2.exp gdb/testsuite/gdb.hp/gdb.compat/xdb3.exp gdb/testsuite/gdb.hp/gdb.defects/Makefile.in gdb/testsuite/gdb.hp/gdb.defects/bs14602.c gdb/testsuite/gdb.hp/gdb.defects/bs14602.exp gdb/testsuite/gdb.hp/gdb.defects/bs15503.cc gdb/testsuite/gdb.hp/gdb.defects/bs15503.exp gdb/testsuite/gdb.hp/gdb.defects/configure gdb/testsuite/gdb.hp/gdb.defects/configure.in gdb/testsuite/gdb.hp/gdb.defects/solib-d.c gdb/testsuite/gdb.hp/gdb.defects/solib-d.exp gdb/testsuite/gdb.hp/gdb.defects/solib-d1.c gdb/testsuite/gdb.hp/gdb.defects/solib-d2.c gdb/testsuite/gdb.hp/gdb.objdbg/Makefile.in gdb/testsuite/gdb.hp/gdb.objdbg/configure gdb/testsuite/gdb.hp/gdb.objdbg/configure.in gdb/testsuite/gdb.hp/gdb.objdbg/objdbg01.exp gdb/testsuite/gdb.hp/gdb.objdbg/objdbg01/x1.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg01/x2.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg01/x3.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg01/x3.h gdb/testsuite/gdb.hp/gdb.objdbg/objdbg02.exp gdb/testsuite/gdb.hp/gdb.objdbg/objdbg02/x1.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg02/x2.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg02/x3.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg03.exp gdb/testsuite/gdb.hp/gdb.objdbg/objdbg03/x1.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg03/x2.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg03/x3.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg04.exp gdb/testsuite/gdb.hp/gdb.objdbg/objdbg04/x.h gdb/testsuite/gdb.hp/gdb.objdbg/objdbg04/x1.cc gdb/testsuite/gdb.hp/gdb.objdbg/objdbg04/x2.cc gdb/testsuite/gdb.hp/gdb.objdbg/tools/symaddr gdb/testsuite/gdb.hp/gdb.objdbg/tools/symaddr.pa64 gdb/testsuite/gdb.hp/gdb.objdbg/tools/test-objdbg.cc gdb/testsuite/gdb.hp/tools/odump gdb/testsuite/gdb.java/Makefile.in gdb/testsuite/gdb.java/configure gdb/testsuite/gdb.java/configure.in gdb/testsuite/gdb.java/jmisc.exp gdb/testsuite/gdb.java/jmisc.java gdb/testsuite/gdb.java/jmisc1.exp gdb/testsuite/gdb.java/jmisc2.exp gdb/testsuite/gdb.java/jv-exp.exp gdb/testsuite/gdb.java/jv-print.exp gdb/testsuite/gdb.mi/ChangeLog gdb/testsuite/gdb.mi/Makefile.in gdb/testsuite/gdb.mi/basics.c gdb/testsuite/gdb.mi/configure gdb/testsuite/gdb.mi/configure.in gdb/testsuite/gdb.mi/gdb680.exp gdb/testsuite/gdb.mi/mi-basics.exp gdb/testsuite/gdb.mi/mi-break.exp gdb/testsuite/gdb.mi/mi-console.c gdb/testsuite/gdb.mi/mi-console.exp gdb/testsuite/gdb.mi/mi-disassemble.exp gdb/testsuite/gdb.mi/mi-eval.exp gdb/testsuite/gdb.mi/mi-hack-cli.exp gdb/testsuite/gdb.mi/mi-read-memory.c gdb/testsuite/gdb.mi/mi-read-memory.exp gdb/testsuite/gdb.mi/mi-regs.exp gdb/testsuite/gdb.mi/mi-return.exp gdb/testsuite/gdb.mi/mi-simplerun.exp gdb/testsuite/gdb.mi/mi-stack.exp gdb/testsuite/gdb.mi/mi-stepi.exp gdb/testsuite/gdb.mi/mi-until.exp gdb/testsuite/gdb.mi/mi-var-block.exp gdb/testsuite/gdb.mi/mi-var-child.exp gdb/testsuite/gdb.mi/mi-var-cmd.exp gdb/testsuite/gdb.mi/mi-var-display.exp gdb/testsuite/gdb.mi/mi-watch.exp gdb/testsuite/gdb.mi/mi0-basics.exp gdb/testsuite/gdb.mi/mi0-break.exp gdb/testsuite/gdb.mi/mi0-console.exp gdb/testsuite/gdb.mi/mi0-disassemble.exp gdb/testsuite/gdb.mi/mi0-eval.exp gdb/testsuite/gdb.mi/mi0-hack-cli.exp gdb/testsuite/gdb.mi/mi0-read-memory.exp gdb/testsuite/gdb.mi/mi0-regs.exp gdb/testsuite/gdb.mi/mi0-return.exp gdb/testsuite/gdb.mi/mi0-simplerun.exp gdb/testsuite/gdb.mi/mi0-stack.exp gdb/testsuite/gdb.mi/mi0-stepi.exp gdb/testsuite/gdb.mi/mi0-until.exp gdb/testsuite/gdb.mi/mi0-var-block.exp gdb/testsuite/gdb.mi/mi0-var-child.exp gdb/testsuite/gdb.mi/mi0-var-cmd.exp gdb/testsuite/gdb.mi/mi0-var-display.exp gdb/testsuite/gdb.mi/mi0-watch.exp gdb/testsuite/gdb.mi/testcmds gdb/testsuite/gdb.mi/until.c gdb/testsuite/gdb.mi/var-cmd.c gdb/testsuite/gdb.stabs/Makefile.in gdb/testsuite/gdb.stabs/aout.sed gdb/testsuite/gdb.stabs/configure gdb/testsuite/gdb.stabs/configure.in gdb/testsuite/gdb.stabs/ecoff.sed gdb/testsuite/gdb.stabs/hppa.sed gdb/testsuite/gdb.stabs/weird.def gdb/testsuite/gdb.stabs/weird.exp gdb/testsuite/gdb.stabs/xcoff.sed gdb/testsuite/gdb.threads/Makefile.in gdb/testsuite/gdb.threads/config.in gdb/testsuite/gdb.threads/configure gdb/testsuite/gdb.threads/configure.in gdb/testsuite/gdb.threads/gcore-thread.exp gdb/testsuite/gdb.threads/killed.c gdb/testsuite/gdb.threads/killed.exp gdb/testsuite/gdb.threads/linux-dp.c gdb/testsuite/gdb.threads/linux-dp.exp gdb/testsuite/gdb.threads/print-threads.c gdb/testsuite/gdb.threads/print-threads.exp gdb/testsuite/gdb.threads/pthreads.c gdb/testsuite/gdb.threads/pthreads.exp gdb/testsuite/gdb.threads/schedlock.c gdb/testsuite/gdb.threads/schedlock.exp gdb/testsuite/gdb.threads/step.c gdb/testsuite/gdb.threads/step.exp gdb/testsuite/gdb.threads/step2.exp gdb/testsuite/gdb.trace/Makefile.in gdb/testsuite/gdb.trace/actions.c gdb/testsuite/gdb.trace/actions.exp gdb/testsuite/gdb.trace/backtrace.exp gdb/testsuite/gdb.trace/circ.c gdb/testsuite/gdb.trace/circ.exp gdb/testsuite/gdb.trace/collection.c gdb/testsuite/gdb.trace/collection.exp gdb/testsuite/gdb.trace/configure gdb/testsuite/gdb.trace/configure.in gdb/testsuite/gdb.trace/deltrace.exp gdb/testsuite/gdb.trace/gdb_c_test.c gdb/testsuite/gdb.trace/infotrace.exp gdb/testsuite/gdb.trace/limits.c gdb/testsuite/gdb.trace/limits.exp gdb/testsuite/gdb.trace/packetlen.exp gdb/testsuite/gdb.trace/passc-dyn.exp gdb/testsuite/gdb.trace/passcount.exp gdb/testsuite/gdb.trace/report.exp gdb/testsuite/gdb.trace/save-trace.exp gdb/testsuite/gdb.trace/tfind.exp gdb/testsuite/gdb.trace/tracecmd.exp gdb/testsuite/gdb.trace/while-dyn.exp gdb/testsuite/gdb.trace/while-stepping.exp gdb/testsuite/lib/compiler.c gdb/testsuite/lib/compiler.cc gdb/testsuite/lib/emc-support.exp gdb/testsuite/lib/gdb.exp gdb/testsuite/lib/insight-support.exp gdb/testsuite/lib/java.exp gdb/testsuite/lib/mi-support.exp gdb/testsuite/lib/trace-support.exp gdb/thread-db.c gdb/thread.c gdb/top.c gdb/top.h gdb/tracepoint.c gdb/tracepoint.h gdb/tui/ChangeLog gdb/tui/tui-file.c gdb/tui/tui-file.h gdb/tui/tui-hooks.c gdb/tui/tui-out.c gdb/tui/tui.c gdb/tui/tui.h gdb/tui/tuiCommand.c gdb/tui/tuiCommand.h gdb/tui/tuiData.c gdb/tui/tuiData.h gdb/tui/tuiDataWin.c gdb/tui/tuiDataWin.h gdb/tui/tuiDisassem.c gdb/tui/tuiDisassem.h gdb/tui/tuiGeneralWin.c gdb/tui/tuiGeneralWin.h gdb/tui/tuiIO.c gdb/tui/tuiIO.h gdb/tui/tuiLayout.c gdb/tui/tuiLayout.h gdb/tui/tuiRegs.c gdb/tui/tuiRegs.h gdb/tui/tuiSource.c gdb/tui/tuiSource.h gdb/tui/tuiSourceWin.c gdb/tui/tuiSourceWin.h gdb/tui/tuiStack.c gdb/tui/tuiStack.h gdb/tui/tuiWin.c gdb/tui/tuiWin.h gdb/typeprint.c gdb/typeprint.h gdb/ui-file.c gdb/ui-file.h gdb/ui-out.c gdb/ui-out.h gdb/utils.c gdb/uw-thread.c gdb/v850-tdep.c gdb/v850ice.c gdb/valarith.c gdb/valops.c gdb/valprint.c gdb/valprint.h gdb/value.h gdb/values.c gdb/varobj.c gdb/varobj.h gdb/vax-tdep.c gdb/vax-tdep.h gdb/version.h gdb/version.in gdb/vx-share/README gdb/vx-share/dbgRpcLib.h gdb/vx-share/ptrace.h gdb/vx-share/regPacket.h gdb/vx-share/vxTypes.h gdb/vx-share/vxWorks.h gdb/vx-share/wait.h gdb/vx-share/xdr_ld.c gdb/vx-share/xdr_ld.h gdb/vx-share/xdr_ptrace.c gdb/vx-share/xdr_ptrace.h gdb/vx-share/xdr_rdb.c gdb/vx-share/xdr_rdb.h gdb/w89k-rom.c gdb/win32-nat.c gdb/wince-stub.c gdb/wince-stub.h gdb/wince.c gdb/wrapper.c gdb/wrapper.h gdb/x86-64-linux-nat.c gdb/x86-64-linux-tdep.c gdb/x86-64-tdep.c gdb/x86-64-tdep.h gdb/xcoffread.c gdb/xcoffsolib.c gdb/xcoffsolib.h gdb/xmodem.c gdb/xmodem.h gdb/xstormy16-tdep.c gdb/z8k-tdep.c mmalloc/COPYING.LIB mmalloc/ChangeLog mmalloc/MAINTAINERS mmalloc/Makefile.in mmalloc/TODO mmalloc/acinclude.m4 mmalloc/aclocal.m4 mmalloc/attach.c mmalloc/configure mmalloc/configure.in mmalloc/detach.c mmalloc/keys.c mmalloc/mcalloc.c mmalloc/mfree.c mmalloc/mm.c mmalloc/mmalloc.c mmalloc/mmalloc.h mmalloc/mmalloc.texi mmalloc/mmap-sup.c mmalloc/mmcheck.c mmalloc/mmemalign.c mmalloc/mmprivate.h mmalloc/mmstats.c mmalloc/mmtrace.awk mmalloc/mmtrace.c mmalloc/mrealloc.c mmalloc/mvalloc.c mmalloc/sbrk-sup.c readline/CHANGELOG readline/CHANGES readline/COPYING readline/ChangeLog.gdb readline/INSTALL readline/MANIFEST readline/Makefile.in readline/README readline/USAGE readline/acconfig.h readline/aclocal.m4 readline/ansi_stdlib.h readline/bind.c readline/callback.c readline/chardefs.h readline/complete.c readline/config.h.bot readline/config.h.in readline/configure readline/configure.in readline/cross-build/cygwin.cache readline/display.c readline/doc/ChangeLog.gdb readline/doc/Makefile.in readline/doc/hist.texinfo readline/doc/hstech.texinfo readline/doc/hsuser.texinfo readline/doc/inc-hist.texinfo readline/doc/manvers.texinfo readline/doc/readline.3 readline/doc/rlman.texinfo readline/doc/rltech.texinfo readline/doc/rluser.texinfo readline/doc/rluserman.texinfo readline/doc/texi2dvi readline/doc/texi2html readline/emacs_keymap.c readline/examples/ChangeLog.gdb readline/examples/Inputrc readline/examples/Makefile.in readline/examples/excallback.c readline/examples/fileman.c readline/examples/histexamp.c readline/examples/manexamp.c readline/examples/rl.c readline/examples/rlfe.c readline/examples/rltest.c readline/examples/rlversion.c readline/funmap.c readline/histexpand.c readline/histfile.c readline/histlib.h readline/history.c readline/history.h readline/histsearch.c readline/input.c readline/isearch.c readline/keymaps.c readline/keymaps.h readline/kill.c readline/macro.c readline/nls.c readline/parens.c readline/posixdir.h readline/posixjmp.h readline/posixstat.h readline/readline.c readline/readline.h readline/rlconf.h readline/rldefs.h readline/rlprivate.h readline/rlshell.h readline/rlstdc.h readline/rltty.c readline/rltty.h readline/rlwinsize.h readline/savestring.c readline/search.c readline/shell.c readline/shlib/Makefile.in readline/signals.c readline/support/config.guess readline/support/config.sub readline/support/install.sh readline/support/mkdirs readline/support/mkdist readline/support/shlib-install readline/support/shobj-conf readline/tcap.h readline/terminal.c readline/tilde.c readline/tilde.h readline/undo.c readline/util.c readline/vi_keymap.c readline/vi_mode.c readline/xmalloc.c readline/xmalloc.h sim/ChangeLog sim/MAINTAINERS sim/Makefile.in sim/README-HACKING sim/arm/COPYING sim/arm/ChangeLog sim/arm/Makefile.in sim/arm/README.Cygnus sim/arm/acconfig.h sim/arm/armcopro.c sim/arm/armdefs.h sim/arm/armemu.c sim/arm/armemu.h sim/arm/armfpe.h sim/arm/arminit.c sim/arm/armopts.h sim/arm/armos.c sim/arm/armos.h sim/arm/armrdi.c sim/arm/armsupp.c sim/arm/armvirt.c sim/arm/bag.c sim/arm/bag.h sim/arm/communicate.c sim/arm/communicate.h sim/arm/config.in sim/arm/configure sim/arm/configure.in sim/arm/dbg_conf.h sim/arm/dbg_cp.h sim/arm/dbg_hif.h sim/arm/dbg_rdi.h sim/arm/gdbhost.c sim/arm/gdbhost.h sim/arm/kid.c sim/arm/main.c sim/arm/parent.c sim/arm/tconfig.in sim/arm/thumbemu.c sim/arm/wrapper.c sim/common/ChangeLog sim/common/Make-common.in sim/common/Makefile.in sim/common/acconfig.h sim/common/aclocal.m4 sim/common/callback.c sim/common/cgen-accfp.c sim/common/cgen-cpu.h sim/common/cgen-defs.h sim/common/cgen-engine.h sim/common/cgen-fpu.c sim/common/cgen-fpu.h sim/common/cgen-mem.h sim/common/cgen-ops.h sim/common/cgen-par.c sim/common/cgen-par.h sim/common/cgen-run.c sim/common/cgen-scache.c sim/common/cgen-scache.h sim/common/cgen-sim.h sim/common/cgen-trace.c sim/common/cgen-trace.h sim/common/cgen-types.h sim/common/cgen-utils.c sim/common/cgen.sh sim/common/config.in sim/common/configure sim/common/configure.in sim/common/dv-core.c sim/common/dv-glue.c sim/common/dv-pal.c sim/common/dv-sockser.c sim/common/dv-sockser.h sim/common/gdbinit.in sim/common/genmloop.sh sim/common/gennltvals.sh sim/common/gentmap.c sim/common/gentvals.sh sim/common/hw-alloc.c sim/common/hw-alloc.h sim/common/hw-base.c sim/common/hw-base.h sim/common/hw-device.c sim/common/hw-device.h sim/common/hw-events.c sim/common/hw-events.h sim/common/hw-handles.c sim/common/hw-handles.h sim/common/hw-instances.c sim/common/hw-instances.h sim/common/hw-main.h sim/common/hw-ports.c sim/common/hw-ports.h sim/common/hw-properties.c sim/common/hw-properties.h sim/common/hw-tree.c sim/common/hw-tree.h sim/common/nltvals.def sim/common/nrun.c sim/common/run-sim.h sim/common/run.1 sim/common/run.c sim/common/sim-abort.c sim/common/sim-alu.h sim/common/sim-arange.c sim/common/sim-arange.h sim/common/sim-assert.h sim/common/sim-base.h sim/common/sim-basics.h sim/common/sim-bits.c sim/common/sim-bits.h sim/common/sim-break.c sim/common/sim-break.h sim/common/sim-config.c sim/common/sim-config.h sim/common/sim-core.c sim/common/sim-core.h sim/common/sim-cpu.c sim/common/sim-cpu.h sim/common/sim-endian.c sim/common/sim-endian.h sim/common/sim-engine.c sim/common/sim-engine.h sim/common/sim-events.c sim/common/sim-events.h sim/common/sim-fpu.c sim/common/sim-fpu.h sim/common/sim-hload.c sim/common/sim-hrw.c sim/common/sim-hw.c sim/common/sim-hw.h sim/common/sim-info.c sim/common/sim-inline.c sim/common/sim-inline.h sim/common/sim-io.c sim/common/sim-io.h sim/common/sim-load.c sim/common/sim-memopt.c sim/common/sim-memopt.h sim/common/sim-model.c sim/common/sim-model.h sim/common/sim-module.c sim/common/sim-module.h sim/common/sim-n-bits.h sim/common/sim-n-core.h sim/common/sim-n-endian.h sim/common/sim-options.c sim/common/sim-options.h sim/common/sim-profile.c sim/common/sim-profile.h sim/common/sim-reason.c sim/common/sim-reg.c sim/common/sim-resume.c sim/common/sim-run.c sim/common/sim-signal.c sim/common/sim-signal.h sim/common/sim-stop.c sim/common/sim-trace.c sim/common/sim-trace.h sim/common/sim-types.h sim/common/sim-utils.c sim/common/sim-utils.h sim/common/sim-watch.c sim/common/sim-watch.h sim/common/syscall.c sim/common/tconfig.in sim/configure sim/configure.in sim/d10v/ChangeLog sim/d10v/Makefile.in sim/d10v/acconfig.h sim/d10v/config.in sim/d10v/configure sim/d10v/configure.in sim/d10v/d10v_sim.h sim/d10v/endian.c sim/d10v/gencode.c sim/d10v/interp.c sim/d10v/simops.c sim/d30v/ChangeLog sim/d30v/Makefile.in sim/d30v/acconfig.h sim/d30v/alu.h sim/d30v/config.in sim/d30v/configure sim/d30v/configure.in 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/d30v/tconfig.in sim/erc32/ChangeLog sim/erc32/Makefile.in sim/erc32/NEWS sim/erc32/README.erc32 sim/erc32/README.gdb sim/erc32/README.sis sim/erc32/acconfig.h sim/erc32/config.in sim/erc32/configure sim/erc32/configure.in sim/erc32/end.c sim/erc32/erc32.c sim/erc32/exec.c sim/erc32/float.c sim/erc32/func.c sim/erc32/help.c sim/erc32/interf.c sim/erc32/sis.c sim/erc32/sis.h sim/erc32/startsim sim/fr30/ChangeLog sim/fr30/Makefile.in sim/fr30/README sim/fr30/TODO sim/fr30/arch.c sim/fr30/arch.h sim/fr30/config.in 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/tconfig.in sim/fr30/traps.c sim/h8300/ChangeLog sim/h8300/Makefile.in sim/h8300/acconfig.h sim/h8300/compile.c sim/h8300/config.in sim/h8300/configure sim/h8300/configure.in sim/h8300/inst.h sim/h8300/tconfig.in sim/h8300/writecode.c sim/h8500/ChangeLog sim/h8500/Makefile.in sim/h8500/acconfig.h sim/h8500/compile.c sim/h8500/config.in sim/h8500/configure sim/h8500/configure.in sim/h8500/inst.h sim/h8500/tconfig.in sim/i960/ChangeLog sim/i960/Makefile.in sim/i960/README sim/i960/TODO sim/i960/acconfig.h sim/i960/arch.c sim/i960/arch.h sim/i960/config.in sim/i960/configure sim/i960/configure.in sim/i960/cpu.c sim/i960/cpu.h sim/i960/cpuall.h sim/i960/decode.c sim/i960/decode.h sim/i960/devices.c sim/i960/i960-desc.c sim/i960/i960-desc.h sim/i960/i960-opc.h sim/i960/i960-sim.h sim/i960/i960.c sim/i960/mloop.in sim/i960/model.c sim/i960/sem-switch.c sim/i960/sem.c sim/i960/sim-if.c sim/i960/sim-main.h sim/i960/tconfig.in sim/i960/traps.c sim/igen/ChangeLog sim/igen/Makefile.in sim/igen/acconfig.h sim/igen/compare_igen_models sim/igen/config.in sim/igen/configure sim/igen/configure.in sim/igen/filter.c sim/igen/filter.h sim/igen/filter_host.c sim/igen/filter_host.h sim/igen/gen-engine.c sim/igen/gen-engine.h sim/igen/gen-icache.c sim/igen/gen-icache.h sim/igen/gen-idecode.c sim/igen/gen-idecode.h sim/igen/gen-itable.c sim/igen/gen-itable.h sim/igen/gen-model.c sim/igen/gen-model.h sim/igen/gen-semantics.c sim/igen/gen-semantics.h sim/igen/gen-support.c sim/igen/gen-support.h sim/igen/gen.c sim/igen/gen.h sim/igen/igen.c sim/igen/igen.h sim/igen/ld-cache.c sim/igen/ld-cache.h sim/igen/ld-decode.c sim/igen/ld-decode.h sim/igen/ld-insn.c sim/igen/ld-insn.h sim/igen/lf.c sim/igen/lf.h sim/igen/misc.c sim/igen/misc.h sim/igen/table.c sim/igen/table.h sim/m32r/ChangeLog sim/m32r/Makefile.in sim/m32r/README sim/m32r/TODO sim/m32r/acconfig.h sim/m32r/arch.c sim/m32r/arch.h sim/m32r/config.in sim/m32r/configure sim/m32r/configure.in sim/m32r/cpu.c sim/m32r/cpu.h sim/m32r/cpuall.h sim/m32r/cpux.c sim/m32r/cpux.h sim/m32r/decode.c sim/m32r/decode.h sim/m32r/decodex.c sim/m32r/decodex.h sim/m32r/devices.c sim/m32r/m32r-sim.h sim/m32r/m32r.c sim/m32r/m32rx.c sim/m32r/mloop.in sim/m32r/mloopx.in sim/m32r/model.c sim/m32r/modelx.c sim/m32r/sem-switch.c sim/m32r/sem.c sim/m32r/semx-switch.c sim/m32r/sim-if.c sim/m32r/sim-main.h sim/m32r/tconfig.in sim/m32r/traps.c sim/m68hc11/ChangeLog sim/m68hc11/Makefile.in sim/m68hc11/config.in sim/m68hc11/configure sim/m68hc11/configure.in sim/m68hc11/dv-m68hc11.c sim/m68hc11/dv-m68hc11eepr.c sim/m68hc11/dv-m68hc11sio.c sim/m68hc11/dv-m68hc11spi.c sim/m68hc11/dv-m68hc11tim.c sim/m68hc11/dv-nvram.c sim/m68hc11/emulos.c sim/m68hc11/gencode.c sim/m68hc11/interp.c sim/m68hc11/interrupts.c sim/m68hc11/interrupts.h sim/m68hc11/m68hc11_sim.c sim/m68hc11/sim-main.h sim/mcore/ChangeLog sim/mcore/Makefile.in sim/mcore/config.in sim/mcore/configure sim/mcore/configure.in sim/mcore/interp.c sim/mcore/sysdep.h sim/mips/ChangeLog sim/mips/Makefile.in sim/mips/acconfig.h sim/mips/config.in sim/mips/configure sim/mips/configure.in sim/mips/cp1.c sim/mips/cp1.h sim/mips/dv-tx3904cpu.c sim/mips/dv-tx3904irc.c sim/mips/dv-tx3904sio.c sim/mips/dv-tx3904tmr.c sim/mips/interp.c sim/mips/m16.dc sim/mips/m16.igen sim/mips/m16run.c sim/mips/mdmx.c sim/mips/mdmx.igen sim/mips/mips.dc sim/mips/mips.igen sim/mips/mips3d.igen sim/mips/sb1.igen sim/mips/sim-main.c sim/mips/sim-main.h sim/mips/tconfig.in sim/mips/tx.igen sim/mips/vr.igen sim/mn10200/ChangeLog sim/mn10200/Makefile.in sim/mn10200/acconfig.h sim/mn10200/config.in sim/mn10200/configure sim/mn10200/configure.in sim/mn10200/gencode.c sim/mn10200/interp.c sim/mn10200/mn10200_sim.h sim/mn10200/simops.c sim/mn10300/ChangeLog sim/mn10300/Makefile.in sim/mn10300/acconfig.h sim/mn10300/am33.igen sim/mn10300/config.in sim/mn10300/configure sim/mn10300/configure.in sim/mn10300/dv-mn103cpu.c sim/mn10300/dv-mn103int.c sim/mn10300/dv-mn103iop.c sim/mn10300/dv-mn103ser.c sim/mn10300/dv-mn103tim.c sim/mn10300/gencode.c sim/mn10300/interp.c sim/mn10300/mn10300.dc sim/mn10300/mn10300.igen sim/mn10300/mn10300_sim.h sim/mn10300/op_utils.c sim/mn10300/sim-main.c sim/mn10300/sim-main.h sim/mn10300/simops.c sim/mn10300/tconfig.in sim/ppc/.gdbinit sim/ppc/BUGS sim/ppc/COPYING sim/ppc/COPYING.LIB sim/ppc/ChangeLog sim/ppc/ChangeLog.00 sim/ppc/INSTALL sim/ppc/Makefile.in sim/ppc/README sim/ppc/RUN sim/ppc/acconfig.h sim/ppc/aclocal.m4 sim/ppc/basics.h sim/ppc/bits.c sim/ppc/bits.h sim/ppc/cap.c sim/ppc/cap.h sim/ppc/config.in sim/ppc/configure sim/ppc/configure.in sim/ppc/corefile-n.h sim/ppc/corefile.c sim/ppc/corefile.h sim/ppc/cpu.c sim/ppc/cpu.h sim/ppc/dc-complex sim/ppc/dc-simple sim/ppc/dc-stupid sim/ppc/dc-test.01 sim/ppc/dc-test.02 sim/ppc/debug.c sim/ppc/debug.h sim/ppc/device.c sim/ppc/device.h sim/ppc/device_table.c sim/ppc/device_table.h sim/ppc/dgen.c sim/ppc/double.c sim/ppc/dp-bit.c sim/ppc/emul_bugapi.c sim/ppc/emul_bugapi.h sim/ppc/emul_chirp.c sim/ppc/emul_chirp.h sim/ppc/emul_generic.c sim/ppc/emul_generic.h sim/ppc/emul_netbsd.c sim/ppc/emul_netbsd.h sim/ppc/emul_unix.c sim/ppc/emul_unix.h sim/ppc/events.c sim/ppc/events.h sim/ppc/filter.c sim/ppc/filter.h sim/ppc/filter_filename.c sim/ppc/filter_filename.h sim/ppc/gen-icache.c sim/ppc/gen-icache.h sim/ppc/gen-idecode.c sim/ppc/gen-idecode.h sim/ppc/gen-itable.c sim/ppc/gen-itable.h sim/ppc/gen-model.c sim/ppc/gen-model.h sim/ppc/gen-semantics.c sim/ppc/gen-semantics.h sim/ppc/gen-support.c sim/ppc/gen-support.h sim/ppc/hw_com.c sim/ppc/hw_core.c sim/ppc/hw_cpu.c sim/ppc/hw_cpu.h sim/ppc/hw_disk.c sim/ppc/hw_eeprom.c sim/ppc/hw_glue.c sim/ppc/hw_htab.c sim/ppc/hw_ide.c sim/ppc/hw_init.c sim/ppc/hw_iobus.c sim/ppc/hw_memory.c sim/ppc/hw_nvram.c sim/ppc/hw_opic.c sim/ppc/hw_pal.c sim/ppc/hw_phb.c sim/ppc/hw_phb.h sim/ppc/hw_register.c sim/ppc/hw_trace.c sim/ppc/hw_vm.c sim/ppc/idecode_branch.h sim/ppc/idecode_expression.h sim/ppc/idecode_fields.h sim/ppc/igen.c sim/ppc/igen.h sim/ppc/inline.c sim/ppc/inline.h sim/ppc/interrupts.c sim/ppc/interrupts.h sim/ppc/ld-cache.c sim/ppc/ld-cache.h sim/ppc/ld-decode.c sim/ppc/ld-decode.h sim/ppc/ld-insn.c sim/ppc/ld-insn.h sim/ppc/lf.c sim/ppc/lf.h sim/ppc/main.c sim/ppc/misc.c sim/ppc/misc.h sim/ppc/mon.c sim/ppc/mon.h sim/ppc/options.c sim/ppc/options.h sim/ppc/os_emul.c sim/ppc/os_emul.h sim/ppc/pk_disklabel.c sim/ppc/ppc-cache-rules sim/ppc/ppc-instructions sim/ppc/ppc-spr-table sim/ppc/ppc.mt sim/ppc/psim.c sim/ppc/psim.h sim/ppc/psim.texinfo sim/ppc/registers.c sim/ppc/registers.h sim/ppc/sim-endian-n.h sim/ppc/sim-endian.c sim/ppc/sim-endian.h sim/ppc/sim-main.h sim/ppc/sim_callbacks.h sim/ppc/sim_calls.c sim/ppc/std-config.h sim/ppc/table.c sim/ppc/table.h sim/ppc/tree.c sim/ppc/tree.h sim/ppc/vm.c sim/ppc/vm.h sim/ppc/vm_n.h sim/ppc/words.h sim/sh/ChangeLog sim/sh/Makefile.in sim/sh/acconfig.h sim/sh/config.in sim/sh/configure sim/sh/configure.in sim/sh/gencode.c sim/sh/interp.c sim/sh/syscall.h sim/sh/tconfig.in sim/testsuite/ChangeLog sim/testsuite/Makefile.in sim/testsuite/common/Make-common.in sim/testsuite/common/Makefile.in sim/testsuite/common/alu-n-tst.h sim/testsuite/common/alu-tst.c sim/testsuite/common/bits-gen.c sim/testsuite/common/bits-tst.c sim/testsuite/common/fpu-tst.c sim/testsuite/config/default.exp sim/testsuite/configure sim/testsuite/configure.in sim/testsuite/d10v-elf/ChangeLog sim/testsuite/d10v-elf/Makefile.in sim/testsuite/d10v-elf/configure sim/testsuite/d10v-elf/configure.in sim/testsuite/d10v-elf/exit47.s sim/testsuite/d10v-elf/hello.s sim/testsuite/d10v-elf/loop.s sim/testsuite/d10v-elf/t-ae-ld-d.s sim/testsuite/d10v-elf/t-ae-ld-i.s sim/testsuite/d10v-elf/t-ae-ld-id.s sim/testsuite/d10v-elf/t-ae-ld-im.s sim/testsuite/d10v-elf/t-ae-ld-ip.s sim/testsuite/d10v-elf/t-ae-ld2w-d.s sim/testsuite/d10v-elf/t-ae-ld2w-i.s sim/testsuite/d10v-elf/t-ae-ld2w-id.s sim/testsuite/d10v-elf/t-ae-ld2w-im.s sim/testsuite/d10v-elf/t-ae-ld2w-ip.s sim/testsuite/d10v-elf/t-ae-st-d.s sim/testsuite/d10v-elf/t-ae-st-i.s sim/testsuite/d10v-elf/t-ae-st-id.s sim/testsuite/d10v-elf/t-ae-st-im.s sim/testsuite/d10v-elf/t-ae-st-ip.s sim/testsuite/d10v-elf/t-ae-st-is.s sim/testsuite/d10v-elf/t-ae-st2w-d.s sim/testsuite/d10v-elf/t-ae-st2w-i.s sim/testsuite/d10v-elf/t-ae-st2w-id.s sim/testsuite/d10v-elf/t-ae-st2w-im.s sim/testsuite/d10v-elf/t-ae-st2w-ip.s sim/testsuite/d10v-elf/t-ae-st2w-is.s sim/testsuite/d10v-elf/t-dbt.s sim/testsuite/d10v-elf/t-ld-st.s sim/testsuite/d10v-elf/t-mac.s sim/testsuite/d10v-elf/t-macros.i sim/testsuite/d10v-elf/t-mod-ld-pre.s sim/testsuite/d10v-elf/t-msbu.s sim/testsuite/d10v-elf/t-mulxu.s sim/testsuite/d10v-elf/t-mvtac.s sim/testsuite/d10v-elf/t-mvtc.s sim/testsuite/d10v-elf/t-rac.s sim/testsuite/d10v-elf/t-rachi.s sim/testsuite/d10v-elf/t-rdt.s sim/testsuite/d10v-elf/t-rep.s sim/testsuite/d10v-elf/t-rie-xx.s sim/testsuite/d10v-elf/t-rte.s sim/testsuite/d10v-elf/t-sac.s sim/testsuite/d10v-elf/t-sachi.s sim/testsuite/d10v-elf/t-sadd.s sim/testsuite/d10v-elf/t-slae.s sim/testsuite/d10v-elf/t-sp.s sim/testsuite/d10v-elf/t-sub.s sim/testsuite/d10v-elf/t-sub2w.s sim/testsuite/d10v-elf/t-subi.s sim/testsuite/d10v-elf/t-trap.s sim/testsuite/d30v-elf/ChangeLog sim/testsuite/d30v-elf/Makefile.in sim/testsuite/d30v-elf/br-bra.S sim/testsuite/d30v-elf/br-bratnz.S sim/testsuite/d30v-elf/br-bratzr.S sim/testsuite/d30v-elf/br-bsr.S sim/testsuite/d30v-elf/br-dbra.S sim/testsuite/d30v-elf/br-djmp.S sim/testsuite/d30v-elf/br-djsr.S sim/testsuite/d30v-elf/configure sim/testsuite/d30v-elf/configure.in sim/testsuite/d30v-elf/do-2wordops.S sim/testsuite/d30v-elf/do-flags.S sim/testsuite/d30v-elf/do-shifts.S sim/testsuite/d30v-elf/em-e0.S sim/testsuite/d30v-elf/em-e47.S sim/testsuite/d30v-elf/em-pchr.S sim/testsuite/d30v-elf/em-pstr.S sim/testsuite/d30v-elf/exit47.s sim/testsuite/d30v-elf/hello.s sim/testsuite/d30v-elf/loop.s sim/testsuite/d30v-elf/ls-ld2h.S sim/testsuite/d30v-elf/ls-ld2w.S sim/testsuite/d30v-elf/ls-ld4bh.S sim/testsuite/d30v-elf/ls-ld4bhu.S sim/testsuite/d30v-elf/ls-ldb.S sim/testsuite/d30v-elf/ls-ldbu.S sim/testsuite/d30v-elf/ls-ldh.S sim/testsuite/d30v-elf/ls-ldhh.S sim/testsuite/d30v-elf/ls-ldhu.S sim/testsuite/d30v-elf/ls-ldw.S sim/testsuite/d30v-elf/ls-modaddr.S sim/testsuite/d30v-elf/ls-moddec.S sim/testsuite/d30v-elf/ls-modinc.S sim/testsuite/d30v-elf/ls-st2h.S sim/testsuite/d30v-elf/ls-st2w.S sim/testsuite/d30v-elf/ls-st4hb.S sim/testsuite/d30v-elf/ls-stb.S sim/testsuite/d30v-elf/ls-sth.S sim/testsuite/d30v-elf/ls-sthh.S sim/testsuite/d30v-elf/ls-stw.S sim/testsuite/d30v-elf/os-dbt.S sim/testsuite/d30v-elf/tick.s sim/testsuite/d30v-elf/trap.S sim/testsuite/fr30-elf/ChangeLog sim/testsuite/fr30-elf/Makefile.in sim/testsuite/fr30-elf/configure sim/testsuite/fr30-elf/configure.in sim/testsuite/fr30-elf/exit47.s sim/testsuite/fr30-elf/hello.s sim/testsuite/fr30-elf/loop.s sim/testsuite/lib/sim-defs.exp sim/testsuite/m32r-elf/ChangeLog sim/testsuite/m32r-elf/Makefile.in sim/testsuite/m32r-elf/configure sim/testsuite/m32r-elf/configure.in sim/testsuite/m32r-elf/exit47.s sim/testsuite/m32r-elf/hello.s sim/testsuite/m32r-elf/loop.s sim/testsuite/mips64el-elf/ChangeLog sim/testsuite/mips64el-elf/Makefile.in sim/testsuite/mips64el-elf/configure sim/testsuite/mips64el-elf/configure.in sim/testsuite/sim/fr30/add.cgs sim/testsuite/sim/fr30/add.ms sim/testsuite/sim/fr30/add2.cgs sim/testsuite/sim/fr30/addc.cgs sim/testsuite/sim/fr30/addn.cgs sim/testsuite/sim/fr30/addn2.cgs sim/testsuite/sim/fr30/addsp.cgs sim/testsuite/sim/fr30/allinsn.exp sim/testsuite/sim/fr30/and.cgs sim/testsuite/sim/fr30/andb.cgs sim/testsuite/sim/fr30/andccr.cgs sim/testsuite/sim/fr30/andh.cgs sim/testsuite/sim/fr30/asr.cgs sim/testsuite/sim/fr30/asr2.cgs sim/testsuite/sim/fr30/bandh.cgs sim/testsuite/sim/fr30/bandl.cgs sim/testsuite/sim/fr30/bc.cgs sim/testsuite/sim/fr30/beorh.cgs sim/testsuite/sim/fr30/beorl.cgs sim/testsuite/sim/fr30/beq.cgs sim/testsuite/sim/fr30/bge.cgs sim/testsuite/sim/fr30/bgt.cgs sim/testsuite/sim/fr30/bhi.cgs sim/testsuite/sim/fr30/ble.cgs sim/testsuite/sim/fr30/bls.cgs sim/testsuite/sim/fr30/blt.cgs sim/testsuite/sim/fr30/bn.cgs sim/testsuite/sim/fr30/bnc.cgs sim/testsuite/sim/fr30/bne.cgs sim/testsuite/sim/fr30/bno.cgs sim/testsuite/sim/fr30/bnv.cgs sim/testsuite/sim/fr30/borh.cgs sim/testsuite/sim/fr30/borl.cgs sim/testsuite/sim/fr30/bp.cgs sim/testsuite/sim/fr30/bra.cgs sim/testsuite/sim/fr30/btsth.cgs sim/testsuite/sim/fr30/btstl.cgs sim/testsuite/sim/fr30/bv.cgs sim/testsuite/sim/fr30/call.cgs sim/testsuite/sim/fr30/cmp.cgs sim/testsuite/sim/fr30/cmp2.cgs sim/testsuite/sim/fr30/copld.cgs sim/testsuite/sim/fr30/copop.cgs sim/testsuite/sim/fr30/copst.cgs sim/testsuite/sim/fr30/copsv.cgs sim/testsuite/sim/fr30/div.ms sim/testsuite/sim/fr30/div0s.cgs sim/testsuite/sim/fr30/div0u.cgs sim/testsuite/sim/fr30/div1.cgs sim/testsuite/sim/fr30/div2.cgs sim/testsuite/sim/fr30/div3.cgs sim/testsuite/sim/fr30/div4s.cgs sim/testsuite/sim/fr30/dmov.cgs sim/testsuite/sim/fr30/dmovb.cgs sim/testsuite/sim/fr30/dmovh.cgs sim/testsuite/sim/fr30/enter.cgs sim/testsuite/sim/fr30/eor.cgs sim/testsuite/sim/fr30/eorb.cgs sim/testsuite/sim/fr30/eorh.cgs sim/testsuite/sim/fr30/extsb.cgs sim/testsuite/sim/fr30/extsh.cgs sim/testsuite/sim/fr30/extub.cgs sim/testsuite/sim/fr30/extuh.cgs sim/testsuite/sim/fr30/hello.ms sim/testsuite/sim/fr30/int.cgs sim/testsuite/sim/fr30/inte.cgs sim/testsuite/sim/fr30/jmp.cgs sim/testsuite/sim/fr30/ld.cgs sim/testsuite/sim/fr30/ldi20.cgs sim/testsuite/sim/fr30/ldi32.cgs sim/testsuite/sim/fr30/ldi8.cgs sim/testsuite/sim/fr30/ldm0.cgs sim/testsuite/sim/fr30/ldm1.cgs sim/testsuite/sim/fr30/ldres.cgs sim/testsuite/sim/fr30/ldub.cgs sim/testsuite/sim/fr30/lduh.cgs sim/testsuite/sim/fr30/leave.cgs sim/testsuite/sim/fr30/lsl.cgs sim/testsuite/sim/fr30/lsl2.cgs sim/testsuite/sim/fr30/lsr.cgs sim/testsuite/sim/fr30/lsr2.cgs sim/testsuite/sim/fr30/misc.exp sim/testsuite/sim/fr30/mov.cgs sim/testsuite/sim/fr30/mul.cgs sim/testsuite/sim/fr30/mulh.cgs sim/testsuite/sim/fr30/mulu.cgs sim/testsuite/sim/fr30/muluh.cgs sim/testsuite/sim/fr30/nop.cgs sim/testsuite/sim/fr30/or.cgs sim/testsuite/sim/fr30/orb.cgs sim/testsuite/sim/fr30/orccr.cgs sim/testsuite/sim/fr30/orh.cgs sim/testsuite/sim/fr30/ret.cgs sim/testsuite/sim/fr30/reti.cgs sim/testsuite/sim/fr30/st.cgs sim/testsuite/sim/fr30/stb.cgs sim/testsuite/sim/fr30/sth.cgs sim/testsuite/sim/fr30/stilm.cgs sim/testsuite/sim/fr30/stm0.cgs sim/testsuite/sim/fr30/stm1.cgs sim/testsuite/sim/fr30/stres.cgs sim/testsuite/sim/fr30/sub.cgs sim/testsuite/sim/fr30/subc.cgs sim/testsuite/sim/fr30/subn.cgs sim/testsuite/sim/fr30/testutils.inc sim/testsuite/sim/fr30/xchb.cgs sim/testsuite/sim/m32r/add.cgs sim/testsuite/sim/m32r/add3.cgs sim/testsuite/sim/m32r/addi.cgs sim/testsuite/sim/m32r/addv.cgs sim/testsuite/sim/m32r/addv3.cgs sim/testsuite/sim/m32r/addx.cgs sim/testsuite/sim/m32r/allinsn.exp sim/testsuite/sim/m32r/and.cgs sim/testsuite/sim/m32r/and3.cgs sim/testsuite/sim/m32r/bc24.cgs sim/testsuite/sim/m32r/bc8.cgs sim/testsuite/sim/m32r/beq.cgs sim/testsuite/sim/m32r/beqz.cgs sim/testsuite/sim/m32r/bgez.cgs sim/testsuite/sim/m32r/bgtz.cgs sim/testsuite/sim/m32r/bl24.cgs sim/testsuite/sim/m32r/bl8.cgs sim/testsuite/sim/m32r/blez.cgs sim/testsuite/sim/m32r/bltz.cgs sim/testsuite/sim/m32r/bnc24.cgs sim/testsuite/sim/m32r/bnc8.cgs sim/testsuite/sim/m32r/bne.cgs sim/testsuite/sim/m32r/bnez.cgs sim/testsuite/sim/m32r/bra24.cgs sim/testsuite/sim/m32r/bra8.cgs sim/testsuite/sim/m32r/cmp.cgs sim/testsuite/sim/m32r/cmpi.cgs sim/testsuite/sim/m32r/cmpu.cgs sim/testsuite/sim/m32r/cmpui.cgs sim/testsuite/sim/m32r/div.cgs sim/testsuite/sim/m32r/divu.cgs sim/testsuite/sim/m32r/hello.ms sim/testsuite/sim/m32r/hw-trap.ms sim/testsuite/sim/m32r/jl.cgs sim/testsuite/sim/m32r/jmp.cgs sim/testsuite/sim/m32r/ld-d.cgs sim/testsuite/sim/m32r/ld-plus.cgs sim/testsuite/sim/m32r/ld.cgs sim/testsuite/sim/m32r/ld24.cgs sim/testsuite/sim/m32r/ldb-d.cgs sim/testsuite/sim/m32r/ldb.cgs sim/testsuite/sim/m32r/ldh-d.cgs sim/testsuite/sim/m32r/ldh.cgs sim/testsuite/sim/m32r/ldi16.cgs sim/testsuite/sim/m32r/ldi8.cgs sim/testsuite/sim/m32r/ldub-d.cgs sim/testsuite/sim/m32r/ldub.cgs sim/testsuite/sim/m32r/lduh-d.cgs sim/testsuite/sim/m32r/lduh.cgs sim/testsuite/sim/m32r/lock.cgs sim/testsuite/sim/m32r/machi.cgs sim/testsuite/sim/m32r/maclo.cgs sim/testsuite/sim/m32r/macwhi.cgs sim/testsuite/sim/m32r/macwlo.cgs sim/testsuite/sim/m32r/misc.exp sim/testsuite/sim/m32r/mul.cgs sim/testsuite/sim/m32r/mulhi.cgs sim/testsuite/sim/m32r/mullo.cgs sim/testsuite/sim/m32r/mulwhi.cgs sim/testsuite/sim/m32r/mulwlo.cgs sim/testsuite/sim/m32r/mv.cgs sim/testsuite/sim/m32r/mvfachi.cgs sim/testsuite/sim/m32r/mvfaclo.cgs sim/testsuite/sim/m32r/mvfacmi.cgs sim/testsuite/sim/m32r/mvfc.cgs sim/testsuite/sim/m32r/mvtachi.cgs sim/testsuite/sim/m32r/mvtaclo.cgs sim/testsuite/sim/m32r/mvtc.cgs sim/testsuite/sim/m32r/neg.cgs sim/testsuite/sim/m32r/nop.cgs sim/testsuite/sim/m32r/not.cgs sim/testsuite/sim/m32r/or.cgs sim/testsuite/sim/m32r/or3.cgs sim/testsuite/sim/m32r/rac.cgs sim/testsuite/sim/m32r/rach.cgs sim/testsuite/sim/m32r/rem.cgs sim/testsuite/sim/m32r/remu.cgs sim/testsuite/sim/m32r/rte.cgs sim/testsuite/sim/m32r/seth.cgs sim/testsuite/sim/m32r/sll.cgs sim/testsuite/sim/m32r/sll3.cgs sim/testsuite/sim/m32r/slli.cgs sim/testsuite/sim/m32r/sra.cgs sim/testsuite/sim/m32r/sra3.cgs sim/testsuite/sim/m32r/srai.cgs sim/testsuite/sim/m32r/srl.cgs sim/testsuite/sim/m32r/srl3.cgs sim/testsuite/sim/m32r/srli.cgs sim/testsuite/sim/m32r/st-d.cgs sim/testsuite/sim/m32r/st-minus.cgs sim/testsuite/sim/m32r/st-plus.cgs sim/testsuite/sim/m32r/st.cgs sim/testsuite/sim/m32r/stb-d.cgs sim/testsuite/sim/m32r/stb.cgs sim/testsuite/sim/m32r/sth-d.cgs sim/testsuite/sim/m32r/sth.cgs sim/testsuite/sim/m32r/sub.cgs sim/testsuite/sim/m32r/subv.cgs sim/testsuite/sim/m32r/subx.cgs sim/testsuite/sim/m32r/testutils.inc sim/testsuite/sim/m32r/trap.cgs sim/testsuite/sim/m32r/unlock.cgs sim/testsuite/sim/m32r/uread16.ms sim/testsuite/sim/m32r/uread32.ms sim/testsuite/sim/m32r/uwrite16.ms sim/testsuite/sim/m32r/uwrite32.ms sim/testsuite/sim/m32r/xor.cgs sim/testsuite/sim/m32r/xor3.cgs sim/v850/ChangeLog sim/v850/Makefile.in sim/v850/acconfig.h sim/v850/config.in sim/v850/configure sim/v850/configure.in sim/v850/interp.c sim/v850/sim-main.h sim/v850/simops.c sim/v850/simops.h sim/v850/v850-dc sim/v850/v850.igen sim/v850/v850_sim.h sim/z8k/ChangeLog sim/z8k/Makefile.in sim/z8k/acconfig.h sim/z8k/comped1.c sim/z8k/comped2.c sim/z8k/comped3.c sim/z8k/compedb3.c sim/z8k/config.in sim/z8k/configure sim/z8k/configure.in sim/z8k/iface.c sim/z8k/inlines.h sim/z8k/mem.c sim/z8k/mem.h sim/z8k/quick.c sim/z8k/sim.h sim/z8k/support.c sim/z8k/syscall.h sim/z8k/tconfig.in sim/z8k/tm.h sim/z8k/writecode.c texinfo/texinfo.tex
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r--gdb/ada-lang.c8317
1 files changed, 0 insertions, 8317 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
deleted file mode 100644
index c58d463..0000000
--- a/gdb/ada-lang.c
+++ /dev/null
@@ -1,8317 +0,0 @@
-/* Ada language support routines for GDB, the GNU debugger. Copyright
- 1992, 1993, 1994, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-#include <stdio.h>
-#include "gdb_string.h"
-#include <ctype.h>
-#include <stdarg.h>
-#include "demangle.h"
-#include "defs.h"
-#include "symtab.h"
-#include "gdbtypes.h"
-#include "gdbcmd.h"
-#include "expression.h"
-#include "parser-defs.h"
-#include "language.h"
-#include "c-lang.h"
-#include "inferior.h"
-#include "symfile.h"
-#include "objfiles.h"
-#include "breakpoint.h"
-#include "gdbcore.h"
-#include "ada-lang.h"
-#ifdef UI_OUT
-#include "ui-out.h"
-#endif
-
-struct cleanup *unresolved_names;
-
-void extract_string (CORE_ADDR addr, char *buf);
-
-static struct type *ada_create_fundamental_type (struct objfile *, int);
-
-static void modify_general_field (char *, LONGEST, int, int);
-
-static struct type *desc_base_type (struct type *);
-
-static struct type *desc_bounds_type (struct type *);
-
-static struct value *desc_bounds (struct value *);
-
-static int fat_pntr_bounds_bitpos (struct type *);
-
-static int fat_pntr_bounds_bitsize (struct type *);
-
-static struct type *desc_data_type (struct type *);
-
-static struct value *desc_data (struct value *);
-
-static int fat_pntr_data_bitpos (struct type *);
-
-static int fat_pntr_data_bitsize (struct type *);
-
-static struct value *desc_one_bound (struct value *, int, int);
-
-static int desc_bound_bitpos (struct type *, int, int);
-
-static int desc_bound_bitsize (struct type *, int, int);
-
-static struct type *desc_index_type (struct type *, int);
-
-static int desc_arity (struct type *);
-
-static int ada_type_match (struct type *, struct type *, int);
-
-static int ada_args_match (struct symbol *, struct value **, int);
-
-static struct value *place_on_stack (struct value *, CORE_ADDR *);
-
-static struct value *convert_actual (struct value *, struct type *,
- CORE_ADDR *);
-
-static struct value *make_array_descriptor (struct type *, struct value *,
- CORE_ADDR *);
-
-static void ada_add_block_symbols (struct block *, const char *,
- namespace_enum, struct objfile *, int);
-
-static void fill_in_ada_prototype (struct symbol *);
-
-static int is_nonfunction (struct symbol **, int);
-
-static void add_defn_to_vec (struct symbol *, struct block *);
-
-static struct partial_symbol *ada_lookup_partial_symbol (struct partial_symtab
- *, const char *, int,
- namespace_enum, int);
-
-static struct symtab *symtab_for_sym (struct symbol *);
-
-static struct value *ada_resolve_subexp (struct expression **, int *, int,
- struct type *);
-
-static void replace_operator_with_call (struct expression **, int, int, int,
- struct symbol *, struct block *);
-
-static int possible_user_operator_p (enum exp_opcode, struct value **);
-
-static const char *ada_op_name (enum exp_opcode);
-
-static int numeric_type_p (struct type *);
-
-static int integer_type_p (struct type *);
-
-static int scalar_type_p (struct type *);
-
-static int discrete_type_p (struct type *);
-
-static char *extended_canonical_line_spec (struct symtab_and_line,
- const char *);
-
-static struct value *evaluate_subexp (struct type *, struct expression *,
- int *, enum noside);
-
-static struct value *evaluate_subexp_type (struct expression *, int *);
-
-static struct type *ada_create_fundamental_type (struct objfile *, int);
-
-static int is_dynamic_field (struct type *, int);
-
-static struct type *to_fixed_variant_branch_type (struct type *, char *,
- CORE_ADDR, struct value *);
-
-static struct type *to_fixed_range_type (char *, struct value *,
- struct objfile *);
-
-static struct type *to_static_fixed_type (struct type *);
-
-static struct value *unwrap_value (struct value *);
-
-static struct type *packed_array_type (struct type *, long *);
-
-static struct type *decode_packed_array_type (struct type *);
-
-static struct value *decode_packed_array (struct value *);
-
-static struct value *value_subscript_packed (struct value *, int,
- struct value **);
-
-static struct value *coerce_unspec_val_to_type (struct value *, long,
- struct type *);
-
-static struct value *get_var_value (char *, char *);
-
-static int lesseq_defined_than (struct symbol *, struct symbol *);
-
-static int equiv_types (struct type *, struct type *);
-
-static int is_name_suffix (const char *);
-
-static int wild_match (const char *, int, const char *);
-
-static struct symtabs_and_lines find_sal_from_funcs_and_line (const char *,
- int,
- struct symbol
- **, int);
-
-static int find_line_in_linetable (struct linetable *, int, struct symbol **,
- int, int *);
-
-static int find_next_line_in_linetable (struct linetable *, int, int, int);
-
-static struct symtabs_and_lines all_sals_for_line (const char *, int,
- char ***);
-
-static void read_all_symtabs (const char *);
-
-static int is_plausible_func_for_line (struct symbol *, int);
-
-static struct value *ada_coerce_ref (struct value *);
-
-static struct value *value_pos_atr (struct value *);
-
-static struct value *value_val_atr (struct type *, struct value *);
-
-static struct symbol *standard_lookup (const char *, namespace_enum);
-
-extern void markTimeStart (int index);
-extern void markTimeStop (int index);
-
-
-
-/* Maximum-sized dynamic type. */
-static unsigned int varsize_limit;
-
-static const char *ada_completer_word_break_characters =
- " \t\n!@#$%^&*()+=|~`}{[]\";:?/,-";
-
-/* The name of the symbol to use to get the name of the main subprogram */
-#define ADA_MAIN_PROGRAM_SYMBOL_NAME "__gnat_ada_main_program_name"
-
- /* Utilities */
-
-/* extract_string
- *
- * read the string located at ADDR from the inferior and store the
- * result into BUF
- */
-void
-extract_string (CORE_ADDR addr, char *buf)
-{
- int char_index = 0;
-
- /* Loop, reading one byte at a time, until we reach the '\000'
- end-of-string marker */
- do
- {
- target_read_memory (addr + char_index * sizeof (char),
- buf + char_index * sizeof (char), sizeof (char));
- char_index++;
- }
- while (buf[char_index - 1] != '\000');
-}
-
-/* Assuming *OLD_VECT points to an array of *SIZE objects of size
- ELEMENT_SIZE, grow it to contain at least MIN_SIZE objects,
- updating *OLD_VECT and *SIZE as necessary. */
-
-void
-grow_vect (void **old_vect, size_t * size, size_t min_size, int element_size)
-{
- if (*size < min_size)
- {
- *size *= 2;
- if (*size < min_size)
- *size = min_size;
- *old_vect = xrealloc (*old_vect, *size * element_size);
- }
-}
-
-/* True (non-zero) iff TARGET matches FIELD_NAME up to any trailing
- suffix of FIELD_NAME beginning "___" */
-
-static int
-field_name_match (const char *field_name, const char *target)
-{
- int len = strlen (target);
- return
- STREQN (field_name, target, len)
- && (field_name[len] == '\0'
- || (STREQN (field_name + len, "___", 3)
- && !STREQ (field_name + strlen (field_name) - 6, "___XVN")));
-}
-
-
-/* The length of the prefix of NAME prior to any "___" suffix. */
-
-int
-ada_name_prefix_len (const char *name)
-{
- if (name == NULL)
- return 0;
- else
- {
- const char *p = strstr (name, "___");
- if (p == NULL)
- return strlen (name);
- else
- return p - name;
- }
-}
-
-/* SUFFIX is a suffix of STR. False if STR is null. */
-static int
-is_suffix (const char *str, const char *suffix)
-{
- int len1, len2;
- if (str == NULL)
- return 0;
- len1 = strlen (str);
- len2 = strlen (suffix);
- return (len1 >= len2 && STREQ (str + len1 - len2, suffix));
-}
-
-/* Create a value of type TYPE whose contents come from VALADDR, if it
- * is non-null, and whose memory address (in the inferior) is
- * ADDRESS. */
-struct value *
-value_from_contents_and_address (struct type *type, char *valaddr,
- CORE_ADDR address)
-{
- struct value *v = allocate_value (type);
- if (valaddr == NULL)
- VALUE_LAZY (v) = 1;
- else
- memcpy (VALUE_CONTENTS_RAW (v), valaddr, TYPE_LENGTH (type));
- VALUE_ADDRESS (v) = address;
- if (address != 0)
- VALUE_LVAL (v) = lval_memory;
- return v;
-}
-
-/* The contents of value VAL, beginning at offset OFFSET, treated as a
- value of type TYPE. The result is an lval in memory if VAL is. */
-
-static struct value *
-coerce_unspec_val_to_type (struct value *val, long offset, struct type *type)
-{
- CHECK_TYPEDEF (type);
- if (VALUE_LVAL (val) == lval_memory)
- return value_at_lazy (type,
- VALUE_ADDRESS (val) + VALUE_OFFSET (val) + offset,
- NULL);
- else
- {
- struct value *result = allocate_value (type);
- VALUE_LVAL (result) = not_lval;
- if (VALUE_ADDRESS (val) == 0)
- memcpy (VALUE_CONTENTS_RAW (result), VALUE_CONTENTS (val) + offset,
- TYPE_LENGTH (type) > TYPE_LENGTH (VALUE_TYPE (val))
- ? TYPE_LENGTH (VALUE_TYPE (val)) : TYPE_LENGTH (type));
- else
- {
- VALUE_ADDRESS (result) =
- VALUE_ADDRESS (val) + VALUE_OFFSET (val) + offset;
- VALUE_LAZY (result) = 1;
- }
- return result;
- }
-}
-
-static char *
-cond_offset_host (char *valaddr, long offset)
-{
- if (valaddr == NULL)
- return NULL;
- else
- return valaddr + offset;
-}
-
-static CORE_ADDR
-cond_offset_target (CORE_ADDR address, long offset)
-{
- if (address == 0)
- return 0;
- else
- return address + offset;
-}
-
-/* Perform execute_command on the result of concatenating all
- arguments up to NULL. */
-static void
-do_command (const char *arg, ...)
-{
- int len;
- char *cmd;
- const char *s;
- va_list ap;
-
- va_start (ap, arg);
- len = 0;
- s = arg;
- cmd = "";
- for (; s != NULL; s = va_arg (ap, const char *))
- {
- char *cmd1;
- len += strlen (s);
- cmd1 = alloca (len + 1);
- strcpy (cmd1, cmd);
- strcat (cmd1, s);
- cmd = cmd1;
- }
- va_end (ap);
- execute_command (cmd, 0);
-}
-
-
- /* Language Selection */
-
-/* If the main program is in Ada, return language_ada, otherwise return LANG
- (the main program is in Ada iif the adainit symbol is found).
-
- MAIN_PST is not used. */
-
-enum language
-ada_update_initial_language (enum language lang,
- struct partial_symtab *main_pst)
-{
- if (lookup_minimal_symbol ("adainit", (const char *) NULL,
- (struct objfile *) NULL) != NULL)
- /* return language_ada; */
- /* FIXME: language_ada should be defined in defs.h */
- return language_unknown;
-
- return lang;
-}
-
-
- /* Symbols */
-
-/* Table of Ada operators and their GNAT-mangled names. Last entry is pair
- of NULLs. */
-
-const struct ada_opname_map ada_opname_table[] = {
- {"Oadd", "\"+\"", BINOP_ADD},
- {"Osubtract", "\"-\"", BINOP_SUB},
- {"Omultiply", "\"*\"", BINOP_MUL},
- {"Odivide", "\"/\"", BINOP_DIV},
- {"Omod", "\"mod\"", BINOP_MOD},
- {"Orem", "\"rem\"", BINOP_REM},
- {"Oexpon", "\"**\"", BINOP_EXP},
- {"Olt", "\"<\"", BINOP_LESS},
- {"Ole", "\"<=\"", BINOP_LEQ},
- {"Ogt", "\">\"", BINOP_GTR},
- {"Oge", "\">=\"", BINOP_GEQ},
- {"Oeq", "\"=\"", BINOP_EQUAL},
- {"One", "\"/=\"", BINOP_NOTEQUAL},
- {"Oand", "\"and\"", BINOP_BITWISE_AND},
- {"Oor", "\"or\"", BINOP_BITWISE_IOR},
- {"Oxor", "\"xor\"", BINOP_BITWISE_XOR},
- {"Oconcat", "\"&\"", BINOP_CONCAT},
- {"Oabs", "\"abs\"", UNOP_ABS},
- {"Onot", "\"not\"", UNOP_LOGICAL_NOT},
- {"Oadd", "\"+\"", UNOP_PLUS},
- {"Osubtract", "\"-\"", UNOP_NEG},
- {NULL, NULL}
-};
-
-/* True if STR should be suppressed in info listings. */
-static int
-is_suppressed_name (const char *str)
-{
- if (STREQN (str, "_ada_", 5))
- str += 5;
- if (str[0] == '_' || str[0] == '\000')
- return 1;
- else
- {
- const char *p;
- const char *suffix = strstr (str, "___");
- if (suffix != NULL && suffix[3] != 'X')
- return 1;
- if (suffix == NULL)
- suffix = str + strlen (str);
- for (p = suffix - 1; p != str; p -= 1)
- if (isupper (*p))
- {
- int i;
- if (p[0] == 'X' && p[-1] != '_')
- goto OK;
- if (*p != 'O')
- return 1;
- for (i = 0; ada_opname_table[i].mangled != NULL; i += 1)
- if (STREQN (ada_opname_table[i].mangled, p,
- strlen (ada_opname_table[i].mangled)))
- goto OK;
- return 1;
- OK:;
- }
- return 0;
- }
-}
-
-/* The "mangled" form of DEMANGLED, according to GNAT conventions.
- * The result is valid until the next call to ada_mangle. */
-char *
-ada_mangle (const char *demangled)
-{
- static char *mangling_buffer = NULL;
- static size_t mangling_buffer_size = 0;
- const char *p;
- int k;
-
- if (demangled == NULL)
- return NULL;
-
- GROW_VECT (mangling_buffer, mangling_buffer_size,
- 2 * strlen (demangled) + 10);
-
- k = 0;
- for (p = demangled; *p != '\0'; p += 1)
- {
- if (*p == '.')
- {
- mangling_buffer[k] = mangling_buffer[k + 1] = '_';
- k += 2;
- }
- else if (*p == '"')
- {
- const struct ada_opname_map *mapping;
-
- for (mapping = ada_opname_table;
- mapping->mangled != NULL &&
- !STREQN (mapping->demangled, p, strlen (mapping->demangled));
- p += 1)
- ;
- if (mapping->mangled == NULL)
- error ("invalid Ada operator name: %s", p);
- strcpy (mangling_buffer + k, mapping->mangled);
- k += strlen (mapping->mangled);
- break;
- }
- else
- {
- mangling_buffer[k] = *p;
- k += 1;
- }
- }
-
- mangling_buffer[k] = '\0';
- return mangling_buffer;
-}
-
-/* Return NAME folded to lower case, or, if surrounded by single
- * quotes, unfolded, but with the quotes stripped away. Result good
- * to next call. */
-char *
-ada_fold_name (const char *name)
-{
- static char *fold_buffer = NULL;
- static size_t fold_buffer_size = 0;
-
- int len = strlen (name);
- GROW_VECT (fold_buffer, fold_buffer_size, len + 1);
-
- if (name[0] == '\'')
- {
- strncpy (fold_buffer, name + 1, len - 2);
- fold_buffer[len - 2] = '\000';
- }
- else
- {
- int i;
- for (i = 0; i <= len; i += 1)
- fold_buffer[i] = tolower (name[i]);
- }
-
- return fold_buffer;
-}
-
-/* Demangle:
- 1. Discard final __{DIGIT}+ or ${DIGIT}+
- 2. Convert other instances of embedded "__" to `.'.
- 3. Discard leading _ada_.
- 4. Convert operator names to the appropriate quoted symbols.
- 5. Remove everything after first ___ if it is followed by
- 'X'.
- 6. Replace TK__ with __, and a trailing B or TKB with nothing.
- 7. Put symbols that should be suppressed in <...> brackets.
- 8. Remove trailing X[bn]* suffix (indicating names in package bodies).
- The resulting string is valid until the next call of ada_demangle.
- */
-
-char *
-ada_demangle (const char *mangled)
-{
- int i, j;
- int len0;
- const char *p;
- char *demangled;
- int at_start_name;
- static char *demangling_buffer = NULL;
- static size_t demangling_buffer_size = 0;
-
- if (STREQN (mangled, "_ada_", 5))
- mangled += 5;
-
- if (mangled[0] == '_' || mangled[0] == '<')
- goto Suppress;
-
- p = strstr (mangled, "___");
- if (p == NULL)
- len0 = strlen (mangled);
- else
- {
- if (p[3] == 'X')
- len0 = p - mangled;
- else
- goto Suppress;
- }
- if (len0 > 3 && STREQ (mangled + len0 - 3, "TKB"))
- len0 -= 3;
- if (len0 > 1 && STREQ (mangled + len0 - 1, "B"))
- len0 -= 1;
-
- /* Make demangled big enough for possible expansion by operator name. */
- GROW_VECT (demangling_buffer, demangling_buffer_size, 2 * len0 + 1);
- demangled = demangling_buffer;
-
- if (isdigit (mangled[len0 - 1]))
- {
- for (i = len0 - 2; i >= 0 && isdigit (mangled[i]); i -= 1)
- ;
- if (i > 1 && mangled[i] == '_' && mangled[i - 1] == '_')
- len0 = i - 1;
- else if (mangled[i] == '$')
- len0 = i;
- }
-
- for (i = 0, j = 0; i < len0 && !isalpha (mangled[i]); i += 1, j += 1)
- demangled[j] = mangled[i];
-
- at_start_name = 1;
- while (i < len0)
- {
- if (at_start_name && mangled[i] == 'O')
- {
- int k;
- for (k = 0; ada_opname_table[k].mangled != NULL; k += 1)
- {
- int op_len = strlen (ada_opname_table[k].mangled);
- if (STREQN
- (ada_opname_table[k].mangled + 1, mangled + i + 1,
- op_len - 1) && !isalnum (mangled[i + op_len]))
- {
- strcpy (demangled + j, ada_opname_table[k].demangled);
- at_start_name = 0;
- i += op_len;
- j += strlen (ada_opname_table[k].demangled);
- break;
- }
- }
- if (ada_opname_table[k].mangled != NULL)
- continue;
- }
- at_start_name = 0;
-
- if (i < len0 - 4 && STREQN (mangled + i, "TK__", 4))
- i += 2;
- if (mangled[i] == 'X' && i != 0 && isalnum (mangled[i - 1]))
- {
- do
- i += 1;
- while (i < len0 && (mangled[i] == 'b' || mangled[i] == 'n'));
- if (i < len0)
- goto Suppress;
- }
- else if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_')
- {
- demangled[j] = '.';
- at_start_name = 1;
- i += 2;
- j += 1;
- }
- else
- {
- demangled[j] = mangled[i];
- i += 1;
- j += 1;
- }
- }
- demangled[j] = '\000';
-
- for (i = 0; demangled[i] != '\0'; i += 1)
- if (isupper (demangled[i]) || demangled[i] == ' ')
- goto Suppress;
-
- return demangled;
-
-Suppress:
- GROW_VECT (demangling_buffer, demangling_buffer_size, strlen (mangled) + 3);
- demangled = demangling_buffer;
- if (mangled[0] == '<')
- strcpy (demangled, mangled);
- else
- sprintf (demangled, "<%s>", mangled);
- return demangled;
-
-}
-
-/* Returns non-zero iff SYM_NAME matches NAME, ignoring any trailing
- * suffixes that encode debugging information or leading _ada_ on
- * SYM_NAME (see is_name_suffix commentary for the debugging
- * information that is ignored). If WILD, then NAME need only match a
- * suffix of SYM_NAME minus the same suffixes. Also returns 0 if
- * either argument is NULL. */
-
-int
-ada_match_name (const char *sym_name, const char *name, int wild)
-{
- if (sym_name == NULL || name == NULL)
- return 0;
- else if (wild)
- return wild_match (name, strlen (name), sym_name);
- else
- {
- int len_name = strlen (name);
- return (STREQN (sym_name, name, len_name)
- && is_name_suffix (sym_name + len_name))
- || (STREQN (sym_name, "_ada_", 5)
- && STREQN (sym_name + 5, name, len_name)
- && is_name_suffix (sym_name + len_name + 5));
- }
-}
-
-/* True (non-zero) iff in Ada mode, the symbol SYM should be
- suppressed in info listings. */
-
-int
-ada_suppress_symbol_printing (struct symbol *sym)
-{
- if (SYMBOL_NAMESPACE (sym) == STRUCT_NAMESPACE)
- return 1;
- else
- return is_suppressed_name (SYMBOL_NAME (sym));
-}
-
-
- /* Arrays */
-
-/* Names of MAX_ADA_DIMENS bounds in P_BOUNDS fields of
- array descriptors. */
-
-static char *bound_name[] = {
- "LB0", "UB0", "LB1", "UB1", "LB2", "UB2", "LB3", "UB3",
- "LB4", "UB4", "LB5", "UB5", "LB6", "UB6", "LB7", "UB7"
-};
-
-/* Maximum number of array dimensions we are prepared to handle. */
-
-#define MAX_ADA_DIMENS (sizeof(bound_name) / (2*sizeof(char*)))
-
-/* Like modify_field, but allows bitpos > wordlength. */
-
-static void
-modify_general_field (char *addr, LONGEST fieldval, int bitpos, int bitsize)
-{
- modify_field (addr + sizeof (LONGEST) * bitpos / (8 * sizeof (LONGEST)),
- fieldval, bitpos % (8 * sizeof (LONGEST)), bitsize);
-}
-
-
-/* The desc_* routines return primitive portions of array descriptors
- (fat pointers). */
-
-/* The descriptor or array type, if any, indicated by TYPE; removes
- level of indirection, if needed. */
-static struct type *
-desc_base_type (struct type *type)
-{
- if (type == NULL)
- return NULL;
- CHECK_TYPEDEF (type);
- if (type != NULL && TYPE_CODE (type) == TYPE_CODE_PTR)
- return check_typedef (TYPE_TARGET_TYPE (type));
- else
- return type;
-}
-
-/* True iff TYPE indicates a "thin" array pointer type. */
-static int
-is_thin_pntr (struct type *type)
-{
- return
- is_suffix (ada_type_name (desc_base_type (type)), "___XUT")
- || is_suffix (ada_type_name (desc_base_type (type)), "___XUT___XVE");
-}
-
-/* The descriptor type for thin pointer type TYPE. */
-static struct type *
-thin_descriptor_type (struct type *type)
-{
- struct type *base_type = desc_base_type (type);
- if (base_type == NULL)
- return NULL;
- if (is_suffix (ada_type_name (base_type), "___XVE"))
- return base_type;
- else
- {
- struct type *alt_type = ada_find_parallel_type (base_type, "___XVE");
- if (alt_type == NULL)
- return base_type;
- else
- return alt_type;
- }
-}
-
-/* A pointer to the array data for thin-pointer value VAL. */
-static struct value *
-thin_data_pntr (struct value *val)
-{
- struct type *type = VALUE_TYPE (val);
- if (TYPE_CODE (type) == TYPE_CODE_PTR)
- return value_cast (desc_data_type (thin_descriptor_type (type)),
- value_copy (val));
- else
- return value_from_longest (desc_data_type (thin_descriptor_type (type)),
- VALUE_ADDRESS (val) + VALUE_OFFSET (val));
-}
-
-/* True iff TYPE indicates a "thick" array pointer type. */
-static int
-is_thick_pntr (struct type *type)
-{
- type = desc_base_type (type);
- return (type != NULL && TYPE_CODE (type) == TYPE_CODE_STRUCT
- && lookup_struct_elt_type (type, "P_BOUNDS", 1) != NULL);
-}
-
-/* If TYPE is the type of an array descriptor (fat or thin pointer) or a
- pointer to one, the type of its bounds data; otherwise, NULL. */
-static struct type *
-desc_bounds_type (struct type *type)
-{
- struct type *r;
-
- type = desc_base_type (type);
-
- if (type == NULL)
- return NULL;
- else if (is_thin_pntr (type))
- {
- type = thin_descriptor_type (type);
- if (type == NULL)
- return NULL;
- r = lookup_struct_elt_type (type, "BOUNDS", 1);
- if (r != NULL)
- return check_typedef (r);
- }
- else if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
- {
- r = lookup_struct_elt_type (type, "P_BOUNDS", 1);
- if (r != NULL)
- return check_typedef (TYPE_TARGET_TYPE (check_typedef (r)));
- }
- return NULL;
-}
-
-/* If ARR is an array descriptor (fat or thin pointer), or pointer to
- one, a pointer to its bounds data. Otherwise NULL. */
-static struct value *
-desc_bounds (struct value *arr)
-{
- struct type *type = check_typedef (VALUE_TYPE (arr));
- if (is_thin_pntr (type))
- {
- struct type *bounds_type =
- desc_bounds_type (thin_descriptor_type (type));
- LONGEST addr;
-
- if (desc_bounds_type == NULL)
- error ("Bad GNAT array descriptor");
-
- /* NOTE: The following calculation is not really kosher, but
- since desc_type is an XVE-encoded type (and shouldn't be),
- the correct calculation is a real pain. FIXME (and fix GCC). */
- if (TYPE_CODE (type) == TYPE_CODE_PTR)
- addr = value_as_long (arr);
- else
- addr = VALUE_ADDRESS (arr) + VALUE_OFFSET (arr);
-
- return
- value_from_longest (lookup_pointer_type (bounds_type),
- addr - TYPE_LENGTH (bounds_type));
- }
-
- else if (is_thick_pntr (type))
- return value_struct_elt (&arr, NULL, "P_BOUNDS", NULL,
- "Bad GNAT array descriptor");
- else
- return NULL;
-}
-
-/* If TYPE is the type of an array-descriptor (fat pointer), the bit
- position of the field containing the address of the bounds data. */
-static int
-fat_pntr_bounds_bitpos (struct type *type)
-{
- return TYPE_FIELD_BITPOS (desc_base_type (type), 1);
-}
-
-/* If TYPE is the type of an array-descriptor (fat pointer), the bit
- size of the field containing the address of the bounds data. */
-static int
-fat_pntr_bounds_bitsize (struct type *type)
-{
- type = desc_base_type (type);
-
- if (TYPE_FIELD_BITSIZE (type, 1) > 0)
- return TYPE_FIELD_BITSIZE (type, 1);
- else
- return 8 * TYPE_LENGTH (check_typedef (TYPE_FIELD_TYPE (type, 1)));
-}
-
-/* If TYPE is the type of an array descriptor (fat or thin pointer) or a
- pointer to one, the type of its array data (a
- pointer-to-array-with-no-bounds type); otherwise, NULL. Use
- ada_type_of_array to get an array type with bounds data. */
-static struct type *
-desc_data_type (struct type *type)
-{
- type = desc_base_type (type);
-
- /* NOTE: The following is bogus; see comment in desc_bounds. */
- if (is_thin_pntr (type))
- return lookup_pointer_type
- (desc_base_type (TYPE_FIELD_TYPE (thin_descriptor_type (type), 1)));
- else if (is_thick_pntr (type))
- return lookup_struct_elt_type (type, "P_ARRAY", 1);
- else
- return NULL;
-}
-
-/* If ARR is an array descriptor (fat or thin pointer), a pointer to
- its array data. */
-static struct value *
-desc_data (struct value *arr)
-{
- struct type *type = VALUE_TYPE (arr);
- if (is_thin_pntr (type))
- return thin_data_pntr (arr);
- else if (is_thick_pntr (type))
- return value_struct_elt (&arr, NULL, "P_ARRAY", NULL,
- "Bad GNAT array descriptor");
- else
- return NULL;
-}
-
-
-/* If TYPE is the type of an array-descriptor (fat pointer), the bit
- position of the field containing the address of the data. */
-static int
-fat_pntr_data_bitpos (struct type *type)
-{
- return TYPE_FIELD_BITPOS (desc_base_type (type), 0);
-}
-
-/* If TYPE is the type of an array-descriptor (fat pointer), the bit
- size of the field containing the address of the data. */
-static int
-fat_pntr_data_bitsize (struct type *type)
-{
- type = desc_base_type (type);
-
- if (TYPE_FIELD_BITSIZE (type, 0) > 0)
- return TYPE_FIELD_BITSIZE (type, 0);
- else
- return TARGET_CHAR_BIT * TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0));
-}
-
-/* If BOUNDS is an array-bounds structure (or pointer to one), return
- the Ith lower bound stored in it, if WHICH is 0, and the Ith upper
- bound, if WHICH is 1. The first bound is I=1. */
-static struct value *
-desc_one_bound (struct value *bounds, int i, int which)
-{
- return value_struct_elt (&bounds, NULL, bound_name[2 * i + which - 2], NULL,
- "Bad GNAT array descriptor bounds");
-}
-
-/* If BOUNDS is an array-bounds structure type, return the bit position
- of the Ith lower bound stored in it, if WHICH is 0, and the Ith upper
- bound, if WHICH is 1. The first bound is I=1. */
-static int
-desc_bound_bitpos (struct type *type, int i, int which)
-{
- return TYPE_FIELD_BITPOS (desc_base_type (type), 2 * i + which - 2);
-}
-
-/* If BOUNDS is an array-bounds structure type, return the bit field size
- of the Ith lower bound stored in it, if WHICH is 0, and the Ith upper
- bound, if WHICH is 1. The first bound is I=1. */
-static int
-desc_bound_bitsize (struct type *type, int i, int which)
-{
- type = desc_base_type (type);
-
- if (TYPE_FIELD_BITSIZE (type, 2 * i + which - 2) > 0)
- return TYPE_FIELD_BITSIZE (type, 2 * i + which - 2);
- else
- return 8 * TYPE_LENGTH (TYPE_FIELD_TYPE (type, 2 * i + which - 2));
-}
-
-/* If TYPE is the type of an array-bounds structure, the type of its
- Ith bound (numbering from 1). Otherwise, NULL. */
-static struct type *
-desc_index_type (struct type *type, int i)
-{
- type = desc_base_type (type);
-
- if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
- return lookup_struct_elt_type (type, bound_name[2 * i - 2], 1);
- else
- return NULL;
-}
-
-/* The number of index positions in the array-bounds type TYPE. 0
- if TYPE is NULL. */
-static int
-desc_arity (struct type *type)
-{
- type = desc_base_type (type);
-
- if (type != NULL)
- return TYPE_NFIELDS (type) / 2;
- return 0;
-}
-
-
-/* Non-zero iff type is a simple array type (or pointer to one). */
-int
-ada_is_simple_array (struct type *type)
-{
- if (type == NULL)
- return 0;
- CHECK_TYPEDEF (type);
- return (TYPE_CODE (type) == TYPE_CODE_ARRAY
- || (TYPE_CODE (type) == TYPE_CODE_PTR
- && TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY));
-}
-
-/* Non-zero iff type belongs to a GNAT array descriptor. */
-int
-ada_is_array_descriptor (struct type *type)
-{
- struct type *data_type = desc_data_type (type);
-
- if (type == NULL)
- return 0;
- CHECK_TYPEDEF (type);
- return
- data_type != NULL
- && ((TYPE_CODE (data_type) == TYPE_CODE_PTR
- && TYPE_TARGET_TYPE (data_type) != NULL
- && TYPE_CODE (TYPE_TARGET_TYPE (data_type)) == TYPE_CODE_ARRAY)
- ||
- TYPE_CODE (data_type) == TYPE_CODE_ARRAY)
- && desc_arity (desc_bounds_type (type)) > 0;
-}
-
-/* Non-zero iff type is a partially mal-formed GNAT array
- descriptor. (FIXME: This is to compensate for some problems with
- debugging output from GNAT. Re-examine periodically to see if it
- is still needed. */
-int
-ada_is_bogus_array_descriptor (struct type *type)
-{
- return
- type != NULL
- && TYPE_CODE (type) == TYPE_CODE_STRUCT
- && (lookup_struct_elt_type (type, "P_BOUNDS", 1) != NULL
- || lookup_struct_elt_type (type, "P_ARRAY", 1) != NULL)
- && !ada_is_array_descriptor (type);
-}
-
-
-/* If ARR has a record type in the form of a standard GNAT array descriptor,
- (fat pointer) returns the type of the array data described---specifically,
- a pointer-to-array type. If BOUNDS is non-zero, the bounds data are filled
- in from the descriptor; otherwise, they are left unspecified. If
- the ARR denotes a null array descriptor and BOUNDS is non-zero,
- returns NULL. The result is simply the type of ARR if ARR is not
- a descriptor. */
-struct type *
-ada_type_of_array (struct value *arr, int bounds)
-{
- if (ada_is_packed_array_type (VALUE_TYPE (arr)))
- return decode_packed_array_type (VALUE_TYPE (arr));
-
- if (!ada_is_array_descriptor (VALUE_TYPE (arr)))
- return VALUE_TYPE (arr);
-
- if (!bounds)
- return
- check_typedef (TYPE_TARGET_TYPE (desc_data_type (VALUE_TYPE (arr))));
- else
- {
- struct type *elt_type;
- int arity;
- struct value *descriptor;
- struct objfile *objf = TYPE_OBJFILE (VALUE_TYPE (arr));
-
- elt_type = ada_array_element_type (VALUE_TYPE (arr), -1);
- arity = ada_array_arity (VALUE_TYPE (arr));
-
- if (elt_type == NULL || arity == 0)
- return check_typedef (VALUE_TYPE (arr));
-
- descriptor = desc_bounds (arr);
- if (value_as_long (descriptor) == 0)
- return NULL;
- while (arity > 0)
- {
- struct type *range_type = alloc_type (objf);
- struct type *array_type = alloc_type (objf);
- struct value *low = desc_one_bound (descriptor, arity, 0);
- struct value *high = desc_one_bound (descriptor, arity, 1);
- arity -= 1;
-
- create_range_type (range_type, VALUE_TYPE (low),
- (int) value_as_long (low),
- (int) value_as_long (high));
- elt_type = create_array_type (array_type, elt_type, range_type);
- }
-
- return lookup_pointer_type (elt_type);
- }
-}
-
-/* If ARR does not represent an array, returns ARR unchanged.
- Otherwise, returns either a standard GDB array with bounds set
- appropriately or, if ARR is a non-null fat pointer, a pointer to a standard
- GDB array. Returns NULL if ARR is a null fat pointer. */
-struct value *
-ada_coerce_to_simple_array_ptr (struct value *arr)
-{
- if (ada_is_array_descriptor (VALUE_TYPE (arr)))
- {
- struct type *arrType = ada_type_of_array (arr, 1);
- if (arrType == NULL)
- return NULL;
- return value_cast (arrType, value_copy (desc_data (arr)));
- }
- else if (ada_is_packed_array_type (VALUE_TYPE (arr)))
- return decode_packed_array (arr);
- else
- return arr;
-}
-
-/* If ARR does not represent an array, returns ARR unchanged.
- Otherwise, returns a standard GDB array describing ARR (which may
- be ARR itself if it already is in the proper form). */
-struct value *
-ada_coerce_to_simple_array (struct value *arr)
-{
- if (ada_is_array_descriptor (VALUE_TYPE (arr)))
- {
- struct value *arrVal = ada_coerce_to_simple_array_ptr (arr);
- if (arrVal == NULL)
- error ("Bounds unavailable for null array pointer.");
- return value_ind (arrVal);
- }
- else if (ada_is_packed_array_type (VALUE_TYPE (arr)))
- return decode_packed_array (arr);
- else
- return arr;
-}
-
-/* If TYPE represents a GNAT array type, return it translated to an
- ordinary GDB array type (possibly with BITSIZE fields indicating
- packing). For other types, is the identity. */
-struct type *
-ada_coerce_to_simple_array_type (struct type *type)
-{
- struct value *mark = value_mark ();
- struct value *dummy = value_from_longest (builtin_type_long, 0);
- struct type *result;
- VALUE_TYPE (dummy) = type;
- result = ada_type_of_array (dummy, 0);
- value_free_to_mark (dummy);
- return result;
-}
-
-/* Non-zero iff TYPE represents a standard GNAT packed-array type. */
-int
-ada_is_packed_array_type (struct type *type)
-{
- if (type == NULL)
- return 0;
- CHECK_TYPEDEF (type);
- return
- ada_type_name (type) != NULL
- && strstr (ada_type_name (type), "___XP") != NULL;
-}
-
-/* Given that TYPE is a standard GDB array type with all bounds filled
- in, and that the element size of its ultimate scalar constituents
- (that is, either its elements, or, if it is an array of arrays, its
- elements' elements, etc.) is *ELT_BITS, return an identical type,
- but with the bit sizes of its elements (and those of any
- constituent arrays) recorded in the BITSIZE components of its
- TYPE_FIELD_BITSIZE values, and with *ELT_BITS set to its total size
- in bits. */
-static struct type *
-packed_array_type (struct type *type, long *elt_bits)
-{
- struct type *new_elt_type;
- struct type *new_type;
- LONGEST low_bound, high_bound;
-
- CHECK_TYPEDEF (type);
- if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
- return type;
-
- new_type = alloc_type (TYPE_OBJFILE (type));
- new_elt_type = packed_array_type (check_typedef (TYPE_TARGET_TYPE (type)),
- elt_bits);
- create_array_type (new_type, new_elt_type, TYPE_FIELD_TYPE (type, 0));
- TYPE_FIELD_BITSIZE (new_type, 0) = *elt_bits;
- TYPE_NAME (new_type) = ada_type_name (type);
-
- if (get_discrete_bounds (TYPE_FIELD_TYPE (type, 0),
- &low_bound, &high_bound) < 0)
- low_bound = high_bound = 0;
- if (high_bound < low_bound)
- *elt_bits = TYPE_LENGTH (new_type) = 0;
- else
- {
- *elt_bits *= (high_bound - low_bound + 1);
- TYPE_LENGTH (new_type) =
- (*elt_bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT;
- }
-
- /* TYPE_FLAGS (new_type) |= TYPE_FLAG_FIXED_INSTANCE; */
- /* FIXME: TYPE_FLAG_FIXED_INSTANCE should be defined in gdbtypes.h */
- return new_type;
-}
-
-/* The array type encoded by TYPE, where ada_is_packed_array_type (TYPE).
- */
-static struct type *
-decode_packed_array_type (struct type *type)
-{
- struct symbol **syms;
- struct block **blocks;
- const char *raw_name = ada_type_name (check_typedef (type));
- char *name = (char *) alloca (strlen (raw_name) + 1);
- char *tail = strstr (raw_name, "___XP");
- struct type *shadow_type;
- long bits;
- int i, n;
-
- memcpy (name, raw_name, tail - raw_name);
- name[tail - raw_name] = '\000';
-
- /* NOTE: Use ada_lookup_symbol_list because of bug in some versions
- * of gcc (Solaris, e.g.). FIXME when compiler is fixed. */
- n = ada_lookup_symbol_list (name, get_selected_block (NULL),
- VAR_NAMESPACE, &syms, &blocks);
- for (i = 0; i < n; i += 1)
- if (syms[i] != NULL && SYMBOL_CLASS (syms[i]) == LOC_TYPEDEF
- && STREQ (name, ada_type_name (SYMBOL_TYPE (syms[i]))))
- break;
- if (i >= n)
- {
- warning ("could not find bounds information on packed array");
- return NULL;
- }
- shadow_type = SYMBOL_TYPE (syms[i]);
-
- if (TYPE_CODE (shadow_type) != TYPE_CODE_ARRAY)
- {
- warning ("could not understand bounds information on packed array");
- return NULL;
- }
-
- if (sscanf (tail + sizeof ("___XP") - 1, "%ld", &bits) != 1)
- {
- warning ("could not understand bit size information on packed array");
- return NULL;
- }
-
- return packed_array_type (shadow_type, &bits);
-}
-
-/* Given that ARR is a struct value* indicating a GNAT packed array,
- returns a simple array that denotes that array. Its type is a
- standard GDB array type except that the BITSIZEs of the array
- target types are set to the number of bits in each element, and the
- type length is set appropriately. */
-
-static struct value *
-decode_packed_array (struct value *arr)
-{
- struct type *type = decode_packed_array_type (VALUE_TYPE (arr));
-
- if (type == NULL)
- {
- error ("can't unpack array");
- return NULL;
- }
- else
- return coerce_unspec_val_to_type (arr, 0, type);
-}
-
-
-/* The value of the element of packed array ARR at the ARITY indices
- given in IND. ARR must be a simple array. */
-
-static struct value *
-value_subscript_packed (struct value *arr, int arity, struct value **ind)
-{
- int i;
- int bits, elt_off, bit_off;
- long elt_total_bit_offset;
- struct type *elt_type;
- struct value *v;
-
- bits = 0;
- elt_total_bit_offset = 0;
- elt_type = check_typedef (VALUE_TYPE (arr));
- for (i = 0; i < arity; i += 1)
- {
- if (TYPE_CODE (elt_type) != TYPE_CODE_ARRAY
- || TYPE_FIELD_BITSIZE (elt_type, 0) == 0)
- error
- ("attempt to do packed indexing of something other than a packed array");
- else
- {
- struct type *range_type = TYPE_INDEX_TYPE (elt_type);
- LONGEST lowerbound, upperbound;
- LONGEST idx;
-
- if (get_discrete_bounds (range_type, &lowerbound, &upperbound) < 0)
- {
- warning ("don't know bounds of array");
- lowerbound = upperbound = 0;
- }
-
- idx = value_as_long (value_pos_atr (ind[i]));
- if (idx < lowerbound || idx > upperbound)
- warning ("packed array index %ld out of bounds", (long) idx);
- bits = TYPE_FIELD_BITSIZE (elt_type, 0);
- elt_total_bit_offset += (idx - lowerbound) * bits;
- elt_type = check_typedef (TYPE_TARGET_TYPE (elt_type));
- }
- }
- elt_off = elt_total_bit_offset / HOST_CHAR_BIT;
- bit_off = elt_total_bit_offset % HOST_CHAR_BIT;
-
- v = ada_value_primitive_packed_val (arr, NULL, elt_off, bit_off,
- bits, elt_type);
- if (VALUE_LVAL (arr) == lval_internalvar)
- VALUE_LVAL (v) = lval_internalvar_component;
- else
- VALUE_LVAL (v) = VALUE_LVAL (arr);
- return v;
-}
-
-/* Non-zero iff TYPE includes negative integer values. */
-
-static int
-has_negatives (struct type *type)
-{
- switch (TYPE_CODE (type))
- {
- default:
- return 0;
- case TYPE_CODE_INT:
- return !TYPE_UNSIGNED (type);
- case TYPE_CODE_RANGE:
- return TYPE_LOW_BOUND (type) < 0;
- }
-}
-
-
-/* Create a new value of type TYPE from the contents of OBJ starting
- at byte OFFSET, and bit offset BIT_OFFSET within that byte,
- proceeding for BIT_SIZE bits. If OBJ is an lval in memory, then
- assigning through the result will set the field fetched from. OBJ
- may also be NULL, in which case, VALADDR+OFFSET must address the
- start of storage containing the packed value. The value returned
- in this case is never an lval.
- Assumes 0 <= BIT_OFFSET < HOST_CHAR_BIT. */
-
-struct value *
-ada_value_primitive_packed_val (struct value *obj, char *valaddr, long offset,
- int bit_offset, int bit_size,
- struct type *type)
-{
- struct value *v;
- int src, /* Index into the source area. */
- targ, /* Index into the target area. */
- i, srcBitsLeft, /* Number of source bits left to move. */
- nsrc, ntarg, /* Number of source and target bytes. */
- unusedLS, /* Number of bits in next significant
- * byte of source that are unused. */
- accumSize; /* Number of meaningful bits in accum */
- unsigned char *bytes; /* First byte containing data to unpack. */
- unsigned char *unpacked;
- unsigned long accum; /* Staging area for bits being transferred */
- unsigned char sign;
- int len = (bit_size + bit_offset + HOST_CHAR_BIT - 1) / 8;
- /* Transmit bytes from least to most significant; delta is the
- * direction the indices move. */
- int delta = BITS_BIG_ENDIAN ? -1 : 1;
-
- CHECK_TYPEDEF (type);
-
- if (obj == NULL)
- {
- v = allocate_value (type);
- bytes = (unsigned char *) (valaddr + offset);
- }
- else if (VALUE_LAZY (obj))
- {
- v = value_at (type,
- VALUE_ADDRESS (obj) + VALUE_OFFSET (obj) + offset, NULL);
- bytes = (unsigned char *) alloca (len);
- read_memory (VALUE_ADDRESS (v), bytes, len);
- }
- else
- {
- v = allocate_value (type);
- bytes = (unsigned char *) VALUE_CONTENTS (obj) + offset;
- }
-
- if (obj != NULL)
- {
- VALUE_LVAL (v) = VALUE_LVAL (obj);
- if (VALUE_LVAL (obj) == lval_internalvar)
- VALUE_LVAL (v) = lval_internalvar_component;
- VALUE_ADDRESS (v) = VALUE_ADDRESS (obj) + VALUE_OFFSET (obj) + offset;
- VALUE_BITPOS (v) = bit_offset + VALUE_BITPOS (obj);
- VALUE_BITSIZE (v) = bit_size;
- if (VALUE_BITPOS (v) >= HOST_CHAR_BIT)
- {
- VALUE_ADDRESS (v) += 1;
- VALUE_BITPOS (v) -= HOST_CHAR_BIT;
- }
- }
- else
- VALUE_BITSIZE (v) = bit_size;
- unpacked = (unsigned char *) VALUE_CONTENTS (v);
-
- srcBitsLeft = bit_size;
- nsrc = len;
- ntarg = TYPE_LENGTH (type);
- sign = 0;
- if (bit_size == 0)
- {
- memset (unpacked, 0, TYPE_LENGTH (type));
- return v;
- }
- else if (BITS_BIG_ENDIAN)
- {
- src = len - 1;
- if (has_negatives (type) &&
- ((bytes[0] << bit_offset) & (1 << (HOST_CHAR_BIT - 1))))
- sign = ~0;
-
- unusedLS =
- (HOST_CHAR_BIT - (bit_size + bit_offset) % HOST_CHAR_BIT)
- % HOST_CHAR_BIT;
-
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_ARRAY:
- case TYPE_CODE_UNION:
- case TYPE_CODE_STRUCT:
- /* Non-scalar values must be aligned at a byte boundary. */
- accumSize =
- (HOST_CHAR_BIT - bit_size % HOST_CHAR_BIT) % HOST_CHAR_BIT;
- /* And are placed at the beginning (most-significant) bytes
- * of the target. */
- targ = src;
- break;
- default:
- accumSize = 0;
- targ = TYPE_LENGTH (type) - 1;
- break;
- }
- }
- else
- {
- int sign_bit_offset = (bit_size + bit_offset - 1) % 8;
-
- src = targ = 0;
- unusedLS = bit_offset;
- accumSize = 0;
-
- if (has_negatives (type) && (bytes[len - 1] & (1 << sign_bit_offset)))
- sign = ~0;
- }
-
- accum = 0;
- while (nsrc > 0)
- {
- /* Mask for removing bits of the next source byte that are not
- * part of the value. */
- unsigned int unusedMSMask =
- (1 << (srcBitsLeft >= HOST_CHAR_BIT ? HOST_CHAR_BIT : srcBitsLeft)) -
- 1;
- /* Sign-extend bits for this byte. */
- unsigned int signMask = sign & ~unusedMSMask;
- accum |=
- (((bytes[src] >> unusedLS) & unusedMSMask) | signMask) << accumSize;
- accumSize += HOST_CHAR_BIT - unusedLS;
- if (accumSize >= HOST_CHAR_BIT)
- {
- unpacked[targ] = accum & ~(~0L << HOST_CHAR_BIT);
- accumSize -= HOST_CHAR_BIT;
- accum >>= HOST_CHAR_BIT;
- ntarg -= 1;
- targ += delta;
- }
- srcBitsLeft -= HOST_CHAR_BIT - unusedLS;
- unusedLS = 0;
- nsrc -= 1;
- src += delta;
- }
- while (ntarg > 0)
- {
- accum |= sign << accumSize;
- unpacked[targ] = accum & ~(~0L << HOST_CHAR_BIT);
- accumSize -= HOST_CHAR_BIT;
- accum >>= HOST_CHAR_BIT;
- ntarg -= 1;
- targ += delta;
- }
-
- return v;
-}
-
-/* Move N bits from SOURCE, starting at bit offset SRC_OFFSET to
- TARGET, starting at bit offset TARG_OFFSET. SOURCE and TARGET must
- not overlap. */
-static void
-move_bits (char *target, int targ_offset, char *source, int src_offset, int n)
-{
- unsigned int accum, mask;
- int accum_bits, chunk_size;
-
- target += targ_offset / HOST_CHAR_BIT;
- targ_offset %= HOST_CHAR_BIT;
- source += src_offset / HOST_CHAR_BIT;
- src_offset %= HOST_CHAR_BIT;
- if (BITS_BIG_ENDIAN)
- {
- accum = (unsigned char) *source;
- source += 1;
- accum_bits = HOST_CHAR_BIT - src_offset;
-
- while (n > 0)
- {
- int unused_right;
- accum = (accum << HOST_CHAR_BIT) + (unsigned char) *source;
- accum_bits += HOST_CHAR_BIT;
- source += 1;
- chunk_size = HOST_CHAR_BIT - targ_offset;
- if (chunk_size > n)
- chunk_size = n;
- unused_right = HOST_CHAR_BIT - (chunk_size + targ_offset);
- mask = ((1 << chunk_size) - 1) << unused_right;
- *target =
- (*target & ~mask)
- | ((accum >> (accum_bits - chunk_size - unused_right)) & mask);
- n -= chunk_size;
- accum_bits -= chunk_size;
- target += 1;
- targ_offset = 0;
- }
- }
- else
- {
- accum = (unsigned char) *source >> src_offset;
- source += 1;
- accum_bits = HOST_CHAR_BIT - src_offset;
-
- while (n > 0)
- {
- accum = accum + ((unsigned char) *source << accum_bits);
- accum_bits += HOST_CHAR_BIT;
- source += 1;
- chunk_size = HOST_CHAR_BIT - targ_offset;
- if (chunk_size > n)
- chunk_size = n;
- mask = ((1 << chunk_size) - 1) << targ_offset;
- *target = (*target & ~mask) | ((accum << targ_offset) & mask);
- n -= chunk_size;
- accum_bits -= chunk_size;
- accum >>= chunk_size;
- target += 1;
- targ_offset = 0;
- }
- }
-}
-
-
-/* Store the contents of FROMVAL into the location of TOVAL.
- Return a new value with the location of TOVAL and contents of
- FROMVAL. Handles assignment into packed fields that have
- floating-point or non-scalar types. */
-
-static struct value *
-ada_value_assign (struct value *toval, struct value *fromval)
-{
- struct type *type = VALUE_TYPE (toval);
- int bits = VALUE_BITSIZE (toval);
-
- if (!toval->modifiable)
- error ("Left operand of assignment is not a modifiable lvalue.");
-
- COERCE_REF (toval);
-
- if (VALUE_LVAL (toval) == lval_memory
- && bits > 0
- && (TYPE_CODE (type) == TYPE_CODE_FLT
- || TYPE_CODE (type) == TYPE_CODE_STRUCT))
- {
- int len =
- (VALUE_BITPOS (toval) + bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT;
- char *buffer = (char *) alloca (len);
- struct value *val;
-
- if (TYPE_CODE (type) == TYPE_CODE_FLT)
- fromval = value_cast (type, fromval);
-
- read_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), buffer, len);
- if (BITS_BIG_ENDIAN)
- move_bits (buffer, VALUE_BITPOS (toval),
- VALUE_CONTENTS (fromval),
- TYPE_LENGTH (VALUE_TYPE (fromval)) * TARGET_CHAR_BIT -
- bits, bits);
- else
- move_bits (buffer, VALUE_BITPOS (toval), VALUE_CONTENTS (fromval),
- 0, bits);
- write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), buffer,
- len);
-
- val = value_copy (toval);
- memcpy (VALUE_CONTENTS_RAW (val), VALUE_CONTENTS (fromval),
- TYPE_LENGTH (type));
- VALUE_TYPE (val) = type;
-
- return val;
- }
-
- return value_assign (toval, fromval);
-}
-
-
-/* The value of the element of array ARR at the ARITY indices given in IND.
- ARR may be either a simple array, GNAT array descriptor, or pointer
- thereto. */
-
-struct value *
-ada_value_subscript (struct value *arr, int arity, struct value **ind)
-{
- int k;
- struct value *elt;
- struct type *elt_type;
-
- elt = ada_coerce_to_simple_array (arr);
-
- elt_type = check_typedef (VALUE_TYPE (elt));
- if (TYPE_CODE (elt_type) == TYPE_CODE_ARRAY
- && TYPE_FIELD_BITSIZE (elt_type, 0) > 0)
- return value_subscript_packed (elt, arity, ind);
-
- for (k = 0; k < arity; k += 1)
- {
- if (TYPE_CODE (elt_type) != TYPE_CODE_ARRAY)
- error ("too many subscripts (%d expected)", k);
- elt = value_subscript (elt, value_pos_atr (ind[k]));
- }
- return elt;
-}
-
-/* Assuming ARR is a pointer to a standard GDB array of type TYPE, the
- value of the element of *ARR at the ARITY indices given in
- IND. Does not read the entire array into memory. */
-
-struct value *
-ada_value_ptr_subscript (struct value *arr, struct type *type, int arity,
- struct value **ind)
-{
- int k;
-
- for (k = 0; k < arity; k += 1)
- {
- LONGEST lwb, upb;
- struct value *idx;
-
- if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
- error ("too many subscripts (%d expected)", k);
- arr = value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
- value_copy (arr));
- get_discrete_bounds (TYPE_INDEX_TYPE (type), &lwb, &upb);
- if (lwb == 0)
- idx = ind[k];
- else
- idx = value_sub (ind[k], value_from_longest (builtin_type_int, lwb));
- arr = value_add (arr, idx);
- type = TYPE_TARGET_TYPE (type);
- }
-
- return value_ind (arr);
-}
-
-/* If type is a record type in the form of a standard GNAT array
- descriptor, returns the number of dimensions for type. If arr is a
- simple array, returns the number of "array of"s that prefix its
- type designation. Otherwise, returns 0. */
-
-int
-ada_array_arity (struct type *type)
-{
- int arity;
-
- if (type == NULL)
- return 0;
-
- type = desc_base_type (type);
-
- arity = 0;
- if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
- return desc_arity (desc_bounds_type (type));
- else
- while (TYPE_CODE (type) == TYPE_CODE_ARRAY)
- {
- arity += 1;
- type = check_typedef (TYPE_TARGET_TYPE (type));
- }
-
- return arity;
-}
-
-/* If TYPE is a record type in the form of a standard GNAT array
- descriptor or a simple array type, returns the element type for
- TYPE after indexing by NINDICES indices, or by all indices if
- NINDICES is -1. Otherwise, returns NULL. */
-
-struct type *
-ada_array_element_type (struct type *type, int nindices)
-{
- type = desc_base_type (type);
-
- if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
- {
- int k;
- struct type *p_array_type;
-
- p_array_type = desc_data_type (type);
-
- k = ada_array_arity (type);
- if (k == 0)
- return NULL;
-
- /* Initially p_array_type = elt_type(*)[]...(k times)...[] */
- if (nindices >= 0 && k > nindices)
- k = nindices;
- p_array_type = TYPE_TARGET_TYPE (p_array_type);
- while (k > 0 && p_array_type != NULL)
- {
- p_array_type = check_typedef (TYPE_TARGET_TYPE (p_array_type));
- k -= 1;
- }
- return p_array_type;
- }
- else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
- {
- while (nindices != 0 && TYPE_CODE (type) == TYPE_CODE_ARRAY)
- {
- type = TYPE_TARGET_TYPE (type);
- nindices -= 1;
- }
- return type;
- }
-
- return NULL;
-}
-
-/* The type of nth index in arrays of given type (n numbering from 1). Does
- not examine memory. */
-
-struct type *
-ada_index_type (struct type *type, int n)
-{
- type = desc_base_type (type);
-
- if (n > ada_array_arity (type))
- return NULL;
-
- if (ada_is_simple_array (type))
- {
- int i;
-
- for (i = 1; i < n; i += 1)
- type = TYPE_TARGET_TYPE (type);
-
- return TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0));
- }
- else
- return desc_index_type (desc_bounds_type (type), n);
-}
-
-/* Given that arr is an array type, returns the lower bound of the
- Nth index (numbering from 1) if WHICH is 0, and the upper bound if
- WHICH is 1. This returns bounds 0 .. -1 if ARR_TYPE is an
- array-descriptor type. If TYPEP is non-null, *TYPEP is set to the
- bounds type. It works for other arrays with bounds supplied by
- run-time quantities other than discriminants. */
-
-LONGEST
-ada_array_bound_from_type (struct type * arr_type, int n, int which,
- struct type ** typep)
-{
- struct type *type;
- struct type *index_type_desc;
-
- if (ada_is_packed_array_type (arr_type))
- arr_type = decode_packed_array_type (arr_type);
-
- if (arr_type == NULL || !ada_is_simple_array (arr_type))
- {
- if (typep != NULL)
- *typep = builtin_type_int;
- return (LONGEST) - which;
- }
-
- if (TYPE_CODE (arr_type) == TYPE_CODE_PTR)
- type = TYPE_TARGET_TYPE (arr_type);
- else
- type = arr_type;
-
- index_type_desc = ada_find_parallel_type (type, "___XA");
- if (index_type_desc == NULL)
- {
- struct type *range_type;
- struct type *index_type;
-
- while (n > 1)
- {
- type = TYPE_TARGET_TYPE (type);
- n -= 1;
- }
-
- range_type = TYPE_INDEX_TYPE (type);
- index_type = TYPE_TARGET_TYPE (range_type);
- if (TYPE_CODE (index_type) == TYPE_CODE_UNDEF)
- index_type = builtin_type_long;
- if (typep != NULL)
- *typep = index_type;
- return
- (LONGEST) (which == 0
- ? TYPE_LOW_BOUND (range_type)
- : TYPE_HIGH_BOUND (range_type));
- }
- else
- {
- struct type *index_type =
- to_fixed_range_type (TYPE_FIELD_NAME (index_type_desc, n - 1),
- NULL, TYPE_OBJFILE (arr_type));
- if (typep != NULL)
- *typep = TYPE_TARGET_TYPE (index_type);
- return
- (LONGEST) (which == 0
- ? TYPE_LOW_BOUND (index_type)
- : TYPE_HIGH_BOUND (index_type));
- }
-}
-
-/* Given that arr is an array value, returns the lower bound of the
- nth index (numbering from 1) if which is 0, and the upper bound if
- which is 1. This routine will also work for arrays with bounds
- supplied by run-time quantities other than discriminants. */
-
-struct value *
-ada_array_bound (arr, n, which)
- struct value *arr;
- int n;
- int which;
-{
- struct type *arr_type = VALUE_TYPE (arr);
-
- if (ada_is_packed_array_type (arr_type))
- return ada_array_bound (decode_packed_array (arr), n, which);
- else if (ada_is_simple_array (arr_type))
- {
- struct type *type;
- LONGEST v = ada_array_bound_from_type (arr_type, n, which, &type);
- return value_from_longest (type, v);
- }
- else
- return desc_one_bound (desc_bounds (arr), n, which);
-}
-
-/* Given that arr is an array value, returns the length of the
- nth index. This routine will also work for arrays with bounds
- supplied by run-time quantities other than discriminants. Does not
- work for arrays indexed by enumeration types with representation
- clauses at the moment. */
-
-struct value *
-ada_array_length (struct value *arr, int n)
-{
- struct type *arr_type = check_typedef (VALUE_TYPE (arr));
- struct type *index_type_desc;
-
- if (ada_is_packed_array_type (arr_type))
- return ada_array_length (decode_packed_array (arr), n);
-
- if (ada_is_simple_array (arr_type))
- {
- struct type *type;
- LONGEST v =
- ada_array_bound_from_type (arr_type, n, 1, &type) -
- ada_array_bound_from_type (arr_type, n, 0, NULL) + 1;
- return value_from_longest (type, v);
- }
- else
- return
- value_from_longest (builtin_type_ada_int,
- value_as_long (desc_one_bound (desc_bounds (arr),
- n, 1))
- - value_as_long (desc_one_bound (desc_bounds (arr),
- n, 0)) + 1);
-}
-
-
- /* Name resolution */
-
-/* The "demangled" name for the user-definable Ada operator corresponding
- to op. */
-
-static const char *
-ada_op_name (enum exp_opcode op)
-{
- int i;
-
- for (i = 0; ada_opname_table[i].mangled != NULL; i += 1)
- {
- if (ada_opname_table[i].op == op)
- return ada_opname_table[i].demangled;
- }
- error ("Could not find operator name for opcode");
-}
-
-
-/* Same as evaluate_type (*EXP), but resolves ambiguous symbol
- references (OP_UNRESOLVED_VALUES) and converts operators that are
- user-defined into appropriate function calls. If CONTEXT_TYPE is
- non-null, it provides a preferred result type [at the moment, only
- type void has any effect---causing procedures to be preferred over
- functions in calls]. A null CONTEXT_TYPE indicates that a non-void
- return type is preferred. The variable unresolved_names contains a list
- of character strings referenced by expout that should be freed.
- May change (expand) *EXP. */
-
-void
-ada_resolve (struct expression **expp, struct type *context_type)
-{
- int pc;
- pc = 0;
- ada_resolve_subexp (expp, &pc, 1, context_type);
-}
-
-/* Resolve the operator of the subexpression beginning at
- position *POS of *EXPP. "Resolving" consists of replacing
- OP_UNRESOLVED_VALUE with an appropriate OP_VAR_VALUE, replacing
- built-in operators with function calls to user-defined operators,
- where appropriate, and (when DEPROCEDURE_P is non-zero), converting
- function-valued variables into parameterless calls. May expand
- EXP. The CONTEXT_TYPE functions as in ada_resolve, above. */
-
-static struct value *
-ada_resolve_subexp (struct expression **expp, int *pos, int deprocedure_p,
- struct type *context_type)
-{
- int pc = *pos;
- int i;
- struct expression *exp; /* Convenience: == *expp */
- enum exp_opcode op = (*expp)->elts[pc].opcode;
- struct value **argvec; /* Vector of operand types (alloca'ed). */
- int nargs; /* Number of operands */
-
- argvec = NULL;
- nargs = 0;
- exp = *expp;
-
- /* Pass one: resolve operands, saving their types and updating *pos. */
- switch (op)
- {
- case OP_VAR_VALUE:
- /* case OP_UNRESOLVED_VALUE: */
- /* FIXME: OP_UNRESOLVED_VALUE should be defined in expression.h */
- *pos += 4;
- break;
-
- case OP_FUNCALL:
- nargs = longest_to_int (exp->elts[pc + 1].longconst) + 1;
- /* FIXME: OP_UNRESOLVED_VALUE should be defined in expression.h */
- /* if (exp->elts[pc+3].opcode == OP_UNRESOLVED_VALUE)
- {
- *pos += 7;
-
- argvec = (struct value* *) alloca (sizeof (struct value*) * (nargs + 1));
- for (i = 0; i < nargs-1; i += 1)
- argvec[i] = ada_resolve_subexp (expp, pos, 1, NULL);
- argvec[i] = NULL;
- }
- else
- {
- *pos += 3;
- ada_resolve_subexp (expp, pos, 0, NULL);
- for (i = 1; i < nargs; i += 1)
- ada_resolve_subexp (expp, pos, 1, NULL);
- }
- */
- exp = *expp;
- break;
-
- /* FIXME: UNOP_QUAL should be defined in expression.h */
- /* case UNOP_QUAL:
- nargs = 1;
- *pos += 3;
- ada_resolve_subexp (expp, pos, 1, exp->elts[pc + 1].type);
- exp = *expp;
- break;
- */
- /* FIXME: OP_ATTRIBUTE should be defined in expression.h */
- /* case OP_ATTRIBUTE:
- nargs = longest_to_int (exp->elts[pc + 1].longconst) + 1;
- *pos += 4;
- for (i = 0; i < nargs; i += 1)
- ada_resolve_subexp (expp, pos, 1, NULL);
- exp = *expp;
- break;
- */
- case UNOP_ADDR:
- nargs = 1;
- *pos += 1;
- ada_resolve_subexp (expp, pos, 0, NULL);
- exp = *expp;
- break;
-
- case BINOP_ASSIGN:
- {
- struct value *arg1;
- nargs = 2;
- *pos += 1;
- arg1 = ada_resolve_subexp (expp, pos, 0, NULL);
- if (arg1 == NULL)
- ada_resolve_subexp (expp, pos, 1, NULL);
- else
- ada_resolve_subexp (expp, pos, 1, VALUE_TYPE (arg1));
- break;
- }
-
- default:
- switch (op)
- {
- default:
- error ("Unexpected operator during name resolution");
- case UNOP_CAST:
- /* case UNOP_MBR:
- nargs = 1;
- *pos += 3;
- break;
- */
- case BINOP_ADD:
- case BINOP_SUB:
- case BINOP_MUL:
- case BINOP_DIV:
- case BINOP_REM:
- case BINOP_MOD:
- case BINOP_EXP:
- case BINOP_CONCAT:
- case BINOP_LOGICAL_AND:
- case BINOP_LOGICAL_OR:
- case BINOP_BITWISE_AND:
- case BINOP_BITWISE_IOR:
- case BINOP_BITWISE_XOR:
-
- case BINOP_EQUAL:
- case BINOP_NOTEQUAL:
- case BINOP_LESS:
- case BINOP_GTR:
- case BINOP_LEQ:
- case BINOP_GEQ:
-
- case BINOP_REPEAT:
- case BINOP_SUBSCRIPT:
- case BINOP_COMMA:
- nargs = 2;
- *pos += 1;
- break;
-
- case UNOP_NEG:
- case UNOP_PLUS:
- case UNOP_LOGICAL_NOT:
- case UNOP_ABS:
- case UNOP_IND:
- nargs = 1;
- *pos += 1;
- break;
-
- case OP_LONG:
- case OP_DOUBLE:
- case OP_VAR_VALUE:
- *pos += 4;
- break;
-
- case OP_TYPE:
- case OP_BOOL:
- case OP_LAST:
- case OP_REGISTER:
- case OP_INTERNALVAR:
- *pos += 3;
- break;
-
- case UNOP_MEMVAL:
- *pos += 3;
- nargs = 1;
- break;
-
- case STRUCTOP_STRUCT:
- case STRUCTOP_PTR:
- nargs = 1;
- *pos += 4 + BYTES_TO_EXP_ELEM (exp->elts[pc + 1].longconst + 1);
- break;
-
- case OP_ARRAY:
- *pos += 4;
- nargs = longest_to_int (exp->elts[pc + 2].longconst) + 1;
- nargs -= longest_to_int (exp->elts[pc + 1].longconst);
- /* A null array contains one dummy element to give the type. */
- /* if (nargs == 0)
- nargs = 1;
- break; */
-
- case TERNOP_SLICE:
- /* FIXME: TERNOP_MBR should be defined in expression.h */
- /* case TERNOP_MBR:
- *pos += 1;
- nargs = 3;
- break;
- */
- /* FIXME: BINOP_MBR should be defined in expression.h */
- /* case BINOP_MBR:
- *pos += 3;
- nargs = 2;
- break; */
- }
-
- argvec =
- (struct value * *) alloca (sizeof (struct value *) * (nargs + 1));
- for (i = 0; i < nargs; i += 1)
- argvec[i] = ada_resolve_subexp (expp, pos, 1, NULL);
- argvec[i] = NULL;
- exp = *expp;
- break;
- }
-
- /* Pass two: perform any resolution on principal operator. */
- switch (op)
- {
- default:
- break;
-
- /* FIXME: OP_UNRESOLVED_VALUE should be defined in expression.h */
- /* case OP_UNRESOLVED_VALUE:
- {
- struct symbol** candidate_syms;
- struct block** candidate_blocks;
- int n_candidates;
-
- n_candidates = ada_lookup_symbol_list (exp->elts[pc + 2].name,
- exp->elts[pc + 1].block,
- VAR_NAMESPACE,
- &candidate_syms,
- &candidate_blocks);
-
- if (n_candidates > 1)
- { */
- /* Types tend to get re-introduced locally, so if there
- are any local symbols that are not types, first filter
- out all types. *//*
- int j;
- for (j = 0; j < n_candidates; j += 1)
- switch (SYMBOL_CLASS (candidate_syms[j]))
- {
- case LOC_REGISTER:
- case LOC_ARG:
- case LOC_REF_ARG:
- case LOC_REGPARM:
- case LOC_REGPARM_ADDR:
- case LOC_LOCAL:
- case LOC_LOCAL_ARG:
- case LOC_BASEREG:
- case LOC_BASEREG_ARG:
- goto FoundNonType;
- default:
- break;
- }
- FoundNonType:
- if (j < n_candidates)
- {
- j = 0;
- while (j < n_candidates)
- {
- if (SYMBOL_CLASS (candidate_syms[j]) == LOC_TYPEDEF)
- {
- candidate_syms[j] = candidate_syms[n_candidates-1];
- candidate_blocks[j] = candidate_blocks[n_candidates-1];
- n_candidates -= 1;
- }
- else
- j += 1;
- }
- }
- }
-
- if (n_candidates == 0)
- error ("No definition found for %s",
- ada_demangle (exp->elts[pc + 2].name));
- else if (n_candidates == 1)
- i = 0;
- else if (deprocedure_p
- && ! is_nonfunction (candidate_syms, n_candidates))
- {
- i = ada_resolve_function (candidate_syms, candidate_blocks,
- n_candidates, NULL, 0,
- exp->elts[pc + 2].name, context_type);
- if (i < 0)
- error ("Could not find a match for %s",
- ada_demangle (exp->elts[pc + 2].name));
- }
- else
- {
- printf_filtered ("Multiple matches for %s\n",
- ada_demangle (exp->elts[pc+2].name));
- user_select_syms (candidate_syms, candidate_blocks,
- n_candidates, 1);
- i = 0;
- }
-
- exp->elts[pc].opcode = exp->elts[pc + 3].opcode = OP_VAR_VALUE;
- exp->elts[pc + 1].block = candidate_blocks[i];
- exp->elts[pc + 2].symbol = candidate_syms[i];
- if (innermost_block == NULL ||
- contained_in (candidate_blocks[i], innermost_block))
- innermost_block = candidate_blocks[i];
- } */
- /* FALL THROUGH */
-
- case OP_VAR_VALUE:
- if (deprocedure_p &&
- TYPE_CODE (SYMBOL_TYPE (exp->elts[pc + 2].symbol)) ==
- TYPE_CODE_FUNC)
- {
- replace_operator_with_call (expp, pc, 0, 0,
- exp->elts[pc + 2].symbol,
- exp->elts[pc + 1].block);
- exp = *expp;
- }
- break;
-
- case OP_FUNCALL:
- {
- /* FIXME: OP_UNRESOLVED_VALUE should be defined in expression.h */
- /* if (exp->elts[pc+3].opcode == OP_UNRESOLVED_VALUE)
- {
- struct symbol** candidate_syms;
- struct block** candidate_blocks;
- int n_candidates;
-
- n_candidates = ada_lookup_symbol_list (exp->elts[pc + 5].name,
- exp->elts[pc + 4].block,
- VAR_NAMESPACE,
- &candidate_syms,
- &candidate_blocks);
- if (n_candidates == 1)
- i = 0;
- else
- {
- i = ada_resolve_function (candidate_syms, candidate_blocks,
- n_candidates, argvec, nargs-1,
- exp->elts[pc + 5].name, context_type);
- if (i < 0)
- error ("Could not find a match for %s",
- ada_demangle (exp->elts[pc + 5].name));
- }
-
- exp->elts[pc + 3].opcode = exp->elts[pc + 6].opcode = OP_VAR_VALUE;
- exp->elts[pc + 4].block = candidate_blocks[i];
- exp->elts[pc + 5].symbol = candidate_syms[i];
- if (innermost_block == NULL ||
- contained_in (candidate_blocks[i], innermost_block))
- innermost_block = candidate_blocks[i];
- } */
-
- }
- break;
- case BINOP_ADD:
- case BINOP_SUB:
- case BINOP_MUL:
- case BINOP_DIV:
- case BINOP_REM:
- case BINOP_MOD:
- case BINOP_CONCAT:
- case BINOP_BITWISE_AND:
- case BINOP_BITWISE_IOR:
- case BINOP_BITWISE_XOR:
- case BINOP_EQUAL:
- case BINOP_NOTEQUAL:
- case BINOP_LESS:
- case BINOP_GTR:
- case BINOP_LEQ:
- case BINOP_GEQ:
- case BINOP_EXP:
- case UNOP_NEG:
- case UNOP_PLUS:
- case UNOP_LOGICAL_NOT:
- case UNOP_ABS:
- if (possible_user_operator_p (op, argvec))
- {
- struct symbol **candidate_syms;
- struct block **candidate_blocks;
- int n_candidates;
-
- n_candidates =
- ada_lookup_symbol_list (ada_mangle (ada_op_name (op)),
- (struct block *) NULL, VAR_NAMESPACE,
- &candidate_syms, &candidate_blocks);
- i =
- ada_resolve_function (candidate_syms, candidate_blocks,
- n_candidates, argvec, nargs,
- ada_op_name (op), NULL);
- if (i < 0)
- break;
-
- replace_operator_with_call (expp, pc, nargs, 1,
- candidate_syms[i], candidate_blocks[i]);
- exp = *expp;
- }
- break;
- }
-
- *pos = pc;
- return evaluate_subexp_type (exp, pos);
-}
-
-/* Return non-zero if formal type FTYPE matches actual type ATYPE. If
- MAY_DEREF is non-zero, the formal may be a pointer and the actual
- a non-pointer. */
-/* The term "match" here is rather loose. The match is heuristic and
- liberal. FIXME: TOO liberal, in fact. */
-
-static int
-ada_type_match (ftype, atype, may_deref)
- struct type *ftype;
- struct type *atype;
- int may_deref;
-{
- CHECK_TYPEDEF (ftype);
- CHECK_TYPEDEF (atype);
-
- if (TYPE_CODE (ftype) == TYPE_CODE_REF)
- ftype = TYPE_TARGET_TYPE (ftype);
- if (TYPE_CODE (atype) == TYPE_CODE_REF)
- atype = TYPE_TARGET_TYPE (atype);
-
- if (TYPE_CODE (ftype) == TYPE_CODE_VOID
- || TYPE_CODE (atype) == TYPE_CODE_VOID)
- return 1;
-
- switch (TYPE_CODE (ftype))
- {
- default:
- return 1;
- case TYPE_CODE_PTR:
- if (TYPE_CODE (atype) == TYPE_CODE_PTR)
- return ada_type_match (TYPE_TARGET_TYPE (ftype),
- TYPE_TARGET_TYPE (atype), 0);
- else
- return (may_deref &&
- ada_type_match (TYPE_TARGET_TYPE (ftype), atype, 0));
- case TYPE_CODE_INT:
- case TYPE_CODE_ENUM:
- case TYPE_CODE_RANGE:
- switch (TYPE_CODE (atype))
- {
- case TYPE_CODE_INT:
- case TYPE_CODE_ENUM:
- case TYPE_CODE_RANGE:
- return 1;
- default:
- return 0;
- }
-
- case TYPE_CODE_ARRAY:
- return (TYPE_CODE (atype) == TYPE_CODE_ARRAY
- || ada_is_array_descriptor (atype));
-
- case TYPE_CODE_STRUCT:
- if (ada_is_array_descriptor (ftype))
- return (TYPE_CODE (atype) == TYPE_CODE_ARRAY
- || ada_is_array_descriptor (atype));
- else
- return (TYPE_CODE (atype) == TYPE_CODE_STRUCT
- && !ada_is_array_descriptor (atype));
-
- case TYPE_CODE_UNION:
- case TYPE_CODE_FLT:
- return (TYPE_CODE (atype) == TYPE_CODE (ftype));
- }
-}
-
-/* Return non-zero if the formals of FUNC "sufficiently match" the
- vector of actual argument types ACTUALS of size N_ACTUALS. FUNC
- may also be an enumeral, in which case it is treated as a 0-
- argument function. */
-
-static int
-ada_args_match (struct symbol *func, struct value **actuals, int n_actuals)
-{
- int i;
- struct type *func_type = SYMBOL_TYPE (func);
-
- if (SYMBOL_CLASS (func) == LOC_CONST &&
- TYPE_CODE (func_type) == TYPE_CODE_ENUM)
- return (n_actuals == 0);
- else if (func_type == NULL || TYPE_CODE (func_type) != TYPE_CODE_FUNC)
- return 0;
-
- if (TYPE_NFIELDS (func_type) != n_actuals)
- return 0;
-
- for (i = 0; i < n_actuals; i += 1)
- {
- struct type *ftype = check_typedef (TYPE_FIELD_TYPE (func_type, i));
- struct type *atype = check_typedef (VALUE_TYPE (actuals[i]));
-
- if (!ada_type_match (TYPE_FIELD_TYPE (func_type, i),
- VALUE_TYPE (actuals[i]), 1))
- return 0;
- }
- return 1;
-}
-
-/* False iff function type FUNC_TYPE definitely does not produce a value
- compatible with type CONTEXT_TYPE. Conservatively returns 1 if
- FUNC_TYPE is not a valid function type with a non-null return type
- or an enumerated type. A null CONTEXT_TYPE indicates any non-void type. */
-
-static int
-return_match (struct type *func_type, struct type *context_type)
-{
- struct type *return_type;
-
- if (func_type == NULL)
- return 1;
-
- /* FIXME: base_type should be declared in gdbtypes.h, implemented in valarith.c */
- /* if (TYPE_CODE (func_type) == TYPE_CODE_FUNC)
- return_type = base_type (TYPE_TARGET_TYPE (func_type));
- else
- return_type = base_type (func_type); */
- if (return_type == NULL)
- return 1;
-
- /* FIXME: base_type should be declared in gdbtypes.h, implemented in valarith.c */
- /* context_type = base_type (context_type); */
-
- if (TYPE_CODE (return_type) == TYPE_CODE_ENUM)
- return context_type == NULL || return_type == context_type;
- else if (context_type == NULL)
- return TYPE_CODE (return_type) != TYPE_CODE_VOID;
- else
- return TYPE_CODE (return_type) == TYPE_CODE (context_type);
-}
-
-
-/* Return the index in SYMS[0..NSYMS-1] of symbol for the
- function (if any) that matches the types of the NARGS arguments in
- ARGS. If CONTEXT_TYPE is non-null, and there is at least one match
- that returns type CONTEXT_TYPE, then eliminate other matches. If
- CONTEXT_TYPE is null, prefer a non-void-returning function.
- Asks the user if there is more than one match remaining. Returns -1
- if there is no such symbol or none is selected. NAME is used
- solely for messages. May re-arrange and modify SYMS in
- the process; the index returned is for the modified vector. BLOCKS
- is modified in parallel to SYMS. */
-
-int
-ada_resolve_function (struct symbol *syms[], struct block *blocks[],
- int nsyms, struct value **args, int nargs,
- const char *name, struct type *context_type)
-{
- int k;
- int m; /* Number of hits */
- struct type *fallback;
- struct type *return_type;
-
- return_type = context_type;
- if (context_type == NULL)
- fallback = builtin_type_void;
- else
- fallback = NULL;
-
- m = 0;
- while (1)
- {
- for (k = 0; k < nsyms; k += 1)
- {
- struct type *type = check_typedef (SYMBOL_TYPE (syms[k]));
-
- if (ada_args_match (syms[k], args, nargs)
- && return_match (SYMBOL_TYPE (syms[k]), return_type))
- {
- syms[m] = syms[k];
- if (blocks != NULL)
- blocks[m] = blocks[k];
- m += 1;
- }
- }
- if (m > 0 || return_type == fallback)
- break;
- else
- return_type = fallback;
- }
-
- if (m == 0)
- return -1;
- else if (m > 1)
- {
- printf_filtered ("Multiple matches for %s\n", name);
- user_select_syms (syms, blocks, m, 1);
- return 0;
- }
- return 0;
-}
-
-/* Returns true (non-zero) iff demangled name N0 should appear before N1 */
-/* in a listing of choices during disambiguation (see sort_choices, below). */
-/* The idea is that overloadings of a subprogram name from the */
-/* same package should sort in their source order. We settle for ordering */
-/* such symbols by their trailing number (__N or $N). */
-static int
-mangled_ordered_before (char *N0, char *N1)
-{
- if (N1 == NULL)
- return 0;
- else if (N0 == NULL)
- return 1;
- else
- {
- int k0, k1;
- for (k0 = strlen (N0) - 1; k0 > 0 && isdigit (N0[k0]); k0 -= 1)
- ;
- for (k1 = strlen (N1) - 1; k1 > 0 && isdigit (N1[k1]); k1 -= 1)
- ;
- if ((N0[k0] == '_' || N0[k0] == '$') && N0[k0 + 1] != '\000'
- && (N1[k1] == '_' || N1[k1] == '$') && N1[k1 + 1] != '\000')
- {
- int n0, n1;
- n0 = k0;
- while (N0[n0] == '_' && n0 > 0 && N0[n0 - 1] == '_')
- n0 -= 1;
- n1 = k1;
- while (N1[n1] == '_' && n1 > 0 && N1[n1 - 1] == '_')
- n1 -= 1;
- if (n0 == n1 && STREQN (N0, N1, n0))
- return (atoi (N0 + k0 + 1) < atoi (N1 + k1 + 1));
- }
- return (strcmp (N0, N1) < 0);
- }
-}
-
-/* Sort SYMS[0..NSYMS-1] to put the choices in a canonical order by their */
-/* mangled names, rearranging BLOCKS[0..NSYMS-1] according to the same */
-/* permutation. */
-static void
-sort_choices (struct symbol *syms[], struct block *blocks[], int nsyms)
-{
- int i, j;
- for (i = 1; i < nsyms; i += 1)
- {
- struct symbol *sym = syms[i];
- struct block *block = blocks[i];
- int j;
-
- for (j = i - 1; j >= 0; j -= 1)
- {
- if (mangled_ordered_before (SYMBOL_NAME (syms[j]),
- SYMBOL_NAME (sym)))
- break;
- syms[j + 1] = syms[j];
- blocks[j + 1] = blocks[j];
- }
- syms[j + 1] = sym;
- blocks[j + 1] = block;
- }
-}
-
-/* Given a list of NSYMS symbols in SYMS and corresponding blocks in */
-/* BLOCKS, select up to MAX_RESULTS>0 by asking the user (if */
-/* necessary), returning the number selected, and setting the first */
-/* elements of SYMS and BLOCKS to the selected symbols and */
-/* corresponding blocks. Error if no symbols selected. BLOCKS may */
-/* be NULL, in which case it is ignored. */
-
-/* NOTE: Adapted from decode_line_2 in symtab.c, with which it ought
- to be re-integrated one of these days. */
-
-int
-user_select_syms (struct symbol *syms[], struct block *blocks[], int nsyms,
- int max_results)
-{
- int i;
- int *chosen = (int *) alloca (sizeof (int) * nsyms);
- int n_chosen;
- int first_choice = (max_results == 1) ? 1 : 2;
-
- if (max_results < 1)
- error ("Request to select 0 symbols!");
- if (nsyms <= 1)
- return nsyms;
-
- printf_unfiltered ("[0] cancel\n");
- if (max_results > 1)
- printf_unfiltered ("[1] all\n");
-
- sort_choices (syms, blocks, nsyms);
-
- for (i = 0; i < nsyms; i += 1)
- {
- if (syms[i] == NULL)
- continue;
-
- if (SYMBOL_CLASS (syms[i]) == LOC_BLOCK)
- {
- struct symtab_and_line sal = find_function_start_sal (syms[i], 1);
- printf_unfiltered ("[%d] %s at %s:%d\n",
- i + first_choice,
- SYMBOL_SOURCE_NAME (syms[i]),
- sal.symtab == NULL
- ? "<no source file available>"
- : sal.symtab->filename, sal.line);
- continue;
- }
- else
- {
- int is_enumeral =
- (SYMBOL_CLASS (syms[i]) == LOC_CONST
- && SYMBOL_TYPE (syms[i]) != NULL
- && TYPE_CODE (SYMBOL_TYPE (syms[i])) == TYPE_CODE_ENUM);
- struct symtab *symtab = symtab_for_sym (syms[i]);
-
- if (SYMBOL_LINE (syms[i]) != 0 && symtab != NULL)
- printf_unfiltered ("[%d] %s at %s:%d\n",
- i + first_choice,
- SYMBOL_SOURCE_NAME (syms[i]),
- symtab->filename, SYMBOL_LINE (syms[i]));
- else if (is_enumeral && TYPE_NAME (SYMBOL_TYPE (syms[i])) != NULL)
- {
- printf_unfiltered ("[%d] ", i + first_choice);
- ada_print_type (SYMBOL_TYPE (syms[i]), NULL, gdb_stdout, -1, 0);
- printf_unfiltered ("'(%s) (enumeral)\n",
- SYMBOL_SOURCE_NAME (syms[i]));
- }
- else if (symtab != NULL)
- printf_unfiltered (is_enumeral
- ? "[%d] %s in %s (enumeral)\n"
- : "[%d] %s at %s:?\n",
- i + first_choice,
- SYMBOL_SOURCE_NAME (syms[i]),
- symtab->filename);
- else
- printf_unfiltered (is_enumeral
- ? "[%d] %s (enumeral)\n"
- : "[%d] %s at ?\n",
- i + first_choice,
- SYMBOL_SOURCE_NAME (syms[i]));
- }
- }
-
- n_chosen = get_selections (chosen, nsyms, max_results, max_results > 1,
- "overload-choice");
-
- for (i = 0; i < n_chosen; i += 1)
- {
- syms[i] = syms[chosen[i]];
- if (blocks != NULL)
- blocks[i] = blocks[chosen[i]];
- }
-
- return n_chosen;
-}
-
-/* Read and validate a set of numeric choices from the user in the
- range 0 .. N_CHOICES-1. Place the results in increasing
- order in CHOICES[0 .. N-1], and return N.
-
- The user types choices as a sequence of numbers on one line
- separated by blanks, encoding them as follows:
-
- + A choice of 0 means to cancel the selection, throwing an error.
- + If IS_ALL_CHOICE, a choice of 1 selects the entire set 0 .. N_CHOICES-1.
- + The user chooses k by typing k+IS_ALL_CHOICE+1.
-
- The user is not allowed to choose more than MAX_RESULTS values.
-
- ANNOTATION_SUFFIX, if present, is used to annotate the input
- prompts (for use with the -f switch). */
-
-int
-get_selections (int *choices, int n_choices, int max_results,
- int is_all_choice, char *annotation_suffix)
-{
- int i;
- char *args;
- const char *prompt;
- int n_chosen;
- int first_choice = is_all_choice ? 2 : 1;
-
- prompt = getenv ("PS2");
- if (prompt == NULL)
- prompt = ">";
-
- printf_unfiltered ("%s ", prompt);
- gdb_flush (gdb_stdout);
-
- args = command_line_input ((char *) NULL, 0, annotation_suffix);
-
- if (args == NULL)
- error_no_arg ("one or more choice numbers");
-
- n_chosen = 0;
-
- /* Set choices[0 .. n_chosen-1] to the users' choices in ascending
- order, as given in args. Choices are validated. */
- while (1)
- {
- char *args2;
- int choice, j;
-
- while (isspace (*args))
- args += 1;
- if (*args == '\0' && n_chosen == 0)
- error_no_arg ("one or more choice numbers");
- else if (*args == '\0')
- break;
-
- choice = strtol (args, &args2, 10);
- if (args == args2 || choice < 0
- || choice > n_choices + first_choice - 1)
- error ("Argument must be choice number");
- args = args2;
-
- if (choice == 0)
- error ("cancelled");
-
- if (choice < first_choice)
- {
- n_chosen = n_choices;
- for (j = 0; j < n_choices; j += 1)
- choices[j] = j;
- break;
- }
- choice -= first_choice;
-
- for (j = n_chosen - 1; j >= 0 && choice < choices[j]; j -= 1)
- {
- }
-
- if (j < 0 || choice != choices[j])
- {
- int k;
- for (k = n_chosen - 1; k > j; k -= 1)
- choices[k + 1] = choices[k];
- choices[j + 1] = choice;
- n_chosen += 1;
- }
- }
-
- if (n_chosen > max_results)
- error ("Select no more than %d of the above", max_results);
-
- return n_chosen;
-}
-
-/* Replace the operator of length OPLEN at position PC in *EXPP with a call */
-/* on the function identified by SYM and BLOCK, and taking NARGS */
-/* arguments. Update *EXPP as needed to hold more space. */
-
-static void
-replace_operator_with_call (struct expression **expp, int pc, int nargs,
- int oplen, struct symbol *sym,
- struct block *block)
-{
- /* A new expression, with 6 more elements (3 for funcall, 4 for function
- symbol, -oplen for operator being replaced). */
- struct expression *newexp = (struct expression *)
- xmalloc (sizeof (struct expression)
- + EXP_ELEM_TO_BYTES ((*expp)->nelts + 7 - oplen));
- struct expression *exp = *expp;
-
- newexp->nelts = exp->nelts + 7 - oplen;
- newexp->language_defn = exp->language_defn;
- memcpy (newexp->elts, exp->elts, EXP_ELEM_TO_BYTES (pc));
- memcpy (newexp->elts + pc + 7, exp->elts + pc + oplen,
- EXP_ELEM_TO_BYTES (exp->nelts - pc - oplen));
-
- newexp->elts[pc].opcode = newexp->elts[pc + 2].opcode = OP_FUNCALL;
- newexp->elts[pc + 1].longconst = (LONGEST) nargs;
-
- newexp->elts[pc + 3].opcode = newexp->elts[pc + 6].opcode = OP_VAR_VALUE;
- newexp->elts[pc + 4].block = block;
- newexp->elts[pc + 5].symbol = sym;
-
- *expp = newexp;
- xfree (exp);
-}
-
-/* Type-class predicates */
-
-/* True iff TYPE is numeric (i.e., an INT, RANGE (of numeric type), or */
-/* FLOAT.) */
-
-static int
-numeric_type_p (struct type *type)
-{
- if (type == NULL)
- return 0;
- else
- {
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_INT:
- case TYPE_CODE_FLT:
- return 1;
- case TYPE_CODE_RANGE:
- return (type == TYPE_TARGET_TYPE (type)
- || numeric_type_p (TYPE_TARGET_TYPE (type)));
- default:
- return 0;
- }
- }
-}
-
-/* True iff TYPE is integral (an INT or RANGE of INTs). */
-
-static int
-integer_type_p (struct type *type)
-{
- if (type == NULL)
- return 0;
- else
- {
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_INT:
- return 1;
- case TYPE_CODE_RANGE:
- return (type == TYPE_TARGET_TYPE (type)
- || integer_type_p (TYPE_TARGET_TYPE (type)));
- default:
- return 0;
- }
- }
-}
-
-/* True iff TYPE is scalar (INT, RANGE, FLOAT, ENUM). */
-
-static int
-scalar_type_p (struct type *type)
-{
- if (type == NULL)
- return 0;
- else
- {
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_INT:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_ENUM:
- case TYPE_CODE_FLT:
- return 1;
- default:
- return 0;
- }
- }
-}
-
-/* True iff TYPE is discrete (INT, RANGE, ENUM). */
-
-static int
-discrete_type_p (struct type *type)
-{
- if (type == NULL)
- return 0;
- else
- {
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_INT:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_ENUM:
- return 1;
- default:
- return 0;
- }
- }
-}
-
-/* Returns non-zero if OP with operatands in the vector ARGS could be
- a user-defined function. Errs on the side of pre-defined operators
- (i.e., result 0). */
-
-static int
-possible_user_operator_p (enum exp_opcode op, struct value *args[])
-{
- struct type *type0 = check_typedef (VALUE_TYPE (args[0]));
- struct type *type1 =
- (args[1] == NULL) ? NULL : check_typedef (VALUE_TYPE (args[1]));
-
- switch (op)
- {
- default:
- return 0;
-
- case BINOP_ADD:
- case BINOP_SUB:
- case BINOP_MUL:
- case BINOP_DIV:
- return (!(numeric_type_p (type0) && numeric_type_p (type1)));
-
- case BINOP_REM:
- case BINOP_MOD:
- case BINOP_BITWISE_AND:
- case BINOP_BITWISE_IOR:
- case BINOP_BITWISE_XOR:
- return (!(integer_type_p (type0) && integer_type_p (type1)));
-
- case BINOP_EQUAL:
- case BINOP_NOTEQUAL:
- case BINOP_LESS:
- case BINOP_GTR:
- case BINOP_LEQ:
- case BINOP_GEQ:
- return (!(scalar_type_p (type0) && scalar_type_p (type1)));
-
- case BINOP_CONCAT:
- return ((TYPE_CODE (type0) != TYPE_CODE_ARRAY &&
- (TYPE_CODE (type0) != TYPE_CODE_PTR ||
- TYPE_CODE (TYPE_TARGET_TYPE (type0))
- != TYPE_CODE_ARRAY))
- || (TYPE_CODE (type1) != TYPE_CODE_ARRAY &&
- (TYPE_CODE (type1) != TYPE_CODE_PTR ||
- TYPE_CODE (TYPE_TARGET_TYPE (type1)) != TYPE_CODE_ARRAY)));
-
- case BINOP_EXP:
- return (!(numeric_type_p (type0) && integer_type_p (type1)));
-
- case UNOP_NEG:
- case UNOP_PLUS:
- case UNOP_LOGICAL_NOT:
- case UNOP_ABS:
- return (!numeric_type_p (type0));
-
- }
-}
-
- /* Renaming */
-
-/** NOTE: In the following, we assume that a renaming type's name may
- * have an ___XD suffix. It would be nice if this went away at some
- * point. */
-
-/* If TYPE encodes a renaming, returns the renaming suffix, which
- * is XR for an object renaming, XRP for a procedure renaming, XRE for
- * an exception renaming, and XRS for a subprogram renaming. Returns
- * NULL if NAME encodes none of these. */
-const char *
-ada_renaming_type (struct type *type)
-{
- if (type != NULL && TYPE_CODE (type) == TYPE_CODE_ENUM)
- {
- const char *name = type_name_no_tag (type);
- const char *suffix = (name == NULL) ? NULL : strstr (name, "___XR");
- if (suffix == NULL
- || (suffix[5] != '\000' && strchr ("PES_", suffix[5]) == NULL))
- return NULL;
- else
- return suffix + 3;
- }
- else
- return NULL;
-}
-
-/* Return non-zero iff SYM encodes an object renaming. */
-int
-ada_is_object_renaming (struct symbol *sym)
-{
- const char *renaming_type = ada_renaming_type (SYMBOL_TYPE (sym));
- return renaming_type != NULL
- && (renaming_type[2] == '\0' || renaming_type[2] == '_');
-}
-
-/* Assuming that SYM encodes a non-object renaming, returns the original
- * name of the renamed entity. The name is good until the end of
- * parsing. */
-const char *
-ada_simple_renamed_entity (struct symbol *sym)
-{
- struct type *type;
- const char *raw_name;
- int len;
- char *result;
-
- type = SYMBOL_TYPE (sym);
- if (type == NULL || TYPE_NFIELDS (type) < 1)
- error ("Improperly encoded renaming.");
-
- raw_name = TYPE_FIELD_NAME (type, 0);
- len = (raw_name == NULL ? 0 : strlen (raw_name)) - 5;
- if (len <= 0)
- error ("Improperly encoded renaming.");
-
- result = xmalloc (len + 1);
- /* FIXME: add_name_string_cleanup should be defined in parse.c */
- /* add_name_string_cleanup (result); */
- strncpy (result, raw_name, len);
- result[len] = '\000';
- return result;
-}
-
-
- /* Evaluation: Function Calls */
-
-/* Copy VAL onto the stack, using and updating *SP as the stack
- pointer. Return VAL as an lvalue. */
-
-static struct value *
-place_on_stack (struct value *val, CORE_ADDR *sp)
-{
- CORE_ADDR old_sp = *sp;
-
-#ifdef STACK_ALIGN
- *sp = push_bytes (*sp, VALUE_CONTENTS_RAW (val),
- STACK_ALIGN (TYPE_LENGTH
- (check_typedef (VALUE_TYPE (val)))));
-#else
- *sp = push_bytes (*sp, VALUE_CONTENTS_RAW (val),
- TYPE_LENGTH (check_typedef (VALUE_TYPE (val))));
-#endif
-
- VALUE_LVAL (val) = lval_memory;
- if (INNER_THAN (1, 2))
- VALUE_ADDRESS (val) = *sp;
- else
- VALUE_ADDRESS (val) = old_sp;
-
- return val;
-}
-
-/* Return the value ACTUAL, converted to be an appropriate value for a
- formal of type FORMAL_TYPE. Use *SP as a stack pointer for
- allocating any necessary descriptors (fat pointers), or copies of
- values not residing in memory, updating it as needed. */
-
-static struct value *
-convert_actual (struct value *actual, struct type *formal_type0,
- CORE_ADDR *sp)
-{
- struct type *actual_type = check_typedef (VALUE_TYPE (actual));
- struct type *formal_type = check_typedef (formal_type0);
- struct type *formal_target =
- TYPE_CODE (formal_type) == TYPE_CODE_PTR
- ? check_typedef (TYPE_TARGET_TYPE (formal_type)) : formal_type;
- struct type *actual_target =
- TYPE_CODE (actual_type) == TYPE_CODE_PTR
- ? check_typedef (TYPE_TARGET_TYPE (actual_type)) : actual_type;
-
- if (ada_is_array_descriptor (formal_target)
- && TYPE_CODE (actual_target) == TYPE_CODE_ARRAY)
- return make_array_descriptor (formal_type, actual, sp);
- else if (TYPE_CODE (formal_type) == TYPE_CODE_PTR)
- {
- if (TYPE_CODE (formal_target) == TYPE_CODE_ARRAY
- && ada_is_array_descriptor (actual_target))
- return desc_data (actual);
- else if (TYPE_CODE (actual_type) != TYPE_CODE_PTR)
- {
- if (VALUE_LVAL (actual) != lval_memory)
- {
- struct value *val;
- actual_type = check_typedef (VALUE_TYPE (actual));
- val = allocate_value (actual_type);
- memcpy ((char *) VALUE_CONTENTS_RAW (val),
- (char *) VALUE_CONTENTS (actual),
- TYPE_LENGTH (actual_type));
- actual = place_on_stack (val, sp);
- }
- return value_addr (actual);
- }
- }
- else if (TYPE_CODE (actual_type) == TYPE_CODE_PTR)
- return ada_value_ind (actual);
-
- return actual;
-}
-
-
-/* Push a descriptor of type TYPE for array value ARR on the stack at
- *SP, updating *SP to reflect the new descriptor. Return either
- an lvalue representing the new descriptor, or (if TYPE is a pointer-
- to-descriptor type rather than a descriptor type), a struct value*
- representing a pointer to this descriptor. */
-
-static struct value *
-make_array_descriptor (struct type *type, struct value *arr, CORE_ADDR *sp)
-{
- struct type *bounds_type = desc_bounds_type (type);
- struct type *desc_type = desc_base_type (type);
- struct value *descriptor = allocate_value (desc_type);
- struct value *bounds = allocate_value (bounds_type);
- CORE_ADDR bounds_addr;
- int i;
-
- for (i = ada_array_arity (check_typedef (VALUE_TYPE (arr))); i > 0; i -= 1)
- {
- modify_general_field (VALUE_CONTENTS (bounds),
- value_as_long (ada_array_bound (arr, i, 0)),
- desc_bound_bitpos (bounds_type, i, 0),
- desc_bound_bitsize (bounds_type, i, 0));
- modify_general_field (VALUE_CONTENTS (bounds),
- value_as_long (ada_array_bound (arr, i, 1)),
- desc_bound_bitpos (bounds_type, i, 1),
- desc_bound_bitsize (bounds_type, i, 1));
- }
-
- bounds = place_on_stack (bounds, sp);
-
- modify_general_field (VALUE_CONTENTS (descriptor),
- arr,
- fat_pntr_data_bitpos (desc_type),
- fat_pntr_data_bitsize (desc_type));
- modify_general_field (VALUE_CONTENTS (descriptor),
- VALUE_ADDRESS (bounds),
- fat_pntr_bounds_bitpos (desc_type),
- fat_pntr_bounds_bitsize (desc_type));
-
- descriptor = place_on_stack (descriptor, sp);
-
- if (TYPE_CODE (type) == TYPE_CODE_PTR)
- return value_addr (descriptor);
- else
- return descriptor;
-}
-
-
-/* Assuming a dummy frame has been established on the target, perform any
- conversions needed for calling function FUNC on the NARGS actual
- parameters in ARGS, other than standard C conversions. Does
- nothing if FUNC does not have Ada-style prototype data, or if NARGS
- does not match the number of arguments expected. Use *SP as a
- stack pointer for additional data that must be pushed, updating its
- value as needed. */
-
-void
-ada_convert_actuals (struct value *func, int nargs, struct value *args[],
- CORE_ADDR *sp)
-{
- int i;
-
- if (TYPE_NFIELDS (VALUE_TYPE (func)) == 0
- || nargs != TYPE_NFIELDS (VALUE_TYPE (func)))
- return;
-
- for (i = 0; i < nargs; i += 1)
- args[i] =
- convert_actual (args[i], TYPE_FIELD_TYPE (VALUE_TYPE (func), i), sp);
-}
-
-
- /* Symbol Lookup */
-
-
-/* The vectors of symbols and blocks ultimately returned from */
-/* ada_lookup_symbol_list. */
-
-/* Current size of defn_symbols and defn_blocks */
-static size_t defn_vector_size = 0;
-
-/* Current number of symbols found. */
-static int ndefns = 0;
-
-static struct symbol **defn_symbols = NULL;
-static struct block **defn_blocks = NULL;
-
-/* Return the result of a standard (literal, C-like) lookup of NAME in
- * given NAMESPACE. */
-
-static struct symbol *
-standard_lookup (const char *name, namespace_enum namespace)
-{
- struct symbol *sym;
- struct symtab *symtab;
- sym = lookup_symbol (name, (struct block *) NULL, namespace, 0, &symtab);
- return sym;
-}
-
-
-/* Non-zero iff there is at least one non-function/non-enumeral symbol */
-/* in SYMS[0..N-1]. We treat enumerals as functions, since they */
-/* contend in overloading in the same way. */
-static int
-is_nonfunction (struct symbol *syms[], int n)
-{
- int i;
-
- for (i = 0; i < n; i += 1)
- if (TYPE_CODE (SYMBOL_TYPE (syms[i])) != TYPE_CODE_FUNC
- && TYPE_CODE (SYMBOL_TYPE (syms[i])) != TYPE_CODE_ENUM)
- return 1;
-
- return 0;
-}
-
-/* If true (non-zero), then TYPE0 and TYPE1 represent equivalent
- struct types. Otherwise, they may not. */
-
-static int
-equiv_types (struct type *type0, struct type *type1)
-{
- if (type0 == type1)
- return 1;
- if (type0 == NULL || type1 == NULL
- || TYPE_CODE (type0) != TYPE_CODE (type1))
- return 0;
- if ((TYPE_CODE (type0) == TYPE_CODE_STRUCT
- || TYPE_CODE (type0) == TYPE_CODE_ENUM)
- && ada_type_name (type0) != NULL && ada_type_name (type1) != NULL
- && STREQ (ada_type_name (type0), ada_type_name (type1)))
- return 1;
-
- return 0;
-}
-
-/* True iff SYM0 represents the same entity as SYM1, or one that is
- no more defined than that of SYM1. */
-
-static int
-lesseq_defined_than (struct symbol *sym0, struct symbol *sym1)
-{
- if (sym0 == sym1)
- return 1;
- if (SYMBOL_NAMESPACE (sym0) != SYMBOL_NAMESPACE (sym1)
- || SYMBOL_CLASS (sym0) != SYMBOL_CLASS (sym1))
- return 0;
-
- switch (SYMBOL_CLASS (sym0))
- {
- case LOC_UNDEF:
- return 1;
- case LOC_TYPEDEF:
- {
- struct type *type0 = SYMBOL_TYPE (sym0);
- struct type *type1 = SYMBOL_TYPE (sym1);
- char *name0 = SYMBOL_NAME (sym0);
- char *name1 = SYMBOL_NAME (sym1);
- int len0 = strlen (name0);
- return
- TYPE_CODE (type0) == TYPE_CODE (type1)
- && (equiv_types (type0, type1)
- || (len0 < strlen (name1) && STREQN (name0, name1, len0)
- && STREQN (name1 + len0, "___XV", 5)));
- }
- case LOC_CONST:
- return SYMBOL_VALUE (sym0) == SYMBOL_VALUE (sym1)
- && equiv_types (SYMBOL_TYPE (sym0), SYMBOL_TYPE (sym1));
- default:
- return 0;
- }
-}
-
-/* Append SYM to the end of defn_symbols, and BLOCK to the end of
- defn_blocks, updating ndefns, and expanding defn_symbols and
- defn_blocks as needed. Do not include SYM if it is a duplicate. */
-
-static void
-add_defn_to_vec (struct symbol *sym, struct block *block)
-{
- int i;
- size_t tmp;
-
- if (SYMBOL_TYPE (sym) != NULL)
- CHECK_TYPEDEF (SYMBOL_TYPE (sym));
- for (i = 0; i < ndefns; i += 1)
- {
- if (lesseq_defined_than (sym, defn_symbols[i]))
- return;
- else if (lesseq_defined_than (defn_symbols[i], sym))
- {
- defn_symbols[i] = sym;
- defn_blocks[i] = block;
- return;
- }
- }
-
- tmp = defn_vector_size;
- GROW_VECT (defn_symbols, tmp, ndefns + 2);
- GROW_VECT (defn_blocks, defn_vector_size, ndefns + 2);
-
- defn_symbols[ndefns] = sym;
- defn_blocks[ndefns] = block;
- ndefns += 1;
-}
-
-/* Look, in partial_symtab PST, for symbol NAME in given namespace.
- Check the global symbols if GLOBAL, the static symbols if not. Do
- wild-card match if WILD. */
-
-static struct partial_symbol *
-ada_lookup_partial_symbol (struct partial_symtab *pst, const char *name,
- int global, namespace_enum namespace, int wild)
-{
- struct partial_symbol **start;
- int name_len = strlen (name);
- int length = (global ? pst->n_global_syms : pst->n_static_syms);
- int i;
-
- if (length == 0)
- {
- return (NULL);
- }
-
- start = (global ?
- pst->objfile->global_psymbols.list + pst->globals_offset :
- pst->objfile->static_psymbols.list + pst->statics_offset);
-
- if (wild)
- {
- for (i = 0; i < length; i += 1)
- {
- struct partial_symbol *psym = start[i];
-
- if (SYMBOL_NAMESPACE (psym) == namespace &&
- wild_match (name, name_len, SYMBOL_NAME (psym)))
- return psym;
- }
- return NULL;
- }
- else
- {
- if (global)
- {
- int U;
- i = 0;
- U = length - 1;
- while (U - i > 4)
- {
- int M = (U + i) >> 1;
- struct partial_symbol *psym = start[M];
- if (SYMBOL_NAME (psym)[0] < name[0])
- i = M + 1;
- else if (SYMBOL_NAME (psym)[0] > name[0])
- U = M - 1;
- else if (strcmp (SYMBOL_NAME (psym), name) < 0)
- i = M + 1;
- else
- U = M;
- }
- }
- else
- i = 0;
-
- while (i < length)
- {
- struct partial_symbol *psym = start[i];
-
- if (SYMBOL_NAMESPACE (psym) == namespace)
- {
- int cmp = strncmp (name, SYMBOL_NAME (psym), name_len);
-
- if (cmp < 0)
- {
- if (global)
- break;
- }
- else if (cmp == 0
- && is_name_suffix (SYMBOL_NAME (psym) + name_len))
- return psym;
- }
- i += 1;
- }
-
- if (global)
- {
- int U;
- i = 0;
- U = length - 1;
- while (U - i > 4)
- {
- int M = (U + i) >> 1;
- struct partial_symbol *psym = start[M];
- if (SYMBOL_NAME (psym)[0] < '_')
- i = M + 1;
- else if (SYMBOL_NAME (psym)[0] > '_')
- U = M - 1;
- else if (strcmp (SYMBOL_NAME (psym), "_ada_") < 0)
- i = M + 1;
- else
- U = M;
- }
- }
- else
- i = 0;
-
- while (i < length)
- {
- struct partial_symbol *psym = start[i];
-
- if (SYMBOL_NAMESPACE (psym) == namespace)
- {
- int cmp;
-
- cmp = (int) '_' - (int) SYMBOL_NAME (psym)[0];
- if (cmp == 0)
- {
- cmp = strncmp ("_ada_", SYMBOL_NAME (psym), 5);
- if (cmp == 0)
- cmp = strncmp (name, SYMBOL_NAME (psym) + 5, name_len);
- }
-
- if (cmp < 0)
- {
- if (global)
- break;
- }
- else if (cmp == 0
- && is_name_suffix (SYMBOL_NAME (psym) + name_len + 5))
- return psym;
- }
- i += 1;
- }
-
- }
- return NULL;
-}
-
-
-/* Find a symbol table containing symbol SYM or NULL if none. */
-static struct symtab *
-symtab_for_sym (struct symbol *sym)
-{
- struct symtab *s;
- struct objfile *objfile;
- struct block *b;
- struct symbol *tmp_sym;
- int i, j;
-
- ALL_SYMTABS (objfile, s)
- {
- switch (SYMBOL_CLASS (sym))
- {
- case LOC_CONST:
- case LOC_STATIC:
- case LOC_TYPEDEF:
- case LOC_REGISTER:
- case LOC_LABEL:
- case LOC_BLOCK:
- case LOC_CONST_BYTES:
- b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
- ALL_BLOCK_SYMBOLS (b, i, tmp_sym) if (sym == tmp_sym)
- return s;
- b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
- ALL_BLOCK_SYMBOLS (b, i, tmp_sym) if (sym == tmp_sym)
- return s;
- break;
- default:
- break;
- }
- switch (SYMBOL_CLASS (sym))
- {
- case LOC_REGISTER:
- case LOC_ARG:
- case LOC_REF_ARG:
- case LOC_REGPARM:
- case LOC_REGPARM_ADDR:
- case LOC_LOCAL:
- case LOC_TYPEDEF:
- case LOC_LOCAL_ARG:
- case LOC_BASEREG:
- case LOC_BASEREG_ARG:
- for (j = FIRST_LOCAL_BLOCK;
- j < BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s)); j += 1)
- {
- b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), j);
- ALL_BLOCK_SYMBOLS (b, i, tmp_sym) if (sym == tmp_sym)
- return s;
- }
- break;
- default:
- break;
- }
- }
- return NULL;
-}
-
-/* Return a minimal symbol matching NAME according to Ada demangling
- rules. Returns NULL if there is no such minimal symbol. */
-
-struct minimal_symbol *
-ada_lookup_minimal_symbol (const char *name)
-{
- struct objfile *objfile;
- struct minimal_symbol *msymbol;
- int wild_match = (strstr (name, "__") == NULL);
-
- ALL_MSYMBOLS (objfile, msymbol)
- {
- if (ada_match_name (SYMBOL_NAME (msymbol), name, wild_match)
- && MSYMBOL_TYPE (msymbol) != mst_solib_trampoline)
- return msymbol;
- }
-
- return NULL;
-}
-
-/* For all subprograms that statically enclose the subprogram of the
- * selected frame, add symbols matching identifier NAME in NAMESPACE
- * and their blocks to vectors *defn_symbols and *defn_blocks, as for
- * ada_add_block_symbols (q.v.). If WILD, treat as NAME with a
- * wildcard prefix. At the moment, this function uses a heuristic to
- * find the frames of enclosing subprograms: it treats the
- * pointer-sized value at location 0 from the local-variable base of a
- * frame as a static link, and then searches up the call stack for a
- * frame with that same local-variable base. */
-static void
-add_symbols_from_enclosing_procs (const char *name, namespace_enum namespace,
- int wild_match)
-{
-#ifdef i386
- static struct symbol static_link_sym;
- static struct symbol *static_link;
-
- struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
- struct frame_info *frame;
- struct frame_info *target_frame;
-
- if (static_link == NULL)
- {
- /* Initialize the local variable symbol that stands for the
- * static link (when it exists). */
- static_link = &static_link_sym;
- SYMBOL_NAME (static_link) = "";
- SYMBOL_LANGUAGE (static_link) = language_unknown;
- SYMBOL_CLASS (static_link) = LOC_LOCAL;
- SYMBOL_NAMESPACE (static_link) = VAR_NAMESPACE;
- SYMBOL_TYPE (static_link) = lookup_pointer_type (builtin_type_void);
- SYMBOL_VALUE (static_link) =
- -(long) TYPE_LENGTH (SYMBOL_TYPE (static_link));
- }
-
- frame = selected_frame;
- while (frame != NULL && ndefns == 0)
- {
- struct block *block;
- struct value *target_link_val = read_var_value (static_link, frame);
- CORE_ADDR target_link;
-
- if (target_link_val == NULL)
- break;
- QUIT;
-
- target_link = target_link_val;
- do
- {
- QUIT;
- frame = get_prev_frame (frame);
- }
- while (frame != NULL && FRAME_LOCALS_ADDRESS (frame) != target_link);
-
- if (frame == NULL)
- break;
-
- block = get_frame_block (frame, 0);
- while (block != NULL && block_function (block) != NULL && ndefns == 0)
- {
- ada_add_block_symbols (block, name, namespace, NULL, wild_match);
-
- block = BLOCK_SUPERBLOCK (block);
- }
- }
-
- do_cleanups (old_chain);
-#endif
-}
-
-/* True if TYPE is definitely an artificial type supplied to a symbol
- * for which no debugging information was given in the symbol file. */
-static int
-is_nondebugging_type (struct type *type)
-{
- char *name = ada_type_name (type);
- return (name != NULL && STREQ (name, "<variable, no debug info>"));
-}
-
-/* Remove any non-debugging symbols in SYMS[0 .. NSYMS-1] that definitely
- * duplicate other symbols in the list. (The only case I know of where
- * this happens is when object files containing stabs-in-ecoff are
- * linked with files containing ordinary ecoff debugging symbols (or no
- * debugging symbols)). Modifies SYMS to squeeze out deleted symbols,
- * and applies the same modification to BLOCKS to maintain the
- * correspondence between SYMS[i] and BLOCKS[i]. Returns the number
- * of symbols in the modified list. */
-static int
-remove_extra_symbols (struct symbol **syms, struct block **blocks, int nsyms)
-{
- int i, j;
-
- i = 0;
- while (i < nsyms)
- {
- if (SYMBOL_NAME (syms[i]) != NULL
- && SYMBOL_CLASS (syms[i]) == LOC_STATIC
- && is_nondebugging_type (SYMBOL_TYPE (syms[i])))
- {
- for (j = 0; j < nsyms; j += 1)
- {
- if (i != j
- && SYMBOL_NAME (syms[j]) != NULL
- && STREQ (SYMBOL_NAME (syms[i]), SYMBOL_NAME (syms[j]))
- && SYMBOL_CLASS (syms[i]) == SYMBOL_CLASS (syms[j])
- && SYMBOL_VALUE_ADDRESS (syms[i])
- == SYMBOL_VALUE_ADDRESS (syms[j]))
- {
- int k;
- for (k = i + 1; k < nsyms; k += 1)
- {
- syms[k - 1] = syms[k];
- blocks[k - 1] = blocks[k];
- }
- nsyms -= 1;
- goto NextSymbol;
- }
- }
- }
- i += 1;
- NextSymbol:
- ;
- }
- return nsyms;
-}
-
-/* Find symbols in NAMESPACE matching NAME, in BLOCK0 and enclosing
- scope and in global scopes, returning the number of matches. Sets
- *SYMS to point to a vector of matching symbols, with *BLOCKS
- pointing to the vector of corresponding blocks in which those
- symbols reside. These two vectors are transient---good only to the
- next call of ada_lookup_symbol_list. Any non-function/non-enumeral symbol
- match within the nest of blocks whose innermost member is BLOCK0,
- is the outermost match returned (no other matches in that or
- enclosing blocks is returned). If there are any matches in or
- surrounding BLOCK0, then these alone are returned. */
-
-int
-ada_lookup_symbol_list (const char *name, struct block *block0,
- namespace_enum namespace, struct symbol ***syms,
- struct block ***blocks)
-{
- struct symbol *sym;
- struct symtab *s;
- struct partial_symtab *ps;
- struct blockvector *bv;
- struct objfile *objfile;
- struct block *b;
- struct block *block;
- struct minimal_symbol *msymbol;
- int wild_match = (strstr (name, "__") == NULL);
- int cacheIfUnique;
-
-#ifdef TIMING
- markTimeStart (0);
-#endif
-
- ndefns = 0;
- cacheIfUnique = 0;
-
- /* Search specified block and its superiors. */
-
- block = block0;
- while (block != NULL)
- {
- ada_add_block_symbols (block, name, namespace, NULL, wild_match);
-
- /* If we found a non-function match, assume that's the one. */
- if (is_nonfunction (defn_symbols, ndefns))
- goto done;
-
- block = BLOCK_SUPERBLOCK (block);
- }
-
- /* If we found ANY matches in the specified BLOCK, we're done. */
-
- if (ndefns > 0)
- goto done;
-
- cacheIfUnique = 1;
-
- /* Now add symbols from all global blocks: symbol tables, minimal symbol
- tables, and psymtab's */
-
- ALL_SYMTABS (objfile, s)
- {
- QUIT;
- if (!s->primary)
- continue;
- bv = BLOCKVECTOR (s);
- block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
- ada_add_block_symbols (block, name, namespace, objfile, wild_match);
- }
-
- if (namespace == VAR_NAMESPACE)
- {
- ALL_MSYMBOLS (objfile, msymbol)
- {
- if (ada_match_name (SYMBOL_NAME (msymbol), name, wild_match))
- {
- switch (MSYMBOL_TYPE (msymbol))
- {
- case mst_solib_trampoline:
- break;
- default:
- s = find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol));
- if (s != NULL)
- {
- int old_ndefns = ndefns;
- QUIT;
- bv = BLOCKVECTOR (s);
- block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
- ada_add_block_symbols (block,
- SYMBOL_NAME (msymbol),
- namespace, objfile, wild_match);
- if (ndefns == old_ndefns)
- {
- block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
- ada_add_block_symbols (block,
- SYMBOL_NAME (msymbol),
- namespace, objfile,
- wild_match);
- }
- }
- }
- }
- }
- }
-
- ALL_PSYMTABS (objfile, ps)
- {
- QUIT;
- if (!ps->readin
- && ada_lookup_partial_symbol (ps, name, 1, namespace, wild_match))
- {
- s = PSYMTAB_TO_SYMTAB (ps);
- if (!s->primary)
- continue;
- bv = BLOCKVECTOR (s);
- block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
- ada_add_block_symbols (block, name, namespace, objfile, wild_match);
- }
- }
-
- /* Now add symbols from all per-file blocks if we've gotten no hits.
- (Not strictly correct, but perhaps better than an error).
- Do the symtabs first, then check the psymtabs */
-
- if (ndefns == 0)
- {
-
- ALL_SYMTABS (objfile, s)
- {
- QUIT;
- if (!s->primary)
- continue;
- bv = BLOCKVECTOR (s);
- block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
- ada_add_block_symbols (block, name, namespace, objfile, wild_match);
- }
-
- ALL_PSYMTABS (objfile, ps)
- {
- QUIT;
- if (!ps->readin
- && ada_lookup_partial_symbol (ps, name, 0, namespace, wild_match))
- {
- s = PSYMTAB_TO_SYMTAB (ps);
- bv = BLOCKVECTOR (s);
- if (!s->primary)
- continue;
- block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
- ada_add_block_symbols (block, name, namespace,
- objfile, wild_match);
- }
- }
- }
-
- /* Finally, we try to find NAME as a local symbol in some lexically
- enclosing block. We do this last, expecting this case to be
- rare. */
- if (ndefns == 0)
- {
- add_symbols_from_enclosing_procs (name, namespace, wild_match);
- if (ndefns > 0)
- goto done;
- }
-
-done:
- ndefns = remove_extra_symbols (defn_symbols, defn_blocks, ndefns);
-
-
- *syms = defn_symbols;
- *blocks = defn_blocks;
-#ifdef TIMING
- markTimeStop (0);
-#endif
- return ndefns;
-}
-
-/* Return a symbol in NAMESPACE matching NAME, in BLOCK0 and enclosing
- * scope and in global scopes, or NULL if none. NAME is folded to
- * lower case first, unless it is surrounded in single quotes.
- * Otherwise, the result is as for ada_lookup_symbol_list, but is
- * disambiguated by user query if needed. */
-
-struct symbol *
-ada_lookup_symbol (const char *name, struct block *block0,
- namespace_enum namespace)
-{
- struct symbol **candidate_syms;
- struct block **candidate_blocks;
- int n_candidates;
-
- n_candidates = ada_lookup_symbol_list (name,
- block0, namespace,
- &candidate_syms, &candidate_blocks);
-
- if (n_candidates == 0)
- return NULL;
- else if (n_candidates != 1)
- user_select_syms (candidate_syms, candidate_blocks, n_candidates, 1);
-
- return candidate_syms[0];
-}
-
-
-/* True iff STR is a possible encoded suffix of a normal Ada name
- * that is to be ignored for matching purposes. Suffixes of parallel
- * names (e.g., XVE) are not included here. Currently, the possible suffixes
- * are given by the regular expression:
- * (X[nb]*)?(__[0-9]+|\$[0-9]+|___(LJM|X([FDBUP].*|R[^T]?)))?$
- *
- */
-static int
-is_name_suffix (const char *str)
-{
- int k;
- if (str[0] == 'X')
- {
- str += 1;
- while (str[0] != '_' && str[0] != '\0')
- {
- if (str[0] != 'n' && str[0] != 'b')
- return 0;
- str += 1;
- }
- }
- if (str[0] == '\000')
- return 1;
- if (str[0] == '_')
- {
- if (str[1] != '_' || str[2] == '\000')
- return 0;
- if (str[2] == '_')
- {
- if (STREQ (str + 3, "LJM"))
- return 1;
- if (str[3] != 'X')
- return 0;
- if (str[4] == 'F' || str[4] == 'D' || str[4] == 'B' ||
- str[4] == 'U' || str[4] == 'P')
- return 1;
- if (str[4] == 'R' && str[5] != 'T')
- return 1;
- return 0;
- }
- for (k = 2; str[k] != '\0'; k += 1)
- if (!isdigit (str[k]))
- return 0;
- return 1;
- }
- if (str[0] == '$' && str[1] != '\000')
- {
- for (k = 1; str[k] != '\0'; k += 1)
- if (!isdigit (str[k]))
- return 0;
- return 1;
- }
- return 0;
-}
-
-/* True if NAME represents a name of the form A1.A2....An, n>=1 and
- * PATN[0..PATN_LEN-1] = Ak.Ak+1.....An for some k >= 1. Ignores
- * informational suffixes of NAME (i.e., for which is_name_suffix is
- * true). */
-static int
-wild_match (const char *patn, int patn_len, const char *name)
-{
- int name_len;
- int s, e;
-
- name_len = strlen (name);
- if (name_len >= patn_len + 5 && STREQN (name, "_ada_", 5)
- && STREQN (patn, name + 5, patn_len)
- && is_name_suffix (name + patn_len + 5))
- return 1;
-
- while (name_len >= patn_len)
- {
- if (STREQN (patn, name, patn_len) && is_name_suffix (name + patn_len))
- return 1;
- do
- {
- name += 1;
- name_len -= 1;
- }
- while (name_len > 0
- && name[0] != '.' && (name[0] != '_' || name[1] != '_'));
- if (name_len <= 0)
- return 0;
- if (name[0] == '_')
- {
- if (!islower (name[2]))
- return 0;
- name += 2;
- name_len -= 2;
- }
- else
- {
- if (!islower (name[1]))
- return 0;
- name += 1;
- name_len -= 1;
- }
- }
-
- return 0;
-}
-
-
-/* Add symbols from BLOCK matching identifier NAME in NAMESPACE to
- vector *defn_symbols, updating *defn_symbols (if necessary), *SZ (the size of
- the vector *defn_symbols), and *ndefns (the number of symbols
- currently stored in *defn_symbols). If WILD, treat as NAME with a
- wildcard prefix. OBJFILE is the section containing BLOCK. */
-
-static void
-ada_add_block_symbols (struct block *block, const char *name,
- namespace_enum namespace, struct objfile *objfile,
- int wild)
-{
- int i;
- int name_len = strlen (name);
- /* A matching argument symbol, if any. */
- struct symbol *arg_sym;
- /* Set true when we find a matching non-argument symbol */
- int found_sym;
- int is_sorted = BLOCK_SHOULD_SORT (block);
- struct symbol *sym;
-
- arg_sym = NULL;
- found_sym = 0;
- if (wild)
- {
- struct symbol *sym;
- ALL_BLOCK_SYMBOLS (block, i, sym)
- {
- if (SYMBOL_NAMESPACE (sym) == namespace &&
- wild_match (name, name_len, SYMBOL_NAME (sym)))
- {
- switch (SYMBOL_CLASS (sym))
- {
- case LOC_ARG:
- case LOC_LOCAL_ARG:
- case LOC_REF_ARG:
- case LOC_REGPARM:
- case LOC_REGPARM_ADDR:
- case LOC_BASEREG_ARG:
- arg_sym = sym;
- break;
- case LOC_UNRESOLVED:
- continue;
- default:
- found_sym = 1;
- fill_in_ada_prototype (sym);
- add_defn_to_vec (fixup_symbol_section (sym, objfile), block);
- break;
- }
- }
- }
- }
- else
- {
- if (is_sorted)
- {
- int U;
- i = 0;
- U = BLOCK_NSYMS (block) - 1;
- while (U - i > 4)
- {
- int M = (U + i) >> 1;
- struct symbol *sym = BLOCK_SYM (block, M);
- if (SYMBOL_NAME (sym)[0] < name[0])
- i = M + 1;
- else if (SYMBOL_NAME (sym)[0] > name[0])
- U = M - 1;
- else if (strcmp (SYMBOL_NAME (sym), name) < 0)
- i = M + 1;
- else
- U = M;
- }
- }
- else
- i = 0;
-
- for (; i < BLOCK_BUCKETS (block); i += 1)
- for (sym = BLOCK_BUCKET (block, i); sym != NULL; sym = sym->hash_next)
- {
- if (SYMBOL_NAMESPACE (sym) == namespace)
- {
- int cmp = strncmp (name, SYMBOL_NAME (sym), name_len);
-
- if (cmp < 0)
- {
- if (is_sorted)
- {
- i = BLOCK_BUCKETS (block);
- break;
- }
- }
- else if (cmp == 0
- && is_name_suffix (SYMBOL_NAME (sym) + name_len))
- {
- switch (SYMBOL_CLASS (sym))
- {
- case LOC_ARG:
- case LOC_LOCAL_ARG:
- case LOC_REF_ARG:
- case LOC_REGPARM:
- case LOC_REGPARM_ADDR:
- case LOC_BASEREG_ARG:
- arg_sym = sym;
- break;
- case LOC_UNRESOLVED:
- break;
- default:
- found_sym = 1;
- fill_in_ada_prototype (sym);
- add_defn_to_vec (fixup_symbol_section (sym, objfile),
- block);
- break;
- }
- }
- }
- }
- }
-
- if (!found_sym && arg_sym != NULL)
- {
- fill_in_ada_prototype (arg_sym);
- add_defn_to_vec (fixup_symbol_section (arg_sym, objfile), block);
- }
-
- if (!wild)
- {
- arg_sym = NULL;
- found_sym = 0;
- if (is_sorted)
- {
- int U;
- i = 0;
- U = BLOCK_NSYMS (block) - 1;
- while (U - i > 4)
- {
- int M = (U + i) >> 1;
- struct symbol *sym = BLOCK_SYM (block, M);
- if (SYMBOL_NAME (sym)[0] < '_')
- i = M + 1;
- else if (SYMBOL_NAME (sym)[0] > '_')
- U = M - 1;
- else if (strcmp (SYMBOL_NAME (sym), "_ada_") < 0)
- i = M + 1;
- else
- U = M;
- }
- }
- else
- i = 0;
-
- for (; i < BLOCK_BUCKETS (block); i += 1)
- for (sym = BLOCK_BUCKET (block, i); sym != NULL; sym = sym->hash_next)
- {
- struct symbol *sym = BLOCK_SYM (block, i);
-
- if (SYMBOL_NAMESPACE (sym) == namespace)
- {
- int cmp;
-
- cmp = (int) '_' - (int) SYMBOL_NAME (sym)[0];
- if (cmp == 0)
- {
- cmp = strncmp ("_ada_", SYMBOL_NAME (sym), 5);
- if (cmp == 0)
- cmp = strncmp (name, SYMBOL_NAME (sym) + 5, name_len);
- }
-
- if (cmp < 0)
- {
- if (is_sorted)
- {
- i = BLOCK_BUCKETS (block);
- break;
- }
- }
- else if (cmp == 0
- && is_name_suffix (SYMBOL_NAME (sym) + name_len + 5))
- {
- switch (SYMBOL_CLASS (sym))
- {
- case LOC_ARG:
- case LOC_LOCAL_ARG:
- case LOC_REF_ARG:
- case LOC_REGPARM:
- case LOC_REGPARM_ADDR:
- case LOC_BASEREG_ARG:
- arg_sym = sym;
- break;
- case LOC_UNRESOLVED:
- break;
- default:
- found_sym = 1;
- fill_in_ada_prototype (sym);
- add_defn_to_vec (fixup_symbol_section (sym, objfile),
- block);
- break;
- }
- }
- }
- }
-
- /* NOTE: This really shouldn't be needed for _ada_ symbols.
- They aren't parameters, right? */
- if (!found_sym && arg_sym != NULL)
- {
- fill_in_ada_prototype (arg_sym);
- add_defn_to_vec (fixup_symbol_section (arg_sym, objfile), block);
- }
- }
-}
-
-
- /* Function Types */
-
-/* Assuming that SYM is the symbol for a function, fill in its type
- with prototype information, if it is not already there. */
-
-static void
-fill_in_ada_prototype (struct symbol *func)
-{
- struct block *b;
- int nargs, nsyms;
- int i;
- struct type *ftype;
- struct type *rtype;
- size_t max_fields;
- struct symbol *sym;
-
- if (func == NULL
- || TYPE_CODE (SYMBOL_TYPE (func)) != TYPE_CODE_FUNC
- || TYPE_FIELDS (SYMBOL_TYPE (func)) != NULL)
- return;
-
- /* We make each function type unique, so that each may have its own */
- /* parameter types. This particular way of doing so wastes space: */
- /* it would be nicer to build the argument types while the original */
- /* function type is being built (FIXME). */
- rtype = check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (func)));
- ftype = alloc_type (TYPE_OBJFILE (SYMBOL_TYPE (func)));
- make_function_type (rtype, &ftype);
- SYMBOL_TYPE (func) = ftype;
-
- b = SYMBOL_BLOCK_VALUE (func);
-
- nargs = 0;
- max_fields = 8;
- TYPE_FIELDS (ftype) =
- (struct field *) xmalloc (sizeof (struct field) * max_fields);
- ALL_BLOCK_SYMBOLS (b, i, sym)
- {
- GROW_VECT (TYPE_FIELDS (ftype), max_fields, nargs + 1);
-
- switch (SYMBOL_CLASS (sym))
- {
- case LOC_REF_ARG:
- case LOC_REGPARM_ADDR:
- TYPE_FIELD_BITPOS (ftype, nargs) = nargs;
- TYPE_FIELD_BITSIZE (ftype, nargs) = 0;
- TYPE_FIELD_TYPE (ftype, nargs) =
- lookup_pointer_type (check_typedef (SYMBOL_TYPE (sym)));
- TYPE_FIELD_NAME (ftype, nargs) = SYMBOL_NAME (sym);
- nargs += 1;
-
- break;
-
- case LOC_ARG:
- case LOC_REGPARM:
- case LOC_LOCAL_ARG:
- case LOC_BASEREG_ARG:
- TYPE_FIELD_BITPOS (ftype, nargs) = nargs;
- TYPE_FIELD_BITSIZE (ftype, nargs) = 0;
- TYPE_FIELD_TYPE (ftype, nargs) = check_typedef (SYMBOL_TYPE (sym));
- TYPE_FIELD_NAME (ftype, nargs) = SYMBOL_NAME (sym);
- nargs += 1;
-
- break;
-
- default:
- break;
- }
- }
-
- /* Re-allocate fields vector; if there are no fields, make the */
- /* fields pointer non-null anyway, to mark that this function type */
- /* has been filled in. */
-
- TYPE_NFIELDS (ftype) = nargs;
- if (nargs == 0)
- {
- static struct field dummy_field = { 0, 0, 0, 0 };
- xfree (TYPE_FIELDS (ftype));
- TYPE_FIELDS (ftype) = &dummy_field;
- }
- else
- {
- struct field *fields =
- (struct field *) TYPE_ALLOC (ftype, nargs * sizeof (struct field));
- memcpy ((char *) fields,
- (char *) TYPE_FIELDS (ftype), nargs * sizeof (struct field));
- xfree (TYPE_FIELDS (ftype));
- TYPE_FIELDS (ftype) = fields;
- }
-}
-
-
- /* Breakpoint-related */
-
-char no_symtab_msg[] =
- "No symbol table is loaded. Use the \"file\" command.";
-
-/* Assuming that LINE is pointing at the beginning of an argument to
- 'break', return a pointer to the delimiter for the initial segment
- of that name. This is the first ':', ' ', or end of LINE.
-*/
-char *
-ada_start_decode_line_1 (char *line)
-{
- /* [NOTE: strpbrk would be more elegant, but I am reluctant to be
- the first to use such a library function in GDB code.] */
- char *p;
- for (p = line; *p != '\000' && *p != ' ' && *p != ':'; p += 1)
- ;
- return p;
-}
-
-/* *SPEC points to a function and line number spec (as in a break
- command), following any initial file name specification.
-
- Return all symbol table/line specfications (sals) consistent with the
- information in *SPEC and FILE_TABLE in the
- following sense:
- + FILE_TABLE is null, or the sal refers to a line in the file
- named by FILE_TABLE.
- + If *SPEC points to an argument with a trailing ':LINENUM',
- then the sal refers to that line (or one following it as closely as
- possible).
- + If *SPEC does not start with '*', the sal is in a function with
- that name.
-
- Returns with 0 elements if no matching non-minimal symbols found.
-
- If *SPEC begins with a function name of the form <NAME>, then NAME
- is taken as a literal name; otherwise the function name is subject
- to the usual mangling.
-
- *SPEC is updated to point after the function/line number specification.
-
- FUNFIRSTLINE is non-zero if we desire the first line of real code
- in each function (this is ignored in the presence of a LINENUM spec.).
-
- If CANONICAL is non-NULL, and if any of the sals require a
- 'canonical line spec', then *CANONICAL is set to point to an array
- of strings, corresponding to and equal in length to the returned
- list of sals, such that (*CANONICAL)[i] is non-null and contains a
- canonical line spec for the ith returned sal, if needed. If no
- canonical line specs are required and CANONICAL is non-null,
- *CANONICAL is set to NULL.
-
- A 'canonical line spec' is simply a name (in the format of the
- breakpoint command) that uniquely identifies a breakpoint position,
- with no further contextual information or user selection. It is
- needed whenever the file name, function name, and line number
- information supplied is insufficient for this unique
- identification. Currently overloaded functions, the name '*',
- or static functions without a filename yield a canonical line spec.
- The array and the line spec strings are allocated on the heap; it
- is the caller's responsibility to free them. */
-
-struct symtabs_and_lines
-ada_finish_decode_line_1 (char **spec, struct symtab *file_table,
- int funfirstline, char ***canonical)
-{
- struct symbol **symbols;
- struct block **blocks;
- struct block *block;
- int n_matches, i, line_num;
- struct symtabs_and_lines selected;
- struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
- char *name;
-
- int len;
- char *lower_name;
- char *unquoted_name;
-
- if (file_table == NULL)
- block = get_selected_block (NULL);
- else
- block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (file_table), STATIC_BLOCK);
-
- if (canonical != NULL)
- *canonical = (char **) NULL;
-
- name = *spec;
- if (**spec == '*')
- *spec += 1;
- else
- {
- while (**spec != '\000' &&
- !strchr (ada_completer_word_break_characters, **spec))
- *spec += 1;
- }
- len = *spec - name;
-
- line_num = -1;
- if (file_table != NULL && (*spec)[0] == ':' && isdigit ((*spec)[1]))
- {
- line_num = strtol (*spec + 1, spec, 10);
- while (**spec == ' ' || **spec == '\t')
- *spec += 1;
- }
-
- if (name[0] == '*')
- {
- if (line_num == -1)
- error ("Wild-card function with no line number or file name.");
-
- return all_sals_for_line (file_table->filename, line_num, canonical);
- }
-
- if (name[0] == '\'')
- {
- name += 1;
- len -= 2;
- }
-
- if (name[0] == '<')
- {
- unquoted_name = (char *) alloca (len - 1);
- memcpy (unquoted_name, name + 1, len - 2);
- unquoted_name[len - 2] = '\000';
- lower_name = NULL;
- }
- else
- {
- unquoted_name = (char *) alloca (len + 1);
- memcpy (unquoted_name, name, len);
- unquoted_name[len] = '\000';
- lower_name = (char *) alloca (len + 1);
- for (i = 0; i < len; i += 1)
- lower_name[i] = tolower (name[i]);
- lower_name[len] = '\000';
- }
-
- n_matches = 0;
- if (lower_name != NULL)
- n_matches = ada_lookup_symbol_list (ada_mangle (lower_name), block,
- VAR_NAMESPACE, &symbols, &blocks);
- if (n_matches == 0)
- n_matches = ada_lookup_symbol_list (unquoted_name, block,
- VAR_NAMESPACE, &symbols, &blocks);
- if (n_matches == 0 && line_num >= 0)
- error ("No line number information found for %s.", unquoted_name);
- else if (n_matches == 0)
- {
-#ifdef HPPA_COMPILER_BUG
- /* FIXME: See comment in symtab.c::decode_line_1 */
-#undef volatile
- volatile struct symtab_and_line val;
-#define volatile /*nothing */
-#else
- struct symtab_and_line val;
-#endif
- struct minimal_symbol *msymbol;
-
- INIT_SAL (&val);
-
- msymbol = NULL;
- if (lower_name != NULL)
- msymbol = ada_lookup_minimal_symbol (ada_mangle (lower_name));
- if (msymbol == NULL)
- msymbol = ada_lookup_minimal_symbol (unquoted_name);
- if (msymbol != NULL)
- {
- val.pc = SYMBOL_VALUE_ADDRESS (msymbol);
- val.section = SYMBOL_BFD_SECTION (msymbol);
- if (funfirstline)
- {
- val.pc += FUNCTION_START_OFFSET;
- SKIP_PROLOGUE (val.pc);
- }
- selected.sals = (struct symtab_and_line *)
- xmalloc (sizeof (struct symtab_and_line));
- selected.sals[0] = val;
- selected.nelts = 1;
- return selected;
- }
-
- if (!have_full_symbols () &&
- !have_partial_symbols () && !have_minimal_symbols ())
- error (no_symtab_msg);
-
- error ("Function \"%s\" not defined.", unquoted_name);
- return selected; /* for lint */
- }
-
- if (line_num >= 0)
- {
- return
- find_sal_from_funcs_and_line (file_table->filename, line_num,
- symbols, n_matches);
- }
- else
- {
- selected.nelts =
- user_select_syms (symbols, blocks, n_matches, n_matches);
- }
-
- selected.sals = (struct symtab_and_line *)
- xmalloc (sizeof (struct symtab_and_line) * selected.nelts);
- memset (selected.sals, 0, selected.nelts * sizeof (selected.sals[i]));
- make_cleanup (xfree, selected.sals);
-
- i = 0;
- while (i < selected.nelts)
- {
- if (SYMBOL_CLASS (symbols[i]) == LOC_BLOCK)
- selected.sals[i] = find_function_start_sal (symbols[i], funfirstline);
- else if (SYMBOL_LINE (symbols[i]) != 0)
- {
- selected.sals[i].symtab = symtab_for_sym (symbols[i]);
- selected.sals[i].line = SYMBOL_LINE (symbols[i]);
- }
- else if (line_num >= 0)
- {
- /* Ignore this choice */
- symbols[i] = symbols[selected.nelts - 1];
- blocks[i] = blocks[selected.nelts - 1];
- selected.nelts -= 1;
- continue;
- }
- else
- error ("Line number not known for symbol \"%s\"", unquoted_name);
- i += 1;
- }
-
- if (canonical != NULL && (line_num >= 0 || n_matches > 1))
- {
- *canonical = (char **) xmalloc (sizeof (char *) * selected.nelts);
- for (i = 0; i < selected.nelts; i += 1)
- (*canonical)[i] =
- extended_canonical_line_spec (selected.sals[i],
- SYMBOL_SOURCE_NAME (symbols[i]));
- }
-
- discard_cleanups (old_chain);
- return selected;
-}
-
-/* The (single) sal corresponding to line LINE_NUM in a symbol table
- with file name FILENAME that occurs in one of the functions listed
- in SYMBOLS[0 .. NSYMS-1]. */
-static struct symtabs_and_lines
-find_sal_from_funcs_and_line (const char *filename, int line_num,
- struct symbol **symbols, int nsyms)
-{
- struct symtabs_and_lines sals;
- int best_index, best;
- struct linetable *best_linetable;
- struct objfile *objfile;
- struct symtab *s;
- struct symtab *best_symtab;
-
- read_all_symtabs (filename);
-
- best_index = 0;
- best_linetable = NULL;
- best_symtab = NULL;
- best = 0;
- ALL_SYMTABS (objfile, s)
- {
- struct linetable *l;
- int ind, exact;
-
- QUIT;
-
- if (!STREQ (filename, s->filename))
- continue;
- l = LINETABLE (s);
- ind = find_line_in_linetable (l, line_num, symbols, nsyms, &exact);
- if (ind >= 0)
- {
- if (exact)
- {
- best_index = ind;
- best_linetable = l;
- best_symtab = s;
- goto done;
- }
- if (best == 0 || l->item[ind].line < best)
- {
- best = l->item[ind].line;
- best_index = ind;
- best_linetable = l;
- best_symtab = s;
- }
- }
- }
-
- if (best == 0)
- error ("Line number not found in designated function.");
-
-done:
-
- sals.nelts = 1;
- sals.sals = (struct symtab_and_line *) xmalloc (sizeof (sals.sals[0]));
-
- INIT_SAL (&sals.sals[0]);
-
- sals.sals[0].line = best_linetable->item[best_index].line;
- sals.sals[0].pc = best_linetable->item[best_index].pc;
- sals.sals[0].symtab = best_symtab;
-
- return sals;
-}
-
-/* Return the index in LINETABLE of the best match for LINE_NUM whose
- pc falls within one of the functions denoted by SYMBOLS[0..NSYMS-1].
- Set *EXACTP to the 1 if the match is exact, and 0 otherwise. */
-static int
-find_line_in_linetable (struct linetable *linetable, int line_num,
- struct symbol **symbols, int nsyms, int *exactp)
-{
- int i, len, best_index, best;
-
- if (line_num <= 0 || linetable == NULL)
- return -1;
-
- len = linetable->nitems;
- for (i = 0, best_index = -1, best = 0; i < len; i += 1)
- {
- int k;
- struct linetable_entry *item = &(linetable->item[i]);
-
- for (k = 0; k < nsyms; k += 1)
- {
- if (symbols[k] != NULL && SYMBOL_CLASS (symbols[k]) == LOC_BLOCK
- && item->pc >= BLOCK_START (SYMBOL_BLOCK_VALUE (symbols[k]))
- && item->pc < BLOCK_END (SYMBOL_BLOCK_VALUE (symbols[k])))
- goto candidate;
- }
- continue;
-
- candidate:
-
- if (item->line == line_num)
- {
- *exactp = 1;
- return i;
- }
-
- if (item->line > line_num && (best == 0 || item->line < best))
- {
- best = item->line;
- best_index = i;
- }
- }
-
- *exactp = 0;
- return best_index;
-}
-
-/* Find the smallest k >= LINE_NUM such that k is a line number in
- LINETABLE, and k falls strictly within a named function that begins at
- or before LINE_NUM. Return -1 if there is no such k. */
-static int
-nearest_line_number_in_linetable (struct linetable *linetable, int line_num)
-{
- int i, len, best;
-
- if (line_num <= 0 || linetable == NULL || linetable->nitems == 0)
- return -1;
- len = linetable->nitems;
-
- i = 0;
- best = INT_MAX;
- while (i < len)
- {
- int k;
- struct linetable_entry *item = &(linetable->item[i]);
-
- if (item->line >= line_num && item->line < best)
- {
- char *func_name;
- CORE_ADDR start, end;
-
- func_name = NULL;
- find_pc_partial_function (item->pc, &func_name, &start, &end);
-
- if (func_name != NULL && item->pc < end)
- {
- if (item->line == line_num)
- return line_num;
- else
- {
- struct symbol *sym =
- standard_lookup (func_name, VAR_NAMESPACE);
- if (is_plausible_func_for_line (sym, line_num))
- best = item->line;
- else
- {
- do
- i += 1;
- while (i < len && linetable->item[i].pc < end);
- continue;
- }
- }
- }
- }
-
- i += 1;
- }
-
- return (best == INT_MAX) ? -1 : best;
-}
-
-
-/* Return the next higher index, k, into LINETABLE such that k > IND,
- entry k in LINETABLE has a line number equal to LINE_NUM, k
- corresponds to a PC that is in a function different from that
- corresponding to IND, and falls strictly within a named function
- that begins at a line at or preceding STARTING_LINE.
- Return -1 if there is no such k.
- IND == -1 corresponds to no function. */
-
-static int
-find_next_line_in_linetable (struct linetable *linetable, int line_num,
- int starting_line, int ind)
-{
- int i, len;
-
- if (line_num <= 0 || linetable == NULL || ind >= linetable->nitems)
- return -1;
- len = linetable->nitems;
-
- if (ind >= 0)
- {
- CORE_ADDR start, end;
-
- if (find_pc_partial_function (linetable->item[ind].pc,
- (char **) NULL, &start, &end))
- {
- while (ind < len && linetable->item[ind].pc < end)
- ind += 1;
- }
- else
- ind += 1;
- }
- else
- ind = 0;
-
- i = ind;
- while (i < len)
- {
- int k;
- struct linetable_entry *item = &(linetable->item[i]);
-
- if (item->line >= line_num)
- {
- char *func_name;
- CORE_ADDR start, end;
-
- func_name = NULL;
- find_pc_partial_function (item->pc, &func_name, &start, &end);
-
- if (func_name != NULL && item->pc < end)
- {
- if (item->line == line_num)
- {
- struct symbol *sym =
- standard_lookup (func_name, VAR_NAMESPACE);
- if (is_plausible_func_for_line (sym, starting_line))
- return i;
- else
- {
- while ((i + 1) < len && linetable->item[i + 1].pc < end)
- i += 1;
- }
- }
- }
- }
- i += 1;
- }
-
- return -1;
-}
-
-/* True iff function symbol SYM starts somewhere at or before line #
- LINE_NUM. */
-static int
-is_plausible_func_for_line (struct symbol *sym, int line_num)
-{
- struct symtab_and_line start_sal;
-
- if (sym == NULL)
- return 0;
-
- start_sal = find_function_start_sal (sym, 0);
-
- return (start_sal.line != 0 && line_num >= start_sal.line);
-}
-
-static void
-debug_print_lines (struct linetable *lt)
-{
- int i;
-
- if (lt == NULL)
- return;
-
- fprintf (stderr, "\t");
- for (i = 0; i < lt->nitems; i += 1)
- fprintf (stderr, "(%d->%p) ", lt->item[i].line, (void *) lt->item[i].pc);
- fprintf (stderr, "\n");
-}
-
-static void
-debug_print_block (struct block *b)
-{
- int i;
- struct symbol *i;
-
- fprintf (stderr, "Block: %p; [0x%lx, 0x%lx]",
- b, BLOCK_START (b), BLOCK_END (b));
- if (BLOCK_FUNCTION (b) != NULL)
- fprintf (stderr, " Function: %s", SYMBOL_NAME (BLOCK_FUNCTION (b)));
- fprintf (stderr, "\n");
- fprintf (stderr, "\t Superblock: %p\n", BLOCK_SUPERBLOCK (b));
- fprintf (stderr, "\t Symbols:");
- ALL_BLOCK_SYMBOLS (b, i, sym)
- {
- if (i > 0 && i % 4 == 0)
- fprintf (stderr, "\n\t\t ");
- fprintf (stderr, " %s", SYMBOL_NAME (sym));
- }
- fprintf (stderr, "\n");
-}
-
-static void
-debug_print_blocks (struct blockvector *bv)
-{
- int i;
-
- if (bv == NULL)
- return;
- for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i += 1)
- {
- fprintf (stderr, "%6d. ", i);
- debug_print_block (BLOCKVECTOR_BLOCK (bv, i));
- }
-}
-
-static void
-debug_print_symtab (struct symtab *s)
-{
- fprintf (stderr, "Symtab %p\n File: %s; Dir: %s\n", s,
- s->filename, s->dirname);
- fprintf (stderr, " Blockvector: %p, Primary: %d\n",
- BLOCKVECTOR (s), s->primary);
- debug_print_blocks (BLOCKVECTOR (s));
- fprintf (stderr, " Line table: %p\n", LINETABLE (s));
- debug_print_lines (LINETABLE (s));
-}
-
-/* Read in all symbol tables corresponding to partial symbol tables
- with file name FILENAME. */
-static void
-read_all_symtabs (const char *filename)
-{
- struct partial_symtab *ps;
- struct objfile *objfile;
-
- ALL_PSYMTABS (objfile, ps)
- {
- QUIT;
-
- if (STREQ (filename, ps->filename))
- PSYMTAB_TO_SYMTAB (ps);
- }
-}
-
-/* All sals corresponding to line LINE_NUM in a symbol table from file
- FILENAME, as filtered by the user. If CANONICAL is not null, set
- it to a corresponding array of canonical line specs. */
-static struct symtabs_and_lines
-all_sals_for_line (const char *filename, int line_num, char ***canonical)
-{
- struct symtabs_and_lines result;
- struct objfile *objfile;
- struct symtab *s;
- struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
- size_t len;
-
- read_all_symtabs (filename);
-
- result.sals =
- (struct symtab_and_line *) xmalloc (4 * sizeof (result.sals[0]));
- result.nelts = 0;
- len = 4;
- make_cleanup (free_current_contents, &result.sals);
-
- ALL_SYMTABS (objfile, s)
- {
- int ind, target_line_num;
-
- QUIT;
-
- if (!STREQ (s->filename, filename))
- continue;
-
- target_line_num =
- nearest_line_number_in_linetable (LINETABLE (s), line_num);
- if (target_line_num == -1)
- continue;
-
- ind = -1;
- while (1)
- {
- ind =
- find_next_line_in_linetable (LINETABLE (s),
- target_line_num, line_num, ind);
-
- if (ind < 0)
- break;
-
- GROW_VECT (result.sals, len, result.nelts + 1);
- INIT_SAL (&result.sals[result.nelts]);
- result.sals[result.nelts].line = LINETABLE (s)->item[ind].line;
- result.sals[result.nelts].pc = LINETABLE (s)->item[ind].pc;
- result.sals[result.nelts].symtab = s;
- result.nelts += 1;
- }
- }
-
- if (canonical != NULL || result.nelts > 1)
- {
- int k;
- char **func_names = (char **) alloca (result.nelts * sizeof (char *));
- int first_choice = (result.nelts > 1) ? 2 : 1;
- int n;
- int *choices = (int *) alloca (result.nelts * sizeof (int));
-
- for (k = 0; k < result.nelts; k += 1)
- {
- find_pc_partial_function (result.sals[k].pc, &func_names[k],
- (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
- if (func_names[k] == NULL)
- error ("Could not find function for one or more breakpoints.");
- }
-
- if (result.nelts > 1)
- {
- printf_unfiltered ("[0] cancel\n");
- if (result.nelts > 1)
- printf_unfiltered ("[1] all\n");
- for (k = 0; k < result.nelts; k += 1)
- printf_unfiltered ("[%d] %s\n", k + first_choice,
- ada_demangle (func_names[k]));
-
- n = get_selections (choices, result.nelts, result.nelts,
- result.nelts > 1, "instance-choice");
-
- for (k = 0; k < n; k += 1)
- {
- result.sals[k] = result.sals[choices[k]];
- func_names[k] = func_names[choices[k]];
- }
- result.nelts = n;
- }
-
- if (canonical != NULL)
- {
- *canonical = (char **) xmalloc (result.nelts * sizeof (char **));
- make_cleanup (xfree, *canonical);
- for (k = 0; k < result.nelts; k += 1)
- {
- (*canonical)[k] =
- extended_canonical_line_spec (result.sals[k], func_names[k]);
- if ((*canonical)[k] == NULL)
- error ("Could not locate one or more breakpoints.");
- make_cleanup (xfree, (*canonical)[k]);
- }
- }
- }
-
- discard_cleanups (old_chain);
- return result;
-}
-
-
-/* A canonical line specification of the form FILE:NAME:LINENUM for
- symbol table and line data SAL. NULL if insufficient
- information. The caller is responsible for releasing any space
- allocated. */
-
-static char *
-extended_canonical_line_spec (struct symtab_and_line sal, const char *name)
-{
- char *r;
-
- if (sal.symtab == NULL || sal.symtab->filename == NULL || sal.line <= 0)
- return NULL;
-
- r = (char *) xmalloc (strlen (name) + strlen (sal.symtab->filename)
- + sizeof (sal.line) * 3 + 3);
- sprintf (r, "%s:'%s':%d", sal.symtab->filename, name, sal.line);
- return r;
-}
-
-#if 0
-int begin_bnum = -1;
-#endif
-int begin_annotate_level = 0;
-
-static void
-begin_cleanup (void *dummy)
-{
- begin_annotate_level = 0;
-}
-
-static void
-begin_command (char *args, int from_tty)
-{
- struct minimal_symbol *msym;
- CORE_ADDR main_program_name_addr;
- char main_program_name[1024];
- struct cleanup *old_chain = make_cleanup (begin_cleanup, NULL);
- begin_annotate_level = 2;
-
- /* Check that there is a program to debug */
- if (!have_full_symbols () && !have_partial_symbols ())
- error ("No symbol table is loaded. Use the \"file\" command.");
-
- /* Check that we are debugging an Ada program */
- /* if (ada_update_initial_language (language_unknown, NULL) != language_ada)
- error ("Cannot find the Ada initialization procedure. Is this an Ada main program?");
- */
- /* FIXME: language_ada should be defined in defs.h */
-
- /* Get the address of the name of the main procedure */
- msym = lookup_minimal_symbol (ADA_MAIN_PROGRAM_SYMBOL_NAME, NULL, NULL);
-
- if (msym != NULL)
- {
- main_program_name_addr = SYMBOL_VALUE_ADDRESS (msym);
- if (main_program_name_addr == 0)
- error ("Invalid address for Ada main program name.");
-
- /* Read the name of the main procedure */
- extract_string (main_program_name_addr, main_program_name);
-
- /* Put a temporary breakpoint in the Ada main program and run */
- do_command ("tbreak ", main_program_name, 0);
- do_command ("run ", args, 0);
- }
- else
- {
- /* If we could not find the symbol containing the name of the
- main program, that means that the compiler that was used to build
- was not recent enough. In that case, we fallback to the previous
- mechanism, which is a little bit less reliable, but has proved to work
- in most cases. The only cases where it will fail is when the user
- has set some breakpoints which will be hit before the end of the
- begin command processing (eg in the initialization code).
-
- The begining of the main Ada subprogram is located by breaking
- on the adainit procedure. Since we know that the binder generates
- the call to this procedure exactly 2 calls before the call to the
- Ada main subprogram, it is then easy to put a breakpoint on this
- Ada main subprogram once we hit adainit.
- */
- do_command ("tbreak adainit", 0);
- do_command ("run ", args, 0);
- do_command ("up", 0);
- do_command ("tbreak +2", 0);
- do_command ("continue", 0);
- do_command ("step", 0);
- }
-
- do_cleanups (old_chain);
-}
-
-int
-is_ada_runtime_file (char *filename)
-{
- return (STREQN (filename, "s-", 2) ||
- STREQN (filename, "a-", 2) ||
- STREQN (filename, "g-", 2) || STREQN (filename, "i-", 2));
-}
-
-/* find the first frame that contains debugging information and that is not
- part of the Ada run-time, starting from fi and moving upward. */
-
-int
-find_printable_frame (struct frame_info *fi, int level)
-{
- struct symtab_and_line sal;
-
- for (; fi != NULL; level += 1, fi = get_prev_frame (fi))
- {
- /* If fi is not the innermost frame, that normally means that fi->pc
- points to *after* the call instruction, and we want to get the line
- containing the call, never the next line. But if the next frame is
- a signal_handler_caller or a dummy frame, then the next frame was
- not entered as the result of a call, and we want to get the line
- containing fi->pc. */
- sal =
- find_pc_line (fi->pc,
- fi->next != NULL
- && !fi->next->signal_handler_caller
- && !frame_in_dummy (fi->next));
- if (sal.symtab && !is_ada_runtime_file (sal.symtab->filename))
- {
-#if defined(__alpha__) && defined(__osf__) && !defined(VXWORKS_TARGET)
- /* libpthread.so contains some debugging information that prevents us
- from finding the right frame */
-
- if (sal.symtab->objfile &&
- STREQ (sal.symtab->objfile->name, "/usr/shlib/libpthread.so"))
- continue;
-#endif
- selected_frame = fi;
- break;
- }
- }
-
- return level;
-}
-
-void
-ada_report_exception_break (struct breakpoint *b)
-{
-#ifdef UI_OUT
- /* FIXME: break_on_exception should be defined in breakpoint.h */
- /* if (b->break_on_exception == 1)
- {
- /* Assume that cond has 16 elements, the 15th
- being the exception *//*
- if (b->cond && b->cond->nelts == 16)
- {
- ui_out_text (uiout, "on ");
- ui_out_field_string (uiout, "exception",
- SYMBOL_NAME (b->cond->elts[14].symbol));
- }
- else
- ui_out_text (uiout, "on all exceptions");
- }
- else if (b->break_on_exception == 2)
- ui_out_text (uiout, "on unhandled exception");
- else if (b->break_on_exception == 3)
- ui_out_text (uiout, "on assert failure");
- #else
- if (b->break_on_exception == 1)
- { */
- /* Assume that cond has 16 elements, the 15th
- being the exception *//*
- if (b->cond && b->cond->nelts == 16)
- {
- fputs_filtered ("on ", gdb_stdout);
- fputs_filtered (SYMBOL_NAME
- (b->cond->elts[14].symbol), gdb_stdout);
- }
- else
- fputs_filtered ("on all exceptions", gdb_stdout);
- }
- else if (b->break_on_exception == 2)
- fputs_filtered ("on unhandled exception", gdb_stdout);
- else if (b->break_on_exception == 3)
- fputs_filtered ("on assert failure", gdb_stdout);
- */
-#endif
-}
-
-int
-ada_is_exception_sym (struct symbol *sym)
-{
- char *type_name = type_name_no_tag (SYMBOL_TYPE (sym));
-
- return (SYMBOL_CLASS (sym) != LOC_TYPEDEF
- && SYMBOL_CLASS (sym) != LOC_BLOCK
- && SYMBOL_CLASS (sym) != LOC_CONST
- && type_name != NULL && STREQ (type_name, "exception"));
-}
-
-int
-ada_maybe_exception_partial_symbol (struct partial_symbol *sym)
-{
- return (SYMBOL_CLASS (sym) != LOC_TYPEDEF
- && SYMBOL_CLASS (sym) != LOC_BLOCK
- && SYMBOL_CLASS (sym) != LOC_CONST);
-}
-
-/* If ARG points to an Ada exception or assert breakpoint, rewrite
- into equivalent form. Return resulting argument string. Set
- *BREAK_ON_EXCEPTIONP to 1 for ordinary break on exception, 2 for
- break on unhandled, 3 for assert, 0 otherwise. */
-char *
-ada_breakpoint_rewrite (char *arg, int *break_on_exceptionp)
-{
- if (arg == NULL)
- return arg;
- *break_on_exceptionp = 0;
- /* FIXME: language_ada should be defined in defs.h */
- /* if (current_language->la_language == language_ada
- && STREQN (arg, "exception", 9) &&
- (arg[9] == ' ' || arg[9] == '\t' || arg[9] == '\0'))
- {
- char *tok, *end_tok;
- int toklen;
-
- *break_on_exceptionp = 1;
-
- tok = arg+9;
- while (*tok == ' ' || *tok == '\t')
- tok += 1;
-
- end_tok = tok;
-
- while (*end_tok != ' ' && *end_tok != '\t' && *end_tok != '\000')
- end_tok += 1;
-
- toklen = end_tok - tok;
-
- arg = (char*) xmalloc (sizeof ("__gnat_raise_nodefer_with_msg if "
- "long_integer(e) = long_integer(&)")
- + toklen + 1);
- make_cleanup (xfree, arg);
- if (toklen == 0)
- strcpy (arg, "__gnat_raise_nodefer_with_msg");
- else if (STREQN (tok, "unhandled", toklen))
- {
- *break_on_exceptionp = 2;
- strcpy (arg, "__gnat_unhandled_exception");
- }
- else
- {
- sprintf (arg, "__gnat_raise_nodefer_with_msg if "
- "long_integer(e) = long_integer(&%.*s)",
- toklen, tok);
- }
- }
- else if (current_language->la_language == language_ada
- && STREQN (arg, "assert", 6) &&
- (arg[6] == ' ' || arg[6] == '\t' || arg[6] == '\0'))
- {
- char *tok = arg + 6;
-
- *break_on_exceptionp = 3;
-
- arg = (char*)
- xmalloc (sizeof ("system__assertions__raise_assert_failure")
- + strlen (tok) + 1);
- make_cleanup (xfree, arg);
- sprintf (arg, "system__assertions__raise_assert_failure%s", tok);
- }
- */
- return arg;
-}
-
-
- /* Field Access */
-
-/* True if field number FIELD_NUM in struct or union type TYPE is supposed
- to be invisible to users. */
-
-int
-ada_is_ignored_field (struct type *type, int field_num)
-{
- if (field_num < 0 || field_num > TYPE_NFIELDS (type))
- return 1;
- else
- {
- const char *name = TYPE_FIELD_NAME (type, field_num);
- return (name == NULL
- || (name[0] == '_' && !STREQN (name, "_parent", 7)));
- }
-}
-
-/* True iff structure type TYPE has a tag field. */
-
-int
-ada_is_tagged_type (struct type *type)
-{
- if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT)
- return 0;
-
- return (ada_lookup_struct_elt_type (type, "_tag", 1, NULL) != NULL);
-}
-
-/* The type of the tag on VAL. */
-
-struct type *
-ada_tag_type (struct value *val)
-{
- return ada_lookup_struct_elt_type (VALUE_TYPE (val), "_tag", 0, NULL);
-}
-
-/* The value of the tag on VAL. */
-
-struct value *
-ada_value_tag (struct value *val)
-{
- return ada_value_struct_elt (val, "_tag", "record");
-}
-
-/* The parent type of TYPE, or NULL if none. */
-
-struct type *
-ada_parent_type (struct type *type)
-{
- int i;
-
- CHECK_TYPEDEF (type);
-
- if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT)
- return NULL;
-
- for (i = 0; i < TYPE_NFIELDS (type); i += 1)
- if (ada_is_parent_field (type, i))
- return check_typedef (TYPE_FIELD_TYPE (type, i));
-
- return NULL;
-}
-
-/* True iff field number FIELD_NUM of structure type TYPE contains the
- parent-type (inherited) fields of a derived type. Assumes TYPE is
- a structure type with at least FIELD_NUM+1 fields. */
-
-int
-ada_is_parent_field (struct type *type, int field_num)
-{
- const char *name = TYPE_FIELD_NAME (check_typedef (type), field_num);
- return (name != NULL &&
- (STREQN (name, "PARENT", 6) || STREQN (name, "_parent", 7)));
-}
-
-/* True iff field number FIELD_NUM of structure type TYPE is a
- transparent wrapper field (which should be silently traversed when doing
- field selection and flattened when printing). Assumes TYPE is a
- structure type with at least FIELD_NUM+1 fields. Such fields are always
- structures. */
-
-int
-ada_is_wrapper_field (struct type *type, int field_num)
-{
- const char *name = TYPE_FIELD_NAME (type, field_num);
- return (name != NULL
- && (STREQN (name, "PARENT", 6) || STREQ (name, "REP")
- || STREQN (name, "_parent", 7)
- || name[0] == 'S' || name[0] == 'R' || name[0] == 'O'));
-}
-
-/* True iff field number FIELD_NUM of structure or union type TYPE
- is a variant wrapper. Assumes TYPE is a structure type with at least
- FIELD_NUM+1 fields. */
-
-int
-ada_is_variant_part (struct type *type, int field_num)
-{
- struct type *field_type = TYPE_FIELD_TYPE (type, field_num);
- return (TYPE_CODE (field_type) == TYPE_CODE_UNION
- || (is_dynamic_field (type, field_num)
- && TYPE_CODE (TYPE_TARGET_TYPE (field_type)) ==
- TYPE_CODE_UNION));
-}
-
-/* Assuming that VAR_TYPE is a variant wrapper (type of the variant part)
- whose discriminants are contained in the record type OUTER_TYPE,
- returns the type of the controlling discriminant for the variant. */
-
-struct type *
-ada_variant_discrim_type (struct type *var_type, struct type *outer_type)
-{
- char *name = ada_variant_discrim_name (var_type);
- struct type *type = ada_lookup_struct_elt_type (outer_type, name, 1, NULL);
- if (type == NULL)
- return builtin_type_int;
- else
- return type;
-}
-
-/* Assuming that TYPE is the type of a variant wrapper, and FIELD_NUM is a
- valid field number within it, returns 1 iff field FIELD_NUM of TYPE
- represents a 'when others' clause; otherwise 0. */
-
-int
-ada_is_others_clause (struct type *type, int field_num)
-{
- const char *name = TYPE_FIELD_NAME (type, field_num);
- return (name != NULL && name[0] == 'O');
-}
-
-/* Assuming that TYPE0 is the type of the variant part of a record,
- returns the name of the discriminant controlling the variant. The
- value is valid until the next call to ada_variant_discrim_name. */
-
-char *
-ada_variant_discrim_name (struct type *type0)
-{
- static char *result = NULL;
- static size_t result_len = 0;
- struct type *type;
- const char *name;
- const char *discrim_end;
- const char *discrim_start;
-
- if (TYPE_CODE (type0) == TYPE_CODE_PTR)
- type = TYPE_TARGET_TYPE (type0);
- else
- type = type0;
-
- name = ada_type_name (type);
-
- if (name == NULL || name[0] == '\000')
- return "";
-
- for (discrim_end = name + strlen (name) - 6; discrim_end != name;
- discrim_end -= 1)
- {
- if (STREQN (discrim_end, "___XVN", 6))
- break;
- }
- if (discrim_end == name)
- return "";
-
- for (discrim_start = discrim_end; discrim_start != name + 3;
- discrim_start -= 1)
- {
- if (discrim_start == name + 1)
- return "";
- if ((discrim_start > name + 3 && STREQN (discrim_start - 3, "___", 3))
- || discrim_start[-1] == '.')
- break;
- }
-
- GROW_VECT (result, result_len, discrim_end - discrim_start + 1);
- strncpy (result, discrim_start, discrim_end - discrim_start);
- result[discrim_end - discrim_start] = '\0';
- return result;
-}
-
-/* Scan STR for a subtype-encoded number, beginning at position K. Put the
- position of the character just past the number scanned in *NEW_K,
- if NEW_K!=NULL. Put the scanned number in *R, if R!=NULL. Return 1
- if there was a valid number at the given position, and 0 otherwise. A
- "subtype-encoded" number consists of the absolute value in decimal,
- followed by the letter 'm' to indicate a negative number. Assumes 0m
- does not occur. */
-
-int
-ada_scan_number (const char str[], int k, LONGEST * R, int *new_k)
-{
- ULONGEST RU;
-
- if (!isdigit (str[k]))
- return 0;
-
- /* Do it the hard way so as not to make any assumption about
- the relationship of unsigned long (%lu scan format code) and
- LONGEST. */
- RU = 0;
- while (isdigit (str[k]))
- {
- RU = RU * 10 + (str[k] - '0');
- k += 1;
- }
-
- if (str[k] == 'm')
- {
- if (R != NULL)
- *R = (-(LONGEST) (RU - 1)) - 1;
- k += 1;
- }
- else if (R != NULL)
- *R = (LONGEST) RU;
-
- /* NOTE on the above: Technically, C does not say what the results of
- - (LONGEST) RU or (LONGEST) -RU are for RU == largest positive
- number representable as a LONGEST (although either would probably work
- in most implementations). When RU>0, the locution in the then branch
- above is always equivalent to the negative of RU. */
-
- if (new_k != NULL)
- *new_k = k;
- return 1;
-}
-
-/* Assuming that TYPE is a variant part wrapper type (a VARIANTS field),
- and FIELD_NUM is a valid field number within it, returns 1 iff VAL is
- in the range encoded by field FIELD_NUM of TYPE; otherwise 0. */
-
-int
-ada_in_variant (LONGEST val, struct type *type, int field_num)
-{
- const char *name = TYPE_FIELD_NAME (type, field_num);
- int p;
-
- p = 0;
- while (1)
- {
- switch (name[p])
- {
- case '\0':
- return 0;
- case 'S':
- {
- LONGEST W;
- if (!ada_scan_number (name, p + 1, &W, &p))
- return 0;
- if (val == W)
- return 1;
- break;
- }
- case 'R':
- {
- LONGEST L, U;
- if (!ada_scan_number (name, p + 1, &L, &p)
- || name[p] != 'T' || !ada_scan_number (name, p + 1, &U, &p))
- return 0;
- if (val >= L && val <= U)
- return 1;
- break;
- }
- case 'O':
- return 1;
- default:
- return 0;
- }
- }
-}
-
-/* Given a value ARG1 (offset by OFFSET bytes)
- of a struct or union type ARG_TYPE,
- extract and return the value of one of its (non-static) fields.
- FIELDNO says which field. Differs from value_primitive_field only
- in that it can handle packed values of arbitrary type. */
-
-struct value *
-ada_value_primitive_field (struct value *arg1, int offset, int fieldno,
- struct type *arg_type)
-{
- struct value *v;
- struct type *type;
-
- CHECK_TYPEDEF (arg_type);
- type = TYPE_FIELD_TYPE (arg_type, fieldno);
-
- /* Handle packed fields */
-
- if (TYPE_FIELD_BITSIZE (arg_type, fieldno) != 0)
- {
- int bit_pos = TYPE_FIELD_BITPOS (arg_type, fieldno);
- int bit_size = TYPE_FIELD_BITSIZE (arg_type, fieldno);
-
- return ada_value_primitive_packed_val (arg1, VALUE_CONTENTS (arg1),
- offset + bit_pos / 8,
- bit_pos % 8, bit_size, type);
- }
- else
- return value_primitive_field (arg1, offset, fieldno, arg_type);
-}
-
-
-/* Look for a field NAME in ARG. Adjust the address of ARG by OFFSET bytes,
- and search in it assuming it has (class) type TYPE.
- If found, return value, else return NULL.
-
- Searches recursively through wrapper fields (e.g., '_parent'). */
-
-struct value *
-ada_search_struct_field (char *name, struct value *arg, int offset,
- struct type *type)
-{
- int i;
- CHECK_TYPEDEF (type);
-
- for (i = TYPE_NFIELDS (type) - 1; i >= 0; i -= 1)
- {
- char *t_field_name = TYPE_FIELD_NAME (type, i);
-
- if (t_field_name == NULL)
- continue;
-
- else if (field_name_match (t_field_name, name))
- return ada_value_primitive_field (arg, offset, i, type);
-
- else if (ada_is_wrapper_field (type, i))
- {
- struct value *v = ada_search_struct_field (name, arg,
- offset +
- TYPE_FIELD_BITPOS (type,
- i) /
- 8,
- TYPE_FIELD_TYPE (type,
- i));
- if (v != NULL)
- return v;
- }
-
- else if (ada_is_variant_part (type, i))
- {
- int j;
- struct type *field_type = check_typedef (TYPE_FIELD_TYPE (type, i));
- int var_offset = offset + TYPE_FIELD_BITPOS (type, i) / 8;
-
- for (j = TYPE_NFIELDS (field_type) - 1; j >= 0; j -= 1)
- {
- struct value *v = ada_search_struct_field (name, arg,
- var_offset
- +
- TYPE_FIELD_BITPOS
- (field_type, j) / 8,
- TYPE_FIELD_TYPE
- (field_type, j));
- if (v != NULL)
- return v;
- }
- }
- }
- return NULL;
-}
-
-/* Given ARG, a value of type (pointer to a)* structure/union,
- extract the component named NAME from the ultimate target structure/union
- and return it as a value with its appropriate type.
-
- The routine searches for NAME among all members of the structure itself
- and (recursively) among all members of any wrapper members
- (e.g., '_parent').
-
- ERR is a name (for use in error messages) that identifies the class
- of entity that ARG is supposed to be. */
-
-struct value *
-ada_value_struct_elt (struct value *arg, char *name, char *err)
-{
- struct type *t;
- struct value *v;
-
- arg = ada_coerce_ref (arg);
- t = check_typedef (VALUE_TYPE (arg));
-
- /* Follow pointers until we get to a non-pointer. */
-
- while (TYPE_CODE (t) == TYPE_CODE_PTR || TYPE_CODE (t) == TYPE_CODE_REF)
- {
- arg = ada_value_ind (arg);
- t = check_typedef (VALUE_TYPE (arg));
- }
-
- if (TYPE_CODE (t) != TYPE_CODE_STRUCT && TYPE_CODE (t) != TYPE_CODE_UNION)
- error ("Attempt to extract a component of a value that is not a %s.",
- err);
-
- v = ada_search_struct_field (name, arg, 0, t);
- if (v == NULL)
- error ("There is no member named %s.", name);
-
- return v;
-}
-
-/* Given a type TYPE, look up the type of the component of type named NAME.
- If DISPP is non-null, add its byte displacement from the beginning of a
- structure (pointed to by a value) of type TYPE to *DISPP (does not
- work for packed fields).
-
- Matches any field whose name has NAME as a prefix, possibly
- followed by "___".
-
- TYPE can be either a struct or union, or a pointer or reference to
- a struct or union. If it is a pointer or reference, its target
- type is automatically used.
-
- Looks recursively into variant clauses and parent types.
-
- If NOERR is nonzero, return NULL if NAME is not suitably defined. */
-
-struct type *
-ada_lookup_struct_elt_type (struct type *type, char *name, int noerr,
- int *dispp)
-{
- int i;
-
- if (name == NULL)
- goto BadName;
-
- while (1)
- {
- CHECK_TYPEDEF (type);
- if (TYPE_CODE (type) != TYPE_CODE_PTR
- && TYPE_CODE (type) != TYPE_CODE_REF)
- break;
- type = TYPE_TARGET_TYPE (type);
- }
-
- if (TYPE_CODE (type) != TYPE_CODE_STRUCT &&
- TYPE_CODE (type) != TYPE_CODE_UNION)
- {
- target_terminal_ours ();
- gdb_flush (gdb_stdout);
- fprintf_unfiltered (gdb_stderr, "Type ");
- type_print (type, "", gdb_stderr, -1);
- error (" is not a structure or union type");
- }
-
- type = to_static_fixed_type (type);
-
- for (i = 0; i < TYPE_NFIELDS (type); i += 1)
- {
- char *t_field_name = TYPE_FIELD_NAME (type, i);
- struct type *t;
- int disp;
-
- if (t_field_name == NULL)
- continue;
-
- else if (field_name_match (t_field_name, name))
- {
- if (dispp != NULL)
- *dispp += TYPE_FIELD_BITPOS (type, i) / 8;
- return check_typedef (TYPE_FIELD_TYPE (type, i));
- }
-
- else if (ada_is_wrapper_field (type, i))
- {
- disp = 0;
- t = ada_lookup_struct_elt_type (TYPE_FIELD_TYPE (type, i), name,
- 1, &disp);
- if (t != NULL)
- {
- if (dispp != NULL)
- *dispp += disp + TYPE_FIELD_BITPOS (type, i) / 8;
- return t;
- }
- }
-
- else if (ada_is_variant_part (type, i))
- {
- int j;
- struct type *field_type = check_typedef (TYPE_FIELD_TYPE (type, i));
-
- for (j = TYPE_NFIELDS (field_type) - 1; j >= 0; j -= 1)
- {
- disp = 0;
- t = ada_lookup_struct_elt_type (TYPE_FIELD_TYPE (field_type, j),
- name, 1, &disp);
- if (t != NULL)
- {
- if (dispp != NULL)
- *dispp += disp + TYPE_FIELD_BITPOS (type, i) / 8;
- return t;
- }
- }
- }
-
- }
-
-BadName:
- if (!noerr)
- {
- target_terminal_ours ();
- gdb_flush (gdb_stdout);
- fprintf_unfiltered (gdb_stderr, "Type ");
- type_print (type, "", gdb_stderr, -1);
- fprintf_unfiltered (gdb_stderr, " has no component named ");
- error ("%s", name == NULL ? "<null>" : name);
- }
-
- return NULL;
-}
-
-/* Assuming that VAR_TYPE is the type of a variant part of a record (a union),
- within a value of type OUTER_TYPE that is stored in GDB at
- OUTER_VALADDR, determine which variant clause (field number in VAR_TYPE,
- numbering from 0) is applicable. Returns -1 if none are. */
-
-int
-ada_which_variant_applies (struct type *var_type, struct type *outer_type,
- char *outer_valaddr)
-{
- int others_clause;
- int i;
- int disp;
- struct type *discrim_type;
- char *discrim_name = ada_variant_discrim_name (var_type);
- LONGEST discrim_val;
-
- disp = 0;
- discrim_type =
- ada_lookup_struct_elt_type (outer_type, discrim_name, 1, &disp);
- if (discrim_type == NULL)
- return -1;
- discrim_val = unpack_long (discrim_type, outer_valaddr + disp);
-
- others_clause = -1;
- for (i = 0; i < TYPE_NFIELDS (var_type); i += 1)
- {
- if (ada_is_others_clause (var_type, i))
- others_clause = i;
- else if (ada_in_variant (discrim_val, var_type, i))
- return i;
- }
-
- return others_clause;
-}
-
-
-
- /* Dynamic-Sized Records */
-
-/* Strategy: The type ostensibly attached to a value with dynamic size
- (i.e., a size that is not statically recorded in the debugging
- data) does not accurately reflect the size or layout of the value.
- Our strategy is to convert these values to values with accurate,
- conventional types that are constructed on the fly. */
-
-/* There is a subtle and tricky problem here. In general, we cannot
- determine the size of dynamic records without its data. However,
- the 'struct value' data structure, which GDB uses to represent
- quantities in the inferior process (the target), requires the size
- of the type at the time of its allocation in order to reserve space
- for GDB's internal copy of the data. That's why the
- 'to_fixed_xxx_type' routines take (target) addresses as parameters,
- rather than struct value*s.
-
- However, GDB's internal history variables ($1, $2, etc.) are
- struct value*s containing internal copies of the data that are not, in
- general, the same as the data at their corresponding addresses in
- the target. Fortunately, the types we give to these values are all
- conventional, fixed-size types (as per the strategy described
- above), so that we don't usually have to perform the
- 'to_fixed_xxx_type' conversions to look at their values.
- Unfortunately, there is one exception: if one of the internal
- history variables is an array whose elements are unconstrained
- records, then we will need to create distinct fixed types for each
- element selected. */
-
-/* The upshot of all of this is that many routines take a (type, host
- address, target address) triple as arguments to represent a value.
- The host address, if non-null, is supposed to contain an internal
- copy of the relevant data; otherwise, the program is to consult the
- target at the target address. */
-
-/* Assuming that VAL0 represents a pointer value, the result of
- dereferencing it. Differs from value_ind in its treatment of
- dynamic-sized types. */
-
-struct value *
-ada_value_ind (struct value *val0)
-{
- struct value *val = unwrap_value (value_ind (val0));
- return ada_to_fixed_value (VALUE_TYPE (val), 0,
- VALUE_ADDRESS (val) + VALUE_OFFSET (val), val);
-}
-
-/* The value resulting from dereferencing any "reference to"
- * qualifiers on VAL0. */
-static struct value *
-ada_coerce_ref (struct value *val0)
-{
- if (TYPE_CODE (VALUE_TYPE (val0)) == TYPE_CODE_REF)
- {
- struct value *val = val0;
- COERCE_REF (val);
- val = unwrap_value (val);
- return ada_to_fixed_value (VALUE_TYPE (val), 0,
- VALUE_ADDRESS (val) + VALUE_OFFSET (val),
- val);
- }
- else
- return val0;
-}
-
-/* Return OFF rounded upward if necessary to a multiple of
- ALIGNMENT (a power of 2). */
-
-static unsigned int
-align_value (unsigned int off, unsigned int alignment)
-{
- return (off + alignment - 1) & ~(alignment - 1);
-}
-
-/* Return the additional bit offset required by field F of template
- type TYPE. */
-
-static unsigned int
-field_offset (struct type *type, int f)
-{
- int n = TYPE_FIELD_BITPOS (type, f);
- /* Kludge (temporary?) to fix problem with dwarf output. */
- if (n < 0)
- return (unsigned int) n & 0xffff;
- else
- return n;
-}
-
-
-/* Return the bit alignment required for field #F of template type TYPE. */
-
-static unsigned int
-field_alignment (struct type *type, int f)
-{
- const char *name = TYPE_FIELD_NAME (type, f);
- int len = (name == NULL) ? 0 : strlen (name);
- int align_offset;
-
- if (len < 8 || !isdigit (name[len - 1]))
- return TARGET_CHAR_BIT;
-
- if (isdigit (name[len - 2]))
- align_offset = len - 2;
- else
- align_offset = len - 1;
-
- if (align_offset < 7 || !STREQN ("___XV", name + align_offset - 6, 5))
- return TARGET_CHAR_BIT;
-
- return atoi (name + align_offset) * TARGET_CHAR_BIT;
-}
-
-/* Find a type named NAME. Ignores ambiguity. */
-struct type *
-ada_find_any_type (const char *name)
-{
- struct symbol *sym;
-
- sym = standard_lookup (name, VAR_NAMESPACE);
- if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
- return SYMBOL_TYPE (sym);
-
- sym = standard_lookup (name, STRUCT_NAMESPACE);
- if (sym != NULL)
- return SYMBOL_TYPE (sym);
-
- return NULL;
-}
-
-/* Because of GNAT encoding conventions, several GDB symbols may match a
- given type name. If the type denoted by TYPE0 is to be preferred to
- that of TYPE1 for purposes of type printing, return non-zero;
- otherwise return 0. */
-int
-ada_prefer_type (struct type *type0, struct type *type1)
-{
- if (type1 == NULL)
- return 1;
- else if (type0 == NULL)
- return 0;
- else if (TYPE_CODE (type1) == TYPE_CODE_VOID)
- return 1;
- else if (TYPE_CODE (type0) == TYPE_CODE_VOID)
- return 0;
- else if (ada_is_packed_array_type (type0))
- return 1;
- else if (ada_is_array_descriptor (type0)
- && !ada_is_array_descriptor (type1))
- return 1;
- else if (ada_renaming_type (type0) != NULL
- && ada_renaming_type (type1) == NULL)
- return 1;
- return 0;
-}
-
-/* The name of TYPE, which is either its TYPE_NAME, or, if that is
- null, its TYPE_TAG_NAME. Null if TYPE is null. */
-char *
-ada_type_name (struct type *type)
-{
- if (type == NULL)
- return NULL;
- else if (TYPE_NAME (type) != NULL)
- return TYPE_NAME (type);
- else
- return TYPE_TAG_NAME (type);
-}
-
-/* Find a parallel type to TYPE whose name is formed by appending
- SUFFIX to the name of TYPE. */
-
-struct type *
-ada_find_parallel_type (struct type *type, const char *suffix)
-{
- static char *name;
- static size_t name_len = 0;
- struct symbol **syms;
- struct block **blocks;
- int nsyms;
- int len;
- char *typename = ada_type_name (type);
-
- if (typename == NULL)
- return NULL;
-
- len = strlen (typename);
-
- GROW_VECT (name, name_len, len + strlen (suffix) + 1);
-
- strcpy (name, typename);
- strcpy (name + len, suffix);
-
- return ada_find_any_type (name);
-}
-
-
-/* If TYPE is a variable-size record type, return the corresponding template
- type describing its fields. Otherwise, return NULL. */
-
-static struct type *
-dynamic_template_type (struct type *type)
-{
- CHECK_TYPEDEF (type);
-
- if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT
- || ada_type_name (type) == NULL)
- return NULL;
- else
- {
- int len = strlen (ada_type_name (type));
- if (len > 6 && STREQ (ada_type_name (type) + len - 6, "___XVE"))
- return type;
- else
- return ada_find_parallel_type (type, "___XVE");
- }
-}
-
-/* Assuming that TEMPL_TYPE is a union or struct type, returns
- non-zero iff field FIELD_NUM of TEMPL_TYPE has dynamic size. */
-
-static int
-is_dynamic_field (struct type *templ_type, int field_num)
-{
- const char *name = TYPE_FIELD_NAME (templ_type, field_num);
- return name != NULL
- && TYPE_CODE (TYPE_FIELD_TYPE (templ_type, field_num)) == TYPE_CODE_PTR
- && strstr (name, "___XVL") != NULL;
-}
-
-/* Assuming that TYPE is a struct type, returns non-zero iff TYPE
- contains a variant part. */
-
-static int
-contains_variant_part (struct type *type)
-{
- int f;
-
- if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT
- || TYPE_NFIELDS (type) <= 0)
- return 0;
- return ada_is_variant_part (type, TYPE_NFIELDS (type) - 1);
-}
-
-/* A record type with no fields, . */
-static struct type *
-empty_record (struct objfile *objfile)
-{
- struct type *type = alloc_type (objfile);
- TYPE_CODE (type) = TYPE_CODE_STRUCT;
- TYPE_NFIELDS (type) = 0;
- TYPE_FIELDS (type) = NULL;
- TYPE_NAME (type) = "<empty>";
- TYPE_TAG_NAME (type) = NULL;
- TYPE_FLAGS (type) = 0;
- TYPE_LENGTH (type) = 0;
- return type;
-}
-
-/* An ordinary record type (with fixed-length fields) that describes
- the value of type TYPE at VALADDR or ADDRESS (see comments at
- the beginning of this section) VAL according to GNAT conventions.
- DVAL0 should describe the (portion of a) record that contains any
- necessary discriminants. It should be NULL if VALUE_TYPE (VAL) is
- an outer-level type (i.e., as opposed to a branch of a variant.) A
- variant field (unless unchecked) is replaced by a particular branch
- of the variant. */
-/* NOTE: Limitations: For now, we assume that dynamic fields and
- * variants occupy whole numbers of bytes. However, they need not be
- * byte-aligned. */
-
-static struct type *
-template_to_fixed_record_type (struct type *type, char *valaddr,
- CORE_ADDR address, struct value *dval0)
-{
- struct value *mark = value_mark ();
- struct value *dval;
- struct type *rtype;
- int nfields, bit_len;
- long off;
- int f;
-
- nfields = TYPE_NFIELDS (type);
- rtype = alloc_type (TYPE_OBJFILE (type));
- TYPE_CODE (rtype) = TYPE_CODE_STRUCT;
- INIT_CPLUS_SPECIFIC (rtype);
- TYPE_NFIELDS (rtype) = nfields;
- TYPE_FIELDS (rtype) = (struct field *)
- TYPE_ALLOC (rtype, nfields * sizeof (struct field));
- memset (TYPE_FIELDS (rtype), 0, sizeof (struct field) * nfields);
- TYPE_NAME (rtype) = ada_type_name (type);
- TYPE_TAG_NAME (rtype) = NULL;
- /* FIXME: TYPE_FLAG_FIXED_INSTANCE should be defined in
- gdbtypes.h */
- /* TYPE_FLAGS (rtype) |= TYPE_FLAG_FIXED_INSTANCE; */
-
- off = 0;
- bit_len = 0;
- for (f = 0; f < nfields; f += 1)
- {
- int fld_bit_len, bit_incr;
- off =
- align_value (off,
- field_alignment (type, f)) + TYPE_FIELD_BITPOS (type, f);
- /* NOTE: used to use field_offset above, but that causes
- * problems with really negative bit positions. So, let's
- * rediscover why we needed field_offset and fix it properly. */
- TYPE_FIELD_BITPOS (rtype, f) = off;
- TYPE_FIELD_BITSIZE (rtype, f) = 0;
-
- if (ada_is_variant_part (type, f))
- {
- struct type *branch_type;
-
- if (dval0 == NULL)
- dval = value_from_contents_and_address (rtype, valaddr, address);
- else
- dval = dval0;
-
- branch_type =
- to_fixed_variant_branch_type
- (TYPE_FIELD_TYPE (type, f),
- cond_offset_host (valaddr, off / TARGET_CHAR_BIT),
- cond_offset_target (address, off / TARGET_CHAR_BIT), dval);
- if (branch_type == NULL)
- TYPE_NFIELDS (rtype) -= 1;
- else
- {
- TYPE_FIELD_TYPE (rtype, f) = branch_type;
- TYPE_FIELD_NAME (rtype, f) = "S";
- }
- bit_incr = 0;
- fld_bit_len =
- TYPE_LENGTH (TYPE_FIELD_TYPE (rtype, f)) * TARGET_CHAR_BIT;
- }
- else if (is_dynamic_field (type, f))
- {
- if (dval0 == NULL)
- dval = value_from_contents_and_address (rtype, valaddr, address);
- else
- dval = dval0;
-
- TYPE_FIELD_TYPE (rtype, f) =
- ada_to_fixed_type
- (ada_get_base_type
- (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, f))),
- cond_offset_host (valaddr, off / TARGET_CHAR_BIT),
- cond_offset_target (address, off / TARGET_CHAR_BIT), dval);
- TYPE_FIELD_NAME (rtype, f) = TYPE_FIELD_NAME (type, f);
- bit_incr = fld_bit_len =
- TYPE_LENGTH (TYPE_FIELD_TYPE (rtype, f)) * TARGET_CHAR_BIT;
- }
- else
- {
- TYPE_FIELD_TYPE (rtype, f) = TYPE_FIELD_TYPE (type, f);
- TYPE_FIELD_NAME (rtype, f) = TYPE_FIELD_NAME (type, f);
- if (TYPE_FIELD_BITSIZE (type, f) > 0)
- bit_incr = fld_bit_len =
- TYPE_FIELD_BITSIZE (rtype, f) = TYPE_FIELD_BITSIZE (type, f);
- else
- bit_incr = fld_bit_len =
- TYPE_LENGTH (TYPE_FIELD_TYPE (type, f)) * TARGET_CHAR_BIT;
- }
- if (off + fld_bit_len > bit_len)
- bit_len = off + fld_bit_len;
- off += bit_incr;
- TYPE_LENGTH (rtype) = bit_len / TARGET_CHAR_BIT;
- }
- TYPE_LENGTH (rtype) = align_value (TYPE_LENGTH (rtype), TYPE_LENGTH (type));
-
- value_free_to_mark (mark);
- if (TYPE_LENGTH (rtype) > varsize_limit)
- error ("record type with dynamic size is larger than varsize-limit");
- return rtype;
-}
-
-/* As for template_to_fixed_record_type, but uses no run-time values.
- As a result, this type can only be approximate, but that's OK,
- since it is used only for type determinations. Works on both
- structs and unions.
- Representation note: to save space, we memoize the result of this
- function in the TYPE_TARGET_TYPE of the template type. */
-
-static struct type *
-template_to_static_fixed_type (struct type *templ_type)
-{
- struct type *type;
- int nfields;
- int f;
-
- if (TYPE_TARGET_TYPE (templ_type) != NULL)
- return TYPE_TARGET_TYPE (templ_type);
-
- nfields = TYPE_NFIELDS (templ_type);
- TYPE_TARGET_TYPE (templ_type) = type =
- alloc_type (TYPE_OBJFILE (templ_type));
- TYPE_CODE (type) = TYPE_CODE (templ_type);
- INIT_CPLUS_SPECIFIC (type);
- TYPE_NFIELDS (type) = nfields;
- TYPE_FIELDS (type) = (struct field *)
- TYPE_ALLOC (type, nfields * sizeof (struct field));
- memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields);
- TYPE_NAME (type) = ada_type_name (templ_type);
- TYPE_TAG_NAME (type) = NULL;
- /* FIXME: TYPE_FLAG_FIXED_INSTANCE should be defined in gdbtypes.h */
- /* TYPE_FLAGS (type) |= TYPE_FLAG_FIXED_INSTANCE; */
- TYPE_LENGTH (type) = 0;
-
- for (f = 0; f < nfields; f += 1)
- {
- TYPE_FIELD_BITPOS (type, f) = 0;
- TYPE_FIELD_BITSIZE (type, f) = 0;
-
- if (is_dynamic_field (templ_type, f))
- {
- TYPE_FIELD_TYPE (type, f) =
- to_static_fixed_type (TYPE_TARGET_TYPE
- (TYPE_FIELD_TYPE (templ_type, f)));
- TYPE_FIELD_NAME (type, f) = TYPE_FIELD_NAME (templ_type, f);
- }
- else
- {
- TYPE_FIELD_TYPE (type, f) =
- check_typedef (TYPE_FIELD_TYPE (templ_type, f));
- TYPE_FIELD_NAME (type, f) = TYPE_FIELD_NAME (templ_type, f);
- }
- }
-
- return type;
-}
-
-/* A revision of TYPE0 -- a non-dynamic-sized record with a variant
- part -- in which the variant part is replaced with the appropriate
- branch. */
-static struct type *
-to_record_with_fixed_variant_part (struct type *type, char *valaddr,
- CORE_ADDR address, struct value *dval)
-{
- struct value *mark = value_mark ();
- struct type *rtype;
- struct type *branch_type;
- int nfields = TYPE_NFIELDS (type);
-
- if (dval == NULL)
- return type;
-
- rtype = alloc_type (TYPE_OBJFILE (type));
- TYPE_CODE (rtype) = TYPE_CODE_STRUCT;
- INIT_CPLUS_SPECIFIC (type);
- TYPE_NFIELDS (rtype) = TYPE_NFIELDS (type);
- TYPE_FIELDS (rtype) =
- (struct field *) TYPE_ALLOC (rtype, nfields * sizeof (struct field));
- memcpy (TYPE_FIELDS (rtype), TYPE_FIELDS (type),
- sizeof (struct field) * nfields);
- TYPE_NAME (rtype) = ada_type_name (type);
- TYPE_TAG_NAME (rtype) = NULL;
- /* FIXME: TYPE_FLAG_FIXED_INSTANCE should be defined in gdbtypes.h */
- /* TYPE_FLAGS (rtype) |= TYPE_FLAG_FIXED_INSTANCE; */
- TYPE_LENGTH (rtype) = TYPE_LENGTH (type);
-
- branch_type =
- to_fixed_variant_branch_type
- (TYPE_FIELD_TYPE (type, nfields - 1),
- cond_offset_host (valaddr,
- TYPE_FIELD_BITPOS (type,
- nfields - 1) / TARGET_CHAR_BIT),
- cond_offset_target (address,
- TYPE_FIELD_BITPOS (type,
- nfields - 1) / TARGET_CHAR_BIT),
- dval);
- if (branch_type == NULL)
- {
- TYPE_NFIELDS (rtype) -= 1;
- TYPE_LENGTH (rtype) -=
- TYPE_LENGTH (TYPE_FIELD_TYPE (type, nfields - 1));
- }
- else
- {
- TYPE_FIELD_TYPE (rtype, nfields - 1) = branch_type;
- TYPE_FIELD_NAME (rtype, nfields - 1) = "S";
- TYPE_FIELD_BITSIZE (rtype, nfields - 1) = 0;
- TYPE_LENGTH (rtype) += TYPE_LENGTH (branch_type);
- -TYPE_LENGTH (TYPE_FIELD_TYPE (type, nfields - 1));
- }
-
- return rtype;
-}
-
-/* An ordinary record type (with fixed-length fields) that describes
- the value at (TYPE0, VALADDR, ADDRESS) [see explanation at
- beginning of this section]. Any necessary discriminants' values
- should be in DVAL, a record value; it should be NULL if the object
- at ADDR itself contains any necessary discriminant values. A
- variant field (unless unchecked) is replaced by a particular branch
- of the variant. */
-
-static struct type *
-to_fixed_record_type (struct type *type0, char *valaddr, CORE_ADDR address,
- struct value *dval)
-{
- struct type *templ_type;
-
- /* FIXME: TYPE_FLAG_FIXED_INSTANCE should be defined in gdbtypes.h */
- /* if (TYPE_FLAGS (type0) & TYPE_FLAG_FIXED_INSTANCE)
- return type0;
- */
- templ_type = dynamic_template_type (type0);
-
- if (templ_type != NULL)
- return template_to_fixed_record_type (templ_type, valaddr, address, dval);
- else if (contains_variant_part (type0))
- return to_record_with_fixed_variant_part (type0, valaddr, address, dval);
- else
- {
- /* FIXME: TYPE_FLAG_FIXED_INSTANCE should be defined in gdbtypes.h */
- /* TYPE_FLAGS (type0) |= TYPE_FLAG_FIXED_INSTANCE; */
- return type0;
- }
-
-}
-
-/* An ordinary record type (with fixed-length fields) that describes
- the value at (VAR_TYPE0, VALADDR, ADDRESS), where VAR_TYPE0 is a
- union type. Any necessary discriminants' values should be in DVAL,
- a record value. That is, this routine selects the appropriate
- branch of the union at ADDR according to the discriminant value
- indicated in the union's type name. */
-
-static struct type *
-to_fixed_variant_branch_type (struct type *var_type0, char *valaddr,
- CORE_ADDR address, struct value *dval)
-{
- int which;
- struct type *templ_type;
- struct type *var_type;
-
- if (TYPE_CODE (var_type0) == TYPE_CODE_PTR)
- var_type = TYPE_TARGET_TYPE (var_type0);
- else
- var_type = var_type0;
-
- templ_type = ada_find_parallel_type (var_type, "___XVU");
-
- if (templ_type != NULL)
- var_type = templ_type;
-
- which =
- ada_which_variant_applies (var_type,
- VALUE_TYPE (dval), VALUE_CONTENTS (dval));
-
- if (which < 0)
- return empty_record (TYPE_OBJFILE (var_type));
- else if (is_dynamic_field (var_type, which))
- return
- to_fixed_record_type
- (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (var_type, which)),
- valaddr, address, dval);
- else if (contains_variant_part (TYPE_FIELD_TYPE (var_type, which)))
- return
- to_fixed_record_type
- (TYPE_FIELD_TYPE (var_type, which), valaddr, address, dval);
- else
- return TYPE_FIELD_TYPE (var_type, which);
-}
-
-/* Assuming that TYPE0 is an array type describing the type of a value
- at ADDR, and that DVAL describes a record containing any
- discriminants used in TYPE0, returns a type for the value that
- contains no dynamic components (that is, no components whose sizes
- are determined by run-time quantities). Unless IGNORE_TOO_BIG is
- true, gives an error message if the resulting type's size is over
- varsize_limit.
-*/
-
-static struct type *
-to_fixed_array_type (struct type *type0, struct value *dval,
- int ignore_too_big)
-{
- struct type *index_type_desc;
- struct type *result;
-
- /* FIXME: TYPE_FLAG_FIXED_INSTANCE should be defined in gdbtypes.h */
-/* if (ada_is_packed_array_type (type0) /* revisit? *//*
- || (TYPE_FLAGS (type0) & TYPE_FLAG_FIXED_INSTANCE))
- return type0; */
-
- index_type_desc = ada_find_parallel_type (type0, "___XA");
- if (index_type_desc == NULL)
- {
- struct type *elt_type0 = check_typedef (TYPE_TARGET_TYPE (type0));
- /* NOTE: elt_type---the fixed version of elt_type0---should never
- * depend on the contents of the array in properly constructed
- * debugging data. */
- struct type *elt_type = ada_to_fixed_type (elt_type0, 0, 0, dval);
-
- if (elt_type0 == elt_type)
- result = type0;
- else
- result = create_array_type (alloc_type (TYPE_OBJFILE (type0)),
- elt_type, TYPE_INDEX_TYPE (type0));
- }
- else
- {
- int i;
- struct type *elt_type0;
-
- elt_type0 = type0;
- for (i = TYPE_NFIELDS (index_type_desc); i > 0; i -= 1)
- elt_type0 = TYPE_TARGET_TYPE (elt_type0);
-
- /* NOTE: result---the fixed version of elt_type0---should never
- * depend on the contents of the array in properly constructed
- * debugging data. */
- result = ada_to_fixed_type (check_typedef (elt_type0), 0, 0, dval);
- for (i = TYPE_NFIELDS (index_type_desc) - 1; i >= 0; i -= 1)
- {
- struct type *range_type =
- to_fixed_range_type (TYPE_FIELD_NAME (index_type_desc, i),
- dval, TYPE_OBJFILE (type0));
- result = create_array_type (alloc_type (TYPE_OBJFILE (type0)),
- result, range_type);
- }
- if (!ignore_too_big && TYPE_LENGTH (result) > varsize_limit)
- error ("array type with dynamic size is larger than varsize-limit");
- }
-
-/* FIXME: TYPE_FLAG_FIXED_INSTANCE should be defined in gdbtypes.h */
-/* TYPE_FLAGS (result) |= TYPE_FLAG_FIXED_INSTANCE; */
- return result;
-}
-
-
-/* A standard type (containing no dynamically sized components)
- corresponding to TYPE for the value (TYPE, VALADDR, ADDRESS)
- DVAL describes a record containing any discriminants used in TYPE0,
- and may be NULL if there are none. */
-
-struct type *
-ada_to_fixed_type (struct type *type, char *valaddr, CORE_ADDR address,
- struct value *dval)
-{
- CHECK_TYPEDEF (type);
- switch (TYPE_CODE (type))
- {
- default:
- return type;
- case TYPE_CODE_STRUCT:
- return to_fixed_record_type (type, valaddr, address, NULL);
- case TYPE_CODE_ARRAY:
- return to_fixed_array_type (type, dval, 0);
- case TYPE_CODE_UNION:
- if (dval == NULL)
- return type;
- else
- return to_fixed_variant_branch_type (type, valaddr, address, dval);
- }
-}
-
-/* A standard (static-sized) type corresponding as well as possible to
- TYPE0, but based on no runtime data. */
-
-static struct type *
-to_static_fixed_type (struct type *type0)
-{
- struct type *type;
-
- if (type0 == NULL)
- return NULL;
-
- /* FIXME: TYPE_FLAG_FIXED_INSTANCE should be defined in gdbtypes.h */
- /* if (TYPE_FLAGS (type0) & TYPE_FLAG_FIXED_INSTANCE)
- return type0;
- */
- CHECK_TYPEDEF (type0);
-
- switch (TYPE_CODE (type0))
- {
- default:
- return type0;
- case TYPE_CODE_STRUCT:
- type = dynamic_template_type (type0);
- if (type != NULL)
- return template_to_static_fixed_type (type);
- return type0;
- case TYPE_CODE_UNION:
- type = ada_find_parallel_type (type0, "___XVU");
- if (type != NULL)
- return template_to_static_fixed_type (type);
- return type0;
- }
-}
-
-/* A static approximation of TYPE with all type wrappers removed. */
-static struct type *
-static_unwrap_type (struct type *type)
-{
- if (ada_is_aligner_type (type))
- {
- struct type *type1 = TYPE_FIELD_TYPE (check_typedef (type), 0);
- if (ada_type_name (type1) == NULL)
- TYPE_NAME (type1) = ada_type_name (type);
-
- return static_unwrap_type (type1);
- }
- else
- {
- struct type *raw_real_type = ada_get_base_type (type);
- if (raw_real_type == type)
- return type;
- else
- return to_static_fixed_type (raw_real_type);
- }
-}
-
-/* In some cases, incomplete and private types require
- cross-references that are not resolved as records (for example,
- type Foo;
- type FooP is access Foo;
- V: FooP;
- type Foo is array ...;
- ). In these cases, since there is no mechanism for producing
- cross-references to such types, we instead substitute for FooP a
- stub enumeration type that is nowhere resolved, and whose tag is
- the name of the actual type. Call these types "non-record stubs". */
-
-/* A type equivalent to TYPE that is not a non-record stub, if one
- exists, otherwise TYPE. */
-struct type *
-ada_completed_type (struct type *type)
-{
- CHECK_TYPEDEF (type);
- if (type == NULL || TYPE_CODE (type) != TYPE_CODE_ENUM
- || (TYPE_FLAGS (type) & TYPE_FLAG_STUB) == 0
- || TYPE_TAG_NAME (type) == NULL)
- return type;
- else
- {
- char *name = TYPE_TAG_NAME (type);
- struct type *type1 = ada_find_any_type (name);
- return (type1 == NULL) ? type : type1;
- }
-}
-
-/* A value representing the data at VALADDR/ADDRESS as described by
- type TYPE0, but with a standard (static-sized) type that correctly
- describes it. If VAL0 is not NULL and TYPE0 already is a standard
- type, then return VAL0 [this feature is simply to avoid redundant
- creation of struct values]. */
-
-struct value *
-ada_to_fixed_value (struct type *type0, char *valaddr, CORE_ADDR address,
- struct value *val0)
-{
- struct type *type = ada_to_fixed_type (type0, valaddr, address, NULL);
- if (type == type0 && val0 != NULL)
- return val0;
- else
- return value_from_contents_and_address (type, valaddr, address);
-}
-
-/* A value representing VAL, but with a standard (static-sized) type
- chosen to approximate the real type of VAL as well as possible, but
- without consulting any runtime values. For Ada dynamic-sized
- types, therefore, the type of the result is likely to be inaccurate. */
-
-struct value *
-ada_to_static_fixed_value (struct value *val)
-{
- struct type *type =
- to_static_fixed_type (static_unwrap_type (VALUE_TYPE (val)));
- if (type == VALUE_TYPE (val))
- return val;
- else
- return coerce_unspec_val_to_type (val, 0, type);
-}
-
-
-
-
-
-/* Attributes */
-
-/* Table mapping attribute numbers to names */
-/* NOTE: Keep up to date with enum ada_attribute definition in ada-lang.h */
-
-static const char *attribute_names[] = {
- "<?>",
-
- "first",
- "last",
- "length",
- "image",
- "img",
- "max",
- "min",
- "pos" "tag",
- "val",
-
- 0
-};
-
-const char *
-ada_attribute_name (int n)
-{
- if (n > 0 && n < (int) ATR_END)
- return attribute_names[n];
- else
- return attribute_names[0];
-}
-
-/* Evaluate the 'POS attribute applied to ARG. */
-
-static struct value *
-value_pos_atr (struct value *arg)
-{
- struct type *type = VALUE_TYPE (arg);
-
- if (!discrete_type_p (type))
- error ("'POS only defined on discrete types");
-
- if (TYPE_CODE (type) == TYPE_CODE_ENUM)
- {
- int i;
- LONGEST v = value_as_long (arg);
-
- for (i = 0; i < TYPE_NFIELDS (type); i += 1)
- {
- if (v == TYPE_FIELD_BITPOS (type, i))
- return value_from_longest (builtin_type_ada_int, i);
- }
- error ("enumeration value is invalid: can't find 'POS");
- }
- else
- return value_from_longest (builtin_type_ada_int, value_as_long (arg));
-}
-
-/* Evaluate the TYPE'VAL attribute applied to ARG. */
-
-static struct value *
-value_val_atr (struct type *type, struct value *arg)
-{
- if (!discrete_type_p (type))
- error ("'VAL only defined on discrete types");
- if (!integer_type_p (VALUE_TYPE (arg)))
- error ("'VAL requires integral argument");
-
- if (TYPE_CODE (type) == TYPE_CODE_ENUM)
- {
- long pos = value_as_long (arg);
- if (pos < 0 || pos >= TYPE_NFIELDS (type))
- error ("argument to 'VAL out of range");
- return value_from_longest (type, TYPE_FIELD_BITPOS (type, pos));
- }
- else
- return value_from_longest (type, value_as_long (arg));
-}
-
-
- /* Evaluation */
-
-/* True if TYPE appears to be an Ada character type.
- * [At the moment, this is true only for Character and Wide_Character;
- * It is a heuristic test that could stand improvement]. */
-
-int
-ada_is_character_type (struct type *type)
-{
- const char *name = ada_type_name (type);
- return
- name != NULL
- && (TYPE_CODE (type) == TYPE_CODE_CHAR
- || TYPE_CODE (type) == TYPE_CODE_INT
- || TYPE_CODE (type) == TYPE_CODE_RANGE)
- && (STREQ (name, "character") || STREQ (name, "wide_character")
- || STREQ (name, "unsigned char"));
-}
-
-/* True if TYPE appears to be an Ada string type. */
-
-int
-ada_is_string_type (struct type *type)
-{
- CHECK_TYPEDEF (type);
- if (type != NULL
- && TYPE_CODE (type) != TYPE_CODE_PTR
- && (ada_is_simple_array (type) || ada_is_array_descriptor (type))
- && ada_array_arity (type) == 1)
- {
- struct type *elttype = ada_array_element_type (type, 1);
-
- return ada_is_character_type (elttype);
- }
- else
- return 0;
-}
-
-
-/* True if TYPE is a struct type introduced by the compiler to force the
- alignment of a value. Such types have a single field with a
- distinctive name. */
-
-int
-ada_is_aligner_type (struct type *type)
-{
- CHECK_TYPEDEF (type);
- return (TYPE_CODE (type) == TYPE_CODE_STRUCT
- && TYPE_NFIELDS (type) == 1
- && STREQ (TYPE_FIELD_NAME (type, 0), "F"));
-}
-
-/* If there is an ___XVS-convention type parallel to SUBTYPE, return
- the parallel type. */
-
-struct type *
-ada_get_base_type (struct type *raw_type)
-{
- struct type *real_type_namer;
- struct type *raw_real_type;
- struct type *real_type;
-
- if (raw_type == NULL || TYPE_CODE (raw_type) != TYPE_CODE_STRUCT)
- return raw_type;
-
- real_type_namer = ada_find_parallel_type (raw_type, "___XVS");
- if (real_type_namer == NULL
- || TYPE_CODE (real_type_namer) != TYPE_CODE_STRUCT
- || TYPE_NFIELDS (real_type_namer) != 1)
- return raw_type;
-
- raw_real_type = ada_find_any_type (TYPE_FIELD_NAME (real_type_namer, 0));
- if (raw_real_type == NULL)
- return raw_type;
- else
- return raw_real_type;
-}
-
-/* The type of value designated by TYPE, with all aligners removed. */
-
-struct type *
-ada_aligned_type (struct type *type)
-{
- if (ada_is_aligner_type (type))
- return ada_aligned_type (TYPE_FIELD_TYPE (type, 0));
- else
- return ada_get_base_type (type);
-}
-
-
-/* The address of the aligned value in an object at address VALADDR
- having type TYPE. Assumes ada_is_aligner_type (TYPE). */
-
-char *
-ada_aligned_value_addr (struct type *type, char *valaddr)
-{
- if (ada_is_aligner_type (type))
- return ada_aligned_value_addr (TYPE_FIELD_TYPE (type, 0),
- valaddr +
- TYPE_FIELD_BITPOS (type,
- 0) / TARGET_CHAR_BIT);
- else
- return valaddr;
-}
-
-/* The printed representation of an enumeration literal with encoded
- name NAME. The value is good to the next call of ada_enum_name. */
-const char *
-ada_enum_name (const char *name)
-{
- char *tmp;
-
- while (1)
- {
- if ((tmp = strstr (name, "__")) != NULL)
- name = tmp + 2;
- else if ((tmp = strchr (name, '.')) != NULL)
- name = tmp + 1;
- else
- break;
- }
-
- if (name[0] == 'Q')
- {
- static char result[16];
- int v;
- if (name[1] == 'U' || name[1] == 'W')
- {
- if (sscanf (name + 2, "%x", &v) != 1)
- return name;
- }
- else
- return name;
-
- if (isascii (v) && isprint (v))
- sprintf (result, "'%c'", v);
- else if (name[1] == 'U')
- sprintf (result, "[\"%02x\"]", v);
- else
- sprintf (result, "[\"%04x\"]", v);
-
- return result;
- }
- else
- return name;
-}
-
-static struct value *
-evaluate_subexp (struct type *expect_type, struct expression *exp, int *pos,
- enum noside noside)
-{
- return (*exp->language_defn->evaluate_exp) (expect_type, exp, pos, noside);
-}
-
-/* Evaluate the subexpression of EXP starting at *POS as for
- evaluate_type, updating *POS to point just past the evaluated
- expression. */
-
-static struct value *
-evaluate_subexp_type (struct expression *exp, int *pos)
-{
- return (*exp->language_defn->evaluate_exp)
- (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS);
-}
-
-/* If VAL is wrapped in an aligner or subtype wrapper, return the
- value it wraps. */
-
-static struct value *
-unwrap_value (struct value *val)
-{
- struct type *type = check_typedef (VALUE_TYPE (val));
- if (ada_is_aligner_type (type))
- {
- struct value *v = value_struct_elt (&val, NULL, "F",
- NULL, "internal structure");
- struct type *val_type = check_typedef (VALUE_TYPE (v));
- if (ada_type_name (val_type) == NULL)
- TYPE_NAME (val_type) = ada_type_name (type);
-
- return unwrap_value (v);
- }
- else
- {
- struct type *raw_real_type =
- ada_completed_type (ada_get_base_type (type));
-
- if (type == raw_real_type)
- return val;
-
- return
- coerce_unspec_val_to_type
- (val, 0, ada_to_fixed_type (raw_real_type, 0,
- VALUE_ADDRESS (val) + VALUE_OFFSET (val),
- NULL));
- }
-}
-
-static struct value *
-cast_to_fixed (struct type *type, struct value *arg)
-{
- LONGEST val;
-
- if (type == VALUE_TYPE (arg))
- return arg;
- else if (ada_is_fixed_point_type (VALUE_TYPE (arg)))
- val = ada_float_to_fixed (type,
- ada_fixed_to_float (VALUE_TYPE (arg),
- value_as_long (arg)));
- else
- {
- DOUBLEST argd =
- value_as_double (value_cast (builtin_type_double, value_copy (arg)));
- val = ada_float_to_fixed (type, argd);
- }
-
- return value_from_longest (type, val);
-}
-
-static struct value *
-cast_from_fixed_to_double (struct value *arg)
-{
- DOUBLEST val = ada_fixed_to_float (VALUE_TYPE (arg),
- value_as_long (arg));
- return value_from_double (builtin_type_double, val);
-}
-
-/* Coerce VAL as necessary for assignment to an lval of type TYPE, and
- * return the converted value. */
-static struct value *
-coerce_for_assign (struct type *type, struct value *val)
-{
- struct type *type2 = VALUE_TYPE (val);
- if (type == type2)
- return val;
-
- CHECK_TYPEDEF (type2);
- CHECK_TYPEDEF (type);
-
- if (TYPE_CODE (type2) == TYPE_CODE_PTR
- && TYPE_CODE (type) == TYPE_CODE_ARRAY)
- {
- val = ada_value_ind (val);
- type2 = VALUE_TYPE (val);
- }
-
- if (TYPE_CODE (type2) == TYPE_CODE_ARRAY
- && TYPE_CODE (type) == TYPE_CODE_ARRAY)
- {
- if (TYPE_LENGTH (type2) != TYPE_LENGTH (type)
- || TYPE_LENGTH (TYPE_TARGET_TYPE (type2))
- != TYPE_LENGTH (TYPE_TARGET_TYPE (type2)))
- error ("Incompatible types in assignment");
- VALUE_TYPE (val) = type;
- }
- return val;
-}
-
-struct value *
-ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
- int *pos, enum noside noside)
-{
- enum exp_opcode op;
- enum ada_attribute atr;
- int tem, tem2, tem3;
- int pc;
- struct value *arg1 = NULL, *arg2 = NULL, *arg3;
- struct type *type;
- int nargs;
- struct value **argvec;
-
- pc = *pos;
- *pos += 1;
- op = exp->elts[pc].opcode;
-
- switch (op)
- {
- default:
- *pos -= 1;
- return
- unwrap_value (evaluate_subexp_standard
- (expect_type, exp, pos, noside));
-
- case UNOP_CAST:
- (*pos) += 2;
- type = exp->elts[pc + 1].type;
- arg1 = evaluate_subexp (type, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (type != check_typedef (VALUE_TYPE (arg1)))
- {
- if (ada_is_fixed_point_type (type))
- arg1 = cast_to_fixed (type, arg1);
- else if (ada_is_fixed_point_type (VALUE_TYPE (arg1)))
- arg1 = value_cast (type, cast_from_fixed_to_double (arg1));
- else if (VALUE_LVAL (arg1) == lval_memory)
- {
- /* This is in case of the really obscure (and undocumented,
- but apparently expected) case of (Foo) Bar.all, where Bar
- is an integer constant and Foo is a dynamic-sized type.
- If we don't do this, ARG1 will simply be relabeled with
- TYPE. */
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return value_zero (to_static_fixed_type (type), not_lval);
- arg1 =
- ada_to_fixed_value
- (type, 0, VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1), 0);
- }
- else
- arg1 = value_cast (type, arg1);
- }
- return arg1;
-
- /* FIXME: UNOP_QUAL should be defined in expression.h */
- /* case UNOP_QUAL:
- (*pos) += 2;
- type = exp->elts[pc + 1].type;
- return ada_evaluate_subexp (type, exp, pos, noside);
- */
- case BINOP_ASSIGN:
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- arg2 = evaluate_subexp (VALUE_TYPE (arg1), exp, pos, noside);
- if (noside == EVAL_SKIP || noside == EVAL_AVOID_SIDE_EFFECTS)
- return arg1;
- if (binop_user_defined_p (op, arg1, arg2))
- return value_x_binop (arg1, arg2, op, OP_NULL, EVAL_NORMAL);
- else
- {
- if (ada_is_fixed_point_type (VALUE_TYPE (arg1)))
- arg2 = cast_to_fixed (VALUE_TYPE (arg1), arg2);
- else if (ada_is_fixed_point_type (VALUE_TYPE (arg2)))
- error
- ("Fixed-point values must be assigned to fixed-point variables");
- else
- arg2 = coerce_for_assign (VALUE_TYPE (arg1), arg2);
- return ada_value_assign (arg1, arg2);
- }
-
- case BINOP_ADD:
- arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
- arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (binop_user_defined_p (op, arg1, arg2))
- return value_x_binop (arg1, arg2, op, OP_NULL, EVAL_NORMAL);
- else
- {
- if ((ada_is_fixed_point_type (VALUE_TYPE (arg1))
- || ada_is_fixed_point_type (VALUE_TYPE (arg2)))
- && VALUE_TYPE (arg1) != VALUE_TYPE (arg2))
- error
- ("Operands of fixed-point addition must have the same type");
- return value_cast (VALUE_TYPE (arg1), value_add (arg1, arg2));
- }
-
- case BINOP_SUB:
- arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
- arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (binop_user_defined_p (op, arg1, arg2))
- return value_x_binop (arg1, arg2, op, OP_NULL, EVAL_NORMAL);
- else
- {
- if ((ada_is_fixed_point_type (VALUE_TYPE (arg1))
- || ada_is_fixed_point_type (VALUE_TYPE (arg2)))
- && VALUE_TYPE (arg1) != VALUE_TYPE (arg2))
- error
- ("Operands of fixed-point subtraction must have the same type");
- return value_cast (VALUE_TYPE (arg1), value_sub (arg1, arg2));
- }
-
- case BINOP_MUL:
- case BINOP_DIV:
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (binop_user_defined_p (op, arg1, arg2))
- return value_x_binop (arg1, arg2, op, OP_NULL, EVAL_NORMAL);
- else
- if (noside == EVAL_AVOID_SIDE_EFFECTS
- && (op == BINOP_DIV || op == BINOP_REM || op == BINOP_MOD))
- return value_zero (VALUE_TYPE (arg1), not_lval);
- else
- {
- if (ada_is_fixed_point_type (VALUE_TYPE (arg1)))
- arg1 = cast_from_fixed_to_double (arg1);
- if (ada_is_fixed_point_type (VALUE_TYPE (arg2)))
- arg2 = cast_from_fixed_to_double (arg2);
- return value_binop (arg1, arg2, op);
- }
-
- case UNOP_NEG:
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (unop_user_defined_p (op, arg1))
- return value_x_unop (arg1, op, EVAL_NORMAL);
- else if (ada_is_fixed_point_type (VALUE_TYPE (arg1)))
- return value_cast (VALUE_TYPE (arg1), value_neg (arg1));
- else
- return value_neg (arg1);
-
- /* FIXME: OP_UNRESOLVED_VALUE should be defined in expression.h */
- /* case OP_UNRESOLVED_VALUE:
- /* Only encountered when an unresolved symbol occurs in a
- context other than a function call, in which case, it is
- illegal. *//*
- (*pos) += 3;
- if (noside == EVAL_SKIP)
- goto nosideret;
- else
- error ("Unexpected unresolved symbol, %s, during evaluation",
- ada_demangle (exp->elts[pc + 2].name));
- */
- case OP_VAR_VALUE:
- *pos -= 1;
- if (noside == EVAL_SKIP)
- {
- *pos += 4;
- goto nosideret;
- }
- else if (noside == EVAL_AVOID_SIDE_EFFECTS)
- {
- *pos += 4;
- return value_zero
- (to_static_fixed_type
- (static_unwrap_type (SYMBOL_TYPE (exp->elts[pc + 2].symbol))),
- not_lval);
- }
- else
- {
- arg1 =
- unwrap_value (evaluate_subexp_standard
- (expect_type, exp, pos, noside));
- return ada_to_fixed_value (VALUE_TYPE (arg1), 0,
- VALUE_ADDRESS (arg1) +
- VALUE_OFFSET (arg1), arg1);
- }
-
- case OP_ARRAY:
- (*pos) += 3;
- tem2 = longest_to_int (exp->elts[pc + 1].longconst);
- tem3 = longest_to_int (exp->elts[pc + 2].longconst);
- nargs = tem3 - tem2 + 1;
- type = expect_type ? check_typedef (expect_type) : NULL_TYPE;
-
- argvec =
- (struct value * *) alloca (sizeof (struct value *) * (nargs + 1));
- for (tem = 0; tem == 0 || tem < nargs; tem += 1)
- /* At least one element gets inserted for the type */
- {
- /* Ensure that array expressions are coerced into pointer objects. */
- argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside);
- }
- if (noside == EVAL_SKIP)
- goto nosideret;
- return value_array (tem2, tem3, argvec);
-
- case OP_FUNCALL:
- (*pos) += 2;
-
- /* Allocate arg vector, including space for the function to be
- called in argvec[0] and a terminating NULL */
- nargs = longest_to_int (exp->elts[pc + 1].longconst);
- argvec =
- (struct value * *) alloca (sizeof (struct value *) * (nargs + 2));
-
- /* FIXME: OP_UNRESOLVED_VALUE should be defined in expression.h */
- /* FIXME: name should be defined in expresion.h */
- /* if (exp->elts[*pos].opcode == OP_UNRESOLVED_VALUE)
- error ("Unexpected unresolved symbol, %s, during evaluation",
- ada_demangle (exp->elts[pc + 5].name));
- */
- if (0)
- {
- error ("unexpected code path, FIXME");
- }
- else
- {
- for (tem = 0; tem <= nargs; tem += 1)
- argvec[tem] = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- argvec[tem] = 0;
-
- if (noside == EVAL_SKIP)
- goto nosideret;
- }
-
- if (TYPE_CODE (VALUE_TYPE (argvec[0])) == TYPE_CODE_REF)
- argvec[0] = value_addr (argvec[0]);
-
- if (ada_is_packed_array_type (VALUE_TYPE (argvec[0])))
- argvec[0] = ada_coerce_to_simple_array (argvec[0]);
-
- type = check_typedef (VALUE_TYPE (argvec[0]));
- if (TYPE_CODE (type) == TYPE_CODE_PTR)
- {
- switch (TYPE_CODE (check_typedef (TYPE_TARGET_TYPE (type))))
- {
- case TYPE_CODE_FUNC:
- type = check_typedef (TYPE_TARGET_TYPE (type));
- break;
- case TYPE_CODE_ARRAY:
- break;
- case TYPE_CODE_STRUCT:
- if (noside != EVAL_AVOID_SIDE_EFFECTS)
- argvec[0] = ada_value_ind (argvec[0]);
- type = check_typedef (TYPE_TARGET_TYPE (type));
- break;
- default:
- error ("cannot subscript or call something of type `%s'",
- ada_type_name (VALUE_TYPE (argvec[0])));
- break;
- }
- }
-
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_FUNC:
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return allocate_value (TYPE_TARGET_TYPE (type));
- return call_function_by_hand (argvec[0], nargs, argvec + 1);
- case TYPE_CODE_STRUCT:
- {
- int arity = ada_array_arity (type);
- type = ada_array_element_type (type, nargs);
- if (type == NULL)
- error ("cannot subscript or call a record");
- if (arity != nargs)
- error ("wrong number of subscripts; expecting %d", arity);
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return allocate_value (ada_aligned_type (type));
- return
- unwrap_value (ada_value_subscript
- (argvec[0], nargs, argvec + 1));
- }
- case TYPE_CODE_ARRAY:
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- {
- type = ada_array_element_type (type, nargs);
- if (type == NULL)
- error ("element type of array unknown");
- else
- return allocate_value (ada_aligned_type (type));
- }
- return
- unwrap_value (ada_value_subscript
- (ada_coerce_to_simple_array (argvec[0]),
- nargs, argvec + 1));
- case TYPE_CODE_PTR: /* Pointer to array */
- type = to_fixed_array_type (TYPE_TARGET_TYPE (type), NULL, 1);
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- {
- type = ada_array_element_type (type, nargs);
- if (type == NULL)
- error ("element type of array unknown");
- else
- return allocate_value (ada_aligned_type (type));
- }
- return
- unwrap_value (ada_value_ptr_subscript (argvec[0], type,
- nargs, argvec + 1));
-
- default:
- error ("Internal error in evaluate_subexp");
- }
-
- case TERNOP_SLICE:
- {
- struct value *array = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- int lowbound
- = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
- int upper
- = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
- if (noside == EVAL_SKIP)
- goto nosideret;
-
- /* If this is a reference to an array, then dereference it */
- if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_REF
- && TYPE_TARGET_TYPE (VALUE_TYPE (array)) != NULL
- && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (array))) ==
- TYPE_CODE_ARRAY
- && !ada_is_array_descriptor (check_typedef (VALUE_TYPE (array))))
- {
- array = ada_coerce_ref (array);
- }
-
- if (noside == EVAL_AVOID_SIDE_EFFECTS &&
- ada_is_array_descriptor (check_typedef (VALUE_TYPE (array))))
- {
- /* Try to dereference the array, in case it is an access to array */
- struct type *arrType = ada_type_of_array (array, 0);
- if (arrType != NULL)
- array = value_at_lazy (arrType, 0, NULL);
- }
- if (ada_is_array_descriptor (VALUE_TYPE (array)))
- array = ada_coerce_to_simple_array (array);
-
- /* If at this point we have a pointer to an array, it means that
- it is a pointer to a simple (non-ada) array. We just then
- dereference it */
- if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_PTR
- && TYPE_TARGET_TYPE (VALUE_TYPE (array)) != NULL
- && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (array))) ==
- TYPE_CODE_ARRAY)
- {
- array = ada_value_ind (array);
- }
-
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- /* The following will get the bounds wrong, but only in contexts
- where the value is not being requested (FIXME?). */
- return array;
- else
- return value_slice (array, lowbound, upper - lowbound + 1);
- }
-
- /* FIXME: UNOP_MBR should be defined in expression.h */
- /* case UNOP_MBR:
- (*pos) += 2;
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- type = exp->elts[pc + 1].type;
-
- if (noside == EVAL_SKIP)
- goto nosideret;
-
- switch (TYPE_CODE (type))
- {
- default:
- warning ("Membership test incompletely implemented; always returns true");
- return value_from_longest (builtin_type_int, (LONGEST) 1);
-
- case TYPE_CODE_RANGE:
- arg2 = value_from_longest (builtin_type_int,
- (LONGEST) TYPE_LOW_BOUND (type));
- arg3 = value_from_longest (builtin_type_int,
- (LONGEST) TYPE_HIGH_BOUND (type));
- return
- value_from_longest (builtin_type_int,
- (value_less (arg1,arg3)
- || value_equal (arg1,arg3))
- && (value_less (arg2,arg1)
- || value_equal (arg2,arg1)));
- }
- */
- /* FIXME: BINOP_MBR should be defined in expression.h */
- /* case BINOP_MBR:
- (*pos) += 2;
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
-
- if (noside == EVAL_SKIP)
- goto nosideret;
-
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return value_zero (builtin_type_int, not_lval);
-
- tem = longest_to_int (exp->elts[pc + 1].longconst);
-
- if (tem < 1 || tem > ada_array_arity (VALUE_TYPE (arg2)))
- error ("invalid dimension number to '%s", "range");
-
- arg3 = ada_array_bound (arg2, tem, 1);
- arg2 = ada_array_bound (arg2, tem, 0);
-
- return
- value_from_longest (builtin_type_int,
- (value_less (arg1,arg3)
- || value_equal (arg1,arg3))
- && (value_less (arg2,arg1)
- || value_equal (arg2,arg1)));
- */
- /* FIXME: TERNOP_MBR should be defined in expression.h */
- /* case TERNOP_MBR:
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- arg3 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
-
- if (noside == EVAL_SKIP)
- goto nosideret;
-
- return
- value_from_longest (builtin_type_int,
- (value_less (arg1,arg3)
- || value_equal (arg1,arg3))
- && (value_less (arg2,arg1)
- || value_equal (arg2,arg1)));
- */
- /* FIXME: OP_ATTRIBUTE should be defined in expression.h */
- /* case OP_ATTRIBUTE:
- *pos += 3;
- atr = (enum ada_attribute) longest_to_int (exp->elts[pc + 2].longconst);
- switch (atr)
- {
- default:
- error ("unexpected attribute encountered");
-
- case ATR_FIRST:
- case ATR_LAST:
- case ATR_LENGTH:
- {
- struct type* type_arg;
- if (exp->elts[*pos].opcode == OP_TYPE)
- {
- evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
- arg1 = NULL;
- type_arg = exp->elts[pc + 5].type;
- }
- else
- {
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- type_arg = NULL;
- }
-
- if (exp->elts[*pos].opcode != OP_LONG)
- error ("illegal operand to '%s", ada_attribute_name (atr));
- tem = longest_to_int (exp->elts[*pos+2].longconst);
- *pos += 4;
-
- if (noside == EVAL_SKIP)
- goto nosideret;
-
- if (type_arg == NULL)
- {
- arg1 = ada_coerce_ref (arg1);
-
- if (ada_is_packed_array_type (VALUE_TYPE (arg1)))
- arg1 = ada_coerce_to_simple_array (arg1);
-
- if (tem < 1 || tem > ada_array_arity (VALUE_TYPE (arg1)))
- error ("invalid dimension number to '%s",
- ada_attribute_name (atr));
-
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- {
- type = ada_index_type (VALUE_TYPE (arg1), tem);
- if (type == NULL)
- error ("attempt to take bound of something that is not an array");
- return allocate_value (type);
- }
-
- switch (atr)
- {
- default:
- error ("unexpected attribute encountered");
- case ATR_FIRST:
- return ada_array_bound (arg1, tem, 0);
- case ATR_LAST:
- return ada_array_bound (arg1, tem, 1);
- case ATR_LENGTH:
- return ada_array_length (arg1, tem);
- }
- }
- else if (TYPE_CODE (type_arg) == TYPE_CODE_RANGE
- || TYPE_CODE (type_arg) == TYPE_CODE_INT)
- {
- struct type* range_type;
- char* name = ada_type_name (type_arg);
- if (name == NULL)
- {
- if (TYPE_CODE (type_arg) == TYPE_CODE_RANGE)
- range_type = type_arg;
- else
- error ("unimplemented type attribute");
- }
- else
- range_type =
- to_fixed_range_type (name, NULL, TYPE_OBJFILE (type_arg));
- switch (atr)
- {
- default:
- error ("unexpected attribute encountered");
- case ATR_FIRST:
- return value_from_longest (TYPE_TARGET_TYPE (range_type),
- TYPE_LOW_BOUND (range_type));
- case ATR_LAST:
- return value_from_longest (TYPE_TARGET_TYPE (range_type),
- TYPE_HIGH_BOUND (range_type));
- }
- }
- else if (TYPE_CODE (type_arg) == TYPE_CODE_ENUM)
- {
- switch (atr)
- {
- default:
- error ("unexpected attribute encountered");
- case ATR_FIRST:
- return value_from_longest
- (type_arg, TYPE_FIELD_BITPOS (type_arg, 0));
- case ATR_LAST:
- return value_from_longest
- (type_arg,
- TYPE_FIELD_BITPOS (type_arg,
- TYPE_NFIELDS (type_arg) - 1));
- }
- }
- else if (TYPE_CODE (type_arg) == TYPE_CODE_FLT)
- error ("unimplemented type attribute");
- else
- {
- LONGEST low, high;
-
- if (ada_is_packed_array_type (type_arg))
- type_arg = decode_packed_array_type (type_arg);
-
- if (tem < 1 || tem > ada_array_arity (type_arg))
- error ("invalid dimension number to '%s",
- ada_attribute_name (atr));
-
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- {
- type = ada_index_type (type_arg, tem);
- if (type == NULL)
- error ("attempt to take bound of something that is not an array");
- return allocate_value (type);
- }
-
- switch (atr)
- {
- default:
- error ("unexpected attribute encountered");
- case ATR_FIRST:
- low = ada_array_bound_from_type (type_arg, tem, 0, &type);
- return value_from_longest (type, low);
- case ATR_LAST:
- high = ada_array_bound_from_type (type_arg, tem, 1, &type);
- return value_from_longest (type, high);
- case ATR_LENGTH:
- low = ada_array_bound_from_type (type_arg, tem, 0, &type);
- high = ada_array_bound_from_type (type_arg, tem, 1, NULL);
- return value_from_longest (type, high-low+1);
- }
- }
- }
-
- case ATR_TAG:
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
-
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return
- value_zero (ada_tag_type (arg1), not_lval);
-
- return ada_value_tag (arg1);
-
- case ATR_MIN:
- case ATR_MAX:
- evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- else if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return value_zero (VALUE_TYPE (arg1), not_lval);
- else
- return value_binop (arg1, arg2,
- atr == ATR_MIN ? BINOP_MIN : BINOP_MAX);
-
- case ATR_MODULUS:
- {
- struct type* type_arg = exp->elts[pc + 5].type;
- evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
- *pos += 4;
-
- if (noside == EVAL_SKIP)
- goto nosideret;
-
- if (! ada_is_modular_type (type_arg))
- error ("'modulus must be applied to modular type");
-
- return value_from_longest (TYPE_TARGET_TYPE (type_arg),
- ada_modulus (type_arg));
- }
-
-
- case ATR_POS:
- evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- else if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return value_zero (builtin_type_ada_int, not_lval);
- else
- return value_pos_atr (arg1);
-
- case ATR_SIZE:
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- else if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return value_zero (builtin_type_ada_int, not_lval);
- else
- return value_from_longest (builtin_type_ada_int,
- TARGET_CHAR_BIT
- * TYPE_LENGTH (VALUE_TYPE (arg1)));
-
- case ATR_VAL:
- evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- type = exp->elts[pc + 5].type;
- if (noside == EVAL_SKIP)
- goto nosideret;
- else if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return value_zero (type, not_lval);
- else
- return value_val_atr (type, arg1);
- } */
- case BINOP_EXP:
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (binop_user_defined_p (op, arg1, arg2))
- return unwrap_value (value_x_binop (arg1, arg2, op, OP_NULL,
- EVAL_NORMAL));
- else if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return value_zero (VALUE_TYPE (arg1), not_lval);
- else
- return value_binop (arg1, arg2, op);
-
- case UNOP_PLUS:
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (unop_user_defined_p (op, arg1))
- return unwrap_value (value_x_unop (arg1, op, EVAL_NORMAL));
- else
- return arg1;
-
- case UNOP_ABS:
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (value_less (arg1, value_zero (VALUE_TYPE (arg1), not_lval)))
- return value_neg (arg1);
- else
- return arg1;
-
- case UNOP_IND:
- if (expect_type && TYPE_CODE (expect_type) == TYPE_CODE_PTR)
- expect_type = TYPE_TARGET_TYPE (check_typedef (expect_type));
- arg1 = evaluate_subexp (expect_type, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- type = check_typedef (VALUE_TYPE (arg1));
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- {
- if (ada_is_array_descriptor (type))
- /* GDB allows dereferencing GNAT array descriptors. */
- {
- struct type *arrType = ada_type_of_array (arg1, 0);
- if (arrType == NULL)
- error ("Attempt to dereference null array pointer.");
- return value_at_lazy (arrType, 0, NULL);
- }
- else if (TYPE_CODE (type) == TYPE_CODE_PTR
- || TYPE_CODE (type) == TYPE_CODE_REF
- /* In C you can dereference an array to get the 1st elt. */
- || TYPE_CODE (type) == TYPE_CODE_ARRAY)
- return
- value_zero
- (to_static_fixed_type
- (ada_aligned_type (check_typedef (TYPE_TARGET_TYPE (type)))),
- lval_memory);
- else if (TYPE_CODE (type) == TYPE_CODE_INT)
- /* GDB allows dereferencing an int. */
- return value_zero (builtin_type_int, lval_memory);
- else
- error ("Attempt to take contents of a non-pointer value.");
- }
- arg1 = ada_coerce_ref (arg1);
- type = check_typedef (VALUE_TYPE (arg1));
-
- if (ada_is_array_descriptor (type))
- /* GDB allows dereferencing GNAT array descriptors. */
- return ada_coerce_to_simple_array (arg1);
- else
- return ada_value_ind (arg1);
-
- case STRUCTOP_STRUCT:
- tem = longest_to_int (exp->elts[pc + 1].longconst);
- (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return value_zero (ada_aligned_type
- (ada_lookup_struct_elt_type (VALUE_TYPE (arg1),
- &exp->elts[pc +
- 2].string,
- 0, NULL)),
- lval_memory);
- else
- return unwrap_value (ada_value_struct_elt (arg1,
- &exp->elts[pc + 2].string,
- "record"));
- case OP_TYPE:
- /* The value is not supposed to be used. This is here to make it
- easier to accommodate expressions that contain types. */
- (*pos) += 2;
- if (noside == EVAL_SKIP)
- goto nosideret;
- else if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return allocate_value (builtin_type_void);
- else
- error ("Attempt to use a type name as an expression");
-
- case STRUCTOP_PTR:
- tem = longest_to_int (exp->elts[pc + 1].longconst);
- (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
- arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (noside == EVAL_SKIP)
- goto nosideret;
- if (noside == EVAL_AVOID_SIDE_EFFECTS)
- return value_zero (ada_aligned_type
- (ada_lookup_struct_elt_type (VALUE_TYPE (arg1),
- &exp->elts[pc +
- 2].string,
- 0, NULL)),
- lval_memory);
- else
- return unwrap_value (ada_value_struct_elt (arg1,
- &exp->elts[pc + 2].string,
- "record access"));
- }
-
-nosideret:
- return value_from_longest (builtin_type_long, (LONGEST) 1);
-}
-
-
- /* Fixed point */
-
-/* If TYPE encodes an Ada fixed-point type, return the suffix of the
- type name that encodes the 'small and 'delta information.
- Otherwise, return NULL. */
-
-static const char *
-fixed_type_info (struct type *type)
-{
- const char *name = ada_type_name (type);
- enum type_code code = (type == NULL) ? TYPE_CODE_UNDEF : TYPE_CODE (type);
-
- if ((code == TYPE_CODE_INT || code == TYPE_CODE_RANGE) && name != NULL)
- {
- const char *tail = strstr (name, "___XF_");
- if (tail == NULL)
- return NULL;
- else
- return tail + 5;
- }
- else if (code == TYPE_CODE_RANGE && TYPE_TARGET_TYPE (type) != type)
- return fixed_type_info (TYPE_TARGET_TYPE (type));
- else
- return NULL;
-}
-
-/* Returns non-zero iff TYPE represents an Ada fixed-point type. */
-
-int
-ada_is_fixed_point_type (struct type *type)
-{
- return fixed_type_info (type) != NULL;
-}
-
-/* Assuming that TYPE is the representation of an Ada fixed-point
- type, return its delta, or -1 if the type is malformed and the
- delta cannot be determined. */
-
-DOUBLEST
-ada_delta (struct type *type)
-{
- const char *encoding = fixed_type_info (type);
- long num, den;
-
- if (sscanf (encoding, "_%ld_%ld", &num, &den) < 2)
- return -1.0;
- else
- return (DOUBLEST) num / (DOUBLEST) den;
-}
-
-/* Assuming that ada_is_fixed_point_type (TYPE), return the scaling
- factor ('SMALL value) associated with the type. */
-
-static DOUBLEST
-scaling_factor (struct type *type)
-{
- const char *encoding = fixed_type_info (type);
- unsigned long num0, den0, num1, den1;
- int n;
-
- n = sscanf (encoding, "_%lu_%lu_%lu_%lu", &num0, &den0, &num1, &den1);
-
- if (n < 2)
- return 1.0;
- else if (n == 4)
- return (DOUBLEST) num1 / (DOUBLEST) den1;
- else
- return (DOUBLEST) num0 / (DOUBLEST) den0;
-}
-
-
-/* Assuming that X is the representation of a value of fixed-point
- type TYPE, return its floating-point equivalent. */
-
-DOUBLEST
-ada_fixed_to_float (struct type *type, LONGEST x)
-{
- return (DOUBLEST) x *scaling_factor (type);
-}
-
-/* The representation of a fixed-point value of type TYPE
- corresponding to the value X. */
-
-LONGEST
-ada_float_to_fixed (struct type *type, DOUBLEST x)
-{
- return (LONGEST) (x / scaling_factor (type) + 0.5);
-}
-
-
- /* VAX floating formats */
-
-/* Non-zero iff TYPE represents one of the special VAX floating-point
- types. */
-int
-ada_is_vax_floating_type (struct type *type)
-{
- int name_len =
- (ada_type_name (type) == NULL) ? 0 : strlen (ada_type_name (type));
- return
- name_len > 6
- && (TYPE_CODE (type) == TYPE_CODE_INT
- || TYPE_CODE (type) == TYPE_CODE_RANGE)
- && STREQN (ada_type_name (type) + name_len - 6, "___XF", 5);
-}
-
-/* The type of special VAX floating-point type this is, assuming
- ada_is_vax_floating_point */
-int
-ada_vax_float_type_suffix (struct type *type)
-{
- return ada_type_name (type)[strlen (ada_type_name (type)) - 1];
-}
-
-/* A value representing the special debugging function that outputs
- VAX floating-point values of the type represented by TYPE. Assumes
- ada_is_vax_floating_type (TYPE). */
-struct value *
-ada_vax_float_print_function (struct type *type)
-{
- switch (ada_vax_float_type_suffix (type))
- {
- case 'F':
- return get_var_value ("DEBUG_STRING_F", 0);
- case 'D':
- return get_var_value ("DEBUG_STRING_D", 0);
- case 'G':
- return get_var_value ("DEBUG_STRING_G", 0);
- default:
- error ("invalid VAX floating-point type");
- }
-}
-
-
- /* Range types */
-
-/* Scan STR beginning at position K for a discriminant name, and
- return the value of that discriminant field of DVAL in *PX. If
- PNEW_K is not null, put the position of the character beyond the
- name scanned in *PNEW_K. Return 1 if successful; return 0 and do
- not alter *PX and *PNEW_K if unsuccessful. */
-
-static int
-scan_discrim_bound (char *, int k, struct value *dval, LONGEST * px,
- int *pnew_k)
-{
- static char *bound_buffer = NULL;
- static size_t bound_buffer_len = 0;
- char *bound;
- char *pend;
- struct value *bound_val;
-
- if (dval == NULL || str == NULL || str[k] == '\0')
- return 0;
-
- pend = strstr (str + k, "__");
- if (pend == NULL)
- {
- bound = str + k;
- k += strlen (bound);
- }
- else
- {
- GROW_VECT (bound_buffer, bound_buffer_len, pend - (str + k) + 1);
- bound = bound_buffer;
- strncpy (bound_buffer, str + k, pend - (str + k));
- bound[pend - (str + k)] = '\0';
- k = pend - str;
- }
-
- bound_val = ada_search_struct_field (bound, dval, 0, VALUE_TYPE (dval));
- if (bound_val == NULL)
- return 0;
-
- *px = value_as_long (bound_val);
- if (pnew_k != NULL)
- *pnew_k = k;
- return 1;
-}
-
-/* Value of variable named NAME in the current environment. If
- no such variable found, then if ERR_MSG is null, returns 0, and
- otherwise causes an error with message ERR_MSG. */
-static struct value *
-get_var_value (char *name, char *err_msg)
-{
- struct symbol **syms;
- struct block **blocks;
- int nsyms;
-
- nsyms =
- ada_lookup_symbol_list (name, get_selected_block (NULL), VAR_NAMESPACE,
- &syms, &blocks);
-
- if (nsyms != 1)
- {
- if (err_msg == NULL)
- return 0;
- else
- error ("%s", err_msg);
- }
-
- return value_of_variable (syms[0], blocks[0]);
-}
-
-/* Value of integer variable named NAME in the current environment. If
- no such variable found, then if ERR_MSG is null, returns 0, and sets
- *FLAG to 0. If successful, sets *FLAG to 1. */
-LONGEST
-get_int_var_value (char *name, char *err_msg, int *flag)
-{
- struct value *var_val = get_var_value (name, err_msg);
-
- if (var_val == 0)
- {
- if (flag != NULL)
- *flag = 0;
- return 0;
- }
- else
- {
- if (flag != NULL)
- *flag = 1;
- return value_as_long (var_val);
- }
-}
-
-
-/* Return a range type whose base type is that of the range type named
- NAME in the current environment, and whose bounds are calculated
- from NAME according to the GNAT range encoding conventions.
- Extract discriminant values, if needed, from DVAL. If a new type
- must be created, allocate in OBJFILE's space. The bounds
- information, in general, is encoded in NAME, the base type given in
- the named range type. */
-
-static struct type *
-to_fixed_range_type (char *name, struct value *dval, struct objfile *objfile)
-{
- struct type *raw_type = ada_find_any_type (name);
- struct type *base_type;
- LONGEST low, high;
- char *subtype_info;
-
- if (raw_type == NULL)
- base_type = builtin_type_int;
- else if (TYPE_CODE (raw_type) == TYPE_CODE_RANGE)
- base_type = TYPE_TARGET_TYPE (raw_type);
- else
- base_type = raw_type;
-
- subtype_info = strstr (name, "___XD");
- if (subtype_info == NULL)
- return raw_type;
- else
- {
- static char *name_buf = NULL;
- static size_t name_len = 0;
- int prefix_len = subtype_info - name;
- LONGEST L, U;
- struct type *type;
- char *bounds_str;
- int n;
-
- GROW_VECT (name_buf, name_len, prefix_len + 5);
- strncpy (name_buf, name, prefix_len);
- name_buf[prefix_len] = '\0';
-
- subtype_info += 5;
- bounds_str = strchr (subtype_info, '_');
- n = 1;
-
- if (*subtype_info == 'L')
- {
- if (!ada_scan_number (bounds_str, n, &L, &n)
- && !scan_discrim_bound (bounds_str, n, dval, &L, &n))
- return raw_type;
- if (bounds_str[n] == '_')
- n += 2;
- else if (bounds_str[n] == '.') /* FIXME? SGI Workshop kludge. */
- n += 1;
- subtype_info += 1;
- }
- else
- {
- strcpy (name_buf + prefix_len, "___L");
- L = get_int_var_value (name_buf, "Index bound unknown.", NULL);
- }
-
- if (*subtype_info == 'U')
- {
- if (!ada_scan_number (bounds_str, n, &U, &n)
- && !scan_discrim_bound (bounds_str, n, dval, &U, &n))
- return raw_type;
- }
- else
- {
- strcpy (name_buf + prefix_len, "___U");
- U = get_int_var_value (name_buf, "Index bound unknown.", NULL);
- }
-
- if (objfile == NULL)
- objfile = TYPE_OBJFILE (base_type);
- type = create_range_type (alloc_type (objfile), base_type, L, U);
- TYPE_NAME (type) = name;
- return type;
- }
-}
-
-/* True iff NAME is the name of a range type. */
-int
-ada_is_range_type_name (const char *name)
-{
- return (name != NULL && strstr (name, "___XD"));
-}
-
-
- /* Modular types */
-
-/* True iff TYPE is an Ada modular type. */
-int
-ada_is_modular_type (struct type *type)
-{
- /* FIXME: base_type should be declared in gdbtypes.h, implemented in
- valarith.c */
- struct type *subranged_type; /* = base_type (type); */
-
- return (subranged_type != NULL && TYPE_CODE (type) == TYPE_CODE_RANGE
- && TYPE_CODE (subranged_type) != TYPE_CODE_ENUM
- && TYPE_UNSIGNED (subranged_type));
-}
-
-/* Assuming ada_is_modular_type (TYPE), the modulus of TYPE. */
-LONGEST
-ada_modulus (struct type * type)
-{
- return TYPE_HIGH_BOUND (type) + 1;
-}
-
-
-
- /* Operators */
-
-/* Table mapping opcodes into strings for printing operators
- and precedences of the operators. */
-
-static const struct op_print ada_op_print_tab[] = {
- {":=", BINOP_ASSIGN, PREC_ASSIGN, 1},
- {"or else", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
- {"and then", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
- {"or", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
- {"xor", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
- {"and", 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},
- {"+", BINOP_ADD, PREC_ADD, 0},
- {"-", BINOP_SUB, PREC_ADD, 0},
- {"&", BINOP_CONCAT, PREC_ADD, 0},
- {"*", BINOP_MUL, PREC_MUL, 0},
- {"/", BINOP_DIV, PREC_MUL, 0},
- {"rem", BINOP_REM, PREC_MUL, 0},
- {"mod", BINOP_MOD, PREC_MUL, 0},
- {"**", BINOP_EXP, PREC_REPEAT, 0},
- {"@", BINOP_REPEAT, PREC_REPEAT, 0},
- {"-", UNOP_NEG, PREC_PREFIX, 0},
- {"+", UNOP_PLUS, PREC_PREFIX, 0},
- {"not ", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
- {"not ", UNOP_COMPLEMENT, PREC_PREFIX, 0},
- {"abs ", UNOP_ABS, PREC_PREFIX, 0},
- {".all", UNOP_IND, PREC_SUFFIX, 1}, /* FIXME: postfix .ALL */
- {"'access", UNOP_ADDR, PREC_SUFFIX, 1}, /* FIXME: postfix 'ACCESS */
- {NULL, 0, 0, 0}
-};
-
- /* Assorted Types and Interfaces */
-
-struct type *builtin_type_ada_int;
-struct type *builtin_type_ada_short;
-struct type *builtin_type_ada_long;
-struct type *builtin_type_ada_long_long;
-struct type *builtin_type_ada_char;
-struct type *builtin_type_ada_float;
-struct type *builtin_type_ada_double;
-struct type *builtin_type_ada_long_double;
-struct type *builtin_type_ada_natural;
-struct type *builtin_type_ada_positive;
-struct type *builtin_type_ada_system_address;
-
-struct type **const (ada_builtin_types[]) =
-{
-
- &builtin_type_ada_int,
- &builtin_type_ada_long,
- &builtin_type_ada_short,
- &builtin_type_ada_char,
- &builtin_type_ada_float,
- &builtin_type_ada_double,
- &builtin_type_ada_long_long,
- &builtin_type_ada_long_double,
- &builtin_type_ada_natural, &builtin_type_ada_positive,
- /* The following types are carried over from C for convenience. */
-&builtin_type_int,
- &builtin_type_long,
- &builtin_type_short,
- &builtin_type_char,
- &builtin_type_float,
- &builtin_type_double,
- &builtin_type_long_long,
- &builtin_type_void,
- &builtin_type_signed_char,
- &builtin_type_unsigned_char,
- &builtin_type_unsigned_short,
- &builtin_type_unsigned_int,
- &builtin_type_unsigned_long,
- &builtin_type_unsigned_long_long,
- &builtin_type_long_double,
- &builtin_type_complex, &builtin_type_double_complex, 0};
-
-/* Not really used, but needed in the ada_language_defn. */
-static void
-emit_char (int c, struct ui_file *stream, int quoter)
-{
- ada_emit_char (c, stream, quoter, 1);
-}
-
-const struct language_defn ada_language_defn = {
- "ada", /* Language name */
- /* language_ada, */
- language_unknown,
- /* FIXME: language_ada should be defined in defs.h */
- ada_builtin_types,
- range_check_off,
- type_check_off,
- case_sensitive_on, /* Yes, Ada is case-insensitive, but
- * that's not quite what this means. */
- ada_parse,
- ada_error,
- ada_evaluate_subexp,
- ada_printchar, /* Print a character constant */
- ada_printstr, /* Function to print string constant */
- emit_char, /* Function to print single char (not used) */
- ada_create_fundamental_type, /* Create fundamental type in this language */
- ada_print_type, /* Print a type using appropriate syntax */
- ada_val_print, /* Print a value using appropriate syntax */
- ada_value_print, /* Print a top-level value */
- {"", "", "", ""}, /* Binary format info */
-#if 0
- {"8#%lo#", "8#", "o", "#"}, /* Octal format info */
- {"%ld", "", "d", ""}, /* Decimal format info */
- {"16#%lx#", "16#", "x", "#"}, /* Hex format info */
-#else
- /* Copied from c-lang.c. */
- {"0%lo", "0", "o", ""}, /* Octal format info */
- {"%ld", "", "d", ""}, /* Decimal format info */
- {"0x%lx", "0x", "x", ""}, /* Hex format info */
-#endif
- ada_op_print_tab, /* expression operators for printing */
- 1, /* c-style arrays (FIXME?) */
- 0, /* String lower bound (FIXME?) */
- &builtin_type_ada_char,
- LANG_MAGIC
-};
-
-void
-_initialize_ada_language ()
-{
- builtin_type_ada_int =
- init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
- 0, "integer", (struct objfile *) NULL);
- builtin_type_ada_long =
- init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT,
- 0, "long_integer", (struct objfile *) NULL);
- builtin_type_ada_short =
- init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
- 0, "short_integer", (struct objfile *) NULL);
- builtin_type_ada_char =
- init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
- 0, "character", (struct objfile *) NULL);
- builtin_type_ada_float =
- init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
- 0, "float", (struct objfile *) NULL);
- builtin_type_ada_double =
- init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
- 0, "long_float", (struct objfile *) NULL);
- builtin_type_ada_long_long =
- init_type (TYPE_CODE_INT, TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
- 0, "long_long_integer", (struct objfile *) NULL);
- builtin_type_ada_long_double =
- init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
- 0, "long_long_float", (struct objfile *) NULL);
- builtin_type_ada_natural =
- init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
- 0, "natural", (struct objfile *) NULL);
- builtin_type_ada_positive =
- init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
- 0, "positive", (struct objfile *) NULL);
-
-
- builtin_type_ada_system_address =
- lookup_pointer_type (init_type (TYPE_CODE_VOID, 1, 0, "void",
- (struct objfile *) NULL));
- TYPE_NAME (builtin_type_ada_system_address) = "system__address";
-
- add_language (&ada_language_defn);
-
- add_show_from_set
- (add_set_cmd ("varsize-limit", class_support, var_uinteger,
- (char *) &varsize_limit,
- "Set maximum bytes in dynamic-sized object.",
- &setlist), &showlist);
- varsize_limit = 65536;
-
- add_com ("begin", class_breakpoint, begin_command,
- "Start the debugged program, stopping at the beginning of the\n\
-main program. You may specify command-line arguments to give it, as for\n\
-the \"run\" command (q.v.).");
-}
-
-
-/* Create a fundamental Ada type using default reasonable for the current
- target machine.
-
- Some object/debugging file formats (DWARF version 1, COFF, etc) do not
- define fundamental types such as "int" or "double". Others (stabs or
- DWARF version 2, etc) do define fundamental types. For the formats which
- don't provide fundamental types, gdb can create such types using this
- function.
-
- FIXME: Some compilers distinguish explicitly signed integral types
- (signed short, signed int, signed long) from "regular" integral types
- (short, int, long) in the debugging information. There is some dis-
- agreement as to how useful this feature is. In particular, gcc does
- not support this. Also, only some debugging formats allow the
- distinction to be passed on to a debugger. For now, we always just
- use "short", "int", or "long" as the type name, for both the implicit
- and explicitly signed types. This also makes life easier for the
- gdb test suite since we don't have to account for the differences
- in output depending upon what the compiler and debugging format
- support. We will probably have to re-examine the issue when gdb
- starts taking it's fundamental type information directly from the
- debugging information supplied by the compiler. fnf@cygnus.com */
-
-static struct type *
-ada_create_fundamental_type (struct objfile *objfile, int typeid)
-{
- struct type *type = NULL;
-
- switch (typeid)
- {
- default:
- /* FIXME: For now, if we are asked to produce a type not in this
- language, create the equivalent of a C integer type with the
- name "<?type?>". When all the dust settles from the type
- reconstruction work, this should probably become an error. */
- type = init_type (TYPE_CODE_INT,
- TARGET_INT_BIT / TARGET_CHAR_BIT,
- 0, "<?type?>", objfile);
- warning ("internal error: no Ada fundamental type %d", typeid);
- break;
- case FT_VOID:
- type = init_type (TYPE_CODE_VOID,
- TARGET_CHAR_BIT / TARGET_CHAR_BIT,
- 0, "void", objfile);
- break;
- case FT_CHAR:
- type = init_type (TYPE_CODE_INT,
- TARGET_CHAR_BIT / TARGET_CHAR_BIT,
- 0, "character", objfile);
- break;
- case FT_SIGNED_CHAR:
- type = init_type (TYPE_CODE_INT,
- TARGET_CHAR_BIT / TARGET_CHAR_BIT,
- 0, "signed char", objfile);
- break;
- case FT_UNSIGNED_CHAR:
- type = init_type (TYPE_CODE_INT,
- TARGET_CHAR_BIT / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED, "unsigned char", objfile);
- break;
- case FT_SHORT:
- type = init_type (TYPE_CODE_INT,
- TARGET_SHORT_BIT / TARGET_CHAR_BIT,
- 0, "short_integer", objfile);
- break;
- case FT_SIGNED_SHORT:
- type = init_type (TYPE_CODE_INT,
- TARGET_SHORT_BIT / TARGET_CHAR_BIT,
- 0, "short_integer", objfile);
- break;
- case FT_UNSIGNED_SHORT:
- type = init_type (TYPE_CODE_INT,
- TARGET_SHORT_BIT / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED, "unsigned short", objfile);
- break;
- case FT_INTEGER:
- type = init_type (TYPE_CODE_INT,
- TARGET_INT_BIT / TARGET_CHAR_BIT,
- 0, "integer", objfile);
- break;
- case FT_SIGNED_INTEGER:
- type = init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT, 0, "integer", objfile); /* FIXME -fnf */
- break;
- case FT_UNSIGNED_INTEGER:
- type = init_type (TYPE_CODE_INT,
- TARGET_INT_BIT / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED, "unsigned int", objfile);
- break;
- case FT_LONG:
- type = init_type (TYPE_CODE_INT,
- TARGET_LONG_BIT / TARGET_CHAR_BIT,
- 0, "long_integer", objfile);
- break;
- case FT_SIGNED_LONG:
- type = init_type (TYPE_CODE_INT,
- TARGET_LONG_BIT / TARGET_CHAR_BIT,
- 0, "long_integer", objfile);
- break;
- case FT_UNSIGNED_LONG:
- type = init_type (TYPE_CODE_INT,
- TARGET_LONG_BIT / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED, "unsigned long", objfile);
- break;
- case FT_LONG_LONG:
- type = init_type (TYPE_CODE_INT,
- TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
- 0, "long_long_integer", objfile);
- break;
- case FT_SIGNED_LONG_LONG:
- type = init_type (TYPE_CODE_INT,
- TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
- 0, "long_long_integer", objfile);
- break;
- case FT_UNSIGNED_LONG_LONG:
- type = init_type (TYPE_CODE_INT,
- TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
- TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);
- break;
- case FT_FLOAT:
- type = init_type (TYPE_CODE_FLT,
- TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
- 0, "float", objfile);
- break;
- case FT_DBL_PREC_FLOAT:
- type = init_type (TYPE_CODE_FLT,
- TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
- 0, "long_float", objfile);
- break;
- case FT_EXT_PREC_FLOAT:
- type = init_type (TYPE_CODE_FLT,
- TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
- 0, "long_long_float", objfile);
- break;
- }
- return (type);
-}
-
-void
-ada_dump_symtab (struct symtab *s)
-{
- int i;
- fprintf (stderr, "New symtab: [\n");
- fprintf (stderr, " Name: %s/%s;\n",
- s->dirname ? s->dirname : "?", s->filename ? s->filename : "?");
- fprintf (stderr, " Format: %s;\n", s->debugformat);
- if (s->linetable != NULL)
- {
- fprintf (stderr, " Line table (section %d):\n", s->block_line_section);
- for (i = 0; i < s->linetable->nitems; i += 1)
- {
- struct linetable_entry *e = s->linetable->item + i;
- fprintf (stderr, " %4ld: %8lx\n", (long) e->line, (long) e->pc);
- }
- }
- fprintf (stderr, "]\n");
-}