Compare commits

...

1 Commits

Author SHA1 Message Date
nobody
522fed51af This commit was manufactured by cvs2svn to create branch 'dje-cgen-
play1-branch'.

Sprout from master 2009-06-28 00:00:08 UTC Alan Modra <amodra@gmail.com> 'daily update'
Cherrypick from cygnus 2000-02-22 15:59:20 UTC Ian Lance Taylor <ian@airs.com> 'import libiberty from egcs':
    README
    bfd/PORTING
    bfd/TODO
    bfd/doc/doc.str
    bfd/doc/makefile.vms
    bfd/stamp-h.in
    binutils/stamp-h.in
    binutils/testsuite/binutils-all/bintest.s
    binutils/testsuite/binutils-all/hppa/addendbug.s
    config/mt-d30v
    config/mt-netware
    config/mt-ospace
    etc/add-log.el
    etc/add-log.vi
    etc/configbuild.ein
    etc/configbuild.fig
    etc/configbuild.jin
    etc/configbuild.tin
    etc/configdev.ein
    etc/configdev.fig
    etc/configdev.jin
    etc/configdev.tin
    gas/doc/c-d30v.texi
    gas/stamp-h.in
    gas/testsuite/gas/all/align.d
    gas/testsuite/gas/all/align.s
    gas/testsuite/gas/all/comment.s
    gas/testsuite/gas/all/diff1.s
    gas/testsuite/gas/all/float.s
    gas/testsuite/gas/all/itbl
    gas/testsuite/gas/all/itbl.s
    gas/testsuite/gas/all/p1480.s
    gas/testsuite/gas/all/struct.d
    gas/testsuite/gas/all/struct.s
    gas/testsuite/gas/all/x930509.s
    gas/testsuite/gas/arc/alias.d
    gas/testsuite/gas/arc/alias.s
    gas/testsuite/gas/arc/branch.d
    gas/testsuite/gas/arc/branch.s
    gas/testsuite/gas/arc/flag.s
    gas/testsuite/gas/arc/insn3.d
    gas/testsuite/gas/arc/insn3.s
    gas/testsuite/gas/arc/math.d
    gas/testsuite/gas/arc/math.s
    gas/testsuite/gas/arc/sshift.d
    gas/testsuite/gas/arc/sshift.s
    gas/testsuite/gas/arm/le-fpconst.s
    gas/testsuite/gas/d30v/align.d
    gas/testsuite/gas/d30v/align.s
    gas/testsuite/gas/d30v/array.d
    gas/testsuite/gas/d30v/array.s
    gas/testsuite/gas/d30v/bittest.d
    gas/testsuite/gas/d30v/bittest.s
    gas/testsuite/gas/d30v/guard-debug.s
    gas/testsuite/gas/d30v/guard.d
    gas/testsuite/gas/d30v/guard.s
    gas/testsuite/gas/d30v/inst.s
    gas/testsuite/gas/d30v/label-debug.d
    gas/testsuite/gas/d30v/label-debug.s
    gas/testsuite/gas/d30v/label.d
    gas/testsuite/gas/d30v/label.s
    gas/testsuite/gas/d30v/mul.d
    gas/testsuite/gas/d30v/mul.s
    gas/testsuite/gas/d30v/opt.d
    gas/testsuite/gas/d30v/opt.s
    gas/testsuite/gas/d30v/reloc.d
    gas/testsuite/gas/d30v/reloc.s
    gas/testsuite/gas/d30v/serial.s
    gas/testsuite/gas/d30v/serial2.s
    gas/testsuite/gas/d30v/serial2O.s
    gas/testsuite/gas/d30v/warn_oddreg.l
    gas/testsuite/gas/d30v/warn_oddreg.s
    gas/testsuite/gas/fr30/allinsn.d
    gas/testsuite/gas/fr30/allinsn.exp
    gas/testsuite/gas/fr30/allinsn.s
    gas/testsuite/gas/fr30/fr30.exp
    gas/testsuite/gas/h8300/addsub.s
    gas/testsuite/gas/h8300/addsubh.s
    gas/testsuite/gas/h8300/addsubs.s
    gas/testsuite/gas/h8300/bitops1.s
    gas/testsuite/gas/h8300/bitops1h.s
    gas/testsuite/gas/h8300/bitops1s.s
    gas/testsuite/gas/h8300/bitops2.s
    gas/testsuite/gas/h8300/bitops2h.s
    gas/testsuite/gas/h8300/bitops2s.s
    gas/testsuite/gas/h8300/bitops3.s
    gas/testsuite/gas/h8300/bitops3h.s
    gas/testsuite/gas/h8300/bitops3s.s
    gas/testsuite/gas/h8300/bitops4.s
    gas/testsuite/gas/h8300/bitops4h.s
    gas/testsuite/gas/h8300/bitops4s.s
    gas/testsuite/gas/h8300/cbranch.s
    gas/testsuite/gas/h8300/cbranchh.s
    gas/testsuite/gas/h8300/cbranchs.s
    gas/testsuite/gas/h8300/compare.s
    gas/testsuite/gas/h8300/compareh.s
    gas/testsuite/gas/h8300/compares.s
    gas/testsuite/gas/h8300/decimal.s
    gas/testsuite/gas/h8300/decimalh.s
    gas/testsuite/gas/h8300/decimals.s
    gas/testsuite/gas/h8300/divmul.s
    gas/testsuite/gas/h8300/divmulh.s
    gas/testsuite/gas/h8300/divmuls.s
    gas/testsuite/gas/h8300/extendh.s
    gas/testsuite/gas/h8300/extends.s
    gas/testsuite/gas/h8300/incdec.s
    gas/testsuite/gas/h8300/incdech.s
    gas/testsuite/gas/h8300/incdecs.s
    gas/testsuite/gas/h8300/logical.s
    gas/testsuite/gas/h8300/logicalh.s
    gas/testsuite/gas/h8300/logicals.s
    gas/testsuite/gas/h8300/misc.s
    gas/testsuite/gas/h8300/misch.s
    gas/testsuite/gas/h8300/miscs.s
    gas/testsuite/gas/h8300/mov32bug.s
    gas/testsuite/gas/h8300/movb.s
    gas/testsuite/gas/h8300/movbh.s
    gas/testsuite/gas/h8300/movbs.s
    gas/testsuite/gas/h8300/movlh.s
    gas/testsuite/gas/h8300/movls.s
    gas/testsuite/gas/h8300/movw.s
    gas/testsuite/gas/h8300/movwh.s
    gas/testsuite/gas/h8300/movws.s
    gas/testsuite/gas/h8300/pushpop.s
    gas/testsuite/gas/h8300/pushpoph.s
    gas/testsuite/gas/h8300/pushpops.s
    gas/testsuite/gas/h8300/rotsh.s
    gas/testsuite/gas/h8300/rotshh.s
    gas/testsuite/gas/h8300/rotshs.s
    gas/testsuite/gas/hppa/README
    gas/testsuite/gas/hppa/basic/weird.s
    gas/testsuite/gas/hppa/parse/appbug.s
    gas/testsuite/gas/hppa/parse/nosubspace.s
    gas/testsuite/gas/hppa/parse/spacebug.s
    gas/testsuite/gas/hppa/parse/ssbug.s
    gas/testsuite/gas/hppa/reloc/reduce2.s
    gas/testsuite/gas/hppa/unsorted/align3.s
    gas/testsuite/gas/hppa/unsorted/align4.s
    gas/testsuite/gas/hppa/unsorted/globalbug.s
    gas/testsuite/gas/hppa/unsorted/ss_align.s
    gas/testsuite/gas/ieee-fp/x930509a.s
    gas/testsuite/gas/m32r/allinsn.exp
    gas/testsuite/gas/m32r/allinsn.s
    gas/testsuite/gas/m32r/fslot.d
    gas/testsuite/gas/m32r/fslot.s
    gas/testsuite/gas/m32r/high-1.s
    gas/testsuite/gas/m32r/outofrange.s
    gas/testsuite/gas/m32r/relax-1.s
    gas/testsuite/gas/m32r/uppercase.s
    gas/testsuite/gas/m68k-coff/gas.exp
    gas/testsuite/gas/m68k-coff/p2389.s
    gas/testsuite/gas/m68k-coff/p2389a.s
    gas/testsuite/gas/m68k-coff/p2430.s
    gas/testsuite/gas/m68k-coff/p2430a.s
    gas/testsuite/gas/m68k-coff/t1.s
    gas/testsuite/gas/m68k/bitfield.d
    gas/testsuite/gas/m68k/bitfield.s
    gas/testsuite/gas/m68k/cas.d
    gas/testsuite/gas/m68k/cas.s
    gas/testsuite/gas/m68k/disperr.s
    gas/testsuite/gas/m68k/fmoveml.d
    gas/testsuite/gas/m68k/fmoveml.s
    gas/testsuite/gas/m68k/link.d
    gas/testsuite/gas/m68k/link.s
    gas/testsuite/gas/m68k/op68000.d
    gas/testsuite/gas/m68k/operands.d
    gas/testsuite/gas/m68k/operands.s
    gas/testsuite/gas/m68k/p2410.s
    gas/testsuite/gas/m68k/p2663.s
    gas/testsuite/gas/m68k/pic1.s
    gas/testsuite/gas/m68k/t2.d
    gas/testsuite/gas/m68k/t2.s
    gas/testsuite/gas/macros/err.s
    gas/testsuite/gas/macros/semi.d
    gas/testsuite/gas/macros/semi.s
    gas/testsuite/gas/mcore/allinsn.exp
    gas/testsuite/gas/mips/abs.s
    gas/testsuite/gas/mips/add.s
    gas/testsuite/gas/mips/and.s
    gas/testsuite/gas/mips/break20.s
    gas/testsuite/gas/mips/div.s
    gas/testsuite/gas/mips/dli.s
    gas/testsuite/gas/mips/itbl
    gas/testsuite/gas/mips/itbl.s
    gas/testsuite/gas/mips/jal.s
    gas/testsuite/gas/mips/lb-pic.s
    gas/testsuite/gas/mips/lb.s
    gas/testsuite/gas/mips/ld.s
    gas/testsuite/gas/mips/li.s
    gas/testsuite/gas/mips/lineno.s
    gas/testsuite/gas/mips/mips16.s
    gas/testsuite/gas/mips/mul.s
    gas/testsuite/gas/mips/sb.s
    gas/testsuite/gas/mips/trap20.s
    gas/testsuite/gas/mips/trunc.s
    gas/testsuite/gas/mips/uld.s
    gas/testsuite/gas/mips/ulh-pic.s
    gas/testsuite/gas/mips/ulh.s
    gas/testsuite/gas/mips/ulw.s
    gas/testsuite/gas/mips/usd.s
    gas/testsuite/gas/mips/ush.s
    gas/testsuite/gas/mips/usw.s
    gas/testsuite/gas/mn10200/add.s
    gas/testsuite/gas/mn10200/bcc.s
    gas/testsuite/gas/mn10200/bccx.s
    gas/testsuite/gas/mn10200/bit.s
    gas/testsuite/gas/mn10200/cmp.s
    gas/testsuite/gas/mn10200/ext.s
    gas/testsuite/gas/mn10200/logical.s
    gas/testsuite/gas/mn10200/mov1.s
    gas/testsuite/gas/mn10200/mov2.s
    gas/testsuite/gas/mn10200/mov3.s
    gas/testsuite/gas/mn10200/mov4.s
    gas/testsuite/gas/mn10200/movb.s
    gas/testsuite/gas/mn10200/movbu.s
    gas/testsuite/gas/mn10200/movx.s
    gas/testsuite/gas/mn10200/muldiv.s
    gas/testsuite/gas/mn10200/other.s
    gas/testsuite/gas/mn10200/shift.s
    gas/testsuite/gas/mn10200/sub.s
    gas/testsuite/gas/mn10300/add.s
    gas/testsuite/gas/mn10300/bcc.s
    gas/testsuite/gas/mn10300/bit.s
    gas/testsuite/gas/mn10300/cmp.s
    gas/testsuite/gas/mn10300/ext.s
    gas/testsuite/gas/mn10300/extend.s
    gas/testsuite/gas/mn10300/logical.s
    gas/testsuite/gas/mn10300/loop.s
    gas/testsuite/gas/mn10300/mov1.s
    gas/testsuite/gas/mn10300/mov2.s
    gas/testsuite/gas/mn10300/mov3.s
    gas/testsuite/gas/mn10300/mov4.s
    gas/testsuite/gas/mn10300/movbu.s
    gas/testsuite/gas/mn10300/movhu.s
    gas/testsuite/gas/mn10300/movm.s
    gas/testsuite/gas/mn10300/muldiv.s
    gas/testsuite/gas/mn10300/other.s
    gas/testsuite/gas/mn10300/shift.s
    gas/testsuite/gas/mn10300/sub.s
    gas/testsuite/gas/mn10300/udf.s
    gas/testsuite/gas/mri/char.d
    gas/testsuite/gas/mri/char.s
    gas/testsuite/gas/mri/comment.d
    gas/testsuite/gas/mri/comment.s
    gas/testsuite/gas/mri/common.d
    gas/testsuite/gas/mri/common.s
    gas/testsuite/gas/mri/constants.d
    gas/testsuite/gas/mri/constants.s
    gas/testsuite/gas/mri/empty.s
    gas/testsuite/gas/mri/equ.d
    gas/testsuite/gas/mri/equ.s
    gas/testsuite/gas/mri/expr.d
    gas/testsuite/gas/mri/expr.s
    gas/testsuite/gas/mri/float.s
    gas/testsuite/gas/mri/for.s
    gas/testsuite/gas/mri/if.s
    gas/testsuite/gas/mri/immconst.d
    gas/testsuite/gas/mri/label.d
    gas/testsuite/gas/mri/label.s
    gas/testsuite/gas/mri/moveml.s
    gas/testsuite/gas/mri/repeat.s
    gas/testsuite/gas/mri/semi.d
    gas/testsuite/gas/mri/semi.s
    gas/testsuite/gas/mri/while.s
    gas/testsuite/gas/ppc/astest.s
    gas/testsuite/gas/ppc/simpshft.d
    gas/testsuite/gas/sh/fp.s
    gas/testsuite/gas/sparc-solaris/addend.exp
    gas/testsuite/gas/sparc-solaris/addend.s
    gas/testsuite/gas/sparc-solaris/gas.exp
    gas/testsuite/gas/sparc-solaris/sol-cc.s
    gas/testsuite/gas/sparc-solaris/sol-gcc.s
    gas/testsuite/gas/sparc/asi.d
    gas/testsuite/gas/sparc/asi.s
    gas/testsuite/gas/sparc/membar.d
    gas/testsuite/gas/sparc/membar.s
    gas/testsuite/gas/sparc/mism-1.s
    gas/testsuite/gas/sparc/mismatch.exp
    gas/testsuite/gas/sparc/prefetch.s
    gas/testsuite/gas/sparc/reloc64.s
    gas/testsuite/gas/sparc/splet-2.d
    gas/testsuite/gas/sparc/splet-2.s
    gas/testsuite/gas/sparc/splet.d
    gas/testsuite/gas/sparc/splet.s
    gas/testsuite/gas/sparc/synth.d
    gas/testsuite/gas/sparc/synth.s
    gas/testsuite/gas/sun4/addend.d
    gas/testsuite/gas/sun4/addend.exp
    gas/testsuite/gas/sun4/addend.s
    gas/testsuite/gas/template
    gas/testsuite/gas/v850/arith.s
    gas/testsuite/gas/v850/bit.s
    gas/testsuite/gas/v850/branch.s
    gas/testsuite/gas/v850/compare.s
    gas/testsuite/gas/v850/fepsw.s
    gas/testsuite/gas/v850/hilo.s
    gas/testsuite/gas/v850/hilo2.s
    gas/testsuite/gas/v850/jumps.s
    gas/testsuite/gas/v850/logical.s
    gas/testsuite/gas/v850/mem.s
    gas/testsuite/gas/v850/misc.s
    gas/testsuite/gas/v850/move.s
    gas/testsuite/gas/v850/range.s
    gas/testsuite/gas/v850/reloc.s
    gas/testsuite/lib/doboth
    gas/testsuite/lib/doobjcmp
    gas/testsuite/lib/dostriptest
    gas/testsuite/lib/dotest
    gas/testsuite/lib/dounsreloc
    gas/testsuite/lib/dounssym
    gprof/.gdbinit
    gprof/TEST
    gprof/bsd_callg_bl.m
    gprof/flat_bl.m
    gprof/fsf_callg_bl.m
    gprof/stamp-h.in
    include/aout/hppa.h
    include/coff/sym.h
    include/fopen-bin.h
    include/fopen-same.h
    include/opcode/tahoe.h
    ld/TODO
    ld/emulparams/README
    ld/emulparams/alpha.sh
    ld/emulparams/armcoff.sh
    ld/emulparams/delta68.sh
    ld/emulparams/h8300h.sh
    ld/emulparams/h8300s.sh
    ld/emulparams/h8500.sh
    ld/emulparams/h8500b.sh
    ld/emulparams/h8500c.sh
    ld/emulparams/h8500m.sh
    ld/emulparams/h8500s.sh
    ld/emulparams/hp300bsd.sh
    ld/emulparams/hp3hpux.sh
    ld/emulparams/i386beos.sh
    ld/emulparams/i386coff.sh
    ld/emulparams/i386nbsd.sh
    ld/emulparams/m68kaux.sh
    ld/emulparams/mipsbig.sh
    ld/emulparams/mipsbsd.sh
    ld/emulparams/mipslit.sh
    ld/emulparams/mipslnews.sh
    ld/emulparams/news.sh
    ld/emulparams/riscix.sh
    ld/emulparams/sparcnbsd.sh
    ld/emulparams/st2000.sh
    ld/emulparams/tic30aout.sh
    ld/emulparams/tic30coff.sh
    ld/emulparams/w65.sh
    ld/emulparams/z8001.sh
    ld/emulparams/z8002.sh
    ld/emultempl/README
    ld/scripttempl/README
    ld/scripttempl/a29k.sc
    ld/scripttempl/alpha.sc
    ld/scripttempl/aout.sc
    ld/scripttempl/delta68.sc
    ld/scripttempl/ebmon29k.sc
    ld/scripttempl/hppaelf.sc
    ld/scripttempl/i386coff.sc
    ld/scripttempl/i386msdos.sc
    ld/scripttempl/i960.sc
    ld/scripttempl/m68kaux.sc
    ld/scripttempl/m68kcoff.sc
    ld/scripttempl/m68klynx.sc
    ld/scripttempl/m88kbcs.sc
    ld/scripttempl/mipsbsd.sc
    ld/scripttempl/ppcpe.sc
    ld/scripttempl/psos.sc
    ld/scripttempl/riscix.sc
    ld/scripttempl/sa29200.sc
    ld/scripttempl/sparccoff.sc
    ld/scripttempl/sparclynx.sc
    ld/scripttempl/st2000.sc
    ld/scripttempl/tic30aout.sc
    ld/scripttempl/tic30coff.sc
    ld/scripttempl/tic80coff.sc
    ld/scripttempl/vanilla.sc
    ld/stamp-h.in
    ld/testsuite/ld-cdtest/cdtest-bar.cc
    ld/testsuite/ld-cdtest/cdtest.dat
    ld/testsuite/ld-checks/script
    ld/testsuite/ld-elfvers/vers1.dsym
    ld/testsuite/ld-elfvers/vers1.sym
    ld/testsuite/ld-elfvers/vers13.asym
    ld/testsuite/ld-elfvers/vers15.dsym
    ld/testsuite/ld-elfvers/vers15.sym
    ld/testsuite/ld-elfvers/vers16.c
    ld/testsuite/ld-elfvers/vers16.dsym
    ld/testsuite/ld-elfvers/vers16.map
    ld/testsuite/ld-elfvers/vers16a.c
    ld/testsuite/ld-elfvers/vers16a.dsym
    ld/testsuite/ld-elfvers/vers2.dsym
    ld/testsuite/ld-elfvers/vers2.map
    ld/testsuite/ld-elfvers/vers3.dsym
    ld/testsuite/ld-elfvers/vers4.sym
    ld/testsuite/ld-elfvers/vers4a.dsym
    ld/testsuite/ld-elfvers/vers4a.sym
    ld/testsuite/ld-elfvers/vers5.c
    ld/testsuite/ld-elfvers/vers6.dsym
    ld/testsuite/ld-elfvers/vers6.sym
    ld/testsuite/ld-elfvers/vers7.map
    ld/testsuite/ld-elfvers/vers7a.c
    ld/testsuite/ld-elfvers/vers7a.dsym
    ld/testsuite/ld-elfvers/vers7a.sym
    ld/testsuite/ld-elfvers/vers8.c
    ld/testsuite/ld-elfvers/vers9.dsym
    ld/testsuite/ld-elfvers/vers9.sym
    ld/testsuite/ld-scripts/cross1.c
    ld/testsuite/ld-scripts/cross2.c
    ld/testsuite/ld-scripts/cross3.c
    ld/testsuite/ld-scripts/defined.t
    ld/testsuite/ld-scripts/phdrs.s
    ld/testsuite/ld-scripts/script.s
    ld/testsuite/ld-scripts/script.t
    ld/testsuite/ld-scripts/scriptm.t
    ld/testsuite/ld-scripts/sizeof.s
    ld/testsuite/ld-scripts/sizeof.t
    ld/testsuite/ld-scripts/weak.t
    ld/testsuite/ld-selective/1.c
    ld/testsuite/ld-selective/2.c
    ld/testsuite/ld-sh/sh1.s
    ld/testsuite/ld-sh/sh2.c
    ld/testsuite/ld-sh/start.s
    ld/testsuite/ld-shared/shared.dat
    ld/testsuite/ld-shared/sun4.dat
    ld/testsuite/ld-shared/xcoff.dat
    ld/testsuite/ld-srec/sr1.c
    ld/testsuite/ld-srec/sr2.c
    ld/testsuite/ld-undefined/undefined.c
    ld/testsuite/ld-versados/t1-1.ro
    ld/testsuite/ld-versados/t1-2.ro
    ld/testsuite/ld-versados/t1.ld
    ld/testsuite/ld-versados/t1.ook
    ld/testsuite/ld-versados/t2-1.ro
    ld/testsuite/ld-versados/t2-2.ro
    ld/testsuite/ld-versados/t2-3.ro
    ld/testsuite/ld-versados/t2.ld
    ld/testsuite/ld-versados/t2.ook
    libiberty/config/mh-aix
    libiberty/config/mh-cxux7
    libiberty/config/mh-fbsd21
    libiberty/config/mh-windows
    libiberty/msdos.c
    libiberty/vmsbuild.com
    makefile.vms
    opcodes/stamp-h.in
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-2002
    gdb/ChangeLog-2003
    gdb/ChangeLog-2004
    gdb/ChangeLog-2005
    gdb/ChangeLog-2006
    gdb/ChangeLog-2007
    gdb/ChangeLog-2008
    gdb/ChangeLog-3.x
    gdb/MAINTAINERS
    gdb/Makefile.in
    gdb/NEWS
    gdb/PROBLEMS
    gdb/README
    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/addrmap.c
    gdb/addrmap.h
    gdb/aix-thread.c
    gdb/alpha-linux-nat.c
    gdb/alpha-linux-tdep.c
    gdb/alpha-mdebug-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/alphaobsd-tdep.c
    gdb/amd64-dicos-tdep.c
    gdb/amd64-linux-nat.c
    gdb/amd64-linux-tdep.c
    gdb/amd64-linux-tdep.h
    gdb/amd64-nat.c
    gdb/amd64-nat.h
    gdb/amd64-sol2-tdep.c
    gdb/amd64-tdep.c
    gdb/amd64-tdep.h
    gdb/amd64-windows-nat.c
    gdb/amd64-windows-tdep.c
    gdb/amd64bsd-nat.c
    gdb/amd64fbsd-nat.c
    gdb/amd64fbsd-tdep.c
    gdb/amd64nbsd-nat.c
    gdb/amd64nbsd-tdep.c
    gdb/amd64obsd-nat.c
    gdb/amd64obsd-tdep.c
    gdb/annotate.c
    gdb/annotate.h
    gdb/arch-utils.c
    gdb/arch-utils.h
    gdb/arm-linux-nat.c
    gdb/arm-linux-tdep.c
    gdb/arm-linux-tdep.h
    gdb/arm-tdep.c
    gdb/arm-tdep.h
    gdb/arm-wince-tdep.c
    gdb/armbsd-tdep.c
    gdb/armnbsd-nat.c
    gdb/armnbsd-tdep.c
    gdb/armobsd-tdep.c
    gdb/auxv.c
    gdb/auxv.h
    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/bfd-target.c
    gdb/bfd-target.h
    gdb/block.c
    gdb/block.h
    gdb/blockframe.c
    gdb/breakpoint.c
    gdb/breakpoint.h
    gdb/bsd-kvm.c
    gdb/bsd-kvm.h
    gdb/bsd-uthread.c
    gdb/bsd-uthread.h
    gdb/buildsym.c
    gdb/buildsym.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/charset-list.h
    gdb/charset.c
    gdb/charset.h
    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-interp.c
    gdb/cli/cli-logging.c
    gdb/cli/cli-script.c
    gdb/cli/cli-script.h
    gdb/cli/cli-setshow.c
    gdb/cli/cli-setshow.h
    gdb/coff-pe-read.c
    gdb/coff-pe-read.h
    gdb/coffread.c
    gdb/command.h
    gdb/common/gdb_signals.h
    gdb/common/signals.c
    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-osf3.mh
    gdb/config/alpha/fbsd.mh
    gdb/config/alpha/nbsd.mh
    gdb/config/alpha/nm-osf3.h
    gdb/config/arm/linux.mh
    gdb/config/arm/nbsdaout.mh
    gdb/config/arm/nbsdelf.mh
    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/djgpp/langinfo.h
    gdb/config/djgpp/nl_types.h
    gdb/config/i386/cygwin.mh
    gdb/config/i386/darwin.mh
    gdb/config/i386/fbsd.mh
    gdb/config/i386/fbsd64.mh
    gdb/config/i386/go32.mh
    gdb/config/i386/i386gnu.mh
    gdb/config/i386/i386sol2.mh
    gdb/config/i386/linux.mh
    gdb/config/i386/linux64.mh
    gdb/config/i386/mingw.mh
    gdb/config/i386/mingw64.mh
    gdb/config/i386/nbsd64.mh
    gdb/config/i386/nbsdaout.mh
    gdb/config/i386/nbsdelf.mh
    gdb/config/i386/nm-fbsd.h
    gdb/config/i386/nm-i386gnu.h
    gdb/config/i386/nm-i386sol2.h
    gdb/config/i386/nm-linux.h
    gdb/config/i386/nto.mh
    gdb/config/i386/obsd.mh
    gdb/config/i386/obsd64.mh
    gdb/config/i386/obsdaout.mh
    gdb/config/i386/sol2-64.mh
    gdb/config/ia64/linux.mh
    gdb/config/m32r/linux.mh
    gdb/config/m68k/linux.mh
    gdb/config/m68k/nbsdaout.mh
    gdb/config/m68k/nbsdelf.mh
    gdb/config/m68k/obsd.mh
    gdb/config/m88k/obsd.mh
    gdb/config/mips/irix5.mh
    gdb/config/mips/irix6.mh
    gdb/config/mips/linux.mh
    gdb/config/mips/nbsd.mh
    gdb/config/mips/obsd64.mh
    gdb/config/nm-linux.h
    gdb/config/nm-nto.h
    gdb/config/pa/hpux.mh
    gdb/config/pa/linux.mh
    gdb/config/pa/nbsd.mh
    gdb/config/pa/obsd.mh
    gdb/config/powerpc/aix.mh
    gdb/config/powerpc/linux.mh
    gdb/config/powerpc/nbsd.mh
    gdb/config/powerpc/obsd.mh
    gdb/config/powerpc/ppc64-linux.mh
    gdb/config/powerpc/spu-linux.mh
    gdb/config/rs6000/nm-rs6000.h
    gdb/config/s390/s390.mh
    gdb/config/sh/nbsd.mh
    gdb/config/sparc/fbsd.mh
    gdb/config/sparc/linux.mh
    gdb/config/sparc/linux64.mh
    gdb/config/sparc/nbsd64.mh
    gdb/config/sparc/nbsdaout.mh
    gdb/config/sparc/nbsdelf.mh
    gdb/config/sparc/nm-sol2.h
    gdb/config/sparc/sol2.mh
    gdb/config/vax/nbsdaout.mh
    gdb/config/vax/nbsdelf.mh
    gdb/config/vax/obsd.mh
    gdb/config/vax/vax.mh
    gdb/config/xtensa/linux.mh
    gdb/configure
    gdb/configure.ac
    gdb/configure.host
    gdb/configure.tgt
    gdb/copying.awk
    gdb/copying.c
    gdb/copyright.sh
    gdb/core-regset.c
    gdb/corefile.c
    gdb/corelow.c
    gdb/cp-abi.c
    gdb/cp-abi.h
    gdb/cp-name-parser.y
    gdb/cp-namespace.c
    gdb/cp-support.c
    gdb/cp-support.h
    gdb/cp-valprint.c
    gdb/cris-tdep.c
    gdb/darwin-nat-info.c
    gdb/darwin-nat.c
    gdb/darwin-nat.h
    gdb/darwin.defs
    gdb/dbug-rom.c
    gdb/dbxread.c
    gdb/dcache.c
    gdb/dcache.h
    gdb/dec-thread.c
    gdb/defs.h
    gdb/demangle.c
    gdb/dfp.c
    gdb/dfp.h
    gdb/dicos-tdep.c
    gdb/dicos-tdep.h
    gdb/dictionary.c
    gdb/dictionary.h
    gdb/dink32-rom.c
    gdb/disasm.c
    gdb/disasm.h
    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.texinfo
    gdb/doc/configure
    gdb/doc/configure.ac
    gdb/doc/fdl.texi
    gdb/doc/gdb.texinfo
    gdb/doc/gdbint.texinfo
    gdb/doc/gpl.texi
    gdb/doc/lpsrc.sed
    gdb/doc/observer.texi
    gdb/doc/psrc.sed
    gdb/doc/refcard.tex
    gdb/doc/stabs.texinfo
    gdb/doc/stack_frame.eps
    gdb/doc/stack_frame.pdf
    gdb/doc/stack_frame.png
    gdb/doc/stack_frame.svg
    gdb/doc/stack_frame.txt
    gdb/doublest.c
    gdb/doublest.h
    gdb/dsrec.c
    gdb/dummy-frame.c
    gdb/dummy-frame.h
    gdb/dwarf2-frame.c
    gdb/dwarf2-frame.h
    gdb/dwarf2expr.c
    gdb/dwarf2expr.h
    gdb/dwarf2loc.c
    gdb/dwarf2loc.h
    gdb/dwarf2read.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/exceptions.c
    gdb/exceptions.h
    gdb/exec.c
    gdb/exec.h
    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-nat.c
    gdb/fbsd-nat.h
    gdb/features/Makefile
    gdb/features/arm-core.xml
    gdb/features/arm-fpa.xml
    gdb/features/arm-with-iwmmxt.c
    gdb/features/arm-with-iwmmxt.xml
    gdb/features/feature_to_c.sh
    gdb/features/gdb-target.dtd
    gdb/features/gdbserver-regs.xsl
    gdb/features/library-list.dtd
    gdb/features/mips-cp0.xml
    gdb/features/mips-cpu.xml
    gdb/features/mips-fpu.xml
    gdb/features/mips-linux.c
    gdb/features/mips-linux.xml
    gdb/features/mips64-cp0.xml
    gdb/features/mips64-cpu.xml
    gdb/features/mips64-fpu.xml
    gdb/features/mips64-linux.c
    gdb/features/mips64-linux.xml
    gdb/features/number-regs.xsl
    gdb/features/osdata.dtd
    gdb/features/rs6000/power-altivec.xml
    gdb/features/rs6000/power-core.xml
    gdb/features/rs6000/power-fpu-isa205.xml
    gdb/features/rs6000/power-fpu.xml
    gdb/features/rs6000/power-linux.xml
    gdb/features/rs6000/power-oea.xml
    gdb/features/rs6000/power-spe.xml
    gdb/features/rs6000/power-vsx.xml
    gdb/features/rs6000/power64-core.xml
    gdb/features/rs6000/power64-linux.xml
    gdb/features/rs6000/powerpc-32.c
    gdb/features/rs6000/powerpc-32.xml
    gdb/features/rs6000/powerpc-32l.c
    gdb/features/rs6000/powerpc-32l.xml
    gdb/features/rs6000/powerpc-403.c
    gdb/features/rs6000/powerpc-403.xml
    gdb/features/rs6000/powerpc-403gc.c
    gdb/features/rs6000/powerpc-403gc.xml
    gdb/features/rs6000/powerpc-505.c
    gdb/features/rs6000/powerpc-505.xml
    gdb/features/rs6000/powerpc-601.c
    gdb/features/rs6000/powerpc-601.xml
    gdb/features/rs6000/powerpc-602.c
    gdb/features/rs6000/powerpc-602.xml
    gdb/features/rs6000/powerpc-603.c
    gdb/features/rs6000/powerpc-603.xml
    gdb/features/rs6000/powerpc-604.c
    gdb/features/rs6000/powerpc-604.xml
    gdb/features/rs6000/powerpc-64.c
    gdb/features/rs6000/powerpc-64.xml
    gdb/features/rs6000/powerpc-64l.c
    gdb/features/rs6000/powerpc-64l.xml
    gdb/features/rs6000/powerpc-7400.c
    gdb/features/rs6000/powerpc-7400.xml
    gdb/features/rs6000/powerpc-750.c
    gdb/features/rs6000/powerpc-750.xml
    gdb/features/rs6000/powerpc-860.c
    gdb/features/rs6000/powerpc-860.xml
    gdb/features/rs6000/powerpc-altivec32.c
    gdb/features/rs6000/powerpc-altivec32.xml
    gdb/features/rs6000/powerpc-altivec32l.c
    gdb/features/rs6000/powerpc-altivec32l.xml
    gdb/features/rs6000/powerpc-altivec64.c
    gdb/features/rs6000/powerpc-altivec64.xml
    gdb/features/rs6000/powerpc-altivec64l.c
    gdb/features/rs6000/powerpc-altivec64l.xml
    gdb/features/rs6000/powerpc-e500.c
    gdb/features/rs6000/powerpc-e500.xml
    gdb/features/rs6000/powerpc-e500l.c
    gdb/features/rs6000/powerpc-e500l.xml
    gdb/features/rs6000/powerpc-isa205-32l.c
    gdb/features/rs6000/powerpc-isa205-32l.xml
    gdb/features/rs6000/powerpc-isa205-64l.c
    gdb/features/rs6000/powerpc-isa205-64l.xml
    gdb/features/rs6000/powerpc-isa205-altivec32l.c
    gdb/features/rs6000/powerpc-isa205-altivec32l.xml
    gdb/features/rs6000/powerpc-isa205-altivec64l.c
    gdb/features/rs6000/powerpc-isa205-altivec64l.xml
    gdb/features/rs6000/powerpc-isa205-vsx32l.c
    gdb/features/rs6000/powerpc-isa205-vsx32l.xml
    gdb/features/rs6000/powerpc-isa205-vsx64l.c
    gdb/features/rs6000/powerpc-isa205-vsx64l.xml
    gdb/features/rs6000/powerpc-vsx32.c
    gdb/features/rs6000/powerpc-vsx32.xml
    gdb/features/rs6000/powerpc-vsx32l.c
    gdb/features/rs6000/powerpc-vsx32l.xml
    gdb/features/rs6000/powerpc-vsx64.c
    gdb/features/rs6000/powerpc-vsx64.xml
    gdb/features/rs6000/powerpc-vsx64l.c
    gdb/features/rs6000/powerpc-vsx64l.xml
    gdb/features/rs6000/rs6000.c
    gdb/features/rs6000/rs6000.xml
    gdb/features/sort-regs.xsl
    gdb/features/xinclude.dtd
    gdb/features/xscale-iwmmxt.xml
    gdb/findcmd.c
    gdb/findvar.c
    gdb/fork-child.c
    gdb/frame-base.c
    gdb/frame-base.h
    gdb/frame-unwind.c
    gdb/frame-unwind.h
    gdb/frame.c
    gdb/frame.h
    gdb/frv-linux-tdep.c
    gdb/frv-tdep.c
    gdb/frv-tdep.h
    gdb/gcore.c
    gdb/gdb-stabs.h
    gdb/gdb.1
    gdb/gdb.c
    gdb/gdb.gdb
    gdb/gdb.h
    gdb/gdb_assert.h
    gdb/gdb_buildall.sh
    gdb/gdb_curses.h
    gdb/gdb_dirent.h
    gdb/gdb_expat.h
    gdb/gdb_gcore.sh
    gdb/gdb_indent.sh
    gdb/gdb_locale.h
    gdb/gdb_mbuild.sh
    gdb/gdb_obstack.h
    gdb/gdb_proc_service.h
    gdb/gdb_ptrace.h
    gdb/gdb_regex.h
    gdb/gdb_select.h
    gdb/gdb_stat.h
    gdb/gdb_string.h
    gdb/gdb_thread_db.h
    gdb/gdb_usleep.c
    gdb/gdb_usleep.h
    gdb/gdb_vfork.h
    gdb/gdb_wait.h
    gdb/gdb_wchar.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/acinclude.m4
    gdb/gdbserver/aclocal.m4
    gdb/gdbserver/config.in
    gdb/gdbserver/configure
    gdb/gdbserver/configure.ac
    gdb/gdbserver/configure.srv
    gdb/gdbserver/event-loop.c
    gdb/gdbserver/gdb_proc_service.h
    gdb/gdbserver/gdbreplay.c
    gdb/gdbserver/gdbserver.1
    gdb/gdbserver/hostio-errno.c
    gdb/gdbserver/hostio.c
    gdb/gdbserver/i387-fp.c
    gdb/gdbserver/i387-fp.h
    gdb/gdbserver/inferiors.c
    gdb/gdbserver/linux-arm-low.c
    gdb/gdbserver/linux-cris-low.c
    gdb/gdbserver/linux-crisv32-low.c
    gdb/gdbserver/linux-ia64-low.c
    gdb/gdbserver/linux-low.c
    gdb/gdbserver/linux-low.h
    gdb/gdbserver/linux-m32r-low.c
    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-sparc-low.c
    gdb/gdbserver/linux-x86-low.c
    gdb/gdbserver/linux-xtensa-low.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/spu-low.c
    gdb/gdbserver/target.c
    gdb/gdbserver/target.h
    gdb/gdbserver/terminal.h
    gdb/gdbserver/thread-db.c
    gdb/gdbserver/utils.c
    gdb/gdbserver/win32-arm-low.c
    gdb/gdbserver/win32-i386-low.c
    gdb/gdbserver/win32-low.c
    gdb/gdbserver/win32-low.h
    gdb/gdbserver/wincecompat.c
    gdb/gdbserver/wincecompat.h
    gdb/gdbserver/xtensa-xtregs.c
    gdb/gdbthread.h
    gdb/gdbtypes.c
    gdb/gdbtypes.h
    gdb/glibc-tdep.c
    gdb/glibc-tdep.h
    gdb/gnu-nat.c
    gdb/gnu-nat.h
    gdb/gnu-v2-abi.c
    gdb/gnu-v2-abi.h
    gdb/gnu-v3-abi.c
    gdb/gnulib/Makefile.am
    gdb/gnulib/Makefile.in
    gdb/gnulib/dummy.c
    gdb/gnulib/extra/link-warning.h
    gdb/gnulib/m4/extensions.m4
    gdb/gnulib/m4/gnulib-cache.m4
    gdb/gnulib/m4/gnulib-common.m4
    gdb/gnulib/m4/gnulib-comp.m4
    gdb/gnulib/m4/gnulib-tool.m4
    gdb/gnulib/m4/include_next.m4
    gdb/gnulib/m4/longlong.m4
    gdb/gnulib/m4/memchr.m4
    gdb/gnulib/m4/memcmp.m4
    gdb/gnulib/m4/memmem.m4
    gdb/gnulib/m4/onceonly_2_57.m4
    gdb/gnulib/m4/stdint.m4
    gdb/gnulib/m4/string_h.m4
    gdb/gnulib/m4/wchar.m4
    gdb/gnulib/memchr.c
    gdb/gnulib/memcmp.c
    gdb/gnulib/memmem.c
    gdb/gnulib/stdint.in.h
    gdb/gnulib/str-two-way.h
    gdb/gnulib/string.in.h
    gdb/gnulib/wchar.in.h
    gdb/go32-nat.c
    gdb/gregset.h
    gdb/h8300-tdep.c
    gdb/hppa-hpux-nat.c
    gdb/hppa-hpux-tdep.c
    gdb/hppa-linux-nat.c
    gdb/hppa-linux-offsets.h
    gdb/hppa-linux-tdep.c
    gdb/hppa-tdep.c
    gdb/hppa-tdep.h
    gdb/hppabsd-nat.c
    gdb/hppabsd-tdep.c
    gdb/hppabsd-tdep.h
    gdb/hppanbsd-nat.c
    gdb/hppanbsd-tdep.c
    gdb/hppaobsd-tdep.c
    gdb/hpux-thread.c
    gdb/i386-cygwin-tdep.c
    gdb/i386-darwin-nat.c
    gdb/i386-darwin-tdep.c
    gdb/i386-darwin-tdep.h
    gdb/i386-dicos-tdep.c
    gdb/i386-linux-nat.c
    gdb/i386-linux-tdep.c
    gdb/i386-linux-tdep.h
    gdb/i386-nat.c
    gdb/i386-nat.h
    gdb/i386-nto-tdep.c
    gdb/i386-sol2-nat.c
    gdb/i386-sol2-tdep.c
    gdb/i386-stub.c
    gdb/i386-tdep.c
    gdb/i386-tdep.h
    gdb/i386-windows-nat.c
    gdb/i386bsd-nat.c
    gdb/i386bsd-nat.h
    gdb/i386bsd-tdep.c
    gdb/i386fbsd-nat.c
    gdb/i386fbsd-tdep.c
    gdb/i386gnu-nat.c
    gdb/i386gnu-tdep.c
    gdb/i386nbsd-nat.c
    gdb/i386nbsd-tdep.c
    gdb/i386obsd-nat.c
    gdb/i386obsd-tdep.c
    gdb/i386v4-nat.c
    gdb/i387-tdep.c
    gdb/i387-tdep.h
    gdb/ia64-linux-nat.c
    gdb/ia64-linux-tdep.c
    gdb/ia64-tdep.c
    gdb/ia64-tdep.h
    gdb/inf-child.c
    gdb/inf-child.h
    gdb/inf-loop.c
    gdb/inf-loop.h
    gdb/inf-ptrace.c
    gdb/inf-ptrace.h
    gdb/inf-ttrace.c
    gdb/inf-ttrace.h
    gdb/infcall.c
    gdb/infcall.h
    gdb/infcmd.c
    gdb/inferior.c
    gdb/inferior.h
    gdb/inflow.c
    gdb/inflow.h
    gdb/infrun.c
    gdb/interps.c
    gdb/interps.h
    gdb/iq2000-tdep.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/language.c
    gdb/language.h
    gdb/libunwind-frame.c
    gdb/libunwind-frame.h
    gdb/linespec.c
    gdb/linespec.h
    gdb/linux-fork.c
    gdb/linux-fork.h
    gdb/linux-nat.c
    gdb/linux-nat.h
    gdb/linux-record.c
    gdb/linux-record.h
    gdb/linux-tdep.c
    gdb/linux-tdep.h
    gdb/linux-thread-db.c
    gdb/lm32-tdep.c
    gdb/m2-exp.y
    gdb/m2-lang.c
    gdb/m2-lang.h
    gdb/m2-typeprint.c
    gdb/m2-valprint.c
    gdb/m32c-tdep.c
    gdb/m32r-linux-nat.c
    gdb/m32r-linux-tdep.c
    gdb/m32r-rom.c
    gdb/m32r-stub.c
    gdb/m32r-tdep.c
    gdb/m32r-tdep.h
    gdb/m68hc11-tdep.c
    gdb/m68k-stub.c
    gdb/m68k-tdep.c
    gdb/m68k-tdep.h
    gdb/m68kbsd-nat.c
    gdb/m68kbsd-tdep.c
    gdb/m68klinux-nat.c
    gdb/m68klinux-tdep.c
    gdb/m88k-tdep.c
    gdb/m88k-tdep.h
    gdb/m88kbsd-nat.c
    gdb/machoread.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/main.h
    gdb/maint.c
    gdb/mdebugread.c
    gdb/mdebugread.h
    gdb/mem-break.c
    gdb/memattr.c
    gdb/memattr.h
    gdb/memory-map.c
    gdb/memory-map.h
    gdb/mep-tdep.c
    gdb/mi/ChangeLog-1999-2003
    gdb/mi/gdb-mi.el
    gdb/mi/mi-cmd-break.c
    gdb/mi/mi-cmd-disas.c
    gdb/mi/mi-cmd-env.c
    gdb/mi/mi-cmd-file.c
    gdb/mi/mi-cmd-stack.c
    gdb/mi/mi-cmd-target.c
    gdb/mi/mi-cmd-var.c
    gdb/mi/mi-cmds.c
    gdb/mi/mi-cmds.h
    gdb/mi/mi-common.c
    gdb/mi/mi-common.h
    gdb/mi/mi-console.c
    gdb/mi/mi-console.h
    gdb/mi/mi-getopt.c
    gdb/mi/mi-getopt.h
    gdb/mi/mi-interp.c
    gdb/mi/mi-main.c
    gdb/mi/mi-main.h
    gdb/mi/mi-out.c
    gdb/mi/mi-out.h
    gdb/mi/mi-parse.c
    gdb/mi/mi-parse.h
    gdb/mi/mi-symbol-cmds.c
    gdb/mingw-hdep.c
    gdb/minsyms.c
    gdb/mips-irix-tdep.c
    gdb/mips-linux-nat.c
    gdb/mips-linux-tdep.c
    gdb/mips-linux-tdep.h
    gdb/mips-tdep.c
    gdb/mips-tdep.h
    gdb/mips64obsd-nat.c
    gdb/mips64obsd-tdep.c
    gdb/mipsnbsd-nat.c
    gdb/mipsnbsd-tdep.c
    gdb/mipsnbsd-tdep.h
    gdb/mipsread.c
    gdb/mn10300-linux-tdep.c
    gdb/mn10300-tdep.c
    gdb/mn10300-tdep.h
    gdb/monitor.c
    gdb/monitor.h
    gdb/moxie-tdep.c
    gdb/moxie-tdep.h
    gdb/msg.defs
    gdb/msg_reply.defs
    gdb/mt-tdep.c
    gdb/nbsd-nat.c
    gdb/nbsd-nat.h
    gdb/nbsd-tdep.c
    gdb/nbsd-tdep.h
    gdb/notify.defs
    gdb/nto-procfs.c
    gdb/nto-tdep.c
    gdb/nto-tdep.h
    gdb/objc-exp.y
    gdb/objc-lang.c
    gdb/objc-lang.h
    gdb/objfiles.c
    gdb/objfiles.h
    gdb/obsd-tdep.c
    gdb/obsd-tdep.h
    gdb/observer.c
    gdb/observer.sh
    gdb/osabi.c
    gdb/osabi.h
    gdb/osdata.c
    gdb/osdata.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/p-exp.y
    gdb/p-lang.c
    gdb/p-lang.h
    gdb/p-typeprint.c
    gdb/p-valprint.c
    gdb/parse.c
    gdb/parser-defs.h
    gdb/po/gdbtext
    gdb/posix-hdep.c
    gdb/ppc-linux-nat.c
    gdb/ppc-linux-tdep.c
    gdb/ppc-linux-tdep.h
    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/ppcobsd-nat.c
    gdb/ppcobsd-tdep.c
    gdb/ppcobsd-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/procfs.h
    gdb/prologue-value.c
    gdb/prologue-value.h
    gdb/python/python-cmd.c
    gdb/python/python-frame.c
    gdb/python/python-function.c
    gdb/python/python-internal.h
    gdb/python/python-objfile.c
    gdb/python/python-prettyprint.c
    gdb/python/python-type.c
    gdb/python/python-utils.c
    gdb/python/python-value.c
    gdb/python/python.c
    gdb/python/python.h
    gdb/record.c
    gdb/record.h
    gdb/regcache.c
    gdb/regcache.h
    gdb/regformats/arm-with-iwmmxt.dat
    gdb/regformats/mips-linux.dat
    gdb/regformats/mips64-linux.dat
    gdb/regformats/reg-arm.dat
    gdb/regformats/reg-cris.dat
    gdb/regformats/reg-crisv32.dat
    gdb/regformats/reg-i386-linux.dat
    gdb/regformats/reg-i386.dat
    gdb/regformats/reg-ia64.dat
    gdb/regformats/reg-m32r.dat
    gdb/regformats/reg-m68k.dat
    gdb/regformats/reg-s390.dat
    gdb/regformats/reg-s390x.dat
    gdb/regformats/reg-sh.dat
    gdb/regformats/reg-sparc64.dat
    gdb/regformats/reg-spu.dat
    gdb/regformats/reg-x86-64-linux.dat
    gdb/regformats/reg-x86-64.dat
    gdb/regformats/reg-xtensa.dat
    gdb/regformats/regdat.sh
    gdb/regformats/regdef.h
    gdb/regformats/rs6000/powerpc-32l.dat
    gdb/regformats/rs6000/powerpc-64l.dat
    gdb/regformats/rs6000/powerpc-altivec32l.dat
    gdb/regformats/rs6000/powerpc-altivec64l.dat
    gdb/regformats/rs6000/powerpc-e500l.dat
    gdb/regformats/rs6000/powerpc-isa205-32l.dat
    gdb/regformats/rs6000/powerpc-isa205-64l.dat
    gdb/regformats/rs6000/powerpc-isa205-altivec32l.dat
    gdb/regformats/rs6000/powerpc-isa205-altivec64l.dat
    gdb/regformats/rs6000/powerpc-isa205-vsx32l.dat
    gdb/regformats/rs6000/powerpc-isa205-vsx64l.dat
    gdb/regformats/rs6000/powerpc-vsx32l.dat
    gdb/regformats/rs6000/powerpc-vsx64l.dat
    gdb/reggroups.c
    gdb/reggroups.h
    gdb/regset.c
    gdb/regset.h
    gdb/remote-fileio.c
    gdb/remote-fileio.h
    gdb/remote-m32r-sdi.c
    gdb/remote-mips.c
    gdb/remote-sim.c
    gdb/remote.c
    gdb/remote.h
    gdb/reply_mig_hack.awk
    gdb/reverse.c
    gdb/rs6000-aix-tdep.c
    gdb/rs6000-nat.c
    gdb/rs6000-tdep.c
    gdb/rs6000-tdep.h
    gdb/s390-nat.c
    gdb/s390-tdep.c
    gdb/s390-tdep.h
    gdb/scm-exp.c
    gdb/scm-lang.c
    gdb/scm-lang.h
    gdb/scm-tags.h
    gdb/scm-valprint.c
    gdb/score-tdep.c
    gdb/score-tdep.h
    gdb/sentinel-frame.c
    gdb/sentinel-frame.h
    gdb/ser-base.c
    gdb/ser-base.h
    gdb/ser-go32.c
    gdb/ser-mingw.c
    gdb/ser-pipe.c
    gdb/ser-tcp.c
    gdb/ser-tcp.h
    gdb/ser-unix.c
    gdb/ser-unix.h
    gdb/serial.c
    gdb/serial.h
    gdb/sh-linux-tdep.c
    gdb/sh-stub.c
    gdb/sh-tdep.c
    gdb/sh-tdep.h
    gdb/sh64-tdep.c
    gdb/shnbsd-nat.c
    gdb/shnbsd-tdep.c
    gdb/shnbsd-tdep.h
    gdb/sim-regno.h
    gdb/sol-thread.c
    gdb/sol2-tdep.c
    gdb/sol2-tdep.h
    gdb/solib-darwin.c
    gdb/solib-darwin.h
    gdb/solib-frv.c
    gdb/solib-irix.c
    gdb/solib-irix.h
    gdb/solib-null.c
    gdb/solib-osf.c
    gdb/solib-pa64.c
    gdb/solib-pa64.h
    gdb/solib-som.c
    gdb/solib-som.h
    gdb/solib-sunos.c
    gdb/solib-svr4.c
    gdb/solib-svr4.h
    gdb/solib-target.c
    gdb/solib-target.h
    gdb/solib.c
    gdb/solib.h
    gdb/solist.h
    gdb/somread.c
    gdb/source.c
    gdb/source.h
    gdb/sparc-linux-nat.c
    gdb/sparc-linux-tdep.c
    gdb/sparc-nat.c
    gdb/sparc-nat.h
    gdb/sparc-sol2-nat.c
    gdb/sparc-sol2-tdep.c
    gdb/sparc-stub.c
    gdb/sparc-tdep.c
    gdb/sparc-tdep.h
    gdb/sparc64-linux-nat.c
    gdb/sparc64-linux-tdep.c
    gdb/sparc64-nat.c
    gdb/sparc64-sol2-tdep.c
    gdb/sparc64-tdep.c
    gdb/sparc64-tdep.h
    gdb/sparc64fbsd-nat.c
    gdb/sparc64fbsd-tdep.c
    gdb/sparc64nbsd-nat.c
    gdb/sparc64nbsd-tdep.c
    gdb/sparc64obsd-tdep.c
    gdb/sparcnbsd-nat.c
    gdb/sparcnbsd-tdep.c
    gdb/sparcobsd-tdep.c
    gdb/spu-linux-nat.c
    gdb/spu-tdep.c
    gdb/spu-tdep.h
    gdb/srec.h
    gdb/stabsread.c
    gdb/stabsread.h
    gdb/stack.c
    gdb/stack.h
    gdb/std-regs.c
    gdb/symfile-mem.c
    gdb/symfile.c
    gdb/symfile.h
    gdb/symmisc.c
    gdb/symtab.c
    gdb/symtab.h
    gdb/target-descriptions.c
    gdb/target-descriptions.h
    gdb/target-memory.c
    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/arm-ice.exp
    gdb/testsuite/config/cfdbug.exp
    gdb/testsuite/config/cygmon.exp
    gdb/testsuite/config/d10v.exp
    gdb/testsuite/config/default.exp
    gdb/testsuite/config/dve.exp
    gdb/testsuite/config/gdbserver.exp
    gdb/testsuite/config/h8300.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/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/unix.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.ac
    gdb/testsuite/gdb.ada/Makefile.in
    gdb/testsuite/gdb.ada/array_bounds.exp
    gdb/testsuite/gdb.ada/array_bounds/bar.adb
    gdb/testsuite/gdb.ada/array_return.exp
    gdb/testsuite/gdb.ada/array_return/p.adb
    gdb/testsuite/gdb.ada/array_return/pck.adb
    gdb/testsuite/gdb.ada/array_return/pck.ads
    gdb/testsuite/gdb.ada/array_subscript_addr.exp
    gdb/testsuite/gdb.ada/array_subscript_addr/p.adb
    gdb/testsuite/gdb.ada/arrayidx.exp
    gdb/testsuite/gdb.ada/arrayidx/p.adb
    gdb/testsuite/gdb.ada/arrayparam.exp
    gdb/testsuite/gdb.ada/arrayparam/foo.adb
    gdb/testsuite/gdb.ada/arrayparam/pck.adb
    gdb/testsuite/gdb.ada/arrayparam/pck.ads
    gdb/testsuite/gdb.ada/arrayptr.exp
    gdb/testsuite/gdb.ada/arrayptr/foo.adb
    gdb/testsuite/gdb.ada/arrayptr/pck.adb
    gdb/testsuite/gdb.ada/arrayptr/pck.ads
    gdb/testsuite/gdb.ada/assign_1.exp
    gdb/testsuite/gdb.ada/atomic_enum.exp
    gdb/testsuite/gdb.ada/atomic_enum/foo.adb
    gdb/testsuite/gdb.ada/atomic_enum/pck.adb
    gdb/testsuite/gdb.ada/atomic_enum/pck.ads
    gdb/testsuite/gdb.ada/boolean_expr.exp
    gdb/testsuite/gdb.ada/catch_ex.exp
    gdb/testsuite/gdb.ada/catch_ex/foo.adb
    gdb/testsuite/gdb.ada/char_param.exp
    gdb/testsuite/gdb.ada/char_param/foo.adb
    gdb/testsuite/gdb.ada/char_param/pck.adb
    gdb/testsuite/gdb.ada/char_param/pck.ads
    gdb/testsuite/gdb.ada/complete.exp
    gdb/testsuite/gdb.ada/complete/foo.adb
    gdb/testsuite/gdb.ada/complete/pck.adb
    gdb/testsuite/gdb.ada/complete/pck.ads
    gdb/testsuite/gdb.ada/exec_changed.exp
    gdb/testsuite/gdb.ada/exec_changed/first.adb
    gdb/testsuite/gdb.ada/exec_changed/second.adb
    gdb/testsuite/gdb.ada/exprs.exp
    gdb/testsuite/gdb.ada/exprs/p.adb
    gdb/testsuite/gdb.ada/fixed_cmp.exp
    gdb/testsuite/gdb.ada/fixed_cmp/fixed.adb
    gdb/testsuite/gdb.ada/fixed_cmp/pck.adb
    gdb/testsuite/gdb.ada/fixed_cmp/pck.ads
    gdb/testsuite/gdb.ada/fixed_points.exp
    gdb/testsuite/gdb.ada/fixed_points/fixed_points.adb
    gdb/testsuite/gdb.ada/formatted_ref.exp
    gdb/testsuite/gdb.ada/formatted_ref/defs.adb
    gdb/testsuite/gdb.ada/formatted_ref/defs.ads
    gdb/testsuite/gdb.ada/formatted_ref/formatted_ref.adb
    gdb/testsuite/gdb.ada/frame_args.exp
    gdb/testsuite/gdb.ada/frame_args/foo.adb
    gdb/testsuite/gdb.ada/frame_args/pck.adb
    gdb/testsuite/gdb.ada/frame_args/pck.ads
    gdb/testsuite/gdb.ada/fun_addr.exp
    gdb/testsuite/gdb.ada/fun_addr/foo.adb
    gdb/testsuite/gdb.ada/fun_in_declare.exp
    gdb/testsuite/gdb.ada/fun_in_declare/foo.adb
    gdb/testsuite/gdb.ada/fun_in_declare/pck.adb
    gdb/testsuite/gdb.ada/fun_in_declare/pck.ads
    gdb/testsuite/gdb.ada/funcall_param.exp
    gdb/testsuite/gdb.ada/funcall_param/foo.adb
    gdb/testsuite/gdb.ada/funcall_param/pck.adb
    gdb/testsuite/gdb.ada/funcall_param/pck.ads
    gdb/testsuite/gdb.ada/gnat_ada.gpr
    gdb/testsuite/gdb.ada/homonym.exp
    gdb/testsuite/gdb.ada/homonym/homonym.adb
    gdb/testsuite/gdb.ada/homonym/homonym.ads
    gdb/testsuite/gdb.ada/homonym/homonym_main.adb
    gdb/testsuite/gdb.ada/int_deref.exp
    gdb/testsuite/gdb.ada/int_deref/foo.adb
    gdb/testsuite/gdb.ada/int_deref/pck.ads
    gdb/testsuite/gdb.ada/interface.exp
    gdb/testsuite/gdb.ada/interface/foo.adb
    gdb/testsuite/gdb.ada/interface/types.adb
    gdb/testsuite/gdb.ada/interface/types.ads
    gdb/testsuite/gdb.ada/lang_switch.exp
    gdb/testsuite/gdb.ada/lang_switch/foo.c
    gdb/testsuite/gdb.ada/lang_switch/lang_switch.adb
    gdb/testsuite/gdb.ada/mod_from_name.exp
    gdb/testsuite/gdb.ada/mod_from_name/foo.adb
    gdb/testsuite/gdb.ada/nested.exp
    gdb/testsuite/gdb.ada/nested/hello.adb
    gdb/testsuite/gdb.ada/null_array.exp
    gdb/testsuite/gdb.ada/null_array/foo.adb
    gdb/testsuite/gdb.ada/null_array/pck.adb
    gdb/testsuite/gdb.ada/null_array/pck.ads
    gdb/testsuite/gdb.ada/null_record.exp
    gdb/testsuite/gdb.ada/null_record/bar.adb
    gdb/testsuite/gdb.ada/null_record/bar.ads
    gdb/testsuite/gdb.ada/null_record/null_record.adb
    gdb/testsuite/gdb.ada/packed_array.exp
    gdb/testsuite/gdb.ada/packed_array/pa.adb
    gdb/testsuite/gdb.ada/packed_tagged.exp
    gdb/testsuite/gdb.ada/packed_tagged/comp_bug.adb
    gdb/testsuite/gdb.ada/print_chars.exp
    gdb/testsuite/gdb.ada/print_chars/foo.adb
    gdb/testsuite/gdb.ada/print_chars/pck.adb
    gdb/testsuite/gdb.ada/print_chars/pck.ads
    gdb/testsuite/gdb.ada/print_pc.exp
    gdb/testsuite/gdb.ada/ptype_arith_binop.exp
    gdb/testsuite/gdb.ada/ptype_field.exp
    gdb/testsuite/gdb.ada/ptype_field/foo.adb
    gdb/testsuite/gdb.ada/ptype_field/pck.adb
    gdb/testsuite/gdb.ada/ptype_field/pck.ads
    gdb/testsuite/gdb.ada/ref_param.exp
    gdb/testsuite/gdb.ada/ref_param/foo.adb
    gdb/testsuite/gdb.ada/ref_param/pck.adb
    gdb/testsuite/gdb.ada/ref_param/pck.ads
    gdb/testsuite/gdb.ada/ref_tick_size.exp
    gdb/testsuite/gdb.ada/ref_tick_size/p.adb
    gdb/testsuite/gdb.ada/ref_tick_size/pck.adb
    gdb/testsuite/gdb.ada/ref_tick_size/pck.ads
    gdb/testsuite/gdb.ada/start.exp
    gdb/testsuite/gdb.ada/start/dummy.adb
    gdb/testsuite/gdb.ada/str_ref_cmp.exp
    gdb/testsuite/gdb.ada/str_ref_cmp/foo.adb
    gdb/testsuite/gdb.ada/str_ref_cmp/pck.ads
    gdb/testsuite/gdb.ada/sym_print_name.exp
    gdb/testsuite/gdb.ada/sym_print_name/foo.adb
    gdb/testsuite/gdb.ada/sym_print_name/pck.adb
    gdb/testsuite/gdb.ada/sym_print_name/pck.ads
    gdb/testsuite/gdb.ada/taft_type.exp
    gdb/testsuite/gdb.ada/taft_type/p.adb
    gdb/testsuite/gdb.ada/taft_type/pck.adb
    gdb/testsuite/gdb.ada/taft_type/pck.ads
    gdb/testsuite/gdb.ada/tagged.exp
    gdb/testsuite/gdb.ada/tagged/foo.adb
    gdb/testsuite/gdb.ada/tagged/pck.adb
    gdb/testsuite/gdb.ada/tagged/pck.ads
    gdb/testsuite/gdb.ada/tasks.exp
    gdb/testsuite/gdb.ada/tasks/foo.adb
    gdb/testsuite/gdb.ada/tick_last_segv.exp
    gdb/testsuite/gdb.ada/tick_last_segv/foo.adb
    gdb/testsuite/gdb.ada/type_coercion.exp
    gdb/testsuite/gdb.ada/type_coercion/assign.adb
    gdb/testsuite/gdb.ada/type_coercion/ident.adb
    gdb/testsuite/gdb.ada/uninitialized_vars.exp
    gdb/testsuite/gdb.ada/uninitialized_vars/parse.adb
    gdb/testsuite/gdb.ada/uninitialized_vars/parse_controlled.ads
    gdb/testsuite/gdb.ada/variant_record_packed_array.exp
    gdb/testsuite/gdb.ada/variant_record_packed_array/foo.adb
    gdb/testsuite/gdb.ada/variant_record_packed_array/pck.adb
    gdb/testsuite/gdb.ada/variant_record_packed_array/pck.ads
    gdb/testsuite/gdb.ada/watch_arg.exp
    gdb/testsuite/gdb.ada/watch_arg/watch.adb
    gdb/testsuite/gdb.arch/Makefile.in
    gdb/testsuite/gdb.arch/alpha-step.c
    gdb/testsuite/gdb.arch/alpha-step.exp
    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/amd64-disp-step.S
    gdb/testsuite/gdb.arch/amd64-disp-step.exp
    gdb/testsuite/gdb.arch/e500-abi.c
    gdb/testsuite/gdb.arch/e500-abi.exp
    gdb/testsuite/gdb.arch/e500-prologue.c
    gdb/testsuite/gdb.arch/e500-prologue.exp
    gdb/testsuite/gdb.arch/e500-regs.c
    gdb/testsuite/gdb.arch/e500-regs.exp
    gdb/testsuite/gdb.arch/gdb1291.exp
    gdb/testsuite/gdb.arch/gdb1291.s
    gdb/testsuite/gdb.arch/gdb1431.exp
    gdb/testsuite/gdb.arch/gdb1431.s
    gdb/testsuite/gdb.arch/gdb1558.c
    gdb/testsuite/gdb.arch/gdb1558.exp
    gdb/testsuite/gdb.arch/i386-bp_permanent.exp
    gdb/testsuite/gdb.arch/i386-cpuid.h
    gdb/testsuite/gdb.arch/i386-disp-step.S
    gdb/testsuite/gdb.arch/i386-disp-step.exp
    gdb/testsuite/gdb.arch/i386-gnu-cfi-asm.S
    gdb/testsuite/gdb.arch/i386-gnu-cfi.c
    gdb/testsuite/gdb.arch/i386-gnu-cfi.exp
    gdb/testsuite/gdb.arch/i386-permbkpt.S
    gdb/testsuite/gdb.arch/i386-permbkpt.exp
    gdb/testsuite/gdb.arch/i386-prologue.c
    gdb/testsuite/gdb.arch/i386-prologue.exp
    gdb/testsuite/gdb.arch/i386-signal.c
    gdb/testsuite/gdb.arch/i386-signal.exp
    gdb/testsuite/gdb.arch/i386-size-overlap.c
    gdb/testsuite/gdb.arch/i386-size-overlap.exp
    gdb/testsuite/gdb.arch/i386-size.c
    gdb/testsuite/gdb.arch/i386-size.exp
    gdb/testsuite/gdb.arch/i386-sse.c
    gdb/testsuite/gdb.arch/i386-sse.exp
    gdb/testsuite/gdb.arch/i386-unwind.c
    gdb/testsuite/gdb.arch/i386-unwind.exp
    gdb/testsuite/gdb.arch/iwmmxt-regs.c
    gdb/testsuite/gdb.arch/iwmmxt-regs.exp
    gdb/testsuite/gdb.arch/pa-nullify.exp
    gdb/testsuite/gdb.arch/pa-nullify.s
    gdb/testsuite/gdb.arch/pa64-nullify.s
    gdb/testsuite/gdb.arch/powerpc-aix-prologue.c
    gdb/testsuite/gdb.arch/powerpc-aix-prologue.exp
    gdb/testsuite/gdb.arch/powerpc-d128-regs.c
    gdb/testsuite/gdb.arch/powerpc-d128-regs.exp
    gdb/testsuite/gdb.arch/powerpc-prologue.c
    gdb/testsuite/gdb.arch/powerpc-prologue.exp
    gdb/testsuite/gdb.arch/ppc-dfp.c
    gdb/testsuite/gdb.arch/ppc-dfp.exp
    gdb/testsuite/gdb.arch/ppc-fp.c
    gdb/testsuite/gdb.arch/ppc-fp.exp
    gdb/testsuite/gdb.arch/ppc64-atomic-inst.c
    gdb/testsuite/gdb.arch/ppc64-atomic-inst.exp
    gdb/testsuite/gdb.arch/spu-info.c
    gdb/testsuite/gdb.arch/spu-info.exp
    gdb/testsuite/gdb.arch/thumb-prologue.c
    gdb/testsuite/gdb.arch/thumb-prologue.exp
    gdb/testsuite/gdb.arch/vsx-regs.c
    gdb/testsuite/gdb.arch/vsx-regs.exp
    gdb/testsuite/gdb.asm/Makefile.in
    gdb/testsuite/gdb.asm/alpha.inc
    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/empty.inc
    gdb/testsuite/gdb.asm/frv.inc
    gdb/testsuite/gdb.asm/h8300.inc
    gdb/testsuite/gdb.asm/i386.inc
    gdb/testsuite/gdb.asm/ia64.inc
    gdb/testsuite/gdb.asm/iq2000.inc
    gdb/testsuite/gdb.asm/m32c.inc
    gdb/testsuite/gdb.asm/m32r-linux.inc
    gdb/testsuite/gdb.asm/m32r.inc
    gdb/testsuite/gdb.asm/m68hc11.inc
    gdb/testsuite/gdb.asm/m68k.inc
    gdb/testsuite/gdb.asm/mips.inc
    gdb/testsuite/gdb.asm/netbsd.inc
    gdb/testsuite/gdb.asm/openbsd.inc
    gdb/testsuite/gdb.asm/pa.inc
    gdb/testsuite/gdb.asm/pa64.inc
    gdb/testsuite/gdb.asm/powerpc.inc
    gdb/testsuite/gdb.asm/s390.inc
    gdb/testsuite/gdb.asm/s390x.inc
    gdb/testsuite/gdb.asm/sh.inc
    gdb/testsuite/gdb.asm/sparc.inc
    gdb/testsuite/gdb.asm/sparc64.inc
    gdb/testsuite/gdb.asm/spu.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/advance.c
    gdb/testsuite/gdb.base/advance.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/annota3.c
    gdb/testsuite/gdb.base/annota3.exp
    gdb/testsuite/gdb.base/args.c
    gdb/testsuite/gdb.base/args.exp
    gdb/testsuite/gdb.base/arithmet.exp
    gdb/testsuite/gdb.base/arrayidx.c
    gdb/testsuite/gdb.base/arrayidx.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/auxv.c
    gdb/testsuite/gdb.base/auxv.exp
    gdb/testsuite/gdb.base/average.c
    gdb/testsuite/gdb.base/bang.exp
    gdb/testsuite/gdb.base/bar.c
    gdb/testsuite/gdb.base/baz.c
    gdb/testsuite/gdb.base/bfp-test.c
    gdb/testsuite/gdb.base/bfp-test.exp
    gdb/testsuite/gdb.base/bigcore.c
    gdb/testsuite/gdb.base/bigcore.exp
    gdb/testsuite/gdb.base/bitfields.c
    gdb/testsuite/gdb.base/bitfields.exp
    gdb/testsuite/gdb.base/bitfields2.c
    gdb/testsuite/gdb.base/bitfields2.exp
    gdb/testsuite/gdb.base/bitops.exp
    gdb/testsuite/gdb.base/branches.c
    gdb/testsuite/gdb.base/break-always.c
    gdb/testsuite/gdb.base/break-always.exp
    gdb/testsuite/gdb.base/break.c
    gdb/testsuite/gdb.base/break.exp
    gdb/testsuite/gdb.base/break1.c
    gdb/testsuite/gdb.base/breakpoint-shadow.c
    gdb/testsuite/gdb.base/breakpoint-shadow.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-sc.c
    gdb/testsuite/gdb.base/call-sc.exp
    gdb/testsuite/gdb.base/call-signal-resume.exp
    gdb/testsuite/gdb.base/call-signals.c
    gdb/testsuite/gdb.base/call-strs.c
    gdb/testsuite/gdb.base/call-strs.exp
    gdb/testsuite/gdb.base/callexit.c
    gdb/testsuite/gdb.base/callexit.exp
    gdb/testsuite/gdb.base/callfuncs.c
    gdb/testsuite/gdb.base/callfuncs.exp
    gdb/testsuite/gdb.base/charset.c
    gdb/testsuite/gdb.base/charset.exp
    gdb/testsuite/gdb.base/checkpoint.c
    gdb/testsuite/gdb.base/checkpoint.exp
    gdb/testsuite/gdb.base/chng-syms.c
    gdb/testsuite/gdb.base/chng-syms.exp
    gdb/testsuite/gdb.base/code-expr.exp
    gdb/testsuite/gdb.base/commands.exp
    gdb/testsuite/gdb.base/completion.exp
    gdb/testsuite/gdb.base/complex.c
    gdb/testsuite/gdb.base/complex.exp
    gdb/testsuite/gdb.base/cond-expr.exp
    gdb/testsuite/gdb.base/condbreak.exp
    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/cursal.c
    gdb/testsuite/gdb.base/cursal.exp
    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/del.c
    gdb/testsuite/gdb.base/del.exp
    gdb/testsuite/gdb.base/detach.exp
    gdb/testsuite/gdb.base/dfp-exprs.exp
    gdb/testsuite/gdb.base/dfp-test.c
    gdb/testsuite/gdb.base/dfp-test.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/exe-lock.exp
    gdb/testsuite/gdb.base/execd-prog.c
    gdb/testsuite/gdb.base/expand-psymtabs.c
    gdb/testsuite/gdb.base/expand-psymtabs.exp
    gdb/testsuite/gdb.base/exprs.c
    gdb/testsuite/gdb.base/exprs.exp
    gdb/testsuite/gdb.base/fileio.c
    gdb/testsuite/gdb.base/fileio.exp
    gdb/testsuite/gdb.base/find.c
    gdb/testsuite/gdb.base/find.exp
    gdb/testsuite/gdb.base/finish.exp
    gdb/testsuite/gdb.base/fixsection.c
    gdb/testsuite/gdb.base/fixsection.exp
    gdb/testsuite/gdb.base/fixsectshr.c
    gdb/testsuite/gdb.base/float.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/frame-args.c
    gdb/testsuite/gdb.base/frame-args.exp
    gdb/testsuite/gdb.base/freebpcmd.c
    gdb/testsuite/gdb.base/freebpcmd.exp
    gdb/testsuite/gdb.base/fullname.c
    gdb/testsuite/gdb.base/fullname.exp
    gdb/testsuite/gdb.base/funcargs.c
    gdb/testsuite/gdb.base/funcargs.exp
    gdb/testsuite/gdb.base/gcore-buffer-overflow.c
    gdb/testsuite/gdb.base/gcore-buffer-overflow.exp
    gdb/testsuite/gdb.base/gcore.c
    gdb/testsuite/gdb.base/gcore.exp
    gdb/testsuite/gdb.base/gdb1056.exp
    gdb/testsuite/gdb.base/gdb1090.c
    gdb/testsuite/gdb.base/gdb1090.exp
    gdb/testsuite/gdb.base/gdb1250.c
    gdb/testsuite/gdb.base/gdb1250.exp
    gdb/testsuite/gdb.base/gdb1555-main.c
    gdb/testsuite/gdb.base/gdb1555.c
    gdb/testsuite/gdb.base/gdb1555.exp
    gdb/testsuite/gdb.base/gdb1821.c
    gdb/testsuite/gdb.base/gdb1821.exp
    gdb/testsuite/gdb.base/gdb_history
    gdb/testsuite/gdb.base/gdbvars.exp
    gdb/testsuite/gdb.base/grbx.c
    gdb/testsuite/gdb.base/hashline1.exp
    gdb/testsuite/gdb.base/hashline2.exp
    gdb/testsuite/gdb.base/hashline3.exp
    gdb/testsuite/gdb.base/help.exp
    gdb/testsuite/gdb.base/hook-stop-continue.c
    gdb/testsuite/gdb.base/hook-stop-continue.exp
    gdb/testsuite/gdb.base/hook-stop-frame.c
    gdb/testsuite/gdb.base/hook-stop-frame.exp
    gdb/testsuite/gdb.base/huge.c
    gdb/testsuite/gdb.base/huge.exp
    gdb/testsuite/gdb.base/ifelse.exp
    gdb/testsuite/gdb.base/included.c
    gdb/testsuite/gdb.base/included.exp
    gdb/testsuite/gdb.base/included.h
    gdb/testsuite/gdb.base/infnan.c
    gdb/testsuite/gdb.base/infnan.exp
    gdb/testsuite/gdb.base/info-proc.exp
    gdb/testsuite/gdb.base/info-target.exp
    gdb/testsuite/gdb.base/int-type.c
    gdb/testsuite/gdb.base/interp.exp
    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/lineinc.c
    gdb/testsuite/gdb.base/lineinc.exp
    gdb/testsuite/gdb.base/lineinc1.h
    gdb/testsuite/gdb.base/lineinc2.h
    gdb/testsuite/gdb.base/lineinc3.h
    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/longjmp.c
    gdb/testsuite/gdb.base/longjmp.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/multi-forks.c
    gdb/testsuite/gdb.base/multi-forks.exp
    gdb/testsuite/gdb.base/nodebug.c
    gdb/testsuite/gdb.base/nodebug.exp
    gdb/testsuite/gdb.base/nofield.c
    gdb/testsuite/gdb.base/nofield.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/pc-fp.c
    gdb/testsuite/gdb.base/pc-fp.exp
    gdb/testsuite/gdb.base/pending.c
    gdb/testsuite/gdb.base/pending.exp
    gdb/testsuite/gdb.base/pendshr.c
    gdb/testsuite/gdb.base/pi.txt
    gdb/testsuite/gdb.base/pointers.c
    gdb/testsuite/gdb.base/pointers.exp
    gdb/testsuite/gdb.base/prelink-lib.c
    gdb/testsuite/gdb.base/prelink.c
    gdb/testsuite/gdb.base/prelink.exp
    gdb/testsuite/gdb.base/printcmds.c
    gdb/testsuite/gdb.base/printcmds.exp
    gdb/testsuite/gdb.base/prologue.c
    gdb/testsuite/gdb.base/prologue.exp
    gdb/testsuite/gdb.base/psymtab.exp
    gdb/testsuite/gdb.base/psymtab1.c
    gdb/testsuite/gdb.base/psymtab2.c
    gdb/testsuite/gdb.base/ptr-typedef.c
    gdb/testsuite/gdb.base/ptr-typedef.exp
    gdb/testsuite/gdb.base/ptype.c
    gdb/testsuite/gdb.base/ptype.exp
    gdb/testsuite/gdb.base/ptype1.c
    gdb/testsuite/gdb.base/radix.exp
    gdb/testsuite/gdb.base/randomize.c
    gdb/testsuite/gdb.base/randomize.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/relativedebug.c
    gdb/testsuite/gdb.base/relativedebug.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/remotetimeout.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-nodebug.c
    gdb/testsuite/gdb.base/return-nodebug.exp
    gdb/testsuite/gdb.base/return-nodebug1.c
    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/savedregs.c
    gdb/testsuite/gdb.base/savedregs.exp
    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/sep-proc.c
    gdb/testsuite/gdb.base/sep.c
    gdb/testsuite/gdb.base/sep.exp
    gdb/testsuite/gdb.base/sepdebug.c
    gdb/testsuite/gdb.base/sepdebug.exp
    gdb/testsuite/gdb.base/sepsymtab.c
    gdb/testsuite/gdb.base/sepsymtab.exp
    gdb/testsuite/gdb.base/set-lang-auto.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/shreloc.c
    gdb/testsuite/gdb.base/shreloc.exp
    gdb/testsuite/gdb.base/shreloc1.c
    gdb/testsuite/gdb.base/shreloc2.c
    gdb/testsuite/gdb.base/sigall.c
    gdb/testsuite/gdb.base/sigall.exp
    gdb/testsuite/gdb.base/sigaltstack.c
    gdb/testsuite/gdb.base/sigaltstack.exp
    gdb/testsuite/gdb.base/sigbpt.c
    gdb/testsuite/gdb.base/sigbpt.exp
    gdb/testsuite/gdb.base/sigchld.c
    gdb/testsuite/gdb.base/sigchld.exp
    gdb/testsuite/gdb.base/siginfo-addr.c
    gdb/testsuite/gdb.base/siginfo-addr.exp
    gdb/testsuite/gdb.base/siginfo-obj.c
    gdb/testsuite/gdb.base/siginfo-obj.exp
    gdb/testsuite/gdb.base/siginfo.c
    gdb/testsuite/gdb.base/siginfo.exp
    gdb/testsuite/gdb.base/signals.c
    gdb/testsuite/gdb.base/signals.exp
    gdb/testsuite/gdb.base/signull.c
    gdb/testsuite/gdb.base/signull.exp
    gdb/testsuite/gdb.base/sigrepeat.c
    gdb/testsuite/gdb.base/sigrepeat.exp
    gdb/testsuite/gdb.base/sigstep.c
    gdb/testsuite/gdb.base/sigstep.exp
    gdb/testsuite/gdb.base/sizeof.c
    gdb/testsuite/gdb.base/sizeof.exp
    gdb/testsuite/gdb.base/so-disc-shr.c
    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-disc.c
    gdb/testsuite/gdb.base/solib-disc.exp
    gdb/testsuite/gdb.base/solib-display-lib.c
    gdb/testsuite/gdb.base/solib-display-main.c
    gdb/testsuite/gdb.base/solib-display.exp
    gdb/testsuite/gdb.base/solib-symbol-lib.c
    gdb/testsuite/gdb.base/solib-symbol-main.c
    gdb/testsuite/gdb.base/solib-symbol.exp
    gdb/testsuite/gdb.base/solib-weak.c
    gdb/testsuite/gdb.base/solib-weak.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/source-error.gdb
    gdb/testsuite/gdb.base/source.exp
    gdb/testsuite/gdb.base/spu.ld
    gdb/testsuite/gdb.base/ss.h
    gdb/testsuite/gdb.base/stack-checking.c
    gdb/testsuite/gdb.base/stack-checking.exp
    gdb/testsuite/gdb.base/start.c
    gdb/testsuite/gdb.base/start.exp
    gdb/testsuite/gdb.base/step-break.c
    gdb/testsuite/gdb.base/step-break.exp
    gdb/testsuite/gdb.base/step-bt.c
    gdb/testsuite/gdb.base/step-bt.exp
    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/store.c
    gdb/testsuite/gdb.base/store.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/structs3.c
    gdb/testsuite/gdb.base/structs3.exp
    gdb/testsuite/gdb.base/subst.exp
    gdb/testsuite/gdb.base/sum.c
    gdb/testsuite/gdb.base/term.exp
    gdb/testsuite/gdb.base/trace-commands.exp
    gdb/testsuite/gdb.base/twice.c
    gdb/testsuite/gdb.base/twice.exp
    gdb/testsuite/gdb.base/type-opaque-lib.c
    gdb/testsuite/gdb.base/type-opaque-main.c
    gdb/testsuite/gdb.base/type-opaque.exp
    gdb/testsuite/gdb.base/unload.c
    gdb/testsuite/gdb.base/unload.exp
    gdb/testsuite/gdb.base/unloadshr.c
    gdb/testsuite/gdb.base/until.exp
    gdb/testsuite/gdb.base/unwindonsignal.c
    gdb/testsuite/gdb.base/unwindonsignal.exp
    gdb/testsuite/gdb.base/value-double-free.c
    gdb/testsuite/gdb.base/value-double-free.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/watch_thread_num.c
    gdb/testsuite/gdb.base/watch_thread_num.exp
    gdb/testsuite/gdb.base/watchpoint-hw.c
    gdb/testsuite/gdb.base/watchpoint-hw.exp
    gdb/testsuite/gdb.base/watchpoint-solib-shr.c
    gdb/testsuite/gdb.base/watchpoint-solib.c
    gdb/testsuite/gdb.base/watchpoint-solib.exp
    gdb/testsuite/gdb.base/watchpoint.c
    gdb/testsuite/gdb.base/watchpoint.exp
    gdb/testsuite/gdb.base/weaklib1.c
    gdb/testsuite/gdb.base/weaklib2.c
    gdb/testsuite/gdb.base/whatis-exp.exp
    gdb/testsuite/gdb.base/whatis.c
    gdb/testsuite/gdb.base/whatis.exp
    gdb/testsuite/gdb.cp/Makefile.in
    gdb/testsuite/gdb.cp/abstract-origin.cc
    gdb/testsuite/gdb.cp/abstract-origin.exp
    gdb/testsuite/gdb.cp/ambiguous.cc
    gdb/testsuite/gdb.cp/ambiguous.exp
    gdb/testsuite/gdb.cp/annota2.cc
    gdb/testsuite/gdb.cp/annota2.exp
    gdb/testsuite/gdb.cp/annota3.cc
    gdb/testsuite/gdb.cp/annota3.exp
    gdb/testsuite/gdb.cp/anon-union.cc
    gdb/testsuite/gdb.cp/anon-union.exp
    gdb/testsuite/gdb.cp/arg-reference.cc
    gdb/testsuite/gdb.cp/arg-reference.exp
    gdb/testsuite/gdb.cp/bool.cc
    gdb/testsuite/gdb.cp/bool.exp
    gdb/testsuite/gdb.cp/breakpoint.cc
    gdb/testsuite/gdb.cp/breakpoint.exp
    gdb/testsuite/gdb.cp/bs15503.cc
    gdb/testsuite/gdb.cp/bs15503.exp
    gdb/testsuite/gdb.cp/call-c-1.c
    gdb/testsuite/gdb.cp/call-c.cc
    gdb/testsuite/gdb.cp/call-c.exp
    gdb/testsuite/gdb.cp/casts.cc
    gdb/testsuite/gdb.cp/casts.exp
    gdb/testsuite/gdb.cp/class2.cc
    gdb/testsuite/gdb.cp/class2.exp
    gdb/testsuite/gdb.cp/classes.cc
    gdb/testsuite/gdb.cp/classes.exp
    gdb/testsuite/gdb.cp/cp-relocate.cc
    gdb/testsuite/gdb.cp/cp-relocate.exp
    gdb/testsuite/gdb.cp/cpcompletion.exp
    gdb/testsuite/gdb.cp/cplusfuncs.cc
    gdb/testsuite/gdb.cp/cplusfuncs.exp
    gdb/testsuite/gdb.cp/ctti.exp
    gdb/testsuite/gdb.cp/cttiadd.cc
    gdb/testsuite/gdb.cp/cttiadd1.cc
    gdb/testsuite/gdb.cp/cttiadd2.cc
    gdb/testsuite/gdb.cp/cttiadd3.cc
    gdb/testsuite/gdb.cp/demangle.exp
    gdb/testsuite/gdb.cp/derivation.cc
    gdb/testsuite/gdb.cp/derivation.exp
    gdb/testsuite/gdb.cp/exception.cc
    gdb/testsuite/gdb.cp/exception.exp
    gdb/testsuite/gdb.cp/expand-sals.cc
    gdb/testsuite/gdb.cp/expand-sals.exp
    gdb/testsuite/gdb.cp/formatted-ref.cc
    gdb/testsuite/gdb.cp/formatted-ref.exp
    gdb/testsuite/gdb.cp/gdb1355.cc
    gdb/testsuite/gdb.cp/gdb1355.exp
    gdb/testsuite/gdb.cp/gdb2384-base.cc
    gdb/testsuite/gdb.cp/gdb2384-base.h
    gdb/testsuite/gdb.cp/gdb2384.cc
    gdb/testsuite/gdb.cp/gdb2384.exp
    gdb/testsuite/gdb.cp/gdb2495.cc
    gdb/testsuite/gdb.cp/gdb2495.exp
    gdb/testsuite/gdb.cp/hang.H
    gdb/testsuite/gdb.cp/hang.exp
    gdb/testsuite/gdb.cp/hang1.cc
    gdb/testsuite/gdb.cp/hang2.cc
    gdb/testsuite/gdb.cp/hang3.cc
    gdb/testsuite/gdb.cp/inherit.exp
    gdb/testsuite/gdb.cp/local.cc
    gdb/testsuite/gdb.cp/local.exp
    gdb/testsuite/gdb.cp/m-data.cc
    gdb/testsuite/gdb.cp/m-data.exp
    gdb/testsuite/gdb.cp/m-static.cc
    gdb/testsuite/gdb.cp/m-static.exp
    gdb/testsuite/gdb.cp/m-static.h
    gdb/testsuite/gdb.cp/m-static1.cc
    gdb/testsuite/gdb.cp/maint.exp
    gdb/testsuite/gdb.cp/mb-ctor.cc
    gdb/testsuite/gdb.cp/mb-ctor.exp
    gdb/testsuite/gdb.cp/mb-inline.exp
    gdb/testsuite/gdb.cp/mb-inline.h
    gdb/testsuite/gdb.cp/mb-inline1.cc
    gdb/testsuite/gdb.cp/mb-inline2.cc
    gdb/testsuite/gdb.cp/mb-templates.cc
    gdb/testsuite/gdb.cp/mb-templates.exp
    gdb/testsuite/gdb.cp/member-ptr.cc
    gdb/testsuite/gdb.cp/member-ptr.exp
    gdb/testsuite/gdb.cp/method.cc
    gdb/testsuite/gdb.cp/method.exp
    gdb/testsuite/gdb.cp/method2.cc
    gdb/testsuite/gdb.cp/method2.exp
    gdb/testsuite/gdb.cp/misc.cc
    gdb/testsuite/gdb.cp/misc.exp
    gdb/testsuite/gdb.cp/namespace-using.cc
    gdb/testsuite/gdb.cp/namespace-using.exp
    gdb/testsuite/gdb.cp/namespace.cc
    gdb/testsuite/gdb.cp/namespace.exp
    gdb/testsuite/gdb.cp/namespace1.cc
    gdb/testsuite/gdb.cp/overload.cc
    gdb/testsuite/gdb.cp/overload.exp
    gdb/testsuite/gdb.cp/ovldbreak.cc
    gdb/testsuite/gdb.cp/ovldbreak.exp
    gdb/testsuite/gdb.cp/pass-by-ref.cc
    gdb/testsuite/gdb.cp/pass-by-ref.exp
    gdb/testsuite/gdb.cp/pr-1023.cc
    gdb/testsuite/gdb.cp/pr-1023.exp
    gdb/testsuite/gdb.cp/pr-1210.cc
    gdb/testsuite/gdb.cp/pr-1210.exp
    gdb/testsuite/gdb.cp/pr-574.cc
    gdb/testsuite/gdb.cp/pr-574.exp
    gdb/testsuite/gdb.cp/pr9594.cc
    gdb/testsuite/gdb.cp/pr9631.cc
    gdb/testsuite/gdb.cp/pr9631.exp
    gdb/testsuite/gdb.cp/printmethod.cc
    gdb/testsuite/gdb.cp/printmethod.exp
    gdb/testsuite/gdb.cp/psmang.exp
    gdb/testsuite/gdb.cp/psmang1.cc
    gdb/testsuite/gdb.cp/psmang2.cc
    gdb/testsuite/gdb.cp/punctuator.exp
    gdb/testsuite/gdb.cp/ref-params.cc
    gdb/testsuite/gdb.cp/ref-params.exp
    gdb/testsuite/gdb.cp/ref-types.cc
    gdb/testsuite/gdb.cp/ref-types.exp
    gdb/testsuite/gdb.cp/rtti.exp
    gdb/testsuite/gdb.cp/rtti.h
    gdb/testsuite/gdb.cp/rtti1.cc
    gdb/testsuite/gdb.cp/rtti2.cc
    gdb/testsuite/gdb.cp/templates.cc
    gdb/testsuite/gdb.cp/templates.exp
    gdb/testsuite/gdb.cp/try_catch.cc
    gdb/testsuite/gdb.cp/try_catch.exp
    gdb/testsuite/gdb.cp/userdef.cc
    gdb/testsuite/gdb.cp/userdef.exp
    gdb/testsuite/gdb.cp/virtfunc.cc
    gdb/testsuite/gdb.cp/virtfunc.exp
    gdb/testsuite/gdb.disasm/Makefile.in
    gdb/testsuite/gdb.disasm/am33.exp
    gdb/testsuite/gdb.disasm/am33.s
    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.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.disasm/t01_mov.exp
    gdb/testsuite/gdb.disasm/t01_mov.s
    gdb/testsuite/gdb.disasm/t02_mova.exp
    gdb/testsuite/gdb.disasm/t02_mova.s
    gdb/testsuite/gdb.disasm/t03_add.exp
    gdb/testsuite/gdb.disasm/t03_add.s
    gdb/testsuite/gdb.disasm/t04_sub.exp
    gdb/testsuite/gdb.disasm/t04_sub.s
    gdb/testsuite/gdb.disasm/t05_cmp.exp
    gdb/testsuite/gdb.disasm/t05_cmp.s
    gdb/testsuite/gdb.disasm/t06_ari2.exp
    gdb/testsuite/gdb.disasm/t06_ari2.s
    gdb/testsuite/gdb.disasm/t07_ari3.exp
    gdb/testsuite/gdb.disasm/t07_ari3.s
    gdb/testsuite/gdb.disasm/t08_or.exp
    gdb/testsuite/gdb.disasm/t08_or.s
    gdb/testsuite/gdb.disasm/t09_xor.exp
    gdb/testsuite/gdb.disasm/t09_xor.s
    gdb/testsuite/gdb.disasm/t10_and.exp
    gdb/testsuite/gdb.disasm/t10_and.s
    gdb/testsuite/gdb.disasm/t11_logs.exp
    gdb/testsuite/gdb.disasm/t11_logs.s
    gdb/testsuite/gdb.disasm/t12_bit.exp
    gdb/testsuite/gdb.disasm/t12_bit.s
    gdb/testsuite/gdb.disasm/t13_otr.exp
    gdb/testsuite/gdb.disasm/t13_otr.s
    gdb/testsuite/gdb.dwarf2/Makefile.in
    gdb/testsuite/gdb.dwarf2/dup-psym.S
    gdb/testsuite/gdb.dwarf2/dup-psym.exp
    gdb/testsuite/gdb.dwarf2/dw2-basic.S
    gdb/testsuite/gdb.dwarf2/dw2-basic.exp
    gdb/testsuite/gdb.dwarf2/dw2-compressed.S
    gdb/testsuite/gdb.dwarf2/dw2-compressed.exp
    gdb/testsuite/gdb.dwarf2/dw2-cu-size.S
    gdb/testsuite/gdb.dwarf2/dw2-cu-size.exp
    gdb/testsuite/gdb.dwarf2/dw2-intercu.S
    gdb/testsuite/gdb.dwarf2/dw2-intercu.exp
    gdb/testsuite/gdb.dwarf2/dw2-intermix.S
    gdb/testsuite/gdb.dwarf2/dw2-intermix.exp
    gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c
    gdb/testsuite/gdb.dwarf2/dw2-noloc.S
    gdb/testsuite/gdb.dwarf2/dw2-noloc.exp
    gdb/testsuite/gdb.dwarf2/dw2-producer.S
    gdb/testsuite/gdb.dwarf2/dw2-producer.exp
    gdb/testsuite/gdb.dwarf2/dw2-ranges.S
    gdb/testsuite/gdb.dwarf2/dw2-ranges.exp
    gdb/testsuite/gdb.dwarf2/dw2-ranges2.S
    gdb/testsuite/gdb.dwarf2/dw2-ranges3.S
    gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S
    gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.exp
    gdb/testsuite/gdb.dwarf2/dw2-strp.S
    gdb/testsuite/gdb.dwarf2/dw2-strp.exp
    gdb/testsuite/gdb.dwarf2/dw2-unresolved-main.c
    gdb/testsuite/gdb.dwarf2/dw2-unresolved.S
    gdb/testsuite/gdb.dwarf2/dw2-unresolved.exp
    gdb/testsuite/gdb.dwarf2/file1.txt
    gdb/testsuite/gdb.dwarf2/mac-fileno.S
    gdb/testsuite/gdb.dwarf2/mac-fileno.exp
    gdb/testsuite/gdb.dwarf2/main.c
    gdb/testsuite/gdb.fortran/Makefile.in
    gdb/testsuite/gdb.fortran/array-element.exp
    gdb/testsuite/gdb.fortran/array-element.f
    gdb/testsuite/gdb.fortran/complex.exp
    gdb/testsuite/gdb.fortran/complex.f
    gdb/testsuite/gdb.fortran/derived-type.exp
    gdb/testsuite/gdb.fortran/derived-type.f90
    gdb/testsuite/gdb.fortran/exprs.exp
    gdb/testsuite/gdb.fortran/module.exp
    gdb/testsuite/gdb.fortran/module.f90
    gdb/testsuite/gdb.fortran/subarray.exp
    gdb/testsuite/gdb.fortran/subarray.f
    gdb/testsuite/gdb.fortran/types.exp
    gdb/testsuite/gdb.gdb/complaints.exp
    gdb/testsuite/gdb.gdb/observer.exp
    gdb/testsuite/gdb.gdb/selftest.exp
    gdb/testsuite/gdb.gdb/xfullpath.exp
    gdb/testsuite/gdb.hp/Makefile.in
    gdb/testsuite/gdb.hp/configure
    gdb/testsuite/gdb.hp/configure.ac
    gdb/testsuite/gdb.hp/gdb.aCC/Makefile.in
    gdb/testsuite/gdb.hp/gdb.aCC/configure
    gdb/testsuite/gdb.hp/gdb.aCC/configure.ac
    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.ac
    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.ac
    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/configure
    gdb/testsuite/gdb.hp/gdb.defects/configure.ac
    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.ac
    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/jmain.exp
    gdb/testsuite/gdb.java/jmain.java
    gdb/testsuite/gdb.java/jmisc.exp
    gdb/testsuite/gdb.java/jmisc.java
    gdb/testsuite/gdb.java/jprint.exp
    gdb/testsuite/gdb.java/jprint.java
    gdb/testsuite/gdb.java/jv-exp.exp
    gdb/testsuite/gdb.java/jv-print.exp
    gdb/testsuite/gdb.mi/ChangeLog-1999-2003
    gdb/testsuite/gdb.mi/Makefile.in
    gdb/testsuite/gdb.mi/array.f
    gdb/testsuite/gdb.mi/basics.c
    gdb/testsuite/gdb.mi/gdb2549.exp
    gdb/testsuite/gdb.mi/gdb669.exp
    gdb/testsuite/gdb.mi/gdb680.exp
    gdb/testsuite/gdb.mi/gdb701.c
    gdb/testsuite/gdb.mi/gdb701.exp
    gdb/testsuite/gdb.mi/gdb792.cc
    gdb/testsuite/gdb.mi/gdb792.exp
    gdb/testsuite/gdb.mi/mi-async.exp
    gdb/testsuite/gdb.mi/mi-basics.exp
    gdb/testsuite/gdb.mi/mi-break.exp
    gdb/testsuite/gdb.mi/mi-cli.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-file-transfer.exp
    gdb/testsuite/gdb.mi/mi-file.exp
    gdb/testsuite/gdb.mi/mi-hack-cli.exp
    gdb/testsuite/gdb.mi/mi-nonstop-exit.exp
    gdb/testsuite/gdb.mi/mi-nonstop.exp
    gdb/testsuite/gdb.mi/mi-nsintrall.exp
    gdb/testsuite/gdb.mi/mi-nsmoribund.exp
    gdb/testsuite/gdb.mi/mi-nsthrexec.exp
    gdb/testsuite/gdb.mi/mi-pending.c
    gdb/testsuite/gdb.mi/mi-pending.exp
    gdb/testsuite/gdb.mi/mi-pendshr.c
    gdb/testsuite/gdb.mi/mi-pthreads.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.c
    gdb/testsuite/gdb.mi/mi-stack.exp
    gdb/testsuite/gdb.mi/mi-stepi.exp
    gdb/testsuite/gdb.mi/mi-syn-frame.c
    gdb/testsuite/gdb.mi/mi-syn-frame.exp
    gdb/testsuite/gdb.mi/mi-until.exp
    gdb/testsuite/gdb.mi/mi-var-block.exp
    gdb/testsuite/gdb.mi/mi-var-child-f.exp
    gdb/testsuite/gdb.mi/mi-var-child.c
    gdb/testsuite/gdb.mi/mi-var-child.exp
    gdb/testsuite/gdb.mi/mi-var-cmd.exp
    gdb/testsuite/gdb.mi/mi-var-cp.cc
    gdb/testsuite/gdb.mi/mi-var-cp.exp
    gdb/testsuite/gdb.mi/mi-var-display.exp
    gdb/testsuite/gdb.mi/mi-var-invalidate.exp
    gdb/testsuite/gdb.mi/mi-watch.exp
    gdb/testsuite/gdb.mi/mi2-basics.exp
    gdb/testsuite/gdb.mi/mi2-break.exp
    gdb/testsuite/gdb.mi/mi2-cli.exp
    gdb/testsuite/gdb.mi/mi2-console.exp
    gdb/testsuite/gdb.mi/mi2-disassemble.exp
    gdb/testsuite/gdb.mi/mi2-eval.exp
    gdb/testsuite/gdb.mi/mi2-file.exp
    gdb/testsuite/gdb.mi/mi2-hack-cli.exp
    gdb/testsuite/gdb.mi/mi2-pthreads.exp
    gdb/testsuite/gdb.mi/mi2-read-memory.exp
    gdb/testsuite/gdb.mi/mi2-regs.exp
    gdb/testsuite/gdb.mi/mi2-return.exp
    gdb/testsuite/gdb.mi/mi2-simplerun.exp
    gdb/testsuite/gdb.mi/mi2-stack.exp
    gdb/testsuite/gdb.mi/mi2-stepi.exp
    gdb/testsuite/gdb.mi/mi2-syn-frame.exp
    gdb/testsuite/gdb.mi/mi2-until.exp
    gdb/testsuite/gdb.mi/mi2-var-block.exp
    gdb/testsuite/gdb.mi/mi2-var-child.exp
    gdb/testsuite/gdb.mi/mi2-var-cmd.exp
    gdb/testsuite/gdb.mi/mi2-var-display.exp
    gdb/testsuite/gdb.mi/mi2-watch.exp
    gdb/testsuite/gdb.mi/non-stop-exit.c
    gdb/testsuite/gdb.mi/non-stop.c
    gdb/testsuite/gdb.mi/nsintrall.c
    gdb/testsuite/gdb.mi/nsmoribund.c
    gdb/testsuite/gdb.mi/nsthrexec.c
    gdb/testsuite/gdb.mi/pthreads.c
    gdb/testsuite/gdb.mi/testcmds
    gdb/testsuite/gdb.mi/until.c
    gdb/testsuite/gdb.mi/var-cmd.c
    gdb/testsuite/gdb.modula2/Makefile.in
    gdb/testsuite/gdb.modula2/unbounded-array.exp
    gdb/testsuite/gdb.modula2/unbounded1.c
    gdb/testsuite/gdb.objc/Makefile.in
    gdb/testsuite/gdb.objc/basicclass.exp
    gdb/testsuite/gdb.objc/basicclass.m
    gdb/testsuite/gdb.objc/nondebug.exp
    gdb/testsuite/gdb.objc/nondebug.m
    gdb/testsuite/gdb.objc/objcdecode.exp
    gdb/testsuite/gdb.objc/objcdecode.m
    gdb/testsuite/gdb.opt/Makefile.in
    gdb/testsuite/gdb.opt/clobbered-registers-O2.c
    gdb/testsuite/gdb.opt/clobbered-registers-O2.exp
    gdb/testsuite/gdb.pascal/Makefile.in
    gdb/testsuite/gdb.pascal/floats.exp
    gdb/testsuite/gdb.pascal/floats.pas
    gdb/testsuite/gdb.pascal/hello.exp
    gdb/testsuite/gdb.pascal/hello.pas
    gdb/testsuite/gdb.pascal/integers.exp
    gdb/testsuite/gdb.pascal/integers.pas
    gdb/testsuite/gdb.pascal/types.exp
    gdb/testsuite/gdb.python/Makefile.in
    gdb/testsuite/gdb.python/python-cmd.exp
    gdb/testsuite/gdb.python/python-frame.c
    gdb/testsuite/gdb.python/python-frame.exp
    gdb/testsuite/gdb.python/python-function.exp
    gdb/testsuite/gdb.python/python-mi.exp
    gdb/testsuite/gdb.python/python-prettyprint.c
    gdb/testsuite/gdb.python/python-prettyprint.exp
    gdb/testsuite/gdb.python/python-prettyprint.py
    gdb/testsuite/gdb.python/python-template.cc
    gdb/testsuite/gdb.python/python-template.exp
    gdb/testsuite/gdb.python/python-value.c
    gdb/testsuite/gdb.python/python-value.exp
    gdb/testsuite/gdb.python/python.exp
    gdb/testsuite/gdb.reverse/Makefile.in
    gdb/testsuite/gdb.reverse/break-reverse.c
    gdb/testsuite/gdb.reverse/break-reverse.exp
    gdb/testsuite/gdb.reverse/consecutive-reverse.c
    gdb/testsuite/gdb.reverse/consecutive-reverse.exp
    gdb/testsuite/gdb.reverse/finish-reverse.c
    gdb/testsuite/gdb.reverse/finish-reverse.exp
    gdb/testsuite/gdb.reverse/machinestate.c
    gdb/testsuite/gdb.reverse/machinestate.exp
    gdb/testsuite/gdb.reverse/ms1.c
    gdb/testsuite/gdb.reverse/shr2.c
    gdb/testsuite/gdb.reverse/solib-reverse.c
    gdb/testsuite/gdb.reverse/solib-reverse.exp
    gdb/testsuite/gdb.reverse/step-reverse.c
    gdb/testsuite/gdb.reverse/step-reverse.exp
    gdb/testsuite/gdb.reverse/until-reverse.c
    gdb/testsuite/gdb.reverse/until-reverse.exp
    gdb/testsuite/gdb.reverse/ur1.c
    gdb/testsuite/gdb.reverse/watch-reverse.c
    gdb/testsuite/gdb.reverse/watch-reverse.exp
    gdb/testsuite/gdb.server/Makefile.in
    gdb/testsuite/gdb.server/ext-attach.c
    gdb/testsuite/gdb.server/ext-attach.exp
    gdb/testsuite/gdb.server/ext-run.exp
    gdb/testsuite/gdb.server/file-transfer.exp
    gdb/testsuite/gdb.server/server-mon.exp
    gdb/testsuite/gdb.server/server-run.exp
    gdb/testsuite/gdb.server/server.c
    gdb/testsuite/gdb.server/transfer.txt
    gdb/testsuite/gdb.stabs/Makefile.in
    gdb/testsuite/gdb.stabs/aout.sed
    gdb/testsuite/gdb.stabs/configure
    gdb/testsuite/gdb.stabs/configure.ac
    gdb/testsuite/gdb.stabs/ecoff.sed
    gdb/testsuite/gdb.stabs/exclfwd.exp
    gdb/testsuite/gdb.stabs/exclfwd.h
    gdb/testsuite/gdb.stabs/exclfwd1.c
    gdb/testsuite/gdb.stabs/exclfwd2.c
    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/attach-into-signal.c
    gdb/testsuite/gdb.threads/attach-into-signal.exp
    gdb/testsuite/gdb.threads/attach-stopped.c
    gdb/testsuite/gdb.threads/attach-stopped.exp
    gdb/testsuite/gdb.threads/attachstop-mt.c
    gdb/testsuite/gdb.threads/attachstop-mt.exp
    gdb/testsuite/gdb.threads/bp_in_thread.c
    gdb/testsuite/gdb.threads/bp_in_thread.exp
    gdb/testsuite/gdb.threads/execl.c
    gdb/testsuite/gdb.threads/execl.exp
    gdb/testsuite/gdb.threads/execl1.c
    gdb/testsuite/gdb.threads/fork-child-threads.c
    gdb/testsuite/gdb.threads/fork-child-threads.exp
    gdb/testsuite/gdb.threads/fork-thread-pending.c
    gdb/testsuite/gdb.threads/fork-thread-pending.exp
    gdb/testsuite/gdb.threads/gcore-thread.exp
    gdb/testsuite/gdb.threads/hand-call-in-threads.c
    gdb/testsuite/gdb.threads/hand-call-in-threads.exp
    gdb/testsuite/gdb.threads/interrupted-hand-call.c
    gdb/testsuite/gdb.threads/interrupted-hand-call.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/manythreads.c
    gdb/testsuite/gdb.threads/manythreads.exp
    gdb/testsuite/gdb.threads/multi-create.c
    gdb/testsuite/gdb.threads/multi-create.exp
    gdb/testsuite/gdb.threads/pending-step.c
    gdb/testsuite/gdb.threads/pending-step.exp
    gdb/testsuite/gdb.threads/print-threads.c
    gdb/testsuite/gdb.threads/print-threads.exp
    gdb/testsuite/gdb.threads/pthread_cond_wait.c
    gdb/testsuite/gdb.threads/pthread_cond_wait.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/sigthread.c
    gdb/testsuite/gdb.threads/sigthread.exp
    gdb/testsuite/gdb.threads/staticthreads.c
    gdb/testsuite/gdb.threads/staticthreads.exp
    gdb/testsuite/gdb.threads/step.c
    gdb/testsuite/gdb.threads/step.exp
    gdb/testsuite/gdb.threads/step2.exp
    gdb/testsuite/gdb.threads/switch-threads.c
    gdb/testsuite/gdb.threads/switch-threads.exp
    gdb/testsuite/gdb.threads/thread-execl.c
    gdb/testsuite/gdb.threads/thread-execl.exp
    gdb/testsuite/gdb.threads/thread-specific.c
    gdb/testsuite/gdb.threads/thread-specific.exp
    gdb/testsuite/gdb.threads/thread-unwindonsignal.exp
    gdb/testsuite/gdb.threads/thread_check.c
    gdb/testsuite/gdb.threads/thread_check.exp
    gdb/testsuite/gdb.threads/thread_events.c
    gdb/testsuite/gdb.threads/thread_events.exp
    gdb/testsuite/gdb.threads/threadapply.c
    gdb/testsuite/gdb.threads/threadapply.exp
    gdb/testsuite/gdb.threads/threxit-hop-specific.c
    gdb/testsuite/gdb.threads/threxit-hop-specific.exp
    gdb/testsuite/gdb.threads/tls-main.c
    gdb/testsuite/gdb.threads/tls-nodebug.c
    gdb/testsuite/gdb.threads/tls-nodebug.exp
    gdb/testsuite/gdb.threads/tls-shared.c
    gdb/testsuite/gdb.threads/tls-shared.exp
    gdb/testsuite/gdb.threads/tls.c
    gdb/testsuite/gdb.threads/tls.exp
    gdb/testsuite/gdb.threads/tls2.c
    gdb/testsuite/gdb.threads/watchthreads.c
    gdb/testsuite/gdb.threads/watchthreads.exp
    gdb/testsuite/gdb.threads/watchthreads2.c
    gdb/testsuite/gdb.threads/watchthreads2.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/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/gdb.xml/Makefile.in
    gdb/testsuite/gdb.xml/bad-include.xml
    gdb/testsuite/gdb.xml/core-only.xml
    gdb/testsuite/gdb.xml/extra-regs.xml
    gdb/testsuite/gdb.xml/inc-2.xml
    gdb/testsuite/gdb.xml/inc-body.xml
    gdb/testsuite/gdb.xml/includes.xml
    gdb/testsuite/gdb.xml/loop.xml
    gdb/testsuite/gdb.xml/single-reg.xml
    gdb/testsuite/gdb.xml/tdesc-arch.exp
    gdb/testsuite/gdb.xml/tdesc-bogus.xml
    gdb/testsuite/gdb.xml/tdesc-errors.exp
    gdb/testsuite/gdb.xml/tdesc-regs.exp
    gdb/testsuite/gdb.xml/tdesc-unknown.xml
    gdb/testsuite/gdb.xml/tdesc-xinclude.exp
    gdb/testsuite/gdb.xml/trivial.xml
    gdb/testsuite/lib/ada.exp
    gdb/testsuite/lib/compiler.c
    gdb/testsuite/lib/compiler.cc
    gdb/testsuite/lib/cp-support.exp
    gdb/testsuite/lib/emc-support.exp
    gdb/testsuite/lib/gdb.exp
    gdb/testsuite/lib/gdbserver-support.exp
    gdb/testsuite/lib/java.exp
    gdb/testsuite/lib/mi-support.exp
    gdb/testsuite/lib/pascal.exp
    gdb/testsuite/lib/set_unbuffered_mode.c
    gdb/testsuite/lib/trace-support.exp
    gdb/thread.c
    gdb/top.c
    gdb/top.h
    gdb/tracepoint.c
    gdb/tracepoint.h
    gdb/trad-frame.c
    gdb/trad-frame.h
    gdb/tramp-frame.c
    gdb/tramp-frame.h
    gdb/tui/ChangeLog-1998-2003
    gdb/tui/tui-command.c
    gdb/tui/tui-command.h
    gdb/tui/tui-data.c
    gdb/tui/tui-data.h
    gdb/tui/tui-disasm.c
    gdb/tui/tui-disasm.h
    gdb/tui/tui-file.c
    gdb/tui/tui-file.h
    gdb/tui/tui-hooks.c
    gdb/tui/tui-hooks.h
    gdb/tui/tui-interp.c
    gdb/tui/tui-io.c
    gdb/tui/tui-io.h
    gdb/tui/tui-layout.c
    gdb/tui/tui-layout.h
    gdb/tui/tui-main.c
    gdb/tui/tui-out.c
    gdb/tui/tui-regs.c
    gdb/tui/tui-regs.h
    gdb/tui/tui-source.c
    gdb/tui/tui-source.h
    gdb/tui/tui-stack.c
    gdb/tui/tui-stack.h
    gdb/tui/tui-win.c
    gdb/tui/tui-win.h
    gdb/tui/tui-windata.c
    gdb/tui/tui-windata.h
    gdb/tui/tui-wingeneral.c
    gdb/tui/tui-wingeneral.h
    gdb/tui/tui-winsource.c
    gdb/tui/tui-winsource.h
    gdb/tui/tui.c
    gdb/tui/tui.h
    gdb/typeprint.c
    gdb/typeprint.h
    gdb/ui-file.c
    gdb/ui-file.h
    gdb/ui-out.c
    gdb/ui-out.h
    gdb/user-regs.c
    gdb/user-regs.h
    gdb/utils.c
    gdb/v850-tdep.c
    gdb/valarith.c
    gdb/valops.c
    gdb/valprint.c
    gdb/valprint.h
    gdb/value.c
    gdb/value.h
    gdb/varobj.c
    gdb/varobj.h
    gdb/vax-nat.c
    gdb/vax-tdep.c
    gdb/vax-tdep.h
    gdb/vaxbsd-nat.c
    gdb/vaxnbsd-tdep.c
    gdb/vaxobsd-tdep.c
    gdb/vec.c
    gdb/vec.h
    gdb/version.h
    gdb/version.in
    gdb/windows-nat.c
    gdb/windows-nat.h
    gdb/windows-tdep.c
    gdb/windows-tdep.h
    gdb/windows-termcap.c
    gdb/wrapper.c
    gdb/wrapper.h
    gdb/xcoffread.c
    gdb/xcoffread.h
    gdb/xcoffsolib.c
    gdb/xcoffsolib.h
    gdb/xml-support.c
    gdb/xml-support.h
    gdb/xml-tdesc.c
    gdb/xml-tdesc.h
    gdb/xstormy16-tdep.c
    gdb/xtensa-config.c
    gdb/xtensa-linux-nat.c
    gdb/xtensa-linux-tdep.c
    gdb/xtensa-tdep.c
    gdb/xtensa-tdep.h
    gdb/xtensa-xtregs.c
    libdecnumber/ChangeLog
    libdecnumber/Makefile.in
    libdecnumber/aclocal.m4
    libdecnumber/bid/bid-dpd.h
    libdecnumber/bid/bid2dpd_dpd2bid.c
    libdecnumber/bid/bid2dpd_dpd2bid.h
    libdecnumber/bid/decimal128.c
    libdecnumber/bid/decimal128.h
    libdecnumber/bid/decimal128Local.h
    libdecnumber/bid/decimal128Symbols.h
    libdecnumber/bid/decimal32.c
    libdecnumber/bid/decimal32.h
    libdecnumber/bid/decimal32Symbols.h
    libdecnumber/bid/decimal64.c
    libdecnumber/bid/decimal64.h
    libdecnumber/bid/decimal64Symbols.h
    libdecnumber/bid/host-ieee128.c
    libdecnumber/bid/host-ieee32.c
    libdecnumber/bid/host-ieee64.c
    libdecnumber/config.in
    libdecnumber/configure
    libdecnumber/configure.ac
    libdecnumber/dconfig.h
    libdecnumber/decBasic.c
    libdecnumber/decCommon.c
    libdecnumber/decCommonSymbols.h
    libdecnumber/decContext.c
    libdecnumber/decContext.h
    libdecnumber/decContextSymbols.h
    libdecnumber/decDPD.h
    libdecnumber/decDPDSymbols.h
    libdecnumber/decDouble.c
    libdecnumber/decDouble.h
    libdecnumber/decDoubleSymbols.h
    libdecnumber/decExcept.c
    libdecnumber/decExcept.h
    libdecnumber/decLibrary.c
    libdecnumber/decNumber.c
    libdecnumber/decNumber.h
    libdecnumber/decNumberLocal.h
    libdecnumber/decNumberSymbols.h
    libdecnumber/decPacked.c
    libdecnumber/decPacked.h
    libdecnumber/decPackedSymbols.h
    libdecnumber/decQuad.c
    libdecnumber/decQuad.h
    libdecnumber/decQuadSymbols.h
    libdecnumber/decRound.c
    libdecnumber/decRound.h
    libdecnumber/decSingle.c
    libdecnumber/decSingle.h
    libdecnumber/decSingleSymbols.h
    libdecnumber/dpd/decimal128.c
    libdecnumber/dpd/decimal128.h
    libdecnumber/dpd/decimal128Local.h
    libdecnumber/dpd/decimal128Symbols.h
    libdecnumber/dpd/decimal32.c
    libdecnumber/dpd/decimal32.h
    libdecnumber/dpd/decimal32Symbols.h
    libdecnumber/dpd/decimal64.c
    libdecnumber/dpd/decimal64.h
    libdecnumber/dpd/decimal64Symbols.h
    readline/CHANGELOG
    readline/CHANGES
    readline/COPYING
    readline/ChangeLog.gdb
    readline/INSTALL
    readline/MANIFEST
    readline/Makefile.in
    readline/NEWS
    readline/README
    readline/USAGE
    readline/aclocal.m4
    readline/ansi_stdlib.h
    readline/bind.c
    readline/callback.c
    readline/chardefs.h
    readline/compat.c
    readline/complete.c
    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/fdl.texi
    readline/doc/history.3
    readline/doc/history.texi
    readline/doc/hstech.texi
    readline/doc/hsuser.texi
    readline/doc/inc-hist.texinfo
    readline/doc/readline.3
    readline/doc/rlman.texi
    readline/doc/rltech.texi
    readline/doc/rluser.texi
    readline/doc/rluserman.texi
    readline/doc/texi2dvi
    readline/doc/texi2html
    readline/doc/version.texi
    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/readlinebuf.h
    readline/examples/rl-fgets.c
    readline/examples/rl.c
    readline/examples/rlcat.c
    readline/examples/rlfe/ChangeLog
    readline/examples/rlfe/Makefile.in
    readline/examples/rlfe/README
    readline/examples/rlfe/config.h.in
    readline/examples/rlfe/configure
    readline/examples/rlfe/configure.in
    readline/examples/rlfe/extern.h
    readline/examples/rlfe/os.h
    readline/examples/rlfe/pty.c
    readline/examples/rlfe/rlfe.c
    readline/examples/rlfe/screen.h
    readline/examples/rlptytest.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/mbutil.c
    readline/misc.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/rlmbutil.h
    readline/rlprivate.h
    readline/rlshell.h
    readline/rlstdc.h
    readline/rltty.c
    readline/rltty.h
    readline/rltypedefs.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.rpath
    readline/support/config.sub
    readline/support/install.sh
    readline/support/mkdirs
    readline/support/mkdist
    readline/support/mkinstalldirs
    readline/support/shlib-install
    readline/support/shobj-conf
    readline/support/wcwidth.c
    readline/tcap.h
    readline/terminal.c
    readline/text.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
    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.ac
    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/iwmmxt.c
    sim/arm/iwmmxt.h
    sim/arm/kid.c
    sim/arm/main.c
    sim/arm/maverick.c
    sim/arm/parent.c
    sim/arm/tconfig.in
    sim/arm/thumbemu.c
    sim/arm/wrapper.c
    sim/avr/Makefile.in
    sim/avr/config.in
    sim/avr/configure
    sim/avr/configure.ac
    sim/avr/interp.c
    sim/common/ChangeLog
    sim/common/Make-common.in
    sim/common/Makefile.in
    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/common.m4
    sim/common/config.in
    sim/common/configure
    sim/common/configure.ac
    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-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/common/version.h
    sim/configure
    sim/configure.ac
    sim/cr16/ChangeLog
    sim/cr16/Makefile.in
    sim/cr16/config.in
    sim/cr16/configure
    sim/cr16/configure.ac
    sim/cr16/cr16_sim.h
    sim/cr16/endian.c
    sim/cr16/gencode.c
    sim/cr16/interp.c
    sim/cr16/simops.c
    sim/cris/Makefile.in
    sim/cris/arch.c
    sim/cris/arch.h
    sim/cris/config.in
    sim/cris/configure
    sim/cris/configure.ac
    sim/cris/cpuall.h
    sim/cris/cpuv10.c
    sim/cris/cpuv10.h
    sim/cris/cpuv32.c
    sim/cris/cpuv32.h
    sim/cris/cris-desc.c
    sim/cris/cris-desc.h
    sim/cris/cris-opc.h
    sim/cris/cris-sim.h
    sim/cris/cris-tmpl.c
    sim/cris/crisv10f.c
    sim/cris/crisv32f.c
    sim/cris/decodev10.c
    sim/cris/decodev10.h
    sim/cris/decodev32.c
    sim/cris/decodev32.h
    sim/cris/devices.c
    sim/cris/dv-cris.c
    sim/cris/dv-rv.c
    sim/cris/mloop.in
    sim/cris/modelv10.c
    sim/cris/modelv32.c
    sim/cris/rvdummy.c
    sim/cris/semcrisv10f-switch.c
    sim/cris/semcrisv32f-switch.c
    sim/cris/sim-if.c
    sim/cris/sim-main.h
    sim/cris/tconfig.in
    sim/cris/traps.c
    sim/d10v/ChangeLog
    sim/d10v/Makefile.in
    sim/d10v/config.in
    sim/d10v/configure
    sim/d10v/configure.ac
    sim/d10v/d10v_sim.h
    sim/d10v/endian.c
    sim/d10v/gencode.c
    sim/d10v/interp.c
    sim/d10v/simops.c
    sim/erc32/ChangeLog
    sim/erc32/Makefile.in
    sim/erc32/NEWS
    sim/erc32/README.erc32
    sim/erc32/README.gdb
    sim/erc32/README.sis
    sim/erc32/config.in
    sim/erc32/configure
    sim/erc32/configure.ac
    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/frv/ChangeLog
    sim/frv/Makefile.in
    sim/frv/README
    sim/frv/TODO
    sim/frv/arch.c
    sim/frv/arch.h
    sim/frv/cache.c
    sim/frv/cache.h
    sim/frv/config.in
    sim/frv/configure
    sim/frv/configure.ac
    sim/frv/cpu.c
    sim/frv/cpu.h
    sim/frv/cpuall.h
    sim/frv/decode.c
    sim/frv/decode.h
    sim/frv/devices.c
    sim/frv/frv-sim.h
    sim/frv/frv.c
    sim/frv/interrupts.c
    sim/frv/memory.c
    sim/frv/mloop.in
    sim/frv/model.c
    sim/frv/options.c
    sim/frv/pipeline.c
    sim/frv/profile-fr400.c
    sim/frv/profile-fr400.h
    sim/frv/profile-fr450.c
    sim/frv/profile-fr500.c
    sim/frv/profile-fr500.h
    sim/frv/profile-fr550.c
    sim/frv/profile-fr550.h
    sim/frv/profile.c
    sim/frv/profile.h
    sim/frv/registers.c
    sim/frv/registers.h
    sim/frv/reset.c
    sim/frv/sem.c
    sim/frv/sim-if.c
    sim/frv/sim-main.h
    sim/frv/tconfig.in
    sim/frv/traps.c
    sim/h8300/ChangeLog
    sim/h8300/Makefile.in
    sim/h8300/compile.c
    sim/h8300/config.in
    sim/h8300/configure
    sim/h8300/configure.ac
    sim/h8300/inst.h
    sim/h8300/sim-main.h
    sim/h8300/tconfig.in
    sim/h8300/writecode.c
    sim/igen/ChangeLog
    sim/igen/Makefile.in
    sim/igen/compare_igen_models
    sim/igen/config.in
    sim/igen/configure
    sim/igen/configure.ac
    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/iq2000/ChangeLog
    sim/iq2000/Makefile.in
    sim/iq2000/arch.c
    sim/iq2000/arch.h
    sim/iq2000/config.in
    sim/iq2000/configure
    sim/iq2000/configure.ac
    sim/iq2000/cpu.c
    sim/iq2000/cpu.h
    sim/iq2000/cpuall.h
    sim/iq2000/decode.c
    sim/iq2000/decode.h
    sim/iq2000/iq2000-sim.h
    sim/iq2000/iq2000.c
    sim/iq2000/mloop.in
    sim/iq2000/model.c
    sim/iq2000/sem-switch.c
    sim/iq2000/sem.c
    sim/iq2000/sim-if.c
    sim/iq2000/sim-main.h
    sim/iq2000/tconfig.in
    sim/lm32/ChangeLog
    sim/lm32/Makefile.in
    sim/lm32/arch.c
    sim/lm32/arch.h
    sim/lm32/config.in
    sim/lm32/configure
    sim/lm32/configure.ac
    sim/lm32/cpu.c
    sim/lm32/cpu.h
    sim/lm32/cpuall.h
    sim/lm32/decode.c
    sim/lm32/decode.h
    sim/lm32/dv-lm32cpu.c
    sim/lm32/dv-lm32timer.c
    sim/lm32/dv-lm32uart.c
    sim/lm32/lm32-sim.h
    sim/lm32/lm32.c
    sim/lm32/mloop.in
    sim/lm32/model.c
    sim/lm32/sem-switch.c
    sim/lm32/sem.c
    sim/lm32/sim-if.c
    sim/lm32/sim-main.h
    sim/lm32/tconfig.in
    sim/lm32/traps.c
    sim/lm32/user.c
    sim/m32c/ChangeLog
    sim/m32c/Makefile.in
    sim/m32c/blinky.S
    sim/m32c/config.in
    sim/m32c/configure
    sim/m32c/configure.in
    sim/m32c/cpu.h
    sim/m32c/gdb-if.c
    sim/m32c/gloss.S
    sim/m32c/int.c
    sim/m32c/int.h
    sim/m32c/load.c
    sim/m32c/load.h
    sim/m32c/m32c.opc
    sim/m32c/main.c
    sim/m32c/mem.c
    sim/m32c/mem.h
    sim/m32c/misc.c
    sim/m32c/misc.h
    sim/m32c/opc2c.c
    sim/m32c/r8c.opc
    sim/m32c/reg.c
    sim/m32c/safe-fgets.c
    sim/m32c/safe-fgets.h
    sim/m32c/sample.S
    sim/m32c/sample.ld
    sim/m32c/sample2.c
    sim/m32c/srcdest.c
    sim/m32c/syscall.h
    sim/m32c/syscalls.c
    sim/m32c/syscalls.h
    sim/m32c/timer_a.h
    sim/m32c/trace.c
    sim/m32c/trace.h
    sim/m32r/ChangeLog
    sim/m32r/Makefile.in
    sim/m32r/README
    sim/m32r/TODO
    sim/m32r/arch.c
    sim/m32r/arch.h
    sim/m32r/config.in
    sim/m32r/configure
    sim/m32r/configure.ac
    sim/m32r/cpu.c
    sim/m32r/cpu.h
    sim/m32r/cpu2.c
    sim/m32r/cpu2.h
    sim/m32r/cpuall.h
    sim/m32r/cpux.c
    sim/m32r/cpux.h
    sim/m32r/decode.c
    sim/m32r/decode.h
    sim/m32r/decode2.c
    sim/m32r/decode2.h
    sim/m32r/decodex.c
    sim/m32r/decodex.h
    sim/m32r/devices.c
    sim/m32r/m32r-sim.h
    sim/m32r/m32r.c
    sim/m32r/m32r2.c
    sim/m32r/m32rx.c
    sim/m32r/mloop.in
    sim/m32r/mloop2.in
    sim/m32r/mloopx.in
    sim/m32r/model.c
    sim/m32r/model2.c
    sim/m32r/modelx.c
    sim/m32r/sem-switch.c
    sim/m32r/sem.c
    sim/m32r/sem2-switch.c
    sim/m32r/semx-switch.c
    sim/m32r/sim-if.c
    sim/m32r/sim-main.h
    sim/m32r/syscall.h
    sim/m32r/tconfig.in
    sim/m32r/traps-linux.c
    sim/m32r/traps.c
    sim/m68hc11/ChangeLog
    sim/m68hc11/Makefile.in
    sim/m68hc11/config.in
    sim/m68hc11/configure
    sim/m68hc11/configure.ac
    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.ac
    sim/mcore/interp.c
    sim/mcore/sysdep.h
    sim/mips/ChangeLog
    sim/mips/Makefile.in
    sim/mips/config.in
    sim/mips/configure
    sim/mips/configure.ac
    sim/mips/cp1.c
    sim/mips/cp1.h
    sim/mips/dsp.c
    sim/mips/dsp.igen
    sim/mips/dsp2.igen
    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/m16e.igen
    sim/mips/m16run.c
    sim/mips/mdmx.c
    sim/mips/mdmx.igen
    sim/mips/mips.dc
    sim/mips/mips.igen
    sim/mips/mips3264r2.igen
    sim/mips/mips3d.igen
    sim/mips/sb1.igen
    sim/mips/sim-main.c
    sim/mips/sim-main.h
    sim/mips/smartmips.igen
    sim/mips/tconfig.in
    sim/mips/tx.igen
    sim/mips/vr.igen
    sim/mn10300/ChangeLog
    sim/mn10300/Makefile.in
    sim/mn10300/am33-2.igen
    sim/mn10300/am33.igen
    sim/mn10300/config.in
    sim/mn10300/configure
    sim/mn10300/configure.ac
    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/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/tconfig.in
    sim/moxie/ChangeLog
    sim/moxie/Makefile.in
    sim/moxie/config.in
    sim/moxie/configure
    sim/moxie/configure.ac
    sim/moxie/interp.c
    sim/moxie/sysdep.h
    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/aclocal.m4
    sim/ppc/altivec.igen
    sim/ppc/altivec_expression.h
    sim/ppc/altivec_registers.h
    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.ac
    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/e500.igen
    sim/ppc/e500_expression.h
    sim/ppc/e500_registers.h
    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/gdb-sim.c
    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_sem.c
    sim/ppc/hw_shm.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-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/config.in
    sim/sh/configure
    sim/sh/configure.ac
    sim/sh/gencode.c
    sim/sh/interp.c
    sim/sh/syscall.h
    sim/sh/tconfig.in
    sim/sh64/ChangeLog
    sim/sh64/Makefile.in
    sim/sh64/arch.c
    sim/sh64/arch.h
    sim/sh64/config.in
    sim/sh64/configure
    sim/sh64/configure.ac
    sim/sh64/cpu.c
    sim/sh64/cpu.h
    sim/sh64/cpuall.h
    sim/sh64/decode-compact.c
    sim/sh64/decode-compact.h
    sim/sh64/decode-media.c
    sim/sh64/decode-media.h
    sim/sh64/decode.h
    sim/sh64/defs-compact.h
    sim/sh64/defs-media.h
    sim/sh64/eng-compact.h
    sim/sh64/eng-media.h
    sim/sh64/eng.h
    sim/sh64/mloop-compact.c
    sim/sh64/mloop-media.c
    sim/sh64/sem-compact-switch.c
    sim/sh64/sem-compact.c
    sim/sh64/sem-media-switch.c
    sim/sh64/sem-media.c
    sim/sh64/sh-desc.c
    sim/sh64/sh-desc.h
    sim/sh64/sh-opc.h
    sim/sh64/sh64-sim.h
    sim/sh64/sh64.c
    sim/sh64/sim-if.c
    sim/sh64/sim-main.h
    sim/sh64/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.ac
    sim/testsuite/d10v-elf/ChangeLog
    sim/testsuite/d10v-elf/Makefile.in
    sim/testsuite/d10v-elf/configure
    sim/testsuite/d10v-elf/configure.ac
    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/frv-elf/ChangeLog
    sim/testsuite/frv-elf/Makefile.in
    sim/testsuite/frv-elf/cache.s
    sim/testsuite/frv-elf/configure
    sim/testsuite/frv-elf/configure.ac
    sim/testsuite/frv-elf/exit47.s
    sim/testsuite/frv-elf/grloop.s
    sim/testsuite/frv-elf/hello.s
    sim/testsuite/frv-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.ac
    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.ac
    sim/testsuite/sim/arm/adc.cgs
    sim/testsuite/sim/arm/add.cgs
    sim/testsuite/sim/arm/allinsn.exp
    sim/testsuite/sim/arm/and.cgs
    sim/testsuite/sim/arm/b.cgs
    sim/testsuite/sim/arm/bic.cgs
    sim/testsuite/sim/arm/bl.cgs
    sim/testsuite/sim/arm/bx.cgs
    sim/testsuite/sim/arm/cmn.cgs
    sim/testsuite/sim/arm/cmp.cgs
    sim/testsuite/sim/arm/eor.cgs
    sim/testsuite/sim/arm/hello.ms
    sim/testsuite/sim/arm/iwmmxt/iwmmxt.exp
    sim/testsuite/sim/arm/iwmmxt/tbcst.cgs
    sim/testsuite/sim/arm/iwmmxt/testutils.inc
    sim/testsuite/sim/arm/iwmmxt/textrm.cgs
    sim/testsuite/sim/arm/iwmmxt/tinsr.cgs
    sim/testsuite/sim/arm/iwmmxt/tmia.cgs
    sim/testsuite/sim/arm/iwmmxt/tmiaph.cgs
    sim/testsuite/sim/arm/iwmmxt/tmiaxy.cgs
    sim/testsuite/sim/arm/iwmmxt/tmovmsk.cgs
    sim/testsuite/sim/arm/iwmmxt/wacc.cgs
    sim/testsuite/sim/arm/iwmmxt/wadd.cgs
    sim/testsuite/sim/arm/iwmmxt/waligni.cgs
    sim/testsuite/sim/arm/iwmmxt/walignr.cgs
    sim/testsuite/sim/arm/iwmmxt/wand.cgs
    sim/testsuite/sim/arm/iwmmxt/wandn.cgs
    sim/testsuite/sim/arm/iwmmxt/wavg2.cgs
    sim/testsuite/sim/arm/iwmmxt/wcmpeq.cgs
    sim/testsuite/sim/arm/iwmmxt/wcmpgt.cgs
    sim/testsuite/sim/arm/iwmmxt/wmac.cgs
    sim/testsuite/sim/arm/iwmmxt/wmadd.cgs
    sim/testsuite/sim/arm/iwmmxt/wmax.cgs
    sim/testsuite/sim/arm/iwmmxt/wmin.cgs
    sim/testsuite/sim/arm/iwmmxt/wmov.cgs
    sim/testsuite/sim/arm/iwmmxt/wmul.cgs
    sim/testsuite/sim/arm/iwmmxt/wor.cgs
    sim/testsuite/sim/arm/iwmmxt/wpack.cgs
    sim/testsuite/sim/arm/iwmmxt/wror.cgs
    sim/testsuite/sim/arm/iwmmxt/wsad.cgs
    sim/testsuite/sim/arm/iwmmxt/wshufh.cgs
    sim/testsuite/sim/arm/iwmmxt/wsll.cgs
    sim/testsuite/sim/arm/iwmmxt/wsra.cgs
    sim/testsuite/sim/arm/iwmmxt/wsrl.cgs
    sim/testsuite/sim/arm/iwmmxt/wsub.cgs
    sim/testsuite/sim/arm/iwmmxt/wunpckeh.cgs
    sim/testsuite/sim/arm/iwmmxt/wunpckel.cgs
    sim/testsuite/sim/arm/iwmmxt/wunpckih.cgs
    sim/testsuite/sim/arm/iwmmxt/wunpckil.cgs
    sim/testsuite/sim/arm/iwmmxt/wxor.cgs
    sim/testsuite/sim/arm/iwmmxt/wzero.cgs
    sim/testsuite/sim/arm/ldm.cgs
    sim/testsuite/sim/arm/ldr.cgs
    sim/testsuite/sim/arm/ldrb.cgs
    sim/testsuite/sim/arm/ldrh.cgs
    sim/testsuite/sim/arm/ldrsb.cgs
    sim/testsuite/sim/arm/ldrsh.cgs
    sim/testsuite/sim/arm/misaligned1.ms
    sim/testsuite/sim/arm/misaligned2.ms
    sim/testsuite/sim/arm/misaligned3.ms
    sim/testsuite/sim/arm/misc.exp
    sim/testsuite/sim/arm/mla.cgs
    sim/testsuite/sim/arm/mov.cgs
    sim/testsuite/sim/arm/mrs.cgs
    sim/testsuite/sim/arm/msr.cgs
    sim/testsuite/sim/arm/mul.cgs
    sim/testsuite/sim/arm/mvn.cgs
    sim/testsuite/sim/arm/orr.cgs
    sim/testsuite/sim/arm/rsb.cgs
    sim/testsuite/sim/arm/rsc.cgs
    sim/testsuite/sim/arm/sbc.cgs
    sim/testsuite/sim/arm/smlal.cgs
    sim/testsuite/sim/arm/smull.cgs
    sim/testsuite/sim/arm/stm.cgs
    sim/testsuite/sim/arm/str.cgs
    sim/testsuite/sim/arm/strb.cgs
    sim/testsuite/sim/arm/strh.cgs
    sim/testsuite/sim/arm/sub.cgs
    sim/testsuite/sim/arm/swi.cgs
    sim/testsuite/sim/arm/swp.cgs
    sim/testsuite/sim/arm/swpb.cgs
    sim/testsuite/sim/arm/teq.cgs
    sim/testsuite/sim/arm/testutils.inc
    sim/testsuite/sim/arm/thumb/adc.cgs
    sim/testsuite/sim/arm/thumb/add-hd-hs.cgs
    sim/testsuite/sim/arm/thumb/add-hd-rs.cgs
    sim/testsuite/sim/arm/thumb/add-rd-hs.cgs
    sim/testsuite/sim/arm/thumb/add-sp.cgs
    sim/testsuite/sim/arm/thumb/add.cgs
    sim/testsuite/sim/arm/thumb/addi.cgs
    sim/testsuite/sim/arm/thumb/addi8.cgs
    sim/testsuite/sim/arm/thumb/allthumb.exp
    sim/testsuite/sim/arm/thumb/and.cgs
    sim/testsuite/sim/arm/thumb/asr.cgs
    sim/testsuite/sim/arm/thumb/b.cgs
    sim/testsuite/sim/arm/thumb/bcc.cgs
    sim/testsuite/sim/arm/thumb/bcs.cgs
    sim/testsuite/sim/arm/thumb/beq.cgs
    sim/testsuite/sim/arm/thumb/bge.cgs
    sim/testsuite/sim/arm/thumb/bgt.cgs
    sim/testsuite/sim/arm/thumb/bhi.cgs
    sim/testsuite/sim/arm/thumb/bic.cgs
    sim/testsuite/sim/arm/thumb/bl-hi.cgs
    sim/testsuite/sim/arm/thumb/bl-lo.cgs
    sim/testsuite/sim/arm/thumb/ble.cgs
    sim/testsuite/sim/arm/thumb/bls.cgs
    sim/testsuite/sim/arm/thumb/blt.cgs
    sim/testsuite/sim/arm/thumb/bmi.cgs
    sim/testsuite/sim/arm/thumb/bne.cgs
    sim/testsuite/sim/arm/thumb/bpl.cgs
    sim/testsuite/sim/arm/thumb/bvc.cgs
    sim/testsuite/sim/arm/thumb/bvs.cgs
    sim/testsuite/sim/arm/thumb/bx-hs.cgs
    sim/testsuite/sim/arm/thumb/bx-rs.cgs
    sim/testsuite/sim/arm/thumb/cmn.cgs
    sim/testsuite/sim/arm/thumb/cmp-hd-hs.cgs
    sim/testsuite/sim/arm/thumb/cmp-hd-rs.cgs
    sim/testsuite/sim/arm/thumb/cmp-rd-hs.cgs
    sim/testsuite/sim/arm/thumb/cmp.cgs
    sim/testsuite/sim/arm/thumb/eor.cgs
    sim/testsuite/sim/arm/thumb/lda-pc.cgs
    sim/testsuite/sim/arm/thumb/lda-sp.cgs
    sim/testsuite/sim/arm/thumb/ldmia.cgs
    sim/testsuite/sim/arm/thumb/ldr-imm.cgs
    sim/testsuite/sim/arm/thumb/ldr-pc.cgs
    sim/testsuite/sim/arm/thumb/ldr-sprel.cgs
    sim/testsuite/sim/arm/thumb/ldr.cgs
    sim/testsuite/sim/arm/thumb/ldrb-imm.cgs
    sim/testsuite/sim/arm/thumb/ldrb.cgs
    sim/testsuite/sim/arm/thumb/ldrh-imm.cgs
    sim/testsuite/sim/arm/thumb/ldrh.cgs
    sim/testsuite/sim/arm/thumb/ldsb.cgs
    sim/testsuite/sim/arm/thumb/ldsh.cgs
    sim/testsuite/sim/arm/thumb/lsl.cgs
    sim/testsuite/sim/arm/thumb/lsr.cgs
    sim/testsuite/sim/arm/thumb/mov-hd-hs.cgs
    sim/testsuite/sim/arm/thumb/mov-hd-rs.cgs
    sim/testsuite/sim/arm/thumb/mov-rd-hs.cgs
    sim/testsuite/sim/arm/thumb/mov.cgs
    sim/testsuite/sim/arm/thumb/mul.cgs
    sim/testsuite/sim/arm/thumb/mvn.cgs
    sim/testsuite/sim/arm/thumb/neg.cgs
    sim/testsuite/sim/arm/thumb/orr.cgs
    sim/testsuite/sim/arm/thumb/pop-pc.cgs
    sim/testsuite/sim/arm/thumb/pop.cgs
    sim/testsuite/sim/arm/thumb/push-lr.cgs
    sim/testsuite/sim/arm/thumb/push.cgs
    sim/testsuite/sim/arm/thumb/ror.cgs
    sim/testsuite/sim/arm/thumb/sbc.cgs
    sim/testsuite/sim/arm/thumb/stmia.cgs
    sim/testsuite/sim/arm/thumb/str-imm.cgs
    sim/testsuite/sim/arm/thumb/str-sprel.cgs
    sim/testsuite/sim/arm/thumb/str.cgs
    sim/testsuite/sim/arm/thumb/strb-imm.cgs
    sim/testsuite/sim/arm/thumb/strb.cgs
    sim/testsuite/sim/arm/thumb/strh-imm.cgs
    sim/testsuite/sim/arm/thumb/strh.cgs
    sim/testsuite/sim/arm/thumb/sub-sp.cgs
    sim/testsuite/sim/arm/thumb/sub.cgs
    sim/testsuite/sim/arm/thumb/subi.cgs
    sim/testsuite/sim/arm/thumb/subi8.cgs
    sim/testsuite/sim/arm/thumb/swi.cgs
    sim/testsuite/sim/arm/thumb/testutils.inc
    sim/testsuite/sim/arm/thumb/tst.cgs
    sim/testsuite/sim/arm/tst.cgs
    sim/testsuite/sim/arm/umlal.cgs
    sim/testsuite/sim/arm/umull.cgs
    sim/testsuite/sim/arm/xscale/blx.cgs
    sim/testsuite/sim/arm/xscale/mia.cgs
    sim/testsuite/sim/arm/xscale/miaph.cgs
    sim/testsuite/sim/arm/xscale/miaxy.cgs
    sim/testsuite/sim/arm/xscale/mra.cgs
    sim/testsuite/sim/arm/xscale/testutils.inc
    sim/testsuite/sim/arm/xscale/xscale.exp
    sim/testsuite/sim/cr16/ChangeLog
    sim/testsuite/sim/cr16/addb.cgs
    sim/testsuite/sim/cr16/addd.cgs
    sim/testsuite/sim/cr16/addi.cgs
    sim/testsuite/sim/cr16/addw.cgs
    sim/testsuite/sim/cr16/allinsn.exp
    sim/testsuite/sim/cr16/andb.cgs
    sim/testsuite/sim/cr16/andd.cgs
    sim/testsuite/sim/cr16/andw.cgs
    sim/testsuite/sim/cr16/ashub.cgs
    sim/testsuite/sim/cr16/ashub_i.cgs
    sim/testsuite/sim/cr16/ashud.cgs
    sim/testsuite/sim/cr16/ashud_i.cgs
    sim/testsuite/sim/cr16/ashuw.cgs
    sim/testsuite/sim/cr16/ashuw_i.cgs
    sim/testsuite/sim/cr16/bal1_24.cgs
    sim/testsuite/sim/cr16/bal2_24.cgs
    sim/testsuite/sim/cr16/bcc.cgs
    sim/testsuite/sim/cr16/bcs.cgs
    sim/testsuite/sim/cr16/beq.cgs
    sim/testsuite/sim/cr16/beq0b.cgs
    sim/testsuite/sim/cr16/beq0w.cgs
    sim/testsuite/sim/cr16/bge.cgs
    sim/testsuite/sim/cr16/bgt.cgs
    sim/testsuite/sim/cr16/bhi.cgs
    sim/testsuite/sim/cr16/bhs.cgs
    sim/testsuite/sim/cr16/bht.cgs
    sim/testsuite/sim/cr16/blo.cgs
    sim/testsuite/sim/cr16/bls.cgs
    sim/testsuite/sim/cr16/blt.cgs
    sim/testsuite/sim/cr16/bne.cgs
    sim/testsuite/sim/cr16/bne0b.cgs
    sim/testsuite/sim/cr16/bne0w.cgs
    sim/testsuite/sim/cr16/br.cgs
    sim/testsuite/sim/cr16/cbitb.cgs
    sim/testsuite/sim/cr16/cbitw.cgs
    sim/testsuite/sim/cr16/cmpb.cgs
    sim/testsuite/sim/cr16/cmpb_i.cgs
    sim/testsuite/sim/cr16/cmpd.cgs
    sim/testsuite/sim/cr16/cmpd_i.cgs
    sim/testsuite/sim/cr16/cmpi.cgs
    sim/testsuite/sim/cr16/cmpw.cgs
    sim/testsuite/sim/cr16/cmpw_i.cgs
    sim/testsuite/sim/cr16/excp.cgs
    sim/testsuite/sim/cr16/hello.ms
    sim/testsuite/sim/cr16/hw-trap.ms
    sim/testsuite/sim/cr16/jal.cgs
    sim/testsuite/sim/cr16/jcc.cgs
    sim/testsuite/sim/cr16/jcs.cgs
    sim/testsuite/sim/cr16/jeq.cgs
    sim/testsuite/sim/cr16/jfc.cgs
    sim/testsuite/sim/cr16/jfs.cgs
    sim/testsuite/sim/cr16/jge.cgs
    sim/testsuite/sim/cr16/jgt.cgs
    sim/testsuite/sim/cr16/jhi.cgs
    sim/testsuite/sim/cr16/jhs.cgs
    sim/testsuite/sim/cr16/jlo.cgs
    sim/testsuite/sim/cr16/jls.cgs
    sim/testsuite/sim/cr16/jlt.cgs
    sim/testsuite/sim/cr16/jne.cgs
    sim/testsuite/sim/cr16/jump.cgs
    sim/testsuite/sim/cr16/loadb.cgs
    sim/testsuite/sim/cr16/loadd.cgs
    sim/testsuite/sim/cr16/loadm.cgs
    sim/testsuite/sim/cr16/loadmp.cgs
    sim/testsuite/sim/cr16/loadw.cgs
    sim/testsuite/sim/cr16/lpr-spr.cgs
    sim/testsuite/sim/cr16/lprd-sprd.cgs
    sim/testsuite/sim/cr16/lshb.cgs
    sim/testsuite/sim/cr16/lshb_i.cgs
    sim/testsuite/sim/cr16/lshd.cgs
    sim/testsuite/sim/cr16/lshd_i.cgs
    sim/testsuite/sim/cr16/lshw.cgs
    sim/testsuite/sim/cr16/lshw_i.cgs
    sim/testsuite/sim/cr16/macqw.cgs
    sim/testsuite/sim/cr16/macsw.cgs
    sim/testsuite/sim/cr16/macuw.cgs
    sim/testsuite/sim/cr16/misc.exp
    sim/testsuite/sim/cr16/movb.cgs
    sim/testsuite/sim/cr16/movd.cgs
    sim/testsuite/sim/cr16/movw.cgs
    sim/testsuite/sim/cr16/movxb.cgs
    sim/testsuite/sim/cr16/movxw.cgs
    sim/testsuite/sim/cr16/movzb.cgs
    sim/testsuite/sim/cr16/movzw.cgs
    sim/testsuite/sim/cr16/mulb.cgs
    sim/testsuite/sim/cr16/mulsb.cgs
    sim/testsuite/sim/cr16/mulsw.cgs
    sim/testsuite/sim/cr16/muluw.cgs
    sim/testsuite/sim/cr16/mulw.cgs
    sim/testsuite/sim/cr16/nop.cgs
    sim/testsuite/sim/cr16/orb.cgs
    sim/testsuite/sim/cr16/ord.cgs
    sim/testsuite/sim/cr16/orw.cgs
    sim/testsuite/sim/cr16/pop1.cgs
    sim/testsuite/sim/cr16/pop2.cgs
    sim/testsuite/sim/cr16/pop3.cgs
    sim/testsuite/sim/cr16/popret1.cgs
    sim/testsuite/sim/cr16/popret2.cgs
    sim/testsuite/sim/cr16/popret3.cgs
    sim/testsuite/sim/cr16/push1.cgs
    sim/testsuite/sim/cr16/push2.cgs
    sim/testsuite/sim/cr16/push3.cgs
    sim/testsuite/sim/cr16/sbitb.cgs
    sim/testsuite/sim/cr16/sbitw.cgs
    sim/testsuite/sim/cr16/scc.cgs
    sim/testsuite/sim/cr16/scs.cgs
    sim/testsuite/sim/cr16/seq.cgs
    sim/testsuite/sim/cr16/sfc.cgs
    sim/testsuite/sim/cr16/sfs.cgs
    sim/testsuite/sim/cr16/sge.cgs
    sim/testsuite/sim/cr16/sgt.cgs
    sim/testsuite/sim/cr16/shi.cgs
    sim/testsuite/sim/cr16/shs.cgs
    sim/testsuite/sim/cr16/slo.cgs
    sim/testsuite/sim/cr16/sls.cgs
    sim/testsuite/sim/cr16/slt.cgs
    sim/testsuite/sim/cr16/sne.cgs
    sim/testsuite/sim/cr16/storb.cgs
    sim/testsuite/sim/cr16/stord.cgs
    sim/testsuite/sim/cr16/storw.cgs
    sim/testsuite/sim/cr16/subb.cgs
    sim/testsuite/sim/cr16/subd.cgs
    sim/testsuite/sim/cr16/subi.cgs
    sim/testsuite/sim/cr16/subw.cgs
    sim/testsuite/sim/cr16/tbit.cgs
    sim/testsuite/sim/cr16/tbitb.cgs
    sim/testsuite/sim/cr16/tbitw.cgs
    sim/testsuite/sim/cr16/testutils.inc
    sim/testsuite/sim/cr16/uread16.ms
    sim/testsuite/sim/cr16/uread32.ms
    sim/testsuite/sim/cr16/xorb.cgs
    sim/testsuite/sim/cr16/xord.cgs
    sim/testsuite/sim/cr16/xorw.cgs
    sim/testsuite/sim/cris/asm/abs.ms
    sim/testsuite/sim/cris/asm/addc.ms
    sim/testsuite/sim/cris/asm/addcpc.ms
    sim/testsuite/sim/cris/asm/addcv32c.ms
    sim/testsuite/sim/cris/asm/addcv32m.ms
    sim/testsuite/sim/cris/asm/addcv32r.ms
    sim/testsuite/sim/cris/asm/addi.ms
    sim/testsuite/sim/cris/asm/addiv32.ms
    sim/testsuite/sim/cris/asm/addm.ms
    sim/testsuite/sim/cris/asm/addoc.ms
    sim/testsuite/sim/cris/asm/addom.ms
    sim/testsuite/sim/cris/asm/addoq.ms
    sim/testsuite/sim/cris/asm/addq.ms
    sim/testsuite/sim/cris/asm/addqpc.ms
    sim/testsuite/sim/cris/asm/addr.ms
    sim/testsuite/sim/cris/asm/addswpc.ms
    sim/testsuite/sim/cris/asm/addxc.ms
    sim/testsuite/sim/cris/asm/addxm.ms
    sim/testsuite/sim/cris/asm/addxr.ms
    sim/testsuite/sim/cris/asm/andc.ms
    sim/testsuite/sim/cris/asm/andm.ms
    sim/testsuite/sim/cris/asm/andq.ms
    sim/testsuite/sim/cris/asm/andr.ms
    sim/testsuite/sim/cris/asm/asm.exp
    sim/testsuite/sim/cris/asm/asr.ms
    sim/testsuite/sim/cris/asm/ba.ms
    sim/testsuite/sim/cris/asm/badarch1.ms
    sim/testsuite/sim/cris/asm/bare1.ms
    sim/testsuite/sim/cris/asm/bare2.ms
    sim/testsuite/sim/cris/asm/bare3.ms
    sim/testsuite/sim/cris/asm/bas.ms
    sim/testsuite/sim/cris/asm/bccb.ms
    sim/testsuite/sim/cris/asm/bdapc.ms
    sim/testsuite/sim/cris/asm/bdapm.ms
    sim/testsuite/sim/cris/asm/bdapq.ms
    sim/testsuite/sim/cris/asm/bdapqpc.ms
    sim/testsuite/sim/cris/asm/biap.ms
    sim/testsuite/sim/cris/asm/boundc.ms
    sim/testsuite/sim/cris/asm/boundm.ms
    sim/testsuite/sim/cris/asm/boundmv32.ms
    sim/testsuite/sim/cris/asm/boundr.ms
    sim/testsuite/sim/cris/asm/break.ms
    sim/testsuite/sim/cris/asm/btst.ms
    sim/testsuite/sim/cris/asm/ccr-v10.ms
    sim/testsuite/sim/cris/asm/ccs-v32.ms
    sim/testsuite/sim/cris/asm/clearfv10.ms
    sim/testsuite/sim/cris/asm/clearfv32.ms
    sim/testsuite/sim/cris/asm/clrjmp1.ms
    sim/testsuite/sim/cris/asm/cmpc.ms
    sim/testsuite/sim/cris/asm/cmpm.ms
    sim/testsuite/sim/cris/asm/cmpq.ms
    sim/testsuite/sim/cris/asm/cmpr.ms
    sim/testsuite/sim/cris/asm/cmpxc.ms
    sim/testsuite/sim/cris/asm/cmpxm.ms
    sim/testsuite/sim/cris/asm/dflags.ms
    sim/testsuite/sim/cris/asm/dip.ms
    sim/testsuite/sim/cris/asm/dstep.ms
    sim/testsuite/sim/cris/asm/fidxd.ms
    sim/testsuite/sim/cris/asm/fidxi.ms
    sim/testsuite/sim/cris/asm/ftagd.ms
    sim/testsuite/sim/cris/asm/ftagi.ms
    sim/testsuite/sim/cris/asm/halt.ms
    sim/testsuite/sim/cris/asm/io1.ms
    sim/testsuite/sim/cris/asm/io2.ms
    sim/testsuite/sim/cris/asm/io3.ms
    sim/testsuite/sim/cris/asm/io4.ms
    sim/testsuite/sim/cris/asm/io5.ms
    sim/testsuite/sim/cris/asm/io6.ms
    sim/testsuite/sim/cris/asm/io7.ms
    sim/testsuite/sim/cris/asm/io8.ms
    sim/testsuite/sim/cris/asm/io9.ms
    sim/testsuite/sim/cris/asm/jsr.ms
    sim/testsuite/sim/cris/asm/jsrmv10.ms
    sim/testsuite/sim/cris/asm/jumpmp.ms
    sim/testsuite/sim/cris/asm/jumppv32.ms
    sim/testsuite/sim/cris/asm/lapc.ms
    sim/testsuite/sim/cris/asm/lsl.ms
    sim/testsuite/sim/cris/asm/lsr.ms
    sim/testsuite/sim/cris/asm/lz.ms
    sim/testsuite/sim/cris/asm/mcp.ms
    sim/testsuite/sim/cris/asm/movdelsr1.ms
    sim/testsuite/sim/cris/asm/movecpc.ms
    sim/testsuite/sim/cris/asm/movecr.ms
    sim/testsuite/sim/cris/asm/movecrt10.ms
    sim/testsuite/sim/cris/asm/movecrt32.ms
    sim/testsuite/sim/cris/asm/movect10.ms
    sim/testsuite/sim/cris/asm/movei.ms
    sim/testsuite/sim/cris/asm/movempc.ms
    sim/testsuite/sim/cris/asm/movemr.ms
    sim/testsuite/sim/cris/asm/movemrv10.ms
    sim/testsuite/sim/cris/asm/movemrv32.ms
    sim/testsuite/sim/cris/asm/movepcb.ms
    sim/testsuite/sim/cris/asm/movepcd.ms
    sim/testsuite/sim/cris/asm/movepcw.ms
    sim/testsuite/sim/cris/asm/moveq.ms
    sim/testsuite/sim/cris/asm/moveqpc.ms
    sim/testsuite/sim/cris/asm/mover.ms
    sim/testsuite/sim/cris/asm/moverbpc.ms
    sim/testsuite/sim/cris/asm/moverdpc.ms
    sim/testsuite/sim/cris/asm/moverm.ms
    sim/testsuite/sim/cris/asm/moverpcb.ms
    sim/testsuite/sim/cris/asm/moverpcd.ms
    sim/testsuite/sim/cris/asm/moverpcw.ms
    sim/testsuite/sim/cris/asm/moverwpc.ms
    sim/testsuite/sim/cris/asm/movesmp.ms
    sim/testsuite/sim/cris/asm/movmp.ms
    sim/testsuite/sim/cris/asm/movmp8.ms
    sim/testsuite/sim/cris/asm/movpmv10.ms
    sim/testsuite/sim/cris/asm/movpmv32.ms
    sim/testsuite/sim/cris/asm/movppc.ms
    sim/testsuite/sim/cris/asm/movpr.ms
    sim/testsuite/sim/cris/asm/movprv10.ms
    sim/testsuite/sim/cris/asm/movprv32.ms
    sim/testsuite/sim/cris/asm/movrss.ms
    sim/testsuite/sim/cris/asm/movscpc.ms
    sim/testsuite/sim/cris/asm/movscr.ms
    sim/testsuite/sim/cris/asm/movsm.ms
    sim/testsuite/sim/cris/asm/movsmpc.ms
    sim/testsuite/sim/cris/asm/movsr.ms
    sim/testsuite/sim/cris/asm/movsrpc.ms
    sim/testsuite/sim/cris/asm/movssr.ms
    sim/testsuite/sim/cris/asm/movucpc.ms
    sim/testsuite/sim/cris/asm/movucr.ms
    sim/testsuite/sim/cris/asm/movum.ms
    sim/testsuite/sim/cris/asm/movumpc.ms
    sim/testsuite/sim/cris/asm/movur.ms
    sim/testsuite/sim/cris/asm/movurpc.ms
    sim/testsuite/sim/cris/asm/mstep.ms
    sim/testsuite/sim/cris/asm/msteppc1.ms
    sim/testsuite/sim/cris/asm/msteppc2.ms
    sim/testsuite/sim/cris/asm/msteppc3.ms
    sim/testsuite/sim/cris/asm/mulv10.ms
    sim/testsuite/sim/cris/asm/mulv32.ms
    sim/testsuite/sim/cris/asm/mulx.ms
    sim/testsuite/sim/cris/asm/neg.ms
    sim/testsuite/sim/cris/asm/nonvcv32.ms
    sim/testsuite/sim/cris/asm/nopv10t.ms
    sim/testsuite/sim/cris/asm/nopv32t.ms
    sim/testsuite/sim/cris/asm/nopv32t2.ms
    sim/testsuite/sim/cris/asm/nopv32t3.ms
    sim/testsuite/sim/cris/asm/nopv32t4.ms
    sim/testsuite/sim/cris/asm/not.ms
    sim/testsuite/sim/cris/asm/op3.ms
    sim/testsuite/sim/cris/asm/opterr1.ms
    sim/testsuite/sim/cris/asm/opterr2.ms
    sim/testsuite/sim/cris/asm/opterr3.ms
    sim/testsuite/sim/cris/asm/opterr4.ms
    sim/testsuite/sim/cris/asm/opterr5.ms
    sim/testsuite/sim/cris/asm/option1.ms
    sim/testsuite/sim/cris/asm/option2.ms
    sim/testsuite/sim/cris/asm/option3.ms
    sim/testsuite/sim/cris/asm/option4.ms
    sim/testsuite/sim/cris/asm/orc.ms
    sim/testsuite/sim/cris/asm/orm.ms
    sim/testsuite/sim/cris/asm/orq.ms
    sim/testsuite/sim/cris/asm/orr.ms
    sim/testsuite/sim/cris/asm/pcplus.ms
    sim/testsuite/sim/cris/asm/pid1.ms
    sim/testsuite/sim/cris/asm/raw1.ms
    sim/testsuite/sim/cris/asm/raw10.ms
    sim/testsuite/sim/cris/asm/raw11.ms
    sim/testsuite/sim/cris/asm/raw12.ms
    sim/testsuite/sim/cris/asm/raw13.ms
    sim/testsuite/sim/cris/asm/raw14.ms
    sim/testsuite/sim/cris/asm/raw15.ms
    sim/testsuite/sim/cris/asm/raw16.ms
    sim/testsuite/sim/cris/asm/raw17.ms
    sim/testsuite/sim/cris/asm/raw2.ms
    sim/testsuite/sim/cris/asm/raw3.ms
    sim/testsuite/sim/cris/asm/raw4.ms
    sim/testsuite/sim/cris/asm/raw5.ms
    sim/testsuite/sim/cris/asm/raw6.ms
    sim/testsuite/sim/cris/asm/raw7.ms
    sim/testsuite/sim/cris/asm/raw8.ms
    sim/testsuite/sim/cris/asm/raw9.ms
    sim/testsuite/sim/cris/asm/ret.ms
    sim/testsuite/sim/cris/asm/rfe.ms
    sim/testsuite/sim/cris/asm/rfg.ms
    sim/testsuite/sim/cris/asm/rfn.ms
    sim/testsuite/sim/cris/asm/sbfs.ms
    sim/testsuite/sim/cris/asm/scc.ms
    sim/testsuite/sim/cris/asm/sfe.ms
    sim/testsuite/sim/cris/asm/subc.ms
    sim/testsuite/sim/cris/asm/subm.ms
    sim/testsuite/sim/cris/asm/subq.ms
    sim/testsuite/sim/cris/asm/subqpc.ms
    sim/testsuite/sim/cris/asm/subr.ms
    sim/testsuite/sim/cris/asm/subxc.ms
    sim/testsuite/sim/cris/asm/subxm.ms
    sim/testsuite/sim/cris/asm/subxr.ms
    sim/testsuite/sim/cris/asm/swap.ms
    sim/testsuite/sim/cris/asm/tb.ms
    sim/testsuite/sim/cris/asm/test.ms
    sim/testsuite/sim/cris/asm/testutils.inc
    sim/testsuite/sim/cris/asm/tjmpsrv32-2.ms
    sim/testsuite/sim/cris/asm/tjmpsrv32.ms
    sim/testsuite/sim/cris/asm/tjsrcv10.ms
    sim/testsuite/sim/cris/asm/tjsrcv32.ms
    sim/testsuite/sim/cris/asm/tmemv10.ms
    sim/testsuite/sim/cris/asm/tmemv32.ms
    sim/testsuite/sim/cris/asm/tmulv10.ms
    sim/testsuite/sim/cris/asm/tmulv32.ms
    sim/testsuite/sim/cris/asm/tmvm1.ms
    sim/testsuite/sim/cris/asm/tmvm2.ms
    sim/testsuite/sim/cris/asm/tmvmrv10.ms
    sim/testsuite/sim/cris/asm/tmvmrv32.ms
    sim/testsuite/sim/cris/asm/tmvrmv10.ms
    sim/testsuite/sim/cris/asm/tmvrmv32.ms
    sim/testsuite/sim/cris/asm/user.ms
    sim/testsuite/sim/cris/asm/x0-v10.ms
    sim/testsuite/sim/cris/asm/x0-v32.ms
    sim/testsuite/sim/cris/asm/x1-v10.ms
    sim/testsuite/sim/cris/asm/x1-v32.ms
    sim/testsuite/sim/cris/asm/x10-v10.ms
    sim/testsuite/sim/cris/asm/x2-v10.ms
    sim/testsuite/sim/cris/asm/x2-v32.ms
    sim/testsuite/sim/cris/asm/x3-v10.ms
    sim/testsuite/sim/cris/asm/x3-v32.ms
    sim/testsuite/sim/cris/asm/x4-v32.ms
    sim/testsuite/sim/cris/asm/x5-v10.ms
    sim/testsuite/sim/cris/asm/x5-v32.ms
    sim/testsuite/sim/cris/asm/x6-v10.ms
    sim/testsuite/sim/cris/asm/x6-v32.ms
    sim/testsuite/sim/cris/asm/x7-v10.ms
    sim/testsuite/sim/cris/asm/x7-v32.ms
    sim/testsuite/sim/cris/asm/x8-v10.ms
    sim/testsuite/sim/cris/asm/x9-v10.ms
    sim/testsuite/sim/cris/asm/xor.ms
    sim/testsuite/sim/cris/c/access1.c
    sim/testsuite/sim/cris/c/append1.c
    sim/testsuite/sim/cris/c/badldso1.c
    sim/testsuite/sim/cris/c/badldso2.c
    sim/testsuite/sim/cris/c/badldso3.c
    sim/testsuite/sim/cris/c/c.exp
    sim/testsuite/sim/cris/c/clone1.c
    sim/testsuite/sim/cris/c/clone2.c
    sim/testsuite/sim/cris/c/clone3.c
    sim/testsuite/sim/cris/c/clone4.c
    sim/testsuite/sim/cris/c/clone5.c
    sim/testsuite/sim/cris/c/clone6.c
    sim/testsuite/sim/cris/c/ex1.c
    sim/testsuite/sim/cris/c/exitg1.c
    sim/testsuite/sim/cris/c/exitg2.c
    sim/testsuite/sim/cris/c/fcntl1.c
    sim/testsuite/sim/cris/c/fcntl2.c
    sim/testsuite/sim/cris/c/fdopen1.c
    sim/testsuite/sim/cris/c/fdopen2.c
    sim/testsuite/sim/cris/c/freopen1.c
    sim/testsuite/sim/cris/c/freopen2.c
    sim/testsuite/sim/cris/c/ftruncate1.c
    sim/testsuite/sim/cris/c/ftruncate2.c
    sim/testsuite/sim/cris/c/getcwd1.c
    sim/testsuite/sim/cris/c/gettod.c
    sim/testsuite/sim/cris/c/hello.c
    sim/testsuite/sim/cris/c/helloaout.c
    sim/testsuite/sim/cris/c/hellodyn.c
    sim/testsuite/sim/cris/c/hellodyn2.c
    sim/testsuite/sim/cris/c/hellodyn3.c
    sim/testsuite/sim/cris/c/kill1.c
    sim/testsuite/sim/cris/c/kill2.c
    sim/testsuite/sim/cris/c/kill3.c
    sim/testsuite/sim/cris/c/mapbrk.c
    sim/testsuite/sim/cris/c/mmap1.c
    sim/testsuite/sim/cris/c/mmap2.c
    sim/testsuite/sim/cris/c/mmap3.c
    sim/testsuite/sim/cris/c/mmap4.c
    sim/testsuite/sim/cris/c/mmap5.c
    sim/testsuite/sim/cris/c/mmap6.c
    sim/testsuite/sim/cris/c/mmap7.c
    sim/testsuite/sim/cris/c/mmap8.c
    sim/testsuite/sim/cris/c/mprotect1.c
    sim/testsuite/sim/cris/c/mprotect2.c
    sim/testsuite/sim/cris/c/mremap.c
    sim/testsuite/sim/cris/c/openpf1.c
    sim/testsuite/sim/cris/c/openpf2.c
    sim/testsuite/sim/cris/c/openpf3.c
    sim/testsuite/sim/cris/c/openpf4.c
    sim/testsuite/sim/cris/c/openpf5.c
    sim/testsuite/sim/cris/c/pipe1.c
    sim/testsuite/sim/cris/c/pipe2.c
    sim/testsuite/sim/cris/c/pipe3.c
    sim/testsuite/sim/cris/c/pipe4.c
    sim/testsuite/sim/cris/c/pipe5.c
    sim/testsuite/sim/cris/c/pipe6.c
    sim/testsuite/sim/cris/c/pipe7.c
    sim/testsuite/sim/cris/c/readlink1.c
    sim/testsuite/sim/cris/c/readlink10.c
    sim/testsuite/sim/cris/c/readlink11.c
    sim/testsuite/sim/cris/c/readlink2.c
    sim/testsuite/sim/cris/c/readlink3.c
    sim/testsuite/sim/cris/c/readlink4.c
    sim/testsuite/sim/cris/c/readlink5.c
    sim/testsuite/sim/cris/c/readlink6.c
    sim/testsuite/sim/cris/c/readlink7.c
    sim/testsuite/sim/cris/c/readlink8.c
    sim/testsuite/sim/cris/c/readlink9.c
    sim/testsuite/sim/cris/c/rename2.c
    sim/testsuite/sim/cris/c/rtsigprocmask1.c
    sim/testsuite/sim/cris/c/rtsigprocmask2.c
    sim/testsuite/sim/cris/c/rtsigsuspend1.c
    sim/testsuite/sim/cris/c/rtsigsuspend2.c
    sim/testsuite/sim/cris/c/sched1.c
    sim/testsuite/sim/cris/c/sched2.c
    sim/testsuite/sim/cris/c/sched3.c
    sim/testsuite/sim/cris/c/sched4.c
    sim/testsuite/sim/cris/c/sched5.c
    sim/testsuite/sim/cris/c/sched6.c
    sim/testsuite/sim/cris/c/sched7.c
    sim/testsuite/sim/cris/c/sched8.c
    sim/testsuite/sim/cris/c/sched9.c
    sim/testsuite/sim/cris/c/seek1.c
    sim/testsuite/sim/cris/c/seek2.c
    sim/testsuite/sim/cris/c/setrlimit1.c
    sim/testsuite/sim/cris/c/settls1.c
    sim/testsuite/sim/cris/c/sig1.c
    sim/testsuite/sim/cris/c/sig10.c
    sim/testsuite/sim/cris/c/sig11.c
    sim/testsuite/sim/cris/c/sig12.c
    sim/testsuite/sim/cris/c/sig13.c
    sim/testsuite/sim/cris/c/sig2.c
    sim/testsuite/sim/cris/c/sig3.c
    sim/testsuite/sim/cris/c/sig4.c
    sim/testsuite/sim/cris/c/sig5.c
    sim/testsuite/sim/cris/c/sig6.c
    sim/testsuite/sim/cris/c/sig7.c
    sim/testsuite/sim/cris/c/sig8.c
    sim/testsuite/sim/cris/c/sig9.c
    sim/testsuite/sim/cris/c/sigreturn1.c
    sim/testsuite/sim/cris/c/sigreturn2.c
    sim/testsuite/sim/cris/c/sigreturn3.c
    sim/testsuite/sim/cris/c/sigreturn4.c
    sim/testsuite/sim/cris/c/sjlj.c
    sim/testsuite/sim/cris/c/sock1.c
    sim/testsuite/sim/cris/c/stat1.c
    sim/testsuite/sim/cris/c/stat2.c
    sim/testsuite/sim/cris/c/stat3.c
    sim/testsuite/sim/cris/c/stat4.c
    sim/testsuite/sim/cris/c/stat5.c
    sim/testsuite/sim/cris/c/stat7.c
    sim/testsuite/sim/cris/c/stat8.c
    sim/testsuite/sim/cris/c/syscall1.c
    sim/testsuite/sim/cris/c/syscall2.c
    sim/testsuite/sim/cris/c/syscall3.c
    sim/testsuite/sim/cris/c/syscall4.c
    sim/testsuite/sim/cris/c/syscall5.c
    sim/testsuite/sim/cris/c/syscall6.c
    sim/testsuite/sim/cris/c/syscall7.c
    sim/testsuite/sim/cris/c/syscall8.c
    sim/testsuite/sim/cris/c/sysctl1.c
    sim/testsuite/sim/cris/c/sysctl2.c
    sim/testsuite/sim/cris/c/sysctl3.c
    sim/testsuite/sim/cris/c/thread2.c
    sim/testsuite/sim/cris/c/thread3.c
    sim/testsuite/sim/cris/c/thread4.c
    sim/testsuite/sim/cris/c/thread5.c
    sim/testsuite/sim/cris/c/time1.c
    sim/testsuite/sim/cris/c/time2.c
    sim/testsuite/sim/cris/c/truncate1.c
    sim/testsuite/sim/cris/c/truncate2.c
    sim/testsuite/sim/cris/c/ugetrlimit1.c
    sim/testsuite/sim/cris/c/uname1.c
    sim/testsuite/sim/cris/c/writev1.c
    sim/testsuite/sim/cris/c/writev2.c
    sim/testsuite/sim/cris/hw/rv-n-cris/host1.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/irq1.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/irq2.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/irq3.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/irq4.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/irq5.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/irq6.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/mbox1.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/mem1.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/mem2.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/poll1.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/quit.s
    sim/testsuite/sim/cris/hw/rv-n-cris/rvc.exp
    sim/testsuite/sim/cris/hw/rv-n-cris/std.dev
    sim/testsuite/sim/cris/hw/rv-n-cris/testutils.inc
    sim/testsuite/sim/cris/hw/rv-n-cris/trivial1.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/trivial2.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/trivial3.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/trivial4.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/trivial4.r
    sim/testsuite/sim/cris/hw/rv-n-cris/trivial5.ms
    sim/testsuite/sim/cris/hw/rv-n-cris/wd1.ms
    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/frv/add.cgs
    sim/testsuite/sim/frv/add.pcgs
    sim/testsuite/sim/frv/addcc.cgs
    sim/testsuite/sim/frv/addi.cgs
    sim/testsuite/sim/frv/addicc.cgs
    sim/testsuite/sim/frv/addx.cgs
    sim/testsuite/sim/frv/addxcc.cgs
    sim/testsuite/sim/frv/addxi.cgs
    sim/testsuite/sim/frv/addxicc.cgs
    sim/testsuite/sim/frv/allinsn.exp
    sim/testsuite/sim/frv/and.cgs
    sim/testsuite/sim/frv/andcc.cgs
    sim/testsuite/sim/frv/andcr.cgs
    sim/testsuite/sim/frv/andi.cgs
    sim/testsuite/sim/frv/andicc.cgs
    sim/testsuite/sim/frv/andncr.cgs
    sim/testsuite/sim/frv/bar.cgs
    sim/testsuite/sim/frv/bc.cgs
    sim/testsuite/sim/frv/bcclr.cgs
    sim/testsuite/sim/frv/bceqlr.cgs
    sim/testsuite/sim/frv/bcgelr.cgs
    sim/testsuite/sim/frv/bcgtlr.cgs
    sim/testsuite/sim/frv/bchilr.cgs
    sim/testsuite/sim/frv/bclelr.cgs
    sim/testsuite/sim/frv/bclr.cgs
    sim/testsuite/sim/frv/bclslr.cgs
    sim/testsuite/sim/frv/bcltlr.cgs
    sim/testsuite/sim/frv/bcnclr.cgs
    sim/testsuite/sim/frv/bcnelr.cgs
    sim/testsuite/sim/frv/bcnlr.cgs
    sim/testsuite/sim/frv/bcnolr.cgs
    sim/testsuite/sim/frv/bcnvlr.cgs
    sim/testsuite/sim/frv/bcplr.cgs
    sim/testsuite/sim/frv/bcralr.cgs
    sim/testsuite/sim/frv/bctrlr.cgs
    sim/testsuite/sim/frv/bcvlr.cgs
    sim/testsuite/sim/frv/beq.cgs
    sim/testsuite/sim/frv/beqlr.cgs
    sim/testsuite/sim/frv/bge.cgs
    sim/testsuite/sim/frv/bgelr.cgs
    sim/testsuite/sim/frv/bgt.cgs
    sim/testsuite/sim/frv/bgtlr.cgs
    sim/testsuite/sim/frv/bhi.cgs
    sim/testsuite/sim/frv/bhilr.cgs
    sim/testsuite/sim/frv/ble.cgs
    sim/testsuite/sim/frv/blelr.cgs
    sim/testsuite/sim/frv/bls.cgs
    sim/testsuite/sim/frv/blslr.cgs
    sim/testsuite/sim/frv/blt.cgs
    sim/testsuite/sim/frv/bltlr.cgs
    sim/testsuite/sim/frv/bn.cgs
    sim/testsuite/sim/frv/bnc.cgs
    sim/testsuite/sim/frv/bnclr.cgs
    sim/testsuite/sim/frv/bne.cgs
    sim/testsuite/sim/frv/bnelr.cgs
    sim/testsuite/sim/frv/bnlr.cgs
    sim/testsuite/sim/frv/bno.cgs
    sim/testsuite/sim/frv/bnolr.cgs
    sim/testsuite/sim/frv/bnv.cgs
    sim/testsuite/sim/frv/bnvlr.cgs
    sim/testsuite/sim/frv/bp.cgs
    sim/testsuite/sim/frv/bplr.cgs
    sim/testsuite/sim/frv/bra.cgs
    sim/testsuite/sim/frv/bralr.cgs
    sim/testsuite/sim/frv/branch.pcgs
    sim/testsuite/sim/frv/break.cgs
    sim/testsuite/sim/frv/bv.cgs
    sim/testsuite/sim/frv/bvlr.cgs
    sim/testsuite/sim/frv/cadd.cgs
    sim/testsuite/sim/frv/caddcc.cgs
    sim/testsuite/sim/frv/call.cgs
    sim/testsuite/sim/frv/call.pcgs
    sim/testsuite/sim/frv/callil.cgs
    sim/testsuite/sim/frv/calll.cgs
    sim/testsuite/sim/frv/cand.cgs
    sim/testsuite/sim/frv/candcc.cgs
    sim/testsuite/sim/frv/ccalll.cgs
    sim/testsuite/sim/frv/cckc.cgs
    sim/testsuite/sim/frv/cckeq.cgs
    sim/testsuite/sim/frv/cckge.cgs
    sim/testsuite/sim/frv/cckgt.cgs
    sim/testsuite/sim/frv/cckhi.cgs
    sim/testsuite/sim/frv/cckle.cgs
    sim/testsuite/sim/frv/cckls.cgs
    sim/testsuite/sim/frv/ccklt.cgs
    sim/testsuite/sim/frv/cckn.cgs
    sim/testsuite/sim/frv/ccknc.cgs
    sim/testsuite/sim/frv/cckne.cgs
    sim/testsuite/sim/frv/cckno.cgs
    sim/testsuite/sim/frv/ccknv.cgs
    sim/testsuite/sim/frv/cckp.cgs
    sim/testsuite/sim/frv/cckra.cgs
    sim/testsuite/sim/frv/cckv.cgs
    sim/testsuite/sim/frv/ccmp.cgs
    sim/testsuite/sim/frv/cfabss.cgs
    sim/testsuite/sim/frv/cfadds.cgs
    sim/testsuite/sim/frv/cfckeq.cgs
    sim/testsuite/sim/frv/cfckge.cgs
    sim/testsuite/sim/frv/cfckgt.cgs
    sim/testsuite/sim/frv/cfckle.cgs
    sim/testsuite/sim/frv/cfcklg.cgs
    sim/testsuite/sim/frv/cfcklt.cgs
    sim/testsuite/sim/frv/cfckne.cgs
    sim/testsuite/sim/frv/cfckno.cgs
    sim/testsuite/sim/frv/cfcko.cgs
    sim/testsuite/sim/frv/cfckra.cgs
    sim/testsuite/sim/frv/cfcku.cgs
    sim/testsuite/sim/frv/cfckue.cgs
    sim/testsuite/sim/frv/cfckug.cgs
    sim/testsuite/sim/frv/cfckuge.cgs
    sim/testsuite/sim/frv/cfckul.cgs
    sim/testsuite/sim/frv/cfckule.cgs
    sim/testsuite/sim/frv/cfcmps.cgs
    sim/testsuite/sim/frv/cfdivs.cgs
    sim/testsuite/sim/frv/cfitos.cgs
    sim/testsuite/sim/frv/cfmadds.cgs
    sim/testsuite/sim/frv/cfmas.cgs
    sim/testsuite/sim/frv/cfmovs.cgs
    sim/testsuite/sim/frv/cfmss.cgs
    sim/testsuite/sim/frv/cfmsubs.cgs
    sim/testsuite/sim/frv/cfmuls.cgs
    sim/testsuite/sim/frv/cfnegs.cgs
    sim/testsuite/sim/frv/cfsqrts.cgs
    sim/testsuite/sim/frv/cfstoi.cgs
    sim/testsuite/sim/frv/cfsubs.cgs
    sim/testsuite/sim/frv/cjmpl.cgs
    sim/testsuite/sim/frv/ckc.cgs
    sim/testsuite/sim/frv/ckeq.cgs
    sim/testsuite/sim/frv/ckge.cgs
    sim/testsuite/sim/frv/ckgt.cgs
    sim/testsuite/sim/frv/ckhi.cgs
    sim/testsuite/sim/frv/ckle.cgs
    sim/testsuite/sim/frv/ckls.cgs
    sim/testsuite/sim/frv/cklt.cgs
    sim/testsuite/sim/frv/ckn.cgs
    sim/testsuite/sim/frv/cknc.cgs
    sim/testsuite/sim/frv/ckne.cgs
    sim/testsuite/sim/frv/ckno.cgs
    sim/testsuite/sim/frv/cknv.cgs
    sim/testsuite/sim/frv/ckp.cgs
    sim/testsuite/sim/frv/ckra.cgs
    sim/testsuite/sim/frv/ckv.cgs
    sim/testsuite/sim/frv/cld.cgs
    sim/testsuite/sim/frv/cldbf.cgs
    sim/testsuite/sim/frv/cldbfu.cgs
    sim/testsuite/sim/frv/cldd.cgs
    sim/testsuite/sim/frv/clddf.cgs
    sim/testsuite/sim/frv/clddfu.cgs
    sim/testsuite/sim/frv/clddu.cgs
    sim/testsuite/sim/frv/cldf.cgs
    sim/testsuite/sim/frv/cldfu.cgs
    sim/testsuite/sim/frv/cldhf.cgs
    sim/testsuite/sim/frv/cldhfu.cgs
    sim/testsuite/sim/frv/cldq.cgs
    sim/testsuite/sim/frv/cldqu.cgs
    sim/testsuite/sim/frv/cldsb.cgs
    sim/testsuite/sim/frv/cldsbu.cgs
    sim/testsuite/sim/frv/cldsh.cgs
    sim/testsuite/sim/frv/cldshu.cgs
    sim/testsuite/sim/frv/cldu.cgs
    sim/testsuite/sim/frv/cldub.cgs
    sim/testsuite/sim/frv/cldubu.cgs
    sim/testsuite/sim/frv/clduh.cgs
    sim/testsuite/sim/frv/clduhu.cgs
    sim/testsuite/sim/frv/clrfa.cgs
    sim/testsuite/sim/frv/clrfr.cgs
    sim/testsuite/sim/frv/clrga.cgs
    sim/testsuite/sim/frv/clrgr.cgs
    sim/testsuite/sim/frv/cmaddhss.cgs
    sim/testsuite/sim/frv/cmaddhus.cgs
    sim/testsuite/sim/frv/cmand.cgs
    sim/testsuite/sim/frv/cmbtoh.cgs
    sim/testsuite/sim/frv/cmbtohe.cgs
    sim/testsuite/sim/frv/cmcpxis.cgs
    sim/testsuite/sim/frv/cmcpxiu.cgs
    sim/testsuite/sim/frv/cmcpxrs.cgs
    sim/testsuite/sim/frv/cmcpxru.cgs
    sim/testsuite/sim/frv/cmexpdhd.cgs
    sim/testsuite/sim/frv/cmexpdhw.cgs
    sim/testsuite/sim/frv/cmhtob.cgs
    sim/testsuite/sim/frv/cmmachs.cgs
    sim/testsuite/sim/frv/cmmachu.cgs
    sim/testsuite/sim/frv/cmmulhs.cgs
    sim/testsuite/sim/frv/cmmulhu.cgs
    sim/testsuite/sim/frv/cmnot.cgs
    sim/testsuite/sim/frv/cmor.cgs
    sim/testsuite/sim/frv/cmov.cgs
    sim/testsuite/sim/frv/cmovfg.cgs
    sim/testsuite/sim/frv/cmovfgd.cgs
    sim/testsuite/sim/frv/cmovgf.cgs
    sim/testsuite/sim/frv/cmovgfd.cgs
    sim/testsuite/sim/frv/cmp.cgs
    sim/testsuite/sim/frv/cmpb.cgs
    sim/testsuite/sim/frv/cmpba.cgs
    sim/testsuite/sim/frv/cmpi.cgs
    sim/testsuite/sim/frv/cmqmachs.cgs
    sim/testsuite/sim/frv/cmqmachu.cgs
    sim/testsuite/sim/frv/cmqmulhs.cgs
    sim/testsuite/sim/frv/cmqmulhu.cgs
    sim/testsuite/sim/frv/cmsubhss.cgs
    sim/testsuite/sim/frv/cmsubhus.cgs
    sim/testsuite/sim/frv/cmxor.cgs
    sim/testsuite/sim/frv/cnot.cgs
    sim/testsuite/sim/frv/commitfa.cgs
    sim/testsuite/sim/frv/commitfr.cgs
    sim/testsuite/sim/frv/commitga.cgs
    sim/testsuite/sim/frv/commitgr.cgs
    sim/testsuite/sim/frv/cop1.cgs
    sim/testsuite/sim/frv/cop2.cgs
    sim/testsuite/sim/frv/cor.cgs
    sim/testsuite/sim/frv/corcc.cgs
    sim/testsuite/sim/frv/cscan.cgs
    sim/testsuite/sim/frv/csdiv.cgs
    sim/testsuite/sim/frv/csll.cgs
    sim/testsuite/sim/frv/csllcc.cgs
    sim/testsuite/sim/frv/csmul.cgs
    sim/testsuite/sim/frv/csmulcc.cgs
    sim/testsuite/sim/frv/csra.cgs
    sim/testsuite/sim/frv/csracc.cgs
    sim/testsuite/sim/frv/csrl.cgs
    sim/testsuite/sim/frv/csrlcc.cgs
    sim/testsuite/sim/frv/cst.cgs
    sim/testsuite/sim/frv/cstb.cgs
    sim/testsuite/sim/frv/cstbf.cgs
    sim/testsuite/sim/frv/cstbfu.cgs
    sim/testsuite/sim/frv/cstbu.cgs
    sim/testsuite/sim/frv/cstd.cgs
    sim/testsuite/sim/frv/cstdf.cgs
    sim/testsuite/sim/frv/cstdfu.cgs
    sim/testsuite/sim/frv/cstdu.cgs
    sim/testsuite/sim/frv/cstf.cgs
    sim/testsuite/sim/frv/cstfu.cgs
    sim/testsuite/sim/frv/csth.cgs
    sim/testsuite/sim/frv/csthf.cgs
    sim/testsuite/sim/frv/csthfu.cgs
    sim/testsuite/sim/frv/csthu.cgs
    sim/testsuite/sim/frv/cstq.cgs
    sim/testsuite/sim/frv/cstu.cgs
    sim/testsuite/sim/frv/csub.cgs
    sim/testsuite/sim/frv/csubcc.cgs
    sim/testsuite/sim/frv/cswap.cgs
    sim/testsuite/sim/frv/cudiv.cgs
    sim/testsuite/sim/frv/cxor.cgs
    sim/testsuite/sim/frv/cxorcc.cgs
    sim/testsuite/sim/frv/dcef.cgs
    sim/testsuite/sim/frv/dcei.cgs
    sim/testsuite/sim/frv/dcf.cgs
    sim/testsuite/sim/frv/dci.cgs
    sim/testsuite/sim/frv/fabsd.cgs
    sim/testsuite/sim/frv/fabss.cgs
    sim/testsuite/sim/frv/faddd.cgs
    sim/testsuite/sim/frv/fadds.cgs
    sim/testsuite/sim/frv/fbeq.cgs
    sim/testsuite/sim/frv/fbeqlr.cgs
    sim/testsuite/sim/frv/fbge.cgs
    sim/testsuite/sim/frv/fbgelr.cgs
    sim/testsuite/sim/frv/fbgt.cgs
    sim/testsuite/sim/frv/fbgtlr.cgs
    sim/testsuite/sim/frv/fble.cgs
    sim/testsuite/sim/frv/fblelr.cgs
    sim/testsuite/sim/frv/fblg.cgs
    sim/testsuite/sim/frv/fblglr.cgs
    sim/testsuite/sim/frv/fblt.cgs
    sim/testsuite/sim/frv/fbltlr.cgs
    sim/testsuite/sim/frv/fbne.cgs
    sim/testsuite/sim/frv/fbnelr.cgs
    sim/testsuite/sim/frv/fbno.cgs
    sim/testsuite/sim/frv/fbnolr.cgs
    sim/testsuite/sim/frv/fbo.cgs
    sim/testsuite/sim/frv/fbolr.cgs
    sim/testsuite/sim/frv/fbra.cgs
    sim/testsuite/sim/frv/fbralr.cgs
    sim/testsuite/sim/frv/fbu.cgs
    sim/testsuite/sim/frv/fbue.cgs
    sim/testsuite/sim/frv/fbuelr.cgs
    sim/testsuite/sim/frv/fbug.cgs
    sim/testsuite/sim/frv/fbuge.cgs
    sim/testsuite/sim/frv/fbugelr.cgs
    sim/testsuite/sim/frv/fbuglr.cgs
    sim/testsuite/sim/frv/fbul.cgs
    sim/testsuite/sim/frv/fbule.cgs
    sim/testsuite/sim/frv/fbulelr.cgs
    sim/testsuite/sim/frv/fbullr.cgs
    sim/testsuite/sim/frv/fbulr.cgs
    sim/testsuite/sim/frv/fcbeqlr.cgs
    sim/testsuite/sim/frv/fcbgelr.cgs
    sim/testsuite/sim/frv/fcbgtlr.cgs
    sim/testsuite/sim/frv/fcblelr.cgs
    sim/testsuite/sim/frv/fcblglr.cgs
    sim/testsuite/sim/frv/fcbltlr.cgs
    sim/testsuite/sim/frv/fcbnelr.cgs
    sim/testsuite/sim/frv/fcbnolr.cgs
    sim/testsuite/sim/frv/fcbolr.cgs
    sim/testsuite/sim/frv/fcbralr.cgs
    sim/testsuite/sim/frv/fcbuelr.cgs
    sim/testsuite/sim/frv/fcbugelr.cgs
    sim/testsuite/sim/frv/fcbuglr.cgs
    sim/testsuite/sim/frv/fcbulelr.cgs
    sim/testsuite/sim/frv/fcbullr.cgs
    sim/testsuite/sim/frv/fcbulr.cgs
    sim/testsuite/sim/frv/fckeq.cgs
    sim/testsuite/sim/frv/fckge.cgs
    sim/testsuite/sim/frv/fckgt.cgs
    sim/testsuite/sim/frv/fckle.cgs
    sim/testsuite/sim/frv/fcklg.cgs
    sim/testsuite/sim/frv/fcklt.cgs
    sim/testsuite/sim/frv/fckne.cgs
    sim/testsuite/sim/frv/fckno.cgs
    sim/testsuite/sim/frv/fcko.cgs
    sim/testsuite/sim/frv/fckra.cgs
    sim/testsuite/sim/frv/fcku.cgs
    sim/testsuite/sim/frv/fckue.cgs
    sim/testsuite/sim/frv/fckug.cgs
    sim/testsuite/sim/frv/fckuge.cgs
    sim/testsuite/sim/frv/fckul.cgs
    sim/testsuite/sim/frv/fckule.cgs
    sim/testsuite/sim/frv/fcmpd.cgs
    sim/testsuite/sim/frv/fcmps.cgs
    sim/testsuite/sim/frv/fdabss.cgs
    sim/testsuite/sim/frv/fdadds.cgs
    sim/testsuite/sim/frv/fdcmps.cgs
    sim/testsuite/sim/frv/fddivs.cgs
    sim/testsuite/sim/frv/fditos.cgs
    sim/testsuite/sim/frv/fdivd.cgs
    sim/testsuite/sim/frv/fdivs.cgs
    sim/testsuite/sim/frv/fdmadds.cgs
    sim/testsuite/sim/frv/fdmas.cgs
    sim/testsuite/sim/frv/fdmovs.cgs
    sim/testsuite/sim/frv/fdmss.cgs
    sim/testsuite/sim/frv/fdmulcs.cgs
    sim/testsuite/sim/frv/fdmuls.cgs
    sim/testsuite/sim/frv/fdnegs.cgs
    sim/testsuite/sim/frv/fdsads.cgs
    sim/testsuite/sim/frv/fdsqrts.cgs
    sim/testsuite/sim/frv/fdstoi.cgs
    sim/testsuite/sim/frv/fdsubs.cgs
    sim/testsuite/sim/frv/fdtoi.cgs
    sim/testsuite/sim/frv/fitod.cgs
    sim/testsuite/sim/frv/fitos.cgs
    sim/testsuite/sim/frv/fmad.cgs
    sim/testsuite/sim/frv/fmaddd.cgs
    sim/testsuite/sim/frv/fmadds.cgs
    sim/testsuite/sim/frv/fmas.cgs
    sim/testsuite/sim/frv/fmovd.cgs
    sim/testsuite/sim/frv/fmovs.cgs
    sim/testsuite/sim/frv/fmsd.cgs
    sim/testsuite/sim/frv/fmss.cgs
    sim/testsuite/sim/frv/fmsubd.cgs
    sim/testsuite/sim/frv/fmsubs.cgs
    sim/testsuite/sim/frv/fmuld.cgs
    sim/testsuite/sim/frv/fmuls.cgs
    sim/testsuite/sim/frv/fnegd.cgs
    sim/testsuite/sim/frv/fnegs.cgs
    sim/testsuite/sim/frv/fnop.cgs
    sim/testsuite/sim/frv/fr400/addss.cgs
    sim/testsuite/sim/frv/fr400/allinsn.exp
    sim/testsuite/sim/frv/fr400/csdiv.cgs
    sim/testsuite/sim/frv/fr400/maddaccs.cgs
    sim/testsuite/sim/frv/fr400/masaccs.cgs
    sim/testsuite/sim/frv/fr400/maveh.cgs
    sim/testsuite/sim/frv/fr400/mclracc.cgs
    sim/testsuite/sim/frv/fr400/mhdseth.cgs
    sim/testsuite/sim/frv/fr400/mhdsets.cgs
    sim/testsuite/sim/frv/fr400/mhsethih.cgs
    sim/testsuite/sim/frv/fr400/mhsethis.cgs
    sim/testsuite/sim/frv/fr400/mhsetloh.cgs
    sim/testsuite/sim/frv/fr400/mhsetlos.cgs
    sim/testsuite/sim/frv/fr400/movgs.cgs
    sim/testsuite/sim/frv/fr400/movsg.cgs
    sim/testsuite/sim/frv/fr400/msubaccs.cgs
    sim/testsuite/sim/frv/fr400/scutss.cgs
    sim/testsuite/sim/frv/fr400/sdiv.cgs
    sim/testsuite/sim/frv/fr400/sdivi.cgs
    sim/testsuite/sim/frv/fr400/slass.cgs
    sim/testsuite/sim/frv/fr400/smass.cgs
    sim/testsuite/sim/frv/fr400/smsss.cgs
    sim/testsuite/sim/frv/fr400/smu.cgs
    sim/testsuite/sim/frv/fr400/subss.cgs
    sim/testsuite/sim/frv/fr400/udiv.cgs
    sim/testsuite/sim/frv/fr400/udivi.cgs
    sim/testsuite/sim/frv/fr500/allinsn.exp
    sim/testsuite/sim/frv/fr500/cmqaddhss.cgs
    sim/testsuite/sim/frv/fr500/cmqaddhus.cgs
    sim/testsuite/sim/frv/fr500/cmqsubhss.cgs
    sim/testsuite/sim/frv/fr500/cmqsubhus.cgs
    sim/testsuite/sim/frv/fr500/dcpl.cgs
    sim/testsuite/sim/frv/fr500/dcul.cgs
    sim/testsuite/sim/frv/fr500/mclracc.cgs
    sim/testsuite/sim/frv/fr500/mqaddhss.cgs
    sim/testsuite/sim/frv/fr500/mqaddhus.cgs
    sim/testsuite/sim/frv/fr500/mqsubhss.cgs
    sim/testsuite/sim/frv/fr500/mqsubhus.cgs
    sim/testsuite/sim/frv/fr550/allinsn.exp
    sim/testsuite/sim/frv/fr550/cmaddhss.cgs
    sim/testsuite/sim/frv/fr550/cmaddhus.cgs
    sim/testsuite/sim/frv/fr550/cmcpxiu.cgs
    sim/testsuite/sim/frv/fr550/cmcpxru.cgs
    sim/testsuite/sim/frv/fr550/cmmachs.cgs
    sim/testsuite/sim/frv/fr550/cmmachu.cgs
    sim/testsuite/sim/frv/fr550/cmqaddhss.cgs
    sim/testsuite/sim/frv/fr550/cmqaddhus.cgs
    sim/testsuite/sim/frv/fr550/cmqmachs.cgs
    sim/testsuite/sim/frv/fr550/cmqmachu.cgs
    sim/testsuite/sim/frv/fr550/cmqsubhss.cgs
    sim/testsuite/sim/frv/fr550/cmqsubhus.cgs
    sim/testsuite/sim/frv/fr550/cmsubhss.cgs
    sim/testsuite/sim/frv/fr550/cmsubhus.cgs
    sim/testsuite/sim/frv/fr550/dcpl.cgs
    sim/testsuite/sim/frv/fr550/dcul.cgs
    sim/testsuite/sim/frv/fr550/mabshs.cgs
    sim/testsuite/sim/frv/fr550/maddaccs.cgs
    sim/testsuite/sim/frv/fr550/maddhss.cgs
    sim/testsuite/sim/frv/fr550/maddhus.cgs
    sim/testsuite/sim/frv/fr550/masaccs.cgs
    sim/testsuite/sim/frv/fr550/mdaddaccs.cgs
    sim/testsuite/sim/frv/fr550/mdasaccs.cgs
    sim/testsuite/sim/frv/fr550/mdsubaccs.cgs
    sim/testsuite/sim/frv/fr550/mmachs.cgs
    sim/testsuite/sim/frv/fr550/mmachu.cgs
    sim/testsuite/sim/frv/fr550/mmrdhs.cgs
    sim/testsuite/sim/frv/fr550/mmrdhu.cgs
    sim/testsuite/sim/frv/fr550/mqaddhss.cgs
    sim/testsuite/sim/frv/fr550/mqaddhus.cgs
    sim/testsuite/sim/frv/fr550/mqmachs.cgs
    sim/testsuite/sim/frv/fr550/mqmachu.cgs
    sim/testsuite/sim/frv/fr550/mqmacxhs.cgs
    sim/testsuite/sim/frv/fr550/mqsubhss.cgs
    sim/testsuite/sim/frv/fr550/mqsubhus.cgs
    sim/testsuite/sim/frv/fr550/mqxmachs.cgs
    sim/testsuite/sim/frv/fr550/mqxmacxhs.cgs
    sim/testsuite/sim/frv/fr550/msubaccs.cgs
    sim/testsuite/sim/frv/fr550/msubhss.cgs
    sim/testsuite/sim/frv/fr550/msubhus.cgs
    sim/testsuite/sim/frv/fr550/mtrap.cgs
    sim/testsuite/sim/frv/fr550/udiv.cgs
    sim/testsuite/sim/frv/fr550/udivi.cgs
    sim/testsuite/sim/frv/fsqrtd.cgs
    sim/testsuite/sim/frv/fsqrts.cgs
    sim/testsuite/sim/frv/fstoi.cgs
    sim/testsuite/sim/frv/fsubd.cgs
    sim/testsuite/sim/frv/fsubs.cgs
    sim/testsuite/sim/frv/fteq.cgs
    sim/testsuite/sim/frv/ftge.cgs
    sim/testsuite/sim/frv/ftgt.cgs
    sim/testsuite/sim/frv/ftieq.cgs
    sim/testsuite/sim/frv/ftige.cgs
    sim/testsuite/sim/frv/ftigt.cgs
    sim/testsuite/sim/frv/ftile.cgs
    sim/testsuite/sim/frv/ftilg.cgs
    sim/testsuite/sim/frv/ftilt.cgs
    sim/testsuite/sim/frv/ftine.cgs
    sim/testsuite/sim/frv/ftino.cgs
    sim/testsuite/sim/frv/ftio.cgs
    sim/testsuite/sim/frv/ftira.cgs
    sim/testsuite/sim/frv/ftiu.cgs
    sim/testsuite/sim/frv/ftiue.cgs
    sim/testsuite/sim/frv/ftiug.cgs
    sim/testsuite/sim/frv/ftiuge.cgs
    sim/testsuite/sim/frv/ftiul.cgs
    sim/testsuite/sim/frv/ftle.cgs
    sim/testsuite/sim/frv/ftlg.cgs
    sim/testsuite/sim/frv/ftlt.cgs
    sim/testsuite/sim/frv/ftne.cgs
    sim/testsuite/sim/frv/ftno.cgs
    sim/testsuite/sim/frv/fto.cgs
    sim/testsuite/sim/frv/ftra.cgs
    sim/testsuite/sim/frv/ftu.cgs
    sim/testsuite/sim/frv/ftue.cgs
    sim/testsuite/sim/frv/ftug.cgs
    sim/testsuite/sim/frv/ftuge.cgs
    sim/testsuite/sim/frv/ftul.cgs
    sim/testsuite/sim/frv/ftule.cgs
    sim/testsuite/sim/frv/icei.cgs
    sim/testsuite/sim/frv/ici.cgs
    sim/testsuite/sim/frv/icpl.cgs
    sim/testsuite/sim/frv/icul.cgs
    sim/testsuite/sim/frv/interrupts.exp
    sim/testsuite/sim/frv/interrupts/Ipipe-fr400.cgs
    sim/testsuite/sim/frv/interrupts/Ipipe-fr500.cgs
    sim/testsuite/sim/frv/interrupts/badalign-fr550.cgs
    sim/testsuite/sim/frv/interrupts/badalign.cgs
    sim/testsuite/sim/frv/interrupts/compound-fr550.cgs
    sim/testsuite/sim/frv/interrupts/compound.cgs
    sim/testsuite/sim/frv/interrupts/data_store_error-fr550.cgs
    sim/testsuite/sim/frv/interrupts/data_store_error.cgs
    sim/testsuite/sim/frv/interrupts/fp_exception-fr550.cgs
    sim/testsuite/sim/frv/interrupts/fp_exception.cgs
    sim/testsuite/sim/frv/interrupts/illinsn.cgs
    sim/testsuite/sim/frv/interrupts/insn_access_error-fr550.cgs
    sim/testsuite/sim/frv/interrupts/insn_access_error.cgs
    sim/testsuite/sim/frv/interrupts/mp_exception.cgs
    sim/testsuite/sim/frv/interrupts/privileged_instruction.cgs
    sim/testsuite/sim/frv/interrupts/regalign.cgs
    sim/testsuite/sim/frv/interrupts/reset.cgs
    sim/testsuite/sim/frv/interrupts/shadow_regs.cgs
    sim/testsuite/sim/frv/interrupts/timer.cgs
    sim/testsuite/sim/frv/jmpil.cgs
    sim/testsuite/sim/frv/jmpl.cgs
    sim/testsuite/sim/frv/jmpl.pcgs
    sim/testsuite/sim/frv/ld.cgs
    sim/testsuite/sim/frv/ldbf.cgs
    sim/testsuite/sim/frv/ldbfi.cgs
    sim/testsuite/sim/frv/ldbfu.cgs
    sim/testsuite/sim/frv/ldc.cgs
    sim/testsuite/sim/frv/ldcu.cgs
    sim/testsuite/sim/frv/ldd.cgs
    sim/testsuite/sim/frv/lddc.cgs
    sim/testsuite/sim/frv/lddcu.cgs
    sim/testsuite/sim/frv/lddf.cgs
    sim/testsuite/sim/frv/lddfi.cgs
    sim/testsuite/sim/frv/lddfu.cgs
    sim/testsuite/sim/frv/lddi.cgs
    sim/testsuite/sim/frv/lddu.cgs
    sim/testsuite/sim/frv/ldf.cgs
    sim/testsuite/sim/frv/ldfi.cgs
    sim/testsuite/sim/frv/ldfu.cgs
    sim/testsuite/sim/frv/ldhf.cgs
    sim/testsuite/sim/frv/ldhfi.cgs
    sim/testsuite/sim/frv/ldhfu.cgs
    sim/testsuite/sim/frv/ldi.cgs
    sim/testsuite/sim/frv/ldq.cgs
    sim/testsuite/sim/frv/ldqc.cgs
    sim/testsuite/sim/frv/ldqcu.cgs
    sim/testsuite/sim/frv/ldqf.cgs
    sim/testsuite/sim/frv/ldqfi.cgs
    sim/testsuite/sim/frv/ldqfu.cgs
    sim/testsuite/sim/frv/ldqi.cgs
    sim/testsuite/sim/frv/ldqu.cgs
    sim/testsuite/sim/frv/ldsb.cgs
    sim/testsuite/sim/frv/ldsbi.cgs
    sim/testsuite/sim/frv/ldsbu.cgs
    sim/testsuite/sim/frv/ldsh.cgs
    sim/testsuite/sim/frv/ldshi.cgs
    sim/testsuite/sim/frv/ldshu.cgs
    sim/testsuite/sim/frv/ldu.cgs
    sim/testsuite/sim/frv/ldub.cgs
    sim/testsuite/sim/frv/ldubi.cgs
    sim/testsuite/sim/frv/ldubu.cgs
    sim/testsuite/sim/frv/lduh.cgs
    sim/testsuite/sim/frv/lduhi.cgs
    sim/testsuite/sim/frv/lduhu.cgs
    sim/testsuite/sim/frv/lrbranch.pcgs
    sim/testsuite/sim/frv/mabshs.cgs
    sim/testsuite/sim/frv/maddhss.cgs
    sim/testsuite/sim/frv/maddhus.cgs
    sim/testsuite/sim/frv/mand.cgs
    sim/testsuite/sim/frv/maveh.cgs
    sim/testsuite/sim/frv/mbtoh.cgs
    sim/testsuite/sim/frv/mbtohe.cgs
    sim/testsuite/sim/frv/mclracc.cgs
    sim/testsuite/sim/frv/mcmpsh.cgs
    sim/testsuite/sim/frv/mcmpuh.cgs
    sim/testsuite/sim/frv/mcop1.cgs
    sim/testsuite/sim/frv/mcop2.cgs
    sim/testsuite/sim/frv/mcplhi.cgs
    sim/testsuite/sim/frv/mcpli.cgs
    sim/testsuite/sim/frv/mcpxis.cgs
    sim/testsuite/sim/frv/mcpxiu.cgs
    sim/testsuite/sim/frv/mcpxrs.cgs
    sim/testsuite/sim/frv/mcpxru.cgs
    sim/testsuite/sim/frv/mcut.cgs
    sim/testsuite/sim/frv/mcuti.cgs
    sim/testsuite/sim/frv/mcutss.cgs
    sim/testsuite/sim/frv/mcutssi.cgs
    sim/testsuite/sim/frv/mdaddaccs.cgs
    sim/testsuite/sim/frv/mdasaccs.cgs
    sim/testsuite/sim/frv/mdcutssi.cgs
    sim/testsuite/sim/frv/mdpackh.cgs
    sim/testsuite/sim/frv/mdrotli.cgs
    sim/testsuite/sim/frv/mdsubaccs.cgs
    sim/testsuite/sim/frv/mdunpackh.cgs
    sim/testsuite/sim/frv/membar.cgs
    sim/testsuite/sim/frv/mexpdhd.cgs
    sim/testsuite/sim/frv/mexpdhw.cgs
    sim/testsuite/sim/frv/mhdseth.cgs
    sim/testsuite/sim/frv/mhdsets.cgs
    sim/testsuite/sim/frv/mhsethih.cgs
    sim/testsuite/sim/frv/mhsethis.cgs
    sim/testsuite/sim/frv/mhsetloh.cgs
    sim/testsuite/sim/frv/mhsetlos.cgs
    sim/testsuite/sim/frv/mhtob.cgs
    sim/testsuite/sim/frv/mmachs.cgs
    sim/testsuite/sim/frv/mmachu.cgs
    sim/testsuite/sim/frv/mmrdhs.cgs
    sim/testsuite/sim/frv/mmrdhu.cgs
    sim/testsuite/sim/frv/mmulhs.cgs
    sim/testsuite/sim/frv/mmulhu.cgs
    sim/testsuite/sim/frv/mmulxhs.cgs
    sim/testsuite/sim/frv/mmulxhu.cgs
    sim/testsuite/sim/frv/mnop.cgs
    sim/testsuite/sim/frv/mnot.cgs
    sim/testsuite/sim/frv/mor.cgs
    sim/testsuite/sim/frv/mov.cgs
    sim/testsuite/sim/frv/movfg.cgs
    sim/testsuite/sim/frv/movfgd.cgs
    sim/testsuite/sim/frv/movfgq.cgs
    sim/testsuite/sim/frv/movgf.cgs
    sim/testsuite/sim/frv/movgfd.cgs
    sim/testsuite/sim/frv/movgfq.cgs
    sim/testsuite/sim/frv/movgs.cgs
    sim/testsuite/sim/frv/movsg.cgs
    sim/testsuite/sim/frv/mpackh.cgs
    sim/testsuite/sim/frv/mqcpxis.cgs
    sim/testsuite/sim/frv/mqcpxiu.cgs
    sim/testsuite/sim/frv/mqcpxrs.cgs
    sim/testsuite/sim/frv/mqcpxru.cgs
    sim/testsuite/sim/frv/mqlclrhs.cgs
    sim/testsuite/sim/frv/mqlmths.cgs
    sim/testsuite/sim/frv/mqmachs.cgs
    sim/testsuite/sim/frv/mqmachu.cgs
    sim/testsuite/sim/frv/mqmacxhs.cgs
    sim/testsuite/sim/frv/mqmulhs.cgs
    sim/testsuite/sim/frv/mqmulhu.cgs
    sim/testsuite/sim/frv/mqmulxhs.cgs
    sim/testsuite/sim/frv/mqmulxhu.cgs
    sim/testsuite/sim/frv/mqsaths.cgs
    sim/testsuite/sim/frv/mqsllhi.cgs
    sim/testsuite/sim/frv/mqsrahi.cgs
    sim/testsuite/sim/frv/mqxmachs.cgs
    sim/testsuite/sim/frv/mqxmacxhs.cgs
    sim/testsuite/sim/frv/mrdacc.cgs
    sim/testsuite/sim/frv/mrdaccg.cgs
    sim/testsuite/sim/frv/mrotli.cgs
    sim/testsuite/sim/frv/mrotri.cgs
    sim/testsuite/sim/frv/msaths.cgs
    sim/testsuite/sim/frv/msathu.cgs
    sim/testsuite/sim/frv/msllhi.cgs
    sim/testsuite/sim/frv/msrahi.cgs
    sim/testsuite/sim/frv/msrlhi.cgs
    sim/testsuite/sim/frv/msubhss.cgs
    sim/testsuite/sim/frv/msubhus.cgs
    sim/testsuite/sim/frv/mtrap.cgs
    sim/testsuite/sim/frv/munpackh.cgs
    sim/testsuite/sim/frv/mwcut.cgs
    sim/testsuite/sim/frv/mwcuti.cgs
    sim/testsuite/sim/frv/mwtacc.cgs
    sim/testsuite/sim/frv/mwtaccg.cgs
    sim/testsuite/sim/frv/mxor.cgs
    sim/testsuite/sim/frv/nandcr.cgs
    sim/testsuite/sim/frv/nandncr.cgs
    sim/testsuite/sim/frv/nfadds.cgs
    sim/testsuite/sim/frv/nfdadds.cgs
    sim/testsuite/sim/frv/nfdcmps.cgs
    sim/testsuite/sim/frv/nfddivs.cgs
    sim/testsuite/sim/frv/nfditos.cgs
    sim/testsuite/sim/frv/nfdivs.cgs
    sim/testsuite/sim/frv/nfdmadds.cgs
    sim/testsuite/sim/frv/nfdmas.cgs
    sim/testsuite/sim/frv/nfdmss.cgs
    sim/testsuite/sim/frv/nfdmulcs.cgs
    sim/testsuite/sim/frv/nfdmuls.cgs
    sim/testsuite/sim/frv/nfdsads.cgs
    sim/testsuite/sim/frv/nfdsqrts.cgs
    sim/testsuite/sim/frv/nfdstoi.cgs
    sim/testsuite/sim/frv/nfdsubs.cgs
    sim/testsuite/sim/frv/nfitos.cgs
    sim/testsuite/sim/frv/nfmadds.cgs
    sim/testsuite/sim/frv/nfmas.cgs
    sim/testsuite/sim/frv/nfmss.cgs
    sim/testsuite/sim/frv/nfmsubs.cgs
    sim/testsuite/sim/frv/nfmuls.cgs
    sim/testsuite/sim/frv/nfsqrts.cgs
    sim/testsuite/sim/frv/nfstoi.cgs
    sim/testsuite/sim/frv/nfsubs.cgs
    sim/testsuite/sim/frv/nld.cgs
    sim/testsuite/sim/frv/nldbf.cgs
    sim/testsuite/sim/frv/nldbfi.cgs
    sim/testsuite/sim/frv/nldbfu.cgs
    sim/testsuite/sim/frv/nldd.cgs
    sim/testsuite/sim/frv/nlddf.cgs
    sim/testsuite/sim/frv/nlddfi.cgs
    sim/testsuite/sim/frv/nlddfu.cgs
    sim/testsuite/sim/frv/nlddi.cgs
    sim/testsuite/sim/frv/nlddu.cgs
    sim/testsuite/sim/frv/nldf.cgs
    sim/testsuite/sim/frv/nldfi.cgs
    sim/testsuite/sim/frv/nldfu.cgs
    sim/testsuite/sim/frv/nldhf.cgs
    sim/testsuite/sim/frv/nldhfi.cgs
    sim/testsuite/sim/frv/nldhfu.cgs
    sim/testsuite/sim/frv/nldi.cgs
    sim/testsuite/sim/frv/nldq.cgs
    sim/testsuite/sim/frv/nldqf.cgs
    sim/testsuite/sim/frv/nldqfi.cgs
    sim/testsuite/sim/frv/nldqfu.cgs
    sim/testsuite/sim/frv/nldqu.cgs
    sim/testsuite/sim/frv/nldsb.cgs
    sim/testsuite/sim/frv/nldsbi.cgs
    sim/testsuite/sim/frv/nldsbu.cgs
    sim/testsuite/sim/frv/nldsh.cgs
    sim/testsuite/sim/frv/nldshi.cgs
    sim/testsuite/sim/frv/nldshu.cgs
    sim/testsuite/sim/frv/nldu.cgs
    sim/testsuite/sim/frv/nldub.cgs
    sim/testsuite/sim/frv/nldubi.cgs
    sim/testsuite/sim/frv/nldubu.cgs
    sim/testsuite/sim/frv/nlduh.cgs
    sim/testsuite/sim/frv/nlduhi.cgs
    sim/testsuite/sim/frv/nlduhu.cgs
    sim/testsuite/sim/frv/nop.cgs
    sim/testsuite/sim/frv/norcr.cgs
    sim/testsuite/sim/frv/norncr.cgs
    sim/testsuite/sim/frv/not.cgs
    sim/testsuite/sim/frv/notcr.cgs
    sim/testsuite/sim/frv/nsdiv.cgs
    sim/testsuite/sim/frv/nsdivi.cgs
    sim/testsuite/sim/frv/nudiv.cgs
    sim/testsuite/sim/frv/nudivi.cgs
    sim/testsuite/sim/frv/or.cgs
    sim/testsuite/sim/frv/orcc.cgs
    sim/testsuite/sim/frv/orcr.cgs
    sim/testsuite/sim/frv/ori.cgs
    sim/testsuite/sim/frv/oricc.cgs
    sim/testsuite/sim/frv/orncr.cgs
    sim/testsuite/sim/frv/parallel.exp
    sim/testsuite/sim/frv/ret.cgs
    sim/testsuite/sim/frv/rett.cgs
    sim/testsuite/sim/frv/scan.cgs
    sim/testsuite/sim/frv/scani.cgs
    sim/testsuite/sim/frv/sdiv.cgs
    sim/testsuite/sim/frv/sdivi.cgs
    sim/testsuite/sim/frv/sethi.cgs
    sim/testsuite/sim/frv/sethilo.pcgs
    sim/testsuite/sim/frv/setlo.cgs
    sim/testsuite/sim/frv/setlos.cgs
    sim/testsuite/sim/frv/sll.cgs
    sim/testsuite/sim/frv/sllcc.cgs
    sim/testsuite/sim/frv/slli.cgs
    sim/testsuite/sim/frv/sllicc.cgs
    sim/testsuite/sim/frv/smul.cgs
    sim/testsuite/sim/frv/smulcc.cgs
    sim/testsuite/sim/frv/smuli.cgs
    sim/testsuite/sim/frv/smulicc.cgs
    sim/testsuite/sim/frv/sra.cgs
    sim/testsuite/sim/frv/sracc.cgs
    sim/testsuite/sim/frv/srai.cgs
    sim/testsuite/sim/frv/sraicc.cgs
    sim/testsuite/sim/frv/srl.cgs
    sim/testsuite/sim/frv/srlcc.cgs
    sim/testsuite/sim/frv/srli.cgs
    sim/testsuite/sim/frv/srlicc.cgs
    sim/testsuite/sim/frv/st.cgs
    sim/testsuite/sim/frv/stb.cgs
    sim/testsuite/sim/frv/stbf.cgs
    sim/testsuite/sim/frv/stbfi.cgs
    sim/testsuite/sim/frv/stbfu.cgs
    sim/testsuite/sim/frv/stbi.cgs
    sim/testsuite/sim/frv/stbu.cgs
    sim/testsuite/sim/frv/stc.cgs
    sim/testsuite/sim/frv/stcu.cgs
    sim/testsuite/sim/frv/std.cgs
    sim/testsuite/sim/frv/std.pcgs
    sim/testsuite/sim/frv/stdc.cgs
    sim/testsuite/sim/frv/stdc.pcgs
    sim/testsuite/sim/frv/stdcu.cgs
    sim/testsuite/sim/frv/stdf.cgs
    sim/testsuite/sim/frv/stdf.pcgs
    sim/testsuite/sim/frv/stdfi.cgs
    sim/testsuite/sim/frv/stdfu.cgs
    sim/testsuite/sim/frv/stdi.cgs
    sim/testsuite/sim/frv/stdu.cgs
    sim/testsuite/sim/frv/stf.cgs
    sim/testsuite/sim/frv/stfi.cgs
    sim/testsuite/sim/frv/stfu.cgs
    sim/testsuite/sim/frv/sth.cgs
    sim/testsuite/sim/frv/sthf.cgs
    sim/testsuite/sim/frv/sthfi.cgs
    sim/testsuite/sim/frv/sthfu.cgs
    sim/testsuite/sim/frv/sthi.cgs
    sim/testsuite/sim/frv/sthu.cgs
    sim/testsuite/sim/frv/sti.cgs
    sim/testsuite/sim/frv/stq.cgs
    sim/testsuite/sim/frv/stq.pcgs
    sim/testsuite/sim/frv/stqc.cgs
    sim/testsuite/sim/frv/stqc.pcgs
    sim/testsuite/sim/frv/stqcu.cgs
    sim/testsuite/sim/frv/stqf.cgs
    sim/testsuite/sim/frv/stqf.pcgs
    sim/testsuite/sim/frv/stqfi.cgs
    sim/testsuite/sim/frv/stqfu.cgs
    sim/testsuite/sim/frv/stqi.cgs
    sim/testsuite/sim/frv/stqu.cgs
    sim/testsuite/sim/frv/stu.cgs
    sim/testsuite/sim/frv/sub.cgs
    sim/testsuite/sim/frv/subcc.cgs
    sim/testsuite/sim/frv/subi.cgs
    sim/testsuite/sim/frv/subicc.cgs
    sim/testsuite/sim/frv/subx.cgs
    sim/testsuite/sim/frv/subxcc.cgs
    sim/testsuite/sim/frv/subxi.cgs
    sim/testsuite/sim/frv/subxicc.cgs
    sim/testsuite/sim/frv/swap.cgs
    sim/testsuite/sim/frv/swapi.cgs
    sim/testsuite/sim/frv/tc.cgs
    sim/testsuite/sim/frv/teq.cgs
    sim/testsuite/sim/frv/testutils.inc
    sim/testsuite/sim/frv/tge.cgs
    sim/testsuite/sim/frv/tgt.cgs
    sim/testsuite/sim/frv/thi.cgs
    sim/testsuite/sim/frv/tic.cgs
    sim/testsuite/sim/frv/tieq.cgs
    sim/testsuite/sim/frv/tige.cgs
    sim/testsuite/sim/frv/tigt.cgs
    sim/testsuite/sim/frv/tihi.cgs
    sim/testsuite/sim/frv/tile.cgs
    sim/testsuite/sim/frv/tils.cgs
    sim/testsuite/sim/frv/tilt.cgs
    sim/testsuite/sim/frv/tin.cgs
    sim/testsuite/sim/frv/tinc.cgs
    sim/testsuite/sim/frv/tine.cgs
    sim/testsuite/sim/frv/tino.cgs
    sim/testsuite/sim/frv/tinv.cgs
    sim/testsuite/sim/frv/tip.cgs
    sim/testsuite/sim/frv/tira.cgs
    sim/testsuite/sim/frv/tiv.cgs
    sim/testsuite/sim/frv/tle.cgs
    sim/testsuite/sim/frv/tls.cgs
    sim/testsuite/sim/frv/tlt.cgs
    sim/testsuite/sim/frv/tn.cgs
    sim/testsuite/sim/frv/tnc.cgs
    sim/testsuite/sim/frv/tne.cgs
    sim/testsuite/sim/frv/tno.cgs
    sim/testsuite/sim/frv/tnv.cgs
    sim/testsuite/sim/frv/tp.cgs
    sim/testsuite/sim/frv/tra.cgs
    sim/testsuite/sim/frv/tv.cgs
    sim/testsuite/sim/frv/udiv.cgs
    sim/testsuite/sim/frv/udivi.cgs
    sim/testsuite/sim/frv/umul.cgs
    sim/testsuite/sim/frv/umulcc.cgs
    sim/testsuite/sim/frv/umuli.cgs
    sim/testsuite/sim/frv/umulicc.cgs
    sim/testsuite/sim/frv/xor.cgs
    sim/testsuite/sim/frv/xorcc.cgs
    sim/testsuite/sim/frv/xorcr.cgs
    sim/testsuite/sim/frv/xori.cgs
    sim/testsuite/sim/frv/xoricc.cgs
    sim/testsuite/sim/h8300/ChangeLog
    sim/testsuite/sim/h8300/addb.s
    sim/testsuite/sim/h8300/addl.s
    sim/testsuite/sim/h8300/adds.s
    sim/testsuite/sim/h8300/addw.s
    sim/testsuite/sim/h8300/addx.s
    sim/testsuite/sim/h8300/allinsn.exp
    sim/testsuite/sim/h8300/andb.s
    sim/testsuite/sim/h8300/andl.s
    sim/testsuite/sim/h8300/andw.s
    sim/testsuite/sim/h8300/band.s
    sim/testsuite/sim/h8300/bfld.s
    sim/testsuite/sim/h8300/biand.s
    sim/testsuite/sim/h8300/bra.s
    sim/testsuite/sim/h8300/brabc.s
    sim/testsuite/sim/h8300/bset.s
    sim/testsuite/sim/h8300/cmpb.s
    sim/testsuite/sim/h8300/cmpl.s
    sim/testsuite/sim/h8300/cmpw.s
    sim/testsuite/sim/h8300/daa.s
    sim/testsuite/sim/h8300/das.s
    sim/testsuite/sim/h8300/dec.s
    sim/testsuite/sim/h8300/div.s
    sim/testsuite/sim/h8300/extl.s
    sim/testsuite/sim/h8300/extw.s
    sim/testsuite/sim/h8300/inc.s
    sim/testsuite/sim/h8300/jmp.s
    sim/testsuite/sim/h8300/ldc.s
    sim/testsuite/sim/h8300/ldm.s
    sim/testsuite/sim/h8300/mac.s
    sim/testsuite/sim/h8300/mova.s
    sim/testsuite/sim/h8300/movb.s
    sim/testsuite/sim/h8300/movl.s
    sim/testsuite/sim/h8300/movmd.s
    sim/testsuite/sim/h8300/movsd.s
    sim/testsuite/sim/h8300/movw.s
    sim/testsuite/sim/h8300/mul.s
    sim/testsuite/sim/h8300/neg.s
    sim/testsuite/sim/h8300/nop.s
    sim/testsuite/sim/h8300/not.s
    sim/testsuite/sim/h8300/orb.s
    sim/testsuite/sim/h8300/orl.s
    sim/testsuite/sim/h8300/orw.s
    sim/testsuite/sim/h8300/rotl.s
    sim/testsuite/sim/h8300/rotr.s
    sim/testsuite/sim/h8300/rotxl.s
    sim/testsuite/sim/h8300/rotxr.s
    sim/testsuite/sim/h8300/shal.s
    sim/testsuite/sim/h8300/shar.s
    sim/testsuite/sim/h8300/shll.s
    sim/testsuite/sim/h8300/shlr.s
    sim/testsuite/sim/h8300/stack.s
    sim/testsuite/sim/h8300/stc.s
    sim/testsuite/sim/h8300/subb.s
    sim/testsuite/sim/h8300/subl.s
    sim/testsuite/sim/h8300/subs.s
    sim/testsuite/sim/h8300/subw.s
    sim/testsuite/sim/h8300/subx.s
    sim/testsuite/sim/h8300/tas.s
    sim/testsuite/sim/h8300/testutils.inc
    sim/testsuite/sim/h8300/xorb.s
    sim/testsuite/sim/h8300/xorl.s
    sim/testsuite/sim/h8300/xorw.s
    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/testsuite/sim/mips/ChangeLog
    sim/testsuite/sim/mips/basic.exp
    sim/testsuite/sim/mips/fpu64-ps-sb1.s
    sim/testsuite/sim/mips/fpu64-ps.s
    sim/testsuite/sim/mips/hilo-hazard-1.s
    sim/testsuite/sim/mips/hilo-hazard-2.s
    sim/testsuite/sim/mips/hilo-hazard-3.s
    sim/testsuite/sim/mips/mdmx-ob-sb1.s
    sim/testsuite/sim/mips/mdmx-ob.s
    sim/testsuite/sim/mips/mips32-dsp.s
    sim/testsuite/sim/mips/mips32-dsp2.s
    sim/testsuite/sim/mips/sanity.s
    sim/testsuite/sim/mips/testutils.inc
    sim/testsuite/sim/mips/utils-dsp.inc
    sim/testsuite/sim/mips/utils-fpu.inc
    sim/testsuite/sim/mips/utils-mdmx.inc
    sim/testsuite/sim/sh/ChangeLog
    sim/testsuite/sim/sh/add.s
    sim/testsuite/sim/sh/allinsn.exp
    sim/testsuite/sim/sh/and.s
    sim/testsuite/sim/sh/bandor.s
    sim/testsuite/sim/sh/bandornot.s
    sim/testsuite/sim/sh/bclr.s
    sim/testsuite/sim/sh/bld.s
    sim/testsuite/sim/sh/bldnot.s
    sim/testsuite/sim/sh/bset.s
    sim/testsuite/sim/sh/bst.s
    sim/testsuite/sim/sh/bxor.s
    sim/testsuite/sim/sh/clip.s
    sim/testsuite/sim/sh/div.s
    sim/testsuite/sim/sh/dmxy.s
    sim/testsuite/sim/sh/fabs.s
    sim/testsuite/sim/sh/fadd.s
    sim/testsuite/sim/sh/fail.s
    sim/testsuite/sim/sh/fcmpeq.s
    sim/testsuite/sim/sh/fcmpgt.s
    sim/testsuite/sim/sh/fcnvds.s
    sim/testsuite/sim/sh/fcnvsd.s
    sim/testsuite/sim/sh/fdiv.s
    sim/testsuite/sim/sh/fipr.s
    sim/testsuite/sim/sh/fldi0.s
    sim/testsuite/sim/sh/fldi1.s
    sim/testsuite/sim/sh/flds.s
    sim/testsuite/sim/sh/float.s
    sim/testsuite/sim/sh/fmac.s
    sim/testsuite/sim/sh/fmov.s
    sim/testsuite/sim/sh/fmul.s
    sim/testsuite/sim/sh/fneg.s
    sim/testsuite/sim/sh/fpchg.s
    sim/testsuite/sim/sh/frchg.s
    sim/testsuite/sim/sh/fsca.s
    sim/testsuite/sim/sh/fschg.s
    sim/testsuite/sim/sh/fsqrt.s
    sim/testsuite/sim/sh/fsrra.s
    sim/testsuite/sim/sh/fsub.s
    sim/testsuite/sim/sh/ftrc.s
    sim/testsuite/sim/sh/ldrc.s
    sim/testsuite/sim/sh/loop.s
    sim/testsuite/sim/sh/macl.s
    sim/testsuite/sim/sh/macw.s
    sim/testsuite/sim/sh/mov.s
    sim/testsuite/sim/sh/movi.s
    sim/testsuite/sim/sh/movli.s
    sim/testsuite/sim/sh/movua.s
    sim/testsuite/sim/sh/movxy.s
    sim/testsuite/sim/sh/mulr.s
    sim/testsuite/sim/sh/pabs.s
    sim/testsuite/sim/sh/padd.s
    sim/testsuite/sim/sh/paddc.s
    sim/testsuite/sim/sh/pand.s
    sim/testsuite/sim/sh/pass.s
    sim/testsuite/sim/sh/pclr.s
    sim/testsuite/sim/sh/pdec.s
    sim/testsuite/sim/sh/pdmsb.s
    sim/testsuite/sim/sh/pinc.s
    sim/testsuite/sim/sh/pmuls.s
    sim/testsuite/sim/sh/prnd.s
    sim/testsuite/sim/sh/pshai.s
    sim/testsuite/sim/sh/pshar.s
    sim/testsuite/sim/sh/pshli.s
    sim/testsuite/sim/sh/pshlr.s
    sim/testsuite/sim/sh/psub.s
    sim/testsuite/sim/sh/pswap.s
    sim/testsuite/sim/sh/pushpop.s
    sim/testsuite/sim/sh/resbank.s
    sim/testsuite/sim/sh/sett.s
    sim/testsuite/sim/sh/shll.s
    sim/testsuite/sim/sh/shll16.s
    sim/testsuite/sim/sh/shll2.s
    sim/testsuite/sim/sh/shll8.s
    sim/testsuite/sim/sh/shlr.s
    sim/testsuite/sim/sh/shlr16.s
    sim/testsuite/sim/sh/shlr2.s
    sim/testsuite/sim/sh/shlr8.s
    sim/testsuite/sim/sh/swap.s
    sim/testsuite/sim/sh/testutils.inc
    sim/testsuite/sim/sh64/ChangeLog
    sim/testsuite/sim/sh64/compact.exp
    sim/testsuite/sim/sh64/compact/ChangeLog
    sim/testsuite/sim/sh64/compact/add.cgs
    sim/testsuite/sim/sh64/compact/addc.cgs
    sim/testsuite/sim/sh64/compact/addi.cgs
    sim/testsuite/sim/sh64/compact/addv.cgs
    sim/testsuite/sim/sh64/compact/and.cgs
    sim/testsuite/sim/sh64/compact/andb.cgs
    sim/testsuite/sim/sh64/compact/andi.cgs
    sim/testsuite/sim/sh64/compact/bf.cgs
    sim/testsuite/sim/sh64/compact/bfs.cgs
    sim/testsuite/sim/sh64/compact/bra.cgs
    sim/testsuite/sim/sh64/compact/braf.cgs
    sim/testsuite/sim/sh64/compact/brk.cgs
    sim/testsuite/sim/sh64/compact/bsr.cgs
    sim/testsuite/sim/sh64/compact/bsrf.cgs
    sim/testsuite/sim/sh64/compact/bt.cgs
    sim/testsuite/sim/sh64/compact/bts.cgs
    sim/testsuite/sim/sh64/compact/clrmac.cgs
    sim/testsuite/sim/sh64/compact/clrs.cgs
    sim/testsuite/sim/sh64/compact/clrt.cgs
    sim/testsuite/sim/sh64/compact/cmpeq.cgs
    sim/testsuite/sim/sh64/compact/cmpeqi.cgs
    sim/testsuite/sim/sh64/compact/cmpge.cgs
    sim/testsuite/sim/sh64/compact/cmpgt.cgs
    sim/testsuite/sim/sh64/compact/cmphi.cgs
    sim/testsuite/sim/sh64/compact/cmphs.cgs
    sim/testsuite/sim/sh64/compact/cmppl.cgs
    sim/testsuite/sim/sh64/compact/cmppz.cgs
    sim/testsuite/sim/sh64/compact/cmpstr.cgs
    sim/testsuite/sim/sh64/compact/div0s.cgs
    sim/testsuite/sim/sh64/compact/div0u.cgs
    sim/testsuite/sim/sh64/compact/div1.cgs
    sim/testsuite/sim/sh64/compact/dmulsl.cgs
    sim/testsuite/sim/sh64/compact/dmulul.cgs
    sim/testsuite/sim/sh64/compact/dt.cgs
    sim/testsuite/sim/sh64/compact/extsb.cgs
    sim/testsuite/sim/sh64/compact/extsw.cgs
    sim/testsuite/sim/sh64/compact/extub.cgs
    sim/testsuite/sim/sh64/compact/extuw.cgs
    sim/testsuite/sim/sh64/compact/fabs.cgs
    sim/testsuite/sim/sh64/compact/fadd.cgs
    sim/testsuite/sim/sh64/compact/fcmpeq.cgs
    sim/testsuite/sim/sh64/compact/fcmpgt.cgs
    sim/testsuite/sim/sh64/compact/fcnvds.cgs
    sim/testsuite/sim/sh64/compact/fcnvsd.cgs
    sim/testsuite/sim/sh64/compact/fdiv.cgs
    sim/testsuite/sim/sh64/compact/fipr.cgs
    sim/testsuite/sim/sh64/compact/fldi0.cgs
    sim/testsuite/sim/sh64/compact/fldi1.cgs
    sim/testsuite/sim/sh64/compact/flds.cgs
    sim/testsuite/sim/sh64/compact/float.cgs
    sim/testsuite/sim/sh64/compact/fmac.cgs
    sim/testsuite/sim/sh64/compact/fmov.cgs
    sim/testsuite/sim/sh64/compact/fmul.cgs
    sim/testsuite/sim/sh64/compact/fneg.cgs
    sim/testsuite/sim/sh64/compact/frchg.cgs
    sim/testsuite/sim/sh64/compact/fschg.cgs
    sim/testsuite/sim/sh64/compact/fsqrt.cgs
    sim/testsuite/sim/sh64/compact/fsts.cgs
    sim/testsuite/sim/sh64/compact/fsub.cgs
    sim/testsuite/sim/sh64/compact/ftrc.cgs
    sim/testsuite/sim/sh64/compact/ftrv.cgs
    sim/testsuite/sim/sh64/compact/jmp.cgs
    sim/testsuite/sim/sh64/compact/jsr.cgs
    sim/testsuite/sim/sh64/compact/ldc-gbr.cgs
    sim/testsuite/sim/sh64/compact/ldcl-gbr.cgs
    sim/testsuite/sim/sh64/compact/lds-fpscr.cgs
    sim/testsuite/sim/sh64/compact/lds-fpul.cgs
    sim/testsuite/sim/sh64/compact/lds-mach.cgs
    sim/testsuite/sim/sh64/compact/lds-macl.cgs
    sim/testsuite/sim/sh64/compact/lds-pr.cgs
    sim/testsuite/sim/sh64/compact/ldsl-fpscr.cgs
    sim/testsuite/sim/sh64/compact/ldsl-fpul.cgs
    sim/testsuite/sim/sh64/compact/ldsl-mach.cgs
    sim/testsuite/sim/sh64/compact/ldsl-macl.cgs
    sim/testsuite/sim/sh64/compact/ldsl-pr.cgs
    sim/testsuite/sim/sh64/compact/macl.cgs
    sim/testsuite/sim/sh64/compact/macw.cgs
    sim/testsuite/sim/sh64/compact/mov.cgs
    sim/testsuite/sim/sh64/compact/mova.cgs
    sim/testsuite/sim/sh64/compact/movb1.cgs
    sim/testsuite/sim/sh64/compact/movb10.cgs
    sim/testsuite/sim/sh64/compact/movb2.cgs
    sim/testsuite/sim/sh64/compact/movb3.cgs
    sim/testsuite/sim/sh64/compact/movb4.cgs
    sim/testsuite/sim/sh64/compact/movb5.cgs
    sim/testsuite/sim/sh64/compact/movb6.cgs
    sim/testsuite/sim/sh64/compact/movb7.cgs
    sim/testsuite/sim/sh64/compact/movb8.cgs
    sim/testsuite/sim/sh64/compact/movb9.cgs
    sim/testsuite/sim/sh64/compact/movcal.cgs
    sim/testsuite/sim/sh64/compact/movi.cgs
    sim/testsuite/sim/sh64/compact/movl1.cgs
    sim/testsuite/sim/sh64/compact/movl10.cgs
    sim/testsuite/sim/sh64/compact/movl11.cgs
    sim/testsuite/sim/sh64/compact/movl2.cgs
    sim/testsuite/sim/sh64/compact/movl3.cgs
    sim/testsuite/sim/sh64/compact/movl4.cgs
    sim/testsuite/sim/sh64/compact/movl5.cgs
    sim/testsuite/sim/sh64/compact/movl6.cgs
    sim/testsuite/sim/sh64/compact/movl7.cgs
    sim/testsuite/sim/sh64/compact/movl8.cgs
    sim/testsuite/sim/sh64/compact/movl9.cgs
    sim/testsuite/sim/sh64/compact/movt.cgs
    sim/testsuite/sim/sh64/compact/movw1.cgs
    sim/testsuite/sim/sh64/compact/movw10.cgs
    sim/testsuite/sim/sh64/compact/movw11.cgs
    sim/testsuite/sim/sh64/compact/movw2.cgs
    sim/testsuite/sim/sh64/compact/movw3.cgs
    sim/testsuite/sim/sh64/compact/movw4.cgs
    sim/testsuite/sim/sh64/compact/movw5.cgs
    sim/testsuite/sim/sh64/compact/movw6.cgs
    sim/testsuite/sim/sh64/compact/movw7.cgs
    sim/testsuite/sim/sh64/compact/movw8.cgs
    sim/testsuite/sim/sh64/compact/movw9.cgs
    sim/testsuite/sim/sh64/compact/mull.cgs
    sim/testsuite/sim/sh64/compact/mulsw.cgs
    sim/testsuite/sim/sh64/compact/muluw.cgs
    sim/testsuite/sim/sh64/compact/neg.cgs
    sim/testsuite/sim/sh64/compact/negc.cgs
    sim/testsuite/sim/sh64/compact/nop.cgs
    sim/testsuite/sim/sh64/compact/not.cgs
    sim/testsuite/sim/sh64/compact/ocbi.cgs
    sim/testsuite/sim/sh64/compact/ocbp.cgs
    sim/testsuite/sim/sh64/compact/ocbwb.cgs
    sim/testsuite/sim/sh64/compact/or.cgs
    sim/testsuite/sim/sh64/compact/orb.cgs
    sim/testsuite/sim/sh64/compact/ori.cgs
    sim/testsuite/sim/sh64/compact/pref.cgs
    sim/testsuite/sim/sh64/compact/rotcl.cgs
    sim/testsuite/sim/sh64/compact/rotcr.cgs
    sim/testsuite/sim/sh64/compact/rotl.cgs
    sim/testsuite/sim/sh64/compact/rotr.cgs
    sim/testsuite/sim/sh64/compact/rts.cgs
    sim/testsuite/sim/sh64/compact/sets.cgs
    sim/testsuite/sim/sh64/compact/sett.cgs
    sim/testsuite/sim/sh64/compact/shad.cgs
    sim/testsuite/sim/sh64/compact/shal.cgs
    sim/testsuite/sim/sh64/compact/shar.cgs
    sim/testsuite/sim/sh64/compact/shld.cgs
    sim/testsuite/sim/sh64/compact/shll.cgs
    sim/testsuite/sim/sh64/compact/shll16.cgs
    sim/testsuite/sim/sh64/compact/shll2.cgs
    sim/testsuite/sim/sh64/compact/shll8.cgs
    sim/testsuite/sim/sh64/compact/shlr.cgs
    sim/testsuite/sim/sh64/compact/shlr16.cgs
    sim/testsuite/sim/sh64/compact/shlr2.cgs
    sim/testsuite/sim/sh64/compact/shlr8.cgs
    sim/testsuite/sim/sh64/compact/stc-gbr.cgs
    sim/testsuite/sim/sh64/compact/stcl-gbr.cgs
    sim/testsuite/sim/sh64/compact/sts-fpscr.cgs
    sim/testsuite/sim/sh64/compact/sts-fpul.cgs
    sim/testsuite/sim/sh64/compact/sts-mach.cgs
    sim/testsuite/sim/sh64/compact/sts-macl.cgs
    sim/testsuite/sim/sh64/compact/sts-pr.cgs
    sim/testsuite/sim/sh64/compact/stsl-fpscr.cgs
    sim/testsuite/sim/sh64/compact/stsl-fpul.cgs
    sim/testsuite/sim/sh64/compact/stsl-mach.cgs
    sim/testsuite/sim/sh64/compact/stsl-macl.cgs
    sim/testsuite/sim/sh64/compact/stsl-pr.cgs
    sim/testsuite/sim/sh64/compact/sub.cgs
    sim/testsuite/sim/sh64/compact/subc.cgs
    sim/testsuite/sim/sh64/compact/subv.cgs
    sim/testsuite/sim/sh64/compact/swapb.cgs
    sim/testsuite/sim/sh64/compact/swapw.cgs
    sim/testsuite/sim/sh64/compact/tasb.cgs
    sim/testsuite/sim/sh64/compact/testutils.inc
    sim/testsuite/sim/sh64/compact/trapa.cgs
    sim/testsuite/sim/sh64/compact/tst.cgs
    sim/testsuite/sim/sh64/compact/tstb.cgs
    sim/testsuite/sim/sh64/compact/tsti.cgs
    sim/testsuite/sim/sh64/compact/xor.cgs
    sim/testsuite/sim/sh64/compact/xorb.cgs
    sim/testsuite/sim/sh64/compact/xori.cgs
    sim/testsuite/sim/sh64/compact/xtrct.cgs
    sim/testsuite/sim/sh64/interwork.exp
    sim/testsuite/sim/sh64/media.exp
    sim/testsuite/sim/sh64/media/ChangeLog
    sim/testsuite/sim/sh64/media/add.cgs
    sim/testsuite/sim/sh64/media/addi.cgs
    sim/testsuite/sim/sh64/media/addil.cgs
    sim/testsuite/sim/sh64/media/addl.cgs
    sim/testsuite/sim/sh64/media/addzl.cgs
    sim/testsuite/sim/sh64/media/alloco.cgs
    sim/testsuite/sim/sh64/media/and.cgs
    sim/testsuite/sim/sh64/media/andc.cgs
    sim/testsuite/sim/sh64/media/andi.cgs
    sim/testsuite/sim/sh64/media/beq.cgs
    sim/testsuite/sim/sh64/media/beqi.cgs
    sim/testsuite/sim/sh64/media/bge.cgs
    sim/testsuite/sim/sh64/media/bgeu.cgs
    sim/testsuite/sim/sh64/media/bgt.cgs
    sim/testsuite/sim/sh64/media/bgtu.cgs
    sim/testsuite/sim/sh64/media/blink.cgs
    sim/testsuite/sim/sh64/media/bne.cgs
    sim/testsuite/sim/sh64/media/bnei.cgs
    sim/testsuite/sim/sh64/media/brk.cgs
    sim/testsuite/sim/sh64/media/byterev.cgs
    sim/testsuite/sim/sh64/media/cmpeq.cgs
    sim/testsuite/sim/sh64/media/cmpgt.cgs
    sim/testsuite/sim/sh64/media/cmpgtu.cgs
    sim/testsuite/sim/sh64/media/cmveq.cgs
    sim/testsuite/sim/sh64/media/cmvne.cgs
    sim/testsuite/sim/sh64/media/fabsd.cgs
    sim/testsuite/sim/sh64/media/fabss.cgs
    sim/testsuite/sim/sh64/media/faddd.cgs
    sim/testsuite/sim/sh64/media/fadds.cgs
    sim/testsuite/sim/sh64/media/fcmpeqd.cgs
    sim/testsuite/sim/sh64/media/fcmpeqs.cgs
    sim/testsuite/sim/sh64/media/fcmpged.cgs
    sim/testsuite/sim/sh64/media/fcmpges.cgs
    sim/testsuite/sim/sh64/media/fcmpgtd.cgs
    sim/testsuite/sim/sh64/media/fcmpgts.cgs
    sim/testsuite/sim/sh64/media/fcmpund.cgs
    sim/testsuite/sim/sh64/media/fcmpuns.cgs
    sim/testsuite/sim/sh64/media/fcnvds.cgs
    sim/testsuite/sim/sh64/media/fcnvsd.cgs
    sim/testsuite/sim/sh64/media/fdivd.cgs
    sim/testsuite/sim/sh64/media/fdivs.cgs
    sim/testsuite/sim/sh64/media/fgetscr.cgs
    sim/testsuite/sim/sh64/media/fiprs.cgs
    sim/testsuite/sim/sh64/media/fldd.cgs
    sim/testsuite/sim/sh64/media/fldp.cgs
    sim/testsuite/sim/sh64/media/flds.cgs
    sim/testsuite/sim/sh64/media/fldxd.cgs
    sim/testsuite/sim/sh64/media/fldxp.cgs
    sim/testsuite/sim/sh64/media/fldxs.cgs
    sim/testsuite/sim/sh64/media/floatld.cgs
    sim/testsuite/sim/sh64/media/floatls.cgs
    sim/testsuite/sim/sh64/media/floatqd.cgs
    sim/testsuite/sim/sh64/media/floatqs.cgs
    sim/testsuite/sim/sh64/media/fmacs.cgs
    sim/testsuite/sim/sh64/media/fmovd.cgs
    sim/testsuite/sim/sh64/media/fmovdq.cgs
    sim/testsuite/sim/sh64/media/fmovls.cgs
    sim/testsuite/sim/sh64/media/fmovqd.cgs
    sim/testsuite/sim/sh64/media/fmovs.cgs
    sim/testsuite/sim/sh64/media/fmovsl.cgs
    sim/testsuite/sim/sh64/media/fmuld.cgs
    sim/testsuite/sim/sh64/media/fmuls.cgs
    sim/testsuite/sim/sh64/media/fnegd.cgs
    sim/testsuite/sim/sh64/media/fnegs.cgs
    sim/testsuite/sim/sh64/media/fputscr.cgs
    sim/testsuite/sim/sh64/media/fsqrtd.cgs
    sim/testsuite/sim/sh64/media/fsqrts.cgs
    sim/testsuite/sim/sh64/media/fstd.cgs
    sim/testsuite/sim/sh64/media/fstp.cgs
    sim/testsuite/sim/sh64/media/fsts.cgs
    sim/testsuite/sim/sh64/media/fstxd.cgs
    sim/testsuite/sim/sh64/media/fstxp.cgs
    sim/testsuite/sim/sh64/media/fstxs.cgs
    sim/testsuite/sim/sh64/media/fsubd.cgs
    sim/testsuite/sim/sh64/media/fsubs.cgs
    sim/testsuite/sim/sh64/media/ftrcdl.cgs
    sim/testsuite/sim/sh64/media/ftrcdq.cgs
    sim/testsuite/sim/sh64/media/ftrcsl.cgs
    sim/testsuite/sim/sh64/media/ftrcsq.cgs
    sim/testsuite/sim/sh64/media/ftrvs.cgs
    sim/testsuite/sim/sh64/media/getcfg.cgs
    sim/testsuite/sim/sh64/media/getcon.cgs
    sim/testsuite/sim/sh64/media/gettr.cgs
    sim/testsuite/sim/sh64/media/icbi.cgs
    sim/testsuite/sim/sh64/media/ldb.cgs
    sim/testsuite/sim/sh64/media/ldhil.cgs
    sim/testsuite/sim/sh64/media/ldhiq.cgs
    sim/testsuite/sim/sh64/media/ldl.cgs
    sim/testsuite/sim/sh64/media/ldlol.cgs
    sim/testsuite/sim/sh64/media/ldloq.cgs
    sim/testsuite/sim/sh64/media/ldq.cgs
    sim/testsuite/sim/sh64/media/ldub.cgs
    sim/testsuite/sim/sh64/media/lduw.cgs
    sim/testsuite/sim/sh64/media/ldw.cgs
    sim/testsuite/sim/sh64/media/ldxb.cgs
    sim/testsuite/sim/sh64/media/ldxl.cgs
    sim/testsuite/sim/sh64/media/ldxq.cgs
    sim/testsuite/sim/sh64/media/ldxub.cgs
    sim/testsuite/sim/sh64/media/ldxuw.cgs
    sim/testsuite/sim/sh64/media/ldxw.cgs
    sim/testsuite/sim/sh64/media/mabsl.cgs
    sim/testsuite/sim/sh64/media/mabsw.cgs
    sim/testsuite/sim/sh64/media/maddl.cgs
    sim/testsuite/sim/sh64/media/maddsl.cgs
    sim/testsuite/sim/sh64/media/maddsub.cgs
    sim/testsuite/sim/sh64/media/maddsw.cgs
    sim/testsuite/sim/sh64/media/maddw.cgs
    sim/testsuite/sim/sh64/media/mcmpeqb.cgs
    sim/testsuite/sim/sh64/media/mcmpeql.cgs
    sim/testsuite/sim/sh64/media/mcmpeqw.cgs
    sim/testsuite/sim/sh64/media/mcmpgtl.cgs
    sim/testsuite/sim/sh64/media/mcmpgtub.cgs
    sim/testsuite/sim/sh64/media/mcmpgtw.cgs
    sim/testsuite/sim/sh64/media/mcmv.cgs
    sim/testsuite/sim/sh64/media/mcnvslw.cgs
    sim/testsuite/sim/sh64/media/mcnvswb.cgs
    sim/testsuite/sim/sh64/media/mcnvswub.cgs
    sim/testsuite/sim/sh64/media/mextr1.cgs
    sim/testsuite/sim/sh64/media/mextr2.cgs
    sim/testsuite/sim/sh64/media/mextr3.cgs
    sim/testsuite/sim/sh64/media/mextr4.cgs
    sim/testsuite/sim/sh64/media/mextr5.cgs
    sim/testsuite/sim/sh64/media/mextr6.cgs
    sim/testsuite/sim/sh64/media/mextr7.cgs
    sim/testsuite/sim/sh64/media/mmacfxwl.cgs
    sim/testsuite/sim/sh64/media/mmacnfx-wl.cgs
    sim/testsuite/sim/sh64/media/mmulfxl.cgs
    sim/testsuite/sim/sh64/media/mmulfxrpw.cgs
    sim/testsuite/sim/sh64/media/mmulfxw.cgs
    sim/testsuite/sim/sh64/media/mmulhiwl.cgs
    sim/testsuite/sim/sh64/media/mmull.cgs
    sim/testsuite/sim/sh64/media/mmullowl.cgs
    sim/testsuite/sim/sh64/media/mmulsumwq.cgs
    sim/testsuite/sim/sh64/media/mmulw.cgs
    sim/testsuite/sim/sh64/media/movi.cgs
    sim/testsuite/sim/sh64/media/mpermw.cgs
    sim/testsuite/sim/sh64/media/msadubq.cgs
    sim/testsuite/sim/sh64/media/mshaldsl.cgs
    sim/testsuite/sim/sh64/media/mshaldsw.cgs
    sim/testsuite/sim/sh64/media/mshardl.cgs
    sim/testsuite/sim/sh64/media/mshardsq.cgs
    sim/testsuite/sim/sh64/media/mshardw.cgs
    sim/testsuite/sim/sh64/media/mshfhib.cgs
    sim/testsuite/sim/sh64/media/mshfhil.cgs
    sim/testsuite/sim/sh64/media/mshfhiw.cgs
    sim/testsuite/sim/sh64/media/mshflob.cgs
    sim/testsuite/sim/sh64/media/mshflol.cgs
    sim/testsuite/sim/sh64/media/mshflow.cgs
    sim/testsuite/sim/sh64/media/mshlldl.cgs
    sim/testsuite/sim/sh64/media/mshlldw.cgs
    sim/testsuite/sim/sh64/media/mshlrdl.cgs
    sim/testsuite/sim/sh64/media/mshlrdw.cgs
    sim/testsuite/sim/sh64/media/msubl.cgs
    sim/testsuite/sim/sh64/media/msubsl.cgs
    sim/testsuite/sim/sh64/media/msubsub.cgs
    sim/testsuite/sim/sh64/media/msubsw.cgs
    sim/testsuite/sim/sh64/media/msubw.cgs
    sim/testsuite/sim/sh64/media/mulsl.cgs
    sim/testsuite/sim/sh64/media/mulul.cgs
    sim/testsuite/sim/sh64/media/nop.cgs
    sim/testsuite/sim/sh64/media/nsb.cgs
    sim/testsuite/sim/sh64/media/ocbi.cgs
    sim/testsuite/sim/sh64/media/ocbp.cgs
    sim/testsuite/sim/sh64/media/ocbwb.cgs
    sim/testsuite/sim/sh64/media/or.cgs
    sim/testsuite/sim/sh64/media/ori.cgs
    sim/testsuite/sim/sh64/media/prefi.cgs
    sim/testsuite/sim/sh64/media/pta.cgs
    sim/testsuite/sim/sh64/media/ptabs.cgs
    sim/testsuite/sim/sh64/media/ptb.cgs
    sim/testsuite/sim/sh64/media/ptrel.cgs
    sim/testsuite/sim/sh64/media/putcfg.cgs
    sim/testsuite/sim/sh64/media/putcon.cgs
    sim/testsuite/sim/sh64/media/rte.cgs
    sim/testsuite/sim/sh64/media/shard.cgs
    sim/testsuite/sim/sh64/media/shardl.cgs
    sim/testsuite/sim/sh64/media/shari.cgs
    sim/testsuite/sim/sh64/media/sharil.cgs
    sim/testsuite/sim/sh64/media/shlld.cgs
    sim/testsuite/sim/sh64/media/shlldl.cgs
    sim/testsuite/sim/sh64/media/shlli.cgs
    sim/testsuite/sim/sh64/media/shllil.cgs
    sim/testsuite/sim/sh64/media/shlrd.cgs
    sim/testsuite/sim/sh64/media/shlrdl.cgs
    sim/testsuite/sim/sh64/media/shlri.cgs
    sim/testsuite/sim/sh64/media/shlril.cgs
    sim/testsuite/sim/sh64/media/shori.cgs
    sim/testsuite/sim/sh64/media/sleep.cgs
    sim/testsuite/sim/sh64/media/stb.cgs
    sim/testsuite/sim/sh64/media/sthil.cgs
    sim/testsuite/sim/sh64/media/sthiq.cgs
    sim/testsuite/sim/sh64/media/stl.cgs
    sim/testsuite/sim/sh64/media/stlol.cgs
    sim/testsuite/sim/sh64/media/stloq.cgs
    sim/testsuite/sim/sh64/media/stq.cgs
    sim/testsuite/sim/sh64/media/stw.cgs
    sim/testsuite/sim/sh64/media/stxb.cgs
    sim/testsuite/sim/sh64/media/stxl.cgs
    sim/testsuite/sim/sh64/media/stxq.cgs
    sim/testsuite/sim/sh64/media/stxw.cgs
    sim/testsuite/sim/sh64/media/sub.cgs
    sim/testsuite/sim/sh64/media/subl.cgs
    sim/testsuite/sim/sh64/media/swapq.cgs
    sim/testsuite/sim/sh64/media/synci.cgs
    sim/testsuite/sim/sh64/media/synco.cgs
    sim/testsuite/sim/sh64/media/testutils.inc
    sim/testsuite/sim/sh64/media/trapa.cgs
    sim/testsuite/sim/sh64/media/xor.cgs
    sim/testsuite/sim/sh64/media/xori.cgs
    sim/testsuite/sim/sh64/misc/fr-dr.s
    sim/testsuite/sim/v850/allinsns.exp
    sim/testsuite/sim/v850/bsh.cgs
    sim/testsuite/sim/v850/div.cgs
    sim/testsuite/sim/v850/divh.cgs
    sim/testsuite/sim/v850/divh_3.cgs
    sim/testsuite/sim/v850/divhu.cgs
    sim/testsuite/sim/v850/divu.cgs
    sim/testsuite/sim/v850/sar.cgs
    sim/testsuite/sim/v850/satadd.cgs
    sim/testsuite/sim/v850/satsub.cgs
    sim/testsuite/sim/v850/satsubi.cgs
    sim/testsuite/sim/v850/satsubr.cgs
    sim/testsuite/sim/v850/shl.cgs
    sim/testsuite/sim/v850/shr.cgs
    sim/testsuite/sim/v850/testutils.cgs
    sim/testsuite/sim/v850/testutils.inc
    sim/v850/ChangeLog
    sim/v850/Makefile.in
    sim/v850/config.in
    sim/v850/configure
    sim/v850/configure.ac
    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
2009-06-28 00:00:09 +00:00
5655 changed files with 0 additions and 2194060 deletions

View File

@@ -1,52 +0,0 @@
@echo off
Rem
Rem WARNING WARNING WARNING: This file needs to have DOS CRLF end-of-line
Rem format, or else stock DOS/Windows shells will refuse to run it.
Rem
Rem This batch file unpacks the GDB distribution while simultaneously
Rem renaming some of the files whose names are invalid on DOS or conflict
Rem with other file names after truncation to DOS 8+3 namespace.
Rem
Rem Invoke like this:
Rem
Rem djunpack gdb-XYZ.tar
Rem
Rem where XYZ is the version number. If the argument includes leading
Rem directories, it MUST use backslashes, not forward slashes.
Rem
Rem The following 2 lines need to be changed with each new GDB release, to
Rem be identical to the name of the top-level directory where the GDB
Rem distribution unpacks itself.
set GDBVER=gdb-5.0
if "%GDBVER%"=="gdb-5.0" GoTo EnvOk
Rem If their environment space is too small, re-exec with a larger one
command.com /e:4096 /c %0 %1
GoTo End
:EnvOk
if not exist %1 GoTo NoArchive
djtar -x -p -o %GDBVER%/gdb/config/djgpp/fnchange.lst %1 > fnchange.tmp
Rem The following uses a feature of COPY whereby it does not copy
Rem empty files. We need that because the previous line will create
Rem an empty fnchange.tmp even if the command failed for some reason.
copy fnchange.tmp junk.tmp > nul
if not exist junk.tmp GoTo NoDjTar
del junk.tmp
sed -e "s,@V@,%GDBVER%,g" < fnchange.tmp > fnchange.lst
Rem See the comment above about the reason for using COPY.
copy fnchange.lst junk.tmp > nul
if not exist junk.tmp GoTo NoSed
del junk.tmp
djtar -x -n fnchange.lst %1
GoTo End
:NoSed
echo FAIL: Sed is not available.
GoTo End
:NoDjTar
echo FAIL: DJTAR is not available or no fnchange.lst file in %1.
GoTo End
:NoArchive
echo FAIL: the file %1 does not seem to exist.
echo Remember that %1 cannot use forward slashes, only backslashes.
GoTo End
:End
set GDBVER=

View File

@@ -1,144 +0,0 @@
Contributing to GDB
GDB is a collaborative project and one which wants to encourage new
development. You may wish to fix GDB bugs, improve testing, port GDB
to a new platform, update documentation, add new GDB features, and the
like. To help with this, there is a lot of documentation
available.. In addition to the user guide and internals manual
included in the GDB distribution, the GDB web pages also contain much
information.
You may also want to submit your change so that can be considered for
conclusion in a future version of GDB (see below). Regardless, we
encourage you to distribute the change yourself.
If you don't feel up to hacking GDB, there are still plenty of ways to
help! You can answer questions on the mailing lists, write
documentation, find bugs, create a GDB related website (contribute to
the official GDB web site), or create a GDB related software
package. We welcome all of the above and feel free to ask on the GDB
mailing lists if you are looking for feedback or for people to review
a work in progress.
Ref: http://www.gnu.org/software/gdb/
Finally, there are certain legal requirements and style issues which
all contributors need to be aware of.
o Coding Standards
All contributions must conform to the GNU Coding Standard.
Submissions which do not conform to the standards will be
returned with a request to reformat the changes.
GDB has certain additional coding requirements. Those
requirements are explained in the GDB internals documentation
in the gdb/doc directory.
Ref: http://www.gnu.org/prep/standards_toc.html
o Copyright Assignment
Before we can accept code contributions from you, we need a
copyright assignment form filled out and filed with the FSF.
See some documentation by the FSF for details and contact us
(either via the GDB mailing list or the GDB maintainer that is
taking care of your contributions) to obtain the relevant
forms.
Small changes can be accepted without a copyright assignment form
on file.
Ref: http://www.gnu.org/prep/maintain.html#SEC6
o Submitting Patches
Every patch must have several pieces of information before we
can properly evaluate it.
A description of the bug and how your patch fixes this
bug. A reference to a testsuite failure is very helpful. For
new features a description of the feature and your
implementation.
A ChangeLog entry as plaintext (separate from the patch); see
the various ChangeLog files for format and content. Note that,
unlike some other projects, we do require ChangeLogs also for
documentation (i.e., .texi files).
The patch itself. If you are accessing the CVS repository use
"cvs update; cvs diff -cp"; else, use "diff -cp OLD NEW" or
"diff -up OLD NEW". If your version of diff does not support
these options, then get the latest version of GNU diff.
We accept patches as plain text (preferred for the compilers
themselves), MIME attachments (preferred for the web pages),
or as uuencoded gzipped text.
When you have all these pieces, bundle them up in a mail
message and send it to gdb-patches@sourceware.org. All
patches and related discussion should be sent to the
gdb-patches mailinglist. For further information on the GDB
CVS repository, see the Anonymous read-only CVS access and
Read-write CVS access page.
--
Supplemental information for GDB:
o Please try to run the relevant testsuite before and after
committing a patch
If the contributor doesn't do it then the maintainer will. A
contributor might include before/after test results in their
contribution.
o For bug fixes, please try to include a way of
demonstrating that the patch actually fixes something.
The best way of doing this is to ensure that the
testsuite contains one or more test cases that
fail without the fix but pass with the fix.
People are encouraged to submit patches that extend
the testsuite.
o Please read your patch before submitting it.
A patch containing several unrelated changes or
arbitrary reformats will be returned with a request
to re-formatting / split it.
o If ``gdb/configure.ac'' is modified then you don't
need to include patches to the regenerated file
``configure''.
The maintainer will re-generate those files
using autoconf (2.59 as of 2005-01-07).
o If ``gdb/gdbarch.sh'' is modified, you don't
need to include patches to the generated files
``gdbarch.h'' and ``gdbarch.c''.
See ``gdb/configure.ac'' above.
o When submitting a patch that fixes a bug
in GDB's bug database a brief reference
to the bug can be included in the ChangeLog
vis
* CONTRIBUTE: Mention PR convention.
Fix PR gdb/4705.
The text ``PR gdb/4705'' should also be included
in the CVS commit message. That causes the
patch to automatically be archived with the PR.

View File

@@ -1,342 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
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., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,653 +0,0 @@
GDB Maintainers
===============
Overview
--------
This file describes different groups of people who are, together, the
maintainers and developers of the GDB project. Don't worry - it sounds
more complicated than it really is.
There are four groups of GDB developers, covering the patch development and
review process:
- The Global Maintainers.
These are the developers in charge of most daily development. They
have wide authority to apply and reject patches, but defer to the
Responsible Maintainers (see below) within their spheres of
responsibility.
- The Responsible Maintainers.
These are developers who have expertise and interest in a particular
area of GDB, who are generally available to review patches, and who
prefer to enforce a single vision within their areas.
- The Authorized Committers.
These are developers who are trusted to make changes within a specific
area of GDB without additional oversight.
- The Write After Approval Maintainers.
These are developers who have write access to the GDB source tree. They
can check in their own changes once a developer with the appropriate
authority has approved the changes; they can also apply the Obvious
Fix Rule (below).
All maintainers are encouraged to post major patches to the gdb-patches
mailing list for comments, even if they have the authority to commit the
patch without review from another maintainer. This especially includes
patches which change internal interfaces (e.g. global functions, data
structures) or external interfaces (e.g. user, remote, MI, et cetera).
The term "review" is used in this file to describe several kinds of feedback
from a maintainer: approval, rejection, and requests for changes or
clarification with the intention of approving a revised version. Review is
a privilege and/or responsibility of various positions among the GDB
Maintainers. Of course, anyone - whether they hold a position but not the
relevant one for a particular patch, or are just following along on the
mailing lists for fun, or anything in between - may suggest changes or
ask questions about a patch!
There's also a couple of other people who play special roles in the GDB
community, separately from the patch process:
- The GDB Steering Committee.
These are the official (FSF-appointed) maintainers of GDB. They have
final and overriding authority for all GDB-related decisions, including
anything described in this file. The committee is not generally
involved in day-to-day development (although its members may be, as
individuals).
- The Release Manager.
This developer is in charge of making new releases of GDB.
- The Patch Champions.
These volunteers make sure that no contribution is overlooked or
forgotten.
Most changes to the list of maintainers in this file are handled by
consensus among the global maintainers and any other involved parties.
In cases where consensus can not be reached, the global maintainers may
ask the Steering Committee for a final decision.
The Obvious Fix Rule
--------------------
All maintainers listed in this file, including the Write After Approval
developers, are allowed to check in obvious fixes.
An "obvious fix" means that there is no possibility that anyone will
disagree with the change.
A good mental test is "will the person who hates my work the most be
able to find fault with the change" - if so, then it's not obvious and
needs to be posted first. :-)
Something like changing or bypassing an interface is _not_ an obvious
fix, since such a change without discussion will result in
instantaneous and loud complaints.
For documentation changes, about the only kind of fix that is obvious
is correction of a typo or bad English usage.
GDB Steering Committee
----------------------
The members of the GDB Steering Committee are the FSF-appointed
maintainers of the GDB project.
The Steering Committee has final authority for all GDB-related topics;
they may make whatever changes that they deem necessary, or that the FSF
requests. However, they are generally not involved in day-to-day
development.
The current members of the steering committee are listed below, in
alphabetical order. Their affiliations are provided for reference only -
their membership on the Steering Committee is individual and not through
their affiliation, and they act on behalf of the GNU project.
Jim Blandy (Mozilla)
Andrew Cagney (Red Hat)
Robert Dewar (AdaCore, NYU)
Klee Dienes (Apple)
Paul Hilfinger (UC Berkeley)
Dan Jacobowitz (CodeSourcery)
Stan Shebs (CodeSourcery)
Richard Stallman (FSF)
Ian Lance Taylor (C2)
Todd Whitesel
Global Maintainers
------------------
The global maintainers may review and commit any change to GDB, except in
areas with a Responsible Maintainer available. For major changes, or
changes to areas with other active developers, global maintainers are
strongly encouraged to post their own patches for feedback before
committing.
The global maintainers are responsible for reviewing patches to any area
for which no Responsible Maintainer is listed.
Global maintainers also have the authority to revert patches which should
not have been applied, e.g. patches which were not approved, controversial
patches committed under the Obvious Fix Rule, patches with important bugs
that can't be immediately fixed, or patches which go against an accepted and
documented roadmap for GDB development. Any global maintainer may request
the reversion of a patch. If no global maintainer, or responsible
maintainer in the affected areas, supports the patch (except for the
maintainer who originally committed it), then after 48 hours the maintainer
who called for the reversion may revert the patch.
No one may reapply a reverted patch without the agreement of the maintainer
who reverted it, or bringing the issue to the GDB Steering Committee for
discussion.
At the moment there are no documented roadmaps for GDB development; in the
future, if there are, a reference to the list will be included here.
The current global maintainers are (in alphabetical order):
Pedro Alves pedro@codesourcery.com
Jim Blandy jimb@red-bean.com
Joel Brobecker brobecker@adacore.com
Kevin Buettner kevinb@redhat.com
Andrew Cagney cagney@gnu.org
Daniel Jacobowitz dan@debian.org
Mark Kettenis kettenis@gnu.org
Stan Shebs stan@codesourcery.com
Michael Snyder msnyder@vmware.com
Tom Tromey tromey@redhat.com
Ulrich Weigand Ulrich.Weigand@de.ibm.com
Elena Zannoni elena.zannoni@oracle.com
Eli Zaretskii eliz@gnu.org
Release Manager
---------------
The current release manager is: Joel Brobecker <brobecker@adacore.com>
His responsibilities are:
* organizing, scheduling, and managing releases of GDB.
* deciding the approval and commit policies for release branches,
and can change them as needed.
Patch Champions
---------------
These volunteers track all patches submitted to the gdb-patches list. They
endeavor to prevent any posted patch from being overlooked; work with
contributors to meet GDB's coding style and general requirements, along with
FSF copyright assignments; remind (ping) responsible maintainers to review
patches; and ensure that contributors are given credit.
Current patch champions (in alphabetical order):
Randolph Chung <tausq@debian.org>
Responsible Maintainers
-----------------------
These developers have agreed to review patches in specific areas of GDB, in
which they have knowledge and experience. These areas are generally broad;
the role of a responsible maintainer is to provide coherent and cohesive
structure within their area of GDB, to assure that patches from many
different contributors all work together for the best results.
Global maintainers will defer to responsible maintainers within their areas,
as long as the responsible maintainer is active. Active means that
responsible maintainers agree to review submitted patches in their area
promptly; patches and followups should generally be answered within a week.
If a responsible maintainer is interested in reviewing a patch but will not
have time within a week of posting, the maintainer should send an
acknowledgement of the patch to the gdb-patches mailing list, and
plan to follow up with a review within a month. These deadlines are for
initial responses to a patch - if the maintainer has suggestions
or questions, it may take an extended discussion before the patch
is ready to commit. There are no written requirements for discussion,
but maintainers are asked to be responsive.
If a responsible maintainer misses these deadlines occasionally (e.g.
vacation or unexpected workload), it's not a disaster - any global
maintainer may step in to review the patch. But sometimes life intervenes
more permanently, and a maintainer may no longer have time for these duties.
When this happens, he or she should step down (either into the Authorized
Committers section if still interested in the area, or simply removed from
the list of Responsible Maintainers if not).
If a responsible maintainer is unresponsive for an extended period of time
without stepping down, please contact the Global Maintainers; they will try
to contact the maintainer directly and fix the problem - potentially by
removing that maintainer from their listed position.
If there are several maintainers for a given domain then any one of them
may review a submitted patch.
Target Instruction Set Architectures:
The *-tdep.c files. ISA (Instruction Set Architecture) and OS-ABI
(Operating System / Application Binary Interface) issues including CPU
variants.
The Target/Architecture maintainer works with the host maintainer when
resolving build issues. The Target/Architecture maintainer works with
the native maintainer when resolving ABI issues.
alpha --target=alpha-elf ,-Werror
arm --target=arm-elf ,-Werror
Richard Earnshaw rearnsha@arm.com
avr --target=avr ,-Werror
cris --target=cris-elf ,-Werror ,
(sim does not build with -Werror)
frv --target=frv-elf ,-Werror
h8300 --target=h8300-elf ,-Werror
i386 --target=i386-elf ,-Werror
Mark Kettenis kettenis@gnu.org
ia64 --target=ia64-linux-gnu ,-Werror
(--target=ia64-elf broken)
lm32 --target=lm32-elf ,-Werror
m32c --target=m32c-elf ,-Werror
m32r --target=m32r-elf ,-Werror
m68hc11 --target=m68hc11-elf ,-Werror ,
Stephane Carrez stcarrez@nerim.fr
m68k --target=m68k-elf ,-Werror
m88k --target=m88k-openbsd ,-Werror
Mark Kettenis kettenis@gnu.org
mcore Deleted
mep --target=mep-elf ,-Werror
Kevin Buettner kevinb@redhat.com
mips --target=mips-elf ,-Werror
mn10300 --target=mn10300-elf broken
(sim/ dies with make -j)
Michael Snyder msnyder@vmware.com
moxie --target=moxie-elf ,-Werror
Anthony Green green@moxielogic.com
ms1 --target=ms1-elf ,-Werror
Kevin Buettner kevinb@redhat.com
ns32k Deleted
pa --target=hppa-elf ,-Werror
powerpc --target=powerpc-eabi ,-Werror
s390 --target=s390-linux-gnu ,-Werror
score --target=score-elf
Qinwei qinwei@sunnorth.com.cn
sh --target=sh-elf ,-Werror
--target=sh64-elf ,-Werror
sparc --target=sparc64-solaris2.10 ,-Werror
(--target=sparc-elf broken)
spu --target=spu-elf ,-Werror
Ulrich Weigand uweigand@de.ibm.com
v850 --target=v850-elf ,-Werror
vax --target=vax-netbsd ,-Werror
x86-64 --target=x86_64-linux-gnu ,-Werror
xstormy16 --target=xstormy16-elf
Corinna Vinschen vinschen@redhat.com
xtensa --target=xtensa-elf
Maxim Grigoriev maxim2405@gmail.com
All developers recognized by this file can make arbitrary changes to
OBSOLETE targets.
The Bourne shell script gdb_mbuild.sh can be used to rebuild all the
above targets.
Host/Native:
The Native maintainer is responsible for target specific native
support - typically shared libraries and quirks to procfs/ptrace/...
The Native maintainer works with the Arch and Core maintainers when
resolving more generic problems.
The host maintainer ensures that gdb can be built as a cross debugger on
their platform.
AIX Joel Brobecker brobecker@adacore.com
djgpp native Eli Zaretskii eliz@gnu.org
GNU Hurd Alfred M. Szmidt ams@gnu.org
MS Windows (NT, '00, 9x, Me, XP) host & native
Chris Faylor cgf@alum.bu.edu
GNU/Linux/x86 native & host
Mark Kettenis kettenis@gnu.org
GNU/Linux MIPS native & host
Daniel Jacobowitz dan@debian.org
GNU/Linux m68k Andreas Schwab schwab@linux-m68k.org
FreeBSD native & host Mark Kettenis kettenis@gnu.org
Core: Generic components used by all of GDB
tracing Michael Snyder msnyder@vmware.com
threads Michael Snyder msnyder@vmware.com
Mark Kettenis kettenis@gnu.org
language support
Ada Joel Brobecker brobecker@adacore.com
Paul Hilfinger hilfinger@gnat.com
C++ Daniel Jacobowitz dan@debian.org
Objective C support Adam Fedor fedor@gnu.org
shared libs Kevin Buettner kevinb@redhat.com
MI interface Vladimir Prus vladimir@codesourcery.com
documentation Eli Zaretskii eliz@gnu.org
(including NEWS)
testsuite
gdbtk (gdb.gdbtk) Keith Seitz keiths@redhat.com
threads (gdb.threads) Michael Snyder msnyder@vmware.com
trace (gdb.trace) Michael Snyder msnyder@vmware.com
UI: External (user) interfaces.
gdbtk (c & tcl) Fernando Nasser fnasser@redhat.com
Keith Seitz keiths@redhat.com
libgui (w/foundry, sn) Keith Seitz keiths@redhat.com
Misc:
gdb/gdbserver Daniel Jacobowitz dan@debian.org
Makefile.in, configure* ALL
mmalloc/ ALL Host maintainers
sim/ See sim/MAINTAINERS
readline/ Master version: ftp://ftp.cwru.edu/pub/bash/
ALL
Host maintainers (host dependant parts)
(but get your changes into the master version)
tcl/ tk/ itcl/ ALL
Authorized Committers
---------------------
These are developers working on particular areas of GDB, who are trusted to
commit their own (or other developers') patches in those areas without
further review from a Global Maintainer or Responsible Maintainer. They are
under no obligation to review posted patches - but, of course, are invited
to do so!
PowerPC Andrew Cagney cagney@gnu.org
CRIS Hans-Peter Nilsson hp@axis.com
IA64 Jeff Johnston jjohnstn@redhat.com
MIPS Joel Brobecker brobecker@adacore.com
m32r Kei Sakamoto sakamoto.kei@renesas.com
PowerPC Kevin Buettner kevinb@redhat.com
CRIS Orjan Friberg orjanf@axis.com
HPPA Randolph Chung tausq@debian.org
S390 Ulrich Weigand uweigand@de.ibm.com
djgpp DJ Delorie dj@delorie.com
[Please use this address to contact DJ about DJGPP]
tui Stephane Carrez stcarrez@nerim.fr
ia64 Kevin Buettner kevinb@redhat.com
AIX Kevin Buettner kevinb@redhat.com
GNU/Linux PPC native Kevin Buettner kevinb@redhat.com
gdb.java tests Anthony Green green@redhat.com
FreeBSD native & host David O'Brien obrien@freebsd.org
event loop Elena Zannoni elena.zannoni@oracle.com
generic symtabs Elena Zannoni elena.zannoni@oracle.com
dwarf readers Elena Zannoni elena.zannoni@oracle.com
elf reader Elena Zannoni elena.zannoni@oracle.com
stabs reader Elena Zannoni elena.zannoni@oracle.com
readline/ Elena Zannoni elena.zannoni@oracle.com
NetBSD native & host Jason Thorpe thorpej@netbsd.org
Pascal support Pierre Muller muller@sourceware.org
avr Theodore A. Roth troth@openavr.org
Modula-2 support Gaius Mulley gaius@glam.ac.uk
Write After Approval
(alphabetic)
To get recommended for the Write After Approval list you need a valid
FSF assignment and have submitted one good patch.
Pedro Alves pedro_alves@portugalmail.pt
David Anderson davea@sgi.com
John David Anglin dave.anglin@nrc-cnrc.gc.ca
Shrinivas Atre shrinivasa@kpitcummins.com
Scott Bambrough scottb@netwinder.org
Thiago Jung Bauermann bauerman@br.ibm.com
Jon Beniston jon@beniston.com
Jan Beulich jbeulich@novell.com
Jim Blandy jimb@codesourcery.com
Philip Blundell philb@gnu.org
Per Bothner per@bothner.com
Joel Brobecker brobecker@adacore.com
Dave Brolley brolley@redhat.com
Paul Brook paul@codesourcery.com
Julian Brown julian@codesourcery.com
Kevin Buettner kevinb@redhat.com
Andrew Cagney cagney@gnu.org
David Carlton carlton@bactrian.org
Stephane Carrez stcarrez@nerim.fr
Michael Chastain mec.gnu@mindspring.com
Eric Christopher echristo@apple.com
Randolph Chung tausq@debian.org
Nick Clifton nickc@redhat.com
J.T. Conklin jtc@acorntoolworks.com
Brendan Conoboy blc@redhat.com
Ludovic Courtès ludo@gnu.org
DJ Delorie dj@redhat.com
Chris Demetriou cgd@google.com
Philippe De Muyter phdm@macqel.be
Dhananjay Deshpande dhananjayd@kpitcummins.com
Markus Deuling deuling@de.ibm.com
Klee Dienes kdienes@apple.com
Gabriel Dos Reis gdr@integrable-solutions.net
Richard Earnshaw rearnsha@arm.com
Steve Ellcey sje@cup.hp.com
Frank Ch. Eigler fche@redhat.com
Ben Elliston bje@gnu.org
Doug Evans dje@google.com
Adam Fedor fedor@gnu.org
Brian Ford ford@vss.fsi.com
Orjan Friberg orjanf@axis.com
Nathan Froyd froydnj@codesourcery.com
Gary Funck gary@intrepid.com
Paul Gilliam pgilliam@us.ibm.com
Tristan Gingold gingold@adacore.com
Raoul Gough RaoulGough@yahoo.co.uk
Anthony Green green@redhat.com
Matthew Green mrg@eterna.com.au
Maxim Grigoriev maxim2405@gmail.com
Jerome Guitton guitton@act-europe.fr
Ben Harris bjh21@netbsd.org
Richard Henderson rth@redhat.com
Aldy Hernandez aldyh@redhat.com
Paul Hilfinger hilfinger@gnat.com
Matt Hiller hiller@redhat.com
Kazu Hirata kazu@cs.umass.edu
Jeff Holcomb jeffh@redhat.com
Don Howard dhoward@redhat.com
Nick Hudson nick.hudson@dsl.pipex.com
Martin Hunt hunt@redhat.com
Jim Ingham jingham@apple.com
Baurzhan Ismagulov ibr@radix50.net
Manoj Iyer manjo@austin.ibm.com
Daniel Jacobowitz dan@debian.org
Andreas Jaeger aj@suse.de
Jeff Johnston jjohnstn@redhat.com
Geoff Keating geoffk@redhat.com
Mark Kettenis kettenis@gnu.org
Marc Khouzam marc.khouzam@ericsson.com
Jim Kingdon kingdon@panix.com
Jan Kratochvil jan.kratochvil@redhat.com
Jonathan Larmour jifl@ecoscentric.com
Jeff Law law@redhat.com
David Lecomber david@streamline-computing.com
Robert Lipe rjl@sco.com
Sandra Loosemore sandra@codesourcery.com
H.J. Lu hjl.tools@gmail.com
Michal Ludvig mludvig@suse.cz
Luis Machado luisgpm@br.ibm.com
Glen McCready gkm@redhat.com
Greg McGary greg@mcgary.org
Roland McGrath roland@redhat.com
Bryce McKinlay mckinlay@redhat.com
Jason Merrill jason@redhat.com
David S. Miller davem@redhat.com
Mark Mitchell mark@codesourcery.com
Marko Mlinar markom@opencores.org
Alan Modra amodra@bigpond.net.au
Jason Molenda jmolenda@apple.com
Phil Muldoon pmuldoon@redhat.com
Pierre Muller muller@sourceware.org
Gaius Mulley gaius@glam.ac.uk
Joseph Myers joseph@codesourcery.com
Fernando Nasser fnasser@redhat.com
Adam Nemet anemet@caviumnetworks.com
Nathanael Nerode neroden@gcc.gnu.org
Hans-Peter Nilsson hp@bitrange.com
David O'Brien obrien@freebsd.org
Alexandre Oliva aoliva@redhat.com
Karen Osmond karen.osmond@gmail.com
Denis Pilat denis.pilat@st.com
Vladimir Prus vladimir@codesourcery.com
Qinwei qinwei@sunnorth.com.cn
Frederic Riss frederic.riss@st.com
Aleksandar Ristovski aristovski@qnx.com
Tom Rix trix@redhat.com
Nick Roberts nickrob@snap.net.nz
Bob Rossi bob_rossi@cox.net
Theodore A. Roth troth@openavr.org
Ian Roxborough irox@redhat.com
Maciej W. Rozycki macro@linux-mips.org
Grace Sainsbury graces@redhat.com
Kei Sakamoto sakamoto.kei@renesas.com
Mark Salter msalter@redhat.com
Richard Sandiford richard@codesourcery.com
Peter Schauer Peter.Schauer@mytum.de
Andreas Schwab schwab@linux-m68k.org
Thomas Schwinge tschwinge@gnu.org
Keith Seitz keiths@redhat.com
Carlos Eduardo Seo cseo@linux.vnet.ibm.com
Stan Shebs stan@codesourcery.com
Joel Sherrill joel.sherrill@oarcorp.com
Mark Shinwell shinwell@codesourcery.com
Craig Silverstein csilvers@google.com
Aidan Skinner aidan@velvet.net
Jiri Smid smid@suse.cz
David Smith dsmith@redhat.com
Stephen P. Smith ischis2@cox.net
Jackie Smith Cashion jsmith@redhat.com
Michael Snyder msnyder@vmware.com
Petr Sorfa petrs@caldera.com
Andrew Stubbs ams@codesourcery.com
Emi Suzuki emi-suzuki@tjsys.co.jp
Ian Lance Taylor ian@airs.com
Gary Thomas gthomas@redhat.com
Jason Thorpe thorpej@netbsd.org
Caroline Tice ctice@apple.com
Kai Tietz kai.tietz@onevision.com
Tom Tromey tromey@redhat.com
David Ung davidu@mips.com
D Venkatasubramanian dvenkat@noida.hcltech.com
Corinna Vinschen vinschen@redhat.com
Sami Wagiaalla swagiaal@redhat.com
Keith Walker keith.walker@arm.com
Kris Warkentin kewarken@qnx.com
Ulrich Weigand uweigand@de.ibm.com
Nathan Williams nathanw@wasabisystems.com
Bob Wilson bob.wilson@acm.org
Jim Wilson wilson@tuliptree.org
Elena Zannoni elena.zannoni@oracle.com
Eli Zaretskii eliz@gnu.org
Wu Zhou woodzltc@cn.ibm.com
Yoshinori Sato ysato@users.sourceforge.jp
Hui Zhu teawater@gmail.com
Sergio Durigan Junior sergiodj@linux.vnet.ibm.com
Past Maintainers
Whenever removing yourself, or someone else, from this file, consider
listing their areas of development here for posterity.
Jimmy Guo (gdb.hp, tui) guo at cup dot hp dot com
Jeff Law (hppa) law at cygnus dot com
Daniel Berlin (C++ support) dan at cgsoftware dot com
Nick Duffek (powerpc, SCO, Sol/x86) nick at duffek dot com
David Taylor (d10v, sparc, utils, defs,
expression evaluator, language support) taylor at candd dot org
J.T. Conklin (dcache, NetBSD, remote, global) jtc at acorntoolworks dot com
Frank Ch. Eigler (sim) fche at redhat dot com
Per Bothner (Java) per at bothner dot com
Anthony Green (Java) green at redhat dot com
Fernando Nasser (testsuite/, mi, cli, KOD) fnasser at redhat dot com
Mark Salter (testsuite/lib+config) msalter at redhat dot com
Jim Kingdon (web pages) kingdon at panix dot com
Jim Ingham (gdbtk, libgui) jingham at apple dot com
Mark Kettenis (hurd native) kettenis at gnu dot org
Ian Roxborough (in-tree tcl, tk, itcl) irox at redhat dot com
Robert Lipe (SCO/Unixware) rjl at sco dot com
Peter Schauer (global, AIX, xcoffsolib,
Solaris/x86) Peter.Schauer at mytum dot de
Scott Bambrough (ARM) scottb at netwinder dot org
Philippe De Muyter (coff) phdm at macqel dot be
Michael Chastain (testsuite) mec.gnu at mindspring dot com
Fred Fish (global)
Folks that have been caught up in a paper trail:
David Carlton carlton@bactrian.org
Ramana Radhakrishnan ramana.r@gmail.com
;; Local Variables:
;; coding: utf-8
;; End:

File diff suppressed because it is too large Load Diff

3579
gdb/NEWS

File diff suppressed because it is too large Load Diff

View File

@@ -1,104 +0,0 @@
Known problems in GDB 6.5
See also: http://www.gnu.org/software/gdb/bugs/
*** Build problems
build/1411: build fails on hpux 10.20 and hpux 11.00 with CMA threads
GDB does not build on HP/UX 10.20 or HP/UX 11.00 if the CMA
thread package is installed. The compile error is:
../../gdb/hpux-thread.c:222: variable-size type declared outside of any function
This happens only if the CMA thread package is installed.
As a workaround, you can disable support for CMA threads
by editing the file gdb/configure. Find the line:
if test -f /usr/include/dce/cma_config.h ; then
And replace it with:
if false ; then
*** Misc
gdb/1560: Control-C does not always interrupt GDB.
When GDB is busy processing a command which takes a long time to
complete, hitting Control-C does not have the expected effect.
The command execution is not aborted, and the "QUIT" message confirming
the abortion is displayed only after the command has been completed.
*** C++ support
gdb/931: GDB could be more generous when reading types C++ templates on input
When the user types a template, GDB frequently requires the type to be
typed in a certain way (e.g. "const char*" as opposed to "const char *"
or "char const *" or "char const*").
gdb/1512: no canonical way to output names of C++ types
We currently don't have any canonical way to output names of C++ types.
E.g. "const char *" versus "char const *"; more subtleties arise when
dealing with templates.
gdb/1516: [regression] local classes, gcc 2.95.3, dwarf-2
With gcc 2.95.3 and the dwarf-2 debugging format, classes which are
defined locally to a function include the demangled name of the function
as part of their name. For example, if a function "foobar" contains a
local class definition "Local", gdb will say that the name of the class
type is "foobar__Fi.0:Local".
This applies only to classes where the class type is defined inside a
function, not to variables defined with types that are defined somewhere
outside any function (which most types are).
gdb/1588: names of c++ nested types in casts must be enclosed in quotes
You must type
(gdb) print ('Foo::Bar') x
or
(gdb) print ('Foo::Bar' *) y
instead of
(gdb) print (Foo::Bar) x
or
(gdb) print (Foo::Bar *) y
respectively.
gdb/1091: Constructor breakpoints ignored
gdb/1193: g++ 3.3 creates multiple constructors: gdb 5.3 can't set breakpoints
When gcc 3.x compiles a C++ constructor or C++ destructor, it generates
2 or 3 different versions of the object code. These versions have
unique mangled names (they have to, in order for linking to work), but
they have identical source code names, which leads to a great deal of
confusion. Specifically, if you set a breakpoint in a constructor or a
destructor, gdb will put a breakpoint in one of the versions, but your
program may execute the other version. This makes it impossible to set
breakpoints reliably in constructors or destructors.
gcc 3.x generates these multiple object code functions in order to
implement virtual base classes. gcc 2.x generated just one object code
function with a hidden parameter, but gcc 3.x conforms to a multi-vendor
ABI for C++ which requires multiple object code functions.
*** Threads
threads/1650: manythreads.exp
On GNU/Linux systems that use the old LinuxThreads thread library, a
program rapidly creating and deleting threads can confuse GDB leading
to an internal error.
This problem does not occur on newer systems that use the NPTL
library, and did not occur with GDB 6.1.
threads/2137: Native Solaris Thread Debugging broken.
Use GDB 6.4 if thread debugging is needed on Solaris.

View File

@@ -1,655 +0,0 @@
README for gdb-6.3 release
Updated 20, November, 2006
This is GDB, the GNU source-level debugger.
A summary of new features is in the file `gdb/NEWS'.
Check the GDB home page at http://www.gnu.org/software/gdb/ for up to
date release information, mailing list links and archives, etc.
The file `gdb/PROBLEMS' contains information on problems identified
late in the release cycle. GDB's bug tracking data base at
http://www.gnu.org/software/gdb/bugs/ contains a more complete list of
bugs.
Unpacking and Installation -- quick overview
==========================
In this release, the GDB debugger sources, the generic GNU include
files, the BFD ("binary file description") library, the readline
library, and other libraries all have directories of their own
underneath the gdb-6.3 directory. The idea is that a variety of GNU
tools can share a common copy of these things. Be aware of variation
over time--for example don't try to build gdb with a copy of bfd from
a release other than the gdb release (such as a binutils release),
especially if the releases are more than a few weeks apart.
Configuration scripts and makefiles exist to cruise up and down this
directory tree and automatically build all the pieces in the right
order.
When you unpack the gdb-6.3.tar.gz file, you'll find a directory
called `gdb-6.3', which contains:
COPYING config-ml.in gettext.m4 ltconfig sim
COPYING.LIB config.guess include ltmain.sh src-release
Makefile.def config.sub install-sh md5.sum symlink-tree
Makefile.in configure libiberty missing texinfo
Makefile.tpl configure.in libtool.m4 mkinstalldirs ylwrap
README djunpack.bat ltcf-c.sh move-if-change
bfd etc ltcf-cxx.sh opcodes
config gdb ltcf-gcj.sh readline
You can build GDB right in the source directory:
cd gdb-6.3
./configure
make
cp gdb/gdb /usr/local/bin/gdb (or wherever you want)
However, we recommend that an empty directory be used instead.
This way you do not clutter your source tree with binary files
and will be able to create different builds with different
configuration options.
You can build GDB in any empty build directory:
mkdir build
cd build
<full path to your sources>/gdb-6.3/configure
make
cp gdb/gdb /usr/local/bin/gdb (or wherever you want)
(Building GDB with DJGPP tools for MS-DOS/MS-Windows is slightly
different; see the file gdb-6.3/gdb/config/djgpp/README for details.)
This will configure and build all the libraries as well as GDB. If
`configure' can't determine your system type, specify one as its
argument, e.g., `./configure sun4' or `./configure decstation'.
Make sure that your 'configure' line ends in 'gdb-6.3/configure':
/berman/migchain/source/gdb-6.3/configure # RIGHT
/berman/migchain/source/gdb-6.3/gdb/configure # WRONG
The gdb package contains several subdirectories, such as 'gdb',
'bfd', and 'readline'. If your 'configure' line ends in
'gdb-6.3/gdb/configure', then you are configuring only the gdb
subdirectory, not the whole gdb package. This leads to build errors
such as:
make: *** No rule to make target `../bfd/bfd.h', needed by `gdb.o'. Stop.
If you get other compiler errors during this stage, see the `Reporting
Bugs' section below; there are a few known problems.
GDB requires an ISO C (ANSI C) compiler. If you do not have an ISO
C compiler for your system, you may be able to download and install
the GNU CC compiler. It is available via anonymous FTP from the
directory `ftp://ftp.gnu.org/pub/gnu/gcc'. GDB also requires an ISO
C standard library. The GDB remote server, gdbserver, builds with some
non-ISO standard libraries - e.g. for Windows CE.
GDB uses Expat, an XML parsing library, to implement some target-specific
features. Expat will be linked in if it is available at build time, or
those features will be disabled. The latest version of Expat should be
available from `http://expat.sourceforge.net'.
GDB can be used as a cross-debugger, running on a machine of one
type while debugging a program running on a machine of another type.
See below.
More Documentation
******************
All the documentation for GDB comes as part of the machine-readable
distribution. The documentation is written in Texinfo format, which
is a documentation system that uses a single source file to produce
both on-line information and a printed manual. You can use one of the
Info formatting commands to create the on-line version of the
documentation and TeX (or `texi2roff') to typeset the printed version.
GDB includes an already formatted copy of the on-line Info version
of this manual in the `gdb/doc' subdirectory. The main Info file is
`gdb-6.3/gdb/doc/gdb.info', and it refers to subordinate files
matching `gdb.info*' in the same directory. If necessary, you can
print out these files, or read them with any editor; but they are
easier to read using the `info' subsystem in GNU Emacs or the
standalone `info' program, available as part of the GNU Texinfo
distribution.
If you want to format these Info files yourself, you need one of the
Info formatting programs, such as `texinfo-format-buffer' or
`makeinfo'.
If you have `makeinfo' installed, and are in the top level GDB
source directory (`gdb-6.3', in the case of version 6.3), you can make
the Info file by typing:
cd gdb/doc
make info
If you want to typeset and print copies of this manual, you need
TeX, a program to print its DVI output files, and `texinfo.tex', the
Texinfo definitions file. This file is included in the GDB
distribution, in the directory `gdb-6.3/texinfo'.
TeX is a typesetting program; it does not print files directly, but
produces output files called DVI files. To print a typeset document,
you need a program to print DVI files. If your system has TeX
installed, chances are it has such a program. The precise command to
use depends on your system; `lpr -d' is common; another (for PostScript
devices) is `dvips'. The DVI print command may require a file name
without any extension or a `.dvi' extension.
TeX also requires a macro definitions file called `texinfo.tex'.
This file tells TeX how to typeset a document written in Texinfo
format. On its own, TeX cannot read, much less typeset a Texinfo file.
`texinfo.tex' is distributed with GDB and is located in the
`gdb-6.3/texinfo' directory.
If you have TeX and a DVI printer program installed, you can typeset
and print this manual. First switch to the the `gdb' subdirectory of
the main source directory (for example, to `gdb-6.3/gdb') and then type:
make doc/gdb.dvi
If you prefer to have the manual in PDF format, type this from the
`gdb/doc' subdirectory of the main source directory:
make gdb.pdf
For this to work, you will need the PDFTeX package to be installed.
Installing GDB
**************
GDB comes with a `configure' script that automates the process of
preparing GDB for installation; you can then use `make' to build the
`gdb' program.
The GDB distribution includes all the source code you need for GDB in
a single directory, whose name is usually composed by appending the
version number to `gdb'.
For example, the GDB version 6.3 distribution is in the `gdb-6.3'
directory. That directory contains:
`gdb-6.3/{COPYING,COPYING.LIB}'
Standard GNU license files. Please read them.
`gdb-6.3/bfd'
source for the Binary File Descriptor library
`gdb-6.3/config*'
script for configuring GDB, along with other support files
`gdb-6.3/gdb'
the source specific to GDB itself
`gdb-6.3/include'
GNU include files
`gdb-6.3/libiberty'
source for the `-liberty' free software library
`gdb-6.3/opcodes'
source for the library of opcode tables and disassemblers
`gdb-6.3/readline'
source for the GNU command-line interface
NOTE: The readline library is compiled for use by GDB, but will
not be installed on your system when "make install" is issued.
`gdb-6.3/sim'
source for some simulators (ARM, D10V, SPARC, M32R, MIPS, PPC, V850, etc)
`gdb-6.3/texinfo'
The `texinfo.tex' file, which you need in order to make a printed
manual using TeX.
`gdb-6.3/etc'
Coding standards, useful files for editing GDB, and other
miscellanea.
Note: the following instructions are for building GDB on Unix or
Unix-like systems. Instructions for building with DJGPP for
MS-DOS/MS-Windows are in the file gdb/config/djgpp/README.
The simplest way to configure and build GDB is to run `configure'
from the `gdb-VERSION-NUMBER' source directory, which in this example
is the `gdb-6.3' directory.
First switch to the `gdb-VERSION-NUMBER' source directory if you are
not already in it; then run `configure'.
For example:
cd gdb-6.3
./configure
make
Running `configure' followed by `make' builds the `bfd',
`readline', `mmalloc', and `libiberty' libraries, then `gdb' itself.
The configured source files, and the binaries, are left in the
corresponding source directories.
`configure' is a Bourne-shell (`/bin/sh') script; if your system
does not recognize this automatically when you run a different shell,
you may need to run `sh' on it explicitly:
sh configure
If you run `configure' from a directory that contains source
directories for multiple libraries or programs, such as the `gdb-6.3'
source directory for version 6.3, `configure' creates configuration
files for every directory level underneath (unless you tell it not to,
with the `--norecursion' option).
You can run the `configure' script from any of the subordinate
directories in the GDB distribution, if you only want to configure that
subdirectory; but be sure to specify a path to it.
For example, with version 6.3, type the following to configure only
the `bfd' subdirectory:
cd gdb-6.3/bfd
../configure
You can install `gdb' anywhere; it has no hardwired paths. However,
you should make sure that the shell on your path (named by the `SHELL'
environment variable) is publicly readable. Remember that GDB uses the
shell to start your program--some systems refuse to let GDB debug child
processes whose programs are not readable.
Compiling GDB in another directory
==================================
If you want to run GDB versions for several host or target machines,
you need a different `gdb' compiled for each combination of host and
target. `configure' is designed to make this easy by allowing you to
generate each configuration in a separate subdirectory, rather than in
the source directory. If your `make' program handles the `VPATH'
feature correctly (GNU `make' and SunOS 'make' are two that should),
running `make' in each of these directories builds the `gdb' program
specified there.
To build `gdb' in a separate directory, run `configure' with the
`--srcdir' option to specify where to find the source. (You also need
to specify a path to find `configure' itself from your working
directory. If the path to `configure' would be the same as the
argument to `--srcdir', you can leave out the `--srcdir' option; it
will be assumed.)
For example, with version 6.3, you can build GDB in a separate
directory for a Sun 4 like this:
cd gdb-6.3
mkdir ../gdb-sun4
cd ../gdb-sun4
../gdb-6.3/configure
make
When `configure' builds a configuration using a remote source
directory, it creates a tree for the binaries with the same structure
(and using the same names) as the tree under the source directory. In
the example, you'd find the Sun 4 library `libiberty.a' in the
directory `gdb-sun4/libiberty', and GDB itself in `gdb-sun4/gdb'.
One popular reason to build several GDB configurations in separate
directories is to configure GDB for cross-compiling (where GDB runs on
one machine--the host--while debugging programs that run on another
machine--the target). You specify a cross-debugging target by giving
the `--target=TARGET' option to `configure'.
When you run `make' to build a program or library, you must run it
in a configured directory--whatever directory you were in when you
called `configure' (or one of its subdirectories).
The `Makefile' that `configure' generates in each source directory
also runs recursively. If you type `make' in a source directory such
as `gdb-6.3' (or in a separate configured directory configured with
`--srcdir=PATH/gdb-6.3'), you will build all the required libraries,
and then build GDB.
When you have multiple hosts or targets configured in separate
directories, you can run `make' on them in parallel (for example, if
they are NFS-mounted on each of the hosts); they will not interfere
with each other.
Specifying names for hosts and targets
======================================
The specifications used for hosts and targets in the `configure'
script are based on a three-part naming scheme, but some short
predefined aliases are also supported. The full naming scheme encodes
three pieces of information in the following pattern:
ARCHITECTURE-VENDOR-OS
For example, you can use the alias `sun4' as a HOST argument or in a
`--target=TARGET' option. The equivalent full name is
`sparc-sun-sunos4'.
The `configure' script accompanying GDB does not provide any query
facility to list all supported host and target names or aliases.
`configure' calls the Bourne shell script `config.sub' to map
abbreviations to full names; you can read the script, if you wish, or
you can use it to test your guesses on abbreviations--for example:
% sh config.sub sun4
sparc-sun-sunos4.1.1
% sh config.sub sun3
m68k-sun-sunos4.1.1
% sh config.sub decstation
mips-dec-ultrix4.2
% sh config.sub hp300bsd
m68k-hp-bsd
% sh config.sub i386v
i386-pc-sysv
% sh config.sub i786v
Invalid configuration `i786v': machine `i786v' not recognized
`config.sub' is also distributed in the GDB source directory
(`gdb-6.3', for version 6.3).
`configure' options
===================
Here is a summary of the `configure' options and arguments that are
most often useful for building GDB. `configure' also has several other
options not listed here. *note : (configure.info)What Configure Does,
for a full explanation of `configure'.
configure [--help]
[--prefix=DIR]
[--srcdir=PATH]
[--norecursion] [--rm]
[--enable-build-warnings]
[--target=TARGET]
[--host=HOST]
[HOST]
You may introduce options with a single `-' rather than `--' if you
prefer; but you may abbreviate option names if you use `--'.
`--help'
Display a quick summary of how to invoke `configure'.
`-prefix=DIR'
Configure the source to install programs and files under directory
`DIR'.
`--srcdir=PATH'
*Warning: using this option requires GNU `make', or another `make'
that compatibly implements the `VPATH' feature.*
Use this option to make configurations in directories separate
from the GDB source directories. Among other things, you can use
this to build (or maintain) several configurations simultaneously,
in separate directories. `configure' writes configuration
specific files in the current directory, but arranges for them to
use the source in the directory PATH. `configure' will create
directories under the working directory in parallel to the source
directories below PATH.
`--host=HOST'
Configure GDB to run on the specified HOST.
There is no convenient way to generate a list of all available
hosts.
`HOST ...'
Same as `--host=HOST'. If you omit this, GDB will guess; it's
quite accurate.
`--norecursion'
Configure only the directory level where `configure' is executed;
do not propagate configuration to subdirectories.
`--rm'
Remove the configuration that the other arguments specify.
`--enable-build-warnings'
When building the GDB sources, ask the compiler to warn about any
code which looks even vaguely suspicious. You should only using
this feature if you're compiling with GNU CC. It passes the
following flags:
-Wimplicit
-Wreturn-type
-Wcomment
-Wtrigraphs
-Wformat
-Wparentheses
-Wpointer-arith
`--enable-werror'
Treat compiler warnings as werrors. Use this only with GCC. It
adds the -Werror flag to the compiler, which will fail the
compilation if the compiler outputs any warning messages.
`--target=TARGET'
Configure GDB for cross-debugging programs running on the specified
TARGET. Without this option, GDB is configured to debug programs
that run on the same machine (HOST) as GDB itself.
There is no convenient way to generate a list of all available
targets.
`--with-gdb-datadir=PATH'
Set the GDB-specific data directory. GDB will look here for
certain supporting files or scripts. This defaults to the `gdb'
subdirectory of `datadir' (which can be set using `--datadir').
`--with-relocated-sources=DIR'
Sets up the default source path substitution rule so that
directory names recorded in debug information will be
automatically adjusted for any directory under DIR. DIR should
be a subdirectory of GDB's configured prefix, the one mentioned
in the `--prefix' or `--exec-prefix' options to configure. This
option is useful if GDB is supposed to be moved to a different
place after it is built.
`--enable-64-bit-bfd'
Enable 64-bit support in BFD on 32-bit hosts.
`--disable-gdbmi'
Build GDB without the GDB/MI machine interface.
`--enable-tui'
Build GDB with the text-mode full-screen user interface (TUI).
Requires a curses library (ncurses and cursesX are also
supported).
`--enable-gdbtk'
Build GDB with the gdbtk GUI interface. Requires TCL/Tk to be
installed.
`--with-libunwind'
Use the libunwind library for unwinding function call stack. See
http://www.nongnu.org/libunwind/index.html fro details.
Supported only on some platforms.
`--with-curses'
Use the curses library instead of the termcap library, for
text-mode terminal operations.
`--enable-profiling' Enable profiling of GDB itself. Necessary if you
want to use the "maint set profile" command for profiling GDB.
Requires the functions `monstartup' and `_mcleanup' to be present
in the standard C library used to build GDB, and also requires a
compiler that supports the `-pg' option.
`--with-system-readline'
Use the readline library installed on the host, rather than the
library supplied as part of GDB tarball.
`--with-expat'
Build GDB with the libexpat library. (Done by default if
libexpat is installed and found at configure time.) This library
is used to read XML files supplied with GDB. If it is
unavailable, some features, such as remote protocol memory maps,
target descriptions, and shared library lists, that are based on
XML files, will not be available in GDB. If your host does not
have libexpat installed, you can get the latest version from
http://expat.sourceforge.net.
`--with-python[=PATH]'
Build GDB with Python scripting support. (Done by default if
libpython is present and found at configure time.) Python makes
GDB scripting much more powerful than the restricted CLI
scripting language. If your host does not have Python installed,
you can find it on http://www.python.org/download/. The oldest
version of Python supported by GDB is 2.4. The optional argument
PATH says where to find the Python headers and libraries; the
configure script will look in PATH/include for headers and in
PATH/lib for the libraries.
`--without-included-regex'
Don't use the regex library included with GDB (as part of the
libiberty library). This is the default on hosts with version 2
of the GNU C library.
`--with-sysroot=DIR'
Use DIR as the default system root directory for libraries whose
file names begin with `/lib' or `/usr/lib'. (The value of DIR
can be modified at run time by using the "set sysroot" command.)
If DIR is under the GDB configured prefix (set with `--prefix' or
`--exec-prefix' options), the default system root will be
automatically adjusted if and when GDB is moved to a different
location.
`--with-system-gdbinit=FILE'
Configure GDB to automatically load a system-wide init file.
FILE should be an absolute file name. If FILE is in a directory
under the configured prefix, and GDB is moved to another location
after being built, the location of the system-wide init file will
be adjusted accordingly.
`configure' accepts other options, for compatibility with configuring
other GNU tools recursively; but these are the only options that affect
GDB or its supporting libraries.
Remote debugging
=================
The files m68k-stub.c, i386-stub.c, and sparc-stub.c are examples
of remote stubs to be used with remote.c. They are designed to run
standalone on an m68k, i386, or SPARC cpu and communicate properly
with the remote.c stub over a serial line.
The directory gdb/gdbserver/ contains `gdbserver', a program that
allows remote debugging for Unix applications. gdbserver is only
supported for some native configurations, including Sun 3, Sun 4, and
Linux.
The file gdb/gdbserver/README includes further notes on gdbserver; in
particular, it explains how to build gdbserver for cross-debugging
(where gdbserver runs on the target machine, which is of a different
architecture than the host machine running GDB).
There are a number of remote interfaces for talking to existing ROM
monitors and other hardware:
remote-mips.c MIPS remote debugging protocol
remote-sds.c PowerPC SDS monitor
remote-sim.c Generalized simulator protocol
Reporting Bugs in GDB
=====================
There are several ways of reporting bugs in GDB. The prefered
method is to use the World Wide Web:
http://www.gnu.org/software/gdb/bugs/
As an alternative, the bug report can be submitted, via e-mail, to the
address "bug-gdb@gnu.org".
When submitting a bug, please include the GDB version number (e.g.,
gdb-6.3), and how you configured it (e.g., "sun4" or "mach386 host,
i586-intel-synopsys target"). Since GDB now supports so many
different configurations, it is important that you be precise about
this. If at all possible, you should include the actual banner that
GDB prints when it starts up, or failing that, the actual configure
command that you used when configuring GDB.
For more information on how/whether to report bugs, see the
Reporting Bugs chapter of the GDB manual (gdb/doc/gdb.texinfo).
Graphical interface to GDB -- X Windows, MS Windows
==========================
Several graphical interfaces to GDB are available. You should
check:
http://www.gnu.org/software/gdb/links/
for an up-to-date list.
Emacs users will very likely enjoy the Grand Unified Debugger mode;
try typing `M-x gdb RET'.
Writing Code for GDB
=====================
There is a lot of information about writing code for GDB in the
internals manual, distributed with GDB in gdb/doc/gdbint.texinfo. You
can read it by hand, print it by using TeX and texinfo, or process it
into an `info' file for use with Emacs' info mode or the standalone
`info' program.
If you are pondering writing anything but a short patch, especially
take note of the information about copyrights in the node Submitting
Patches. It can take quite a while to get all the paperwork done, so
we encourage you to start that process as soon as you decide you are
planning to work on something, or at least well ahead of when you
think you will be ready to submit the patches.
GDB Testsuite
=============
Included with the GDB distribution is a DejaGNU based testsuite
that can either be used to test your newly built GDB, or for
regression testing a GDB with local modifications.
Running the testsuite requires the prior installation of DejaGNU,
which is generally available via ftp. The directory
ftp://sources.redhat.com/pub/dejagnu/ will contain a recent snapshot.
Once DejaGNU is installed, you can run the tests in one of the
following ways:
(1) cd gdb-6.3
make check-gdb
or
(2) cd gdb-6.3/gdb
make check
or
(3) cd gdb-6.3/gdb/testsuite
make site.exp (builds the site specific file)
runtest -tool gdb GDB=../gdb (or GDB=<somepath> as appropriate)
The last method gives you slightly more control in case of problems
with building one or more test executables or if you are using the
testsuite `standalone', without it being part of the GDB source tree.
See the DejaGNU documentation for further details.
(this is for editing this file with GNU emacs)
Local Variables:
mode: text
End:

View File

@@ -1,428 +0,0 @@
dnl written by Rob Savoye <rob@cygnus.com> for Cygnus Support
dnl major rewriting for Tcl 7.5 by Don Libes <libes@nist.gov>
dnl gdb/configure.in uses BFD_NEED_DECLARATION, so get its definition.
sinclude(../bfd/bfd.m4)
dnl This gets the standard macros
sinclude(../config/acinclude.m4)
dnl This gets autoconf bugfixes
sinclude(../config/override.m4)
sinclude(../config/gettext-sister.m4)
dnl For AC_LIB_HAVE_LINKFLAGS.
sinclude(../config/lib-ld.m4)
sinclude(../config/lib-prefix.m4)
sinclude(../config/lib-link.m4)
dnl For ACX_PKGVERSION and ACX_BUGURL.
sinclude(../config/acx.m4)
dnl for TCL definitions
sinclude(../config/tcl.m4)
dnl For dependency tracking macros.
sinclude([../config/depstand.m4])
dnl For AM_LC_MESSAGES
sinclude([../config/lcmessage.m4])
dnl For AM_LANGINFO_CODESET.
sinclude([../config/codeset.m4])
#
# Sometimes the native compiler is a bogus stub for gcc or /usr/ucb/cc. This
# makes configure think it's cross compiling. If --target wasn't used, then
# we can't configure, so something is wrong. We don't use the cache
# here cause if somebody fixes their compiler install, we want this to work.
AC_DEFUN([CY_AC_C_WORKS],
[# If we cannot compile and link a trivial program, we can't expect anything to work
AC_MSG_CHECKING(whether the compiler ($CC) actually works)
AC_TRY_COMPILE(, [/* don't need anything here */],
c_compiles=yes, c_compiles=no)
AC_TRY_LINK(, [/* don't need anything here */],
c_links=yes, c_links=no)
if test x"${c_compiles}" = x"no" ; then
AC_MSG_ERROR(the native compiler is broken and won't compile.)
fi
if test x"${c_links}" = x"no" ; then
AC_MSG_ERROR(the native compiler is broken and won't link.)
fi
AC_MSG_RESULT(yes)
])
## ----------------------------------------- ##
## ANSIfy the C compiler whenever possible. ##
## From Franc,ois Pinard ##
## ----------------------------------------- ##
# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2008, 2009
Free Software Foundation, Inc.
# 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, 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., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
# serial 1
# @defmac AC_PROG_CC_STDC
# @maindex PROG_CC_STDC
# @ovindex CC
# If the C compiler in not in ANSI C mode by default, try to add an option
# to output variable @code{CC} to make it so. This macro tries various
# options that select ANSI C on some system or another. It considers the
# compiler to be in ANSI C mode if it handles function prototypes correctly.
#
# If you use this macro, you should check after calling it whether the C
# compiler has been set to accept ANSI C; if not, the shell variable
# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source
# code in ANSI C, you can make an un-ANSIfied copy of it by using the
# program @code{ansi2knr}, which comes with Ghostscript.
# @end defmac
AC_DEFUN([AM_PROG_CC_STDC],
[AC_REQUIRE([AC_PROG_CC])
AC_BEFORE([$0], [AC_C_INLINE])
AC_BEFORE([$0], [AC_C_CONST])
dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require
dnl a magic option to avoid problems with ANSI preprocessor commands
dnl like #elif.
dnl FIXME: can't do this because then AC_AIX won't work due to a
dnl circular dependency.
dnl AC_BEFORE([$0], [AC_PROG_CPP])
AC_MSG_CHECKING([for ${CC-cc} option to accept ANSI C])
AC_CACHE_VAL(am_cv_prog_cc_stdc,
[am_cv_prog_cc_stdc=no
ac_save_CC="$CC"
# Don't try gcc -ansi; that turns off useful extensions and
# breaks some systems' header files.
# AIX -qlanglvl=ansi
# Ultrix and OSF/1 -std1
# HP-UX 10.20 and later -Ae
# HP-UX older versions -Aa -D_HPUX_SOURCE
# SVR4 -Xc -D__EXTENSIONS__
for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
AC_TRY_COMPILE(
[#include <stdarg.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
char **p;
int i;
{
return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
char *s;
va_list v;
va_start (v,p);
s = g (p, va_arg (v,int));
va_end (v);
return s;
}
int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
], [
return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
],
[am_cv_prog_cc_stdc="$ac_arg"; break])
done
CC="$ac_save_CC"
])
if test -z "$am_cv_prog_cc_stdc"; then
AC_MSG_RESULT([none needed])
else
AC_MSG_RESULT([$am_cv_prog_cc_stdc])
fi
case "x$am_cv_prog_cc_stdc" in
x|xno) ;;
*) CC="$CC $am_cv_prog_cc_stdc" ;;
esac
])
dnl From Bruno Haible.
AC_DEFUN([AM_ICONV],
[
dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
dnl those with the standalone portable GNU libiconv installed).
AC_ARG_WITH([libiconv-prefix],
AS_HELP_STRING([--with-libiconv-prefix=DIR], [search for libiconv in DIR/include and DIR/lib]), [
for dir in `echo "$withval" | tr : ' '`; do
if test -d $dir/include; then LIBICONV_INCLUDE="-I$dir/include"; fi
if test -d $dir/lib; then LIBICONV_LIBDIR="-L$dir/lib"; fi
done
])
BUILD_LIBICONV_LIBDIR="-L../libiconv/lib/.libs -L../libiconv/lib/_libs"
BUILD_LIBICONV_INCLUDE="-I../libiconv/include"
AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
am_cv_func_iconv="no, consider installing GNU libiconv"
am_cv_lib_iconv=no
am_cv_use_build_libiconv=no
# If libiconv is part of the build tree, then try using it over
# any system iconv.
if test -d ../libiconv; then
am_save_LIBS="$LIBS"
am_save_CPPFLAGS="$CPPFLAGS"
LIBS="$LIBS $BUILD_LIBICONV_LIBDIR -liconv"
CPPFLAGS="$CPPFLAGS $BUILD_LIBICONV_INCLUDE"
AC_TRY_LINK([#include <stdlib.h>
#include <iconv.h>],
[iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);],
am_cv_use_build_libiconv=yes
am_cv_lib_iconv=yes
am_cv_func_iconv=yes)
LIBS="$am_save_LIBS"
CPPFLAGS="$am_save_CPPFLAGS"
fi
# Next, try to find iconv in libc.
if test "$am_cv_func_iconv" != yes; then
AC_TRY_LINK([#include <stdlib.h>
#include <iconv.h>],
[iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);],
am_cv_func_iconv=yes)
fi
# If iconv was not in libc, try -liconv. In this case, arrange to
# look in the libiconv prefix, if it was specified by the user.
if test "$am_cv_func_iconv" != yes; then
am_save_CPPFLAGS="$CPPFLAGS"
am_save_LIBS="$LIBS"
if test -n "$LIBICONV_INCLUDE"; then
CPPFLAGS="$CPPFLAGS $LIBICONV_INCLUDE"
LIBS="$LIBS $LIBICONV_LIBDIR"
fi
LIBS="$LIBS -liconv"
AC_TRY_LINK([#include <stdlib.h>
#include <iconv.h>],
[iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);],
am_cv_lib_iconv=yes
am_cv_func_iconv=yes)
LIBS="$am_save_LIBS"
CPPFLAGS="$am_save_CPPFLAGS"
fi
])
# Set the various flags based on the cache variables. We can't rely
# on the flags to remain set from the above code, due to caching.
LIBICONV=
if test "$am_cv_lib_iconv" = yes; then
LIBICONV="-liconv"
else
LIBICONV_LIBDIR=
LIBICONV_INCLUDE=
fi
if test "$am_cv_use_build_libiconv" = yes; then
LIBICONV_LIBDIR="$BUILD_LIBICONV_LIBDIR"
LIBICONV_INCLUDE="$BUILD_LIBICONV_INCLUDE"
fi
CPPFLAGS="$CPPFLAGS $LIBICONV_INCLUDE"
LIBS="$LIBS $LIBICONV_LIBDIR $LIBICONV"
if test "$am_cv_func_iconv" = yes; then
AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
AC_MSG_CHECKING([for iconv declaration])
AC_CACHE_VAL(am_cv_proto_iconv, [
AC_TRY_COMPILE([
#include <stdlib.h>
#include <iconv.h>
extern
#ifdef __cplusplus
"C"
#endif
#if defined(__STDC__) || defined(__cplusplus)
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
#else
size_t iconv();
#endif
], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
AC_MSG_RESULT([$]{ac_t:-
}[$]am_cv_proto_iconv)
AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
[Define as const if the declaration of iconv() needs const.])
fi
])
dnl written by Guido Draheim <guidod@gmx.de>, original by Alexandre Oliva
dnl Version 1.3 (2001/03/02)
dnl source http://www.gnu.org/software/ac-archive/Miscellaneous/ac_define_dir.html
AC_DEFUN([AC_DEFINE_DIR], [
test "x$prefix" = xNONE && prefix="$ac_default_prefix"
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
ac_define_dir=`eval echo [$]$2`
ac_define_dir=`eval echo [$]ac_define_dir`
ifelse($3, ,
AC_DEFINE_UNQUOTED($1, "$ac_define_dir"),
AC_DEFINE_UNQUOTED($1, "$ac_define_dir", $3))
])
dnl See whether we need a declaration for a function.
dnl The result is highly dependent on the INCLUDES passed in, so make sure
dnl to use a different cache variable name in this macro if it is invoked
dnl in a different context somewhere else.
dnl gcc_AC_CHECK_DECL(SYMBOL,
dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, INCLUDES]]])
AC_DEFUN([gcc_AC_CHECK_DECL],
[AC_MSG_CHECKING([whether $1 is declared])
AC_CACHE_VAL(gcc_cv_have_decl_$1,
[AC_TRY_COMPILE([$4],
[#ifndef $1
char *(*pfn) = (char *(*)) $1 ;
#endif], eval "gcc_cv_have_decl_$1=yes", eval "gcc_cv_have_decl_$1=no")])
if eval "test \"`echo '$gcc_cv_have_decl_'$1`\" = yes"; then
AC_MSG_RESULT(yes) ; ifelse([$2], , :, [$2])
else
AC_MSG_RESULT(no) ; ifelse([$3], , :, [$3])
fi
])dnl
dnl Check multiple functions to see whether each needs a declaration.
dnl Arrange to define HAVE_DECL_<FUNCTION> to 0 or 1 as appropriate.
dnl gcc_AC_CHECK_DECLS(SYMBOLS,
dnl [ACTION-IF-NEEDED [, ACTION-IF-NOT-NEEDED [, INCLUDES]]])
AC_DEFUN([gcc_AC_CHECK_DECLS],
[for ac_func in $1
do
changequote(, )dnl
ac_tr_decl=HAVE_DECL_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
changequote([, ])dnl
gcc_AC_CHECK_DECL($ac_func,
[AC_DEFINE_UNQUOTED($ac_tr_decl, 1) $2],
[AC_DEFINE_UNQUOTED($ac_tr_decl, 0) $3],
dnl It is possible that the include files passed in here are local headers
dnl which supply a backup declaration for the relevant prototype based on
dnl the definition of (or lack of) the HAVE_DECL_ macro. If so, this test
dnl will always return success. E.g. see libiberty.h's handling of
dnl `basename'. To avoid this, we define the relevant HAVE_DECL_ macro to
dnl 1 so that any local headers used do not provide their own prototype
dnl during this test.
#undef $ac_tr_decl
#define $ac_tr_decl 1
$4
)
done
dnl Automatically generate config.h entries via autoheader.
if test x = y ; then
patsubst(translit([$1], [a-z], [A-Z]), [\w+],
[AC_DEFINE([HAVE_DECL_\&], 1,
[Define to 1 if we found this declaration otherwise define to 0.])])dnl
fi
])
dnl Find the location of the private Tcl headers
dnl When Tcl is installed, this is TCL_INCLUDE_SPEC/tcl-private/generic
dnl When Tcl is in the build tree, this is not needed.
dnl
dnl Note: you must use first use SC_LOAD_TCLCONFIG!
AC_DEFUN([CY_AC_TCL_PRIVATE_HEADERS], [
AC_MSG_CHECKING([for Tcl private headers])
private_dir=""
dir=`echo ${TCL_INCLUDE_SPEC}/tcl-private/generic | sed -e s/-I//`
if test -f ${dir}/tclInt.h ; then
private_dir=${dir}
fi
if test x"${private_dir}" = x; then
AC_ERROR(could not find private Tcl headers)
else
TCL_PRIVATE_INCLUDE="-I${private_dir}"
AC_MSG_RESULT(${private_dir})
fi
])
dnl Find the location of the private Tk headers
dnl When Tk is installed, this is TK_INCLUDE_SPEC/tk-private/generic
dnl When Tk is in the build tree, this not needed.
dnl
dnl Note: you must first use SC_LOAD_TKCONFIG
AC_DEFUN([CY_AC_TK_PRIVATE_HEADERS], [
AC_MSG_CHECKING([for Tk private headers])
private_dir=""
dir=`echo ${TK_INCLUDE_SPEC}/tk-private/generic | sed -e s/-I//`
if test -f ${dir}/tkInt.h; then
private_dir=${dir}
fi
if test x"${private_dir}" = x; then
AC_ERROR(could not find Tk private headers)
else
TK_PRIVATE_INCLUDE="-I${private_dir}"
AC_MSG_RESULT(${private_dir})
fi
])
dnl GDB_AC_WITH_DIR([VARIABLE], [ARG-NAME], [HELP], [DEFAULT])
dnl Add a new --with option that defines a directory.
dnl The result is stored in VARIABLE. AC_DEFINE_DIR is called
dnl on this variable, as is AC_SUBST.
dnl ARG-NAME is the base name of the argument (without "--with").
dnl HELP is the help text to use.
dnl If the user's choice is relative to the prefix, then the
dnl result is relocatable, then this will define the C macro
dnl VARIABLE_RELOCATABLE to 1; otherwise it is defined as 0.
dnl DEFAULT is the default value, which is used if the user
dnl does not specify the argument.
AC_DEFUN([GDB_AC_WITH_DIR], [
AC_ARG_WITH([$2], AS_HELP_STRING([--with-][$2][=PATH], [$3]), [
[$1]=$withval], [[$1]=[$4]])
AC_DEFINE_DIR([$1], [$1], [$3])
AC_SUBST([$1])
if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then
if test "x$prefix" = xNONE; then
test_prefix=/usr/local
else
test_prefix=$prefix
fi
else
test_prefix=$exec_prefix
fi
value=0
case ${ac_define_dir} in
"${test_prefix}"|"${test_prefix}/"*|\
'${exec_prefix}'|'${exec_prefix}/'*)
value=1
;;
esac
AC_DEFINE_UNQUOTED([$1]_RELOCATABLE, $value, [Define if the $2 directory should be relocated when GDB is moved.])
])

874
gdb/aclocal.m4 vendored
View File

@@ -1,874 +0,0 @@
# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_AUTOMAKE_VERSION(VERSION)
# ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been
# generated from the m4 files accompanying Automake X.Y.
AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
# AM_SET_CURRENT_AUTOMAKE_VERSION
# -------------------------------
# Call AM_AUTOMAKE_VERSION so it can be traced.
# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.9.6])])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
#
# Of course, Automake must honor this variable whenever it calls a
# tool from the auxiliary directory. The problem is that $srcdir (and
# therefore $ac_aux_dir as well) can be either absolute or relative,
# depending on how configure is run. This is pretty annoying, since
# it makes $ac_aux_dir quite unusable in subdirectories: in the top
# source directory, any form will work fine, but in subdirectories a
# relative path needs to be adjusted first.
#
# $ac_aux_dir/missing
# fails when called from a subdirectory if $ac_aux_dir is relative
# $top_srcdir/$ac_aux_dir/missing
# fails if $ac_aux_dir is absolute,
# fails when called from a subdirectory in a VPATH build with
# a relative $ac_aux_dir
#
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
# are both prefixed by $srcdir. In an in-source build this is usually
# harmless because $srcdir is `.', but things will broke when you
# start a VPATH build or use an absolute $srcdir.
#
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
# and then we would define $MISSING as
# MISSING="\${SHELL} $am_aux_dir/missing"
# This will work as long as MISSING is not called from configure, because
# unfortunately $(top_srcdir) has no meaning in configure.
# However there are other variables, like CC, which are often used in
# configure, and could therefore not use this "fixed" $ac_aux_dir.
#
# Another solution, used here, is to always expand $ac_aux_dir to an
# absolute PATH. The drawback is that using absolute paths prevent a
# configured tree to be moved without reconfiguration.
AC_DEFUN([AM_AUX_DIR_EXPAND],
[dnl Rely on autoconf to set up CDPATH properly.
AC_PREREQ([2.50])dnl
# expand $ac_aux_dir to an absolute path
am_aux_dir=`cd $ac_aux_dir && pwd`
])
# AM_CONDITIONAL -*- Autoconf -*-
# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 7
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
# -------------------------------------
# Define a conditional.
AC_DEFUN([AM_CONDITIONAL],
[AC_PREREQ(2.52)dnl
ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
AC_SUBST([$1_TRUE])
AC_SUBST([$1_FALSE])
if $2; then
$1_TRUE=
$1_FALSE='#'
else
$1_TRUE='#'
$1_FALSE=
fi
AC_CONFIG_COMMANDS_PRE(
[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
AC_MSG_ERROR([[conditional "$1" was never defined.
Usually this means the macro was only invoked conditionally.]])
fi])])
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 8
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
# will think it sees a *use*, and therefore will trigger all it's
# C support machinery. Also note that it means that autoscan, seeing
# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
# _AM_DEPENDENCIES(NAME)
# ----------------------
# See how the compiler implements dependency checking.
# NAME is "CC", "CXX", "GCJ", or "OBJC".
# We try a few techniques and use that to set a single cache variable.
#
# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
# dependency, and given that the user is not expected to run this macro,
# just rely on AC_PROG_CC.
AC_DEFUN([_AM_DEPENDENCIES],
[AC_REQUIRE([AM_SET_DEPDIR])dnl
AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
AC_REQUIRE([AM_MAKE_INCLUDE])dnl
AC_REQUIRE([AM_DEP_TRACK])dnl
ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
[$1], CXX, [depcc="$CXX" am_compiler_list=],
[$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
[$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
[depcc="$$1" am_compiler_list=])
AC_CACHE_CHECK([dependency style of $depcc],
[am_cv_$1_dependencies_compiler_type],
[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
cp "$am_depcomp" conftest.dir
cd conftest.dir
# We will build objects and dependencies in a subdirectory because
# it helps to detect inapplicable dependency modes. For instance
# both Tru64's cc and ICC support -MD to output dependencies as a
# side effect of compilation, but ICC will put the dependencies in
# the current directory while Tru64 will put them in the object
# directory.
mkdir sub
am_cv_$1_dependencies_compiler_type=none
if test "$am_compiler_list" = ""; then
am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
fi
for depmode in $am_compiler_list; do
# Setup a source with many dependencies, because some compilers
# like to wrap large dependency lists on column 80 (with \), and
# we should not choose a depcomp mode which is confused by this.
#
# We need to recreate these files for each test, as the compiler may
# overwrite some of them when testing with obscure command lines.
# This happens at least with the AIX C compiler.
: > sub/conftest.c
for i in 1 2 3 4 5 6; do
echo '#include "conftst'$i'.h"' >> sub/conftest.c
# Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
# Solaris 8's {/usr,}/bin/sh.
touch sub/conftst$i.h
done
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
case $depmode in
nosideeffect)
# after this tag, mechanisms are not by side-effect, so they'll
# only be used when explicitly requested
if test "x$enable_dependency_tracking" = xyes; then
continue
else
break
fi
;;
none) break ;;
esac
# We check with `-c' and `-o' for the sake of the "dashmstdout"
# mode. It turns out that the SunPro C++ compiler does not properly
# handle `-M -o', and we need to detect this.
if depmode=$depmode \
source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
$SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
>/dev/null 2>conftest.err &&
grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
${MAKE-make} -s -f confmf > /dev/null 2>&1; then
# icc doesn't choke on unknown options, it will just issue warnings
# or remarks (even with -Werror). So we grep stderr for any message
# that says an option was ignored or not supported.
# When given -MP, icc 7.0 and 7.1 complain thusly:
# icc: Command line warning: ignoring option '-M'; no argument required
# The diagnosis changed in icc 8.0:
# icc: Command line remark: option '-MP' not supported
if (grep 'ignoring option' conftest.err ||
grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
am_cv_$1_dependencies_compiler_type=$depmode
break
fi
fi
done
cd ..
rm -rf conftest.dir
else
am_cv_$1_dependencies_compiler_type=none
fi
])
AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
AM_CONDITIONAL([am__fastdep$1], [
test "x$enable_dependency_tracking" != xno \
&& test "$am_cv_$1_dependencies_compiler_type" = gcc3])
])
# AM_SET_DEPDIR
# -------------
# Choose a directory name for dependency files.
# This macro is AC_REQUIREd in _AM_DEPENDENCIES
AC_DEFUN([AM_SET_DEPDIR],
[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
])
# AM_DEP_TRACK
# ------------
AC_DEFUN([AM_DEP_TRACK],
[AC_ARG_ENABLE(dependency-tracking,
[ --disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors])
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
fi
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
AC_SUBST([AMDEPBACKSLASH])
])
# Generate code to set up dependency tracking. -*- Autoconf -*-
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
#serial 3
# _AM_OUTPUT_DEPENDENCY_COMMANDS
# ------------------------------
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
[for mf in $CONFIG_FILES; do
# Strip MF so we end up with the name of the file.
mf=`echo "$mf" | sed -e 's/:.*$//'`
# Check whether this is an Automake generated Makefile or not.
# We used to match only the files named `Makefile.in', but
# some people rename them; so instead we look at the file content.
# Grep'ing the first line is not enough: some people post-process
# each Makefile.in and add a new line on top of each file to say so.
# So let's grep whole file.
if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
dirpart=`AS_DIRNAME("$mf")`
else
continue
fi
# Extract the definition of DEPDIR, am__include, and am__quote
# from the Makefile without running `make'.
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
test -z "$DEPDIR" && continue
am__include=`sed -n 's/^am__include = //p' < "$mf"`
test -z "am__include" && continue
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
# When using ansi2knr, U may be empty or an underscore; expand it
U=`sed -n 's/^U = //p' < "$mf"`
# Find all dependency output files, they are included files with
# $(DEPDIR) in their names. We invoke sed twice because it is the
# simplest approach to changing $(DEPDIR) to its actual value in the
# expansion.
for file in `sed -n "
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`AS_DIRNAME(["$file"])`
AS_MKDIR_P([$dirpart/$fdir])
# echo "creating $dirpart/$file"
echo '# dummy' > "$dirpart/$file"
done
done
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
# AM_OUTPUT_DEPENDENCY_COMMANDS
# -----------------------------
# This macro should only be invoked once -- use via AC_REQUIRE.
#
# This code is only required when automatic dependency tracking
# is enabled. FIXME. This creates each `.P' file that we will
# need in order to bootstrap the dependency handling code.
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
[AC_CONFIG_COMMANDS([depfiles],
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
[AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
])
# Do all the work for Automake. -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 12
# This macro actually does too much. Some checks are only needed if
# your package does certain things. But this isn't really a big deal.
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
# AM_INIT_AUTOMAKE([OPTIONS])
# -----------------------------------------------
# The call with PACKAGE and VERSION arguments is the old style
# call (pre autoconf-2.50), which is being phased out. PACKAGE
# and VERSION should now be passed to AC_INIT and removed from
# the call to AM_INIT_AUTOMAKE.
# We support both call styles for the transition. After
# the next Automake release, Autoconf can make the AC_INIT
# arguments mandatory, and then we can depend on a new Autoconf
# release and drop the old call support.
AC_DEFUN([AM_INIT_AUTOMAKE],
[AC_PREREQ([2.58])dnl
dnl Autoconf wants to disallow AM_ names. We explicitly allow
dnl the ones we care about.
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
AC_REQUIRE([AC_PROG_INSTALL])dnl
# test to see if srcdir already configured
if test "`cd $srcdir && pwd`" != "`pwd`" &&
test -f $srcdir/config.status; then
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
fi
# test whether we have cygpath
if test -z "$CYGPATH_W"; then
if (cygpath --version) >/dev/null 2>/dev/null; then
CYGPATH_W='cygpath -w'
else
CYGPATH_W=echo
fi
fi
AC_SUBST([CYGPATH_W])
# Define the identity of the package.
dnl Distinguish between old-style and new-style calls.
m4_ifval([$2],
[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
AC_SUBST([PACKAGE], [$1])dnl
AC_SUBST([VERSION], [$2])],
[_AM_SET_OPTIONS([$1])dnl
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
_AM_IF_OPTION([no-define],,
[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
# Some tools Automake needs.
AC_REQUIRE([AM_SANITY_CHECK])dnl
AC_REQUIRE([AC_ARG_PROGRAM])dnl
AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
AM_MISSING_PROG(AUTOCONF, autoconf)
AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
AM_MISSING_PROG(AUTOHEADER, autoheader)
AM_MISSING_PROG(MAKEINFO, makeinfo)
AM_PROG_INSTALL_SH
AM_PROG_INSTALL_STRIP
AC_REQUIRE([AM_PROG_MKDIR_P])dnl
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
AC_REQUIRE([AC_PROG_AWK])dnl
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
[_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
[_AM_PROG_TAR([v7])])])
_AM_IF_OPTION([no-dependencies],,
[AC_PROVIDE_IFELSE([AC_PROG_CC],
[_AM_DEPENDENCIES(CC)],
[define([AC_PROG_CC],
defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
AC_PROVIDE_IFELSE([AC_PROG_CXX],
[_AM_DEPENDENCIES(CXX)],
[define([AC_PROG_CXX],
defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
])
])
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. The stamp files are numbered to have different names.
# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
# loop where config.status creates the headers, so we can generate
# our stamp files there.
AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
[# Compute $1's index in $config_headers.
_am_stamp_count=1
for _am_header in $config_headers :; do
case $_am_header in
$1 | $1:* )
break ;;
* )
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
esac
done
echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_INSTALL_SH
# ------------------
# Define $install_sh.
AC_DEFUN([AM_PROG_INSTALL_SH],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
install_sh=${install_sh-"$am_aux_dir/install-sh"}
AC_SUBST(install_sh)])
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 4
AC_DEFUN([AM_MAINTAINER_MODE],
[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
dnl maintainer-mode is disabled by default
AC_ARG_ENABLE(maintainer-mode,
[ --enable-maintainer-mode enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer],
USE_MAINTAINER_MODE=$enableval,
USE_MAINTAINER_MODE=no)
AC_MSG_RESULT([$USE_MAINTAINER_MODE])
AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
MAINT=$MAINTAINER_MODE_TRUE
AC_SUBST(MAINT)dnl
]
)
AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
# Check to see how 'make' treats includes. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 3
# AM_MAKE_INCLUDE()
# -----------------
# Check to see how make treats includes.
AC_DEFUN([AM_MAKE_INCLUDE],
[am_make=${MAKE-make}
cat > confinc << 'END'
am__doit:
@echo done
.PHONY: am__doit
END
# If we don't find an include directive, just comment out the code.
AC_MSG_CHECKING([for style of include used by $am_make])
am__include="#"
am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
# We grep out `Entering directory' and `Leaving directory'
# messages which can occur if `w' ends up in MAKEFLAGS.
# In particular we don't look at `^make:' because GNU make might
# be invoked under some other name (usually "gmake"), in which
# case it prints its new name instead of `make'.
if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
am__include=include
am__quote=
_am_result=GNU
fi
# Now try BSD make style include.
if test "$am__include" = "#"; then
echo '.include "confinc"' > confmf
if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
am__include=.include
am__quote="\""
_am_result=BSD
fi
fi
AC_SUBST([am__include])
AC_SUBST([am__quote])
AC_MSG_RESULT([$_am_result])
rm -f confinc confmf
])
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 4
# AM_MISSING_PROG(NAME, PROGRAM)
# ------------------------------
AC_DEFUN([AM_MISSING_PROG],
[AC_REQUIRE([AM_MISSING_HAS_RUN])
$1=${$1-"${am_missing_run}$2"}
AC_SUBST($1)])
# AM_MISSING_HAS_RUN
# ------------------
# Define MISSING if not defined so far and test if it supports --run.
# If it does, set am_missing_run to use it, otherwise, to nothing.
AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
# Use eval to expand $SHELL
if eval "$MISSING --run true"; then
am_missing_run="$MISSING --run "
else
am_missing_run=
AC_MSG_WARN([`missing' script is too old or missing])
fi
])
# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_MKDIR_P
# ---------------
# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
#
# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
# created by `make install' are always world readable, even if the
# installer happens to have an overly restrictive umask (e.g. 077).
# This was a mistake. There are at least two reasons why we must not
# use `-m 0755':
# - it causes special bits like SGID to be ignored,
# - it may be too restrictive (some setups expect 775 directories).
#
# Do not use -m 0755 and let people choose whatever they expect by
# setting umask.
#
# We cannot accept any implementation of `mkdir' that recognizes `-p'.
# Some implementations (such as Solaris 8's) are not thread-safe: if a
# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
# concurrently, both version can detect that a/ is missing, but only
# one can create it and the other will error out. Consequently we
# restrict ourselves to GNU make (using the --version option ensures
# this.)
AC_DEFUN([AM_PROG_MKDIR_P],
[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
# We used to keeping the `.' as first argument, in order to
# allow $(mkdir_p) to be used without argument. As in
# $(mkdir_p) $(somedir)
# where $(somedir) is conditionally defined. However this is wrong
# for two reasons:
# 1. if the package is installed by a user who cannot write `.'
# make install will fail,
# 2. the above comment should most certainly read
# $(mkdir_p) $(DESTDIR)$(somedir)
# so it does not work when $(somedir) is undefined and
# $(DESTDIR) is not.
# To support the latter case, we have to write
# test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
# so the `.' trick is pointless.
mkdir_p='mkdir -p --'
else
# On NextStep and OpenStep, the `mkdir' command does not
# recognize any option. It will interpret all options as
# directories to create, and then abort because `.' already
# exists.
for d in ./-p ./--version;
do
test -d $d && rmdir $d
done
# $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
if test -f "$ac_aux_dir/mkinstalldirs"; then
mkdir_p='$(mkinstalldirs)'
else
mkdir_p='$(install_sh) -d'
fi
fi
AC_SUBST([mkdir_p])])
# Helper functions for option handling. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 3
# _AM_MANGLE_OPTION(NAME)
# -----------------------
AC_DEFUN([_AM_MANGLE_OPTION],
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
# _AM_SET_OPTION(NAME)
# ------------------------------
# Set option NAME. Presently that only means defining a flag for this option.
AC_DEFUN([_AM_SET_OPTION],
[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
# _AM_SET_OPTIONS(OPTIONS)
# ----------------------------------
# OPTIONS is a space-separated list of Automake options.
AC_DEFUN([_AM_SET_OPTIONS],
[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
# -------------------------------------------
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
# Check to make sure that the build environment is sane. -*- Autoconf -*-
# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 4
# AM_SANITY_CHECK
# ---------------
AC_DEFUN([AM_SANITY_CHECK],
[AC_MSG_CHECKING([whether build environment is sane])
# Just in case
sleep 1
echo timestamp > conftest.file
# Do `set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
if test "$[*]" = "X"; then
# -L didn't work.
set X `ls -t $srcdir/configure conftest.file`
fi
rm -f conftest.file
if test "$[*]" != "X $srcdir/configure conftest.file" \
&& test "$[*]" != "X conftest.file $srcdir/configure"; then
# If neither matched, then we have a broken ls. This can happen
# if, for instance, CONFIG_SHELL is bash and it inherits a
# broken ls alias from the environment. This has actually
# happened. Such a system could not be considered "sane".
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
alias in your environment])
fi
test "$[2]" = conftest.file
)
then
# Ok.
:
else
AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
AC_MSG_RESULT(yes)])
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_INSTALL_STRIP
# ---------------------
# One issue with vendor `install' (even GNU) is that you can't
# specify the program used to strip binaries. This is especially
# annoying in cross-compiling environments, where the build's strip
# is unlikely to handle the host's binaries.
# Fortunately install-sh will honor a STRIPPROG variable, so we
# always use install-sh in `make install-strip', and initialize
# STRIPPROG with the value of the STRIP variable (set by the user).
AC_DEFUN([AM_PROG_INSTALL_STRIP],
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
# Installed binaries are usually stripped using `strip' when the user
# run `make install-strip'. However `strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
# will honor the `STRIP' environment variable to overrule this program.
dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
if test "$cross_compiling" != no; then
AC_CHECK_TOOL([STRIP], [strip], :)
fi
INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
# Check how to create a tarball. -*- Autoconf -*-
# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 2
# _AM_PROG_TAR(FORMAT)
# --------------------
# Check how to create a tarball in format FORMAT.
# FORMAT should be one of `v7', `ustar', or `pax'.
#
# Substitute a variable $(am__tar) that is a command
# writing to stdout a FORMAT-tarball containing the directory
# $tardir.
# tardir=directory && $(am__tar) > result.tar
#
# Substitute a variable $(am__untar) that extract such
# a tarball read from stdin.
# $(am__untar) < result.tar
AC_DEFUN([_AM_PROG_TAR],
[# Always define AMTAR for backward compatibility.
AM_MISSING_PROG([AMTAR], [tar])
m4_if([$1], [v7],
[am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
[m4_case([$1], [ustar],, [pax],,
[m4_fatal([Unknown tar format])])
AC_MSG_CHECKING([how to create a $1 tar archive])
# Loop over all known methods to create a tar archive until one works.
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
_am_tools=${am_cv_prog_tar_$1-$_am_tools}
# Do not fold the above two line into one, because Tru64 sh and
# Solaris sh will not grok spaces in the rhs of `-'.
for _am_tool in $_am_tools
do
case $_am_tool in
gnutar)
for _am_tar in tar gnutar gtar;
do
AM_RUN_LOG([$_am_tar --version]) && break
done
am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
am__untar="$_am_tar -xf -"
;;
plaintar)
# Must skip GNU tar: if it does not support --format= it doesn't create
# ustar tarball either.
(tar --version) >/dev/null 2>&1 && continue
am__tar='tar chf - "$$tardir"'
am__tar_='tar chf - "$tardir"'
am__untar='tar xf -'
;;
pax)
am__tar='pax -L -x $1 -w "$$tardir"'
am__tar_='pax -L -x $1 -w "$tardir"'
am__untar='pax -r'
;;
cpio)
am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
am__untar='cpio -i -H $1 -d'
;;
none)
am__tar=false
am__tar_=false
am__untar=false
;;
esac
# If the value was cached, stop now. We just wanted to have am__tar
# and am__untar set.
test -n "${am_cv_prog_tar_$1}" && break
# tar/untar a dummy directory, and stop if the command works
rm -rf conftest.dir
mkdir conftest.dir
echo GrepMe > conftest.dir/file
AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
rm -rf conftest.dir
if test -s conftest.tar; then
AM_RUN_LOG([$am__untar <conftest.tar])
grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
fi
done
rm -rf conftest.dir
AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
AC_MSG_RESULT([$am_cv_prog_tar_$1])])
AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
m4_include([gnulib/m4/extensions.m4])
m4_include([gnulib/m4/gnulib-common.m4])
m4_include([gnulib/m4/gnulib-comp.m4])
m4_include([gnulib/m4/include_next.m4])
m4_include([gnulib/m4/longlong.m4])
m4_include([gnulib/m4/memchr.m4])
m4_include([gnulib/m4/memcmp.m4])
m4_include([gnulib/m4/memmem.m4])
m4_include([gnulib/m4/onceonly_2_57.m4])
m4_include([gnulib/m4/stdint.m4])
m4_include([gnulib/m4/string_h.m4])
m4_include([gnulib/m4/wchar.m4])
m4_include([../config/extensions.m4])
m4_include([../config/lead-dot.m4])
m4_include([../config/proginstall.m4])
m4_include([acinclude.m4])

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,481 +0,0 @@
/* Ada language support definitions for GDB, the GNU debugger.
Copyright (C) 1992, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#if !defined (ADA_LANG_H)
#define ADA_LANG_H 1
struct partial_symbol;
struct frame_info;
#include "value.h"
#include "gdbtypes.h"
#include "breakpoint.h"
/* Names of specific files known to be part of the runtime
system and that might consider (confusing) debugging information.
Each name (a basic regular expression string) is followed by a
comma. FIXME: Should be part of a configuration file. */
#if defined(__alpha__) && defined(__osf__)
#define ADA_KNOWN_RUNTIME_FILE_NAME_PATTERNS \
"^[agis]-.*\\.ad[bs]$", \
"/usr/shlib/libpthread\\.so",
#elif defined (__linux__)
#define ADA_KNOWN_RUNTIME_FILE_NAME_PATTERNS \
"^[agis]-.*\\.ad[bs]$", \
"/lib.*/libpthread\\.so[.0-9]*$", "/lib.*/libpthread\\.a$", \
"/lib.*/libc\\.so[.0-9]*$", "/lib.*/libc\\.a$",
#endif
#if !defined (ADA_KNOWN_RUNTIME_FILE_NAME_PATTERNS)
#define ADA_KNOWN_RUNTIME_FILE_NAME_PATTERNS \
"^[agis]-.*\\.ad[bs]$",
#endif
/* Names of compiler-generated auxiliary functions probably of no
interest to users. Each name (a basic regular expression string)
is followed by a comma. */
#define ADA_KNOWN_AUXILIARY_FUNCTION_NAME_PATTERNS \
"___clean[.$a-zA-Z0-9_]*$",
/* The maximum number of frame levels searched for non-local,
* non-global symbols. This limit exists as a precaution to prevent
* infinite search loops when the stack is screwed up. */
#define MAX_ENCLOSING_FRAME_LEVELS 7
/* Maximum number of steps followed in looking for the ultimate
referent of a renaming. This prevents certain infinite loops that
can otherwise result. */
#define MAX_RENAMING_CHAIN_LENGTH 10
struct block;
/* Corresponding encoded/decoded names and opcodes for Ada user-definable
operators. */
struct ada_opname_map
{
const char *encoded;
const char *decoded;
enum exp_opcode op;
};
/* Table of Ada operators in encoded and decoded forms. */
/* Defined in ada-lang.c */
extern const struct ada_opname_map ada_opname_table[];
enum ada_operator
{
/* X IN A'RANGE(N). N is an immediate operand, surrounded by
BINOP_IN_BOUNDS before and after. A is an array, X an index
value. Evaluates to true iff X is within range of the Nth
dimension (1-based) of A. (A multi-dimensional array
type is represented as array of array of ...) */
BINOP_IN_BOUNDS = OP_EXTENDED0,
/* X IN L .. U. True iff L <= X <= U. */
TERNOP_IN_RANGE,
/* Ada attributes ('Foo). */
OP_ATR_FIRST,
OP_ATR_LAST,
OP_ATR_LENGTH,
OP_ATR_IMAGE,
OP_ATR_MAX,
OP_ATR_MIN,
OP_ATR_MODULUS,
OP_ATR_POS,
OP_ATR_SIZE,
OP_ATR_TAG,
OP_ATR_VAL,
/* Ada type qualification. It is encoded as for UNOP_CAST, above,
and denotes the TYPE'(EXPR) construct. */
UNOP_QUAL,
/* X IN TYPE. The `TYPE' argument is immediate, with
UNOP_IN_RANGE before and after it. True iff X is a member of
type TYPE (typically a subrange). */
UNOP_IN_RANGE,
/* An aggregate. A single immediate operand, N>0, gives
the number of component specifications that follow. The
immediate operand is followed by a second OP_AGGREGATE.
Next come N component specifications. A component
specification is either an OP_OTHERS (others=>...), an
OP_CHOICES (for named associations), or other expression (for
positional aggregates only). Aggregates currently
occur only as the right sides of assignments. */
OP_AGGREGATE,
/* An others clause. Followed by a single expression. */
OP_OTHERS,
/* An aggregate component association. A single immediate operand, N,
gives the number of choices that follow. This is followed by a second
OP_CHOICES operator. Next come N operands, each of which is an
expression, an OP_DISCRETE_RANGE, or an OP_NAME---the latter
for a simple name that must be a record component name and does
not correspond to a single existing symbol. After the N choice
indicators comes an expression giving the value.
In an aggregate such as (X => E1, ...), where X is a simple
name, X could syntactically be either a component_selector_name
or an expression used as a discrete_choice, depending on the
aggregate's type context. Since this is not known at parsing
time, we don't attempt to disambiguate X if it has multiple
definitions, but instead supply an OP_NAME. If X has a single
definition, we represent it with an OP_VAR_VALUE, even though
it may turn out to be within a record aggregate. Aggregate
evaluation can use either OP_NAMEs or OP_VAR_VALUEs to get a
record field name, and can evaluate OP_VAR_VALUE normally to
get its value as an expression. Unfortunately, we lose out in
cases where X has multiple meanings and is part of an array
aggregate. I hope these are not common enough to annoy users,
who can work around the problem in any case by putting
parentheses around X. */
OP_CHOICES,
/* A positional aggregate component association. The operator is
followed by a single integer indicating the position in the
aggregate (0-based), followed by a second OP_POSITIONAL. Next
follows a single expression giving the component value. */
OP_POSITIONAL,
/* A range of values. Followed by two expressions giving the
upper and lower bounds of the range. */
OP_DISCRETE_RANGE,
/* End marker */
OP_ADA_LAST
};
/* A tuple, (symbol, block), representing one instance of a
* symbol-lookup operation. */
struct ada_symbol_info {
struct symbol* sym;
struct block* block;
};
/* Denotes a type of renaming symbol (see ada_parse_renaming). */
enum ada_renaming_category
{
/* Indicates a symbol that does not encode a renaming. */
ADA_NOT_RENAMING,
/* For symbols declared
Foo : TYPE renamed OBJECT; */
ADA_OBJECT_RENAMING,
/* For symbols declared
Foo : exception renames EXCEPTION; */
ADA_EXCEPTION_RENAMING,
/* For packages declared
package Foo renames PACKAGE; */
ADA_PACKAGE_RENAMING,
/* For subprograms declared
SUBPROGRAM_SPEC renames SUBPROGRAM;
(Currently not used). */
ADA_SUBPROGRAM_RENAMING
};
/* Ada task structures. */
struct ada_task_info
{
/* The PTID of the thread that this task runs on. This ptid is computed
in a target-dependent way from the associated Task Control Block. */
ptid_t ptid;
/* The ID of the task. */
CORE_ADDR task_id;
/* The name of the task. */
char name[257];
/* The current state of the task. */
int state;
/* The priority associated to the task. */
int priority;
/* If non-zero, the task ID of the parent task. */
CORE_ADDR parent;
/* If the task is waiting on a task entry, this field contains
the ID of the other task. Zero otherwise. */
CORE_ADDR called_task;
/* If the task is accepting a rendezvous with another task, this field
contains the ID of the calling task. Zero otherwise. */
CORE_ADDR caller_task;
};
/* Assuming V points to an array of S objects, make sure that it contains at
least M objects, updating V and S as necessary. */
#define GROW_VECT(v, s, m) \
if ((s) < (m)) (v) = grow_vect (v, &(s), m, sizeof *(v));
extern void *grow_vect (void *, size_t *, size_t, int);
extern int ada_get_field_index (const struct type *type,
const char *field_name,
int maybe_missing);
extern int ada_parse (void); /* Defined in ada-exp.y */
extern void ada_error (char *); /* Defined in ada-exp.y */
/* Defined in ada-typeprint.c */
extern void ada_print_type (struct type *, char *, struct ui_file *, int,
int);
extern int ada_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
struct ui_file *, int,
const struct value_print_options *);
extern int ada_value_print (struct value *, struct ui_file *,
const struct value_print_options *);
/* Defined in ada-lang.c */
extern void ada_emit_char (int, struct type *, struct ui_file *, int, int);
extern void ada_printchar (int, struct type *, struct ui_file *);
extern void ada_printstr (struct ui_file *, struct type *, const gdb_byte *,
unsigned int, int,
const struct value_print_options *);
struct value *ada_convert_actual (struct value *actual,
struct type *formal_type0,
CORE_ADDR *sp);
extern struct value *ada_value_subscript (struct value *, int,
struct value **);
extern struct type *ada_array_element_type (struct type *, int);
extern int ada_array_arity (struct type *);
struct type *ada_type_of_array (struct value *, int);
extern struct value *ada_coerce_to_simple_array_ptr (struct value *);
extern int ada_is_simple_array_type (struct type *);
extern int ada_is_array_descriptor_type (struct type *);
extern int ada_is_bogus_array_descriptor (struct type *);
extern struct type *ada_index_type (struct type *, int);
extern struct value *ada_array_bound (struct value *, int, int);
extern char *ada_decode_symbol (const struct general_symbol_info*);
extern const char *ada_decode (const char*);
extern enum language ada_update_initial_language (enum language,
struct partial_symtab*);
extern void clear_ada_sym_cache (void);
extern int ada_lookup_symbol_list (const char *, const struct block *,
domain_enum, struct ada_symbol_info**);
extern char *ada_fold_name (const char *);
extern struct symbol *ada_lookup_symbol (const char *, const struct block *,
domain_enum, int *);
extern struct symbol *
ada_lookup_encoded_symbol (const char *, const struct block *,
domain_enum namespace, struct block **);
extern struct minimal_symbol *ada_lookup_simple_minsym (const char *);
extern void ada_fill_in_ada_prototype (struct symbol *);
extern int user_select_syms (struct ada_symbol_info *, int, int);
extern int get_selections (int *, int, int, int, char *);
extern char *ada_start_decode_line_1 (char *);
extern struct symtabs_and_lines ada_finish_decode_line_1 (char **,
struct symtab *,
int, char ***);
extern struct symtabs_and_lines ada_sals_for_line (const char*, int,
int, char***, int);
extern int ada_scan_number (const char *, int, LONGEST *, int *);
extern struct type *ada_parent_type (struct type *);
extern int ada_is_ignored_field (struct type *, int);
extern int ada_is_packed_array_type (struct type *);
extern struct value *ada_value_primitive_packed_val (struct value *,
const gdb_byte *,
long, int, int,
struct type *);
extern struct type *ada_coerce_to_simple_array_type (struct type *);
extern int ada_is_character_type (struct type *);
extern int ada_is_string_type (struct type *);
extern int ada_is_tagged_type (struct type *, int);
extern int ada_is_tag_type (struct type *);
extern struct type *ada_tag_type (struct value *);
extern struct value *ada_value_tag (struct value *);
extern const char *ada_tag_name (struct value *);
extern int ada_is_parent_field (struct type *, int);
extern int ada_is_wrapper_field (struct type *, int);
extern int ada_is_variant_part (struct type *, int);
extern struct type *ada_variant_discrim_type (struct type *, struct type *);
extern int ada_is_others_clause (struct type *, int);
extern int ada_in_variant (LONGEST, struct type *, int);
extern char *ada_variant_discrim_name (struct type *);
extern struct value *ada_value_struct_elt (struct value *, char *, int);
extern int ada_is_aligner_type (struct type *);
extern struct type *ada_aligned_type (struct type *);
extern const gdb_byte *ada_aligned_value_addr (struct type *,
const gdb_byte *);
extern const char *ada_attribute_name (enum exp_opcode);
extern int ada_is_fixed_point_type (struct type *);
extern int ada_is_system_address_type (struct type *);
extern DOUBLEST ada_delta (struct type *);
extern DOUBLEST ada_fixed_to_float (struct type *, LONGEST);
extern LONGEST ada_float_to_fixed (struct type *, DOUBLEST);
extern int ada_is_vax_floating_type (struct type *);
extern int ada_vax_float_type_suffix (struct type *);
extern struct value *ada_vax_float_print_function (struct type *);
extern struct type *ada_system_address_type (void);
extern int ada_which_variant_applies (struct type *, struct type *,
const gdb_byte *);
extern struct type *ada_to_fixed_type (struct type *, const gdb_byte *,
CORE_ADDR, struct value *,
int check_tag);
extern struct type *ada_template_to_fixed_record_type_1 (struct type *type,
const gdb_byte *valaddr,
CORE_ADDR address,
struct value *dval0,
int keep_dynamic_fields);
extern int ada_name_prefix_len (const char *);
extern char *ada_type_name (struct type *);
extern struct type *ada_find_parallel_type (struct type *,
const char *suffix);
extern LONGEST get_int_var_value (char *, int *);
extern struct symbol *ada_find_any_symbol (const char *name);
extern struct type *ada_find_any_type (const char *name);
extern struct symbol *ada_find_renaming_symbol (const char *name,
struct block *block);
extern int ada_prefer_type (struct type *, struct type *);
extern struct type *ada_get_base_type (struct type *);
extern struct type *ada_check_typedef (struct type *);
extern char *ada_encode (const char *);
extern const char *ada_enum_name (const char *);
extern int ada_is_modular_type (struct type *);
extern ULONGEST ada_modulus (struct type *);
extern struct value *ada_value_ind (struct value *);
extern void ada_print_scalar (struct type *, LONGEST, struct ui_file *);
extern int ada_is_range_type_name (const char *);
extern enum ada_renaming_category ada_parse_renaming (struct symbol *,
const char **,
int *, const char **);
extern void ada_find_printable_frame (struct frame_info *fi);
extern char *ada_breakpoint_rewrite (char *, int *);
extern char *ada_main_name (void);
/* Tasking-related: ada-tasks.c */
extern int valid_task_id (int);
extern int ada_get_task_number (ptid_t);
extern int ada_build_task_list (int warn_if_null);
extern int ada_exception_catchpoint_p (struct breakpoint *b);
extern struct symtab_and_line
ada_decode_exception_location (char *args, char **addr_string,
char **exp_string, char **cond_string,
struct expression **cond,
struct breakpoint_ops **ops);
extern struct symtab_and_line
ada_decode_assert_location (char *args, char **addr_string,
struct breakpoint_ops **ops);
#endif

View File

@@ -1,607 +0,0 @@
/* FLEX lexer for Ada expressions, for GDB.
Copyright (C) 1994, 1997, 1998, 2000, 2001, 2002, 2003, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
/*----------------------------------------------------------------------*/
/* The converted version of this file is to be included in ada-exp.y, */
/* the Ada parser for gdb. The function yylex obtains characters from */
/* the global pointer lexptr. It returns a syntactic category for */
/* each successive token and places a semantic value into yylval */
/* (ada-lval), defined by the parser. */
DIG [0-9]
NUM10 ({DIG}({DIG}|_)*)
HEXDIG [0-9a-f]
NUM16 ({HEXDIG}({HEXDIG}|_)*)
OCTDIG [0-7]
LETTER [a-z_]
ID ({LETTER}({LETTER}|{DIG})*|"<"{LETTER}({LETTER}|{DIG})*">")
WHITE [ \t\n]
TICK ("'"{WHITE}*)
GRAPHIC [a-z0-9 #&'()*+,-./:;<>=_|!$%?@\[\]\\^`{}~]
OPER ([-+*/=<>&]|"<="|">="|"**"|"/="|"and"|"or"|"xor"|"not"|"mod"|"rem"|"abs")
EXP (e[+-]{NUM10})
POSEXP (e"+"?{NUM10})
%{
#define NUMERAL_WIDTH 256
#define LONGEST_SIGN ((ULONGEST) 1 << (sizeof(LONGEST) * HOST_CHAR_BIT - 1))
/* Temporary staging for numeric literals. */
static char numbuf[NUMERAL_WIDTH];
static void canonicalizeNumeral (char *s1, const char *);
static struct stoken processString (const char*, int);
static int processInt (const char *, const char *, const char *);
static int processReal (const char *);
static struct stoken processId (const char *, int);
static int processAttribute (const char *);
static int find_dot_all (const char *);
#undef YY_DECL
#define YY_DECL static int yylex ( void )
#undef YY_INPUT
#define YY_INPUT(BUF, RESULT, MAX_SIZE) \
if ( *lexptr == '\000' ) \
(RESULT) = YY_NULL; \
else \
{ \
*(BUF) = *lexptr; \
(RESULT) = 1; \
lexptr += 1; \
}
static int find_dot_all (const char *);
%}
%option case-insensitive interactive nodefault
%s BEFORE_QUAL_QUOTE
%%
{WHITE} { }
"--".* { yyterminate(); }
{NUM10}{POSEXP} {
canonicalizeNumeral (numbuf, yytext);
return processInt (NULL, numbuf, strrchr(numbuf, 'e')+1);
}
{NUM10} {
canonicalizeNumeral (numbuf, yytext);
return processInt (NULL, numbuf, NULL);
}
{NUM10}"#"{HEXDIG}({HEXDIG}|_)*"#"{POSEXP} {
canonicalizeNumeral (numbuf, yytext);
return processInt (numbuf,
strchr (numbuf, '#') + 1,
strrchr(numbuf, '#') + 1);
}
{NUM10}"#"{HEXDIG}({HEXDIG}|_)*"#" {
canonicalizeNumeral (numbuf, yytext);
return processInt (numbuf, strchr (numbuf, '#') + 1, NULL);
}
"0x"{HEXDIG}+ {
canonicalizeNumeral (numbuf, yytext+2);
return processInt ("16#", numbuf, NULL);
}
{NUM10}"."{NUM10}{EXP} {
canonicalizeNumeral (numbuf, yytext);
return processReal (numbuf);
}
{NUM10}"."{NUM10} {
canonicalizeNumeral (numbuf, yytext);
return processReal (numbuf);
}
{NUM10}"#"{NUM16}"."{NUM16}"#"{EXP} {
error (_("Based real literals not implemented yet."));
}
{NUM10}"#"{NUM16}"."{NUM16}"#" {
error (_("Based real literals not implemented yet."));
}
<INITIAL>"'"({GRAPHIC}|\")"'" {
yylval.typed_val.type = type_char ();
yylval.typed_val.val = yytext[1];
return CHARLIT;
}
<INITIAL>"'[\""{HEXDIG}{2}"\"]'" {
int v;
yylval.typed_val.type = type_char ();
sscanf (yytext+3, "%2x", &v);
yylval.typed_val.val = v;
return CHARLIT;
}
\"({GRAPHIC}|"[\""({HEXDIG}{2}|\")"\"]")*\" {
yylval.sval = processString (yytext+1, yyleng-2);
return STRING;
}
\" {
error (_("ill-formed or non-terminated string literal"));
}
if {
while (*lexptr != 'i' && *lexptr != 'I')
lexptr -= 1;
yyrestart(NULL);
return 0;
}
/* ADA KEYWORDS */
abs { return ABS; }
and { return _AND_; }
else { return ELSE; }
in { return IN; }
mod { return MOD; }
new { return NEW; }
not { return NOT; }
null { return NULL_PTR; }
or { return OR; }
others { return OTHERS; }
rem { return REM; }
then { return THEN; }
xor { return XOR; }
/* BOOLEAN "KEYWORDS" */
/* True and False are not keywords in Ada, but rather enumeration constants.
However, the boolean type is no longer represented as an enum, so True
and False are no longer defined in symbol tables. We compromise by
making them keywords (when bare). */
true { return TRUEKEYWORD; }
false { return FALSEKEYWORD; }
/* ATTRIBUTES */
{TICK}[a-zA-Z][a-zA-Z]+ { return processAttribute (yytext+1); }
/* PUNCTUATION */
"=>" { return ARROW; }
".." { return DOTDOT; }
"**" { return STARSTAR; }
":=" { return ASSIGN; }
"/=" { return NOTEQUAL; }
"<=" { return LEQ; }
">=" { return GEQ; }
<BEFORE_QUAL_QUOTE>"'" { BEGIN INITIAL; return '\''; }
[-&*+./:<>=|;\[\]] { return yytext[0]; }
"," { if (paren_depth == 0 && comma_terminates)
{
lexptr -= 1;
yyrestart(NULL);
return 0;
}
else
return ',';
}
"(" { paren_depth += 1; return '('; }
")" { if (paren_depth == 0)
{
lexptr -= 1;
yyrestart(NULL);
return 0;
}
else
{
paren_depth -= 1;
return ')';
}
}
"."{WHITE}*all { return DOT_ALL; }
"."{WHITE}*{ID} {
yylval.sval = processId (yytext+1, yyleng-1);
return DOT_ID;
}
{ID}({WHITE}*"."{WHITE}*({ID}|\"{OPER}\"))*(" "*"'")? {
int all_posn = find_dot_all (yytext);
if (all_posn == -1 && yytext[yyleng-1] == '\'')
{
BEGIN BEFORE_QUAL_QUOTE;
yyless (yyleng-1);
}
else if (all_posn >= 0)
yyless (all_posn);
yylval.sval = processId (yytext, yyleng);
return NAME;
}
/* GDB EXPRESSION CONSTRUCTS */
"'"[^']+"'"{WHITE}*:: {
yyless (yyleng - 2);
yylval.sval = processId (yytext, yyleng);
return NAME;
}
"::" { return COLONCOLON; }
[{}@] { return yytext[0]; }
/* REGISTERS AND GDB CONVENIENCE VARIABLES */
"$"({LETTER}|{DIG}|"$")* {
yylval.sval.ptr = yytext;
yylval.sval.length = yyleng;
return SPECIAL_VARIABLE;
}
/* CATCH-ALL ERROR CASE */
. { error (_("Invalid character '%s' in expression."), yytext); }
%%
#include <ctype.h>
#include "gdb_string.h"
/* Initialize the lexer for processing new expression. */
void
lexer_init (FILE *inp)
{
BEGIN INITIAL;
yyrestart (inp);
}
/* Copy S2 to S1, removing all underscores, and downcasing all letters. */
static void
canonicalizeNumeral (char *s1, const char *s2)
{
for (; *s2 != '\000'; s2 += 1)
{
if (*s2 != '_')
{
*s1 = tolower(*s2);
s1 += 1;
}
}
s1[0] = '\000';
}
/* Interprets the prefix of NUM that consists of digits of the given BASE
as an integer of that BASE, with the string EXP as an exponent.
Puts value in yylval, and returns INT, if the string is valid. Causes
an error if the number is improperly formated. BASE, if NULL, defaults
to "10", and EXP to "1". The EXP does not contain a leading 'e' or 'E'.
*/
static int
processInt (const char *base0, const char *num0, const char *exp0)
{
ULONGEST result;
long exp;
int base;
char *trailer;
if (base0 == NULL)
base = 10;
else
{
base = strtol (base0, (char **) NULL, 10);
if (base < 2 || base > 16)
error (_("Invalid base: %d."), base);
}
if (exp0 == NULL)
exp = 0;
else
exp = strtol(exp0, (char **) NULL, 10);
errno = 0;
result = strtoulst (num0, (const char **) &trailer, base);
if (errno == ERANGE)
error (_("Integer literal out of range"));
if (isxdigit(*trailer))
error (_("Invalid digit `%c' in based literal"), *trailer);
while (exp > 0)
{
if (result > (ULONG_MAX / base))
error (_("Integer literal out of range"));
result *= base;
exp -= 1;
}
if ((result >> (gdbarch_int_bit (parse_gdbarch)-1)) == 0)
yylval.typed_val.type = type_int ();
else if ((result >> (gdbarch_long_bit (parse_gdbarch)-1)) == 0)
yylval.typed_val.type = type_long ();
else if (((result >> (gdbarch_long_bit (parse_gdbarch)-1)) >> 1) == 0)
{
/* We have a number representable as an unsigned integer quantity.
For consistency with the C treatment, we will treat it as an
anonymous modular (unsigned) quantity. Alas, the types are such
that we need to store .val as a signed quantity. Sorry
for the mess, but C doesn't officially guarantee that a simple
assignment does the trick (no, it doesn't; read the reference manual).
*/
yylval.typed_val.type
= builtin_type (parse_gdbarch)->builtin_unsigned_long;
if (result & LONGEST_SIGN)
yylval.typed_val.val =
(LONGEST) (result & ~LONGEST_SIGN)
- (LONGEST_SIGN>>1) - (LONGEST_SIGN>>1);
else
yylval.typed_val.val = (LONGEST) result;
return INT;
}
else
yylval.typed_val.type = type_long_long ();
yylval.typed_val.val = (LONGEST) result;
return INT;
}
static int
processReal (const char *num0)
{
sscanf (num0, "%" DOUBLEST_SCAN_FORMAT, &yylval.typed_val_float.dval);
yylval.typed_val_float.type = type_float ();
if (sizeof(DOUBLEST) >= gdbarch_double_bit (parse_gdbarch)
/ TARGET_CHAR_BIT)
yylval.typed_val_float.type = type_double ();
if (sizeof(DOUBLEST) >= gdbarch_long_double_bit (parse_gdbarch)
/ TARGET_CHAR_BIT)
yylval.typed_val_float.type = type_long_double ();
return FLOAT;
}
/* Store a canonicalized version of NAME0[0..LEN-1] in yylval.ssym. The
resulting string is valid until the next call to ada_parse. It differs
from NAME0 in that:
+ Characters between '...' or <...> are transfered verbatim to
yylval.ssym.
+ <, >, and trailing "'" characters in quoted sequences are removed
(a leading quote is preserved to indicate that the name is not to be
GNAT-encoded).
+ Unquoted whitespace is removed.
+ Unquoted alphabetic characters are mapped to lower case.
Result is returned as a struct stoken, but for convenience, the string
is also null-terminated. Result string valid until the next call of
ada_parse.
*/
static struct stoken
processId (const char *name0, int len)
{
char *name = obstack_alloc (&temp_parse_space, len + 11);
int i0, i;
struct stoken result;
while (len > 0 && isspace (name0[len-1]))
len -= 1;
i = i0 = 0;
while (i0 < len)
{
if (isalnum (name0[i0]))
{
name[i] = tolower (name0[i0]);
i += 1; i0 += 1;
}
else switch (name0[i0])
{
default:
name[i] = name0[i0];
i += 1; i0 += 1;
break;
case ' ': case '\t':
i0 += 1;
break;
case '\'':
do
{
name[i] = name0[i0];
i += 1; i0 += 1;
}
while (i0 < len && name0[i0] != '\'');
i0 += 1;
break;
case '<':
i0 += 1;
while (i0 < len && name0[i0] != '>')
{
name[i] = name0[i0];
i += 1; i0 += 1;
}
i0 += 1;
break;
}
}
name[i] = '\000';
result.ptr = name;
result.length = i;
return result;
}
/* Return TEXT[0..LEN-1], a string literal without surrounding quotes,
with special hex character notations replaced with characters.
Result valid until the next call to ada_parse. */
static struct stoken
processString (const char *text, int len)
{
const char *p;
char *q;
const char *lim = text + len;
struct stoken result;
q = result.ptr = obstack_alloc (&temp_parse_space, len);
p = text;
while (p < lim)
{
if (p[0] == '[' && p[1] == '"' && p+2 < lim)
{
if (p[2] == '"') /* "...["""]... */
{
*q = '"';
p += 4;
}
else
{
int chr;
sscanf (p+2, "%2x", &chr);
*q = (char) chr;
p += 5;
}
}
else
*q = *p;
q += 1;
p += 1;
}
result.length = q - result.ptr;
return result;
}
/* Returns the position within STR of the '.' in a
'.{WHITE}*all' component of a dotted name, or -1 if there is none.
Note: we actually don't need this routine, since 'all' can never be an
Ada identifier. Thus, looking up foo.all or foo.all.x as a name
must fail, and will eventually be interpreted as (foo).all or
(foo).all.x. However, this does avoid an extraneous lookup. */
static int
find_dot_all (const char *str)
{
int i;
for (i = 0; str[i] != '\000'; i += 1)
{
if (str[i] == '.')
{
int i0 = i;
do
i += 1;
while (isspace (str[i]));
if (strncmp (str+i, "all", 3) == 0
&& ! isalnum (str[i+3]) && str[i+3] != '_')
return i0;
}
}
return -1;
}
/* Returns non-zero iff string SUBSEQ matches a subsequence of STR, ignoring
case. */
static int
subseqMatch (const char *subseq, const char *str)
{
if (subseq[0] == '\0')
return 1;
else if (str[0] == '\0')
return 0;
else if (tolower (subseq[0]) == tolower (str[0]))
return subseqMatch (subseq+1, str+1) || subseqMatch (subseq, str+1);
else
return subseqMatch (subseq, str+1);
}
static struct { const char *name; int code; }
attributes[] = {
{ "address", TICK_ADDRESS },
{ "unchecked_access", TICK_ACCESS },
{ "unrestricted_access", TICK_ACCESS },
{ "access", TICK_ACCESS },
{ "first", TICK_FIRST },
{ "last", TICK_LAST },
{ "length", TICK_LENGTH },
{ "max", TICK_MAX },
{ "min", TICK_MIN },
{ "modulus", TICK_MODULUS },
{ "pos", TICK_POS },
{ "range", TICK_RANGE },
{ "size", TICK_SIZE },
{ "tag", TICK_TAG },
{ "val", TICK_VAL },
{ NULL, -1 }
};
/* Return the syntactic code corresponding to the attribute name or
abbreviation STR. */
static int
processAttribute (const char *str)
{
int i, k;
for (i = 0; attributes[i].code != -1; i += 1)
if (strcasecmp (str, attributes[i].name) == 0)
return attributes[i].code;
for (i = 0, k = -1; attributes[i].code != -1; i += 1)
if (subseqMatch (str, attributes[i].name))
{
if (k == -1)
k = i;
else
error (_("ambiguous attribute name: `%s'"), str);
}
if (k == -1)
error (_("unrecognized attribute: `%s'"), str);
return attributes[k].code;
}
int
yywrap(void)
{
return 1;
}
/* Dummy definition to suppress warnings about unused static definitions. */
typedef void (*dummy_function) ();
dummy_function ada_flex_use[] =
{
(dummy_function) yyunput
};

View File

@@ -1,969 +0,0 @@
/* Copyright (C) 1992, 1993, 1994, 1997, 1998, 1999, 2000, 2003, 2004, 2005,
2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "observer.h"
#include "gdbcmd.h"
#include "target.h"
#include "ada-lang.h"
#include "gdbcore.h"
#include "inferior.h"
#include "gdbthread.h"
/* The name of the array in the GNAT runtime where the Ada Task Control
Block of each task is stored. */
#define KNOWN_TASKS_NAME "system__tasking__debug__known_tasks"
/* The maximum number of tasks known to the Ada runtime */
static const int MAX_NUMBER_OF_KNOWN_TASKS = 1000;
enum task_states
{
Unactivated,
Runnable,
Terminated,
Activator_Sleep,
Acceptor_Sleep,
Entry_Caller_Sleep,
Async_Select_Sleep,
Delay_Sleep,
Master_Completion_Sleep,
Master_Phase_2_Sleep,
Interrupt_Server_Idle_Sleep,
Interrupt_Server_Blocked_Interrupt_Sleep,
Timer_Server_Sleep,
AST_Server_Sleep,
Asynchronous_Hold,
Interrupt_Server_Blocked_On_Event_Flag,
Activating,
Acceptor_Delay_Sleep
};
/* A short description corresponding to each possible task state. */
static const char *task_states[] = {
N_("Unactivated"),
N_("Runnable"),
N_("Terminated"),
N_("Child Activation Wait"),
N_("Accept or Select Term"),
N_("Waiting on entry call"),
N_("Async Select Wait"),
N_("Delay Sleep"),
N_("Child Termination Wait"),
N_("Wait Child in Term Alt"),
"",
"",
"",
"",
N_("Asynchronous Hold"),
"",
N_("Activating"),
N_("Selective Wait")
};
/* A longer description corresponding to each possible task state. */
static const char *long_task_states[] = {
N_("Unactivated"),
N_("Runnable"),
N_("Terminated"),
N_("Waiting for child activation"),
N_("Blocked in accept or select with terminate"),
N_("Waiting on entry call"),
N_("Asynchronous Selective Wait"),
N_("Delay Sleep"),
N_("Waiting for children termination"),
N_("Waiting for children in terminate alternative"),
"",
"",
"",
"",
N_("Asynchronous Hold"),
"",
N_("Activating"),
N_("Blocked in selective wait statement")
};
/* The index of certain important fields in the Ada Task Control Block
record and sub-records. */
struct tcb_fieldnos
{
/* Fields in record Ada_Task_Control_Block. */
int common;
int entry_calls;
int atc_nesting_level;
/* Fields in record Common_ATCB. */
int state;
int parent;
int priority;
int image;
int image_len; /* This field may be missing. */
int call;
int ll;
/* Fields in Task_Primitives.Private_Data. */
int ll_thread;
int ll_lwp; /* This field may be missing. */
/* Fields in Common_ATCB.Call.all. */
int call_self;
};
/* The type description for the ATCB record and subrecords, and
the associated tcb_fieldnos. For efficiency reasons, these are made
static globals so that we can compute them only once the first time
and reuse them later. Set to NULL if the types haven't been computed
yet, or if they may be obsolete (for instance after having loaded
a new binary). */
static struct type *atcb_type = NULL;
static struct type *atcb_common_type = NULL;
static struct type *atcb_ll_type = NULL;
static struct type *atcb_call_type = NULL;
static struct tcb_fieldnos fieldno;
/* Set to 1 when the cached address of System.Tasking.Debug.Known_Tasks
might be stale and so needs to be recomputed. */
static int ada_tasks_check_symbol_table = 1;
/* The list of Ada tasks.
Note: To each task we associate a number that the user can use to
reference it - this number is printed beside each task in the tasks
info listing displayed by "info tasks". This number is equal to
its index in the vector + 1. Reciprocally, to compute the index
of a task in the vector, we need to substract 1 from its number. */
typedef struct ada_task_info ada_task_info_s;
DEF_VEC_O(ada_task_info_s);
static VEC(ada_task_info_s) *task_list = NULL;
/* When non-zero, this flag indicates that the current task_list
is obsolete, and should be recomputed before it is accessed. */
static int stale_task_list_p = 1;
/* Return the task number of the task whose ptid is PTID, or zero
if the task could not be found. */
int
ada_get_task_number (ptid_t ptid)
{
int i;
for (i=0; i < VEC_length (ada_task_info_s, task_list); i++)
if (ptid_equal (VEC_index (ada_task_info_s, task_list, i)->ptid, ptid))
return i + 1;
return 0; /* No matching task found. */
}
/* Return the task number of the task that matches TASK_ID, or zero
if the task could not be found. */
static int
get_task_number_from_id (CORE_ADDR task_id)
{
int i;
for (i = 0; i < VEC_length (ada_task_info_s, task_list); i++)
{
struct ada_task_info *task_info =
VEC_index (ada_task_info_s, task_list, i);
if (task_info->task_id == task_id)
return i + 1;
}
/* Task not found. Return 0. */
return 0;
}
/* Return non-zero if TASK_NUM is a valid task number. */
int
valid_task_id (int task_num)
{
return (task_num > 0
&& task_num <= VEC_length (ada_task_info_s, task_list));
}
/* Return non-zero iff the task STATE corresponds to a non-terminated
task state. */
static int
ada_task_is_alive (struct ada_task_info *task_info)
{
return (task_info->state != Terminated);
}
/* Extract the contents of the value as a string whose length is LENGTH,
and store the result in DEST. */
static void
value_as_string (char *dest, struct value *val, int length)
{
memcpy (dest, value_contents (val), length);
dest[length] = '\0';
}
/* Extract the string image from the fat string corresponding to VAL,
and store it in DEST. If the string length is greater than MAX_LEN,
then truncate the result to the first MAX_LEN characters of the fat
string. */
static void
read_fat_string_value (char *dest, struct value *val, int max_len)
{
struct value *array_val;
struct value *bounds_val;
int len;
/* The following variables are made static to avoid recomputing them
each time this function is called. */
static int initialize_fieldnos = 1;
static int array_fieldno;
static int bounds_fieldno;
static int upper_bound_fieldno;
/* Get the index of the fields that we will need to read in order
to extract the string from the fat string. */
if (initialize_fieldnos)
{
struct type *type = value_type (val);
struct type *bounds_type;
array_fieldno = ada_get_field_index (type, "P_ARRAY", 0);
bounds_fieldno = ada_get_field_index (type, "P_BOUNDS", 0);
bounds_type = TYPE_FIELD_TYPE (type, bounds_fieldno);
if (TYPE_CODE (bounds_type) == TYPE_CODE_PTR)
bounds_type = TYPE_TARGET_TYPE (bounds_type);
if (TYPE_CODE (bounds_type) != TYPE_CODE_STRUCT)
error (_("Unknown task name format. Aborting"));
upper_bound_fieldno = ada_get_field_index (bounds_type, "UB0", 0);
initialize_fieldnos = 0;
}
/* Get the size of the task image by checking the value of the bounds.
The lower bound is always 1, so we only need to read the upper bound. */
bounds_val = value_ind (value_field (val, bounds_fieldno));
len = value_as_long (value_field (bounds_val, upper_bound_fieldno));
/* Make sure that we do not read more than max_len characters... */
if (len > max_len)
len = max_len;
/* Extract LEN characters from the fat string. */
array_val = value_ind (value_field (val, array_fieldno));
read_memory (value_address (array_val), dest, len);
/* Add the NUL character to close the string. */
dest[len] = '\0';
}
/* Return the address of the Known_Tasks array maintained in
the Ada Runtime. Return NULL if the array could not be found,
meaning that the inferior program probably does not use tasking.
In order to provide a fast response time, this function caches
the Known_Tasks array address after the lookup during the first
call. Subsequent calls will simply return this cached address. */
static CORE_ADDR
get_known_tasks_addr (void)
{
static CORE_ADDR known_tasks_addr = 0;
if (ada_tasks_check_symbol_table)
{
struct symbol *sym;
struct minimal_symbol *msym;
msym = lookup_minimal_symbol (KNOWN_TASKS_NAME, NULL, NULL);
if (msym != NULL)
known_tasks_addr = SYMBOL_VALUE_ADDRESS (msym);
else
{
if (target_lookup_symbol (KNOWN_TASKS_NAME, &known_tasks_addr) != 0)
return 0;
}
/* FIXME: brobecker 2003-03-05: Here would be a much better place
to attach the ada-tasks observers, instead of doing this
unconditionaly in _initialize_tasks. This would avoid an
unecessary notification when the inferior does not use tasking
or as long as the user does not use the ada-tasks commands.
Unfortunately, this is not possible for the moment: the current
code resets ada__tasks_check_symbol_table back to 1 whenever
symbols for a new program are being loaded. If we place the
observers intialization here, we will end up adding new observers
everytime we do the check for Ada tasking-related symbols
above. This would currently have benign effects, but is still
undesirable. The cleanest approach is probably to create a new
observer to notify us when the user is debugging a new program.
We would then reset ada__tasks_check_symbol_table back to 1
during the notification, but also detach all observers.
BTW: observers are probably not reentrant, so detaching during
a notification may not be the safest thing to do... Sigh...
But creating the new observer would be a good idea in any case,
since this allow us to make ada__tasks_check_symbol_table
static, which is a good bonus. */
ada_tasks_check_symbol_table = 0;
}
return known_tasks_addr;
}
/* Get from the debugging information the type description of all types
related to the Ada Task Control Block that will be needed in order to
read the list of known tasks in the Ada runtime. Also return the
associated ATCB_FIELDNOS.
Error handling: Any data missing from the debugging info will cause
an error to be raised, and none of the return values to be set.
Users of this function can depend on the fact that all or none of the
return values will be set. */
static void
get_tcb_types_info (struct type **atcb_type,
struct type **atcb_common_type,
struct type **atcb_ll_type,
struct type **atcb_call_type,
struct tcb_fieldnos *atcb_fieldnos)
{
struct type *type;
struct type *common_type;
struct type *ll_type;
struct type *call_type;
struct tcb_fieldnos fieldnos;
const char *atcb_name = "system__tasking__ada_task_control_block___XVE";
const char *atcb_name_fixed = "system__tasking__ada_task_control_block";
const char *common_atcb_name = "system__tasking__common_atcb";
const char *private_data_name = "system__task_primitives__private_data";
const char *entry_call_record_name = "system__tasking__entry_call_record";
struct symbol *atcb_sym =
lookup_symbol (atcb_name, NULL, VAR_DOMAIN, NULL);
const struct symbol *common_atcb_sym =
lookup_symbol (common_atcb_name, NULL, VAR_DOMAIN, NULL);
const struct symbol *private_data_sym =
lookup_symbol (private_data_name, NULL, VAR_DOMAIN, NULL);
const struct symbol *entry_call_record_sym =
lookup_symbol (entry_call_record_name, NULL, VAR_DOMAIN, NULL);
if (atcb_sym == NULL || atcb_sym->type == NULL)
{
/* In Ravenscar run-time libs, the ATCB does not have a dynamic
size, so the symbol name differs. */
atcb_sym = lookup_symbol (atcb_name_fixed, NULL, VAR_DOMAIN, NULL);
if (atcb_sym == NULL || atcb_sym->type == NULL)
error (_("Cannot find Ada_Task_Control_Block type. Aborting"));
type = atcb_sym->type;
}
else
{
/* Get a static representation of the type record
Ada_Task_Control_Block. */
type = atcb_sym->type;
type = ada_template_to_fixed_record_type_1 (type, NULL, 0, NULL, 0);
}
if (common_atcb_sym == NULL || common_atcb_sym->type == NULL)
error (_("Cannot find Common_ATCB type. Aborting"));
if (private_data_sym == NULL || private_data_sym->type == NULL)
error (_("Cannot find Private_Data type. Aborting"));
if (entry_call_record_sym == NULL || entry_call_record_sym->type == NULL)
error (_("Cannot find Entry_Call_Record type. Aborting"));
/* Get the type for Ada_Task_Control_Block.Common. */
common_type = common_atcb_sym->type;
/* Get the type for Ada_Task_Control_Bloc.Common.Call.LL. */
ll_type = private_data_sym->type;
/* Get the type for Common_ATCB.Call.all. */
call_type = entry_call_record_sym->type;
/* Get the field indices. */
fieldnos.common = ada_get_field_index (type, "common", 0);
fieldnos.entry_calls = ada_get_field_index (type, "entry_calls", 1);
fieldnos.atc_nesting_level =
ada_get_field_index (type, "atc_nesting_level", 1);
fieldnos.state = ada_get_field_index (common_type, "state", 0);
fieldnos.parent = ada_get_field_index (common_type, "parent", 1);
fieldnos.priority = ada_get_field_index (common_type, "base_priority", 0);
fieldnos.image = ada_get_field_index (common_type, "task_image", 1);
fieldnos.image_len = ada_get_field_index (common_type, "task_image_len", 1);
fieldnos.call = ada_get_field_index (common_type, "call", 1);
fieldnos.ll = ada_get_field_index (common_type, "ll", 0);
fieldnos.ll_thread = ada_get_field_index (ll_type, "thread", 0);
fieldnos.ll_lwp = ada_get_field_index (ll_type, "lwp", 1);
fieldnos.call_self = ada_get_field_index (call_type, "self", 0);
/* On certain platforms such as x86-windows, the "lwp" field has been
named "thread_id". This field will likely be renamed in the future,
but we need to support both possibilities to avoid an unnecessary
dependency on a recent compiler. We therefore try locating the
"thread_id" field in place of the "lwp" field if we did not find
the latter. */
if (fieldnos.ll_lwp < 0)
fieldnos.ll_lwp = ada_get_field_index (ll_type, "thread_id", 1);
/* Set all the out parameters all at once, now that we are certain
that there are no potential error() anymore. */
*atcb_type = type;
*atcb_common_type = common_type;
*atcb_ll_type = ll_type;
*atcb_call_type = call_type;
*atcb_fieldnos = fieldnos;
}
/* Build the PTID of the task from its COMMON_VALUE, which is the "Common"
component of its ATCB record. This PTID needs to match the PTID used
by the thread layer. */
static ptid_t
ptid_from_atcb_common (struct value *common_value)
{
long thread = 0;
CORE_ADDR lwp = 0;
struct value *ll_value;
ptid_t ptid;
ll_value = value_field (common_value, fieldno.ll);
if (fieldno.ll_lwp >= 0)
lwp = value_as_address (value_field (ll_value, fieldno.ll_lwp));
thread = value_as_long (value_field (ll_value, fieldno.ll_thread));
ptid = target_get_ada_task_ptid (lwp, thread);
return ptid;
}
/* Read the ATCB data of a given task given its TASK_ID (which is in practice
the address of its assocated ATCB record), and store the result inside
TASK_INFO. */
static void
read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
{
struct value *tcb_value;
struct value *common_value;
struct value *atc_nesting_level_value;
struct value *entry_calls_value;
struct value *entry_calls_value_element;
int called_task_fieldno = -1;
const char ravenscar_task_name[] = "Ravenscar task";
if (atcb_type == NULL)
get_tcb_types_info (&atcb_type, &atcb_common_type, &atcb_ll_type,
&atcb_call_type, &fieldno);
tcb_value = value_from_contents_and_address (atcb_type, NULL, task_id);
common_value = value_field (tcb_value, fieldno.common);
/* Fill in the task_id. */
task_info->task_id = task_id;
/* Compute the name of the task.
Depending on the GNAT version used, the task image is either a fat
string, or a thin array of characters. Older versions of GNAT used
to use fat strings, and therefore did not need an extra field in
the ATCB to store the string length. For efficiency reasons, newer
versions of GNAT replaced the fat string by a static buffer, but this
also required the addition of a new field named "Image_Len" containing
the length of the task name. The method used to extract the task name
is selected depending on the existence of this field.
In some run-time libs (e.g. Ravenscar), the name is not in the ATCB;
we may want to get it from the first user frame of the stack. For now,
we just give a dummy name. */
if (fieldno.image_len == -1)
{
if (fieldno.image >= 0)
read_fat_string_value (task_info->name,
value_field (common_value, fieldno.image),
sizeof (task_info->name) - 1);
else
strcpy (task_info->name, ravenscar_task_name);
}
else
{
int len = value_as_long (value_field (common_value, fieldno.image_len));
value_as_string (task_info->name,
value_field (common_value, fieldno.image), len);
}
/* Compute the task state and priority. */
task_info->state = value_as_long (value_field (common_value, fieldno.state));
task_info->priority =
value_as_long (value_field (common_value, fieldno.priority));
/* If the ATCB contains some information about the parent task,
then compute it as well. Otherwise, zero. */
if (fieldno.parent >= 0)
task_info->parent =
value_as_address (value_field (common_value, fieldno.parent));
else
task_info->parent = 0;
/* If the ATCB contains some information about entry calls, then
compute the "called_task" as well. Otherwise, zero. */
if (fieldno.atc_nesting_level > 0 && fieldno.entry_calls > 0)
{
/* Let My_ATCB be the Ada task control block of a task calling the
entry of another task; then the Task_Id of the called task is
in My_ATCB.Entry_Calls (My_ATCB.ATC_Nesting_Level).Called_Task. */
atc_nesting_level_value = value_field (tcb_value,
fieldno.atc_nesting_level);
entry_calls_value =
ada_coerce_to_simple_array_ptr (value_field (tcb_value,
fieldno.entry_calls));
entry_calls_value_element =
value_subscript (entry_calls_value, atc_nesting_level_value);
called_task_fieldno =
ada_get_field_index (value_type (entry_calls_value_element),
"called_task", 0);
task_info->called_task =
value_as_address (value_field (entry_calls_value_element,
called_task_fieldno));
}
else
{
task_info->called_task = 0;
}
/* If the ATCB cotnains some information about RV callers,
then compute the "caller_task". Otherwise, zero. */
task_info->caller_task = 0;
if (fieldno.call >= 0)
{
/* Get the ID of the caller task from Common_ATCB.Call.all.Self.
If Common_ATCB.Call is null, then there is no caller. */
const CORE_ADDR call =
value_as_address (value_field (common_value, fieldno.call));
struct value *call_val;
if (call != 0)
{
call_val =
value_from_contents_and_address (atcb_call_type, NULL, call);
task_info->caller_task =
value_as_address (value_field (call_val, fieldno.call_self));
}
}
/* And finally, compute the task ptid. */
if (ada_task_is_alive (task_info))
task_info->ptid = ptid_from_atcb_common (common_value);
else
task_info->ptid = null_ptid;
}
/* Read the ATCB info of the given task (identified by TASK_ID), and
add the result to the TASK_LIST. */
static void
add_ada_task (CORE_ADDR task_id)
{
struct ada_task_info task_info;
read_atcb (task_id, &task_info);
VEC_safe_push (ada_task_info_s, task_list, &task_info);
}
/* Read the Known_Tasks array from the inferior memory, and store
it in TASK_LIST. Return non-zero upon success. */
static int
read_known_tasks_array (void)
{
const int target_ptr_byte =
gdbarch_ptr_bit (target_gdbarch) / TARGET_CHAR_BIT;
const CORE_ADDR known_tasks_addr = get_known_tasks_addr ();
const int known_tasks_size = target_ptr_byte * MAX_NUMBER_OF_KNOWN_TASKS;
gdb_byte *known_tasks = alloca (known_tasks_size);
int i;
/* Step 1: Clear the current list, if necessary. */
VEC_truncate (ada_task_info_s, task_list, 0);
/* If the application does not use task, then no more needs to be done.
It is important to have the task list cleared (see above) before we
return, as we don't want a stale task list to be used... This can
happen for instance when debugging a non-multitasking program after
having debugged a multitasking one. */
if (known_tasks_addr == 0)
return 0;
/* Step 2: Build a new list by reading the ATCBs from the Known_Tasks
array in the Ada runtime. */
read_memory (known_tasks_addr, known_tasks, known_tasks_size);
for (i = 0; i < MAX_NUMBER_OF_KNOWN_TASKS; i++)
{
struct type *data_ptr_type =
builtin_type (target_gdbarch)->builtin_data_ptr;
CORE_ADDR task_id =
extract_typed_address (known_tasks + i * target_ptr_byte,
data_ptr_type);
if (task_id != 0)
add_ada_task (task_id);
}
/* Step 3: Unset stale_task_list_p, to avoid re-reading the Known_Tasks
array unless needed. Then report a success. */
stale_task_list_p = 0;
return 1;
}
/* Builds the task_list by reading the Known_Tasks array from
the inferior. Prints an appropriate message and returns non-zero
if it failed to build this list. */
int
ada_build_task_list (int warn_if_null)
{
if (!target_has_stack)
error (_("Cannot inspect Ada tasks when program is not running"));
if (stale_task_list_p)
read_known_tasks_array ();
if (task_list == NULL)
{
if (warn_if_null)
printf_filtered (_("Your application does not use any Ada tasks.\n"));
return 0;
}
return 1;
}
/* Print a one-line description of the task whose number is TASKNO.
The formatting should fit the "info tasks" array. */
static void
short_task_info (int taskno)
{
const struct ada_task_info *const task_info =
VEC_index (ada_task_info_s, task_list, taskno - 1);
int active_task_p;
gdb_assert (task_info != NULL);
/* Print a star if this task is the current task (or the task currently
selected). */
active_task_p = ptid_equal (task_info->ptid, inferior_ptid);
if (active_task_p)
printf_filtered ("*");
else
printf_filtered (" ");
/* Print the task number. */
printf_filtered ("%3d", taskno);
/* Print the Task ID. */
printf_filtered (" %9lx", (long) task_info->task_id);
/* Print the Task ID of the task parent. */
printf_filtered (" %4d", get_task_number_from_id (task_info->parent));
/* Print the base priority of the task. */
printf_filtered (" %3d", task_info->priority);
/* Print the task current state. */
if (task_info->caller_task)
printf_filtered (_(" Accepting RV with %-4d"),
get_task_number_from_id (task_info->caller_task));
else if (task_info->state == Entry_Caller_Sleep && task_info->called_task)
printf_filtered (_(" Waiting on RV with %-3d"),
get_task_number_from_id (task_info->called_task));
else
printf_filtered (" %-22s", _(task_states[task_info->state]));
/* Finally, print the task name. */
if (task_info->name[0] != '\0')
printf_filtered (" %s\n", task_info->name);
else
printf_filtered (_(" <no name>\n"));
}
/* Print a list containing a short description of all Ada tasks. */
/* FIXME: Shouldn't we be using ui_out??? */
static void
info_tasks (int from_tty)
{
int taskno;
const int nb_tasks = VEC_length (ada_task_info_s, task_list);
printf_filtered (_(" ID TID P-ID Pri State Name\n"));
for (taskno = 1; taskno <= nb_tasks; taskno++)
short_task_info (taskno);
}
/* Print a detailed description of the Ada task whose ID is TASKNO_STR. */
static void
info_task (char *taskno_str, int from_tty)
{
const int taskno = value_as_long (parse_and_eval (taskno_str));
struct ada_task_info *task_info;
int parent_taskno = 0;
if (taskno <= 0 || taskno > VEC_length (ada_task_info_s, task_list))
error (_("Task ID %d not known. Use the \"info tasks\" command to\n"
"see the IDs of currently known tasks"), taskno);
task_info = VEC_index (ada_task_info_s, task_list, taskno - 1);
/* Print the Ada task ID. */
printf_filtered (_("Ada Task: %s\n"), paddr_nz (task_info->task_id));
/* Print the name of the task. */
if (task_info->name[0] != '\0')
printf_filtered (_("Name: %s\n"), task_info->name);
else
printf_filtered (_("<no name>\n"));
/* Print the TID and LWP. */
printf_filtered (_("Thread: %#lx\n"), ptid_get_tid (task_info->ptid));
printf_filtered (_("LWP: %#lx\n"), ptid_get_lwp (task_info->ptid));
/* Print who is the parent (if any). */
if (task_info->parent != 0)
parent_taskno = get_task_number_from_id (task_info->parent);
if (parent_taskno)
{
struct ada_task_info *parent =
VEC_index (ada_task_info_s, task_list, parent_taskno - 1);
printf_filtered (_("Parent: %d"), parent_taskno);
if (parent->name[0] != '\0')
printf_filtered (" (%s)", parent->name);
printf_filtered ("\n");
}
else
printf_filtered (_("No parent\n"));
/* Print the base priority. */
printf_filtered (_("Base Priority: %d\n"), task_info->priority);
/* print the task current state. */
{
int target_taskno = 0;
if (task_info->caller_task)
{
target_taskno = get_task_number_from_id (task_info->caller_task);
printf_filtered (_("State: Accepting rendezvous with %d"),
target_taskno);
}
else if (task_info->state == Entry_Caller_Sleep && task_info->called_task)
{
target_taskno = get_task_number_from_id (task_info->called_task);
printf_filtered (_("State: Waiting on task %d's entry"),
target_taskno);
}
else
printf_filtered (_("State: %s"), _(long_task_states[task_info->state]));
if (target_taskno)
{
struct ada_task_info *target_task_info =
VEC_index (ada_task_info_s, task_list, target_taskno - 1);
if (target_task_info->name[0] != '\0')
printf_filtered (" (%s)", target_task_info->name);
}
printf_filtered ("\n");
}
}
/* If ARG is empty or null, then print a list of all Ada tasks.
Otherwise, print detailed information about the task whose ID
is ARG.
Does nothing if the program doesn't use Ada tasking. */
static void
info_tasks_command (char *arg, int from_tty)
{
const int task_list_built = ada_build_task_list (1);
if (!task_list_built)
return;
if (arg == NULL || *arg == '\0')
info_tasks (from_tty);
else
info_task (arg, from_tty);
}
/* Print a message telling the user id of the current task.
This function assumes that tasking is in use in the inferior. */
static void
display_current_task_id (void)
{
const int current_task = ada_get_task_number (inferior_ptid);
if (current_task == 0)
printf_filtered (_("[Current task is unknown]\n"));
else
printf_filtered (_("[Current task is %d]\n"), current_task);
}
/* Parse and evaluate TIDSTR into a task id, and try to switch to
that task. Print an error message if the task switch failed. */
static void
task_command_1 (char *taskno_str, int from_tty)
{
const int taskno = value_as_long (parse_and_eval (taskno_str));
struct ada_task_info *task_info;
if (taskno <= 0 || taskno > VEC_length (ada_task_info_s, task_list))
error (_("Task ID %d not known. Use the \"info tasks\" command to\n"
"see the IDs of currently known tasks"), taskno);
task_info = VEC_index (ada_task_info_s, task_list, taskno - 1);
if (!ada_task_is_alive (task_info))
error (_("Cannot switch to task %d: Task is no longer running"), taskno);
/* On some platforms, the thread list is not updated until the user
performs a thread-related operation (by using the "info threads"
command, for instance). So this thread list may not be up to date
when the user attempts this task switch. Since we cannot switch
to the thread associated to our task if GDB does not know about
that thread, we need to make sure that any new threads gets added
to the thread list. */
target_find_new_threads ();
switch_to_thread (task_info->ptid);
ada_find_printable_frame (get_selected_frame (NULL));
printf_filtered (_("[Switching to task %d]\n"), taskno);
print_stack_frame (get_selected_frame (NULL),
frame_relative_level (get_selected_frame (NULL)), 1);
}
/* Print the ID of the current task if TASKNO_STR is empty or NULL.
Otherwise, switch to the task indicated by TASKNO_STR. */
static void
task_command (char *taskno_str, int from_tty)
{
const int task_list_built = ada_build_task_list (1);
if (!task_list_built)
return;
if (taskno_str == NULL || taskno_str[0] == '\0')
display_current_task_id ();
else
{
/* Task switching in core files doesn't work, either because:
1. Thread support is not implemented with core files
2. Thread support is implemented, but the thread IDs created
after having read the core file are not the same as the ones
that were used during the program life, before the crash.
As a consequence, there is no longer a way for the debugger
to find the associated thead ID of any given Ada task.
So, instead of attempting a task switch without giving the user
any clue as to what might have happened, just error-out with
a message explaining that this feature is not supported. */
if (!target_has_execution)
error (_("\
Task switching not supported when debugging from core files\n\
(use thread support instead)"));
task_command_1 (taskno_str, from_tty);
}
}
/* Indicate that the task list may have changed, so invalidate the cache. */
static void
ada_task_list_changed (void)
{
stale_task_list_p = 1;
}
/* The 'normal_stop' observer notification callback. */
static void
ada_normal_stop_observer (struct bpstats *unused_args, int unused_args2)
{
/* The inferior has been resumed, and just stopped. This means that
our task_list needs to be recomputed before it can be used again. */
ada_task_list_changed ();
}
/* A routine to be called when the objfiles have changed. */
static void
ada_new_objfile_observer (struct objfile *objfile)
{
/* Invalidate all cached data that were extracted from an objfile. */
atcb_type = NULL;
atcb_common_type = NULL;
atcb_ll_type = NULL;
atcb_call_type = NULL;
ada_tasks_check_symbol_table = 1;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_tasks;
void
_initialize_tasks (void)
{
/* Attach various observers. */
observer_attach_normal_stop (ada_normal_stop_observer);
observer_attach_new_objfile (ada_new_objfile_observer);
/* Some new commands provided by this module. */
add_info ("tasks", info_tasks_command,
_("Provide information about all known Ada tasks"));
add_cmd ("task", class_run, task_command,
_("Use this command to switch between Ada tasks.\n\
Without argument, this command simply prints the current task ID"),
&cmdlist);
}

View File

@@ -1,862 +0,0 @@
/* Support for printing Ada types for GDB, the GNU debugger.
Copyright (C) 1986, 1988, 1989, 1991, 1997, 1998, 1999, 2000, 2001, 2002,
2003, 2004, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "gdb_obstack.h"
#include "bfd.h" /* Binary File Description */
#include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"
#include "value.h"
#include "gdbcore.h"
#include "target.h"
#include "command.h"
#include "gdbcmd.h"
#include "language.h"
#include "demangle.h"
#include "c-lang.h"
#include "typeprint.h"
#include "ada-lang.h"
#include <ctype.h>
#include "gdb_string.h"
#include <errno.h>
static int print_record_field_types (struct type *, struct type *,
struct ui_file *, int, int);
static void print_array_type (struct type *, struct ui_file *, int, int);
static void print_choices (struct type *, int, struct ui_file *,
struct type *);
static void print_range (struct type *, struct ui_file *);
static void print_range_bound (struct type *, char *, int *,
struct ui_file *);
static void
print_dynamic_range_bound (struct type *, const char *, int,
const char *, struct ui_file *);
static void print_range_type_named (char *, struct ui_file *);
static char *name_buffer;
static int name_buffer_len;
/* The (decoded) Ada name of TYPE. This value persists until the
next call. */
static char *
decoded_type_name (struct type *type)
{
if (ada_type_name (type) == NULL)
return NULL;
else
{
char *raw_name = ada_type_name (type);
char *s, *q;
if (name_buffer == NULL || name_buffer_len <= strlen (raw_name))
{
name_buffer_len = 16 + 2 * strlen (raw_name);
name_buffer = xrealloc (name_buffer, name_buffer_len);
}
strcpy (name_buffer, raw_name);
s = (char *) strstr (name_buffer, "___");
if (s != NULL)
*s = '\0';
s = name_buffer + strlen (name_buffer) - 1;
while (s > name_buffer && (s[0] != '_' || s[-1] != '_'))
s -= 1;
if (s == name_buffer)
return name_buffer;
if (!islower (s[1]))
return NULL;
for (s = q = name_buffer; *s != '\0'; q += 1)
{
if (s[0] == '_' && s[1] == '_')
{
*q = '.';
s += 2;
}
else
{
*q = *s;
s += 1;
}
}
*q = '\0';
return name_buffer;
}
}
/* Print range type TYPE on STREAM. */
static void
print_range (struct type *type, struct ui_file *stream)
{
struct type *target_type;
target_type = TYPE_TARGET_TYPE (type);
if (target_type == NULL)
target_type = type;
switch (TYPE_CODE (target_type))
{
case TYPE_CODE_RANGE:
case TYPE_CODE_INT:
case TYPE_CODE_BOOL:
case TYPE_CODE_CHAR:
case TYPE_CODE_ENUM:
break;
default:
target_type = builtin_type_int32;
break;
}
if (TYPE_NFIELDS (type) < 2)
{
/* A range needs at least 2 bounds to be printed. If there are less
than 2, just print the type name instead of the range itself.
This check handles cases such as characters, for example.
If the name is not defined, then we don't print anything.
*/
fprintf_filtered (stream, "%.*s",
ada_name_prefix_len (TYPE_NAME (type)),
TYPE_NAME (type));
}
else
{
/* We extract the range type bounds respectively from the first element
and the last element of the type->fields array */
const LONGEST lower_bound = (LONGEST) TYPE_LOW_BOUND (type);
const LONGEST upper_bound = (TYPE_CODE (type) == TYPE_CODE_RANGE
? (LONGEST) TYPE_HIGH_BOUND (type)
: (LONGEST) TYPE_FIELD_BITPOS (type, TYPE_NFIELDS (type) - 1));
ada_print_scalar (target_type, lower_bound, stream);
fprintf_filtered (stream, " .. ");
ada_print_scalar (target_type, upper_bound, stream);
}
}
/* Print the number or discriminant bound at BOUNDS+*N on STREAM, and
set *N past the bound and its delimiter, if any. */
static void
print_range_bound (struct type *type, char *bounds, int *n,
struct ui_file *stream)
{
LONGEST B;
if (ada_scan_number (bounds, *n, &B, n))
{
/* STABS decodes all range types which bounds are 0 .. -1 as
unsigned integers (ie. the type code is TYPE_CODE_INT, not
TYPE_CODE_RANGE). Unfortunately, ada_print_scalar() relies
on the unsigned flag to determine whether the bound should
be printed as a signed or an unsigned value. This causes
the upper bound of the 0 .. -1 range types to be printed as
a very large unsigned number instead of -1.
To workaround this stabs deficiency, we replace the TYPE by
builtin_type_int32 when we detect that the bound is negative,
and the type is a TYPE_CODE_INT. The bound is negative when
'm' is the last character of the number scanned in BOUNDS. */
if (bounds[*n - 1] == 'm' && TYPE_CODE (type) == TYPE_CODE_INT)
type = builtin_type_int32;
ada_print_scalar (type, B, stream);
if (bounds[*n] == '_')
*n += 2;
}
else
{
int bound_len;
char *bound = bounds + *n;
char *pend;
pend = strstr (bound, "__");
if (pend == NULL)
*n += bound_len = strlen (bound);
else
{
bound_len = pend - bound;
*n += bound_len + 2;
}
fprintf_filtered (stream, "%.*s", bound_len, bound);
}
}
/* Assuming NAME[0 .. NAME_LEN-1] is the name of a range type, print
the value (if found) of the bound indicated by SUFFIX ("___L" or
"___U") according to the ___XD conventions. */
static void
print_dynamic_range_bound (struct type *type, const char *name, int name_len,
const char *suffix, struct ui_file *stream)
{
static char *name_buf = NULL;
static size_t name_buf_len = 0;
LONGEST B;
int OK;
GROW_VECT (name_buf, name_buf_len, name_len + strlen (suffix) + 1);
strncpy (name_buf, name, name_len);
strcpy (name_buf + name_len, suffix);
B = get_int_var_value (name_buf, &OK);
if (OK)
ada_print_scalar (type, B, stream);
else
fprintf_filtered (stream, "?");
}
/* Print the range type named NAME. */
static void
print_range_type_named (char *name, struct ui_file *stream)
{
struct type *raw_type = ada_find_any_type (name);
struct type *base_type;
char *subtype_info;
if (raw_type == NULL)
base_type = builtin_type_int32;
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 && raw_type == NULL)
fprintf_filtered (stream, "? .. ?");
else if (subtype_info == NULL)
print_range (raw_type, stream);
else
{
int prefix_len = subtype_info - name;
char *bounds_str;
int n;
subtype_info += 5;
bounds_str = strchr (subtype_info, '_');
n = 1;
if (*subtype_info == 'L')
{
print_range_bound (base_type, bounds_str, &n, stream);
subtype_info += 1;
}
else
print_dynamic_range_bound (base_type, name, prefix_len, "___L",
stream);
fprintf_filtered (stream, " .. ");
if (*subtype_info == 'U')
print_range_bound (base_type, bounds_str, &n, stream);
else
print_dynamic_range_bound (base_type, name, prefix_len, "___U",
stream);
}
}
/* Print enumerated type TYPE on STREAM. */
static void
print_enum_type (struct type *type, struct ui_file *stream)
{
int len = TYPE_NFIELDS (type);
int i, lastval;
fprintf_filtered (stream, "(");
wrap_here (" ");
lastval = 0;
for (i = 0; i < len; i++)
{
QUIT;
if (i)
fprintf_filtered (stream, ", ");
wrap_here (" ");
fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
if (lastval != TYPE_FIELD_BITPOS (type, i))
{
fprintf_filtered (stream, " => %d", TYPE_FIELD_BITPOS (type, i));
lastval = TYPE_FIELD_BITPOS (type, i);
}
lastval += 1;
}
fprintf_filtered (stream, ")");
}
/* Print representation of Ada fixed-point type TYPE on STREAM. */
static void
print_fixed_point_type (struct type *type, struct ui_file *stream)
{
DOUBLEST delta = ada_delta (type);
DOUBLEST small = ada_fixed_to_float (type, 1.0);
if (delta < 0.0)
fprintf_filtered (stream, "delta ??");
else
{
fprintf_filtered (stream, "delta %g", (double) delta);
if (delta != small)
fprintf_filtered (stream, " <'small = %g>", (double) small);
}
}
/* Print representation of special VAX floating-point type TYPE on STREAM. */
static void
print_vax_floating_point_type (struct type *type, struct ui_file *stream)
{
fprintf_filtered (stream, "<float format %c>",
ada_vax_float_type_suffix (type));
}
/* Print simple (constrained) array type TYPE on STREAM. LEVEL is the
recursion (indentation) level, in case the element type itself has
nested structure, and SHOW is the number of levels of internal
structure to show (see ada_print_type). */
static void
print_array_type (struct type *type, struct ui_file *stream, int show,
int level)
{
int bitsize;
int n_indices;
if (ada_is_packed_array_type (type))
type = ada_coerce_to_simple_array_type (type);
bitsize = 0;
fprintf_filtered (stream, "array (");
if (type == NULL)
{
fprintf_filtered (stream, _("<undecipherable array type>"));
return;
}
n_indices = -1;
if (show < 0)
fprintf_filtered (stream, "...");
else
{
if (ada_is_simple_array_type (type))
{
struct type *range_desc_type =
ada_find_parallel_type (type, "___XA");
struct type *arr_type;
bitsize = 0;
if (range_desc_type == NULL)
{
for (arr_type = type; TYPE_CODE (arr_type) == TYPE_CODE_ARRAY;
arr_type = TYPE_TARGET_TYPE (arr_type))
{
if (arr_type != type)
fprintf_filtered (stream, ", ");
print_range (TYPE_INDEX_TYPE (arr_type), stream);
if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
}
}
else
{
int k;
n_indices = TYPE_NFIELDS (range_desc_type);
for (k = 0, arr_type = type;
k < n_indices;
k += 1, arr_type = TYPE_TARGET_TYPE (arr_type))
{
if (k > 0)
fprintf_filtered (stream, ", ");
print_range_type_named (TYPE_FIELD_NAME
(range_desc_type, k), stream);
if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
}
}
}
else
{
int i, i0;
for (i = i0 = ada_array_arity (type); i > 0; i -= 1)
fprintf_filtered (stream, "%s<>", i == i0 ? "" : ", ");
}
}
fprintf_filtered (stream, ") of ");
wrap_here ("");
ada_print_type (ada_array_element_type (type, n_indices), "", stream,
show == 0 ? 0 : show - 1, level + 1);
if (bitsize > 0)
fprintf_filtered (stream, " <packed: %d-bit elements>", bitsize);
}
/* Print the choices encoded by field FIELD_NUM of variant-part TYPE on
STREAM, assuming the VAL_TYPE is the type of the values. */
static void
print_choices (struct type *type, int field_num, struct ui_file *stream,
struct type *val_type)
{
int have_output;
int p;
const char *name = TYPE_FIELD_NAME (type, field_num);
have_output = 0;
/* Skip over leading 'V': NOTE soon to be obsolete. */
if (name[0] == 'V')
{
if (!ada_scan_number (name, 1, NULL, &p))
goto Huh;
}
else
p = 0;
while (1)
{
switch (name[p])
{
default:
return;
case 'S':
case 'R':
case 'O':
if (have_output)
fprintf_filtered (stream, " | ");
have_output = 1;
break;
}
switch (name[p])
{
case 'S':
{
LONGEST W;
if (!ada_scan_number (name, p + 1, &W, &p))
goto Huh;
ada_print_scalar (val_type, W, stream);
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))
goto Huh;
ada_print_scalar (val_type, L, stream);
fprintf_filtered (stream, " .. ");
ada_print_scalar (val_type, U, stream);
break;
}
case 'O':
fprintf_filtered (stream, "others");
p += 1;
break;
}
}
Huh:
fprintf_filtered (stream, "??");
}
/* Assuming that field FIELD_NUM of TYPE is a VARIANTS field whose
discriminant is contained in OUTER_TYPE, print its variants on STREAM.
LEVEL is the recursion
(indentation) level, in case any of the fields themselves have
nested structure, and SHOW is the number of levels of internal structure
to show (see ada_print_type). For this purpose, fields nested in a
variant part are taken to be at the same level as the fields
immediately outside the variant part. */
static void
print_variant_clauses (struct type *type, int field_num,
struct type *outer_type, struct ui_file *stream,
int show, int level)
{
int i;
struct type *var_type, *par_type;
struct type *discr_type;
var_type = TYPE_FIELD_TYPE (type, field_num);
discr_type = ada_variant_discrim_type (var_type, outer_type);
if (TYPE_CODE (var_type) == TYPE_CODE_PTR)
{
var_type = TYPE_TARGET_TYPE (var_type);
if (var_type == NULL || TYPE_CODE (var_type) != TYPE_CODE_UNION)
return;
}
par_type = ada_find_parallel_type (var_type, "___XVU");
if (par_type != NULL)
var_type = par_type;
for (i = 0; i < TYPE_NFIELDS (var_type); i += 1)
{
fprintf_filtered (stream, "\n%*swhen ", level + 4, "");
print_choices (var_type, i, stream, discr_type);
fprintf_filtered (stream, " =>");
if (print_record_field_types (TYPE_FIELD_TYPE (var_type, i),
outer_type, stream, show, level + 4) <= 0)
fprintf_filtered (stream, " null;");
}
}
/* Assuming that field FIELD_NUM of TYPE is a variant part whose
discriminants are contained in OUTER_TYPE, print a description of it
on STREAM. LEVEL is the recursion (indentation) level, in case any of
the fields themselves have nested structure, and SHOW is the number of
levels of internal structure to show (see ada_print_type). For this
purpose, fields nested in a variant part are taken to be at the same
level as the fields immediately outside the variant part. */
static void
print_variant_part (struct type *type, int field_num, struct type *outer_type,
struct ui_file *stream, int show, int level)
{
fprintf_filtered (stream, "\n%*scase %s is", level + 4, "",
ada_variant_discrim_name
(TYPE_FIELD_TYPE (type, field_num)));
print_variant_clauses (type, field_num, outer_type, stream, show,
level + 4);
fprintf_filtered (stream, "\n%*send case;", level + 4, "");
}
/* Print a description on STREAM of the fields in record type TYPE, whose
discriminants are in OUTER_TYPE. LEVEL is the recursion (indentation)
level, in case any of the fields themselves have nested structure,
and SHOW is the number of levels of internal structure to show
(see ada_print_type). Does not print parent type information of TYPE.
Returns 0 if no fields printed, -1 for an incomplete type, else > 0.
Prints each field beginning on a new line, but does not put a new line at
end. */
static int
print_record_field_types (struct type *type, struct type *outer_type,
struct ui_file *stream, int show, int level)
{
int len, i, flds;
flds = 0;
len = TYPE_NFIELDS (type);
if (len == 0 && TYPE_STUB (type))
return -1;
for (i = 0; i < len; i += 1)
{
QUIT;
if (ada_is_parent_field (type, i) || ada_is_ignored_field (type, i))
;
else if (ada_is_wrapper_field (type, i))
flds += print_record_field_types (TYPE_FIELD_TYPE (type, i), type,
stream, show, level);
else if (ada_is_variant_part (type, i))
{
print_variant_part (type, i, outer_type, stream, show, level);
flds = 1;
}
else
{
flds += 1;
fprintf_filtered (stream, "\n%*s", level + 4, "");
ada_print_type (TYPE_FIELD_TYPE (type, i),
TYPE_FIELD_NAME (type, i),
stream, show - 1, level + 4);
fprintf_filtered (stream, ";");
}
}
return flds;
}
/* Print record type TYPE on STREAM. LEVEL is the recursion (indentation)
level, in case the element type itself has nested structure, and SHOW is
the number of levels of internal structure to show (see ada_print_type). */
static void
print_record_type (struct type *type0, struct ui_file *stream, int show,
int level)
{
struct type *parent_type;
struct type *type;
type = ada_find_parallel_type (type0, "___XVE");
if (type == NULL)
type = type0;
parent_type = ada_parent_type (type);
if (ada_type_name (parent_type) != NULL)
fprintf_filtered (stream, "new %s with record",
decoded_type_name (parent_type));
else if (parent_type == NULL && ada_is_tagged_type (type, 0))
fprintf_filtered (stream, "tagged record");
else
fprintf_filtered (stream, "record");
if (show < 0)
fprintf_filtered (stream, " ... end record");
else
{
int flds;
flds = 0;
if (parent_type != NULL && ada_type_name (parent_type) == NULL)
flds += print_record_field_types (parent_type, parent_type,
stream, show, level);
flds += print_record_field_types (type, type, stream, show, level);
if (flds > 0)
fprintf_filtered (stream, "\n%*send record", level, "");
else if (flds < 0)
fprintf_filtered (stream, _(" <incomplete type> end record"));
else
fprintf_filtered (stream, " null; end record");
}
}
/* Print the unchecked union type TYPE in something resembling Ada
format on STREAM. LEVEL is the recursion (indentation) level
in case the element type itself has nested structure, and SHOW is the
number of levels of internal structure to show (see ada_print_type). */
static void
print_unchecked_union_type (struct type *type, struct ui_file *stream,
int show, int level)
{
if (show < 0)
fprintf_filtered (stream, "record (?) is ... end record");
else if (TYPE_NFIELDS (type) == 0)
fprintf_filtered (stream, "record (?) is null; end record");
else
{
int i;
fprintf_filtered (stream, "record (?) is\n%*scase ? is", level + 4, "");
for (i = 0; i < TYPE_NFIELDS (type); i += 1)
{
fprintf_filtered (stream, "\n%*swhen ? =>\n%*s", level + 8, "",
level + 12, "");
ada_print_type (TYPE_FIELD_TYPE (type, i),
TYPE_FIELD_NAME (type, i),
stream, show - 1, level + 12);
fprintf_filtered (stream, ";");
}
fprintf_filtered (stream, "\n%*send case;\n%*send record",
level + 4, "", level, "");
}
}
/* Print function or procedure type TYPE on STREAM. Make it a header
for function or procedure NAME if NAME is not null. */
static void
print_func_type (struct type *type, struct ui_file *stream, char *name)
{
int i, len = TYPE_NFIELDS (type);
if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
fprintf_filtered (stream, "procedure");
else
fprintf_filtered (stream, "function");
if (name != NULL && name[0] != '\0')
fprintf_filtered (stream, " %s", name);
if (len > 0)
{
fprintf_filtered (stream, " (");
for (i = 0; i < len; i += 1)
{
if (i > 0)
{
fputs_filtered ("; ", stream);
wrap_here (" ");
}
fprintf_filtered (stream, "a%d: ", i + 1);
ada_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
}
fprintf_filtered (stream, ")");
}
if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
{
fprintf_filtered (stream, " return ");
ada_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0);
}
}
/* Print a description of a type TYPE0.
Output goes to STREAM (via stdio).
If VARSTRING is a non-empty string, print as an Ada variable/field
declaration.
SHOW+1 is the maximum number of levels of internal type structure
to show (this applies to record types, enumerated types, and
array types).
SHOW is the number of levels of internal type structure to show
when there is a type name for the SHOWth deepest level (0th is
outer level).
When SHOW<0, no inner structure is shown.
LEVEL indicates level of recursion (for nested definitions). */
void
ada_print_type (struct type *type0, char *varstring, struct ui_file *stream,
int show, int level)
{
struct type *type = ada_check_typedef (ada_get_base_type (type0));
char *type_name = decoded_type_name (type0);
int is_var_decl = (varstring != NULL && varstring[0] != '\0');
if (type == NULL)
{
if (is_var_decl)
fprintf_filtered (stream, "%.*s: ",
ada_name_prefix_len (varstring), varstring);
fprintf_filtered (stream, "<null type?>");
return;
}
if (show > 0)
type = ada_check_typedef (type);
if (is_var_decl && TYPE_CODE (type) != TYPE_CODE_FUNC)
fprintf_filtered (stream, "%.*s: ",
ada_name_prefix_len (varstring), varstring);
if (type_name != NULL && show <= 0)
{
fprintf_filtered (stream, "%.*s",
ada_name_prefix_len (type_name), type_name);
return;
}
if (ada_is_aligner_type (type))
ada_print_type (ada_aligned_type (type), "", stream, show, level);
else if (ada_is_packed_array_type (type))
{
if (TYPE_CODE (type) == TYPE_CODE_PTR)
{
fprintf_filtered (stream, "access ");
print_array_type (TYPE_TARGET_TYPE (type), stream, show, level);
}
else
{
print_array_type (type, stream, show, level);
}
}
else
switch (TYPE_CODE (type))
{
default:
fprintf_filtered (stream, "<");
c_print_type (type, "", stream, show, level);
fprintf_filtered (stream, ">");
break;
case TYPE_CODE_PTR:
fprintf_filtered (stream, "access ");
ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
break;
case TYPE_CODE_REF:
fprintf_filtered (stream, "<ref> ");
ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
break;
case TYPE_CODE_ARRAY:
print_array_type (type, stream, show, level);
break;
case TYPE_CODE_BOOL:
fprintf_filtered (stream, "(false, true)");
break;
case TYPE_CODE_INT:
if (ada_is_fixed_point_type (type))
print_fixed_point_type (type, stream);
else if (ada_is_vax_floating_type (type))
print_vax_floating_point_type (type, stream);
else
{
char *name = ada_type_name (type);
if (!ada_is_range_type_name (name))
fprintf_filtered (stream, _("<%d-byte integer>"),
TYPE_LENGTH (type));
else
{
fprintf_filtered (stream, "range ");
print_range_type_named (name, stream);
}
}
break;
case TYPE_CODE_RANGE:
if (ada_is_fixed_point_type (type))
print_fixed_point_type (type, stream);
else if (ada_is_vax_floating_type (type))
print_vax_floating_point_type (type, stream);
else if (ada_is_modular_type (type))
fprintf_filtered (stream, "mod %s",
int_string (ada_modulus (type), 10, 0, 0, 1));
else
{
fprintf_filtered (stream, "range ");
print_range (type, stream);
}
break;
case TYPE_CODE_FLT:
fprintf_filtered (stream, _("<%d-byte float>"), TYPE_LENGTH (type));
break;
case TYPE_CODE_ENUM:
if (show < 0)
fprintf_filtered (stream, "(...)");
else
print_enum_type (type, stream);
break;
case TYPE_CODE_STRUCT:
if (ada_is_array_descriptor_type (type))
print_array_type (type, stream, show, level);
else if (ada_is_bogus_array_descriptor (type))
fprintf_filtered (stream,
_("array (?) of ? (<mal-formed descriptor>)"));
else
print_record_type (type, stream, show, level);
break;
case TYPE_CODE_UNION:
print_unchecked_union_type (type, stream, show, level);
break;
case TYPE_CODE_FUNC:
print_func_type (type, stream, varstring);
break;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,546 +0,0 @@
/* addrmap.c --- implementation of address map data structure.
Copyright (C) 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include <stdlib.h>
#include "splay-tree.h"
#include "gdb_obstack.h"
#include "addrmap.h"
#include "gdb_assert.h"
/* The "abstract class". */
/* Functions implementing the addrmap functions for a particular
implementation. */
struct addrmap_funcs
{
void (*set_empty) (struct addrmap *this,
CORE_ADDR start, CORE_ADDR end_inclusive,
void *obj);
void *(*find) (struct addrmap *this, CORE_ADDR addr);
struct addrmap *(*create_fixed) (struct addrmap *this,
struct obstack *obstack);
void (*relocate) (struct addrmap *this, CORE_ADDR offset);
};
struct addrmap
{
const struct addrmap_funcs *funcs;
};
void
addrmap_set_empty (struct addrmap *map,
CORE_ADDR start, CORE_ADDR end_inclusive,
void *obj)
{
map->funcs->set_empty (map, start, end_inclusive, obj);
}
void *
addrmap_find (struct addrmap *map, CORE_ADDR addr)
{
return map->funcs->find (map, addr);
}
struct addrmap *
addrmap_create_fixed (struct addrmap *original, struct obstack *obstack)
{
return original->funcs->create_fixed (original, obstack);
}
/* Relocate all the addresses in MAP by OFFSET. (This can be applied
to either mutable or immutable maps.) */
void
addrmap_relocate (struct addrmap *map, CORE_ADDR offset)
{
map->funcs->relocate (map, offset);
}
/* Fixed address maps. */
/* A transition: a point in an address map where the value changes.
The map maps ADDR to VALUE, but if ADDR > 0, it maps ADDR-1 to
something else. */
struct addrmap_transition
{
CORE_ADDR addr;
void *value;
};
struct addrmap_fixed
{
struct addrmap addrmap;
/* The number of transitions in TRANSITIONS. */
size_t num_transitions;
/* An array of transitions, sorted by address. For every point in
the map where either ADDR == 0 or ADDR is mapped to one value and
ADDR - 1 is mapped to something different, we have an entry here
containing ADDR and VALUE. (Note that this means we always have
an entry for address 0). */
struct addrmap_transition transitions[1];
};
static void
addrmap_fixed_set_empty (struct addrmap *this,
CORE_ADDR start, CORE_ADDR end_inclusive,
void *obj)
{
internal_error (__FILE__, __LINE__,
"addrmap_fixed_set_empty: "
"fixed addrmaps can't be changed\n");
}
static void *
addrmap_fixed_find (struct addrmap *this, CORE_ADDR addr)
{
struct addrmap_fixed *map = (struct addrmap_fixed *) this;
struct addrmap_transition *bottom = &map->transitions[0];
struct addrmap_transition *top = &map->transitions[map->num_transitions - 1];
while (bottom < top)
{
/* This needs to round towards top, or else when top = bottom +
1 (i.e., two entries are under consideration), then mid ==
bottom, and then we may not narrow the range when (mid->addr
< addr). */
struct addrmap_transition *mid = top - (top - bottom) / 2;
if (mid->addr == addr)
{
bottom = mid;
break;
}
else if (mid->addr < addr)
/* We don't eliminate mid itself here, since each transition
covers all subsequent addresses until the next. This is why
we must round up in computing the midpoint. */
bottom = mid;
else
top = mid - 1;
}
return bottom->value;
}
static struct addrmap *
addrmap_fixed_create_fixed (struct addrmap *this, struct obstack *obstack)
{
internal_error (__FILE__, __LINE__,
_("addrmap_create_fixed is not implemented yet "
"for fixed addrmaps"));
}
static void
addrmap_fixed_relocate (struct addrmap *this, CORE_ADDR offset)
{
struct addrmap_fixed *map = (struct addrmap_fixed *) this;
size_t i;
for (i = 0; i < map->num_transitions; i++)
map->transitions[i].addr += offset;
}
static const struct addrmap_funcs addrmap_fixed_funcs =
{
addrmap_fixed_set_empty,
addrmap_fixed_find,
addrmap_fixed_create_fixed,
addrmap_fixed_relocate
};
/* Mutable address maps. */
struct addrmap_mutable
{
struct addrmap addrmap;
/* The obstack to use for allocations for this map. */
struct obstack *obstack;
/* A splay tree, with a node for each transition; there is a
transition at address T if T-1 and T map to different objects.
Any addresses below the first node map to NULL. (Unlike
fixed maps, we have no entry at (CORE_ADDR) 0; it doesn't
simplify enough.)
The last region is assumed to end at CORE_ADDR_MAX.
Since we can't know whether CORE_ADDR is larger or smaller than
splay_tree_key (unsigned long) --- I think both are possible,
given all combinations of 32- and 64-bit hosts and targets ---
our keys are pointers to CORE_ADDR values. Since the splay tree
library doesn't pass any closure pointer to the key free
function, we can't keep a freelist for keys. Since mutable
addrmaps are only used temporarily right now, we just leak keys
from deleted nodes; they'll be freed when the obstack is freed. */
splay_tree tree;
/* A freelist for splay tree nodes, allocated on obstack, and
chained together by their 'right' pointers. */
splay_tree_node free_nodes;
};
/* Allocate a copy of CORE_ADDR in MAP's obstack. */
static splay_tree_key
allocate_key (struct addrmap_mutable *map, CORE_ADDR addr)
{
CORE_ADDR *key = obstack_alloc (map->obstack, sizeof (*key));
*key = addr;
return (splay_tree_key) key;
}
/* Type-correct wrappers for splay tree access. */
static splay_tree_node
addrmap_splay_tree_lookup (struct addrmap_mutable *map, CORE_ADDR addr)
{
return splay_tree_lookup (map->tree, (splay_tree_key) &addr);
}
static splay_tree_node
addrmap_splay_tree_predecessor (struct addrmap_mutable *map, CORE_ADDR addr)
{
return splay_tree_predecessor (map->tree, (splay_tree_key) &addr);
}
static splay_tree_node
addrmap_splay_tree_successor (struct addrmap_mutable *map, CORE_ADDR addr)
{
return splay_tree_successor (map->tree, (splay_tree_key) &addr);
}
static void
addrmap_splay_tree_remove (struct addrmap_mutable *map, CORE_ADDR addr)
{
splay_tree_remove (map->tree, (splay_tree_key) &addr);
}
static CORE_ADDR
addrmap_node_key (splay_tree_node node)
{
return * (CORE_ADDR *) node->key;
}
static void *
addrmap_node_value (splay_tree_node node)
{
return (void *) node->value;
}
static void
addrmap_node_set_value (splay_tree_node node, void *value)
{
node->value = (splay_tree_value) value;
}
static void
addrmap_splay_tree_insert (struct addrmap_mutable *map, CORE_ADDR key, void *value)
{
splay_tree_insert (map->tree,
allocate_key (map, key),
(splay_tree_value) value);
}
/* Without changing the mapping of any address, ensure that there is a
tree node at ADDR, even if it would represent a "transition" from
one value to the same value. */
static void
force_transition (struct addrmap_mutable *this, CORE_ADDR addr)
{
splay_tree_node n
= addrmap_splay_tree_lookup (this, addr);
if (! n)
{
n = addrmap_splay_tree_predecessor (this, addr);
addrmap_splay_tree_insert (this, addr,
n ? addrmap_node_value (n) : NULL);
}
}
static void
addrmap_mutable_set_empty (struct addrmap *this,
CORE_ADDR start, CORE_ADDR end_inclusive,
void *obj)
{
struct addrmap_mutable *map = (struct addrmap_mutable *) this;
splay_tree_node n, next;
void *prior_value;
/* If we're being asked to set all empty portions of the given
address range to empty, then probably the caller is confused.
(If that turns out to be useful in some cases, then we can change
this to simply return, since overriding NULL with NULL is a
no-op.) */
gdb_assert (obj);
/* We take a two-pass approach, for simplicity.
- Establish transitions where we think we might need them.
- First pass: change all NULL regions to OBJ.
- Second pass: remove any unnecessary transitions. */
/* Establish transitions at the start and end. */
force_transition (map, start);
if (end_inclusive < CORE_ADDR_MAX)
force_transition (map, end_inclusive + 1);
/* Walk the area, changing all NULL regions to OBJ. */
for (n = addrmap_splay_tree_lookup (map, start), gdb_assert (n);
n && addrmap_node_key (n) <= end_inclusive;
n = addrmap_splay_tree_successor (map, addrmap_node_key (n)))
{
if (! addrmap_node_value (n))
addrmap_node_set_value (n, obj);
}
/* Walk the area again, removing transitions from any value to
itself. Be sure to visit both the transitions we forced
above. */
n = addrmap_splay_tree_predecessor (map, start);
prior_value = n ? addrmap_node_value (n) : NULL;
for (n = addrmap_splay_tree_lookup (map, start), gdb_assert (n);
n && (end_inclusive == CORE_ADDR_MAX
|| addrmap_node_key (n) <= end_inclusive + 1);
n = next)
{
next = addrmap_splay_tree_successor (map, addrmap_node_key (n));
if (addrmap_node_value (n) == prior_value)
addrmap_splay_tree_remove (map, addrmap_node_key (n));
else
prior_value = addrmap_node_value (n);
}
}
static void *
addrmap_mutable_find (struct addrmap *this, CORE_ADDR addr)
{
/* Not needed yet. */
internal_error (__FILE__, __LINE__,
_("addrmap_find is not implemented yet "
"for mutable addrmaps"));
}
/* A function to pass to splay_tree_foreach to count the number of nodes
in the tree. */
static int
splay_foreach_count (splay_tree_node n, void *closure)
{
size_t *count = (size_t *) closure;
(*count)++;
return 0;
}
/* A function to pass to splay_tree_foreach to copy entries into a
fixed address map. */
static int
splay_foreach_copy (splay_tree_node n, void *closure)
{
struct addrmap_fixed *fixed = (struct addrmap_fixed *) closure;
struct addrmap_transition *t = &fixed->transitions[fixed->num_transitions];
t->addr = addrmap_node_key (n);
t->value = addrmap_node_value (n);
fixed->num_transitions++;
return 0;
}
static struct addrmap *
addrmap_mutable_create_fixed (struct addrmap *this, struct obstack *obstack)
{
struct addrmap_mutable *mutable = (struct addrmap_mutable *) this;
struct addrmap_fixed *fixed;
size_t num_transitions;
/* Count the number of transitions in the tree. */
num_transitions = 0;
splay_tree_foreach (mutable->tree, splay_foreach_count, &num_transitions);
/* Include an extra entry for the transition at zero (which fixed
maps have, but mutable maps do not.) */
num_transitions++;
fixed = obstack_alloc (obstack,
(sizeof (*fixed)
+ (num_transitions
* sizeof (fixed->transitions[0]))));
fixed->addrmap.funcs = &addrmap_fixed_funcs;
fixed->num_transitions = 1;
fixed->transitions[0].addr = 0;
fixed->transitions[0].value = NULL;
/* Copy all entries from the splay tree to the array, in order
of increasing address. */
splay_tree_foreach (mutable->tree, splay_foreach_copy, fixed);
/* We should have filled the array. */
gdb_assert (fixed->num_transitions == num_transitions);
return (struct addrmap *) fixed;
}
static void
addrmap_mutable_relocate (struct addrmap *this, CORE_ADDR offset)
{
/* Not needed yet. */
internal_error (__FILE__, __LINE__,
_("addrmap_relocate is not implemented yet "
"for mutable addrmaps"));
}
static const struct addrmap_funcs addrmap_mutable_funcs =
{
addrmap_mutable_set_empty,
addrmap_mutable_find,
addrmap_mutable_create_fixed,
addrmap_mutable_relocate
};
static void *
splay_obstack_alloc (int size, void *closure)
{
struct addrmap_mutable *map = closure;
splay_tree_node n;
/* We should only be asked to allocate nodes and larger things.
(If, at some point in the future, this is no longer true, we can
just round up the size to sizeof (*n).) */
gdb_assert (size >= sizeof (*n));
if (map->free_nodes)
{
n = map->free_nodes;
map->free_nodes = n->right;
return n;
}
else
return obstack_alloc (map->obstack, size);
}
static void
splay_obstack_free (void *obj, void *closure)
{
struct addrmap_mutable *map = closure;
splay_tree_node n = obj;
/* We've asserted in the allocation function that we only allocate
nodes or larger things, so it should be safe to put whatever
we get passed back on the free list. */
n->right = map->free_nodes;
map->free_nodes = n;
}
/* Compare keys as CORE_ADDR * values. */
static int
splay_compare_CORE_ADDR_ptr (splay_tree_key ak, splay_tree_key bk)
{
CORE_ADDR a = * (CORE_ADDR *) ak;
CORE_ADDR b = * (CORE_ADDR *) bk;
/* We can't just return a-b here, because of over/underflow. */
if (a < b)
return -1;
else if (a == b)
return 0;
else
return 1;
}
struct addrmap *
addrmap_create_mutable (struct obstack *obstack)
{
struct addrmap_mutable *map = obstack_alloc (obstack, sizeof (*map));
map->addrmap.funcs = &addrmap_mutable_funcs;
map->obstack = obstack;
/* splay_tree_new_with_allocator uses the provided allocation
function to allocate the main splay_tree structure itself, so our
free list has to be initialized before we create the tree. */
map->free_nodes = NULL;
map->tree = splay_tree_new_with_allocator (splay_compare_CORE_ADDR_ptr,
NULL, /* no delete key */
NULL, /* no delete value */
splay_obstack_alloc,
splay_obstack_free,
map);
return (struct addrmap *) map;
}
/* Initialization. */
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_addrmap;
void
_initialize_addrmap (void)
{
/* Make sure splay trees can actually hold the values we want to
store in them. */
gdb_assert (sizeof (splay_tree_key) >= sizeof (CORE_ADDR *));
gdb_assert (sizeof (splay_tree_value) >= sizeof (void *));
}

View File

@@ -1,94 +0,0 @@
/* addrmap.h --- interface to address map data structure.
Copyright (C) 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef ADDRMAP_H
#define ADDRMAP_H
/* An address map is essentially a table mapping CORE_ADDRs onto GDB
data structures, like blocks, symtabs, partial symtabs, and so on.
An address map uses memory proportional to the number of
transitions in the map, where a CORE_ADDR N is mapped to one
object, and N+1 is mapped to a different object.
Address maps come in two flavors: fixed, and mutable. Mutable
address maps consume more memory, but can be changed and extended.
A fixed address map, once constructed (from a mutable address map),
can't be edited. Both kinds of map are allocated in obstacks. */
/* The opaque type representing address maps. */
struct addrmap;
/* Create a mutable address map which maps every address to NULL.
Allocate entries in OBSTACK. */
struct addrmap *addrmap_create_mutable (struct obstack *obstack);
/* In the mutable address map MAP, associate the addresses from START
to END_INCLUSIVE that are currently associated with NULL with OBJ
instead. Addresses mapped to an object other than NULL are left
unchanged.
As the name suggests, END_INCLUSIVE is also mapped to OBJ. This
convention is unusual, but it allows callers to accurately specify
ranges that abut the top of the address space, and ranges that
cover the entire address space.
This operation seems a bit complicated for a primitive: if it's
needed, why not just have a simpler primitive operation that sets a
range to a value, wiping out whatever was there before, and then
let the caller construct more complicated operations from that,
along with some others for traversal?
It turns out this is the mutation operation we want to use all the
time, at least for now. Our immediate use for address maps is to
represent lexical blocks whose address ranges are not contiguous.
We walk the tree of lexical blocks present in the debug info, and
only create 'struct block' objects after we've traversed all a
block's children. If a lexical block declares no local variables
(and isn't the lexical block for a function's body), we omit it
from GDB's data structures entirely.
However, this means that we don't decide to create a block (and
thus record it in the address map) until after we've traversed its
children. If we do decide to create the block, we do so at a time
when all its children have already been recorded in the map. So
this operation --- change only those addresses left unset --- is
actually the operation we want to use every time.
It seems simpler to let the code which operates on the
representation directly deal with the hair of implementing these
semantics than to provide an interface which allows it to be
implemented efficiently, but doesn't reveal too much of the
representation. */
void addrmap_set_empty (struct addrmap *map,
CORE_ADDR start, CORE_ADDR end_inclusive,
void *obj);
/* Return the object associated with ADDR in MAP. */
void *addrmap_find (struct addrmap *map, CORE_ADDR addr);
/* Create a fixed address map which is a copy of the mutable address
map ORIGINAL. Allocate entries in OBSTACK. */
struct addrmap *addrmap_create_fixed (struct addrmap *original,
struct obstack *obstack);
/* Relocate all the addresses in MAP by OFFSET. (This can be applied
to either mutable or immutable maps.) */
void addrmap_relocate (struct addrmap *map, CORE_ADDR offset);
#endif /* ADDRMAP_H */

File diff suppressed because it is too large Load Diff

View File

@@ -1,103 +0,0 @@
/* Low level Alpha GNU/Linux interface, for GDB when running native.
Copyright (C) 2005, 2006, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "target.h"
#include "regcache.h"
#include "linux-nat.h"
#include "alpha-tdep.h"
#include <sys/ptrace.h>
#include <alpha/ptrace.h>
#include <sys/procfs.h>
#include "gregset.h"
/* The address of UNIQUE for ptrace. */
#define ALPHA_UNIQUE_PTRACE_ADDR 65
/*
* See the comment in m68k-tdep.c regarding the utility of these functions.
*/
void
supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
{
const long *regp = (const long *)gregsetp;
/* PC is in slot 32, UNIQUE is in slot 33. */
alpha_supply_int_regs (regcache, -1, regp, regp + 31, regp + 32);
}
void
fill_gregset (const struct regcache *regcache,
gdb_gregset_t *gregsetp, int regno)
{
long *regp = (long *)gregsetp;
/* PC is in slot 32, UNIQUE is in slot 33. */
alpha_fill_int_regs (regcache, regno, regp, regp + 31, regp + 32);
}
/*
* Now we do the same thing for floating-point registers.
* Again, see the comments in m68k-tdep.c.
*/
void
supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
{
const long *regp = (const long *)fpregsetp;
/* FPCR is in slot 32. */
alpha_supply_fp_regs (regcache, -1, regp, regp + 31);
}
void
fill_fpregset (const struct regcache *regcache,
gdb_fpregset_t *fpregsetp, int regno)
{
long *regp = (long *)fpregsetp;
/* FPCR is in slot 32. */
alpha_fill_fp_regs (regcache, regno, regp, regp + 31);
}
static CORE_ADDR
alpha_linux_register_u_offset (struct gdbarch *gdbarch, int regno, int store_p)
{
if (regno == gdbarch_pc_regnum (gdbarch))
return PC;
if (regno == ALPHA_UNIQUE_REGNUM)
return ALPHA_UNIQUE_PTRACE_ADDR;
if (regno < gdbarch_fp0_regnum (gdbarch))
return GPR_BASE + regno;
else
return FPR_BASE + regno - gdbarch_fp0_regnum (gdbarch);
}
void _initialialize_alpha_linux_nat (void);
void
_initialize_alpha_linux_nat (void)
{
linux_nat_add_target (linux_trad_target (alpha_linux_register_u_offset));
}

View File

@@ -1,246 +0,0 @@
/* Target-dependent code for GNU/Linux on Alpha.
Copyright (C) 2002, 2003, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "frame.h"
#include "gdb_assert.h"
#include "gdb_string.h"
#include "osabi.h"
#include "solib-svr4.h"
#include "symtab.h"
#include "regset.h"
#include "regcache.h"
#include "alpha-tdep.h"
/* Under GNU/Linux, signal handler invocations can be identified by
the designated code sequence that is used to return from a signal
handler. In particular, the return address of a signal handler
points to a sequence that copies $sp to $16, loads $0 with the
appropriate syscall number, and finally enters the kernel.
This is somewhat complicated in that:
(1) the expansion of the "mov" assembler macro has changed over
time, from "bis src,src,dst" to "bis zero,src,dst",
(2) the kernel has changed from using "addq" to "lda" to load the
syscall number,
(3) there is a "normal" sigreturn and an "rt" sigreturn which
has a different stack layout.
*/
static long
alpha_linux_sigtramp_offset_1 (CORE_ADDR pc)
{
switch (alpha_read_insn (pc))
{
case 0x47de0410: /* bis $30,$30,$16 */
case 0x47fe0410: /* bis $31,$30,$16 */
return 0;
case 0x43ecf400: /* addq $31,103,$0 */
case 0x201f0067: /* lda $0,103($31) */
case 0x201f015f: /* lda $0,351($31) */
return 4;
case 0x00000083: /* call_pal callsys */
return 8;
default:
return -1;
}
}
static LONGEST
alpha_linux_sigtramp_offset (CORE_ADDR pc)
{
long i, off;
if (pc & 3)
return -1;
/* Guess where we might be in the sequence. */
off = alpha_linux_sigtramp_offset_1 (pc);
if (off < 0)
return -1;
/* Verify that the other two insns of the sequence are as we expect. */
pc -= off;
for (i = 0; i < 12; i += 4)
{
if (i == off)
continue;
if (alpha_linux_sigtramp_offset_1 (pc + i) != i)
return -1;
}
return off;
}
static int
alpha_linux_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
{
return alpha_linux_sigtramp_offset (pc) >= 0;
}
static CORE_ADDR
alpha_linux_sigcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR pc;
ULONGEST sp;
long off;
pc = get_frame_pc (this_frame);
sp = get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM);
off = alpha_linux_sigtramp_offset (pc);
gdb_assert (off >= 0);
/* __NR_rt_sigreturn has a couple of structures on the stack. This is:
struct rt_sigframe {
struct siginfo info;
struct ucontext uc;
};
offsetof (struct rt_sigframe, uc.uc_mcontext);
*/
if (alpha_read_insn (pc - off + 4) == 0x201f015f)
return sp + 176;
/* __NR_sigreturn has the sigcontext structure at the top of the stack. */
return sp;
}
/* Supply register REGNUM from the buffer specified by GREGS and LEN
in the general-purpose register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
alpha_linux_supply_gregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *gregs, size_t len)
{
const gdb_byte *regs = gregs;
int i;
gdb_assert (len >= 32 * 8);
for (i = 0; i < ALPHA_ZERO_REGNUM; i++)
{
if (regnum == i || regnum == -1)
regcache_raw_supply (regcache, i, regs + i * 8);
}
if (regnum == ALPHA_PC_REGNUM || regnum == -1)
regcache_raw_supply (regcache, ALPHA_PC_REGNUM, regs + 31 * 8);
if (regnum == ALPHA_UNIQUE_REGNUM || regnum == -1)
regcache_raw_supply (regcache, ALPHA_UNIQUE_REGNUM,
len >= 33 * 8 ? regs + 32 * 8 : NULL);
}
/* Supply register REGNUM from the buffer specified by FPREGS and LEN
in the floating-point register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
alpha_linux_supply_fpregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *fpregs, size_t len)
{
const gdb_byte *regs = fpregs;
int i;
gdb_assert (len >= 32 * 8);
for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; i++)
{
if (regnum == i || regnum == -1)
regcache_raw_supply (regcache, i, regs + (i - ALPHA_FP0_REGNUM) * 8);
}
if (regnum == ALPHA_FPCR_REGNUM || regnum == -1)
regcache_raw_supply (regcache, ALPHA_FPCR_REGNUM, regs + 31 * 8);
}
static struct regset alpha_linux_gregset =
{
NULL,
alpha_linux_supply_gregset
};
static struct regset alpha_linux_fpregset =
{
NULL,
alpha_linux_supply_fpregset
};
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
static const struct regset *
alpha_linux_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size)
{
if (strcmp (sect_name, ".reg") == 0 && sect_size >= 32 * 8)
return &alpha_linux_gregset;
if (strcmp (sect_name, ".reg2") == 0 && sect_size >= 32 * 8)
return &alpha_linux_fpregset;
return NULL;
}
static void
alpha_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep;
/* Hook into the DWARF CFI frame unwinder. */
alpha_dwarf2_init_abi (info, gdbarch);
/* Hook into the MDEBUG frame unwinder. */
alpha_mdebug_init_abi (info, gdbarch);
tdep = gdbarch_tdep (gdbarch);
tdep->dynamic_sigtramp_offset = alpha_linux_sigtramp_offset;
tdep->sigcontext_addr = alpha_linux_sigcontext_addr;
tdep->pc_in_sigtramp = alpha_linux_pc_in_sigtramp;
tdep->jb_pc = 2;
tdep->jb_elt_size = 8;
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
/* Enable TLS support. */
set_gdbarch_fetch_tls_load_module_address (gdbarch,
svr4_fetch_objfile_link_map);
set_gdbarch_regset_from_core_section
(gdbarch, alpha_linux_regset_from_core_section);
}
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_alpha_linux_tdep;
void
_initialize_alpha_linux_tdep (void)
{
gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_LINUX,
alpha_linux_init_abi);
}

View File

@@ -1,376 +0,0 @@
/* Target-dependent mdebug code for the ALPHA architecture.
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
2003, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "frame.h"
#include "frame-unwind.h"
#include "frame-base.h"
#include "symtab.h"
#include "gdbcore.h"
#include "block.h"
#include "gdb_assert.h"
#include "gdb_string.h"
#include "trad-frame.h"
#include "alpha-tdep.h"
#include "mdebugread.h"
/* FIXME: Some of this code should perhaps be merged with mips. */
/* *INDENT-OFF* */
/* Layout of a stack frame on the alpha:
| |
pdr members: | 7th ... nth arg, |
| `pushed' by caller. |
| |
----------------|-------------------------------|<-- old_sp == vfp
^ ^ ^ ^ | |
| | | | | |
| |localoff | Copies of 1st .. 6th |
| | | | | argument if necessary. |
| | | v | |
| | | --- |-------------------------------|<-- LOCALS_ADDRESS
| | | | |
| | | | Locals and temporaries. |
| | | | |
| | | |-------------------------------|
| | | | |
|-fregoffset | Saved float registers. |
| | | | F9 |
| | | | . |
| | | | . |
| | | | F2 |
| | v | |
| | -------|-------------------------------|
| | | |
| | | Saved registers. |
| | | S6 |
|-regoffset | . |
| | | . |
| | | S0 |
| | | pdr.pcreg |
| v | |
| ----------|-------------------------------|
| | |
frameoffset | Argument build area, gets |
| | 7th ... nth arg for any |
| | called procedure. |
v | |
-------------|-------------------------------|<-- sp
| |
*/
/* *INDENT-ON* */
#define PROC_LOW_ADDR(proc) ((proc)->pdr.adr)
#define PROC_FRAME_OFFSET(proc) ((proc)->pdr.frameoffset)
#define PROC_FRAME_REG(proc) ((proc)->pdr.framereg)
#define PROC_REG_MASK(proc) ((proc)->pdr.regmask)
#define PROC_FREG_MASK(proc) ((proc)->pdr.fregmask)
#define PROC_REG_OFFSET(proc) ((proc)->pdr.regoffset)
#define PROC_FREG_OFFSET(proc) ((proc)->pdr.fregoffset)
#define PROC_PC_REG(proc) ((proc)->pdr.pcreg)
#define PROC_LOCALOFF(proc) ((proc)->pdr.localoff)
/* Locate the mdebug PDR for the given PC. Return null if one can't
be found; you'll have to fall back to other methods in that case. */
static struct mdebug_extra_func_info *
find_proc_desc (CORE_ADDR pc)
{
struct block *b = block_for_pc (pc);
struct mdebug_extra_func_info *proc_desc = NULL;
struct symbol *sym = NULL;
char *sh_name = NULL;
if (b)
{
CORE_ADDR startaddr;
find_pc_partial_function (pc, &sh_name, &startaddr, NULL);
if (startaddr > BLOCK_START (b))
/* This is the "pathological" case referred to in a comment in
print_frame_info. It might be better to move this check into
symbol reading. */
sym = NULL;
else
sym = lookup_symbol (MDEBUG_EFI_SYMBOL_NAME, b, LABEL_DOMAIN, 0);
}
if (sym)
{
proc_desc = (struct mdebug_extra_func_info *) SYMBOL_VALUE (sym);
/* Correct incorrect setjmp procedure descriptor from the library
to make backtrace through setjmp work. */
if (proc_desc->pdr.pcreg == 0
&& strcmp (sh_name, "setjmp") == 0)
{
proc_desc->pdr.pcreg = ALPHA_RA_REGNUM;
proc_desc->pdr.regmask = 0x80000000;
proc_desc->pdr.regoffset = -4;
}
/* If we never found a PDR for this function in symbol reading,
then examine prologues to find the information. */
if (proc_desc->pdr.framereg == -1)
proc_desc = NULL;
}
return proc_desc;
}
/* This returns the PC of the first inst after the prologue. If we can't
find the prologue, then return 0. */
static CORE_ADDR
alpha_mdebug_after_prologue (CORE_ADDR pc, struct mdebug_extra_func_info *proc_desc)
{
if (proc_desc)
{
/* If function is frameless, then we need to do it the hard way. I
strongly suspect that frameless always means prologueless... */
if (PROC_FRAME_REG (proc_desc) == ALPHA_SP_REGNUM
&& PROC_FRAME_OFFSET (proc_desc) == 0)
return 0;
}
return alpha_after_prologue (pc);
}
/* Return non-zero if we *might* be in a function prologue. Return zero
if we are definitively *not* in a function prologue. */
static int
alpha_mdebug_in_prologue (CORE_ADDR pc, struct mdebug_extra_func_info *proc_desc)
{
CORE_ADDR after_prologue_pc = alpha_mdebug_after_prologue (pc, proc_desc);
return (after_prologue_pc == 0 || pc < after_prologue_pc);
}
/* Frame unwinder that reads mdebug PDRs. */
struct alpha_mdebug_unwind_cache
{
struct mdebug_extra_func_info *proc_desc;
CORE_ADDR vfp;
struct trad_frame_saved_reg *saved_regs;
};
/* Extract all of the information about the frame from PROC_DESC
and store the resulting register save locations in the structure. */
static struct alpha_mdebug_unwind_cache *
alpha_mdebug_frame_unwind_cache (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct alpha_mdebug_unwind_cache *info;
struct mdebug_extra_func_info *proc_desc;
ULONGEST vfp;
CORE_ADDR pc, reg_position;
unsigned long mask;
int ireg, returnreg;
if (*this_prologue_cache)
return *this_prologue_cache;
info = FRAME_OBSTACK_ZALLOC (struct alpha_mdebug_unwind_cache);
*this_prologue_cache = info;
pc = get_frame_address_in_block (this_frame);
/* ??? We don't seem to be able to cache the lookup of the PDR
from alpha_mdebug_frame_p. It'd be nice if we could change
the arguments to that function. Oh well. */
proc_desc = find_proc_desc (pc);
info->proc_desc = proc_desc;
gdb_assert (proc_desc != NULL);
info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
/* The VFP of the frame is at FRAME_REG+FRAME_OFFSET. */
vfp = get_frame_register_unsigned (this_frame, PROC_FRAME_REG (proc_desc));
vfp += PROC_FRAME_OFFSET (info->proc_desc);
info->vfp = vfp;
/* Fill in the offsets for the registers which gen_mask says were saved. */
reg_position = vfp + PROC_REG_OFFSET (proc_desc);
mask = PROC_REG_MASK (proc_desc);
returnreg = PROC_PC_REG (proc_desc);
/* Note that RA is always saved first, regardless of its actual
register number. */
if (mask & (1 << returnreg))
{
/* Clear bit for RA so we don't save it again later. */
mask &= ~(1 << returnreg);
info->saved_regs[returnreg].addr = reg_position;
reg_position += 8;
}
for (ireg = 0; ireg <= 31; ++ireg)
if (mask & (1 << ireg))
{
info->saved_regs[ireg].addr = reg_position;
reg_position += 8;
}
reg_position = vfp + PROC_FREG_OFFSET (proc_desc);
mask = PROC_FREG_MASK (proc_desc);
for (ireg = 0; ireg <= 31; ++ireg)
if (mask & (1 << ireg))
{
info->saved_regs[ALPHA_FP0_REGNUM + ireg].addr = reg_position;
reg_position += 8;
}
/* The stack pointer of the previous frame is computed by popping
the current stack frame. */
if (!trad_frame_addr_p (info->saved_regs, ALPHA_SP_REGNUM))
trad_frame_set_value (info->saved_regs, ALPHA_SP_REGNUM, vfp);
return info;
}
/* Given a GDB frame, determine the address of the calling function's
frame. This will be used to create a new GDB frame struct. */
static void
alpha_mdebug_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache,
struct frame_id *this_id)
{
struct alpha_mdebug_unwind_cache *info
= alpha_mdebug_frame_unwind_cache (this_frame, this_prologue_cache);
*this_id = frame_id_build (info->vfp, get_frame_func (this_frame));
}
/* Retrieve the value of REGNUM in FRAME. Don't give up! */
static struct value *
alpha_mdebug_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct alpha_mdebug_unwind_cache *info
= alpha_mdebug_frame_unwind_cache (this_frame, this_prologue_cache);
/* The PC of the previous frame is stored in the link register of
the current frame. Frob regnum so that we pull the value from
the correct place. */
if (regnum == ALPHA_PC_REGNUM)
regnum = PROC_PC_REG (info->proc_desc);
return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
}
static int
alpha_mdebug_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
CORE_ADDR pc = get_frame_address_in_block (this_frame);
struct mdebug_extra_func_info *proc_desc;
/* If this PC does not map to a PDR, then clearly this isn't an
mdebug frame. */
proc_desc = find_proc_desc (pc);
if (proc_desc == NULL)
return 0;
/* If we're in the prologue, the PDR for this frame is not yet valid.
Say no here and we'll fall back on the heuristic unwinder. */
if (alpha_mdebug_in_prologue (pc, proc_desc))
return 0;
return 1;
}
static const struct frame_unwind alpha_mdebug_frame_unwind = {
NORMAL_FRAME,
alpha_mdebug_frame_this_id,
alpha_mdebug_frame_prev_register,
NULL,
alpha_mdebug_frame_sniffer
};
static CORE_ADDR
alpha_mdebug_frame_base_address (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct alpha_mdebug_unwind_cache *info
= alpha_mdebug_frame_unwind_cache (this_frame, this_prologue_cache);
return info->vfp;
}
static CORE_ADDR
alpha_mdebug_frame_locals_address (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct alpha_mdebug_unwind_cache *info
= alpha_mdebug_frame_unwind_cache (this_frame, this_prologue_cache);
return info->vfp - PROC_LOCALOFF (info->proc_desc);
}
static CORE_ADDR
alpha_mdebug_frame_args_address (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct alpha_mdebug_unwind_cache *info
= alpha_mdebug_frame_unwind_cache (this_frame, this_prologue_cache);
return info->vfp - ALPHA_NUM_ARG_REGS * 8;
}
static const struct frame_base alpha_mdebug_frame_base = {
&alpha_mdebug_frame_unwind,
alpha_mdebug_frame_base_address,
alpha_mdebug_frame_locals_address,
alpha_mdebug_frame_args_address
};
static const struct frame_base *
alpha_mdebug_frame_base_sniffer (struct frame_info *this_frame)
{
CORE_ADDR pc = get_frame_address_in_block (this_frame);
struct mdebug_extra_func_info *proc_desc;
/* If this PC does not map to a PDR, then clearly this isn't an
mdebug frame. */
proc_desc = find_proc_desc (pc);
if (proc_desc == NULL)
return NULL;
return &alpha_mdebug_frame_base;
}
void
alpha_mdebug_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
frame_unwind_append_unwinder (gdbarch, &alpha_mdebug_frame_unwind);
frame_base_append_sniffer (gdbarch, alpha_mdebug_frame_base_sniffer);
}

View File

@@ -1,199 +0,0 @@
/* Low level Alpha interface, for GDB when running native.
Copyright (C) 1993, 1995, 1996, 1998, 1999, 2000, 2001, 2003, 2007, 2008,
2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "gdb_string.h"
#include "inferior.h"
#include "gdbcore.h"
#include "target.h"
#include "procfs.h"
#include "regcache.h"
#include "alpha-tdep.h"
#include <sys/ptrace.h>
#include <alpha/coreregs.h>
#include <sys/user.h>
/* Extract the register values out of the core file and store
them into REGCACHE.
CORE_REG_SECT points to the register values themselves, read into memory.
CORE_REG_SIZE is the size of that area.
WHICH says which set of registers we are handling (0 = int, 2 = float
on machines where they are discontiguous).
REG_ADDR is the offset from u.u_ar0 to the register values relative to
core_reg_sect. This is used with old-fashioned core files to
locate the registers in a large upage-plus-stack ".reg" section.
Original upage address X is at location core_reg_sect+x+reg_addr.
*/
static void
fetch_osf_core_registers (struct regcache *regcache,
char *core_reg_sect, unsigned core_reg_size,
int which, CORE_ADDR reg_addr)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
int regno;
int addr;
int bad_reg = -1;
/* Table to map a gdb regnum to an index in the core register
section. The floating point register values are garbage in
OSF/1.2 core files. OSF5 uses different names for the register
enum list, need to handle two cases. The actual values are the
same. */
static int const core_reg_mapping[ALPHA_NUM_REGS] =
{
#ifdef NCF_REGS
#define EFL NCF_REGS
CF_V0, CF_T0, CF_T1, CF_T2, CF_T3, CF_T4, CF_T5, CF_T6,
CF_T7, CF_S0, CF_S1, CF_S2, CF_S3, CF_S4, CF_S5, CF_S6,
CF_A0, CF_A1, CF_A2, CF_A3, CF_A4, CF_A5, CF_T8, CF_T9,
CF_T10, CF_T11, CF_RA, CF_T12, CF_AT, CF_GP, CF_SP, -1,
EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7,
EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
CF_PC, -1, -1
#else
#define EFL (EF_SIZE / 8)
EF_V0, EF_T0, EF_T1, EF_T2, EF_T3, EF_T4, EF_T5, EF_T6,
EF_T7, EF_S0, EF_S1, EF_S2, EF_S3, EF_S4, EF_S5, EF_S6,
EF_A0, EF_A1, EF_A2, EF_A3, EF_A4, EF_A5, EF_T8, EF_T9,
EF_T10, EF_T11, EF_RA, EF_T12, EF_AT, EF_GP, EF_SP, -1,
EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7,
EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
EF_PC, -1, -1
#endif
};
for (regno = 0; regno < ALPHA_NUM_REGS; regno++)
{
if (gdbarch_cannot_fetch_register (gdbarch, regno))
{
regcache_raw_supply (regcache, regno, NULL);
continue;
}
addr = 8 * core_reg_mapping[regno];
if (addr < 0 || addr >= core_reg_size)
{
/* ??? UNIQUE is a new addition. Don't generate an error. */
if (regno == ALPHA_UNIQUE_REGNUM)
{
regcache_raw_supply (regcache, regno, NULL);
continue;
}
if (bad_reg < 0)
bad_reg = regno;
}
else
{
regcache_raw_supply (regcache, regno, core_reg_sect + addr);
}
}
if (bad_reg >= 0)
{
error (_("Register %s not found in core file."),
gdbarch_register_name (gdbarch, bad_reg));
}
}
#include <sys/procfs.h>
/* Prototypes for supply_gregset etc. */
#include "gregset.h"
/*
* See the comment in m68k-tdep.c regarding the utility of these functions.
*/
void
supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
{
const long *regp = gregsetp->regs;
/* PC is in slot 32. */
alpha_supply_int_regs (regcache, -1, regp, regp + 31, NULL);
}
void
fill_gregset (const struct regcache *regcache,
gdb_gregset_t *gregsetp, int regno)
{
long *regp = gregsetp->regs;
/* PC is in slot 32. */
alpha_fill_int_regs (regcache, regno, regp, regp + 31, NULL);
}
/*
* Now we do the same thing for floating-point registers.
* Again, see the comments in m68k-tdep.c.
*/
void
supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
{
const long *regp = fpregsetp->regs;
/* FPCR is in slot 32. */
alpha_supply_fp_regs (regcache, -1, regp, regp + 31);
}
void
fill_fpregset (const struct regcache *regcache,
gdb_fpregset_t *fpregsetp, int regno)
{
long *regp = fpregsetp->regs;
/* FPCR is in slot 32. */
alpha_fill_fp_regs (regcache, regno, regp, regp + 31);
}
/* Register that we are able to handle alpha core file formats. */
static struct core_fns alpha_osf_core_fns =
{
/* This really is bfd_target_unknown_flavour. */
bfd_target_unknown_flavour, /* core_flavour */
default_check_format, /* check_format */
default_core_sniffer, /* core_sniffer */
fetch_osf_core_registers, /* core_read_registers */
NULL /* next */
};
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_alpha_nat;
void
_initialize_alpha_nat (void)
{
struct target_ops *t;
t = procfs_target ();
add_target (t);
deprecated_add_core_fns (&alpha_osf_core_fns);
}

View File

@@ -1,76 +0,0 @@
/* Target-dependent code for OSF/1 on Alpha.
Copyright (C) 2002, 2003, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "frame.h"
#include "gdbcore.h"
#include "value.h"
#include "osabi.h"
#include "gdb_string.h"
#include "objfiles.h"
#include "alpha-tdep.h"
static int
alpha_osf1_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
{
return (func_name != NULL && strcmp ("__sigtramp", func_name) == 0);
}
static CORE_ADDR
alpha_osf1_sigcontext_addr (struct frame_info *this_frame)
{
struct frame_info *next_frame = get_next_frame (this_frame);
struct frame_id next_id = null_frame_id;
if (next_frame != NULL)
next_id = get_frame_id (next_frame);
return (read_memory_integer (next_id.stack_addr, 8));
}
static void
alpha_osf1_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
/* Hook into the MDEBUG frame unwinder. */
alpha_mdebug_init_abi (info, gdbarch);
/* The next/step support via procfs on OSF1 is broken when running
on multi-processor machines. We need to use software single stepping
instead. */
set_gdbarch_software_single_step (gdbarch, alpha_software_single_step);
tdep->sigcontext_addr = alpha_osf1_sigcontext_addr;
tdep->pc_in_sigtramp = alpha_osf1_pc_in_sigtramp;
tdep->jb_pc = 2;
tdep->jb_elt_size = 8;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_alpha_osf1_tdep;
void
_initialize_alpha_osf1_tdep (void)
{
gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_OSF1,
alpha_osf1_init_abi);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,121 +0,0 @@
/* Common target dependent code for GDB on Alpha systems.
Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2002, 2003, 2007,
2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef ALPHA_TDEP_H
#define ALPHA_TDEP_H
struct regcache;
/* Say how long (ordinary) registers are. This is a piece of bogosity
used in push_word and a few other places; register_size() is the
real way to know how big a register is. */
#define ALPHA_REGISTER_SIZE 8
/* Number of machine registers. */
#define ALPHA_NUM_REGS 67
/* Register numbers of various important registers. Note that most of
these values are "real" register numbers, and correspond to the
general registers of the machine. */
#define ALPHA_V0_REGNUM 0 /* Function integer return value */
#define ALPHA_T7_REGNUM 8 /* Return address register for OSF/1 __add* */
#define ALPHA_S0_REGNUM 9 /* First saved register */
#define ALPHA_GCC_FP_REGNUM 15 /* Used by gcc as frame register */
#define ALPHA_A0_REGNUM 16 /* Loc of first arg during a subr call */
#define ALPHA_T9_REGNUM 23 /* Return address register for OSF/1 __div* */
#define ALPHA_RA_REGNUM 26 /* Contains return address value */
#define ALPHA_T12_REGNUM 27 /* Contains start addr of current proc */
#define ALPHA_GP_REGNUM 29 /* Contains the global pointer */
#define ALPHA_SP_REGNUM 30 /* Contains address of top of stack */
#define ALPHA_ZERO_REGNUM 31 /* Read-only register, always 0 */
#define ALPHA_FP0_REGNUM 32 /* Floating point register 0 */
#define ALPHA_FPA0_REGNUM 48 /* First float arg during a subr call */
#define ALPHA_FPCR_REGNUM 63 /* Floating point control register */
#define ALPHA_PC_REGNUM 64 /* Contains program counter */
#define ALPHA_UNIQUE_REGNUM 66 /* PAL_rduniq value */
/* Instruction size. */
#define ALPHA_INSN_SIZE 4
/* The alpha has two different virtual pointers for arguments and locals.
The virtual argument pointer is pointing to the bottom of the argument
transfer area, which is located immediately below the virtual frame
pointer. Its size is fixed for the native compiler, it is either zero
(for the no arguments case) or large enough to hold all argument registers.
gcc uses a variable sized argument transfer area. As it has
to stay compatible with the native debugging tools it has to use the same
virtual argument pointer and adjust the argument offsets accordingly.
The virtual local pointer is localoff bytes below the virtual frame
pointer, the value of localoff is obtained from the PDR. */
#define ALPHA_NUM_ARG_REGS 6
/* Target-dependent structure in gdbarch. */
struct gdbarch_tdep
{
CORE_ADDR vm_min_address; /* Used by alpha_heuristic_proc_start. */
/* If PC is inside a dynamically-generated signal trampoline function
(i.e. one copied onto the user stack at run-time), return how many
bytes PC is beyond the start of that function. Otherwise, return -1. */
LONGEST (*dynamic_sigtramp_offset) (CORE_ADDR);
/* Translate a signal handler stack base address into the address of
the sigcontext structure for that signal handler. */
CORE_ADDR (*sigcontext_addr) (struct frame_info *);
/* Does the PC fall in a signal trampoline. */
/* NOTE: cagney/2004-04-30: Do not copy/clone this code. Instead
look at tramp-frame.h and other simplier per-architecture
sigtramp unwinders. */
int (*pc_in_sigtramp) (CORE_ADDR pc, char *name);
/* If TYPE will be returned in memory, return true. */
int (*return_in_memory) (struct type *type);
/* Offset of registers in `struct sigcontext'. */
int sc_pc_offset;
int sc_regs_offset;
int sc_fpregs_offset;
int jb_pc; /* Offset to PC value in jump buffer.
If htis is negative, longjmp support
will be disabled. */
size_t jb_elt_size; /* And the size of each entry in the buf. */
};
extern unsigned int alpha_read_insn (CORE_ADDR pc);
extern int alpha_software_single_step (struct frame_info *frame);
extern CORE_ADDR alpha_after_prologue (CORE_ADDR pc);
extern void alpha_mdebug_init_abi (struct gdbarch_info, struct gdbarch *);
extern void alpha_dwarf2_init_abi (struct gdbarch_info, struct gdbarch *);
extern void alpha_supply_int_regs (struct regcache *, int, const void *,
const void *, const void *);
extern void alpha_fill_int_regs (const struct regcache *, int,
void *, void *, void *);
extern void alpha_supply_fp_regs (struct regcache *, int,
const void *, const void *);
extern void alpha_fill_fp_regs (const struct regcache *,
int, void *, void *);
#endif /* ALPHA_TDEP_H */

View File

@@ -1,204 +0,0 @@
/* Native-dependent code for Alpha BSD's.
Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "inferior.h"
#include "regcache.h"
#include "alpha-tdep.h"
#include "alphabsd-tdep.h"
#include "inf-ptrace.h"
#include <sys/types.h>
#include <sys/ptrace.h>
#include <machine/reg.h>
#ifdef HAVE_SYS_PROCFS_H
#include <sys/procfs.h>
#endif
#ifndef HAVE_GREGSET_T
typedef struct reg gregset_t;
#endif
#ifndef HAVE_FPREGSET_T
typedef struct fpreg fpregset_t;
#endif
#include "gregset.h"
/* Provide *regset() wrappers around the generic Alpha BSD register
supply/fill routines. */
void
supply_gregset (struct regcache *regcache, const gregset_t *gregsetp)
{
alphabsd_supply_reg (regcache, (const char *) gregsetp, -1);
}
void
fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
{
alphabsd_fill_reg (regcache, (char *) gregsetp, regno);
}
void
supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
{
alphabsd_supply_fpreg (regcache, (const char *) fpregsetp, -1);
}
void
fill_fpregset (const struct regcache *regcache, fpregset_t *fpregsetp, int regno)
{
alphabsd_fill_fpreg (regcache, (char *) fpregsetp, regno);
}
/* Determine if PT_GETREGS fetches this register. */
static int
getregs_supplies (int regno)
{
return ((regno >= ALPHA_V0_REGNUM && regno <= ALPHA_ZERO_REGNUM)
|| regno >= ALPHA_PC_REGNUM);
}
/* Fetch register REGNO from the inferior. If REGNO is -1, do this
for all registers (including the floating point registers). */
static void
alphabsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{
if (regno == -1 || getregs_supplies (regno))
{
struct reg gregs;
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &gregs, 0) == -1)
perror_with_name (_("Couldn't get registers"));
alphabsd_supply_reg (regcache, (char *) &gregs, regno);
if (regno != -1)
return;
}
if (regno == -1 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
{
struct fpreg fpregs;
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
perror_with_name (_("Couldn't get floating point status"));
alphabsd_supply_fpreg (regcache, (char *) &fpregs, regno);
}
}
/* Store register REGNO back into the inferior. If REGNO is -1, do
this for all registers (including the floating point registers). */
static void
alphabsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{
if (regno == -1 || getregs_supplies (regno))
{
struct reg gregs;
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &gregs, 0) == -1)
perror_with_name (_("Couldn't get registers"));
alphabsd_fill_reg (regcache, (char *) &gregs, regno);
if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &gregs, 0) == -1)
perror_with_name (_("Couldn't write registers"));
if (regno != -1)
return;
}
if (regno == -1 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
{
struct fpreg fpregs;
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
perror_with_name (_("Couldn't get floating point status"));
alphabsd_fill_fpreg (regcache, (char *) &fpregs, regno);
if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
perror_with_name (_("Couldn't write floating point status"));
}
}
/* Support for debugging kernel virtual memory images. */
#include <sys/types.h>
#include <sys/signal.h>
#include <machine/pcb.h>
#include "bsd-kvm.h"
static int
alphabsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
{
int regnum;
/* The following is true for OpenBSD 3.9:
The pcb contains the register state at the context switch inside
cpu_switch(). */
/* The stack pointer shouldn't be zero. */
if (pcb->pcb_hw.apcb_ksp == 0)
return 0;
regcache_raw_supply (regcache, ALPHA_SP_REGNUM, &pcb->pcb_hw.apcb_ksp);
for (regnum = ALPHA_S0_REGNUM; regnum < ALPHA_A0_REGNUM; regnum++)
regcache_raw_supply (regcache, regnum,
&pcb->pcb_context[regnum - ALPHA_S0_REGNUM]);
regcache_raw_supply (regcache, ALPHA_RA_REGNUM, &pcb->pcb_context[7]);
return 1;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_alphabsd_nat (void);
void
_initialize_alphabsd_nat (void)
{
struct target_ops *t;
t = inf_ptrace_target ();
t->to_fetch_registers = alphabsd_fetch_inferior_registers;
t->to_store_registers = alphabsd_store_inferior_registers;
add_target (t);
/* Support debugging kernel virtual memory images. */
bsd_kvm_add_target (alphabsd_supply_pcb);
}

View File

@@ -1,56 +0,0 @@
/* Common target dependent code Alpha BSD's.
Copyright (C) 2000, 2001, 2002, 2006, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "regcache.h"
#include "alpha-tdep.h"
#include "alphabsd-tdep.h"
/* Conviently, GDB uses the same register numbering as the
ptrace register structure used by BSD on Alpha. */
void
alphabsd_supply_reg (struct regcache *regcache, const char *regs, int regno)
{
/* PC is at slot 32; UNIQUE not present. */
alpha_supply_int_regs (regcache, regno, regs, regs + 31 * 8, NULL);
}
void
alphabsd_fill_reg (const struct regcache *regcache, char *regs, int regno)
{
/* PC is at slot 32; UNIQUE not present. */
alpha_fill_int_regs (regcache, regno, regs, regs + 31 * 8, NULL);
}
void
alphabsd_supply_fpreg (struct regcache *regcache, const char *fpregs, int regno)
{
/* FPCR is at slot 33; slot 32 unused. */
alpha_supply_fp_regs (regcache, regno, fpregs, fpregs + 32 * 8);
}
void
alphabsd_fill_fpreg (const struct regcache *regcache, char *fpregs, int regno)
{
/* FPCR is at slot 33; slot 32 unused. */
alpha_fill_fp_regs (regcache, regno, fpregs, fpregs + 32 * 8);
}

View File

@@ -1,40 +0,0 @@
/* Common target dependent code for Alpha BSD's.
Copyright (C) 2002, 2006, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef ALPHABSD_TDEP_H
#define ALPHABSD_TDEP_H
struct regcache;
void alphabsd_supply_reg (struct regcache *, const char *, int);
void alphabsd_fill_reg (const struct regcache *, char *, int);
void alphabsd_supply_fpreg (struct regcache *, const char *, int);
void alphabsd_fill_fpreg (const struct regcache *, char *, int);
/* Functions exported from alphanbsd-tdep.c. */
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
extern const struct regset *
alphanbsd_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t len);
#endif /* alphabsd-tdep.h */

View File

@@ -1,127 +0,0 @@
/* Target-dependent code for FreeBSD/alpha.
Copyright (C) 2001, 2002, 2003, 2006, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "value.h"
#include "osabi.h"
#include "alpha-tdep.h"
#include "solib-svr4.h"
static int
alphafbsd_return_in_memory (struct type *type)
{
enum type_code code;
int i;
/* All aggregate types that won't fit in a register must be returned
in memory. */
if (TYPE_LENGTH (type) > ALPHA_REGISTER_SIZE)
return 1;
/* The only aggregate types that can be returned in a register are
structs and unions. Arrays must be returned in memory. */
code = TYPE_CODE (type);
if (code != TYPE_CODE_STRUCT && code != TYPE_CODE_UNION)
return 1;
/* We need to check if this struct/union is "integer" like. For
this to be true, the offset of each adressable subfield must be
zero. Note that bit fields are not addressable. */
for (i = 0; i < TYPE_NFIELDS (type); i++)
{
/* If the field bitsize is non-zero, it isn't adressable. */
if (TYPE_FIELD_BITPOS (type, i) != 0
&& TYPE_FIELD_BITSIZE (type, i) == 0)
return 1;
}
return 0;
}
/* Support for signal handlers. */
/* Return whether PC is in a BSD sigtramp routine. */
CORE_ADDR alphafbsd_sigtramp_start = 0x11ffff68;
CORE_ADDR alphafbsd_sigtramp_end = 0x11ffffe0;
static int
alphafbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
{
return (pc >= alphafbsd_sigtramp_start && pc < alphafbsd_sigtramp_end);
}
static LONGEST
alphafbsd_sigtramp_offset (CORE_ADDR pc)
{
return pc - alphafbsd_sigtramp_start;
}
/* Assuming THIS_FRAME is the frame of a BSD sigtramp routine,
return the address of the associated sigcontext structure. */
static CORE_ADDR
alphafbsd_sigcontext_addr (struct frame_info *this_frame)
{
return get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM) + 24;
}
/* FreeBSD 5.0-RELEASE or later. */
static void
alphafbsd_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
/* Hook into the DWARF CFI frame unwinder. */
alpha_dwarf2_init_abi (info, gdbarch);
/* Hook into the MDEBUG frame unwinder. */
alpha_mdebug_init_abi (info, gdbarch);
/* FreeBSD/alpha has SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
tdep->dynamic_sigtramp_offset = alphafbsd_sigtramp_offset;
tdep->sigcontext_addr = alphafbsd_sigcontext_addr;
tdep->pc_in_sigtramp = alphafbsd_pc_in_sigtramp;
tdep->return_in_memory = alphafbsd_return_in_memory;
tdep->sc_pc_offset = 288;
tdep->sc_regs_offset = 24;
tdep->sc_fpregs_offset = 320;
tdep->jb_pc = 2;
tdep->jb_elt_size = 8;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_alphafbsd_tdep (void);
void
_initialize_alphafbsd_tdep (void)
{
gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_FREEBSD_ELF,
alphafbsd_init_abi);
}

View File

@@ -1,316 +0,0 @@
/* Target-dependent code for NetBSD/alpha.
Copyright (C) 2002, 2003, 2004, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
Contributed by Wasabi Systems, 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "frame.h"
#include "gdbcore.h"
#include "osabi.h"
#include "regcache.h"
#include "regset.h"
#include "value.h"
#include "gdb_assert.h"
#include "gdb_string.h"
#include "alpha-tdep.h"
#include "alphabsd-tdep.h"
#include "nbsd-tdep.h"
#include "solib-svr4.h"
#include "target.h"
/* Core file support. */
/* Even though NetBSD/alpha used ELF since day one, it used the
traditional a.out-style core dump format before NetBSD 1.6. */
/* Sizeof `struct reg' in <machine/reg.h>. */
#define ALPHANBSD_SIZEOF_GREGS (32 * 8)
/* Sizeof `struct fpreg' in <machine/reg.h. */
#define ALPHANBSD_SIZEOF_FPREGS ((32 * 8) + 8)
/* Supply register REGNUM from the buffer specified by FPREGS and LEN
in the floating-point register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
alphanbsd_supply_fpregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *fpregs, size_t len)
{
const gdb_byte *regs = fpregs;
int i;
gdb_assert (len >= ALPHANBSD_SIZEOF_FPREGS);
for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; i++)
{
if (regnum == i || regnum == -1)
regcache_raw_supply (regcache, i, regs + (i - ALPHA_FP0_REGNUM) * 8);
}
if (regnum == ALPHA_FPCR_REGNUM || regnum == -1)
regcache_raw_supply (regcache, ALPHA_FPCR_REGNUM, regs + 32 * 8);
}
/* Supply register REGNUM from the buffer specified by GREGS and LEN
in the general-purpose register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
alphanbsd_supply_gregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *gregs, size_t len)
{
const gdb_byte *regs = gregs;
int i;
gdb_assert (len >= ALPHANBSD_SIZEOF_GREGS);
for (i = 0; i < ALPHA_ZERO_REGNUM; i++)
{
if (regnum == i || regnum == -1)
regcache_raw_supply (regcache, i, regs + i * 8);
}
if (regnum == ALPHA_PC_REGNUM || regnum == -1)
regcache_raw_supply (regcache, ALPHA_PC_REGNUM, regs + 31 * 8);
}
/* Supply register REGNUM from the buffer specified by GREGS and LEN
in the general-purpose register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
alphanbsd_aout_supply_gregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *gregs, size_t len)
{
const gdb_byte *regs = gregs;
int i;
/* Table to map a GDB register number to a trapframe register index. */
static const int regmap[] =
{
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15,
30, 31, 32, 16,
17, 18, 19, 20,
21, 22, 23, 24,
25, 29, 26
};
gdb_assert (len >= ALPHANBSD_SIZEOF_GREGS);
for (i = 0; i < ARRAY_SIZE(regmap); i++)
{
if (regnum == i || regnum == -1)
regcache_raw_supply (regcache, i, regs + regmap[i] * 8);
}
if (regnum == ALPHA_PC_REGNUM || regnum == -1)
regcache_raw_supply (regcache, ALPHA_PC_REGNUM, regs + 31 * 8);
if (len >= ALPHANBSD_SIZEOF_GREGS + ALPHANBSD_SIZEOF_FPREGS)
{
regs += ALPHANBSD_SIZEOF_GREGS;
len -= ALPHANBSD_SIZEOF_GREGS;
alphanbsd_supply_fpregset (regset, regcache, regnum, regs, len);
}
}
/* NetBSD/alpha register sets. */
static struct regset alphanbsd_gregset =
{
NULL,
alphanbsd_supply_gregset
};
static struct regset alphanbsd_fpregset =
{
NULL,
alphanbsd_supply_fpregset
};
static struct regset alphanbsd_aout_gregset =
{
NULL,
alphanbsd_aout_supply_gregset
};
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
const struct regset *
alphanbsd_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size)
{
if (strcmp (sect_name, ".reg") == 0 && sect_size >= ALPHANBSD_SIZEOF_GREGS)
{
if (sect_size >= ALPHANBSD_SIZEOF_GREGS + ALPHANBSD_SIZEOF_FPREGS)
return &alphanbsd_aout_gregset;
else
return &alphanbsd_gregset;
}
if (strcmp (sect_name, ".reg2") == 0 && sect_size >= ALPHANBSD_SIZEOF_FPREGS)
return &alphanbsd_fpregset;
return NULL;
}
/* Signal trampolines. */
/* Under NetBSD/alpha, signal handler invocations can be identified by the
designated code sequence that is used to return from a signal handler.
In particular, the return address of a signal handler points to the
following code sequence:
ldq a0, 0(sp)
lda sp, 16(sp)
lda v0, 295(zero) # __sigreturn14
call_pal callsys
Each instruction has a unique encoding, so we simply attempt to match
the instruction the PC is pointing to with any of the above instructions.
If there is a hit, we know the offset to the start of the designated
sequence and can then check whether we really are executing in the
signal trampoline. If not, -1 is returned, otherwise the offset from the
start of the return sequence is returned. */
static const unsigned char sigtramp_retcode[] =
{
0x00, 0x00, 0x1e, 0xa6, /* ldq a0, 0(sp) */
0x10, 0x00, 0xde, 0x23, /* lda sp, 16(sp) */
0x27, 0x01, 0x1f, 0x20, /* lda v0, 295(zero) */
0x83, 0x00, 0x00, 0x00, /* call_pal callsys */
};
#define RETCODE_NWORDS 4
#define RETCODE_SIZE (RETCODE_NWORDS * 4)
static LONGEST
alphanbsd_sigtramp_offset (CORE_ADDR pc)
{
unsigned char ret[RETCODE_SIZE], w[4];
LONGEST off;
int i;
if (target_read_memory (pc, (char *) w, 4) != 0)
return -1;
for (i = 0; i < RETCODE_NWORDS; i++)
{
if (memcmp (w, sigtramp_retcode + (i * 4), 4) == 0)
break;
}
if (i == RETCODE_NWORDS)
return (-1);
off = i * 4;
pc -= off;
if (target_read_memory (pc, (char *) ret, sizeof (ret)) != 0)
return -1;
if (memcmp (ret, sigtramp_retcode, RETCODE_SIZE) == 0)
return off;
return -1;
}
static int
alphanbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
{
return (nbsd_pc_in_sigtramp (pc, func_name)
|| alphanbsd_sigtramp_offset (pc) >= 0);
}
static CORE_ADDR
alphanbsd_sigcontext_addr (struct frame_info *frame)
{
/* FIXME: This is not correct for all versions of NetBSD/alpha.
We will probably need to disassemble the trampoline to figure
out which trampoline frame type we have. */
if (!get_next_frame (frame))
return 0;
return get_frame_base (get_next_frame (frame));
}
static void
alphanbsd_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
/* Hook into the DWARF CFI frame unwinder. */
alpha_dwarf2_init_abi (info, gdbarch);
/* Hook into the MDEBUG frame unwinder. */
alpha_mdebug_init_abi (info, gdbarch);
/* NetBSD/alpha does not provide single step support via ptrace(2); we
must use software single-stepping. */
set_gdbarch_software_single_step (gdbarch, alpha_software_single_step);
/* NetBSD/alpha has SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
tdep->dynamic_sigtramp_offset = alphanbsd_sigtramp_offset;
tdep->pc_in_sigtramp = alphanbsd_pc_in_sigtramp;
tdep->sigcontext_addr = alphanbsd_sigcontext_addr;
tdep->jb_pc = 2;
tdep->jb_elt_size = 8;
set_gdbarch_regset_from_core_section
(gdbarch, alphanbsd_regset_from_core_section);
}
static enum gdb_osabi
alphanbsd_core_osabi_sniffer (bfd *abfd)
{
if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
return GDB_OSABI_NETBSD_ELF;
return GDB_OSABI_UNKNOWN;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_alphanbsd_tdep (void);
void
_initialize_alphanbsd_tdep (void)
{
/* BFD doesn't set a flavour for NetBSD style a.out core files. */
gdbarch_register_osabi_sniffer (bfd_arch_alpha, bfd_target_unknown_flavour,
alphanbsd_core_osabi_sniffer);
gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_NETBSD_ELF,
alphanbsd_init_abi);
}

View File

@@ -1,135 +0,0 @@
/* Target-dependent code for OpenBSD/alpha.
Copyright (C) 2006, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "frame.h"
#include "gdbcore.h"
#include "osabi.h"
#include "obsd-tdep.h"
#include "alpha-tdep.h"
#include "alphabsd-tdep.h"
#include "solib-svr4.h"
/* Signal trampolines. */
/* The OpenBSD kernel maps the signal trampoline at some random
location in user space, which means that the traditional BSD way of
detecting it won't work.
The signal trampoline will be mapped at an address that is page
aligned. We recognize the signal trampoline by looking for the
sigreturn system call. */
static const int alphaobsd_page_size = 8192;
static LONGEST
alphaobsd_sigtramp_offset (CORE_ADDR pc)
{
return (pc & (alphaobsd_page_size - 1));
}
static int
alphaobsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
{
CORE_ADDR start_pc = (pc & ~(alphaobsd_page_size - 1));
unsigned insn;
if (name)
return 0;
/* Check for "". */
insn = alpha_read_insn (start_pc + 5 * ALPHA_INSN_SIZE);
if (insn != 0x201f0067)
return 0;
/* Check for "". */
insn = alpha_read_insn (start_pc + 6 * ALPHA_INSN_SIZE);
if (insn != 0x00000083)
return 0;
return 1;
}
static CORE_ADDR
alphaobsd_sigcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR pc = get_frame_pc (this_frame);
if (alphaobsd_sigtramp_offset (pc) < 3 * ALPHA_INSN_SIZE)
{
/* On entry, a pointer the `struct sigcontext' is passed in %a2. */
return get_frame_register_unsigned (this_frame, ALPHA_A0_REGNUM + 2);
}
else if (alphaobsd_sigtramp_offset (pc) < 4 * ALPHA_INSN_SIZE)
{
/* It is stored on the stack Before calling the signal handler. */
CORE_ADDR sp;
sp = get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM);
return get_frame_memory_unsigned (this_frame, sp, 8);
}
else
{
/* It is reloaded into %a0 for the sigreturn(2) call. */
return get_frame_register_unsigned (this_frame, ALPHA_A0_REGNUM);
}
}
static void
alphaobsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
/* Hook into the DWARF CFI frame unwinder. */
alpha_dwarf2_init_abi (info, gdbarch);
/* Hook into the MDEBUG frame unwinder. */
alpha_mdebug_init_abi (info, gdbarch);
/* OpenBSD/alpha 3.0 and earlier does not provide single step
support via ptrace(2); use software single-stepping for now. */
set_gdbarch_software_single_step (gdbarch, alpha_software_single_step);
/* OpenBSD/alpha has SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
set_gdbarch_skip_solib_resolver (gdbarch, obsd_skip_solib_resolver);
tdep->dynamic_sigtramp_offset = alphaobsd_sigtramp_offset;
tdep->pc_in_sigtramp = alphaobsd_pc_in_sigtramp;
tdep->sigcontext_addr = alphaobsd_sigcontext_addr;
tdep->jb_pc = 2;
tdep->jb_elt_size = 8;
set_gdbarch_regset_from_core_section
(gdbarch, alphanbsd_regset_from_core_section);
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_alphaobsd_tdep (void);
void
_initialize_alphaobsd_tdep (void)
{
gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_OPENBSD_ELF,
alphaobsd_init_abi);
}

View File

@@ -1,82 +0,0 @@
/* Target-dependent code for DICOS running on x86-64's, for GDB.
Copyright (C) 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "osabi.h"
#include "gdb_string.h"
#include "amd64-tdep.h"
#include "dicos-tdep.h"
static CORE_ADDR
amd64_dicos_push_dummy_code (struct gdbarch *gdbarch,
CORE_ADDR sp, CORE_ADDR funaddr,
struct value **args, int nargs,
struct type *value_type,
CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
struct regcache *regcache)
{
int bplen;
CORE_ADDR bppc = sp;
gdbarch_breakpoint_from_pc (gdbarch, &bppc, &bplen);
*bp_addr = sp - bplen;
*real_pc = funaddr;
return *bp_addr;
}
static void
amd64_dicos_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
amd64_init_abi (info, gdbarch);
dicos_init_abi (gdbarch);
set_gdbarch_push_dummy_code (gdbarch, amd64_dicos_push_dummy_code);
}
static enum gdb_osabi
amd64_dicos_osabi_sniffer (bfd *abfd)
{
char *target_name = bfd_get_target (abfd);
/* On amd64-DICOS, the Load Module's "header" section is 72
bytes. */
if (strcmp (target_name, "elf64-x86-64") == 0
&& dicos_load_module_p (abfd, 72))
return GDB_OSABI_DICOS;
return GDB_OSABI_UNKNOWN;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_amd64_dicos_tdep (void);
void
_initialize_amd64_dicos_tdep (void)
{
gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_elf_flavour,
amd64_dicos_osabi_sniffer);
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
GDB_OSABI_DICOS,
amd64_dicos_init_abi);
}

View File

@@ -1,689 +0,0 @@
/* Native-dependent code for GNU/Linux x86-64.
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
Contributed by Jiri Smid, SuSE Labs.
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "inferior.h"
#include "gdbcore.h"
#include "regcache.h"
#include "linux-nat.h"
#include "amd64-linux-tdep.h"
#include "gdb_assert.h"
#include "gdb_string.h"
#include <sys/ptrace.h>
#include <sys/debugreg.h>
#include <sys/syscall.h>
#include <sys/procfs.h>
#include <asm/prctl.h>
/* FIXME ezannoni-2003-07-09: we need <sys/reg.h> to be included after
<asm/ptrace.h> because the latter redefines FS and GS for no apparent
reason, and those definitions don't match the ones that libpthread_db
uses, which come from <sys/reg.h>. */
/* ezannoni-2003-07-09: I think this is fixed. The extraneous defs have
been removed from ptrace.h in the kernel. However, better safe than
sorry. */
#include <asm/ptrace.h>
#include <sys/reg.h>
#include "gdb_proc_service.h"
/* Prototypes for supply_gregset etc. */
#include "gregset.h"
#include "amd64-tdep.h"
#include "i386-linux-tdep.h"
#include "amd64-nat.h"
#include "i386-nat.h"
/* Mapping between the general-purpose registers in GNU/Linux x86-64
`struct user' format and GDB's register cache layout. */
static int amd64_linux_gregset64_reg_offset[] =
{
RAX * 8, RBX * 8, /* %rax, %rbx */
RCX * 8, RDX * 8, /* %rcx, %rdx */
RSI * 8, RDI * 8, /* %rsi, %rdi */
RBP * 8, RSP * 8, /* %rbp, %rsp */
R8 * 8, R9 * 8, /* %r8 ... */
R10 * 8, R11 * 8,
R12 * 8, R13 * 8,
R14 * 8, R15 * 8, /* ... %r15 */
RIP * 8, EFLAGS * 8, /* %rip, %eflags */
CS * 8, SS * 8, /* %cs, %ss */
DS * 8, ES * 8, /* %ds, %es */
FS * 8, GS * 8, /* %fs, %gs */
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1,
ORIG_RAX * 8
};
/* Mapping between the general-purpose registers in GNU/Linux x86-64
`struct user' format and GDB's register cache layout for GNU/Linux
i386.
Note that most GNU/Linux x86-64 registers are 64-bit, while the
GNU/Linux i386 registers are all 32-bit, but since we're
little-endian we get away with that. */
/* From <sys/reg.h> on GNU/Linux i386. */
static int amd64_linux_gregset32_reg_offset[] =
{
RAX * 8, RCX * 8, /* %eax, %ecx */
RDX * 8, RBX * 8, /* %edx, %ebx */
RSP * 8, RBP * 8, /* %esp, %ebp */
RSI * 8, RDI * 8, /* %esi, %edi */
RIP * 8, EFLAGS * 8, /* %eip, %eflags */
CS * 8, SS * 8, /* %cs, %ss */
DS * 8, ES * 8, /* %ds, %es */
FS * 8, GS * 8, /* %fs, %gs */
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1,
ORIG_RAX * 8 /* "orig_eax" */
};
/* Transfering the general-purpose registers between GDB, inferiors
and core files. */
/* Fill GDB's register cache with the general-purpose register values
in *GREGSETP. */
void
supply_gregset (struct regcache *regcache, const elf_gregset_t *gregsetp)
{
amd64_supply_native_gregset (regcache, gregsetp, -1);
}
/* Fill register REGNUM (if it is a general-purpose register) in
*GREGSETP with the value in GDB's register cache. If REGNUM is -1,
do this for all registers. */
void
fill_gregset (const struct regcache *regcache,
elf_gregset_t *gregsetp, int regnum)
{
amd64_collect_native_gregset (regcache, gregsetp, regnum);
}
/* Transfering floating-point registers between GDB, inferiors and cores. */
/* Fill GDB's register cache with the floating-point and SSE register
values in *FPREGSETP. */
void
supply_fpregset (struct regcache *regcache, const elf_fpregset_t *fpregsetp)
{
amd64_supply_fxsave (regcache, -1, fpregsetp);
}
/* Fill register REGNUM (if it is a floating-point or SSE register) in
*FPREGSETP with the value in GDB's register cache. If REGNUM is
-1, do this for all registers. */
void
fill_fpregset (const struct regcache *regcache,
elf_fpregset_t *fpregsetp, int regnum)
{
amd64_collect_fxsave (regcache, regnum, fpregsetp);
}
/* Transferring arbitrary registers between GDB and inferior. */
/* Fetch register REGNUM from the child process. If REGNUM is -1, do
this for all registers (including the floating point and SSE
registers). */
static void
amd64_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
int tid;
/* GNU/Linux LWP ID's are process ID's. */
tid = TIDGET (inferior_ptid);
if (tid == 0)
tid = PIDGET (inferior_ptid); /* Not a threaded program. */
if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
{
elf_gregset_t regs;
if (ptrace (PTRACE_GETREGS, tid, 0, (long) &regs) < 0)
perror_with_name (_("Couldn't get registers"));
amd64_supply_native_gregset (regcache, &regs, -1);
if (regnum != -1)
return;
}
if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
{
elf_fpregset_t fpregs;
if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
perror_with_name (_("Couldn't get floating point status"));
amd64_supply_fxsave (regcache, -1, &fpregs);
}
}
/* Store register REGNUM back into the child process. If REGNUM is
-1, do this for all registers (including the floating-point and SSE
registers). */
static void
amd64_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
int tid;
/* GNU/Linux LWP ID's are process ID's. */
tid = TIDGET (inferior_ptid);
if (tid == 0)
tid = PIDGET (inferior_ptid); /* Not a threaded program. */
if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
{
elf_gregset_t regs;
if (ptrace (PTRACE_GETREGS, tid, 0, (long) &regs) < 0)
perror_with_name (_("Couldn't get registers"));
amd64_collect_native_gregset (regcache, &regs, regnum);
if (ptrace (PTRACE_SETREGS, tid, 0, (long) &regs) < 0)
perror_with_name (_("Couldn't write registers"));
if (regnum != -1)
return;
}
if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
{
elf_fpregset_t fpregs;
if (ptrace (PTRACE_GETFPREGS, tid, 0, (long) &fpregs) < 0)
perror_with_name (_("Couldn't get floating point status"));
amd64_collect_fxsave (regcache, regnum, &fpregs);
if (ptrace (PTRACE_SETFPREGS, tid, 0, (long) &fpregs) < 0)
perror_with_name (_("Couldn't write floating point status"));
return;
}
}
/* Support for debug registers. */
static unsigned long amd64_linux_dr[DR_CONTROL + 1];
static unsigned long
amd64_linux_dr_get (ptid_t ptid, int regnum)
{
int tid;
unsigned long value;
tid = TIDGET (ptid);
if (tid == 0)
tid = PIDGET (ptid);
/* FIXME: kettenis/2001-03-27: Calling perror_with_name if the
ptrace call fails breaks debugging remote targets. The correct
way to fix this is to add the hardware breakpoint and watchpoint
stuff to the target vector. For now, just return zero if the
ptrace call fails. */
errno = 0;
value = ptrace (PTRACE_PEEKUSER, tid,
offsetof (struct user, u_debugreg[regnum]), 0);
if (errno != 0)
#if 0
perror_with_name (_("Couldn't read debug register"));
#else
return 0;
#endif
return value;
}
static void
amd64_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
{
int tid;
tid = TIDGET (ptid);
if (tid == 0)
tid = PIDGET (ptid);
errno = 0;
ptrace (PTRACE_POKEUSER, tid,
offsetof (struct user, u_debugreg[regnum]), value);
if (errno != 0)
perror_with_name (_("Couldn't write debug register"));
}
static void
amd64_linux_dr_set_control (unsigned long control)
{
struct lwp_info *lp;
ptid_t ptid;
amd64_linux_dr[DR_CONTROL] = control;
ALL_LWPS (lp, ptid)
amd64_linux_dr_set (ptid, DR_CONTROL, control);
}
static void
amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr)
{
struct lwp_info *lp;
ptid_t ptid;
gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
amd64_linux_dr[DR_FIRSTADDR + regnum] = addr;
ALL_LWPS (lp, ptid)
amd64_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr);
}
static void
amd64_linux_dr_reset_addr (int regnum)
{
amd64_linux_dr_set_addr (regnum, 0);
}
static unsigned long
amd64_linux_dr_get_status (void)
{
return amd64_linux_dr_get (inferior_ptid, DR_STATUS);
}
static void
amd64_linux_new_thread (ptid_t ptid)
{
int i;
for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
amd64_linux_dr_set (ptid, i, amd64_linux_dr[i]);
amd64_linux_dr_set (ptid, DR_CONTROL, amd64_linux_dr[DR_CONTROL]);
}
/* This function is called by libthread_db as part of its handling of
a request for a thread's local storage address. */
ps_err_e
ps_get_thread_area (const struct ps_prochandle *ph,
lwpid_t lwpid, int idx, void **base)
{
if (gdbarch_ptr_bit (target_gdbarch) == 32)
{
/* The full structure is found in <asm-i386/ldt.h>. The second
integer is the LDT's base_address and that is used to locate
the thread's local storage. See i386-linux-nat.c more
info. */
unsigned int desc[4];
/* This code assumes that "int" is 32 bits and that
GET_THREAD_AREA returns no more than 4 int values. */
gdb_assert (sizeof (int) == 4);
#ifndef PTRACE_GET_THREAD_AREA
#define PTRACE_GET_THREAD_AREA 25
#endif
if (ptrace (PTRACE_GET_THREAD_AREA,
lwpid, (void *) (long) idx, (unsigned long) &desc) < 0)
return PS_ERR;
/* Extend the value to 64 bits. Here it's assumed that a "long"
and a "void *" are the same. */
(*base) = (void *) (long) desc[1];
return PS_OK;
}
else
{
/* This definition comes from prctl.h, but some kernels may not
have it. */
#ifndef PTRACE_ARCH_PRCTL
#define PTRACE_ARCH_PRCTL 30
#endif
/* FIXME: ezannoni-2003-07-09 see comment above about include
file order. We could be getting bogus values for these two. */
gdb_assert (FS < ELF_NGREG);
gdb_assert (GS < ELF_NGREG);
switch (idx)
{
case FS:
if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0)
return PS_OK;
break;
case GS:
if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0)
return PS_OK;
break;
default: /* Should not happen. */
return PS_BADADDR;
}
}
return PS_ERR; /* ptrace failed. */
}
static void (*super_post_startup_inferior) (ptid_t ptid);
static void
amd64_linux_child_post_startup_inferior (ptid_t ptid)
{
i386_cleanup_dregs ();
super_post_startup_inferior (ptid);
}
/* When GDB is built as a 64-bit application on linux, the
PTRACE_GETSIGINFO data is always presented in 64-bit layout. Since
debugging a 32-bit inferior with a 64-bit GDB should look the same
as debugging it with a 32-bit GDB, we do the 32-bit <-> 64-bit
conversion in-place ourselves. */
/* These types below (compat_*) define a siginfo type that is layout
compatible with the siginfo type exported by the 32-bit userspace
support. */
typedef int compat_int_t;
typedef unsigned int compat_uptr_t;
typedef int compat_time_t;
typedef int compat_timer_t;
typedef int compat_clock_t;
struct compat_timeval
{
compat_time_t tv_sec;
int tv_usec;
};
typedef union compat_sigval
{
compat_int_t sival_int;
compat_uptr_t sival_ptr;
} compat_sigval_t;
typedef struct compat_siginfo
{
int si_signo;
int si_errno;
int si_code;
union
{
int _pad[((128 / sizeof (int)) - 3)];
/* kill() */
struct
{
unsigned int _pid;
unsigned int _uid;
} _kill;
/* POSIX.1b timers */
struct
{
compat_timer_t _tid;
int _overrun;
compat_sigval_t _sigval;
} _timer;
/* POSIX.1b signals */
struct
{
unsigned int _pid;
unsigned int _uid;
compat_sigval_t _sigval;
} _rt;
/* SIGCHLD */
struct
{
unsigned int _pid;
unsigned int _uid;
int _status;
compat_clock_t _utime;
compat_clock_t _stime;
} _sigchld;
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
struct
{
unsigned int _addr;
} _sigfault;
/* SIGPOLL */
struct
{
int _band;
int _fd;
} _sigpoll;
} _sifields;
} compat_siginfo_t;
#define cpt_si_pid _sifields._kill._pid
#define cpt_si_uid _sifields._kill._uid
#define cpt_si_timerid _sifields._timer._tid
#define cpt_si_overrun _sifields._timer._overrun
#define cpt_si_status _sifields._sigchld._status
#define cpt_si_utime _sifields._sigchld._utime
#define cpt_si_stime _sifields._sigchld._stime
#define cpt_si_ptr _sifields._rt._sigval.sival_ptr
#define cpt_si_addr _sifields._sigfault._addr
#define cpt_si_band _sifields._sigpoll._band
#define cpt_si_fd _sifields._sigpoll._fd
/* glibc at least up to 2.3.2 doesn't have si_timerid, si_overrun.
In their place is si_timer1,si_timer2. */
#ifndef si_timerid
#define si_timerid si_timer1
#endif
#ifndef si_overrun
#define si_overrun si_timer2
#endif
static void
compat_siginfo_from_siginfo (compat_siginfo_t *to, siginfo_t *from)
{
memset (to, 0, sizeof (*to));
to->si_signo = from->si_signo;
to->si_errno = from->si_errno;
to->si_code = from->si_code;
if (to->si_code < 0)
{
to->cpt_si_ptr = (intptr_t) from->si_ptr;
}
else if (to->si_code == SI_USER)
{
to->cpt_si_pid = from->si_pid;
to->cpt_si_uid = from->si_uid;
}
else if (to->si_code == SI_TIMER)
{
to->cpt_si_timerid = from->si_timerid;
to->cpt_si_overrun = from->si_overrun;
to->cpt_si_ptr = (intptr_t) from->si_ptr;
}
else
{
switch (to->si_signo)
{
case SIGCHLD:
to->cpt_si_pid = from->si_pid;
to->cpt_si_uid = from->si_uid;
to->cpt_si_status = from->si_status;
to->cpt_si_utime = from->si_utime;
to->cpt_si_stime = from->si_stime;
break;
case SIGILL:
case SIGFPE:
case SIGSEGV:
case SIGBUS:
to->cpt_si_addr = (intptr_t) from->si_addr;
break;
case SIGPOLL:
to->cpt_si_band = from->si_band;
to->cpt_si_fd = from->si_fd;
break;
default:
to->cpt_si_pid = from->si_pid;
to->cpt_si_uid = from->si_uid;
to->cpt_si_ptr = (intptr_t) from->si_ptr;
break;
}
}
}
static void
siginfo_from_compat_siginfo (siginfo_t *to, compat_siginfo_t *from)
{
memset (to, 0, sizeof (*to));
to->si_signo = from->si_signo;
to->si_errno = from->si_errno;
to->si_code = from->si_code;
if (to->si_code < 0)
{
to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
}
else if (to->si_code == SI_USER)
{
to->si_pid = from->cpt_si_pid;
to->si_uid = from->cpt_si_uid;
}
else if (to->si_code == SI_TIMER)
{
to->si_timerid = from->cpt_si_timerid;
to->si_overrun = from->cpt_si_overrun;
to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
}
else
{
switch (to->si_signo)
{
case SIGCHLD:
to->si_pid = from->cpt_si_pid;
to->si_uid = from->cpt_si_uid;
to->si_status = from->cpt_si_status;
to->si_utime = from->cpt_si_utime;
to->si_stime = from->cpt_si_stime;
break;
case SIGILL:
case SIGFPE:
case SIGSEGV:
case SIGBUS:
to->si_addr = (void *) (intptr_t) from->cpt_si_addr;
break;
case SIGPOLL:
to->si_band = from->cpt_si_band;
to->si_fd = from->cpt_si_fd;
break;
default:
to->si_pid = from->cpt_si_pid;
to->si_uid = from->cpt_si_uid;
to->si_ptr = (void* ) (intptr_t) from->cpt_si_ptr;
break;
}
}
}
/* Convert a native/host siginfo object, into/from the siginfo in the
layout of the inferiors' architecture. Returns true if any
conversion was done; false otherwise. If DIRECTION is 1, then copy
from INF to NATIVE. If DIRECTION is 0, copy from NATIVE to
INF. */
static int
amd64_linux_siginfo_fixup (struct siginfo *native, gdb_byte *inf, int direction)
{
/* Is the inferior 32-bit? If so, then do fixup the siginfo
object. */
if (gdbarch_addr_bit (get_frame_arch (get_current_frame ())) == 32)
{
gdb_assert (sizeof (struct siginfo) == sizeof (compat_siginfo_t));
if (direction == 0)
compat_siginfo_from_siginfo ((struct compat_siginfo *) inf, native);
else
siginfo_from_compat_siginfo (native, (struct compat_siginfo *) inf);
return 1;
}
else
return 0;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_amd64_linux_nat (void);
void
_initialize_amd64_linux_nat (void)
{
struct target_ops *t;
amd64_native_gregset32_reg_offset = amd64_linux_gregset32_reg_offset;
amd64_native_gregset32_num_regs = I386_LINUX_NUM_REGS;
amd64_native_gregset64_reg_offset = amd64_linux_gregset64_reg_offset;
amd64_native_gregset64_num_regs = AMD64_LINUX_NUM_REGS;
gdb_assert (ARRAY_SIZE (amd64_linux_gregset32_reg_offset)
== amd64_native_gregset32_num_regs);
gdb_assert (ARRAY_SIZE (amd64_linux_gregset64_reg_offset)
== amd64_native_gregset64_num_regs);
/* Fill in the generic GNU/Linux methods. */
t = linux_target ();
i386_use_watchpoints (t);
i386_dr_low.set_control = amd64_linux_dr_set_control;
i386_dr_low.set_addr = amd64_linux_dr_set_addr;
i386_dr_low.reset_addr = amd64_linux_dr_reset_addr;
i386_dr_low.get_status = amd64_linux_dr_get_status;
i386_set_debug_register_length (8);
/* Override the GNU/Linux inferior startup hook. */
super_post_startup_inferior = t->to_post_startup_inferior;
t->to_post_startup_inferior = amd64_linux_child_post_startup_inferior;
/* Add our register access methods. */
t->to_fetch_registers = amd64_linux_fetch_inferior_registers;
t->to_store_registers = amd64_linux_store_inferior_registers;
/* Register the target. */
linux_nat_add_target (t);
linux_nat_set_new_thread (t, amd64_linux_new_thread);
linux_nat_set_siginfo_fixup (t, amd64_linux_siginfo_fixup);
}

View File

@@ -1,313 +0,0 @@
/* Target-dependent code for GNU/Linux x86-64.
Copyright (C) 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
Contributed by Jiri Smid, SuSE Labs.
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "arch-utils.h"
#include "frame.h"
#include "gdbcore.h"
#include "regcache.h"
#include "osabi.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "reggroups.h"
#include "amd64-linux-tdep.h"
#include "linux-tdep.h"
#include "gdb_string.h"
#include "amd64-tdep.h"
#include "solib-svr4.h"
/* Mapping between the general-purpose registers in `struct user'
format and GDB's register cache layout. */
/* From <sys/reg.h>. */
static int amd64_linux_gregset_reg_offset[] =
{
10 * 8, /* %rax */
5 * 8, /* %rbx */
11 * 8, /* %rcx */
12 * 8, /* %rdx */
13 * 8, /* %rsi */
14 * 8, /* %rdi */
4 * 8, /* %rbp */
19 * 8, /* %rsp */
9 * 8, /* %r8 ... */
8 * 8,
7 * 8,
6 * 8,
3 * 8,
2 * 8,
1 * 8,
0 * 8, /* ... %r15 */
16 * 8, /* %rip */
18 * 8, /* %eflags */
17 * 8, /* %cs */
20 * 8, /* %ss */
23 * 8, /* %ds */
24 * 8, /* %es */
25 * 8, /* %fs */
26 * 8 /* %gs */
};
/* Support for signal handlers. */
#define LINUX_SIGTRAMP_INSN0 0x48 /* mov $NNNNNNNN, %rax */
#define LINUX_SIGTRAMP_OFFSET0 0
#define LINUX_SIGTRAMP_INSN1 0x0f /* syscall */
#define LINUX_SIGTRAMP_OFFSET1 7
static const gdb_byte linux_sigtramp_code[] =
{
/* mov $__NR_rt_sigreturn, %rax */
LINUX_SIGTRAMP_INSN0, 0xc7, 0xc0, 0x0f, 0x00, 0x00, 0x00,
/* syscall */
LINUX_SIGTRAMP_INSN1, 0x05
};
#define LINUX_SIGTRAMP_LEN (sizeof linux_sigtramp_code)
/* If PC is in a sigtramp routine, return the address of the start of
the routine. Otherwise, return 0. */
static CORE_ADDR
amd64_linux_sigtramp_start (struct frame_info *this_frame)
{
CORE_ADDR pc = get_frame_pc (this_frame);
gdb_byte buf[LINUX_SIGTRAMP_LEN];
/* We only recognize a signal trampoline if PC is at the start of
one of the two instructions. We optimize for finding the PC at
the start, as will be the case when the trampoline is not the
first frame on the stack. We assume that in the case where the
PC is not at the start of the instruction sequence, there will be
a few trailing readable bytes on the stack. */
if (!safe_frame_unwind_memory (this_frame, pc, buf, sizeof buf))
return 0;
if (buf[0] != LINUX_SIGTRAMP_INSN0)
{
if (buf[0] != LINUX_SIGTRAMP_INSN1)
return 0;
pc -= LINUX_SIGTRAMP_OFFSET1;
if (!safe_frame_unwind_memory (this_frame, pc, buf, sizeof buf))
return 0;
}
if (memcmp (buf, linux_sigtramp_code, LINUX_SIGTRAMP_LEN) != 0)
return 0;
return pc;
}
/* Return whether THIS_FRAME corresponds to a GNU/Linux sigtramp
routine. */
static int
amd64_linux_sigtramp_p (struct frame_info *this_frame)
{
CORE_ADDR pc = get_frame_pc (this_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
/* If we have NAME, we can optimize the search. The trampoline is
named __restore_rt. However, it isn't dynamically exported from
the shared C library, so the trampoline may appear to be part of
the preceding function. This should always be sigaction,
__sigaction, or __libc_sigaction (all aliases to the same
function). */
if (name == NULL || strstr (name, "sigaction") != NULL)
return (amd64_linux_sigtramp_start (this_frame) != 0);
return (strcmp ("__restore_rt", name) == 0);
}
/* Offset to struct sigcontext in ucontext, from <asm/ucontext.h>. */
#define AMD64_LINUX_UCONTEXT_SIGCONTEXT_OFFSET 40
/* Assuming THIS_FRAME is a GNU/Linux sigtramp routine, return the
address of the associated sigcontext structure. */
static CORE_ADDR
amd64_linux_sigcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR sp;
gdb_byte buf[8];
get_frame_register (this_frame, AMD64_RSP_REGNUM, buf);
sp = extract_unsigned_integer (buf, 8);
/* The sigcontext structure is part of the user context. A pointer
to the user context is passed as the third argument to the signal
handler, i.e. in %rdx. Unfortunately %rdx isn't preserved across
function calls so we can't use it. Fortunately the user context
is part of the signal frame and the unwound %rsp directly points
at it. */
return sp + AMD64_LINUX_UCONTEXT_SIGCONTEXT_OFFSET;
}
/* From <asm/sigcontext.h>. */
static int amd64_linux_sc_reg_offset[] =
{
13 * 8, /* %rax */
11 * 8, /* %rbx */
14 * 8, /* %rcx */
12 * 8, /* %rdx */
9 * 8, /* %rsi */
8 * 8, /* %rdi */
10 * 8, /* %rbp */
15 * 8, /* %rsp */
0 * 8, /* %r8 */
1 * 8, /* %r9 */
2 * 8, /* %r10 */
3 * 8, /* %r11 */
4 * 8, /* %r12 */
5 * 8, /* %r13 */
6 * 8, /* %r14 */
7 * 8, /* %r15 */
16 * 8, /* %rip */
17 * 8, /* %eflags */
/* FIXME: kettenis/2002030531: The registers %cs, %fs and %gs are
available in `struct sigcontext'. However, they only occupy two
bytes instead of four, which makes using them here rather
difficult. Leave them out for now. */
-1, /* %cs */
-1, /* %ss */
-1, /* %ds */
-1, /* %es */
-1, /* %fs */
-1 /* %gs */
};
/* Replacement register functions which know about %orig_rax. */
static const char *
amd64_linux_register_name (struct gdbarch *gdbarch, int reg)
{
if (reg == AMD64_LINUX_ORIG_RAX_REGNUM)
return "orig_rax";
return amd64_register_name (gdbarch, reg);
}
static struct type *
amd64_linux_register_type (struct gdbarch *gdbarch, int reg)
{
if (reg == AMD64_LINUX_ORIG_RAX_REGNUM)
return builtin_type_int64;
return amd64_register_type (gdbarch, reg);
}
static int
amd64_linux_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
struct reggroup *group)
{
if (regnum == AMD64_LINUX_ORIG_RAX_REGNUM)
return (group == system_reggroup
|| group == save_reggroup
|| group == restore_reggroup);
return default_register_reggroup_p (gdbarch, regnum, group);
}
/* Set the program counter for process PTID to PC. */
static void
amd64_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
{
regcache_cooked_write_unsigned (regcache, AMD64_RIP_REGNUM, pc);
/* We must be careful with modifying the program counter. If we
just interrupted a system call, the kernel might try to restart
it when we resume the inferior. On restarting the system call,
the kernel will try backing up the program counter even though it
no longer points at the system call. This typically results in a
SIGSEGV or SIGILL. We can prevent this by writing `-1' in the
"orig_rax" pseudo-register.
Note that "orig_rax" is saved when setting up a dummy call frame.
This means that it is properly restored when that frame is
popped, and that the interrupted system call will be restarted
when we resume the inferior on return from a function call from
within GDB. In all other cases the system call will not be
restarted. */
regcache_cooked_write_unsigned (regcache, AMD64_LINUX_ORIG_RAX_REGNUM, -1);
}
static void
amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->gregset_reg_offset = amd64_linux_gregset_reg_offset;
tdep->gregset_num_regs = ARRAY_SIZE (amd64_linux_gregset_reg_offset);
tdep->sizeof_gregset = 27 * 8;
amd64_init_abi (info, gdbarch);
tdep->sigtramp_p = amd64_linux_sigtramp_p;
tdep->sigcontext_addr = amd64_linux_sigcontext_addr;
tdep->sc_reg_offset = amd64_linux_sc_reg_offset;
tdep->sc_num_regs = ARRAY_SIZE (amd64_linux_sc_reg_offset);
/* GNU/Linux uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
/* Add the %orig_rax register used for syscall restarting. */
set_gdbarch_write_pc (gdbarch, amd64_linux_write_pc);
set_gdbarch_num_regs (gdbarch, AMD64_LINUX_NUM_REGS);
set_gdbarch_register_name (gdbarch, amd64_linux_register_name);
set_gdbarch_register_type (gdbarch, amd64_linux_register_type);
set_gdbarch_register_reggroup_p (gdbarch, amd64_linux_register_reggroup_p);
/* Enable TLS support. */
set_gdbarch_fetch_tls_load_module_address (gdbarch,
svr4_fetch_objfile_link_map);
/* Displaced stepping. */
set_gdbarch_displaced_step_copy_insn (gdbarch,
amd64_displaced_step_copy_insn);
set_gdbarch_displaced_step_fixup (gdbarch, amd64_displaced_step_fixup);
set_gdbarch_displaced_step_free_closure (gdbarch,
simple_displaced_step_free_closure);
set_gdbarch_displaced_step_location (gdbarch,
displaced_step_at_entry_point);
set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type);
}
/* Provide a prototype to silence -Wmissing-prototypes. */
extern void _initialize_amd64_linux_tdep (void);
void
_initialize_amd64_linux_tdep (void)
{
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
GDB_OSABI_LINUX, amd64_linux_init_abi);
}

View File

@@ -1,34 +0,0 @@
/* Target-dependent code for GNU/Linux AMD64.
Copyright (C) 2006, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef AMD64_LINUX_TDEP_H
#define AMD64_LINUX_TDEP_H
/* Like for i386 GNU/Linux, there is an extra "register"
used to control syscall restarting. */
/* Register number for the "orig_rax" register. If this register
contains a value >= 0 it is interpreted as the system call number
that the kernel is supposed to restart. */
#define AMD64_LINUX_ORIG_RAX_REGNUM (AMD64_MXCSR_REGNUM + 1)
/* Total number of registers for GNU/Linux. */
#define AMD64_LINUX_NUM_REGS (AMD64_LINUX_ORIG_RAX_REGNUM + 1)
#endif /* amd64-linux-tdep.h */

View File

@@ -1,162 +0,0 @@
/* Native-dependent code for AMD64.
Copyright (C) 2003, 2004, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "gdbarch.h"
#include "regcache.h"
#include "gdb_assert.h"
#include "gdb_string.h"
#include "i386-tdep.h"
#include "amd64-tdep.h"
#include "amd64-nat.h"
/* The following bits of code help with implementing debugging 32-bit
code natively on AMD64. The idea is to define two mappings between
the register number as used by GDB and the register set used by the
host to represent the general-purpose registers; one for 32-bit
code and one for 64-bit code. The mappings are specified by the
follwing variables and consist of an array of offsets within the
register set indexed by register number, and the number of
registers supported by the mapping. We don't need mappings for the
floating-point and SSE registers, since the difference between
64-bit and 32-bit variants are negligable. The difference in the
number of SSE registers is already handled by the target code. */
/* General-purpose register mapping for native 32-bit code. */
int *amd64_native_gregset32_reg_offset;
int amd64_native_gregset32_num_regs = I386_NUM_GREGS;
/* General-purpose register mapping for native 64-bit code. */
int *amd64_native_gregset64_reg_offset;
int amd64_native_gregset64_num_regs = AMD64_NUM_GREGS;
/* Return the offset of REGNUM within the appropriate native
general-purpose register set. */
static int
amd64_native_gregset_reg_offset (struct gdbarch *gdbarch, int regnum)
{
int *reg_offset = amd64_native_gregset64_reg_offset;
int num_regs = amd64_native_gregset64_num_regs;
gdb_assert (regnum >= 0);
if (gdbarch_ptr_bit (gdbarch) == 32)
{
reg_offset = amd64_native_gregset32_reg_offset;
num_regs = amd64_native_gregset32_num_regs;
}
if (num_regs > gdbarch_num_regs (gdbarch))
num_regs = gdbarch_num_regs (gdbarch);
if (regnum < num_regs && regnum < gdbarch_num_regs (gdbarch))
return reg_offset[regnum];
return -1;
}
/* Return whether the native general-purpose register set supplies
register REGNUM. */
int
amd64_native_gregset_supplies_p (struct gdbarch *gdbarch, int regnum)
{
return (amd64_native_gregset_reg_offset (gdbarch, regnum) != -1);
}
/* Supply register REGNUM, whose contents are stored in GREGS, to
REGCACHE. If REGNUM is -1, supply all appropriate registers. */
void
amd64_supply_native_gregset (struct regcache *regcache,
const void *gregs, int regnum)
{
const char *regs = gregs;
struct gdbarch *gdbarch = get_regcache_arch (regcache);
int num_regs = amd64_native_gregset64_num_regs;
int i;
if (gdbarch_ptr_bit (gdbarch) == 32)
num_regs = amd64_native_gregset32_num_regs;
if (num_regs > gdbarch_num_regs (gdbarch))
num_regs = gdbarch_num_regs (gdbarch);
for (i = 0; i < num_regs; i++)
{
if (regnum == -1 || regnum == i)
{
int offset = amd64_native_gregset_reg_offset (gdbarch, i);
if (offset != -1)
regcache_raw_supply (regcache, i, regs + offset);
}
}
}
/* Collect register REGNUM from REGCACHE and store its contents in
GREGS. If REGNUM is -1, collect and store all appropriate
registers. */
void
amd64_collect_native_gregset (const struct regcache *regcache,
void *gregs, int regnum)
{
char *regs = gregs;
struct gdbarch *gdbarch = get_regcache_arch (regcache);
int num_regs = amd64_native_gregset64_num_regs;
int i;
if (gdbarch_ptr_bit (gdbarch) == 32)
{
num_regs = amd64_native_gregset32_num_regs;
/* Make sure %eax, %ebx, %ecx, %edx, %esi, %edi, %ebp, %esp and
%eip get zero-extended to 64 bits. */
for (i = 0; i <= I386_EIP_REGNUM; i++)
{
if (regnum == -1 || regnum == i)
memset (regs + amd64_native_gregset_reg_offset (gdbarch, i), 0, 8);
}
/* Ditto for %cs, %ss, %ds, %es, %fs, and %gs. */
for (i = I386_CS_REGNUM; i <= I386_GS_REGNUM; i++)
{
if (regnum == -1 || regnum == i)
memset (regs + amd64_native_gregset_reg_offset (gdbarch, i), 0, 8);
}
}
if (num_regs > gdbarch_num_regs (gdbarch))
num_regs = gdbarch_num_regs (gdbarch);
for (i = 0; i < num_regs; i++)
{
if (regnum == -1 || regnum == i)
{
int offset = amd64_native_gregset_reg_offset (gdbarch, i);
if (offset != -1)
regcache_raw_collect (regcache, i, regs + offset);
}
}
}

View File

@@ -1,57 +0,0 @@
/* Native-dependent code for AMD64.
Copyright (C) 2003, 2004, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef AMD64_NAT_H
#define AMD64_NAT_H 1
struct regcache;
/* General-purpose register set description for native 32-bit code. */
extern int *amd64_native_gregset32_reg_offset;
extern int amd64_native_gregset32_num_regs;
/* General-purpose register set description for native 64-bit code. */
extern int *amd64_native_gregset64_reg_offset;
extern int amd64_native_gregset64_num_regs;
/* Return whether the native general-purpose register set supplies
register REGNUM. */
extern int amd64_native_gregset_supplies_p (struct gdbarch *gdbarch,
int regnum);
/* Supply register REGNUM, whose contents are store in BUF, to
REGCACHE. If REGNUM is -1, supply all appropriate registers. */
extern void amd64_supply_native_gregset (struct regcache *regcache,
const void *gregs, int regnum);
/* Collect register REGNUM from REGCACHE and store its contents in
GREGS. If REGNUM is -1, collect and store all appropriate
registers. */
extern void amd64_collect_native_gregset (const struct regcache *regcache,
void *gregs, int regnum);
/* Create a prototype *BSD/amd64 target. The client can override it
with local methods. */
extern struct target_ops *amd64bsd_target (void);
#endif /* amd64-nat.h */

View File

@@ -1,134 +0,0 @@
/* Target-dependent code for AMD64 Solaris.
Copyright (C) 2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
Contributed by Joseph Myers, CodeSourcery, LLC.
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "frame.h"
#include "gdbcore.h"
#include "regcache.h"
#include "osabi.h"
#include "symtab.h"
#include "gdb_string.h"
#include "sol2-tdep.h"
#include "amd64-tdep.h"
#include "solib-svr4.h"
/* Mapping between the general-purpose registers in gregset_t format
and GDB's register cache layout. */
/* From <sys/regset.h>. */
static int amd64_sol2_gregset_reg_offset[] = {
14 * 8, /* %rax */
11 * 8, /* %rbx */
13 * 8, /* %rcx */
12 * 8, /* %rdx */
9 * 8, /* %rsi */
8 * 8, /* %rdi */
10 * 8, /* %rbp */
20 * 8, /* %rsp */
7 * 8, /* %r8 ... */
6 * 8,
5 * 8,
4 * 8,
3 * 8,
2 * 8,
1 * 8,
0 * 8, /* ... %r15 */
17 * 8, /* %rip */
16 * 8, /* %eflags */
18 * 8, /* %cs */
21 * 8, /* %ss */
25 * 8, /* %ds */
24 * 8, /* %es */
22 * 8, /* %fs */
23 * 8 /* %gs */
};
/* Return whether THIS_FRAME corresponds to a Solaris sigtramp
routine. */
static int
amd64_sol2_sigtramp_p (struct frame_info *this_frame)
{
CORE_ADDR pc = get_frame_pc (this_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
return (name && (strcmp ("sigacthandler", name) == 0
|| strcmp (name, "ucbsigvechandler") == 0));
}
/* Solaris doesn't have a 'struct sigcontext', but it does have a
'mcontext_t' that contains the saved set of machine registers. */
static CORE_ADDR
amd64_sol2_mcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR sp, ucontext_addr;
sp = get_frame_register_unsigned (this_frame, AMD64_RSP_REGNUM);
ucontext_addr = get_frame_memory_unsigned (this_frame, sp + 8, 8);
return ucontext_addr + 72;
}
static void
amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->gregset_reg_offset = amd64_sol2_gregset_reg_offset;
tdep->gregset_num_regs = ARRAY_SIZE (amd64_sol2_gregset_reg_offset);
tdep->sizeof_gregset = 28 * 8;
amd64_init_abi (info, gdbarch);
tdep->sigtramp_p = amd64_sol2_sigtramp_p;
tdep->sigcontext_addr = amd64_sol2_mcontext_addr;
tdep->sc_reg_offset = tdep->gregset_reg_offset;
tdep->sc_num_regs = tdep->gregset_num_regs;
/* Solaris uses SVR4-style shared libraries. */
set_gdbarch_skip_solib_resolver (gdbarch, sol2_skip_solib_resolver);
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
/* Solaris encodes the pid of the inferior in regset section
names. */
set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1);
/* How to print LWP PTIDs from core files. */
set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str);
}
/* Provide a prototype to silence -Wmissing-prototypes. */
extern void _initialize_amd64_sol2_tdep (void);
void
_initialize_amd64_sol2_tdep (void)
{
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
GDB_OSABI_SOLARIS, amd64_sol2_init_abi);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,114 +0,0 @@
/* Target-dependent definitions for AMD64.
Copyright (C) 2001, 2003, 2004, 2007, 2008, 2009
Free Software Foundation, Inc.
Contributed by Jiri Smid, SuSE Labs.
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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef AMD64_TDEP_H
#define AMD64_TDEP_H
struct gdbarch;
struct frame_info;
struct regcache;
#include "i386-tdep.h"
/* Register numbers of various important registers. */
enum amd64_regnum
{
AMD64_RAX_REGNUM, /* %rax */
AMD64_RBX_REGNUM, /* %rbx */
AMD64_RCX_REGNUM, /* %rcx */
AMD64_RDX_REGNUM, /* %rdx */
AMD64_RSI_REGNUM, /* %rsi */
AMD64_RDI_REGNUM, /* %rdi */
AMD64_RBP_REGNUM, /* %rbp */
AMD64_RSP_REGNUM, /* %rsp */
AMD64_R8_REGNUM, /* %r8 */
AMD64_R9_REGNUM, /* %r9 */
AMD64_R10_REGNUM, /* %r10 */
AMD64_R11_REGNUM, /* %r11 */
AMD64_R12_REGNUM, /* %r12 */
AMD64_R13_REGNUM, /* %r13 */
AMD64_R14_REGNUM, /* %r14 */
AMD64_R15_REGNUM, /* %r15 */
AMD64_RIP_REGNUM, /* %rip */
AMD64_EFLAGS_REGNUM, /* %eflags */
AMD64_CS_REGNUM, /* %cs */
AMD64_SS_REGNUM, /* %ss */
AMD64_DS_REGNUM, /* %ds */
AMD64_ES_REGNUM, /* %es */
AMD64_FS_REGNUM, /* %fs */
AMD64_GS_REGNUM, /* %gs */
AMD64_ST0_REGNUM = 24, /* %st0 */
AMD64_FCTRL_REGNUM = AMD64_ST0_REGNUM + 8,
AMD64_FSTAT_REGNUM = AMD64_ST0_REGNUM + 9,
AMD64_XMM0_REGNUM = 40, /* %xmm0 */
AMD64_XMM1_REGNUM, /* %xmm1 */
AMD64_MXCSR_REGNUM = AMD64_XMM0_REGNUM + 16
};
/* Number of general purpose registers. */
#define AMD64_NUM_GREGS 24
extern struct displaced_step_closure *amd64_displaced_step_copy_insn
(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to,
struct regcache *regs);
extern void amd64_displaced_step_fixup (struct gdbarch *gdbarch,
struct displaced_step_closure *closure,
CORE_ADDR from, CORE_ADDR to,
struct regcache *regs);
extern void amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
/* Functions from amd64-tdep.c which may be needed on architectures
with extra registers. */
extern const char *amd64_register_name (struct gdbarch *gdbarch, int regnum);
extern struct type *amd64_register_type (struct gdbarch *gdbarch, int regnum);
/* Fill register REGNUM in REGCACHE with the appropriate
floating-point or SSE register value from *FXSAVE. If REGNUM is
-1, do this for all registers. This function masks off any of the
reserved bits in *FXSAVE. */
extern void amd64_supply_fxsave (struct regcache *regcache, int regnum,
const void *fxsave);
/* Fill register REGNUM (if it is a floating-point or SSE register) in
*FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
all registers. This function doesn't touch any of the reserved
bits in *FXSAVE. */
extern void amd64_collect_fxsave (const struct regcache *regcache, int regnum,
void *fxsave);
/* Variables exported from amd64nbsd-tdep.c. */
extern int amd64nbsd_r_reg_offset[];
/* Variables exported from amd64obsd-tdep.c. */
extern int amd64obsd_r_reg_offset[];
/* Variables exported from amd64fbsd-tdep.c. */
extern CORE_ADDR amd64fbsd_sigtramp_start_addr;
extern CORE_ADDR amd64fbsd_sigtramp_end_addr;
extern int amd64fbsd_sc_reg_offset[];
#endif /* amd64-tdep.h */

View File

@@ -1,93 +0,0 @@
/* Copyright (C) 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "windows-nat.h"
#include "i386-nat.h"
#include <windows.h>
#define context_offset(x) (offsetof (CONTEXT, x))
static const int mappings[] =
{
context_offset (Rax),
context_offset (Rbx),
context_offset (Rcx),
context_offset (Rdx),
context_offset (Rsi),
context_offset (Rdi),
context_offset (Rbp),
context_offset (Rsp),
context_offset (R8),
context_offset (R9),
context_offset (R10),
context_offset (R11),
context_offset (R12),
context_offset (R13),
context_offset (R14),
context_offset (R15),
context_offset (Rip),
context_offset (EFlags),
context_offset (SegCs),
context_offset (SegSs),
context_offset (SegDs),
context_offset (SegEs),
context_offset (SegFs),
context_offset (SegGs),
context_offset (FloatSave.FloatRegisters[0]),
context_offset (FloatSave.FloatRegisters[1]),
context_offset (FloatSave.FloatRegisters[2]),
context_offset (FloatSave.FloatRegisters[3]),
context_offset (FloatSave.FloatRegisters[4]),
context_offset (FloatSave.FloatRegisters[5]),
context_offset (FloatSave.FloatRegisters[6]),
context_offset (FloatSave.FloatRegisters[7]),
context_offset (FloatSave.ControlWord),
context_offset (FloatSave.StatusWord),
context_offset (FloatSave.TagWord),
context_offset (FloatSave.ErrorSelector),
context_offset (FloatSave.ErrorOffset),
context_offset (FloatSave.DataSelector),
context_offset (FloatSave.DataOffset),
context_offset (FloatSave.ErrorSelector)
/* XMM0-7 */ ,
context_offset (Xmm0),
context_offset (Xmm1),
context_offset (Xmm2),
context_offset (Xmm3),
context_offset (Xmm4),
context_offset (Xmm5),
context_offset (Xmm6),
context_offset (Xmm7),
context_offset (Xmm8),
context_offset (Xmm9),
context_offset (Xmm10),
context_offset (Xmm11),
context_offset (Xmm12),
context_offset (Xmm13),
context_offset (Xmm14),
context_offset (Xmm15),
/* MXCSR */
context_offset (FloatSave.MxCsr)
};
#undef context_offset
void
_initialize_amd64_windows_nat (void)
{
windows_set_context_register_offsets (mappings);
i386_set_debug_register_length (8);
}

View File

@@ -1,41 +0,0 @@
/* Copyright (C) 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "osabi.h"
#include "amd64-tdep.h"
#include "solib.h"
#include "solib-target.h"
static void
amd64_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
amd64_init_abi (info, gdbarch);
/* On Windows, "long"s are only 32bit. */
set_gdbarch_long_bit (gdbarch, 32);
set_solib_ops (gdbarch, &solib_target_so_ops);
}
void
_initialize_amd64_windows_tdep (void)
{
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64, GDB_OSABI_CYGWIN,
amd64_windows_init_abi);
}

View File

@@ -1,127 +0,0 @@
/* Native-dependent code for AMD64 BSD's.
Copyright (C) 2003, 2004, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "inferior.h"
#include "regcache.h"
#include "target.h"
/* We include <signal.h> to make sure `struct fxsave64' is defined on
NetBSD, since NetBSD's <machine/reg.h> needs it. */
#include "gdb_assert.h"
#include <signal.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <machine/reg.h>
#include "amd64-tdep.h"
#include "amd64-nat.h"
#include "inf-ptrace.h"
/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
for all registers (including the floating-point registers). */
static void
amd64bsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
{
struct reg regs;
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name (_("Couldn't get registers"));
amd64_supply_native_gregset (regcache, &regs, -1);
if (regnum != -1)
return;
}
if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
{
struct fpreg fpregs;
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
perror_with_name (_("Couldn't get floating point status"));
amd64_supply_fxsave (regcache, -1, &fpregs);
}
}
/* Store register REGNUM back into the inferior. If REGNUM is -1, do
this for all registers (including the floating-point registers). */
static void
amd64bsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum))
{
struct reg regs;
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name (_("Couldn't get registers"));
amd64_collect_native_gregset (regcache, &regs, regnum);
if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name (_("Couldn't write registers"));
if (regnum != -1)
return;
}
if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum))
{
struct fpreg fpregs;
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
perror_with_name (_("Couldn't get floating point status"));
amd64_collect_fxsave (regcache, regnum, &fpregs);
if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
perror_with_name (_("Couldn't write floating point status"));
}
}
/* Create a prototype *BSD/amd64 target. The client can override it
with local methods. */
struct target_ops *
amd64bsd_target (void)
{
struct target_ops *t;
t = inf_ptrace_target ();
t->to_fetch_registers = amd64bsd_fetch_inferior_registers;
t->to_store_registers = amd64bsd_store_inferior_registers;
return t;
}

View File

@@ -1,233 +0,0 @@
/* Native-dependent code for FreeBSD/amd64.
Copyright (C) 2003, 2004, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "inferior.h"
#include "regcache.h"
#include "target.h"
#include "gdb_assert.h"
#include <signal.h>
#include <stddef.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/sysctl.h>
#include <machine/reg.h>
#include "fbsd-nat.h"
#include "amd64-tdep.h"
#include "amd64-nat.h"
/* Offset in `struct reg' where MEMBER is stored. */
#define REG_OFFSET(member) offsetof (struct reg, member)
/* At amd64fbsd64_r_reg_offset[REGNUM] you'll find the offset in
`struct reg' location where the GDB register REGNUM is stored.
Unsupported registers are marked with `-1'. */
static int amd64fbsd64_r_reg_offset[] =
{
REG_OFFSET (r_rax),
REG_OFFSET (r_rbx),
REG_OFFSET (r_rcx),
REG_OFFSET (r_rdx),
REG_OFFSET (r_rsi),
REG_OFFSET (r_rdi),
REG_OFFSET (r_rbp),
REG_OFFSET (r_rsp),
REG_OFFSET (r_r8),
REG_OFFSET (r_r9),
REG_OFFSET (r_r10),
REG_OFFSET (r_r11),
REG_OFFSET (r_r12),
REG_OFFSET (r_r13),
REG_OFFSET (r_r14),
REG_OFFSET (r_r15),
REG_OFFSET (r_rip),
REG_OFFSET (r_rflags),
REG_OFFSET (r_cs),
REG_OFFSET (r_ss),
-1,
-1,
-1,
-1
};
/* Mapping between the general-purpose registers in FreeBSD/amd64
`struct reg' format and GDB's register cache layout for
FreeBSD/i386.
Note that most FreeBSD/amd64 registers are 64-bit, while the
FreeBSD/i386 registers are all 32-bit, but since we're
little-endian we get away with that. */
/* From <machine/reg.h>. */
static int amd64fbsd32_r_reg_offset[I386_NUM_GREGS] =
{
14 * 8, 13 * 8, /* %eax, %ecx */
12 * 8, 11 * 8, /* %edx, %ebx */
20 * 8, 10 * 8, /* %esp, %ebp */
9 * 8, 8 * 8, /* %esi, %edi */
17 * 8, 19 * 8, /* %eip, %eflags */
18 * 8, 21 * 8, /* %cs, %ss */
-1, -1, -1, -1 /* %ds, %es, %fs, %gs */
};
/* Support for debugging kernel virtual memory images. */
#include <sys/types.h>
#include <machine/pcb.h>
#include "bsd-kvm.h"
static int
amd64fbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
{
/* The following is true for FreeBSD 5.2:
The pcb contains %rip, %rbx, %rsp, %rbp, %r12, %r13, %r14, %r15,
%ds, %es, %fs and %gs. This accounts for all callee-saved
registers specified by the psABI and then some. Here %esp
contains the stack pointer at the point just after the call to
cpu_switch(). From this information we reconstruct the register
state as it would like when we just returned from cpu_switch(). */
/* The stack pointer shouldn't be zero. */
if (pcb->pcb_rsp == 0)
return 0;
pcb->pcb_rsp += 8;
regcache_raw_supply (regcache, AMD64_RIP_REGNUM, &pcb->pcb_rip);
regcache_raw_supply (regcache, AMD64_RBX_REGNUM, &pcb->pcb_rbx);
regcache_raw_supply (regcache, AMD64_RSP_REGNUM, &pcb->pcb_rsp);
regcache_raw_supply (regcache, AMD64_RBP_REGNUM, &pcb->pcb_rbp);
regcache_raw_supply (regcache, 12, &pcb->pcb_r12);
regcache_raw_supply (regcache, 13, &pcb->pcb_r13);
regcache_raw_supply (regcache, 14, &pcb->pcb_r14);
regcache_raw_supply (regcache, 15, &pcb->pcb_r15);
regcache_raw_supply (regcache, AMD64_DS_REGNUM, &pcb->pcb_ds);
regcache_raw_supply (regcache, AMD64_ES_REGNUM, &pcb->pcb_es);
regcache_raw_supply (regcache, AMD64_FS_REGNUM, &pcb->pcb_fs);
regcache_raw_supply (regcache, AMD64_GS_REGNUM, &pcb->pcb_gs);
return 1;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_amd64fbsd_nat (void);
void
_initialize_amd64fbsd_nat (void)
{
struct target_ops *t;
int offset;
amd64_native_gregset32_reg_offset = amd64fbsd32_r_reg_offset;
amd64_native_gregset64_reg_offset = amd64fbsd64_r_reg_offset;
/* Add some extra features to the common *BSD/i386 target. */
t = amd64bsd_target ();
t->to_pid_to_exec_file = fbsd_pid_to_exec_file;
t->to_find_memory_regions = fbsd_find_memory_regions;
t->to_make_corefile_notes = fbsd_make_corefile_notes;
add_target (t);
/* Support debugging kernel virtual memory images. */
bsd_kvm_add_target (amd64fbsd_supply_pcb);
/* To support the recognition of signal handlers, i386bsd-tdep.c
hardcodes some constants. Inclusion of this file means that we
are compiling a native debugger, which means that we can use the
system header files and sysctl(3) to get at the relevant
information. */
#define SC_REG_OFFSET amd64fbsd_sc_reg_offset
/* We only check the program counter, stack pointer and frame
pointer since these members of `struct sigcontext' are essential
for providing backtraces. */
#define SC_RIP_OFFSET SC_REG_OFFSET[AMD64_RIP_REGNUM]
#define SC_RSP_OFFSET SC_REG_OFFSET[AMD64_RSP_REGNUM]
#define SC_RBP_OFFSET SC_REG_OFFSET[AMD64_RBP_REGNUM]
/* Override the default value for the offset of the program counter
in the sigcontext structure. */
offset = offsetof (struct sigcontext, sc_rip);
if (SC_RIP_OFFSET != offset)
{
warning (_("\
offsetof (struct sigcontext, sc_rip) yields %d instead of %d.\n\
Please report this to <bug-gdb@gnu.org>."),
offset, SC_RIP_OFFSET);
}
SC_RIP_OFFSET = offset;
/* Likewise for the stack pointer. */
offset = offsetof (struct sigcontext, sc_rsp);
if (SC_RSP_OFFSET != offset)
{
warning (_("\
offsetof (struct sigcontext, sc_rsp) yields %d instead of %d.\n\
Please report this to <bug-gdb@gnu.org>."),
offset, SC_RSP_OFFSET);
}
SC_RSP_OFFSET = offset;
/* And the frame pointer. */
offset = offsetof (struct sigcontext, sc_rbp);
if (SC_RBP_OFFSET != offset)
{
warning (_("\
offsetof (struct sigcontext, sc_rbp) yields %d instead of %d.\n\
Please report this to <bug-gdb@gnu.org>."),
offset, SC_RBP_OFFSET);
}
SC_RBP_OFFSET = offset;
/* FreeBSD provides a kern.ps_strings sysctl that we can use to
locate the sigtramp. That way we can still recognize a sigtramp
if its location is changed in a new kernel. Of course this is
still based on the assumption that the sigtramp is placed
directly under the location where the program arguments and
environment can be found. */
{
int mib[2];
long ps_strings;
size_t len;
mib[0] = CTL_KERN;
mib[1] = KERN_PS_STRINGS;
len = sizeof (ps_strings);
if (sysctl (mib, 2, &ps_strings, &len, NULL, 0) == 0)
{
amd64fbsd_sigtramp_start_addr = ps_strings - 32;
amd64fbsd_sigtramp_end_addr = ps_strings;
}
}
}

View File

@@ -1,222 +0,0 @@
/* Target-dependent code for FreeBSD/amd64.
Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "arch-utils.h"
#include "frame.h"
#include "gdbcore.h"
#include "regcache.h"
#include "osabi.h"
#include "gdb_assert.h"
#include "gdb_string.h"
#include "amd64-tdep.h"
#include "bsd-uthread.h"
#include "solib-svr4.h"
/* Support for signal handlers. */
/* Assuming THIS_FRAME is for a BSD sigtramp routine, return the
address of the associated sigcontext structure. */
static CORE_ADDR
amd64fbsd_sigcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR sp;
/* The `struct sigcontext' (which really is an `ucontext_t' on
FreeBSD/amd64) lives at a fixed offset in the signal frame. See
<machine/sigframe.h>. */
sp = frame_unwind_register_unsigned (this_frame, AMD64_RSP_REGNUM);
return sp + 16;
}
/* FreeBSD 5.1-RELEASE or later. */
/* Mapping between the general-purpose registers in `struct reg'
format and GDB's register cache layout.
Note that some registers are 32-bit, but since we're little-endian
we get away with that. */
/* From <machine/reg.h>. */
static int amd64fbsd_r_reg_offset[] =
{
14 * 8, /* %rax */
11 * 8, /* %rbx */
13 * 8, /* %rcx */
12 * 8, /* %rdx */
9 * 8, /* %rsi */
8 * 8, /* %rdi */
10 * 8, /* %rbp */
20 * 8, /* %rsp */
7 * 8, /* %r8 ... */
6 * 8,
5 * 8,
4 * 8,
3 * 8,
2 * 8,
1 * 8,
0 * 8, /* ... %r15 */
17 * 8, /* %rip */
19 * 8, /* %eflags */
18 * 8, /* %cs */
21 * 8, /* %ss */
-1, /* %ds */
-1, /* %es */
-1, /* %fs */
-1 /* %gs */
};
/* Location of the signal trampoline. */
CORE_ADDR amd64fbsd_sigtramp_start_addr = 0x7fffffffffc0ULL;
CORE_ADDR amd64fbsd_sigtramp_end_addr = 0x7fffffffffe0ULL;
/* From <machine/signal.h>. */
int amd64fbsd_sc_reg_offset[] =
{
24 + 6 * 8, /* %rax */
24 + 7 * 8, /* %rbx */
24 + 3 * 8, /* %rcx */
24 + 2 * 8, /* %rdx */
24 + 1 * 8, /* %rsi */
24 + 0 * 8, /* %rdi */
24 + 8 * 8, /* %rbp */
24 + 22 * 8, /* %rsp */
24 + 4 * 8, /* %r8 ... */
24 + 5 * 8,
24 + 9 * 8,
24 + 10 * 8,
24 + 11 * 8,
24 + 12 * 8,
24 + 13 * 8,
24 + 14 * 8, /* ... %r15 */
24 + 19 * 8, /* %rip */
24 + 21 * 8, /* %eflags */
24 + 20 * 8, /* %cs */
24 + 23 * 8, /* %ss */
-1, /* %ds */
-1, /* %es */
-1, /* %fs */
-1 /* %gs */
};
/* From /usr/src/lib/libc/amd64/gen/_setjmp.S. */
static int amd64fbsd_jmp_buf_reg_offset[] =
{
-1, /* %rax */
1 * 8, /* %rbx */
-1, /* %rcx */
-1, /* %rdx */
-1, /* %rsi */
-1, /* %rdi */
3 * 8, /* %rbp */
2 * 8, /* %rsp */
-1, /* %r8 ... */
-1,
-1,
-1, /* ... %r11 */
4 * 8, /* %r12 ... */
5 * 8,
6 * 8,
7 * 8, /* ... %r15 */
0 * 8 /* %rip */
};
static void
amd64fbsd_supply_uthread (struct regcache *regcache,
int regnum, CORE_ADDR addr)
{
gdb_byte buf[8];
int i;
gdb_assert (regnum >= -1);
for (i = 0; i < ARRAY_SIZE (amd64fbsd_jmp_buf_reg_offset); i++)
{
if (amd64fbsd_jmp_buf_reg_offset[i] != -1
&& (regnum == -1 || regnum == i))
{
read_memory (addr + amd64fbsd_jmp_buf_reg_offset[i], buf, 8);
regcache_raw_supply (regcache, i, buf);
}
}
}
static void
amd64fbsd_collect_uthread (const struct regcache *regcache,
int regnum, CORE_ADDR addr)
{
gdb_byte buf[8];
int i;
gdb_assert (regnum >= -1);
for (i = 0; i < ARRAY_SIZE (amd64fbsd_jmp_buf_reg_offset); i++)
{
if (amd64fbsd_jmp_buf_reg_offset[i] != -1
&& (regnum == -1 || regnum == i))
{
regcache_raw_collect (regcache, i, buf);
write_memory (addr + amd64fbsd_jmp_buf_reg_offset[i], buf, 8);
}
}
}
static void
amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
/* Obviously FreeBSD is BSD-based. */
i386bsd_init_abi (info, gdbarch);
tdep->gregset_reg_offset = amd64fbsd_r_reg_offset;
tdep->gregset_num_regs = ARRAY_SIZE (amd64fbsd_r_reg_offset);
tdep->sizeof_gregset = 22 * 8;
amd64_init_abi (info, gdbarch);
tdep->sigtramp_start = amd64fbsd_sigtramp_start_addr;
tdep->sigtramp_end = amd64fbsd_sigtramp_end_addr;
tdep->sigcontext_addr = amd64fbsd_sigcontext_addr;
tdep->sc_reg_offset = amd64fbsd_sc_reg_offset;
tdep->sc_num_regs = ARRAY_SIZE (amd64fbsd_sc_reg_offset);
/* FreeBSD provides a user-level threads implementation. */
bsd_uthread_set_supply_uthread (gdbarch, amd64fbsd_supply_uthread);
bsd_uthread_set_collect_uthread (gdbarch, amd64fbsd_collect_uthread);
/* FreeBSD uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_amd64fbsd_tdep (void);
void
_initialize_amd64fbsd_tdep (void)
{
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
GDB_OSABI_FREEBSD_ELF, amd64fbsd_init_abi);
}

View File

@@ -1,75 +0,0 @@
/* Native-dependent code for NetBSD/amd64.
Copyright (C) 2003, 2004, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "target.h"
#include "gdb_assert.h"
#include "nbsd-nat.h"
#include "amd64-tdep.h"
#include "amd64-nat.h"
/* Mapping between the general-purpose registers in NetBSD/amd64
`struct reg' format and GDB's register cache layout for
NetBSD/i386.
Note that most (if not all) NetBSD/amd64 registers are 64-bit,
while the NetBSD/i386 registers are all 32-bit, but since we're
little-endian we get away with that. */
/* From <machine/reg.h>. */
static int amd64nbsd32_r_reg_offset[] =
{
14 * 8, /* %eax */
3 * 8, /* %ecx */
2 * 8, /* %edx */
13 * 8, /* %ebx */
24 * 8, /* %esp */
12 * 8, /* %ebp */
1 * 8, /* %esi */
0 * 8, /* %edi */
21 * 8, /* %eip */
23 * 8, /* %eflags */
22 * 8, /* %cs */
25 * 8, /* %ss */
18 * 8, /* %ds */
17 * 8, /* %es */
16 * 8, /* %fs */
15 * 8 /* %gs */
};
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_amd64nbsd_nat (void);
void
_initialize_amd64nbsd_nat (void)
{
struct target_ops *t;
amd64_native_gregset32_reg_offset = amd64nbsd32_r_reg_offset;
amd64_native_gregset32_num_regs = ARRAY_SIZE (amd64nbsd32_r_reg_offset);
amd64_native_gregset64_reg_offset = amd64nbsd_r_reg_offset;
/* Add some extra features to the common *BSD/amd64 target. */
t = amd64bsd_target ();
t->to_pid_to_exec_file = nbsd_pid_to_exec_file;
add_target (t);
}

View File

@@ -1,135 +0,0 @@
/* Target-dependent code for NetBSD/amd64.
Copyright (C) 2003, 2004, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "arch-utils.h"
#include "frame.h"
#include "gdbcore.h"
#include "osabi.h"
#include "symtab.h"
#include "gdb_assert.h"
#include "amd64-tdep.h"
#include "nbsd-tdep.h"
#include "solib-svr4.h"
/* Support for signal handlers. */
/* Return whether THIS_FRAME corresponds to a NetBSD sigtramp
routine. */
static int
amd64nbsd_sigtramp_p (struct frame_info *this_frame)
{
CORE_ADDR pc = get_frame_pc (this_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
return nbsd_pc_in_sigtramp (pc, name);
}
/* Assuming THIS_FRAME corresponds to a NetBSD sigtramp routine,
return the address of the associated mcontext structure. */
static CORE_ADDR
amd64nbsd_mcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR addr;
/* The register %r15 points at `struct ucontext' upon entry of a
signal trampoline. */
addr = get_frame_register_unsigned (this_frame, AMD64_R15_REGNUM);
/* The mcontext structure lives as offset 56 in `struct ucontext'. */
return addr + 56;
}
/* NetBSD 2.0 or later. */
/* Mapping between the general-purpose registers in `struct reg'
format and GDB's register cache layout. */
/* From <machine/reg.h>. */
int amd64nbsd_r_reg_offset[] =
{
14 * 8, /* %rax */
13 * 8, /* %rbx */
3 * 8, /* %rcx */
2 * 8, /* %rdx */
1 * 8, /* %rsi */
0 * 8, /* %rdi */
12 * 8, /* %rbp */
24 * 8, /* %rsp */
4 * 8, /* %r8 .. */
5 * 8,
6 * 8,
7 * 8,
8 * 8,
9 * 8,
10 * 8,
11 * 8, /* ... %r15 */
21 * 8, /* %rip */
23 * 8, /* %eflags */
22 * 8, /* %cs */
25 * 8, /* %ss */
18 * 8, /* %ds */
17 * 8, /* %es */
16 * 8, /* %fs */
15 * 8 /* %gs */
};
static void
amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
/* Initialize general-purpose register set details first. */
tdep->gregset_reg_offset = amd64nbsd_r_reg_offset;
tdep->gregset_num_regs = ARRAY_SIZE (amd64nbsd_r_reg_offset);
tdep->sizeof_gregset = 26 * 8;
amd64_init_abi (info, gdbarch);
tdep->jb_pc_offset = 7 * 8;
/* NetBSD has its own convention for signal trampolines. */
tdep->sigtramp_p = amd64nbsd_sigtramp_p;
tdep->sigcontext_addr = amd64nbsd_mcontext_addr;
tdep->sc_reg_offset = amd64nbsd_r_reg_offset;
tdep->sc_num_regs = ARRAY_SIZE (amd64nbsd_r_reg_offset);
/* NetBSD uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_amd64nbsd_tdep (void);
void
_initialize_amd64nbsd_tdep (void)
{
/* The NetBSD/amd64 native dependent code makes this assumption. */
gdb_assert (ARRAY_SIZE (amd64nbsd_r_reg_offset) == AMD64_NUM_GREGS);
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
GDB_OSABI_NETBSD_ELF, amd64nbsd_init_abi);
}

View File

@@ -1,145 +0,0 @@
/* Native-dependent code for OpenBSD/amd64.
Copyright (C) 2003, 2004, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "gdbcore.h"
#include "regcache.h"
#include "target.h"
#include "gdb_assert.h"
#include "amd64-tdep.h"
#include "amd64-nat.h"
/* Mapping between the general-purpose registers in OpenBSD/amd64
`struct reg' format and GDB's register cache layout for
OpenBSD/i386.
Note that most (if not all) OpenBSD/amd64 registers are 64-bit,
while the OpenBSD/i386 registers are all 32-bit, but since we're
little-endian we get away with that. */
/* From <machine/reg.h>. */
static int amd64obsd32_r_reg_offset[] =
{
14 * 8, /* %eax */
3 * 8, /* %ecx */
2 * 8, /* %edx */
13 * 8, /* %ebx */
15 * 8, /* %esp */
12 * 8, /* %ebp */
1 * 8, /* %esi */
0 * 8, /* %edi */
16 * 8, /* %eip */
17 * 8, /* %eflags */
18 * 8, /* %cs */
19 * 8, /* %ss */
20 * 8, /* %ds */
21 * 8, /* %es */
22 * 8, /* %fs */
23 * 8 /* %gs */
};
/* Support for debugging kernel virtual memory images. */
#include <sys/types.h>
#include <machine/frame.h>
#include <machine/pcb.h>
#include "bsd-kvm.h"
static int
amd64obsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
{
struct switchframe sf;
int regnum;
/* The following is true for OpenBSD 3.5:
The pcb contains the stack pointer at the point of the context
switch in cpu_switch(). At that point we have a stack frame as
described by `struct switchframe', which for OpenBSD 3.5 has the
following layout:
interrupt level
%r15
%r14
%r13
%r12
%rbp
%rbx
return address
Together with %rsp in the pcb, this accounts for all callee-saved
registers specified by the psABI. From this information we
reconstruct the register state as it would look when we just
returned from cpu_switch().
For core dumps the pcb is saved by savectx(). In that case the
stack frame only contains the return address, and there is no way
to recover the other registers. */
/* The stack pointer shouldn't be zero. */
if (pcb->pcb_rsp == 0)
return 0;
/* Read the stack frame, and check its validity. */
read_memory (pcb->pcb_rsp, (gdb_byte *) &sf, sizeof sf);
if (sf.sf_rbp == pcb->pcb_rbp)
{
/* Yes, we have a frame that matches cpu_switch(). */
pcb->pcb_rsp += sizeof (struct switchframe);
regcache_raw_supply (regcache, 12, &sf.sf_r12);
regcache_raw_supply (regcache, 13, &sf.sf_r13);
regcache_raw_supply (regcache, 14, &sf.sf_r14);
regcache_raw_supply (regcache, 15, &sf.sf_r15);
regcache_raw_supply (regcache, AMD64_RBX_REGNUM, &sf.sf_rbx);
regcache_raw_supply (regcache, AMD64_RIP_REGNUM, &sf.sf_rip);
}
else
{
/* No, the pcb must have been last updated by savectx(). */
pcb->pcb_rsp += 8;
regcache_raw_supply (regcache, AMD64_RIP_REGNUM, &sf);
}
regcache_raw_supply (regcache, AMD64_RSP_REGNUM, &pcb->pcb_rsp);
regcache_raw_supply (regcache, AMD64_RBP_REGNUM, &pcb->pcb_rbp);
return 1;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_amd64obsd_nat (void);
void
_initialize_amd64obsd_nat (void)
{
amd64_native_gregset32_reg_offset = amd64obsd32_r_reg_offset;
amd64_native_gregset32_num_regs = ARRAY_SIZE (amd64obsd32_r_reg_offset);
amd64_native_gregset64_reg_offset = amd64obsd_r_reg_offset;
/* We've got nothing to add to the common *BSD/amd64 target. */
add_target (amd64bsd_target ());
/* Support debugging kernel virtual memory images. */
bsd_kvm_add_target (amd64obsd_supply_pcb);
}

View File

@@ -1,491 +0,0 @@
/* Target-dependent code for OpenBSD/amd64.
Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "frame.h"
#include "frame-unwind.h"
#include "gdbcore.h"
#include "symtab.h"
#include "objfiles.h"
#include "osabi.h"
#include "regcache.h"
#include "regset.h"
#include "target.h"
#include "trad-frame.h"
#include "gdb_assert.h"
#include "gdb_string.h"
#include "amd64-tdep.h"
#include "i387-tdep.h"
#include "solib-svr4.h"
#include "bsd-uthread.h"
/* Support for core dumps. */
static void
amd64obsd_supply_regset (const struct regset *regset,
struct regcache *regcache, int regnum,
const void *regs, size_t len)
{
const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
gdb_assert (len >= tdep->sizeof_gregset + I387_SIZEOF_FXSAVE);
i386_supply_gregset (regset, regcache, regnum, regs, tdep->sizeof_gregset);
amd64_supply_fxsave (regcache, regnum,
((const gdb_byte *)regs) + tdep->sizeof_gregset);
}
static const struct regset *
amd64obsd_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
/* OpenBSD core dumps don't use seperate register sets for the
general-purpose and floating-point registers. */
if (strcmp (sect_name, ".reg") == 0
&& sect_size >= tdep->sizeof_gregset + I387_SIZEOF_FXSAVE)
{
if (tdep->gregset == NULL)
tdep->gregset = regset_alloc (gdbarch, amd64obsd_supply_regset, NULL);
return tdep->gregset;
}
return NULL;
}
/* Support for signal handlers. */
/* Default page size. */
static const int amd64obsd_page_size = 4096;
/* Return whether THIS_FRAME corresponds to an OpenBSD sigtramp
routine. */
static int
amd64obsd_sigtramp_p (struct frame_info *this_frame)
{
CORE_ADDR pc = get_frame_pc (this_frame);
CORE_ADDR start_pc = (pc & ~(amd64obsd_page_size - 1));
const gdb_byte sigreturn[] =
{
0x48, 0xc7, 0xc0,
0x67, 0x00, 0x00, 0x00, /* movq $SYS_sigreturn, %rax */
0xcd, 0x80 /* int $0x80 */
};
size_t buflen = (sizeof sigreturn) + 1;
gdb_byte *buf;
char *name;
/* If the function has a valid symbol name, it isn't a
trampoline. */
find_pc_partial_function (pc, &name, NULL, NULL);
if (name != NULL)
return 0;
/* If the function lives in a valid section (even without a starting
point) it isn't a trampoline. */
if (find_pc_section (pc) != NULL)
return 0;
/* If we can't read the instructions at START_PC, return zero. */
buf = alloca ((sizeof sigreturn) + 1);
if (!safe_frame_unwind_memory (this_frame, start_pc + 6, buf, buflen))
return 0;
/* Check for sigreturn(2). Depending on how the assembler encoded
the `movq %rsp, %rdi' instruction, the code starts at offset 6 or
7. */
if (memcmp (buf, sigreturn, sizeof sigreturn)
&& memcpy (buf + 1, sigreturn, sizeof sigreturn))
return 0;
return 1;
}
/* Assuming THIS_FRAME is for a BSD sigtramp routine, return the
address of the associated sigcontext structure. */
static CORE_ADDR
amd64obsd_sigcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR pc = get_frame_pc (this_frame);
ULONGEST offset = (pc & (amd64obsd_page_size - 1));
/* The %rsp register points at `struct sigcontext' upon entry of a
signal trampoline. The relevant part of the trampoline is
call *%rax
movq %rsp, %rdi
pushq %rdi
movq $SYS_sigreturn,%rax
int $0x80
(see /usr/src/sys/arch/amd64/amd64/locore.S). The `pushq'
instruction clobbers %rsp, but its value is saved in `%rdi'. */
if (offset > 5)
return get_frame_register_unsigned (this_frame, AMD64_RDI_REGNUM);
else
return get_frame_register_unsigned (this_frame, AMD64_RSP_REGNUM);
}
/* OpenBSD 3.5 or later. */
/* Mapping between the general-purpose registers in `struct reg'
format and GDB's register cache layout. */
/* From <machine/reg.h>. */
int amd64obsd_r_reg_offset[] =
{
14 * 8, /* %rax */
13 * 8, /* %rbx */
3 * 8, /* %rcx */
2 * 8, /* %rdx */
1 * 8, /* %rsi */
0 * 8, /* %rdi */
12 * 8, /* %rbp */
15 * 8, /* %rsp */
4 * 8, /* %r8 .. */
5 * 8,
6 * 8,
7 * 8,
8 * 8,
9 * 8,
10 * 8,
11 * 8, /* ... %r15 */
16 * 8, /* %rip */
17 * 8, /* %eflags */
18 * 8, /* %cs */
19 * 8, /* %ss */
20 * 8, /* %ds */
21 * 8, /* %es */
22 * 8, /* %fs */
23 * 8 /* %gs */
};
/* From <machine/signal.h>. */
static int amd64obsd_sc_reg_offset[] =
{
14 * 8, /* %rax */
13 * 8, /* %rbx */
3 * 8, /* %rcx */
2 * 8, /* %rdx */
1 * 8, /* %rsi */
0 * 8, /* %rdi */
12 * 8, /* %rbp */
24 * 8, /* %rsp */
4 * 8, /* %r8 ... */
5 * 8,
6 * 8,
7 * 8,
8 * 8,
9 * 8,
10 * 8,
11 * 8, /* ... %r15 */
21 * 8, /* %rip */
23 * 8, /* %eflags */
22 * 8, /* %cs */
25 * 8, /* %ss */
18 * 8, /* %ds */
17 * 8, /* %es */
16 * 8, /* %fs */
15 * 8 /* %gs */
};
/* From /usr/src/lib/libpthread/arch/amd64/uthread_machdep.c. */
static int amd64obsd_uthread_reg_offset[] =
{
19 * 8, /* %rax */
16 * 8, /* %rbx */
18 * 8, /* %rcx */
17 * 8, /* %rdx */
14 * 8, /* %rsi */
13 * 8, /* %rdi */
15 * 8, /* %rbp */
-1, /* %rsp */
12 * 8, /* %r8 ... */
11 * 8,
10 * 8,
9 * 8,
8 * 8,
7 * 8,
6 * 8,
5 * 8, /* ... %r15 */
20 * 8, /* %rip */
4 * 8, /* %eflags */
21 * 8, /* %cs */
-1, /* %ss */
3 * 8, /* %ds */
2 * 8, /* %es */
1 * 8, /* %fs */
0 * 8 /* %gs */
};
/* Offset within the thread structure where we can find the saved
stack pointer (%esp). */
#define AMD64OBSD_UTHREAD_RSP_OFFSET 400
static void
amd64obsd_supply_uthread (struct regcache *regcache,
int regnum, CORE_ADDR addr)
{
CORE_ADDR sp_addr = addr + AMD64OBSD_UTHREAD_RSP_OFFSET;
CORE_ADDR sp = 0;
gdb_byte buf[8];
int i;
gdb_assert (regnum >= -1);
if (regnum == -1 || regnum == AMD64_RSP_REGNUM)
{
int offset;
/* Fetch stack pointer from thread structure. */
sp = read_memory_unsigned_integer (sp_addr, 8);
/* Adjust the stack pointer such that it looks as if we just
returned from _thread_machdep_switch. */
offset = amd64obsd_uthread_reg_offset[AMD64_RIP_REGNUM] + 8;
store_unsigned_integer (buf, 8, sp + offset);
regcache_raw_supply (regcache, AMD64_RSP_REGNUM, buf);
}
for (i = 0; i < ARRAY_SIZE (amd64obsd_uthread_reg_offset); i++)
{
if (amd64obsd_uthread_reg_offset[i] != -1
&& (regnum == -1 || regnum == i))
{
/* Fetch stack pointer from thread structure (if we didn't
do so already). */
if (sp == 0)
sp = read_memory_unsigned_integer (sp_addr, 8);
/* Read the saved register from the stack frame. */
read_memory (sp + amd64obsd_uthread_reg_offset[i], buf, 8);
regcache_raw_supply (regcache, i, buf);
}
}
}
static void
amd64obsd_collect_uthread (const struct regcache *regcache,
int regnum, CORE_ADDR addr)
{
CORE_ADDR sp_addr = addr + AMD64OBSD_UTHREAD_RSP_OFFSET;
CORE_ADDR sp = 0;
gdb_byte buf[8];
int i;
gdb_assert (regnum >= -1);
if (regnum == -1 || regnum == AMD64_RSP_REGNUM)
{
int offset;
/* Calculate the stack pointer (frame pointer) that will be
stored into the thread structure. */
offset = amd64obsd_uthread_reg_offset[AMD64_RIP_REGNUM] + 8;
regcache_raw_collect (regcache, AMD64_RSP_REGNUM, buf);
sp = extract_unsigned_integer (buf, 8) - offset;
/* Store the stack pointer. */
write_memory_unsigned_integer (sp_addr, 8, sp);
/* The stack pointer was (potentially) modified. Make sure we
build a proper stack frame. */
regnum = -1;
}
for (i = 0; i < ARRAY_SIZE (amd64obsd_uthread_reg_offset); i++)
{
if (amd64obsd_uthread_reg_offset[i] != -1
&& (regnum == -1 || regnum == i))
{
/* Fetch stack pointer from thread structure (if we didn't
calculate it already). */
if (sp == 0)
sp = read_memory_unsigned_integer (sp_addr, 8);
/* Write the register into the stack frame. */
regcache_raw_collect (regcache, i, buf);
write_memory (sp + amd64obsd_uthread_reg_offset[i], buf, 8);
}
}
}
/* Kernel debugging support. */
/* From <machine/frame.h>. Easy since `struct trapframe' matches
`struct sigcontext'. */
#define amd64obsd_tf_reg_offset amd64obsd_sc_reg_offset
static struct trad_frame_cache *
amd64obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
{
struct trad_frame_cache *cache;
CORE_ADDR func, sp, addr;
ULONGEST cs;
char *name;
int i;
if (*this_cache)
return *this_cache;
cache = trad_frame_cache_zalloc (this_frame);
*this_cache = cache;
func = get_frame_func (this_frame);
sp = get_frame_register_unsigned (this_frame, AMD64_RSP_REGNUM);
find_pc_partial_function (func, &name, NULL, NULL);
if (name && strncmp (name, "Xintr", 5) == 0)
addr = sp + 8; /* It's an interrupt frame. */
else
addr = sp;
for (i = 0; i < ARRAY_SIZE (amd64obsd_tf_reg_offset); i++)
if (amd64obsd_tf_reg_offset[i] != -1)
trad_frame_set_reg_addr (cache, i, addr + amd64obsd_tf_reg_offset[i]);
/* Read %cs from trap frame. */
addr += amd64obsd_tf_reg_offset[AMD64_CS_REGNUM];
cs = read_memory_unsigned_integer (addr, 8);
if ((cs & I386_SEL_RPL) == I386_SEL_UPL)
{
/* Trap from user space; terminate backtrace. */
trad_frame_set_id (cache, null_frame_id);
}
else
{
/* Construct the frame ID using the function start. */
trad_frame_set_id (cache, frame_id_build (sp + 16, func));
}
return cache;
}
static void
amd64obsd_trapframe_this_id (struct frame_info *this_frame,
void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
amd64obsd_trapframe_cache (this_frame, this_cache);
trad_frame_get_id (cache, this_id);
}
static struct value *
amd64obsd_trapframe_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
amd64obsd_trapframe_cache (this_frame, this_cache);
return trad_frame_get_register (cache, this_frame, regnum);
}
static int
amd64obsd_trapframe_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_prologue_cache)
{
ULONGEST cs;
char *name;
/* Check Current Privilege Level and bail out if we're not executing
in kernel space. */
cs = get_frame_register_unsigned (this_frame, AMD64_CS_REGNUM);
if ((cs & I386_SEL_RPL) == I386_SEL_UPL)
return 0;
find_pc_partial_function (get_frame_pc (this_frame), &name, NULL, NULL);
return (name && ((strcmp (name, "calltrap") == 0)
|| (strcmp (name, "osyscall1") == 0)
|| (strcmp (name, "Xsyscall") == 0)
|| (strncmp (name, "Xintr", 5) == 0)));
}
static const struct frame_unwind amd64obsd_trapframe_unwind = {
/* FIXME: kettenis/20051219: This really is more like an interrupt
frame, but SIGTRAMP_FRAME would print <signal handler called>,
which really is not what we want here. */
NORMAL_FRAME,
amd64obsd_trapframe_this_id,
amd64obsd_trapframe_prev_register,
NULL,
amd64obsd_trapframe_sniffer
};
static void
amd64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
amd64_init_abi (info, gdbarch);
/* Initialize general-purpose register set details. */
tdep->gregset_reg_offset = amd64obsd_r_reg_offset;
tdep->gregset_num_regs = ARRAY_SIZE (amd64obsd_r_reg_offset);
tdep->sizeof_gregset = 24 * 8;
set_gdbarch_regset_from_core_section (gdbarch,
amd64obsd_regset_from_core_section);
tdep->jb_pc_offset = 7 * 8;
tdep->sigtramp_p = amd64obsd_sigtramp_p;
tdep->sigcontext_addr = amd64obsd_sigcontext_addr;
tdep->sc_reg_offset = amd64obsd_sc_reg_offset;
tdep->sc_num_regs = ARRAY_SIZE (amd64obsd_sc_reg_offset);
/* OpenBSD provides a user-level threads implementation. */
bsd_uthread_set_supply_uthread (gdbarch, amd64obsd_supply_uthread);
bsd_uthread_set_collect_uthread (gdbarch, amd64obsd_collect_uthread);
/* OpenBSD uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_lp64_fetch_link_map_offsets);
/* Unwind kernel trap frames correctly. */
frame_unwind_prepend_unwinder (gdbarch, &amd64obsd_trapframe_unwind);
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_amd64obsd_tdep (void);
void
_initialize_amd64obsd_tdep (void)
{
/* The OpenBSD/amd64 native dependent code makes this assumption. */
gdb_assert (ARRAY_SIZE (amd64obsd_r_reg_offset) == AMD64_NUM_GREGS);
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
GDB_OSABI_OPENBSD_ELF, amd64obsd_init_abi);
/* OpenBSD uses traditional (a.out) NetBSD-style core dumps. */
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
GDB_OSABI_NETBSD_AOUT, amd64obsd_init_abi);
}

View File

@@ -1,575 +0,0 @@
/* Annotation routines for GDB.
Copyright (C) 1986, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1998, 1999,
2000, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "annotate.h"
#include "value.h"
#include "target.h"
#include "gdbtypes.h"
#include "breakpoint.h"
#include "observer.h"
/* Prototypes for local functions. */
extern void _initialize_annotate (void);
static void print_value_flags (struct type *);
static void breakpoint_changed (int);
void (*deprecated_annotate_signalled_hook) (void);
void (*deprecated_annotate_signal_hook) (void);
static int ignore_count_changed = 0;
static void
print_value_flags (struct type *t)
{
if (can_dereference (t))
printf_filtered (("*"));
else
printf_filtered (("-"));
}
void
breakpoints_changed (void)
{
if (annotation_level == 2)
{
target_terminal_ours ();
printf_unfiltered (("\n\032\032breakpoints-invalid\n"));
if (ignore_count_changed)
ignore_count_changed = 0; /* Avoid multiple break annotations. */
}
}
/* The GUI needs to be informed of ignore_count changes, but we don't
want to provide successive multiple breakpoints-invalid messages
that are all caused by the fact that the ignore count is changing
(which could keep the GUI very busy). One is enough, after the
target actually "stops". */
void
annotate_ignore_count_change (void)
{
if (annotation_level > 1)
ignore_count_changed = 1;
}
void
annotate_breakpoint (int num)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032breakpoint %d\n"), num);
}
void
annotate_catchpoint (int num)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032catchpoint %d\n"), num);
}
void
annotate_watchpoint (int num)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032watchpoint %d\n"), num);
}
void
annotate_starting (void)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032starting\n"));
}
void
annotate_stopped (void)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032stopped\n"));
if (annotation_level > 1 && ignore_count_changed)
{
ignore_count_changed = 0;
breakpoints_changed ();
}
}
void
annotate_exited (int exitstatus)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032exited %d\n"), exitstatus);
}
void
annotate_signalled (void)
{
if (deprecated_annotate_signalled_hook)
deprecated_annotate_signalled_hook ();
if (annotation_level > 1)
printf_filtered (("\n\032\032signalled\n"));
}
void
annotate_signal_name (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032signal-name\n"));
}
void
annotate_signal_name_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032signal-name-end\n"));
}
void
annotate_signal_string (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032signal-string\n"));
}
void
annotate_signal_string_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032signal-string-end\n"));
}
void
annotate_signal (void)
{
if (deprecated_annotate_signal_hook)
deprecated_annotate_signal_hook ();
if (annotation_level > 1)
printf_filtered (("\n\032\032signal\n"));
}
void
annotate_breakpoints_headers (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032breakpoints-headers\n"));
}
void
annotate_field (int num)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032field %d\n"), num);
}
void
annotate_breakpoints_table (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032breakpoints-table\n"));
}
void
annotate_record (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032record\n"));
}
void
annotate_breakpoints_table_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032breakpoints-table-end\n"));
}
void
annotate_frames_invalid (void)
{
if (annotation_level == 2)
{
target_terminal_ours ();
printf_unfiltered (("\n\032\032frames-invalid\n"));
}
}
void
annotate_new_thread (void)
{
if (annotation_level > 1)
{
printf_unfiltered (("\n\032\032new-thread\n"));
}
}
void
annotate_thread_changed (void)
{
if (annotation_level > 1)
{
printf_unfiltered (("\n\032\032thread-changed\n"));
}
}
void
annotate_field_begin (struct type *type)
{
if (annotation_level == 2)
{
printf_filtered (("\n\032\032field-begin "));
print_value_flags (type);
printf_filtered (("\n"));
}
}
void
annotate_field_name_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032field-name-end\n"));
}
void
annotate_field_value (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032field-value\n"));
}
void
annotate_field_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032field-end\n"));
}
void
annotate_quit (void)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032quit\n"));
}
void
annotate_error (void)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032error\n"));
}
void
annotate_error_begin (void)
{
if (annotation_level > 1)
fprintf_filtered (gdb_stderr, "\n\032\032error-begin\n");
}
void
annotate_value_history_begin (int histindex, struct type *type)
{
if (annotation_level == 2)
{
printf_filtered (("\n\032\032value-history-begin %d "), histindex);
print_value_flags (type);
printf_filtered (("\n"));
}
}
void
annotate_value_begin (struct type *type)
{
if (annotation_level == 2)
{
printf_filtered (("\n\032\032value-begin "));
print_value_flags (type);
printf_filtered (("\n"));
}
}
void
annotate_value_history_value (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032value-history-value\n"));
}
void
annotate_value_history_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032value-history-end\n"));
}
void
annotate_value_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032value-end\n"));
}
void
annotate_display_begin (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032display-begin\n"));
}
void
annotate_display_number_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032display-number-end\n"));
}
void
annotate_display_format (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032display-format\n"));
}
void
annotate_display_expression (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032display-expression\n"));
}
void
annotate_display_expression_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032display-expression-end\n"));
}
void
annotate_display_value (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032display-value\n"));
}
void
annotate_display_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032display-end\n"));
}
void
annotate_arg_begin (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032arg-begin\n"));
}
void
annotate_arg_name_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032arg-name-end\n"));
}
void
annotate_arg_value (struct type *type)
{
if (annotation_level == 2)
{
printf_filtered (("\n\032\032arg-value "));
print_value_flags (type);
printf_filtered (("\n"));
}
}
void
annotate_arg_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032arg-end\n"));
}
void
annotate_source (char *filename, int line, int character, int mid, CORE_ADDR pc)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032source "));
else
printf_filtered (("\032\032"));
printf_filtered (("%s:%d:%d:%s:%s\n"), filename, line, character,
mid ? "middle" : "beg", paddress (pc));
}
void
annotate_frame_begin (int level, CORE_ADDR pc)
{
if (annotation_level > 1)
printf_filtered (("\n\032\032frame-begin %d %s\n"), level, paddress (pc));
}
void
annotate_function_call (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032function-call\n"));
}
void
annotate_signal_handler_caller (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032signal-handler-caller\n"));
}
void
annotate_frame_address (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-address\n"));
}
void
annotate_frame_address_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-address-end\n"));
}
void
annotate_frame_function_name (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-function-name\n"));
}
void
annotate_frame_args (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-args\n"));
}
void
annotate_frame_source_begin (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-source-begin\n"));
}
void
annotate_frame_source_file (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-source-file\n"));
}
void
annotate_frame_source_file_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-source-file-end\n"));
}
void
annotate_frame_source_line (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-source-line\n"));
}
void
annotate_frame_source_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-source-end\n"));
}
void
annotate_frame_where (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-where\n"));
}
void
annotate_frame_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032frame-end\n"));
}
void
annotate_array_section_begin (int index, struct type *elttype)
{
if (annotation_level == 2)
{
printf_filtered (("\n\032\032array-section-begin %d "), index);
print_value_flags (elttype);
printf_filtered (("\n"));
}
}
void
annotate_elt_rep (unsigned int repcount)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032elt-rep %u\n"), repcount);
}
void
annotate_elt_rep_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032elt-rep-end\n"));
}
void
annotate_elt (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032elt\n"));
}
void
annotate_array_section_end (void)
{
if (annotation_level == 2)
printf_filtered (("\n\032\032array-section-end\n"));
}
static void
breakpoint_changed (int bpno)
{
breakpoints_changed ();
}
void
_initialize_annotate (void)
{
if (annotation_level == 2)
{
observer_attach_breakpoint_deleted (breakpoint_changed);
observer_attach_breakpoint_modified (breakpoint_changed);
}
}

View File

@@ -1,103 +0,0 @@
/* Annotation routines for GDB.
Copyright (C) 1986, 1989, 1990, 1991, 1992, 1994, 1998, 1999, 2000, 2007,
2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "symtab.h"
#include "gdbtypes.h"
extern void breakpoints_changed (void);
extern void annotate_ignore_count_change (void);
extern void annotate_breakpoint (int);
extern void annotate_catchpoint (int);
extern void annotate_watchpoint (int);
extern void annotate_starting (void);
extern void annotate_stopped (void);
extern void annotate_exited (int);
extern void annotate_signalled (void);
extern void annotate_signal_name (void);
extern void annotate_signal_name_end (void);
extern void annotate_signal_string (void);
extern void annotate_signal_string_end (void);
extern void annotate_signal (void);
extern void annotate_breakpoints_headers (void);
extern void annotate_field (int);
extern void annotate_breakpoints_table (void);
extern void annotate_record (void);
extern void annotate_breakpoints_table_end (void);
extern void annotate_frames_invalid (void);
extern void annotate_new_thread (void);
extern void annotate_thread_changed (void);
struct type;
extern void annotate_field_begin (struct type *);
extern void annotate_field_name_end (void);
extern void annotate_field_value (void);
extern void annotate_field_end (void);
extern void annotate_quit (void);
extern void annotate_error (void);
extern void annotate_error_begin (void);
extern void annotate_value_history_begin (int, struct type *);
extern void annotate_value_begin (struct type *);
extern void annotate_value_history_value (void);
extern void annotate_value_history_end (void);
extern void annotate_value_end (void);
extern void annotate_display_begin (void);
extern void annotate_display_number_end (void);
extern void annotate_display_format (void);
extern void annotate_display_expression (void);
extern void annotate_display_expression_end (void);
extern void annotate_display_value (void);
extern void annotate_display_end (void);
extern void annotate_arg_begin (void);
extern void annotate_arg_name_end (void);
extern void annotate_arg_value (struct type *);
extern void annotate_arg_end (void);
extern void annotate_source (char *, int, int, int, CORE_ADDR);
extern void annotate_frame_begin (int, CORE_ADDR);
extern void annotate_function_call (void);
extern void annotate_signal_handler_caller (void);
extern void annotate_frame_address (void);
extern void annotate_frame_address_end (void);
extern void annotate_frame_function_name (void);
extern void annotate_frame_args (void);
extern void annotate_frame_source_begin (void);
extern void annotate_frame_source_file (void);
extern void annotate_frame_source_file_end (void);
extern void annotate_frame_source_line (void);
extern void annotate_frame_source_end (void);
extern void annotate_frame_where (void);
extern void annotate_frame_end (void);
extern void annotate_array_section_begin (int, struct type *);
extern void annotate_elt_rep (unsigned int);
extern void annotate_elt_rep_end (void);
extern void annotate_elt (void);
extern void annotate_array_section_end (void);
extern void (*deprecated_annotate_signalled_hook) (void);
extern void (*deprecated_annotate_signal_hook) (void);

View File

@@ -1,737 +0,0 @@
/* Dynamic architecture support for GDB, the GNU debugger.
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "arch-utils.h"
#include "buildsym.h"
#include "gdbcmd.h"
#include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */
#include "gdb_string.h"
#include "regcache.h"
#include "gdb_assert.h"
#include "sim-regno.h"
#include "gdbcore.h"
#include "osabi.h"
#include "target-descriptions.h"
#include "objfiles.h"
#include "version.h"
#include "floatformat.h"
struct displaced_step_closure *
simple_displaced_step_copy_insn (struct gdbarch *gdbarch,
CORE_ADDR from, CORE_ADDR to,
struct regcache *regs)
{
size_t len = gdbarch_max_insn_length (gdbarch);
gdb_byte *buf = xmalloc (len);
read_memory (from, buf, len);
write_memory (to, buf, len);
if (debug_displaced)
{
fprintf_unfiltered (gdb_stdlog, "displaced: copy 0x%s->0x%s: ",
paddr_nz (from), paddr_nz (to));
displaced_step_dump_bytes (gdb_stdlog, buf, len);
}
return (struct displaced_step_closure *) buf;
}
void
simple_displaced_step_free_closure (struct gdbarch *gdbarch,
struct displaced_step_closure *closure)
{
xfree (closure);
}
CORE_ADDR
displaced_step_at_entry_point (struct gdbarch *gdbarch)
{
CORE_ADDR addr;
int bp_len;
addr = entry_point_address ();
/* Make certain that the address points at real code, and not a
function descriptor. */
addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr, &current_target);
/* Inferior calls also use the entry point as a breakpoint location.
We don't want displaced stepping to interfere with those
breakpoints, so leave space. */
gdbarch_breakpoint_from_pc (gdbarch, &addr, &bp_len);
addr += bp_len * 2;
return addr;
}
int
legacy_register_sim_regno (struct gdbarch *gdbarch, int regnum)
{
/* Only makes sense to supply raw registers. */
gdb_assert (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch));
/* NOTE: cagney/2002-05-13: The old code did it this way and it is
suspected that some GDB/SIM combinations may rely on this
behavour. The default should be one2one_register_sim_regno
(below). */
if (gdbarch_register_name (gdbarch, regnum) != NULL
&& gdbarch_register_name (gdbarch, regnum)[0] != '\0')
return regnum;
else
return LEGACY_SIM_REGNO_IGNORE;
}
CORE_ADDR
generic_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
{
return 0;
}
CORE_ADDR
generic_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
{
return 0;
}
int
generic_in_solib_return_trampoline (CORE_ADDR pc, char *name)
{
return 0;
}
int
generic_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
{
return 0;
}
/* Helper functions for gdbarch_inner_than */
int
core_addr_lessthan (CORE_ADDR lhs, CORE_ADDR rhs)
{
return (lhs < rhs);
}
int
core_addr_greaterthan (CORE_ADDR lhs, CORE_ADDR rhs)
{
return (lhs > rhs);
}
/* Misc helper functions for targets. */
CORE_ADDR
core_addr_identity (struct gdbarch *gdbarch, CORE_ADDR addr)
{
return addr;
}
CORE_ADDR
convert_from_func_ptr_addr_identity (struct gdbarch *gdbarch, CORE_ADDR addr,
struct target_ops *targ)
{
return addr;
}
int
no_op_reg_to_regnum (struct gdbarch *gdbarch, int reg)
{
return reg;
}
void
default_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
{
return;
}
void
default_coff_make_msymbol_special (int val, struct minimal_symbol *msym)
{
return;
}
int
cannot_register_not (struct gdbarch *gdbarch, int regnum)
{
return 0;
}
/* Legacy version of target_virtual_frame_pointer(). Assumes that
there is an gdbarch_deprecated_fp_regnum and that it is the same, cooked or
raw. */
void
legacy_virtual_frame_pointer (struct gdbarch *gdbarch,
CORE_ADDR pc,
int *frame_regnum,
LONGEST *frame_offset)
{
/* FIXME: cagney/2002-09-13: This code is used when identifying the
frame pointer of the current PC. It is assuming that a single
register and an offset can determine this. I think it should
instead generate a byte code expression as that would work better
with things like Dwarf2's CFI. */
if (gdbarch_deprecated_fp_regnum (gdbarch) >= 0
&& gdbarch_deprecated_fp_regnum (gdbarch)
< gdbarch_num_regs (gdbarch))
*frame_regnum = gdbarch_deprecated_fp_regnum (gdbarch);
else if (gdbarch_sp_regnum (gdbarch) >= 0
&& gdbarch_sp_regnum (gdbarch)
< gdbarch_num_regs (gdbarch))
*frame_regnum = gdbarch_sp_regnum (gdbarch);
else
/* Should this be an internal error? I guess so, it is reflecting
an architectural limitation in the current design. */
internal_error (__FILE__, __LINE__, _("No virtual frame pointer available"));
*frame_offset = 0;
}
int
generic_convert_register_p (struct gdbarch *gdbarch, int regnum,
struct type *type)
{
return 0;
}
int
default_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
{
return 0;
}
int
generic_instruction_nullified (struct gdbarch *gdbarch,
struct regcache *regcache)
{
return 0;
}
int
default_remote_register_number (struct gdbarch *gdbarch,
int regno)
{
return regno;
}
/* Functions to manipulate the endianness of the target. */
static int target_byte_order_user = BFD_ENDIAN_UNKNOWN;
static const char endian_big[] = "big";
static const char endian_little[] = "little";
static const char endian_auto[] = "auto";
static const char *endian_enum[] =
{
endian_big,
endian_little,
endian_auto,
NULL,
};
static const char *set_endian_string;
enum bfd_endian
selected_byte_order (void)
{
if (target_byte_order_user != BFD_ENDIAN_UNKNOWN)
return gdbarch_byte_order (current_gdbarch);
else
return BFD_ENDIAN_UNKNOWN;
}
/* Called by ``show endian''. */
static void
show_endian (struct ui_file *file, int from_tty, struct cmd_list_element *c,
const char *value)
{
if (target_byte_order_user == BFD_ENDIAN_UNKNOWN)
if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
fprintf_unfiltered (file, _("The target endianness is set automatically "
"(currently big endian)\n"));
else
fprintf_unfiltered (file, _("The target endianness is set automatically "
"(currently little endian)\n"));
else
if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
fprintf_unfiltered (file,
_("The target is assumed to be big endian\n"));
else
fprintf_unfiltered (file,
_("The target is assumed to be little endian\n"));
}
static void
set_endian (char *ignore_args, int from_tty, struct cmd_list_element *c)
{
struct gdbarch_info info;
gdbarch_info_init (&info);
if (set_endian_string == endian_auto)
{
target_byte_order_user = BFD_ENDIAN_UNKNOWN;
if (! gdbarch_update_p (info))
internal_error (__FILE__, __LINE__,
_("set_endian: architecture update failed"));
}
else if (set_endian_string == endian_little)
{
info.byte_order = BFD_ENDIAN_LITTLE;
if (! gdbarch_update_p (info))
printf_unfiltered (_("Little endian target not supported by GDB\n"));
else
target_byte_order_user = BFD_ENDIAN_LITTLE;
}
else if (set_endian_string == endian_big)
{
info.byte_order = BFD_ENDIAN_BIG;
if (! gdbarch_update_p (info))
printf_unfiltered (_("Big endian target not supported by GDB\n"));
else
target_byte_order_user = BFD_ENDIAN_BIG;
}
else
internal_error (__FILE__, __LINE__,
_("set_endian: bad value"));
show_endian (gdb_stdout, from_tty, NULL, NULL);
}
/* Given SELECTED, a currently selected BFD architecture, and
FROM_TARGET, a BFD architecture reported by the target description,
return what architecture to use. Either may be NULL; if both are
specified, we use the more specific. If the two are obviously
incompatible, warn the user. */
static const struct bfd_arch_info *
choose_architecture_for_target (const struct bfd_arch_info *selected,
const struct bfd_arch_info *from_target)
{
const struct bfd_arch_info *compat1, *compat2;
if (selected == NULL)
return from_target;
if (from_target == NULL)
return selected;
/* struct bfd_arch_info objects are singletons: that is, there's
supposed to be exactly one instance for a given machine. So you
can tell whether two are equivalent by comparing pointers. */
if (from_target == selected)
return selected;
/* BFD's 'A->compatible (A, B)' functions return zero if A and B are
incompatible. But if they are compatible, it returns the 'more
featureful' of the two arches. That is, if A can run code
written for B, but B can't run code written for A, then it'll
return A.
Some targets (e.g. MIPS as of 2006-12-04) don't fully
implement this, instead always returning NULL or the first
argument. We detect that case by checking both directions. */
compat1 = selected->compatible (selected, from_target);
compat2 = from_target->compatible (from_target, selected);
if (compat1 == NULL && compat2 == NULL)
{
warning (_("Selected architecture %s is not compatible "
"with reported target architecture %s"),
selected->printable_name, from_target->printable_name);
return selected;
}
if (compat1 == NULL)
return compat2;
if (compat2 == NULL)
return compat1;
if (compat1 == compat2)
return compat1;
/* If the two didn't match, but one of them was a default architecture,
assume the more specific one is correct. This handles the case
where an executable or target description just says "mips", but
the other knows which MIPS variant. */
if (compat1->the_default)
return compat2;
if (compat2->the_default)
return compat1;
/* We have no idea which one is better. This is a bug, but not
a critical problem; warn the user. */
warning (_("Selected architecture %s is ambiguous with "
"reported target architecture %s"),
selected->printable_name, from_target->printable_name);
return selected;
}
/* Functions to manipulate the architecture of the target */
enum set_arch { set_arch_auto, set_arch_manual };
static const struct bfd_arch_info *target_architecture_user;
static const char *set_architecture_string;
const char *
selected_architecture_name (void)
{
if (target_architecture_user == NULL)
return NULL;
else
return set_architecture_string;
}
/* Called if the user enters ``show architecture'' without an
argument. */
static void
show_architecture (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
const char *arch;
arch = gdbarch_bfd_arch_info (current_gdbarch)->printable_name;
if (target_architecture_user == NULL)
fprintf_filtered (file, _("\
The target architecture is set automatically (currently %s)\n"), arch);
else
fprintf_filtered (file, _("\
The target architecture is assumed to be %s\n"), arch);
}
/* Called if the user enters ``set architecture'' with or without an
argument. */
static void
set_architecture (char *ignore_args, int from_tty, struct cmd_list_element *c)
{
struct gdbarch_info info;
gdbarch_info_init (&info);
if (strcmp (set_architecture_string, "auto") == 0)
{
target_architecture_user = NULL;
if (!gdbarch_update_p (info))
internal_error (__FILE__, __LINE__,
_("could not select an architecture automatically"));
}
else
{
info.bfd_arch_info = bfd_scan_arch (set_architecture_string);
if (info.bfd_arch_info == NULL)
internal_error (__FILE__, __LINE__,
_("set_architecture: bfd_scan_arch failed"));
if (gdbarch_update_p (info))
target_architecture_user = info.bfd_arch_info;
else
printf_unfiltered (_("Architecture `%s' not recognized.\n"),
set_architecture_string);
}
show_architecture (gdb_stdout, from_tty, NULL, NULL);
}
/* Try to select a global architecture that matches "info". Return
non-zero if the attempt succeds. */
int
gdbarch_update_p (struct gdbarch_info info)
{
struct gdbarch *new_gdbarch;
/* Check for the current file. */
if (info.abfd == NULL)
info.abfd = exec_bfd;
if (info.abfd == NULL)
info.abfd = core_bfd;
/* Check for the current target description. */
if (info.target_desc == NULL)
info.target_desc = target_current_description ();
new_gdbarch = gdbarch_find_by_info (info);
/* If there no architecture by that name, reject the request. */
if (new_gdbarch == NULL)
{
if (gdbarch_debug)
fprintf_unfiltered (gdb_stdlog, "gdbarch_update_p: "
"Architecture not found\n");
return 0;
}
/* If it is the same old architecture, accept the request (but don't
swap anything). */
if (new_gdbarch == target_gdbarch)
{
if (gdbarch_debug)
fprintf_unfiltered (gdb_stdlog, "gdbarch_update_p: "
"Architecture %s (%s) unchanged\n",
host_address_to_string (new_gdbarch),
gdbarch_bfd_arch_info (new_gdbarch)->printable_name);
return 1;
}
/* It's a new architecture, swap it in. */
if (gdbarch_debug)
fprintf_unfiltered (gdb_stdlog, "gdbarch_update_p: "
"New architecture %s (%s) selected\n",
host_address_to_string (new_gdbarch),
gdbarch_bfd_arch_info (new_gdbarch)->printable_name);
deprecated_current_gdbarch_select_hack (new_gdbarch);
return 1;
}
/* Return the architecture for ABFD. If no suitable architecture
could be find, return NULL. */
struct gdbarch *
gdbarch_from_bfd (bfd *abfd)
{
struct gdbarch_info info;
gdbarch_info_init (&info);
info.abfd = abfd;
return gdbarch_find_by_info (info);
}
/* Set the dynamic target-system-dependent parameters (architecture,
byte-order) using information found in the BFD */
void
set_gdbarch_from_file (bfd *abfd)
{
struct gdbarch_info info;
struct gdbarch *gdbarch;
gdbarch_info_init (&info);
info.abfd = abfd;
info.target_desc = target_current_description ();
gdbarch = gdbarch_find_by_info (info);
if (gdbarch == NULL)
error (_("Architecture of file not recognized."));
deprecated_current_gdbarch_select_hack (gdbarch);
}
/* Initialize the current architecture. Update the ``set
architecture'' command so that it specifies a list of valid
architectures. */
#ifdef DEFAULT_BFD_ARCH
extern const bfd_arch_info_type DEFAULT_BFD_ARCH;
static const bfd_arch_info_type *default_bfd_arch = &DEFAULT_BFD_ARCH;
#else
static const bfd_arch_info_type *default_bfd_arch;
#endif
#ifdef DEFAULT_BFD_VEC
extern const bfd_target DEFAULT_BFD_VEC;
static const bfd_target *default_bfd_vec = &DEFAULT_BFD_VEC;
#else
static const bfd_target *default_bfd_vec;
#endif
static int default_byte_order = BFD_ENDIAN_UNKNOWN;
void
initialize_current_architecture (void)
{
const char **arches = gdbarch_printable_names ();
/* determine a default architecture and byte order. */
struct gdbarch_info info;
gdbarch_info_init (&info);
/* Find a default architecture. */
if (default_bfd_arch == NULL)
{
/* Choose the architecture by taking the first one
alphabetically. */
const char *chosen = arches[0];
const char **arch;
for (arch = arches; *arch != NULL; arch++)
{
if (strcmp (*arch, chosen) < 0)
chosen = *arch;
}
if (chosen == NULL)
internal_error (__FILE__, __LINE__,
_("initialize_current_architecture: No arch"));
default_bfd_arch = bfd_scan_arch (chosen);
if (default_bfd_arch == NULL)
internal_error (__FILE__, __LINE__,
_("initialize_current_architecture: Arch not found"));
}
info.bfd_arch_info = default_bfd_arch;
/* Take several guesses at a byte order. */
if (default_byte_order == BFD_ENDIAN_UNKNOWN
&& default_bfd_vec != NULL)
{
/* Extract BFD's default vector's byte order. */
switch (default_bfd_vec->byteorder)
{
case BFD_ENDIAN_BIG:
default_byte_order = BFD_ENDIAN_BIG;
break;
case BFD_ENDIAN_LITTLE:
default_byte_order = BFD_ENDIAN_LITTLE;
break;
default:
break;
}
}
if (default_byte_order == BFD_ENDIAN_UNKNOWN)
{
/* look for ``*el-*'' in the target name. */
const char *chp;
chp = strchr (target_name, '-');
if (chp != NULL
&& chp - 2 >= target_name
&& strncmp (chp - 2, "el", 2) == 0)
default_byte_order = BFD_ENDIAN_LITTLE;
}
if (default_byte_order == BFD_ENDIAN_UNKNOWN)
{
/* Wire it to big-endian!!! */
default_byte_order = BFD_ENDIAN_BIG;
}
info.byte_order = default_byte_order;
info.byte_order_for_code = info.byte_order;
if (! gdbarch_update_p (info))
internal_error (__FILE__, __LINE__,
_("initialize_current_architecture: Selection of "
"initial architecture failed"));
/* Create the ``set architecture'' command appending ``auto'' to the
list of architectures. */
{
struct cmd_list_element *c;
/* Append ``auto''. */
int nr;
for (nr = 0; arches[nr] != NULL; nr++);
arches = xrealloc (arches, sizeof (char*) * (nr + 2));
arches[nr + 0] = "auto";
arches[nr + 1] = NULL;
add_setshow_enum_cmd ("architecture", class_support,
arches, &set_architecture_string, _("\
Set architecture of target."), _("\
Show architecture of target."), NULL,
set_architecture, show_architecture,
&setlist, &showlist);
add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
}
}
/* Initialize a gdbarch info to values that will be automatically
overridden. Note: Originally, this ``struct info'' was initialized
using memset(0). Unfortunately, that ran into problems, namely
BFD_ENDIAN_BIG is zero. An explicit initialization function that
can explicitly set each field to a well defined value is used. */
void
gdbarch_info_init (struct gdbarch_info *info)
{
memset (info, 0, sizeof (struct gdbarch_info));
info->byte_order = BFD_ENDIAN_UNKNOWN;
info->byte_order_for_code = info->byte_order;
info->osabi = GDB_OSABI_UNINITIALIZED;
}
/* Similar to init, but this time fill in the blanks. Information is
obtained from the global "set ..." options and explicitly
initialized INFO fields. */
void
gdbarch_info_fill (struct gdbarch_info *info)
{
/* "(gdb) set architecture ...". */
if (info->bfd_arch_info == NULL
&& target_architecture_user)
info->bfd_arch_info = target_architecture_user;
/* From the file. */
if (info->bfd_arch_info == NULL
&& info->abfd != NULL
&& bfd_get_arch (info->abfd) != bfd_arch_unknown
&& bfd_get_arch (info->abfd) != bfd_arch_obscure)
info->bfd_arch_info = bfd_get_arch_info (info->abfd);
/* From the target. */
if (info->target_desc != NULL)
info->bfd_arch_info = choose_architecture_for_target
(info->bfd_arch_info, tdesc_architecture (info->target_desc));
/* From the default. */
if (info->bfd_arch_info == NULL)
info->bfd_arch_info = default_bfd_arch;
/* "(gdb) set byte-order ...". */
if (info->byte_order == BFD_ENDIAN_UNKNOWN
&& target_byte_order_user != BFD_ENDIAN_UNKNOWN)
info->byte_order = target_byte_order_user;
/* From the INFO struct. */
if (info->byte_order == BFD_ENDIAN_UNKNOWN
&& info->abfd != NULL)
info->byte_order = (bfd_big_endian (info->abfd) ? BFD_ENDIAN_BIG
: bfd_little_endian (info->abfd) ? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_UNKNOWN);
/* From the default. */
if (info->byte_order == BFD_ENDIAN_UNKNOWN)
info->byte_order = default_byte_order;
info->byte_order_for_code = info->byte_order;
/* "(gdb) set osabi ...". Handled by gdbarch_lookup_osabi. */
if (info->osabi == GDB_OSABI_UNINITIALIZED)
info->osabi = gdbarch_lookup_osabi (info->abfd);
/* Must have at least filled in the architecture. */
gdb_assert (info->bfd_arch_info != NULL);
}
/* */
extern initialize_file_ftype _initialize_gdbarch_utils; /* -Wmissing-prototypes */
void
_initialize_gdbarch_utils (void)
{
struct cmd_list_element *c;
add_setshow_enum_cmd ("endian", class_support,
endian_enum, &set_endian_string, _("\
Set endianness of target."), _("\
Show endianness of target."), NULL,
set_endian, show_endian,
&setlist, &showlist);
}

View File

@@ -1,142 +0,0 @@
/* Dynamic architecture support for GDB, the GNU debugger.
Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef GDBARCH_UTILS_H
#define GDBARCH_UTILS_H
struct gdbarch;
struct frame_info;
struct minimal_symbol;
struct type;
struct gdbarch_info;
/* gdbarch trace variable */
extern int gdbarch_debug;
/* An implementation of gdbarch_displaced_step_copy_insn for
processors that don't need to modify the instruction before
single-stepping the displaced copy.
Simply copy gdbarch_max_insn_length (ARCH) bytes from FROM to TO.
The closure is an array of that many bytes containing the
instruction's bytes, allocated with xmalloc. */
extern struct displaced_step_closure *
simple_displaced_step_copy_insn (struct gdbarch *gdbarch,
CORE_ADDR from, CORE_ADDR to,
struct regcache *regs);
/* Simple implementation of gdbarch_displaced_step_free_closure: Call
xfree.
This is appropriate for use with simple_displaced_step_copy_insn. */
extern void
simple_displaced_step_free_closure (struct gdbarch *gdbarch,
struct displaced_step_closure *closure);
/* Possible value for gdbarch_displaced_step_location:
Place displaced instructions at the program's entry point,
leaving space for inferior function call return breakpoints. */
extern CORE_ADDR displaced_step_at_entry_point (struct gdbarch *gdbarch);
/* The only possible cases for inner_than. */
extern int core_addr_lessthan (CORE_ADDR lhs, CORE_ADDR rhs);
extern int core_addr_greaterthan (CORE_ADDR lhs, CORE_ADDR rhs);
/* Identity functions on a CORE_ADDR. Just return the "addr". */
extern CORE_ADDR core_addr_identity (struct gdbarch *gdbarch, CORE_ADDR addr);
extern gdbarch_convert_from_func_ptr_addr_ftype convert_from_func_ptr_addr_identity;
/* No-op conversion of reg to regnum. */
extern int no_op_reg_to_regnum (struct gdbarch *gdbarch, int reg);
/* Do nothing version of elf_make_msymbol_special. */
void default_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym);
/* Do nothing version of coff_make_msymbol_special. */
void default_coff_make_msymbol_special (int val, struct minimal_symbol *msym);
/* Version of cannot_fetch_register() / cannot_store_register() that
always fails. */
int cannot_register_not (struct gdbarch *gdbarch, int regnum);
/* Legacy version of target_virtual_frame_pointer(). Assumes that
there is an gdbarch_deprecated_fp_regnum and that it is the same, cooked or
raw. */
extern gdbarch_virtual_frame_pointer_ftype legacy_virtual_frame_pointer;
extern CORE_ADDR generic_skip_trampoline_code (struct frame_info *frame,
CORE_ADDR pc);
extern CORE_ADDR generic_skip_solib_resolver (struct gdbarch *gdbarch,
CORE_ADDR pc);
extern int generic_in_solib_return_trampoline (CORE_ADDR pc, char *name);
extern int generic_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc);
/* By default, registers are not convertible. */
extern int generic_convert_register_p (struct gdbarch *gdbarch, int regnum,
struct type *type);
extern int default_stabs_argument_has_addr (struct gdbarch *gdbarch,
struct type *type);
extern int generic_instruction_nullified (struct gdbarch *gdbarch,
struct regcache *regcache);
int default_remote_register_number (struct gdbarch *gdbarch,
int regno);
/* For compatibility with older architectures, returns
(LEGACY_SIM_REGNO_IGNORE) when the register doesn't have a valid
name. */
extern int legacy_register_sim_regno (struct gdbarch *gdbarch, int regnum);
/* Return the selected byte order, or BFD_ENDIAN_UNKNOWN if no byte
order was explicitly selected. */
extern enum bfd_endian selected_byte_order (void);
/* Return the selected architecture's name, or NULL if no architecture
was explicitly selected. */
extern const char *selected_architecture_name (void);
/* Initialize a ``struct info''. Can't use memset(0) since some
default values are not zero. "fill" takes all available
information and fills in any unspecified fields. */
extern void gdbarch_info_init (struct gdbarch_info *info);
/* Similar to init, but this time fill in the blanks. Information is
obtained from the global "set ..." options and explicitly
initialized INFO fields. */
extern void gdbarch_info_fill (struct gdbarch_info *info);
/* Return the architecture for ABFD. If no suitable architecture
could be find, return NULL. */
extern struct gdbarch *gdbarch_from_bfd (bfd *abfd);
#endif

View File

@@ -1,620 +0,0 @@
/* GNU/Linux on ARM native support.
Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "inferior.h"
#include "gdbcore.h"
#include "gdb_string.h"
#include "regcache.h"
#include "target.h"
#include "linux-nat.h"
#include "target-descriptions.h"
#include "arm-tdep.h"
#include "arm-linux-tdep.h"
#include <sys/user.h>
#include <sys/ptrace.h>
#include <sys/utsname.h>
#include <sys/procfs.h>
/* Prototypes for supply_gregset etc. */
#include "gregset.h"
/* Defines ps_err_e, struct ps_prochandle. */
#include "gdb_proc_service.h"
#include "features/arm-with-iwmmxt.c"
#ifndef PTRACE_GET_THREAD_AREA
#define PTRACE_GET_THREAD_AREA 22
#endif
#ifndef PTRACE_GETWMMXREGS
#define PTRACE_GETWMMXREGS 18
#define PTRACE_SETWMMXREGS 19
#endif
/* A flag for whether the WMMX registers are available. */
static int arm_linux_has_wmmx_registers;
extern int arm_apcs_32;
/* The following variables are used to determine the version of the
underlying GNU/Linux operating system. Examples:
GNU/Linux 2.0.35 GNU/Linux 2.2.12
os_version = 0x00020023 os_version = 0x0002020c
os_major = 2 os_major = 2
os_minor = 0 os_minor = 2
os_release = 35 os_release = 12
Note: os_version = (os_major << 16) | (os_minor << 8) | os_release
These are initialized using get_linux_version() from
_initialize_arm_linux_nat(). */
static unsigned int os_version, os_major, os_minor, os_release;
/* On GNU/Linux, threads are implemented as pseudo-processes, in which
case we may be tracing more than one process at a time. In that
case, inferior_ptid will contain the main process ID and the
individual thread (process) ID. get_thread_id () is used to get
the thread id if it's available, and the process id otherwise. */
int
get_thread_id (ptid_t ptid)
{
int tid = TIDGET (ptid);
if (0 == tid)
tid = PIDGET (ptid);
return tid;
}
#define GET_THREAD_ID(PTID) get_thread_id (PTID)
/* Get the value of a particular register from the floating point
state of the process and store it into regcache. */
static void
fetch_fpregister (struct regcache *regcache, int regno)
{
int ret, tid;
gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
/* Read the floating point state. */
ret = ptrace (PT_GETFPREGS, tid, 0, fp);
if (ret < 0)
{
warning (_("Unable to fetch floating point register."));
return;
}
/* Fetch fpsr. */
if (ARM_FPS_REGNUM == regno)
regcache_raw_supply (regcache, ARM_FPS_REGNUM,
fp + NWFPE_FPSR_OFFSET);
/* Fetch the floating point register. */
if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM)
supply_nwfpe_register (regcache, regno, fp);
}
/* Get the whole floating point state of the process and store it
into regcache. */
static void
fetch_fpregs (struct regcache *regcache)
{
int ret, regno, tid;
gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
/* Read the floating point state. */
ret = ptrace (PT_GETFPREGS, tid, 0, fp);
if (ret < 0)
{
warning (_("Unable to fetch the floating point registers."));
return;
}
/* Fetch fpsr. */
regcache_raw_supply (regcache, ARM_FPS_REGNUM,
fp + NWFPE_FPSR_OFFSET);
/* Fetch the floating point registers. */
for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
supply_nwfpe_register (regcache, regno, fp);
}
/* Save a particular register into the floating point state of the
process using the contents from regcache. */
static void
store_fpregister (const struct regcache *regcache, int regno)
{
int ret, tid;
gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
/* Read the floating point state. */
ret = ptrace (PT_GETFPREGS, tid, 0, fp);
if (ret < 0)
{
warning (_("Unable to fetch the floating point registers."));
return;
}
/* Store fpsr. */
if (ARM_FPS_REGNUM == regno && regcache_valid_p (regcache, ARM_FPS_REGNUM))
regcache_raw_collect (regcache, ARM_FPS_REGNUM, fp + NWFPE_FPSR_OFFSET);
/* Store the floating point register. */
if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM)
collect_nwfpe_register (regcache, regno, fp);
ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp);
if (ret < 0)
{
warning (_("Unable to store floating point register."));
return;
}
}
/* Save the whole floating point state of the process using
the contents from regcache. */
static void
store_fpregs (const struct regcache *regcache)
{
int ret, regno, tid;
gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
/* Read the floating point state. */
ret = ptrace (PT_GETFPREGS, tid, 0, fp);
if (ret < 0)
{
warning (_("Unable to fetch the floating point registers."));
return;
}
/* Store fpsr. */
if (regcache_valid_p (regcache, ARM_FPS_REGNUM))
regcache_raw_collect (regcache, ARM_FPS_REGNUM, fp + NWFPE_FPSR_OFFSET);
/* Store the floating point registers. */
for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
if (regcache_valid_p (regcache, regno))
collect_nwfpe_register (regcache, regno, fp);
ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp);
if (ret < 0)
{
warning (_("Unable to store floating point registers."));
return;
}
}
/* Fetch a general register of the process and store into
regcache. */
static void
fetch_register (struct regcache *regcache, int regno)
{
int ret, tid;
elf_gregset_t regs;
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
if (ret < 0)
{
warning (_("Unable to fetch general register."));
return;
}
if (regno >= ARM_A1_REGNUM && regno < ARM_PC_REGNUM)
regcache_raw_supply (regcache, regno, (char *) &regs[regno]);
if (ARM_PS_REGNUM == regno)
{
if (arm_apcs_32)
regcache_raw_supply (regcache, ARM_PS_REGNUM,
(char *) &regs[ARM_CPSR_GREGNUM]);
else
regcache_raw_supply (regcache, ARM_PS_REGNUM,
(char *) &regs[ARM_PC_REGNUM]);
}
if (ARM_PC_REGNUM == regno)
{
regs[ARM_PC_REGNUM] = gdbarch_addr_bits_remove
(get_regcache_arch (regcache),
regs[ARM_PC_REGNUM]);
regcache_raw_supply (regcache, ARM_PC_REGNUM,
(char *) &regs[ARM_PC_REGNUM]);
}
}
/* Fetch all general registers of the process and store into
regcache. */
static void
fetch_regs (struct regcache *regcache)
{
int ret, regno, tid;
elf_gregset_t regs;
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
if (ret < 0)
{
warning (_("Unable to fetch general registers."));
return;
}
for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
regcache_raw_supply (regcache, regno, (char *) &regs[regno]);
if (arm_apcs_32)
regcache_raw_supply (regcache, ARM_PS_REGNUM,
(char *) &regs[ARM_CPSR_GREGNUM]);
else
regcache_raw_supply (regcache, ARM_PS_REGNUM,
(char *) &regs[ARM_PC_REGNUM]);
regs[ARM_PC_REGNUM] = gdbarch_addr_bits_remove
(get_regcache_arch (regcache), regs[ARM_PC_REGNUM]);
regcache_raw_supply (regcache, ARM_PC_REGNUM,
(char *) &regs[ARM_PC_REGNUM]);
}
/* Store all general registers of the process from the values in
regcache. */
static void
store_register (const struct regcache *regcache, int regno)
{
int ret, tid;
elf_gregset_t regs;
if (!regcache_valid_p (regcache, regno))
return;
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
/* Get the general registers from the process. */
ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
if (ret < 0)
{
warning (_("Unable to fetch general registers."));
return;
}
if (regno >= ARM_A1_REGNUM && regno <= ARM_PC_REGNUM)
regcache_raw_collect (regcache, regno, (char *) &regs[regno]);
else if (arm_apcs_32 && regno == ARM_PS_REGNUM)
regcache_raw_collect (regcache, regno,
(char *) &regs[ARM_CPSR_GREGNUM]);
else if (!arm_apcs_32 && regno == ARM_PS_REGNUM)
regcache_raw_collect (regcache, ARM_PC_REGNUM,
(char *) &regs[ARM_PC_REGNUM]);
ret = ptrace (PTRACE_SETREGS, tid, 0, &regs);
if (ret < 0)
{
warning (_("Unable to store general register."));
return;
}
}
static void
store_regs (const struct regcache *regcache)
{
int ret, regno, tid;
elf_gregset_t regs;
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
/* Fetch the general registers. */
ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
if (ret < 0)
{
warning (_("Unable to fetch general registers."));
return;
}
for (regno = ARM_A1_REGNUM; regno <= ARM_PC_REGNUM; regno++)
{
if (regcache_valid_p (regcache, regno))
regcache_raw_collect (regcache, regno, (char *) &regs[regno]);
}
if (arm_apcs_32 && regcache_valid_p (regcache, ARM_PS_REGNUM))
regcache_raw_collect (regcache, ARM_PS_REGNUM,
(char *) &regs[ARM_CPSR_GREGNUM]);
ret = ptrace (PTRACE_SETREGS, tid, 0, &regs);
if (ret < 0)
{
warning (_("Unable to store general registers."));
return;
}
}
/* Fetch all WMMX registers of the process and store into
regcache. */
#define IWMMXT_REGS_SIZE (16 * 8 + 6 * 4)
static void
fetch_wmmx_regs (struct regcache *regcache)
{
char regbuf[IWMMXT_REGS_SIZE];
int ret, regno, tid;
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
ret = ptrace (PTRACE_GETWMMXREGS, tid, 0, regbuf);
if (ret < 0)
{
warning (_("Unable to fetch WMMX registers."));
return;
}
for (regno = 0; regno < 16; regno++)
regcache_raw_supply (regcache, regno + ARM_WR0_REGNUM,
&regbuf[regno * 8]);
for (regno = 0; regno < 2; regno++)
regcache_raw_supply (regcache, regno + ARM_WCSSF_REGNUM,
&regbuf[16 * 8 + regno * 4]);
for (regno = 0; regno < 4; regno++)
regcache_raw_supply (regcache, regno + ARM_WCGR0_REGNUM,
&regbuf[16 * 8 + 2 * 4 + regno * 4]);
}
static void
store_wmmx_regs (const struct regcache *regcache)
{
char regbuf[IWMMXT_REGS_SIZE];
int ret, regno, tid;
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
ret = ptrace (PTRACE_GETWMMXREGS, tid, 0, regbuf);
if (ret < 0)
{
warning (_("Unable to fetch WMMX registers."));
return;
}
for (regno = 0; regno < 16; regno++)
if (regcache_valid_p (regcache, regno + ARM_WR0_REGNUM))
regcache_raw_collect (regcache, regno + ARM_WR0_REGNUM,
&regbuf[regno * 8]);
for (regno = 0; regno < 2; regno++)
if (regcache_valid_p (regcache, regno + ARM_WCSSF_REGNUM))
regcache_raw_collect (regcache, regno + ARM_WCSSF_REGNUM,
&regbuf[16 * 8 + regno * 4]);
for (regno = 0; regno < 4; regno++)
if (regcache_valid_p (regcache, regno + ARM_WCGR0_REGNUM))
regcache_raw_collect (regcache, regno + ARM_WCGR0_REGNUM,
&regbuf[16 * 8 + 2 * 4 + regno * 4]);
ret = ptrace (PTRACE_SETWMMXREGS, tid, 0, regbuf);
if (ret < 0)
{
warning (_("Unable to store WMMX registers."));
return;
}
}
/* Fetch registers from the child process. Fetch all registers if
regno == -1, otherwise fetch all general registers or all floating
point registers depending upon the value of regno. */
static void
arm_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{
if (-1 == regno)
{
fetch_regs (regcache);
fetch_fpregs (regcache);
if (arm_linux_has_wmmx_registers)
fetch_wmmx_regs (regcache);
}
else
{
if (regno < ARM_F0_REGNUM || regno == ARM_PS_REGNUM)
fetch_register (regcache, regno);
else if (regno >= ARM_F0_REGNUM && regno <= ARM_FPS_REGNUM)
fetch_fpregister (regcache, regno);
else if (arm_linux_has_wmmx_registers
&& regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
fetch_wmmx_regs (regcache);
}
}
/* Store registers back into the inferior. Store all registers if
regno == -1, otherwise store all general registers or all floating
point registers depending upon the value of regno. */
static void
arm_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{
if (-1 == regno)
{
store_regs (regcache);
store_fpregs (regcache);
if (arm_linux_has_wmmx_registers)
store_wmmx_regs (regcache);
}
else
{
if (regno < ARM_F0_REGNUM || regno == ARM_PS_REGNUM)
store_register (regcache, regno);
else if ((regno >= ARM_F0_REGNUM) && (regno <= ARM_FPS_REGNUM))
store_fpregister (regcache, regno);
else if (arm_linux_has_wmmx_registers
&& regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
store_wmmx_regs (regcache);
}
}
/* Wrapper functions for the standard regset handling, used by
thread debugging. */
void
fill_gregset (const struct regcache *regcache,
gdb_gregset_t *gregsetp, int regno)
{
arm_linux_collect_gregset (NULL, regcache, regno, gregsetp, 0);
}
void
supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
{
arm_linux_supply_gregset (NULL, regcache, -1, gregsetp, 0);
}
void
fill_fpregset (const struct regcache *regcache,
gdb_fpregset_t *fpregsetp, int regno)
{
arm_linux_collect_nwfpe (NULL, regcache, regno, fpregsetp, 0);
}
/* Fill GDB's register array with the floating-point register values
in *fpregsetp. */
void
supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
{
arm_linux_supply_nwfpe (NULL, regcache, -1, fpregsetp, 0);
}
/* Fetch the thread-local storage pointer for libthread_db. */
ps_err_e
ps_get_thread_area (const struct ps_prochandle *ph,
lwpid_t lwpid, int idx, void **base)
{
if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
return PS_ERR;
/* IDX is the bias from the thread pointer to the beginning of the
thread descriptor. It has to be subtracted due to implementation
quirks in libthread_db. */
*base = (void *) ((char *)*base - idx);
return PS_OK;
}
static unsigned int
get_linux_version (unsigned int *vmajor,
unsigned int *vminor,
unsigned int *vrelease)
{
struct utsname info;
char *pmajor, *pminor, *prelease, *tail;
if (-1 == uname (&info))
{
warning (_("Unable to determine GNU/Linux version."));
return -1;
}
pmajor = strtok (info.release, ".");
pminor = strtok (NULL, ".");
prelease = strtok (NULL, ".");
*vmajor = (unsigned int) strtoul (pmajor, &tail, 0);
*vminor = (unsigned int) strtoul (pminor, &tail, 0);
*vrelease = (unsigned int) strtoul (prelease, &tail, 0);
return ((*vmajor << 16) | (*vminor << 8) | *vrelease);
}
static const struct target_desc *
arm_linux_read_description (struct target_ops *ops)
{
int ret;
char regbuf[IWMMXT_REGS_SIZE];
ret = ptrace (PTRACE_GETWMMXREGS, GET_THREAD_ID (inferior_ptid),
0, regbuf);
if (ret < 0)
arm_linux_has_wmmx_registers = 0;
else
arm_linux_has_wmmx_registers = 1;
if (arm_linux_has_wmmx_registers)
return tdesc_arm_with_iwmmxt;
else
return NULL;
}
void _initialize_arm_linux_nat (void);
void
_initialize_arm_linux_nat (void)
{
struct target_ops *t;
os_version = get_linux_version (&os_major, &os_minor, &os_release);
/* Fill in the generic GNU/Linux methods. */
t = linux_target ();
/* Add our register access methods. */
t->to_fetch_registers = arm_linux_fetch_inferior_registers;
t->to_store_registers = arm_linux_store_inferior_registers;
t->to_read_description = arm_linux_read_description;
/* Register the target. */
linux_nat_add_target (t);
/* Initialize the standard target descriptions. */
initialize_tdesc_arm_with_iwmmxt ();
}

View File

@@ -1,663 +0,0 @@
/* GNU/Linux on ARM target support.
Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "target.h"
#include "value.h"
#include "gdbtypes.h"
#include "floatformat.h"
#include "gdbcore.h"
#include "frame.h"
#include "regcache.h"
#include "doublest.h"
#include "solib-svr4.h"
#include "osabi.h"
#include "regset.h"
#include "trad-frame.h"
#include "tramp-frame.h"
#include "breakpoint.h"
#include "arm-tdep.h"
#include "arm-linux-tdep.h"
#include "linux-tdep.h"
#include "glibc-tdep.h"
#include "gdb_string.h"
extern int arm_apcs_32;
/* Under ARM GNU/Linux the traditional way of performing a breakpoint
is to execute a particular software interrupt, rather than use a
particular undefined instruction to provoke a trap. Upon exection
of the software interrupt the kernel stops the inferior with a
SIGTRAP, and wakes the debugger. */
static const char arm_linux_arm_le_breakpoint[] = { 0x01, 0x00, 0x9f, 0xef };
static const char arm_linux_arm_be_breakpoint[] = { 0xef, 0x9f, 0x00, 0x01 };
/* However, the EABI syscall interface (new in Nov. 2005) does not look at
the operand of the swi if old-ABI compatibility is disabled. Therefore,
use an undefined instruction instead. This is supported as of kernel
version 2.5.70 (May 2003), so should be a safe assumption for EABI
binaries. */
static const char eabi_linux_arm_le_breakpoint[] = { 0xf0, 0x01, 0xf0, 0xe7 };
static const char eabi_linux_arm_be_breakpoint[] = { 0xe7, 0xf0, 0x01, 0xf0 };
/* All the kernels which support Thumb support using a specific undefined
instruction for the Thumb breakpoint. */
static const char arm_linux_thumb_be_breakpoint[] = {0xde, 0x01};
static const char arm_linux_thumb_le_breakpoint[] = {0x01, 0xde};
/* Description of the longjmp buffer. */
#define ARM_LINUX_JB_ELEMENT_SIZE INT_REGISTER_SIZE
#define ARM_LINUX_JB_PC 21
/*
Dynamic Linking on ARM GNU/Linux
--------------------------------
Note: PLT = procedure linkage table
GOT = global offset table
As much as possible, ELF dynamic linking defers the resolution of
jump/call addresses until the last minute. The technique used is
inspired by the i386 ELF design, and is based on the following
constraints.
1) The calling technique should not force a change in the assembly
code produced for apps; it MAY cause changes in the way assembly
code is produced for position independent code (i.e. shared
libraries).
2) The technique must be such that all executable areas must not be
modified; and any modified areas must not be executed.
To do this, there are three steps involved in a typical jump:
1) in the code
2) through the PLT
3) using a pointer from the GOT
When the executable or library is first loaded, each GOT entry is
initialized to point to the code which implements dynamic name
resolution and code finding. This is normally a function in the
program interpreter (on ARM GNU/Linux this is usually
ld-linux.so.2, but it does not have to be). On the first
invocation, the function is located and the GOT entry is replaced
with the real function address. Subsequent calls go through steps
1, 2 and 3 and end up calling the real code.
1) In the code:
b function_call
bl function_call
This is typical ARM code using the 26 bit relative branch or branch
and link instructions. The target of the instruction
(function_call is usually the address of the function to be called.
In position independent code, the target of the instruction is
actually an entry in the PLT when calling functions in a shared
library. Note that this call is identical to a normal function
call, only the target differs.
2) In the PLT:
The PLT is a synthetic area, created by the linker. It exists in
both executables and libraries. It is an array of stubs, one per
imported function call. It looks like this:
PLT[0]:
str lr, [sp, #-4]! @push the return address (lr)
ldr lr, [pc, #16] @load from 6 words ahead
add lr, pc, lr @form an address for GOT[0]
ldr pc, [lr, #8]! @jump to the contents of that addr
The return address (lr) is pushed on the stack and used for
calculations. The load on the second line loads the lr with
&GOT[3] - . - 20. The addition on the third leaves:
lr = (&GOT[3] - . - 20) + (. + 8)
lr = (&GOT[3] - 12)
lr = &GOT[0]
On the fourth line, the pc and lr are both updated, so that:
pc = GOT[2]
lr = &GOT[0] + 8
= &GOT[2]
NOTE: PLT[0] borrows an offset .word from PLT[1]. This is a little
"tight", but allows us to keep all the PLT entries the same size.
PLT[n+1]:
ldr ip, [pc, #4] @load offset from gotoff
add ip, pc, ip @add the offset to the pc
ldr pc, [ip] @jump to that address
gotoff: .word GOT[n+3] - .
The load on the first line, gets an offset from the fourth word of
the PLT entry. The add on the second line makes ip = &GOT[n+3],
which contains either a pointer to PLT[0] (the fixup trampoline) or
a pointer to the actual code.
3) In the GOT:
The GOT contains helper pointers for both code (PLT) fixups and
data fixups. The first 3 entries of the GOT are special. The next
M entries (where M is the number of entries in the PLT) belong to
the PLT fixups. The next D (all remaining) entries belong to
various data fixups. The actual size of the GOT is 3 + M + D.
The GOT is also a synthetic area, created by the linker. It exists
in both executables and libraries. When the GOT is first
initialized , all the GOT entries relating to PLT fixups are
pointing to code back at PLT[0].
The special entries in the GOT are:
GOT[0] = linked list pointer used by the dynamic loader
GOT[1] = pointer to the reloc table for this module
GOT[2] = pointer to the fixup/resolver code
The first invocation of function call comes through and uses the
fixup/resolver code. On the entry to the fixup/resolver code:
ip = &GOT[n+3]
lr = &GOT[2]
stack[0] = return address (lr) of the function call
[r0, r1, r2, r3] are still the arguments to the function call
This is enough information for the fixup/resolver code to work
with. Before the fixup/resolver code returns, it actually calls
the requested function and repairs &GOT[n+3]. */
/* The constants below were determined by examining the following files
in the linux kernel sources:
arch/arm/kernel/signal.c
- see SWI_SYS_SIGRETURN and SWI_SYS_RT_SIGRETURN
include/asm-arm/unistd.h
- see __NR_sigreturn, __NR_rt_sigreturn, and __NR_SYSCALL_BASE */
#define ARM_LINUX_SIGRETURN_INSTR 0xef900077
#define ARM_LINUX_RT_SIGRETURN_INSTR 0xef9000ad
/* For ARM EABI, the syscall number is not in the SWI instruction
(instead it is loaded into r7). We recognize the pattern that
glibc uses... alternatively, we could arrange to do this by
function name, but they are not always exported. */
#define ARM_SET_R7_SIGRETURN 0xe3a07077
#define ARM_SET_R7_RT_SIGRETURN 0xe3a070ad
#define ARM_EABI_SYSCALL 0xef000000
static void
arm_linux_sigtramp_cache (struct frame_info *this_frame,
struct trad_frame_cache *this_cache,
CORE_ADDR func, int regs_offset)
{
CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
CORE_ADDR base = sp + regs_offset;
int i;
for (i = 0; i < 16; i++)
trad_frame_set_reg_addr (this_cache, i, base + i * 4);
trad_frame_set_reg_addr (this_cache, ARM_PS_REGNUM, base + 16 * 4);
/* The VFP or iWMMXt registers may be saved on the stack, but there's
no reliable way to restore them (yet). */
/* Save a frame ID. */
trad_frame_set_id (this_cache, frame_id_build (sp, func));
}
/* There are a couple of different possible stack layouts that
we need to support.
Before version 2.6.18, the kernel used completely independent
layouts for non-RT and RT signals. For non-RT signals the stack
began directly with a struct sigcontext. For RT signals the stack
began with two redundant pointers (to the siginfo and ucontext),
and then the siginfo and ucontext.
As of version 2.6.18, the non-RT signal frame layout starts with
a ucontext and the RT signal frame starts with a siginfo and then
a ucontext. Also, the ucontext now has a designated save area
for coprocessor registers.
For RT signals, it's easy to tell the difference: we look for
pinfo, the pointer to the siginfo. If it has the expected
value, we have an old layout. If it doesn't, we have the new
layout.
For non-RT signals, it's a bit harder. We need something in one
layout or the other with a recognizable offset and value. We can't
use the return trampoline, because ARM usually uses SA_RESTORER,
in which case the stack return trampoline is not filled in.
We can't use the saved stack pointer, because sigaltstack might
be in use. So for now we guess the new layout... */
/* There are three words (trap_no, error_code, oldmask) in
struct sigcontext before r0. */
#define ARM_SIGCONTEXT_R0 0xc
/* There are five words (uc_flags, uc_link, and three for uc_stack)
in the ucontext_t before the sigcontext. */
#define ARM_UCONTEXT_SIGCONTEXT 0x14
/* There are three elements in an rt_sigframe before the ucontext:
pinfo, puc, and info. The first two are pointers and the third
is a struct siginfo, with size 128 bytes. We could follow puc
to the ucontext, but it's simpler to skip the whole thing. */
#define ARM_OLD_RT_SIGFRAME_SIGINFO 0x8
#define ARM_OLD_RT_SIGFRAME_UCONTEXT 0x88
#define ARM_NEW_RT_SIGFRAME_UCONTEXT 0x80
#define ARM_NEW_SIGFRAME_MAGIC 0x5ac3c35a
static void
arm_linux_sigreturn_init (const struct tramp_frame *self,
struct frame_info *this_frame,
struct trad_frame_cache *this_cache,
CORE_ADDR func)
{
CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
ULONGEST uc_flags = read_memory_unsigned_integer (sp, 4);
if (uc_flags == ARM_NEW_SIGFRAME_MAGIC)
arm_linux_sigtramp_cache (this_frame, this_cache, func,
ARM_UCONTEXT_SIGCONTEXT
+ ARM_SIGCONTEXT_R0);
else
arm_linux_sigtramp_cache (this_frame, this_cache, func,
ARM_SIGCONTEXT_R0);
}
static void
arm_linux_rt_sigreturn_init (const struct tramp_frame *self,
struct frame_info *this_frame,
struct trad_frame_cache *this_cache,
CORE_ADDR func)
{
CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
ULONGEST pinfo = read_memory_unsigned_integer (sp, 4);
if (pinfo == sp + ARM_OLD_RT_SIGFRAME_SIGINFO)
arm_linux_sigtramp_cache (this_frame, this_cache, func,
ARM_OLD_RT_SIGFRAME_UCONTEXT
+ ARM_UCONTEXT_SIGCONTEXT
+ ARM_SIGCONTEXT_R0);
else
arm_linux_sigtramp_cache (this_frame, this_cache, func,
ARM_NEW_RT_SIGFRAME_UCONTEXT
+ ARM_UCONTEXT_SIGCONTEXT
+ ARM_SIGCONTEXT_R0);
}
static struct tramp_frame arm_linux_sigreturn_tramp_frame = {
SIGTRAMP_FRAME,
4,
{
{ ARM_LINUX_SIGRETURN_INSTR, -1 },
{ TRAMP_SENTINEL_INSN }
},
arm_linux_sigreturn_init
};
static struct tramp_frame arm_linux_rt_sigreturn_tramp_frame = {
SIGTRAMP_FRAME,
4,
{
{ ARM_LINUX_RT_SIGRETURN_INSTR, -1 },
{ TRAMP_SENTINEL_INSN }
},
arm_linux_rt_sigreturn_init
};
static struct tramp_frame arm_eabi_linux_sigreturn_tramp_frame = {
SIGTRAMP_FRAME,
4,
{
{ ARM_SET_R7_SIGRETURN, -1 },
{ ARM_EABI_SYSCALL, -1 },
{ TRAMP_SENTINEL_INSN }
},
arm_linux_sigreturn_init
};
static struct tramp_frame arm_eabi_linux_rt_sigreturn_tramp_frame = {
SIGTRAMP_FRAME,
4,
{
{ ARM_SET_R7_RT_SIGRETURN, -1 },
{ ARM_EABI_SYSCALL, -1 },
{ TRAMP_SENTINEL_INSN }
},
arm_linux_rt_sigreturn_init
};
/* Core file and register set support. */
#define ARM_LINUX_SIZEOF_GREGSET (18 * INT_REGISTER_SIZE)
void
arm_linux_supply_gregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *gregs_buf, size_t len)
{
const gdb_byte *gregs = gregs_buf;
int regno;
CORE_ADDR reg_pc;
gdb_byte pc_buf[INT_REGISTER_SIZE];
for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
if (regnum == -1 || regnum == regno)
regcache_raw_supply (regcache, regno,
gregs + INT_REGISTER_SIZE * regno);
if (regnum == ARM_PS_REGNUM || regnum == -1)
{
if (arm_apcs_32)
regcache_raw_supply (regcache, ARM_PS_REGNUM,
gregs + INT_REGISTER_SIZE * ARM_CPSR_GREGNUM);
else
regcache_raw_supply (regcache, ARM_PS_REGNUM,
gregs + INT_REGISTER_SIZE * ARM_PC_REGNUM);
}
if (regnum == ARM_PC_REGNUM || regnum == -1)
{
reg_pc = extract_unsigned_integer (gregs
+ INT_REGISTER_SIZE * ARM_PC_REGNUM,
INT_REGISTER_SIZE);
reg_pc = gdbarch_addr_bits_remove (get_regcache_arch (regcache), reg_pc);
store_unsigned_integer (pc_buf, INT_REGISTER_SIZE, reg_pc);
regcache_raw_supply (regcache, ARM_PC_REGNUM, pc_buf);
}
}
void
arm_linux_collect_gregset (const struct regset *regset,
const struct regcache *regcache,
int regnum, void *gregs_buf, size_t len)
{
gdb_byte *gregs = gregs_buf;
int regno;
for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
if (regnum == -1 || regnum == regno)
regcache_raw_collect (regcache, regno,
gregs + INT_REGISTER_SIZE * regno);
if (regnum == ARM_PS_REGNUM || regnum == -1)
{
if (arm_apcs_32)
regcache_raw_collect (regcache, ARM_PS_REGNUM,
gregs + INT_REGISTER_SIZE * ARM_CPSR_GREGNUM);
else
regcache_raw_collect (regcache, ARM_PS_REGNUM,
gregs + INT_REGISTER_SIZE * ARM_PC_REGNUM);
}
if (regnum == ARM_PC_REGNUM || regnum == -1)
regcache_raw_collect (regcache, ARM_PC_REGNUM,
gregs + INT_REGISTER_SIZE * ARM_PC_REGNUM);
}
/* Support for register format used by the NWFPE FPA emulator. */
#define typeNone 0x00
#define typeSingle 0x01
#define typeDouble 0x02
#define typeExtended 0x03
void
supply_nwfpe_register (struct regcache *regcache, int regno,
const gdb_byte *regs)
{
const gdb_byte *reg_data;
gdb_byte reg_tag;
gdb_byte buf[FP_REGISTER_SIZE];
reg_data = regs + (regno - ARM_F0_REGNUM) * FP_REGISTER_SIZE;
reg_tag = regs[(regno - ARM_F0_REGNUM) + NWFPE_TAGS_OFFSET];
memset (buf, 0, FP_REGISTER_SIZE);
switch (reg_tag)
{
case typeSingle:
memcpy (buf, reg_data, 4);
break;
case typeDouble:
memcpy (buf, reg_data + 4, 4);
memcpy (buf + 4, reg_data, 4);
break;
case typeExtended:
/* We want sign and exponent, then least significant bits,
then most significant. NWFPE does sign, most, least. */
memcpy (buf, reg_data, 4);
memcpy (buf + 4, reg_data + 8, 4);
memcpy (buf + 8, reg_data + 4, 4);
break;
default:
break;
}
regcache_raw_supply (regcache, regno, buf);
}
void
collect_nwfpe_register (const struct regcache *regcache, int regno,
gdb_byte *regs)
{
gdb_byte *reg_data;
gdb_byte reg_tag;
gdb_byte buf[FP_REGISTER_SIZE];
regcache_raw_collect (regcache, regno, buf);
/* NOTE drow/2006-06-07: This code uses the tag already in the
register buffer. I've preserved that when moving the code
from the native file to the target file. But this doesn't
always make sense. */
reg_data = regs + (regno - ARM_F0_REGNUM) * FP_REGISTER_SIZE;
reg_tag = regs[(regno - ARM_F0_REGNUM) + NWFPE_TAGS_OFFSET];
switch (reg_tag)
{
case typeSingle:
memcpy (reg_data, buf, 4);
break;
case typeDouble:
memcpy (reg_data, buf + 4, 4);
memcpy (reg_data + 4, buf, 4);
break;
case typeExtended:
memcpy (reg_data, buf, 4);
memcpy (reg_data + 4, buf + 8, 4);
memcpy (reg_data + 8, buf + 4, 4);
break;
default:
break;
}
}
void
arm_linux_supply_nwfpe (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *regs_buf, size_t len)
{
const gdb_byte *regs = regs_buf;
int regno;
if (regnum == ARM_FPS_REGNUM || regnum == -1)
regcache_raw_supply (regcache, ARM_FPS_REGNUM,
regs + NWFPE_FPSR_OFFSET);
for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
if (regnum == -1 || regnum == regno)
supply_nwfpe_register (regcache, regno, regs);
}
void
arm_linux_collect_nwfpe (const struct regset *regset,
const struct regcache *regcache,
int regnum, void *regs_buf, size_t len)
{
gdb_byte *regs = regs_buf;
int regno;
for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
if (regnum == -1 || regnum == regno)
collect_nwfpe_register (regcache, regno, regs);
if (regnum == ARM_FPS_REGNUM || regnum == -1)
regcache_raw_collect (regcache, ARM_FPS_REGNUM,
regs + INT_REGISTER_SIZE * ARM_FPS_REGNUM);
}
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
static const struct regset *
arm_linux_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
if (strcmp (sect_name, ".reg") == 0
&& sect_size == ARM_LINUX_SIZEOF_GREGSET)
{
if (tdep->gregset == NULL)
tdep->gregset = regset_alloc (gdbarch, arm_linux_supply_gregset,
arm_linux_collect_gregset);
return tdep->gregset;
}
if (strcmp (sect_name, ".reg2") == 0
&& sect_size == ARM_LINUX_SIZEOF_NWFPE)
{
if (tdep->fpregset == NULL)
tdep->fpregset = regset_alloc (gdbarch, arm_linux_supply_nwfpe,
arm_linux_collect_nwfpe);
return tdep->fpregset;
}
return NULL;
}
/* Insert a single step breakpoint at the next executed instruction. */
static int
arm_linux_software_single_step (struct frame_info *frame)
{
CORE_ADDR next_pc = arm_get_next_pc (frame, get_frame_pc (frame));
/* The Linux kernel offers some user-mode helpers in a high page. We can
not read this page (as of 2.6.23), and even if we could then we couldn't
set breakpoints in it, and even if we could then the atomic operations
would fail when interrupted. They are all called as functions and return
to the address in LR, so step to there instead. */
if (next_pc > 0xffff0000)
next_pc = get_frame_register_unsigned (frame, ARM_LR_REGNUM);
insert_single_step_breakpoint (next_pc);
return 1;
}
static void
arm_linux_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->lowest_pc = 0x8000;
if (info.byte_order == BFD_ENDIAN_BIG)
{
if (tdep->arm_abi == ARM_ABI_AAPCS)
tdep->arm_breakpoint = eabi_linux_arm_be_breakpoint;
else
tdep->arm_breakpoint = arm_linux_arm_be_breakpoint;
tdep->thumb_breakpoint = arm_linux_thumb_be_breakpoint;
}
else
{
if (tdep->arm_abi == ARM_ABI_AAPCS)
tdep->arm_breakpoint = eabi_linux_arm_le_breakpoint;
else
tdep->arm_breakpoint = arm_linux_arm_le_breakpoint;
tdep->thumb_breakpoint = arm_linux_thumb_le_breakpoint;
}
tdep->arm_breakpoint_size = sizeof (arm_linux_arm_le_breakpoint);
tdep->thumb_breakpoint_size = sizeof (arm_linux_thumb_le_breakpoint);
if (tdep->fp_model == ARM_FLOAT_AUTO)
tdep->fp_model = ARM_FLOAT_FPA;
tdep->jb_pc = ARM_LINUX_JB_PC;
tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE;
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
/* Single stepping. */
set_gdbarch_software_single_step (gdbarch, arm_linux_software_single_step);
/* Shared library handling. */
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
/* Enable TLS support. */
set_gdbarch_fetch_tls_load_module_address (gdbarch,
svr4_fetch_objfile_link_map);
tramp_frame_prepend_unwinder (gdbarch,
&arm_linux_sigreturn_tramp_frame);
tramp_frame_prepend_unwinder (gdbarch,
&arm_linux_rt_sigreturn_tramp_frame);
tramp_frame_prepend_unwinder (gdbarch,
&arm_eabi_linux_sigreturn_tramp_frame);
tramp_frame_prepend_unwinder (gdbarch,
&arm_eabi_linux_rt_sigreturn_tramp_frame);
/* Core file support. */
set_gdbarch_regset_from_core_section (gdbarch,
arm_linux_regset_from_core_section);
set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type);
}
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_arm_linux_tdep;
void
_initialize_arm_linux_tdep (void)
{
gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_LINUX,
arm_linux_init_abi);
}

View File

@@ -1,60 +0,0 @@
/* GNU/Linux on ARM target support, prototypes.
Copyright (C) 2006, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
struct regset;
struct regcache;
#define ARM_LINUX_SIZEOF_NWFPE (8 * FP_REGISTER_SIZE \
+ 2 * INT_REGISTER_SIZE \
+ 8 + INT_REGISTER_SIZE)
/* The index to access CSPR in user_regs defined in GLIBC. */
#define ARM_CPSR_GREGNUM 16
/* Support for register format used by the NWFPE FPA emulator. Each
register takes three words, where either the first one, two, or
three hold a single, double, or extended precision value (depending
on the corresponding tag). The register set is eight registers,
followed by the fpsr and fpcr, followed by eight tag bytes, and a
final word flag which indicates whether NWFPE has been
initialized. */
#define NWFPE_FPSR_OFFSET (8 * FP_REGISTER_SIZE)
#define NWFPE_FPCR_OFFSET (NWFPE_FPSR_OFFSET + INT_REGISTER_SIZE)
#define NWFPE_TAGS_OFFSET (NWFPE_FPCR_OFFSET + INT_REGISTER_SIZE)
#define NWFPE_INITFLAG_OFFSET (NWFPE_TAGS_OFFSET + 8)
void arm_linux_supply_gregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *gregs_buf, size_t len);
void arm_linux_collect_gregset (const struct regset *regset,
const struct regcache *regcache,
int regnum, void *gregs_buf, size_t len);
void supply_nwfpe_register (struct regcache *regcache, int regno,
const gdb_byte *regs);
void collect_nwfpe_register (const struct regcache *regcache, int regno,
gdb_byte *regs);
void arm_linux_supply_nwfpe (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *regs_buf, size_t len);
void arm_linux_collect_nwfpe (const struct regset *regset,
const struct regcache *regcache,
int regnum, void *regs_buf, size_t len);

File diff suppressed because it is too large Load Diff

View File

@@ -1,189 +0,0 @@
/* Common target dependent code for GDB on ARM systems.
Copyright (C) 2002, 2003, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef ARM_TDEP_H
#define ARM_TDEP_H
/* Forward declarations. */
struct gdbarch;
struct regset;
/* Register numbers of various important registers. */
enum gdb_regnum {
ARM_A1_REGNUM = 0, /* first integer-like argument */
ARM_A4_REGNUM = 3, /* last integer-like argument */
ARM_AP_REGNUM = 11,
ARM_IP_REGNUM = 12,
ARM_SP_REGNUM = 13, /* Contains address of top of stack */
ARM_LR_REGNUM = 14, /* address to return to from a function call */
ARM_PC_REGNUM = 15, /* Contains program counter */
ARM_F0_REGNUM = 16, /* first floating point register */
ARM_F3_REGNUM = 19, /* last floating point argument register */
ARM_F7_REGNUM = 23, /* last floating point register */
ARM_FPS_REGNUM = 24, /* floating point status register */
ARM_PS_REGNUM = 25, /* Contains processor status */
ARM_WR0_REGNUM, /* WMMX data registers. */
ARM_WR15_REGNUM = ARM_WR0_REGNUM + 15,
ARM_WC0_REGNUM, /* WMMX control registers. */
ARM_WCSSF_REGNUM = ARM_WC0_REGNUM + 2,
ARM_WCASF_REGNUM = ARM_WC0_REGNUM + 3,
ARM_WC7_REGNUM = ARM_WC0_REGNUM + 7,
ARM_WCGR0_REGNUM, /* WMMX general purpose registers. */
ARM_WCGR3_REGNUM = ARM_WCGR0_REGNUM + 3,
ARM_WCGR7_REGNUM = ARM_WCGR0_REGNUM + 7,
ARM_NUM_REGS,
/* Other useful registers. */
ARM_FP_REGNUM = 11, /* Frame register in ARM code, if used. */
THUMB_FP_REGNUM = 7, /* Frame register in Thumb code, if used. */
ARM_NUM_ARG_REGS = 4,
ARM_LAST_ARG_REGNUM = ARM_A4_REGNUM,
ARM_NUM_FP_ARG_REGS = 4,
ARM_LAST_FP_ARG_REGNUM = ARM_F3_REGNUM
};
/* Size of integer registers. */
#define INT_REGISTER_SIZE 4
/* Say how long FP registers are. Used for documentation purposes and
code readability in this header. IEEE extended doubles are 80
bits. DWORD aligned they use 96 bits. */
#define FP_REGISTER_SIZE 12
/* Number of machine registers. The only define actually required
is gdbarch_num_regs. The other definitions are used for documentation
purposes and code readability. */
/* For 26 bit ARM code, a fake copy of the PC is placed in register 25 (PS)
(and called PS for processor status) so the status bits can be cleared
from the PC (register 15). For 32 bit ARM code, a copy of CPSR is placed
in PS. */
#define NUM_FREGS 8 /* Number of floating point registers. */
#define NUM_SREGS 2 /* Number of status registers. */
#define NUM_GREGS 16 /* Number of general purpose registers. */
/* Instruction condition field values. */
#define INST_EQ 0x0
#define INST_NE 0x1
#define INST_CS 0x2
#define INST_CC 0x3
#define INST_MI 0x4
#define INST_PL 0x5
#define INST_VS 0x6
#define INST_VC 0x7
#define INST_HI 0x8
#define INST_LS 0x9
#define INST_GE 0xa
#define INST_LT 0xb
#define INST_GT 0xc
#define INST_LE 0xd
#define INST_AL 0xe
#define INST_NV 0xf
#define FLAG_N 0x80000000
#define FLAG_Z 0x40000000
#define FLAG_C 0x20000000
#define FLAG_V 0x10000000
#define CPSR_T 0x20
/* Type of floating-point code in use by inferior. There are really 3 models
that are traditionally supported (plus the endianness issue), but gcc can
only generate 2 of those. The third is APCS_FLOAT, where arguments to
functions are passed in floating-point registers.
In addition to the traditional models, VFP adds two more.
If you update this enum, don't forget to update fp_model_strings in
arm-tdep.c. */
enum arm_float_model
{
ARM_FLOAT_AUTO, /* Automatic detection. Do not set in tdep. */
ARM_FLOAT_SOFT_FPA, /* Traditional soft-float (mixed-endian on LE ARM). */
ARM_FLOAT_FPA, /* FPA co-processor. GCC calling convention. */
ARM_FLOAT_SOFT_VFP, /* Soft-float with pure-endian doubles. */
ARM_FLOAT_VFP, /* Full VFP calling convention. */
ARM_FLOAT_LAST /* Keep at end. */
};
/* ABI used by the inferior. */
enum arm_abi_kind
{
ARM_ABI_AUTO,
ARM_ABI_APCS,
ARM_ABI_AAPCS,
ARM_ABI_LAST
};
/* Convention for returning structures. */
enum struct_return
{
pcc_struct_return, /* Return "short" structures in memory. */
reg_struct_return /* Return "short" structures in registers. */
};
/* Target-dependent structure in gdbarch. */
struct gdbarch_tdep
{
/* The ABI for this architecture. It should never be set to
ARM_ABI_AUTO. */
enum arm_abi_kind arm_abi;
enum arm_float_model fp_model; /* Floating point calling conventions. */
int have_fpa_registers; /* Does the target report the FPA registers? */
CORE_ADDR lowest_pc; /* Lowest address at which instructions
will appear. */
const char *arm_breakpoint; /* Breakpoint pattern for an ARM insn. */
int arm_breakpoint_size; /* And its size. */
const char *thumb_breakpoint; /* Breakpoint pattern for an ARM insn. */
int thumb_breakpoint_size; /* And its size. */
int jb_pc; /* Offset to PC value in jump buffer.
If this is negative, longjmp support
will be disabled. */
size_t jb_elt_size; /* And the size of each entry in the buf. */
/* Convention for returning structures. */
enum struct_return struct_return;
/* Cached core file helpers. */
struct regset *gregset, *fpregset;
};
CORE_ADDR arm_skip_stub (struct frame_info *, CORE_ADDR);
CORE_ADDR arm_get_next_pc (struct frame_info *, CORE_ADDR);
int arm_software_single_step (struct frame_info *);
/* Functions exported from armbsd-tdep.h. */
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
extern const struct regset *
armbsd_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size);
#endif /* arm-tdep.h */

View File

@@ -1,126 +0,0 @@
/* Target-dependent code for Windows CE running on ARM processors,
for GDB.
Copyright (C) 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "osabi.h"
#include "gdbcore.h"
#include "target.h"
#include "solib.h"
#include "solib-target.h"
#include "gdb_string.h"
#include "arm-tdep.h"
static const char arm_wince_le_breakpoint[] = { 0x10, 0x00, 0x00, 0xe6 };
static const char arm_wince_thumb_le_breakpoint[] = { 0xfe, 0xdf };
/* Description of the longjmp buffer. */
#define ARM_WINCE_JB_ELEMENT_SIZE INT_REGISTER_SIZE
#define ARM_WINCE_JB_PC 10
static CORE_ADDR
arm_pe_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
{
ULONGEST indirect;
struct minimal_symbol *indsym;
char *symname;
CORE_ADDR next_pc;
/* The format of an ARM DLL trampoline is:
ldr ip, [pc]
ldr pc, [ip]
.dw __imp_<func> */
if (pc == 0
|| read_memory_unsigned_integer (pc + 0, 4) != 0xe59fc000
|| read_memory_unsigned_integer (pc + 4, 4) != 0xe59cf000)
return 0;
indirect = read_memory_unsigned_integer (pc + 8, 4);
if (indirect == 0)
return 0;
indsym = lookup_minimal_symbol_by_pc (indirect);
if (indsym == NULL)
return 0;
symname = SYMBOL_LINKAGE_NAME (indsym);
if (symname == NULL || strncmp (symname, "__imp_", 6) != 0)
return 0;
next_pc = read_memory_unsigned_integer (indirect, 4);
if (next_pc != 0)
return next_pc;
/* Check with the default arm gdbarch_skip_trampoline. */
return arm_skip_stub (frame, pc);
}
static void
arm_wince_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->arm_breakpoint = arm_wince_le_breakpoint;
tdep->arm_breakpoint_size = sizeof (arm_wince_le_breakpoint);
tdep->thumb_breakpoint = arm_wince_thumb_le_breakpoint;
tdep->thumb_breakpoint_size = sizeof (arm_wince_thumb_le_breakpoint);
tdep->struct_return = pcc_struct_return;
tdep->fp_model = ARM_FLOAT_SOFT_VFP;
tdep->jb_pc = ARM_WINCE_JB_PC;
tdep->jb_elt_size = ARM_WINCE_JB_ELEMENT_SIZE;
/* On ARM WinCE char defaults to signed. */
set_gdbarch_char_signed (gdbarch, 1);
/* Shared library handling. */
set_solib_ops (gdbarch, &solib_target_so_ops);
set_gdbarch_skip_trampoline_code (gdbarch, arm_pe_skip_trampoline_code);
/* Single stepping. */
set_gdbarch_software_single_step (gdbarch, arm_software_single_step);
}
static enum gdb_osabi
arm_wince_osabi_sniffer (bfd *abfd)
{
const char *target_name = bfd_get_target (abfd);
if (strcmp (target_name, "pei-arm-wince-little") == 0)
return GDB_OSABI_WINCE;
return GDB_OSABI_UNKNOWN;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_arm_wince_tdep (void);
void
_initialize_arm_wince_tdep (void)
{
gdbarch_register_osabi_sniffer (bfd_arch_arm, bfd_target_coff_flavour,
arm_wince_osabi_sniffer);
gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_WINCE,
arm_wince_init_abi);
}

View File

@@ -1,127 +0,0 @@
/* Target-dependent code for ARM BSD's.
Copyright (C) 2006, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "osabi.h"
#include "regcache.h"
#include "regset.h"
#include "gdb_assert.h"
#include "gdb_string.h"
#include "arm-tdep.h"
/* Core file support. */
/* Sizeof `struct reg' in <machine/reg.h>. */
#define ARMBSD_SIZEOF_GREGS (17 * 4)
/* Sizeof `struct fpreg' in <machine/reg.h. */
#define ARMBSD_SIZEOF_FPREGS ((1 + (8 * 3)) * 4)
static int
armbsd_fpreg_offset (int regnum)
{
if (regnum == ARM_FPS_REGNUM)
return 0;
return 4 + (regnum - ARM_F0_REGNUM) * 12;
}
/* Supply register REGNUM from the buffer specified by FPREGS and LEN
in the floating-point register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
armbsd_supply_fpregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *fpregs, size_t len)
{
const gdb_byte *regs = fpregs;
int i;
gdb_assert (len >= ARMBSD_SIZEOF_FPREGS);
for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
{
if (regnum == i || regnum == -1)
regcache_raw_supply (regcache, i, regs + armbsd_fpreg_offset (i));
}
}
/* Supply register REGNUM from the buffer specified by GREGS and LEN
in the general-purpose register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
armbsd_supply_gregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *gregs, size_t len)
{
const gdb_byte *regs = gregs;
int i;
gdb_assert (len >= ARMBSD_SIZEOF_GREGS);
for (i = ARM_A1_REGNUM; i <= ARM_PC_REGNUM; i++)
{
if (regnum == i || regnum == -1)
regcache_raw_supply (regcache, i, regs + i * 4);
}
if (regnum == ARM_PS_REGNUM || regnum == -1)
regcache_raw_supply (regcache, i, regs + 16 * 4);
if (len >= ARMBSD_SIZEOF_GREGS + ARMBSD_SIZEOF_FPREGS)
{
regs += ARMBSD_SIZEOF_GREGS;
len -= ARMBSD_SIZEOF_GREGS;
armbsd_supply_fpregset (regset, regcache, regnum, regs, len);
}
}
/* ARM register sets. */
static struct regset armbsd_gregset =
{
NULL,
armbsd_supply_gregset
};
static struct regset armbsd_fpregset =
{
NULL,
armbsd_supply_fpregset
};
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
const struct regset *
armbsd_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size)
{
if (strcmp (sect_name, ".reg") == 0 && sect_size >= ARMBSD_SIZEOF_GREGS)
return &armbsd_gregset;
if (strcmp (sect_name, ".reg2") == 0 && sect_size >= ARMBSD_SIZEOF_FPREGS)
return &armbsd_fpregset;
return NULL;
}

View File

@@ -1,504 +0,0 @@
/* Native-dependent code for BSD Unix running on ARM's, for GDB.
Copyright (C) 1988, 1989, 1991, 1992, 1994, 1996, 1999, 2002, 2004, 2007,
2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "gdbcore.h"
#include "inferior.h"
#include "regcache.h"
#include "target.h"
#include "gdb_string.h"
#include <sys/types.h>
#include <sys/ptrace.h>
#include <machine/reg.h>
#include <machine/frame.h>
#include "arm-tdep.h"
#include "inf-ptrace.h"
extern int arm_apcs_32;
static void
arm_supply_gregset (struct regcache *regcache, struct reg *gregset)
{
int regno;
CORE_ADDR r_pc;
/* Integer registers. */
for (regno = ARM_A1_REGNUM; regno < ARM_SP_REGNUM; regno++)
regcache_raw_supply (regcache, regno, (char *) &gregset->r[regno]);
regcache_raw_supply (regcache, ARM_SP_REGNUM,
(char *) &gregset->r_sp);
regcache_raw_supply (regcache, ARM_LR_REGNUM,
(char *) &gregset->r_lr);
/* This is ok: we're running native... */
r_pc = gdbarch_addr_bits_remove (get_regcache_arch (regcache), gregset->r_pc);
regcache_raw_supply (regcache, ARM_PC_REGNUM, (char *) &r_pc);
if (arm_apcs_32)
regcache_raw_supply (regcache, ARM_PS_REGNUM,
(char *) &gregset->r_cpsr);
else
regcache_raw_supply (regcache, ARM_PS_REGNUM,
(char *) &gregset->r_pc);
}
static void
arm_supply_fparegset (struct regcache *regcache, struct fpreg *fparegset)
{
int regno;
for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
regcache_raw_supply (regcache, regno,
(char *) &fparegset->fpr[regno - ARM_F0_REGNUM]);
regcache_raw_supply (regcache, ARM_FPS_REGNUM,
(char *) &fparegset->fpr_fpsr);
}
static void
fetch_register (struct regcache *regcache, int regno)
{
struct reg inferior_registers;
int ret;
ret = ptrace (PT_GETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_registers, 0);
if (ret < 0)
{
warning (_("unable to fetch general register"));
return;
}
switch (regno)
{
case ARM_SP_REGNUM:
regcache_raw_supply (regcache, ARM_SP_REGNUM,
(char *) &inferior_registers.r_sp);
break;
case ARM_LR_REGNUM:
regcache_raw_supply (regcache, ARM_LR_REGNUM,
(char *) &inferior_registers.r_lr);
break;
case ARM_PC_REGNUM:
/* This is ok: we're running native... */
inferior_registers.r_pc = gdbarch_addr_bits_remove
(get_regcache_arch (regcache),
inferior_registers.r_pc);
regcache_raw_supply (regcache, ARM_PC_REGNUM,
(char *) &inferior_registers.r_pc);
break;
case ARM_PS_REGNUM:
if (arm_apcs_32)
regcache_raw_supply (regcache, ARM_PS_REGNUM,
(char *) &inferior_registers.r_cpsr);
else
regcache_raw_supply (regcache, ARM_PS_REGNUM,
(char *) &inferior_registers.r_pc);
break;
default:
regcache_raw_supply (regcache, regno,
(char *) &inferior_registers.r[regno]);
break;
}
}
static void
fetch_regs (struct regcache *regcache)
{
struct reg inferior_registers;
int ret;
int regno;
ret = ptrace (PT_GETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_registers, 0);
if (ret < 0)
{
warning (_("unable to fetch general registers"));
return;
}
arm_supply_gregset (regcache, &inferior_registers);
}
static void
fetch_fp_register (struct regcache *regcache, int regno)
{
struct fpreg inferior_fp_registers;
int ret;
ret = ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
if (ret < 0)
{
warning (_("unable to fetch floating-point register"));
return;
}
switch (regno)
{
case ARM_FPS_REGNUM:
regcache_raw_supply (regcache, ARM_FPS_REGNUM,
(char *) &inferior_fp_registers.fpr_fpsr);
break;
default:
regcache_raw_supply (regcache, regno,
(char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]);
break;
}
}
static void
fetch_fp_regs (struct regcache *regcache)
{
struct fpreg inferior_fp_registers;
int ret;
int regno;
ret = ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
if (ret < 0)
{
warning (_("unable to fetch general registers"));
return;
}
arm_supply_fparegset (regcache, &inferior_fp_registers);
}
static void
armnbsd_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{
if (regno >= 0)
{
if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM)
fetch_register (regcache, regno);
else
fetch_fp_register (regcache, regno);
}
else
{
fetch_regs (regcache);
fetch_fp_regs (regcache);
}
}
static void
store_register (const struct regcache *regcache, int regno)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
struct reg inferior_registers;
int ret;
ret = ptrace (PT_GETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_registers, 0);
if (ret < 0)
{
warning (_("unable to fetch general registers"));
return;
}
switch (regno)
{
case ARM_SP_REGNUM:
regcache_raw_collect (regcache, ARM_SP_REGNUM,
(char *) &inferior_registers.r_sp);
break;
case ARM_LR_REGNUM:
regcache_raw_collect (regcache, ARM_LR_REGNUM,
(char *) &inferior_registers.r_lr);
break;
case ARM_PC_REGNUM:
if (arm_apcs_32)
regcache_raw_collect (regcache, ARM_PC_REGNUM,
(char *) &inferior_registers.r_pc);
else
{
unsigned pc_val;
regcache_raw_collect (regcache, ARM_PC_REGNUM,
(char *) &pc_val);
pc_val = gdbarch_addr_bits_remove (gdbarch, pc_val);
inferior_registers.r_pc ^= gdbarch_addr_bits_remove
(gdbarch, inferior_registers.r_pc);
inferior_registers.r_pc |= pc_val;
}
break;
case ARM_PS_REGNUM:
if (arm_apcs_32)
regcache_raw_collect (regcache, ARM_PS_REGNUM,
(char *) &inferior_registers.r_cpsr);
else
{
unsigned psr_val;
regcache_raw_collect (regcache, ARM_PS_REGNUM,
(char *) &psr_val);
psr_val ^= gdbarch_addr_bits_remove (gdbarch, psr_val);
inferior_registers.r_pc = gdbarch_addr_bits_remove
(gdbarch, inferior_registers.r_pc);
inferior_registers.r_pc |= psr_val;
}
break;
default:
regcache_raw_collect (regcache, regno,
(char *) &inferior_registers.r[regno]);
break;
}
ret = ptrace (PT_SETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_registers, 0);
if (ret < 0)
warning (_("unable to write register %d to inferior"), regno);
}
static void
store_regs (const struct regcache *regcache)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
struct reg inferior_registers;
int ret;
int regno;
for (regno = ARM_A1_REGNUM; regno < ARM_SP_REGNUM; regno++)
regcache_raw_collect (regcache, regno,
(char *) &inferior_registers.r[regno]);
regcache_raw_collect (regcache, ARM_SP_REGNUM,
(char *) &inferior_registers.r_sp);
regcache_raw_collect (regcache, ARM_LR_REGNUM,
(char *) &inferior_registers.r_lr);
if (arm_apcs_32)
{
regcache_raw_collect (regcache, ARM_PC_REGNUM,
(char *) &inferior_registers.r_pc);
regcache_raw_collect (regcache, ARM_PS_REGNUM,
(char *) &inferior_registers.r_cpsr);
}
else
{
unsigned pc_val;
unsigned psr_val;
regcache_raw_collect (regcache, ARM_PC_REGNUM,
(char *) &pc_val);
regcache_raw_collect (regcache, ARM_PS_REGNUM,
(char *) &psr_val);
pc_val = gdbarch_addr_bits_remove (gdbarch, pc_val);
psr_val ^= gdbarch_addr_bits_remove (gdbarch, psr_val);
inferior_registers.r_pc = pc_val | psr_val;
}
ret = ptrace (PT_SETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_registers, 0);
if (ret < 0)
warning (_("unable to store general registers"));
}
static void
store_fp_register (const struct regcache *regcache, int regno)
{
struct fpreg inferior_fp_registers;
int ret;
ret = ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
if (ret < 0)
{
warning (_("unable to fetch floating-point registers"));
return;
}
switch (regno)
{
case ARM_FPS_REGNUM:
regcache_raw_collect (regcache, ARM_FPS_REGNUM,
(char *) &inferior_fp_registers.fpr_fpsr);
break;
default:
regcache_raw_collect (regcache, regno,
(char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]);
break;
}
ret = ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
if (ret < 0)
warning (_("unable to write register %d to inferior"), regno);
}
static void
store_fp_regs (const struct regcache *regcache)
{
struct fpreg inferior_fp_registers;
int ret;
int regno;
for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
regcache_raw_collect (regcache, regno,
(char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]);
regcache_raw_collect (regcache, ARM_FPS_REGNUM,
(char *) &inferior_fp_registers.fpr_fpsr);
ret = ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
if (ret < 0)
warning (_("unable to store floating-point registers"));
}
static void
armnbsd_store_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{
if (regno >= 0)
{
if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM)
store_register (regcache, regno);
else
store_fp_register (regcache, regno);
}
else
{
store_regs (regcache);
store_fp_regs (regcache);
}
}
struct md_core
{
struct reg intreg;
struct fpreg freg;
};
static void
fetch_core_registers (struct regcache *regcache,
char *core_reg_sect, unsigned core_reg_size,
int which, CORE_ADDR ignore)
{
struct md_core *core_reg = (struct md_core *) core_reg_sect;
int regno;
CORE_ADDR r_pc;
arm_supply_gregset (regcache, &core_reg->intreg);
arm_supply_fparegset (regcache, &core_reg->freg);
}
static void
fetch_elfcore_registers (struct regcache *regcache,
char *core_reg_sect, unsigned core_reg_size,
int which, CORE_ADDR ignore)
{
struct reg gregset;
struct fpreg fparegset;
switch (which)
{
case 0: /* Integer registers. */
if (core_reg_size != sizeof (struct reg))
warning (_("wrong size of register set in core file"));
else
{
/* The memcpy may be unnecessary, but we can't really be sure
of the alignment of the data in the core file. */
memcpy (&gregset, core_reg_sect, sizeof (gregset));
arm_supply_gregset (regcache, &gregset);
}
break;
case 2:
if (core_reg_size != sizeof (struct fpreg))
warning (_("wrong size of FPA register set in core file"));
else
{
/* The memcpy may be unnecessary, but we can't really be sure
of the alignment of the data in the core file. */
memcpy (&fparegset, core_reg_sect, sizeof (fparegset));
arm_supply_fparegset (regcache, &fparegset);
}
break;
default:
/* Don't know what kind of register request this is; just ignore it. */
break;
}
}
static struct core_fns arm_netbsd_core_fns =
{
bfd_target_unknown_flavour, /* core_flovour. */
default_check_format, /* check_format. */
default_core_sniffer, /* core_sniffer. */
fetch_core_registers, /* core_read_registers. */
NULL
};
static struct core_fns arm_netbsd_elfcore_fns =
{
bfd_target_elf_flavour, /* core_flovour. */
default_check_format, /* check_format. */
default_core_sniffer, /* core_sniffer. */
fetch_elfcore_registers, /* core_read_registers. */
NULL
};
void
_initialize_arm_netbsd_nat (void)
{
struct target_ops *t;
t = inf_ptrace_target ();
t->to_fetch_registers = armnbsd_fetch_registers;
t->to_store_registers = armnbsd_store_registers;
add_target (t);
deprecated_add_core_fns (&arm_netbsd_core_fns);
deprecated_add_core_fns (&arm_netbsd_elfcore_fns);
}

View File

@@ -1,123 +0,0 @@
/* Target-dependent code for NetBSD/arm.
Copyright (C) 2002, 2003, 2004, 2006, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "osabi.h"
#include "gdb_string.h"
#include "arm-tdep.h"
#include "solib-svr4.h"
/* Description of the longjmp buffer. */
#define ARM_NBSD_JB_PC 24
#define ARM_NBSD_JB_ELEMENT_SIZE INT_REGISTER_SIZE
/* For compatibility with previous implemenations of GDB on arm/NetBSD,
override the default little-endian breakpoint. */
static const char arm_nbsd_arm_le_breakpoint[] = {0x11, 0x00, 0x00, 0xe6};
static const char arm_nbsd_arm_be_breakpoint[] = {0xe6, 0x00, 0x00, 0x11};
static const char arm_nbsd_thumb_le_breakpoint[] = {0xfe, 0xde};
static const char arm_nbsd_thumb_be_breakpoint[] = {0xde, 0xfe};
static void
arm_netbsd_init_abi_common (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->lowest_pc = 0x8000;
switch (info.byte_order)
{
case BFD_ENDIAN_LITTLE:
tdep->arm_breakpoint = arm_nbsd_arm_le_breakpoint;
tdep->thumb_breakpoint = arm_nbsd_thumb_le_breakpoint;
tdep->arm_breakpoint_size = sizeof (arm_nbsd_arm_le_breakpoint);
tdep->thumb_breakpoint_size = sizeof (arm_nbsd_thumb_le_breakpoint);
break;
case BFD_ENDIAN_BIG:
tdep->arm_breakpoint = arm_nbsd_arm_be_breakpoint;
tdep->thumb_breakpoint = arm_nbsd_thumb_be_breakpoint;
tdep->arm_breakpoint_size = sizeof (arm_nbsd_arm_be_breakpoint);
tdep->thumb_breakpoint_size = sizeof (arm_nbsd_thumb_be_breakpoint);
break;
default:
internal_error (__FILE__, __LINE__,
_("arm_gdbarch_init: bad byte order for float format"));
}
tdep->jb_pc = ARM_NBSD_JB_PC;
tdep->jb_elt_size = ARM_NBSD_JB_ELEMENT_SIZE;
/* Single stepping. */
set_gdbarch_software_single_step (gdbarch, arm_software_single_step);
}
static void
arm_netbsd_aout_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
arm_netbsd_init_abi_common (info, gdbarch);
if (tdep->fp_model == ARM_FLOAT_AUTO)
tdep->fp_model = ARM_FLOAT_SOFT_FPA;
}
static void
arm_netbsd_elf_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
arm_netbsd_init_abi_common (info, gdbarch);
if (tdep->fp_model == ARM_FLOAT_AUTO)
tdep->fp_model = ARM_FLOAT_SOFT_VFP;
/* NetBSD ELF uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
}
static enum gdb_osabi
arm_netbsd_aout_osabi_sniffer (bfd *abfd)
{
if (strcmp (bfd_get_target (abfd), "a.out-arm-netbsd") == 0)
return GDB_OSABI_NETBSD_AOUT;
return GDB_OSABI_UNKNOWN;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_arm_netbsd_tdep;
void
_initialize_arm_netbsd_tdep (void)
{
gdbarch_register_osabi_sniffer (bfd_arch_arm, bfd_target_aout_flavour,
arm_netbsd_aout_osabi_sniffer);
gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_NETBSD_AOUT,
arm_netbsd_aout_init_abi);
gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_NETBSD_ELF,
arm_netbsd_elf_init_abi);
}

View File

@@ -1,142 +0,0 @@
/* Target-dependent code for OpenBSD/arm.
Copyright (C) 2006, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "osabi.h"
#include "trad-frame.h"
#include "tramp-frame.h"
#include "gdb_string.h"
#include "obsd-tdep.h"
#include "arm-tdep.h"
#include "solib-svr4.h"
/* Signal trampolines. */
static void
armobsd_sigframe_init (const struct tramp_frame *self,
struct frame_info *this_frame,
struct trad_frame_cache *cache,
CORE_ADDR func)
{
CORE_ADDR sp, sigcontext_addr, addr;
int regnum;
/* We find the appropriate instance of `struct sigcontext' at a
fixed offset in the signal frame. */
sp = get_frame_register_signed (this_frame, ARM_SP_REGNUM);
sigcontext_addr = sp + 16;
/* PC. */
trad_frame_set_reg_addr (cache, ARM_PC_REGNUM, sigcontext_addr + 76);
/* GPRs. */
for (regnum = ARM_A1_REGNUM, addr = sigcontext_addr + 12;
regnum <= ARM_LR_REGNUM; regnum++, addr += 4)
trad_frame_set_reg_addr (cache, regnum, addr);
trad_frame_set_id (cache, frame_id_build (sp, func));
}
static const struct tramp_frame armobsd_sigframe =
{
SIGTRAMP_FRAME,
4,
{
{ 0xe28d0010, -1 }, /* add r0, sp, #16 */
{ 0xef000067, -1 }, /* swi SYS_sigreturn */
{ 0xef000001, -1 }, /* swi SYS_exit */
{ 0xeafffffc, -1 }, /* b . - 8 */
{ TRAMP_SENTINEL_INSN, -1 }
},
armobsd_sigframe_init
};
/* Override default thumb breakpoints. */
static const char arm_obsd_thumb_le_breakpoint[] = {0xfe, 0xdf};
static const char arm_obsd_thumb_be_breakpoint[] = {0xdf, 0xfe};
static void
armobsd_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
if (tdep->fp_model == ARM_FLOAT_AUTO)
tdep->fp_model = ARM_FLOAT_SOFT_VFP;
tramp_frame_prepend_unwinder (gdbarch, &armobsd_sigframe);
/* OpenBSD/arm uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
set_gdbarch_skip_solib_resolver (gdbarch, obsd_skip_solib_resolver);
tdep->jb_pc = 24;
tdep->jb_elt_size = 4;
set_gdbarch_regset_from_core_section
(gdbarch, armbsd_regset_from_core_section);
/* OpenBSD/arm uses -fpcc-struct-return by default. */
tdep->struct_return = pcc_struct_return;
/* Single stepping. */
set_gdbarch_software_single_step (gdbarch, arm_software_single_step);
/* Breakpoints. */
switch (info.byte_order)
{
case BFD_ENDIAN_BIG:
tdep->thumb_breakpoint = arm_obsd_thumb_be_breakpoint;
tdep->thumb_breakpoint_size = sizeof (arm_obsd_thumb_be_breakpoint);
break;
case BFD_ENDIAN_LITTLE:
tdep->thumb_breakpoint = arm_obsd_thumb_le_breakpoint;
tdep->thumb_breakpoint_size = sizeof (arm_obsd_thumb_le_breakpoint);
break;
}
}
static enum gdb_osabi
armobsd_core_osabi_sniffer (bfd *abfd)
{
if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
return GDB_OSABI_OPENBSD_ELF;
return GDB_OSABI_UNKNOWN;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_armobsd_tdep;
void
_initialize_armobsd_tdep (void)
{
/* BFD doesn't set a flavour for NetBSD style a.out core files. */
gdbarch_register_osabi_sniffer (bfd_arch_arm, bfd_target_unknown_flavour,
armobsd_core_osabi_sniffer);
gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_OPENBSD_ELF,
armobsd_init_abi);
}

View File

@@ -1,288 +0,0 @@
/* Auxiliary vector support for GDB, the GNU debugger.
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "target.h"
#include "gdbtypes.h"
#include "command.h"
#include "inferior.h"
#include "valprint.h"
#include "gdb_assert.h"
#include "auxv.h"
#include "elf/common.h"
#include <unistd.h>
#include <fcntl.h>
/* This function is called like a to_xfer_partial hook, but must be
called with TARGET_OBJECT_AUXV. It handles access via
/proc/PID/auxv, which is a common method for native targets. */
LONGEST
procfs_xfer_auxv (struct target_ops *ops,
enum target_object object,
const char *annex,
gdb_byte *readbuf,
const gdb_byte *writebuf,
ULONGEST offset,
LONGEST len)
{
char *pathname;
int fd;
LONGEST n;
gdb_assert (object == TARGET_OBJECT_AUXV);
gdb_assert (readbuf || writebuf);
pathname = xstrprintf ("/proc/%d/auxv", PIDGET (inferior_ptid));
fd = open (pathname, writebuf != NULL ? O_WRONLY : O_RDONLY);
xfree (pathname);
if (fd < 0)
return -1;
if (offset != (ULONGEST) 0
&& lseek (fd, (off_t) offset, SEEK_SET) != (off_t) offset)
n = -1;
else if (readbuf != NULL)
n = read (fd, readbuf, len);
else
n = write (fd, writebuf, len);
(void) close (fd);
return n;
}
/* Read one auxv entry from *READPTR, not reading locations >= ENDPTR.
Return 0 if *READPTR is already at the end of the buffer.
Return -1 if there is insufficient buffer for a whole entry.
Return 1 if an entry was read into *TYPEP and *VALP. */
static int
default_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
{
const int sizeof_auxv_field = gdbarch_ptr_bit (target_gdbarch)
/ TARGET_CHAR_BIT;
gdb_byte *ptr = *readptr;
if (endptr == ptr)
return 0;
if (endptr - ptr < sizeof_auxv_field * 2)
return -1;
*typep = extract_unsigned_integer (ptr, sizeof_auxv_field);
ptr += sizeof_auxv_field;
*valp = extract_unsigned_integer (ptr, sizeof_auxv_field);
ptr += sizeof_auxv_field;
*readptr = ptr;
return 1;
}
/* Read one auxv entry from *READPTR, not reading locations >= ENDPTR.
Return 0 if *READPTR is already at the end of the buffer.
Return -1 if there is insufficient buffer for a whole entry.
Return 1 if an entry was read into *TYPEP and *VALP. */
int
target_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
{
struct target_ops *t;
for (t = ops; t != NULL; t = t->beneath)
if (t->to_auxv_parse != NULL)
return t->to_auxv_parse (t, readptr, endptr, typep, valp);
return default_auxv_parse (ops, readptr, endptr, typep, valp);
}
/* Extract the auxiliary vector entry with a_type matching MATCH.
Return zero if no such entry was found, or -1 if there was
an error getting the information. On success, return 1 after
storing the entry's value field in *VALP. */
int
target_auxv_search (struct target_ops *ops, CORE_ADDR match, CORE_ADDR *valp)
{
CORE_ADDR type, val;
gdb_byte *data;
LONGEST n = target_read_alloc (ops, TARGET_OBJECT_AUXV, NULL, &data);
gdb_byte *ptr = data;
int ents = 0;
if (n <= 0)
return n;
while (1)
switch (target_auxv_parse (ops, &ptr, data + n, &type, &val))
{
case 1: /* Here's an entry, check it. */
if (type == match)
{
xfree (data);
*valp = val;
return 1;
}
break;
case 0: /* End of the vector. */
xfree (data);
return 0;
default: /* Bogosity. */
xfree (data);
return -1;
}
/*NOTREACHED*/
}
/* Print the contents of the target's AUXV on the specified file. */
int
fprint_target_auxv (struct ui_file *file, struct target_ops *ops)
{
CORE_ADDR type, val;
gdb_byte *data;
LONGEST len = target_read_alloc (ops, TARGET_OBJECT_AUXV, NULL,
&data);
gdb_byte *ptr = data;
int ents = 0;
if (len <= 0)
return len;
while (target_auxv_parse (ops, &ptr, data + len, &type, &val) > 0)
{
const char *name = "???";
const char *description = "";
enum { dec, hex, str } flavor = hex;
switch (type)
{
#define TAG(tag, text, kind) \
case tag: name = #tag; description = text; flavor = kind; break
TAG (AT_NULL, _("End of vector"), hex);
TAG (AT_IGNORE, _("Entry should be ignored"), hex);
TAG (AT_EXECFD, _("File descriptor of program"), dec);
TAG (AT_PHDR, _("Program headers for program"), hex);
TAG (AT_PHENT, _("Size of program header entry"), dec);
TAG (AT_PHNUM, _("Number of program headers"), dec);
TAG (AT_PAGESZ, _("System page size"), dec);
TAG (AT_BASE, _("Base address of interpreter"), hex);
TAG (AT_FLAGS, _("Flags"), hex);
TAG (AT_ENTRY, _("Entry point of program"), hex);
TAG (AT_NOTELF, _("Program is not ELF"), dec);
TAG (AT_UID, _("Real user ID"), dec);
TAG (AT_EUID, _("Effective user ID"), dec);
TAG (AT_GID, _("Real group ID"), dec);
TAG (AT_EGID, _("Effective group ID"), dec);
TAG (AT_CLKTCK, _("Frequency of times()"), dec);
TAG (AT_PLATFORM, _("String identifying platform"), str);
TAG (AT_HWCAP, _("Machine-dependent CPU capability hints"), hex);
TAG (AT_FPUCW, _("Used FPU control word"), dec);
TAG (AT_DCACHEBSIZE, _("Data cache block size"), dec);
TAG (AT_ICACHEBSIZE, _("Instruction cache block size"), dec);
TAG (AT_UCACHEBSIZE, _("Unified cache block size"), dec);
TAG (AT_IGNOREPPC, _("Entry should be ignored"), dec);
TAG (AT_BASE_PLATFORM, _("String identifying base platform"), str);
TAG (AT_RANDOM, _("Address of 16 random bytes"), hex);
TAG (AT_EXECFN, _("File name of executable"), str);
TAG (AT_SECURE, _("Boolean, was exec setuid-like?"), dec);
TAG (AT_SYSINFO, _("Special system info/entry points"), hex);
TAG (AT_SYSINFO_EHDR, _("System-supplied DSO's ELF header"), hex);
TAG (AT_SUN_UID, _("Effective user ID"), dec);
TAG (AT_SUN_RUID, _("Real user ID"), dec);
TAG (AT_SUN_GID, _("Effective group ID"), dec);
TAG (AT_SUN_RGID, _("Real group ID"), dec);
TAG (AT_SUN_LDELF, _("Dynamic linker's ELF header"), hex);
TAG (AT_SUN_LDSHDR, _("Dynamic linker's section headers"), hex);
TAG (AT_SUN_LDNAME, _("String giving name of dynamic linker"), str);
TAG (AT_SUN_LPAGESZ, _("Large pagesize"), dec);
TAG (AT_SUN_PLATFORM, _("Platform name string"), str);
TAG (AT_SUN_HWCAP, _("Machine-dependent CPU capability hints"), hex);
TAG (AT_SUN_IFLUSH, _("Should flush icache?"), dec);
TAG (AT_SUN_CPU, _("CPU name string"), str);
TAG (AT_SUN_EMUL_ENTRY, _("COFF entry point address"), hex);
TAG (AT_SUN_EMUL_EXECFD, _("COFF executable file descriptor"), dec);
TAG (AT_SUN_EXECNAME,
_("Canonicalized file name given to execve"), str);
TAG (AT_SUN_MMU, _("String for name of MMU module"), str);
TAG (AT_SUN_LDDATA, _("Dynamic linker's data segment address"), hex);
TAG (AT_SUN_AUXFLAGS,
_("AF_SUN_ flags passed from the kernel"), hex);
}
fprintf_filtered (file, "%-4s %-20s %-30s ",
plongest (type), name, description);
switch (flavor)
{
case dec:
fprintf_filtered (file, "%s\n", plongest (val));
break;
case hex:
fprintf_filtered (file, "0x%s\n", paddr_nz (val));
break;
case str:
{
struct value_print_options opts;
get_user_print_options (&opts);
if (opts.addressprint)
fprintf_filtered (file, "0x%s", paddr_nz (val));
val_print_string (builtin_type (target_gdbarch)->builtin_char,
val, -1, file, &opts);
fprintf_filtered (file, "\n");
}
break;
}
++ents;
if (type == AT_NULL)
break;
}
xfree (data);
return ents;
}
static void
info_auxv_command (char *cmd, int from_tty)
{
if (! target_has_stack)
error (_("The program has no auxiliary information now."));
else
{
int ents = fprint_target_auxv (gdb_stdout, &current_target);
if (ents < 0)
error (_("No auxiliary vector found, or failed reading it."));
else if (ents == 0)
error (_("Auxiliary vector is empty."));
}
}
extern initialize_file_ftype _initialize_auxv; /* -Wmissing-prototypes; */
void
_initialize_auxv (void)
{
add_info ("auxv", info_auxv_command,
_("Display the inferior's auxiliary vector.\n\
This is information provided by the operating system at program startup."));
}

View File

@@ -1,59 +0,0 @@
/* Auxiliary vector support for GDB, the GNU debugger.
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef AUXV_H
#define AUXV_H
#include "target.h"
/* See "include/elf/common.h" for the definition of valid AT_* values. */
/* Read one auxv entry from *READPTR, not reading locations >= ENDPTR.
Return 0 if *READPTR is already at the end of the buffer.
Return -1 if there is insufficient buffer for a whole entry.
Return 1 if an entry was read into *TYPEP and *VALP. */
extern int target_auxv_parse (struct target_ops *ops,
gdb_byte **readptr, gdb_byte *endptr,
CORE_ADDR *typep, CORE_ADDR *valp);
/* Extract the auxiliary vector entry with a_type matching MATCH.
Return zero if no such entry was found, or -1 if there was
an error getting the information. On success, return 1 after
storing the entry's value field in *VALP. */
extern int target_auxv_search (struct target_ops *ops,
CORE_ADDR match, CORE_ADDR *valp);
/* Print the contents of the target's AUXV on the specified file. */
extern int fprint_target_auxv (struct ui_file *file, struct target_ops *ops);
/* This function is called like a to_xfer_partial hook, but must be
called with TARGET_OBJECT_AUXV. It handles access via
/proc/PID/auxv, which is a common method for native targets. */
extern LONGEST procfs_xfer_auxv (struct target_ops *ops,
enum target_object object,
const char *annex,
gdb_byte *readbuf,
const gdb_byte *writebuf,
ULONGEST offset,
LONGEST len);
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,102 +0,0 @@
/* GDB-specific functions for operating on agent expressions
Copyright (C) 1998, 1999, 2000, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef AX_GDB_H
#define AX_GDB_H
struct expression;
/* Types and enums */
/* GDB stores expressions in the form of a flattened tree (struct
expression), so we just walk that tree and generate agent bytecodes
as we go along.
GDB's normal evaluation uses struct value, which contains the
expression's value as well as its address or the register it came
from. The `+' operator uses the value, whereas the unary `&'
operator will use the address portion. The `=' operator will use
the address or register number of its left hand side.
The issues are different when generating agent bytecode. Given a
variable reference expression, we should not necessarily generate
code to fetch its value, because the next operator may be `=' or
unary `&'. Instead, when we recurse on a subexpression, we
indicate whether we want that expression to produce an lvalue or an
rvalue. If we requested an lvalue, then the recursive call tells
us whether it generated code to compute an address on the stack, or
whether the lvalue lives in a register.
The `axs' prefix here means `agent expression, static', because
this is all static analysis of the expression, i.e. analysis which
doesn't depend on the contents of memory and registers. */
/* Different kinds of agent expression static values. */
enum axs_lvalue_kind
{
/* We generated code to compute the subexpression's value.
Constants and arithmetic operators yield this. */
axs_rvalue,
/* We generated code to yield the subexpression's value's address on
the top of the stack. If the caller needs an rvalue, it should
call require_rvalue to produce the rvalue from this address. */
axs_lvalue_memory,
/* We didn't generate any code, and the stack is undisturbed,
because the subexpression's value lives in a register; u.reg is
the register number. If the caller needs an rvalue, it should
call require_rvalue to produce the rvalue from this register
number. */
axs_lvalue_register
};
/* Structure describing what we got from a subexpression. Think of
this as parallel to value.h's enum lval_type, except that we're
describing a value which will exist when the expression is
evaluated in the future, not a value we have in our hand. */
struct axs_value
{
enum axs_lvalue_kind kind; /* see above */
/* The type of the subexpression. Even if lvalue == axs_lvalue_memory,
this is the type of the value itself; the value on the stack is a
"pointer to" an object of this type. */
struct type *type;
union
{
/* if kind == axs_lvalue_register, this is the register number */
int reg;
}
u;
};
/* Translating GDB expressions into agent expressions. */
/* Given a GDB expression EXPR, return bytecode to trace its value.
The result will use the `trace' and `trace_quick' bytecodes to
record the value of all memory touched by the expression, and leave
no values on the stack. The caller can then use the ax_reqs
function to discover which registers the expression uses. */
extern struct agent_expr *gen_trace_for_expr (CORE_ADDR, struct expression *);
#endif /* AX_GDB_H */

View File

@@ -1,547 +0,0 @@
/* Functions for manipulating expressions designed to be executed on the agent
Copyright (C) 1998, 1999, 2000, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
/* Despite what the above comment says about this file being part of
GDB, we would like to keep these functions free of GDB
dependencies, since we want to be able to use them in contexts
outside of GDB (test suites, the stub, etc.) */
#include "defs.h"
#include "ax.h"
#include "value.h"
#include "gdb_string.h"
static void grow_expr (struct agent_expr *x, int n);
static void append_const (struct agent_expr *x, LONGEST val, int n);
static LONGEST read_const (struct agent_expr *x, int o, int n);
static void generic_ext (struct agent_expr *x, enum agent_op op, int n);
/* Functions for building expressions. */
/* Allocate a new, empty agent expression. */
struct agent_expr *
new_agent_expr (CORE_ADDR scope)
{
struct agent_expr *x = xmalloc (sizeof (*x));
x->len = 0;
x->size = 1; /* Change this to a larger value once
reallocation code is tested. */
x->buf = xmalloc (x->size);
x->scope = scope;
return x;
}
/* Free a agent expression. */
void
free_agent_expr (struct agent_expr *x)
{
xfree (x->buf);
xfree (x);
}
static void
do_free_agent_expr_cleanup (void *x)
{
free_agent_expr (x);
}
struct cleanup *
make_cleanup_free_agent_expr (struct agent_expr *x)
{
return make_cleanup (do_free_agent_expr_cleanup, x);
}
/* Make sure that X has room for at least N more bytes. This doesn't
affect the length, just the allocated size. */
static void
grow_expr (struct agent_expr *x, int n)
{
if (x->len + n > x->size)
{
x->size *= 2;
if (x->size < x->len + n)
x->size = x->len + n + 10;
x->buf = xrealloc (x->buf, x->size);
}
}
/* Append the low N bytes of VAL as an N-byte integer to the
expression X, in big-endian order. */
static void
append_const (struct agent_expr *x, LONGEST val, int n)
{
int i;
grow_expr (x, n);
for (i = n - 1; i >= 0; i--)
{
x->buf[x->len + i] = val & 0xff;
val >>= 8;
}
x->len += n;
}
/* Extract an N-byte big-endian unsigned integer from expression X at
offset O. */
static LONGEST
read_const (struct agent_expr *x, int o, int n)
{
int i;
LONGEST accum = 0;
/* Make sure we're not reading off the end of the expression. */
if (o + n > x->len)
error (_("GDB bug: ax-general.c (read_const): incomplete constant"));
for (i = 0; i < n; i++)
accum = (accum << 8) | x->buf[o + i];
return accum;
}
/* Append a simple operator OP to EXPR. */
void
ax_simple (struct agent_expr *x, enum agent_op op)
{
grow_expr (x, 1);
x->buf[x->len++] = op;
}
/* Append a sign-extension or zero-extension instruction to EXPR, to
extend an N-bit value. */
static void
generic_ext (struct agent_expr *x, enum agent_op op, int n)
{
/* N must fit in a byte. */
if (n < 0 || n > 255)
error (_("GDB bug: ax-general.c (generic_ext): bit count out of range"));
/* That had better be enough range. */
if (sizeof (LONGEST) * 8 > 255)
error (_("GDB bug: ax-general.c (generic_ext): opcode has inadequate range"));
grow_expr (x, 2);
x->buf[x->len++] = op;
x->buf[x->len++] = n;
}
/* Append a sign-extension instruction to EXPR, to extend an N-bit value. */
void
ax_ext (struct agent_expr *x, int n)
{
generic_ext (x, aop_ext, n);
}
/* Append a zero-extension instruction to EXPR, to extend an N-bit value. */
void
ax_zero_ext (struct agent_expr *x, int n)
{
generic_ext (x, aop_zero_ext, n);
}
/* Append a trace_quick instruction to EXPR, to record N bytes. */
void
ax_trace_quick (struct agent_expr *x, int n)
{
/* N must fit in a byte. */
if (n < 0 || n > 255)
error (_("GDB bug: ax-general.c (ax_trace_quick): size out of range for trace_quick"));
grow_expr (x, 2);
x->buf[x->len++] = aop_trace_quick;
x->buf[x->len++] = n;
}
/* Append a goto op to EXPR. OP is the actual op (must be aop_goto or
aop_if_goto). We assume we don't know the target offset yet,
because it's probably a forward branch, so we leave space in EXPR
for the target, and return the offset in EXPR of that space, so we
can backpatch it once we do know the target offset. Use ax_label
to do the backpatching. */
int
ax_goto (struct agent_expr *x, enum agent_op op)
{
grow_expr (x, 3);
x->buf[x->len + 0] = op;
x->buf[x->len + 1] = 0xff;
x->buf[x->len + 2] = 0xff;
x->len += 3;
return x->len - 2;
}
/* Suppose a given call to ax_goto returns some value PATCH. When you
know the offset TARGET that goto should jump to, call
ax_label (EXPR, PATCH, TARGET)
to patch TARGET into the ax_goto instruction. */
void
ax_label (struct agent_expr *x, int patch, int target)
{
/* Make sure the value is in range. Don't accept 0xffff as an
offset; that's our magic sentinel value for unpatched branches. */
if (target < 0 || target >= 0xffff)
error (_("GDB bug: ax-general.c (ax_label): label target out of range"));
x->buf[patch] = (target >> 8) & 0xff;
x->buf[patch + 1] = target & 0xff;
}
/* Assemble code to push a constant on the stack. */
void
ax_const_l (struct agent_expr *x, LONGEST l)
{
static enum agent_op ops[]
=
{aop_const8, aop_const16, aop_const32, aop_const64};
int size;
int op;
/* How big is the number? 'op' keeps track of which opcode to use.
Notice that we don't really care whether the original number was
signed or unsigned; we always reproduce the value exactly, and
use the shortest representation. */
for (op = 0, size = 8; size < 64; size *= 2, op++)
{
LONGEST lim = 1 << (size - 1);
if (-lim <= l && l <= lim - 1)
break;
}
/* Emit the right opcode... */
ax_simple (x, ops[op]);
/* Emit the low SIZE bytes as an unsigned number. We know that
sign-extending this will yield l. */
append_const (x, l, size / 8);
/* Now, if it was negative, and not full-sized, sign-extend it. */
if (l < 0 && size < 64)
ax_ext (x, size);
}
void
ax_const_d (struct agent_expr *x, LONGEST d)
{
/* FIXME: floating-point support not present yet. */
error (_("GDB bug: ax-general.c (ax_const_d): floating point not supported yet"));
}
/* Assemble code to push the value of register number REG on the
stack. */
void
ax_reg (struct agent_expr *x, int reg)
{
/* Make sure the register number is in range. */
if (reg < 0 || reg > 0xffff)
error (_("GDB bug: ax-general.c (ax_reg): register number out of range"));
grow_expr (x, 3);
x->buf[x->len] = aop_reg;
x->buf[x->len + 1] = (reg >> 8) & 0xff;
x->buf[x->len + 2] = (reg) & 0xff;
x->len += 3;
}
/* Functions for disassembling agent expressions, and otherwise
debugging the expression compiler. */
struct aop_map aop_map[] =
{
{0, 0, 0, 0, 0},
{"float", 0, 0, 0, 0}, /* 0x01 */
{"add", 0, 0, 2, 1}, /* 0x02 */
{"sub", 0, 0, 2, 1}, /* 0x03 */
{"mul", 0, 0, 2, 1}, /* 0x04 */
{"div_signed", 0, 0, 2, 1}, /* 0x05 */
{"div_unsigned", 0, 0, 2, 1}, /* 0x06 */
{"rem_signed", 0, 0, 2, 1}, /* 0x07 */
{"rem_unsigned", 0, 0, 2, 1}, /* 0x08 */
{"lsh", 0, 0, 2, 1}, /* 0x09 */
{"rsh_signed", 0, 0, 2, 1}, /* 0x0a */
{"rsh_unsigned", 0, 0, 2, 1}, /* 0x0b */
{"trace", 0, 0, 2, 0}, /* 0x0c */
{"trace_quick", 1, 0, 1, 1}, /* 0x0d */
{"log_not", 0, 0, 1, 1}, /* 0x0e */
{"bit_and", 0, 0, 2, 1}, /* 0x0f */
{"bit_or", 0, 0, 2, 1}, /* 0x10 */
{"bit_xor", 0, 0, 2, 1}, /* 0x11 */
{"bit_not", 0, 0, 1, 1}, /* 0x12 */
{"equal", 0, 0, 2, 1}, /* 0x13 */
{"less_signed", 0, 0, 2, 1}, /* 0x14 */
{"less_unsigned", 0, 0, 2, 1}, /* 0x15 */
{"ext", 1, 0, 1, 1}, /* 0x16 */
{"ref8", 0, 8, 1, 1}, /* 0x17 */
{"ref16", 0, 16, 1, 1}, /* 0x18 */
{"ref32", 0, 32, 1, 1}, /* 0x19 */
{"ref64", 0, 64, 1, 1}, /* 0x1a */
{"ref_float", 0, 0, 1, 1}, /* 0x1b */
{"ref_double", 0, 0, 1, 1}, /* 0x1c */
{"ref_long_double", 0, 0, 1, 1}, /* 0x1d */
{"l_to_d", 0, 0, 1, 1}, /* 0x1e */
{"d_to_l", 0, 0, 1, 1}, /* 0x1f */
{"if_goto", 2, 0, 1, 0}, /* 0x20 */
{"goto", 2, 0, 0, 0}, /* 0x21 */
{"const8", 1, 8, 0, 1}, /* 0x22 */
{"const16", 2, 16, 0, 1}, /* 0x23 */
{"const32", 4, 32, 0, 1}, /* 0x24 */
{"const64", 8, 64, 0, 1}, /* 0x25 */
{"reg", 2, 0, 0, 1}, /* 0x26 */
{"end", 0, 0, 0, 0}, /* 0x27 */
{"dup", 0, 0, 1, 2}, /* 0x28 */
{"pop", 0, 0, 1, 0}, /* 0x29 */
{"zero_ext", 1, 0, 1, 1}, /* 0x2a */
{"swap", 0, 0, 2, 2}, /* 0x2b */
{0, 0, 0, 0, 0}, /* 0x2c */
{0, 0, 0, 0, 0}, /* 0x2d */
{0, 0, 0, 0, 0}, /* 0x2e */
{0, 0, 0, 0, 0}, /* 0x2f */
{"trace16", 2, 0, 1, 1}, /* 0x30 */
};
/* Disassemble the expression EXPR, writing to F. */
void
ax_print (struct ui_file *f, struct agent_expr *x)
{
int i;
int is_float = 0;
/* Check the size of the name array against the number of entries in
the enum, to catch additions that people didn't sync. */
if ((sizeof (aop_map) / sizeof (aop_map[0]))
!= aop_last)
error (_("GDB bug: ax-general.c (ax_print): opcode map out of sync"));
for (i = 0; i < x->len;)
{
enum agent_op op = x->buf[i];
if (op >= (sizeof (aop_map) / sizeof (aop_map[0]))
|| !aop_map[op].name)
{
fprintf_filtered (f, _("%3d <bad opcode %02x>\n"), i, op);
i++;
continue;
}
if (i + 1 + aop_map[op].op_size > x->len)
{
fprintf_filtered (f, _("%3d <incomplete opcode %s>\n"),
i, aop_map[op].name);
break;
}
fprintf_filtered (f, "%3d %s", i, aop_map[op].name);
if (aop_map[op].op_size > 0)
{
fputs_filtered (" ", f);
print_longest (f, 'd', 0,
read_const (x, i + 1, aop_map[op].op_size));
}
fprintf_filtered (f, "\n");
i += 1 + aop_map[op].op_size;
is_float = (op == aop_float);
}
}
/* Given an agent expression AX, fill in an agent_reqs structure REQS
describing it. */
void
ax_reqs (struct agent_expr *ax, struct agent_reqs *reqs)
{
int i;
int height;
/* Bit vector for registers used. */
int reg_mask_len = 1;
unsigned char *reg_mask = xmalloc (reg_mask_len * sizeof (reg_mask[0]));
/* Jump target table. targets[i] is non-zero iff we have found a
jump to offset i. */
char *targets = (char *) alloca (ax->len * sizeof (targets[0]));
/* Instruction boundary table. boundary[i] is non-zero iff our scan
has reached an instruction starting at offset i. */
char *boundary = (char *) alloca (ax->len * sizeof (boundary[0]));
/* Stack height record. If either targets[i] or boundary[i] is
non-zero, heights[i] is the height the stack should have before
executing the bytecode at that point. */
int *heights = (int *) alloca (ax->len * sizeof (heights[0]));
/* Pointer to a description of the present op. */
struct aop_map *op;
memset (reg_mask, 0, reg_mask_len * sizeof (reg_mask[0]));
memset (targets, 0, ax->len * sizeof (targets[0]));
memset (boundary, 0, ax->len * sizeof (boundary[0]));
reqs->max_height = reqs->min_height = height = 0;
reqs->flaw = agent_flaw_none;
reqs->max_data_size = 0;
for (i = 0; i < ax->len; i += 1 + op->op_size)
{
if (ax->buf[i] > (sizeof (aop_map) / sizeof (aop_map[0])))
{
reqs->flaw = agent_flaw_bad_instruction;
xfree (reg_mask);
return;
}
op = &aop_map[ax->buf[i]];
if (!op->name)
{
reqs->flaw = agent_flaw_bad_instruction;
xfree (reg_mask);
return;
}
if (i + 1 + op->op_size > ax->len)
{
reqs->flaw = agent_flaw_incomplete_instruction;
xfree (reg_mask);
return;
}
/* If this instruction is a forward jump target, does the
current stack height match the stack height at the jump
source? */
if (targets[i] && (heights[i] != height))
{
reqs->flaw = agent_flaw_height_mismatch;
xfree (reg_mask);
return;
}
boundary[i] = 1;
heights[i] = height;
height -= op->consumed;
if (height < reqs->min_height)
reqs->min_height = height;
height += op->produced;
if (height > reqs->max_height)
reqs->max_height = height;
if (op->data_size > reqs->max_data_size)
reqs->max_data_size = op->data_size;
/* For jump instructions, check that the target is a valid
offset. If it is, record the fact that that location is a
jump target, and record the height we expect there. */
if (aop_goto == op - aop_map
|| aop_if_goto == op - aop_map)
{
int target = read_const (ax, i + 1, 2);
if (target < 0 || target >= ax->len)
{
reqs->flaw = agent_flaw_bad_jump;
xfree (reg_mask);
return;
}
/* Do we have any information about what the stack height
should be at the target? */
if (targets[target] || boundary[target])
{
if (heights[target] != height)
{
reqs->flaw = agent_flaw_height_mismatch;
xfree (reg_mask);
return;
}
}
/* Record the target, along with the stack height we expect. */
targets[target] = 1;
heights[target] = height;
}
/* For unconditional jumps with a successor, check that the
successor is a target, and pick up its stack height. */
if (aop_goto == op - aop_map
&& i + 3 < ax->len)
{
if (!targets[i + 3])
{
reqs->flaw = agent_flaw_hole;
xfree (reg_mask);
return;
}
height = heights[i + 3];
}
/* For reg instructions, record the register in the bit mask. */
if (aop_reg == op - aop_map)
{
int reg = read_const (ax, i + 1, 2);
int byte = reg / 8;
/* Grow the bit mask if necessary. */
if (byte >= reg_mask_len)
{
/* It's not appropriate to double here. This isn't a
string buffer. */
int new_len = byte + 1;
reg_mask = xrealloc (reg_mask,
new_len * sizeof (reg_mask[0]));
memset (reg_mask + reg_mask_len, 0,
(new_len - reg_mask_len) * sizeof (reg_mask[0]));
reg_mask_len = new_len;
}
reg_mask[byte] |= 1 << (reg % 8);
}
}
/* Check that all the targets are on boundaries. */
for (i = 0; i < ax->len; i++)
if (targets[i] && !boundary[i])
{
reqs->flaw = agent_flaw_bad_jump;
xfree (reg_mask);
return;
}
reqs->final_height = height;
reqs->reg_mask_len = reg_mask_len;
reqs->reg_mask = reg_mask;
}

291
gdb/ax.h
View File

@@ -1,291 +0,0 @@
/* Definitions for expressions designed to be executed on the agent
Copyright (C) 1998, 1999, 2000, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef AGENTEXPR_H
#define AGENTEXPR_H
#include "doublest.h" /* For DOUBLEST. */
/* It's sometimes useful to be able to debug programs that you can't
really stop for more than a fraction of a second. To this end, the
user can specify a tracepoint (like a breakpoint, but you don't
stop at it), and specify a bunch of expressions to record the
values of when that tracepoint is reached. As the program runs,
GDB collects the values. At any point (possibly while values are
still being collected), the user can display the collected values.
This is used with remote debugging; we don't really support it on
native configurations.
This means that expressions are being evaluated by the remote agent,
which doesn't have any access to the symbol table information, and
needs to be small and simple.
The agent_expr routines and datatypes are a bytecode language
designed to be executed by the agent. Agent expressions work in
terms of fixed-width values, operators, memory references, and
register references. You can evaluate a agent expression just given
a bunch of memory and register values to sniff at; you don't need
any symbolic information like variable names, types, etc.
GDB translates source expressions, whose meaning depends on
symbolic information, into agent bytecode expressions, whose meaning
is independent of symbolic information. This means the agent can
evaluate them on the fly without reference to data only available
to the host GDB. */
/* Agent expression data structures. */
/* The type of an element of the agent expression stack.
The bytecode operation indicates which element we should access;
the value itself has no typing information. GDB generates all
bytecode streams, so we don't have to worry about type errors. */
union agent_val
{
LONGEST l;
DOUBLEST d;
};
/* A buffer containing a agent expression. */
struct agent_expr
{
unsigned char *buf;
int len; /* number of characters used */
int size; /* allocated size */
CORE_ADDR scope;
};
/* The actual values of the various bytecode operations.
Other independent implementations of the agent bytecode engine will
rely on the exact values of these enums, and may not be recompiled
when we change this table. The numeric values should remain fixed
whenever possible. Thus, we assign them values explicitly here (to
allow gaps to form safely), and the disassembly table in
agentexpr.h behaves like an opcode map. If you want to see them
grouped logically, see doc/agentexpr.texi. */
enum agent_op
{
aop_float = 0x01,
aop_add = 0x02,
aop_sub = 0x03,
aop_mul = 0x04,
aop_div_signed = 0x05,
aop_div_unsigned = 0x06,
aop_rem_signed = 0x07,
aop_rem_unsigned = 0x08,
aop_lsh = 0x09,
aop_rsh_signed = 0x0a,
aop_rsh_unsigned = 0x0b,
aop_trace = 0x0c,
aop_trace_quick = 0x0d,
aop_log_not = 0x0e,
aop_bit_and = 0x0f,
aop_bit_or = 0x10,
aop_bit_xor = 0x11,
aop_bit_not = 0x12,
aop_equal = 0x13,
aop_less_signed = 0x14,
aop_less_unsigned = 0x15,
aop_ext = 0x16,
aop_ref8 = 0x17,
aop_ref16 = 0x18,
aop_ref32 = 0x19,
aop_ref64 = 0x1a,
aop_ref_float = 0x1b,
aop_ref_double = 0x1c,
aop_ref_long_double = 0x1d,
aop_l_to_d = 0x1e,
aop_d_to_l = 0x1f,
aop_if_goto = 0x20,
aop_goto = 0x21,
aop_const8 = 0x22,
aop_const16 = 0x23,
aop_const32 = 0x24,
aop_const64 = 0x25,
aop_reg = 0x26,
aop_end = 0x27,
aop_dup = 0x28,
aop_pop = 0x29,
aop_zero_ext = 0x2a,
aop_swap = 0x2b,
aop_trace16 = 0x30,
aop_last
};
/* Functions for building expressions. */
/* Allocate a new, empty agent expression. */
extern struct agent_expr *new_agent_expr (CORE_ADDR);
/* Free a agent expression. */
extern void free_agent_expr (struct agent_expr *);
extern struct cleanup *make_cleanup_free_agent_expr (struct agent_expr *);
/* Append a simple operator OP to EXPR. */
extern void ax_simple (struct agent_expr *EXPR, enum agent_op OP);
/* Append the floating-point prefix, for the next bytecode. */
#define ax_float(EXPR) (ax_simple ((EXPR), aop_float))
/* Append a sign-extension instruction to EXPR, to extend an N-bit value. */
extern void ax_ext (struct agent_expr *EXPR, int N);
/* Append a zero-extension instruction to EXPR, to extend an N-bit value. */
extern void ax_zero_ext (struct agent_expr *EXPR, int N);
/* Append a trace_quick instruction to EXPR, to record N bytes. */
extern void ax_trace_quick (struct agent_expr *EXPR, int N);
/* Append a goto op to EXPR. OP is the actual op (must be aop_goto or
aop_if_goto). We assume we don't know the target offset yet,
because it's probably a forward branch, so we leave space in EXPR
for the target, and return the offset in EXPR of that space, so we
can backpatch it once we do know the target offset. Use ax_label
to do the backpatching. */
extern int ax_goto (struct agent_expr *EXPR, enum agent_op OP);
/* Suppose a given call to ax_goto returns some value PATCH. When you
know the offset TARGET that goto should jump to, call
ax_label (EXPR, PATCH, TARGET)
to patch TARGET into the ax_goto instruction. */
extern void ax_label (struct agent_expr *EXPR, int patch, int target);
/* Assemble code to push a constant on the stack. */
extern void ax_const_l (struct agent_expr *EXPR, LONGEST l);
extern void ax_const_d (struct agent_expr *EXPR, LONGEST d);
/* Assemble code to push the value of register number REG on the
stack. */
extern void ax_reg (struct agent_expr *EXPR, int REG);
/* Functions for printing out expressions, and otherwise debugging
things. */
/* Disassemble the expression EXPR, writing to F. */
extern void ax_print (struct ui_file *f, struct agent_expr * EXPR);
/* An entry in the opcode map. */
struct aop_map
{
/* The name of the opcode. Null means that this entry is not a
valid opcode --- a hole in the opcode space. */
char *name;
/* All opcodes take no operands from the bytecode stream, or take
unsigned integers of various sizes. If this is a positive number
n, then the opcode is followed by an n-byte operand, which should
be printed as an unsigned integer. If this is zero, then the
opcode takes no operands from the bytecode stream.
If we get more complicated opcodes in the future, don't add other
magic values of this; that's a crock. Add an `enum encoding'
field to this, or something like that. */
int op_size;
/* The size of the data operated upon, in bits, for bytecodes that
care about that (ref and const). Zero for all others. */
int data_size;
/* Number of stack elements consumed, and number produced. */
int consumed, produced;
};
/* Map of the bytecodes, indexed by bytecode number. */
extern struct aop_map aop_map[];
/* Different kinds of flaws an agent expression might have, as
detected by agent_reqs. */
enum agent_flaws
{
agent_flaw_none = 0, /* code is good */
/* There is an invalid instruction in the stream. */
agent_flaw_bad_instruction,
/* There is an incomplete instruction at the end of the expression. */
agent_flaw_incomplete_instruction,
/* agent_reqs was unable to prove that every jump target is to a
valid offset. Valid offsets are within the bounds of the
expression, and to a valid instruction boundary. */
agent_flaw_bad_jump,
/* agent_reqs was unable to prove to its satisfaction that, for each
jump target location, the stack will have the same height whether
that location is reached via a jump or by straight execution. */
agent_flaw_height_mismatch,
/* agent_reqs was unable to prove that every instruction following
an unconditional jump was the target of some other jump. */
agent_flaw_hole
};
/* Structure describing the requirements of a bytecode expression. */
struct agent_reqs
{
/* If the following is not equal to agent_flaw_none, the rest of the
information in this structure is suspect. */
enum agent_flaws flaw;
/* Number of elements left on stack at end; may be negative if expr
only consumes elements. */
int final_height;
/* Maximum and minimum stack height, relative to initial height. */
int max_height, min_height;
/* Largest `ref' or `const' opcode used, in bits. Zero means the
expression has no such instructions. */
int max_data_size;
/* Bit vector of registers used. Register R is used iff
reg_mask[R / 8] & (1 << (R % 8))
is non-zero. Note! You may not assume that this bitmask is long
enough to hold bits for all the registers of the machine; the
agent expression code has no idea how many registers the machine
has. However, the bitmask is reg_mask_len bytes long, so the
valid register numbers run from 0 to reg_mask_len * 8 - 1.
We're assuming eight-bit bytes. So sue me.
The caller should free reg_list when done. */
int reg_mask_len;
unsigned char *reg_mask;
};
/* Given an agent expression AX, fill in an agent_reqs structure REQS
describing it. */
extern void ax_reqs (struct agent_expr *ax, struct agent_reqs *reqs);
#endif /* AGENTEXPR_H */

View File

@@ -1,457 +0,0 @@
/* Implement a cached obstack.
Written by Fred Fish <fnf@cygnus.com>
Rewritten by Jim Blandy <jimb@cygnus.com>
Copyright (C) 1999, 2000, 2002, 2003, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "gdb_obstack.h"
#include "bcache.h"
#include "gdb_string.h" /* For memcpy declaration */
#include "gdb_assert.h"
#include <stddef.h>
#include <stdlib.h>
/* The type used to hold a single bcache string. The user data is
stored in d.data. Since it can be any type, it needs to have the
same alignment as the most strict alignment of any type on the host
machine. I don't know of any really correct way to do this in
stock ANSI C, so just do it the same way obstack.h does. */
struct bstring
{
/* Hash chain. */
struct bstring *next;
/* Assume the data length is no more than 64k. */
unsigned short length;
/* The half hash hack. This contains the upper 16 bits of the hash
value and is used as a pre-check when comparing two strings and
avoids the need to do length or memcmp calls. It proves to be
roughly 100% effective. */
unsigned short half_hash;
union
{
char data[1];
double dummy;
}
d;
};
/* The structure for a bcache itself. The bcache is initialized, in
bcache_xmalloc(), by filling it with zeros and then setting the
corresponding obstack's malloc() and free() methods. */
struct bcache
{
/* All the bstrings are allocated here. */
struct obstack cache;
/* How many hash buckets we're using. */
unsigned int num_buckets;
/* Hash buckets. This table is allocated using malloc, so when we
grow the table we can return the old table to the system. */
struct bstring **bucket;
/* Statistics. */
unsigned long unique_count; /* number of unique strings */
long total_count; /* total number of strings cached, including dups */
long unique_size; /* size of unique strings, in bytes */
long total_size; /* total number of bytes cached, including dups */
long structure_size; /* total size of bcache, including infrastructure */
/* Number of times that the hash table is expanded and hence
re-built, and the corresponding number of times that a string is
[re]hashed as part of entering it into the expanded table. The
total number of hashes can be computed by adding TOTAL_COUNT to
expand_hash_count. */
unsigned long expand_count;
unsigned long expand_hash_count;
/* Number of times that the half-hash compare hit (compare the upper
16 bits of hash values) hit, but the corresponding combined
length/data compare missed. */
unsigned long half_hash_miss_count;
};
/* The old hash function was stolen from SDBM. This is what DB 3.0 uses now,
* and is better than the old one.
*/
unsigned long
hash(const void *addr, int length)
{
const unsigned char *k, *e;
unsigned long h;
k = (const unsigned char *)addr;
e = k+length;
for (h=0; k< e;++k)
{
h *=16777619;
h ^= *k;
}
return (h);
}
/* Growing the bcache's hash table. */
/* If the average chain length grows beyond this, then we want to
resize our hash table. */
#define CHAIN_LENGTH_THRESHOLD (5)
static void
expand_hash_table (struct bcache *bcache)
{
/* A table of good hash table sizes. Whenever we grow, we pick the
next larger size from this table. sizes[i] is close to 1 << (i+10),
so we roughly double the table size each time. After we fall off
the end of this table, we just double. Don't laugh --- there have
been executables sighted with a gigabyte of debug info. */
static unsigned long sizes[] = {
1021, 2053, 4099, 8191, 16381, 32771,
65537, 131071, 262144, 524287, 1048573, 2097143,
4194301, 8388617, 16777213, 33554467, 67108859, 134217757,
268435459, 536870923, 1073741827, 2147483659UL
};
unsigned int new_num_buckets;
struct bstring **new_buckets;
unsigned int i;
/* Count the stats. Every unique item needs to be re-hashed and
re-entered. */
bcache->expand_count++;
bcache->expand_hash_count += bcache->unique_count;
/* Find the next size. */
new_num_buckets = bcache->num_buckets * 2;
for (i = 0; i < (sizeof (sizes) / sizeof (sizes[0])); i++)
if (sizes[i] > bcache->num_buckets)
{
new_num_buckets = sizes[i];
break;
}
/* Allocate the new table. */
{
size_t new_size = new_num_buckets * sizeof (new_buckets[0]);
new_buckets = (struct bstring **) xmalloc (new_size);
memset (new_buckets, 0, new_size);
bcache->structure_size -= (bcache->num_buckets
* sizeof (bcache->bucket[0]));
bcache->structure_size += new_size;
}
/* Rehash all existing strings. */
for (i = 0; i < bcache->num_buckets; i++)
{
struct bstring *s, *next;
for (s = bcache->bucket[i]; s; s = next)
{
struct bstring **new_bucket;
next = s->next;
new_bucket = &new_buckets[(hash (&s->d.data, s->length)
% new_num_buckets)];
s->next = *new_bucket;
*new_bucket = s;
}
}
/* Plug in the new table. */
if (bcache->bucket)
xfree (bcache->bucket);
bcache->bucket = new_buckets;
bcache->num_buckets = new_num_buckets;
}
/* Looking up things in the bcache. */
/* The number of bytes needed to allocate a struct bstring whose data
is N bytes long. */
#define BSTRING_SIZE(n) (offsetof (struct bstring, d.data) + (n))
/* Find a copy of the LENGTH bytes at ADDR in BCACHE. If BCACHE has
never seen those bytes before, add a copy of them to BCACHE. In
either case, return a pointer to BCACHE's copy of that string. */
const void *
bcache (const void *addr, int length, struct bcache *bcache)
{
return bcache_full (addr, length, bcache, NULL);
}
/* Find a copy of the LENGTH bytes at ADDR in BCACHE. If BCACHE has
never seen those bytes before, add a copy of them to BCACHE. In
either case, return a pointer to BCACHE's copy of that string. If
optional ADDED is not NULL, return 1 in case of new entry or 0 if
returning an old entry. */
const void *
bcache_full (const void *addr, int length, struct bcache *bcache, int *added)
{
unsigned long full_hash;
unsigned short half_hash;
int hash_index;
struct bstring *s;
if (added)
*added = 0;
/* Lazily initialize the obstack. This can save quite a bit of
memory in some cases. */
if (bcache->total_count == 0)
{
/* We could use obstack_specify_allocation here instead, but
gdb_obstack.h specifies the allocation/deallocation
functions. */
obstack_init (&bcache->cache);
}
/* If our average chain length is too high, expand the hash table. */
if (bcache->unique_count >= bcache->num_buckets * CHAIN_LENGTH_THRESHOLD)
expand_hash_table (bcache);
bcache->total_count++;
bcache->total_size += length;
full_hash = hash (addr, length);
half_hash = (full_hash >> 16);
hash_index = full_hash % bcache->num_buckets;
/* Search the hash bucket for a string identical to the caller's.
As a short-circuit first compare the upper part of each hash
values. */
for (s = bcache->bucket[hash_index]; s; s = s->next)
{
if (s->half_hash == half_hash)
{
if (s->length == length
&& ! memcmp (&s->d.data, addr, length))
return &s->d.data;
else
bcache->half_hash_miss_count++;
}
}
/* The user's string isn't in the list. Insert it after *ps. */
{
struct bstring *new
= obstack_alloc (&bcache->cache, BSTRING_SIZE (length));
memcpy (&new->d.data, addr, length);
new->length = length;
new->next = bcache->bucket[hash_index];
new->half_hash = half_hash;
bcache->bucket[hash_index] = new;
bcache->unique_count++;
bcache->unique_size += length;
bcache->structure_size += BSTRING_SIZE (length);
if (added)
*added = 1;
return &new->d.data;
}
}
/* Allocating and freeing bcaches. */
struct bcache *
bcache_xmalloc (void)
{
/* Allocate the bcache pre-zeroed. */
struct bcache *b = XCALLOC (1, struct bcache);
return b;
}
/* Free all the storage associated with BCACHE. */
void
bcache_xfree (struct bcache *bcache)
{
if (bcache == NULL)
return;
/* Only free the obstack if we actually initialized it. */
if (bcache->total_count > 0)
obstack_free (&bcache->cache, 0);
xfree (bcache->bucket);
xfree (bcache);
}
/* Printing statistics. */
static int
compare_ints (const void *ap, const void *bp)
{
/* Because we know we're comparing two ints which are positive,
there's no danger of overflow here. */
return * (int *) ap - * (int *) bp;
}
static void
print_percentage (int portion, int total)
{
if (total == 0)
/* i18n: Like "Percentage of duplicates, by count: (not applicable)" */
printf_filtered (_("(not applicable)\n"));
else
printf_filtered ("%3d%%\n", (int) (portion * 100.0 / total));
}
/* Print statistics on BCACHE's memory usage and efficacity at
eliminating duplication. NAME should describe the kind of data
BCACHE holds. Statistics are printed using `printf_filtered' and
its ilk. */
void
print_bcache_statistics (struct bcache *c, char *type)
{
int occupied_buckets;
int max_chain_length;
int median_chain_length;
int max_entry_size;
int median_entry_size;
/* Count the number of occupied buckets, tally the various string
lengths, and measure chain lengths. */
{
unsigned int b;
int *chain_length = XCALLOC (c->num_buckets + 1, int);
int *entry_size = XCALLOC (c->unique_count + 1, int);
int stringi = 0;
occupied_buckets = 0;
for (b = 0; b < c->num_buckets; b++)
{
struct bstring *s = c->bucket[b];
chain_length[b] = 0;
if (s)
{
occupied_buckets++;
while (s)
{
gdb_assert (b < c->num_buckets);
chain_length[b]++;
gdb_assert (stringi < c->unique_count);
entry_size[stringi++] = s->length;
s = s->next;
}
}
}
/* To compute the median, we need the set of chain lengths sorted. */
qsort (chain_length, c->num_buckets, sizeof (chain_length[0]),
compare_ints);
qsort (entry_size, c->unique_count, sizeof (entry_size[0]),
compare_ints);
if (c->num_buckets > 0)
{
max_chain_length = chain_length[c->num_buckets - 1];
median_chain_length = chain_length[c->num_buckets / 2];
}
else
{
max_chain_length = 0;
median_chain_length = 0;
}
if (c->unique_count > 0)
{
max_entry_size = entry_size[c->unique_count - 1];
median_entry_size = entry_size[c->unique_count / 2];
}
else
{
max_entry_size = 0;
median_entry_size = 0;
}
xfree (chain_length);
xfree (entry_size);
}
printf_filtered (_(" Cached '%s' statistics:\n"), type);
printf_filtered (_(" Total object count: %ld\n"), c->total_count);
printf_filtered (_(" Unique object count: %lu\n"), c->unique_count);
printf_filtered (_(" Percentage of duplicates, by count: "));
print_percentage (c->total_count - c->unique_count, c->total_count);
printf_filtered ("\n");
printf_filtered (_(" Total object size: %ld\n"), c->total_size);
printf_filtered (_(" Unique object size: %ld\n"), c->unique_size);
printf_filtered (_(" Percentage of duplicates, by size: "));
print_percentage (c->total_size - c->unique_size, c->total_size);
printf_filtered ("\n");
printf_filtered (_(" Max entry size: %d\n"), max_entry_size);
printf_filtered (_(" Average entry size: "));
if (c->unique_count > 0)
printf_filtered ("%ld\n", c->unique_size / c->unique_count);
else
/* i18n: "Average entry size: (not applicable)" */
printf_filtered (_("(not applicable)\n"));
printf_filtered (_(" Median entry size: %d\n"), median_entry_size);
printf_filtered ("\n");
printf_filtered (_(" Total memory used by bcache, including overhead: %ld\n"),
c->structure_size);
printf_filtered (_(" Percentage memory overhead: "));
print_percentage (c->structure_size - c->unique_size, c->unique_size);
printf_filtered (_(" Net memory savings: "));
print_percentage (c->total_size - c->structure_size, c->total_size);
printf_filtered ("\n");
printf_filtered (_(" Hash table size: %3d\n"), c->num_buckets);
printf_filtered (_(" Hash table expands: %lu\n"),
c->expand_count);
printf_filtered (_(" Hash table hashes: %lu\n"),
c->total_count + c->expand_hash_count);
printf_filtered (_(" Half hash misses: %lu\n"),
c->half_hash_miss_count);
printf_filtered (_(" Hash table population: "));
print_percentage (occupied_buckets, c->num_buckets);
printf_filtered (_(" Median hash chain length: %3d\n"),
median_chain_length);
printf_filtered (_(" Average hash chain length: "));
if (c->num_buckets > 0)
printf_filtered ("%3lu\n", c->unique_count / c->num_buckets);
else
/* i18n: "Average hash chain length: (not applicable)" */
printf_filtered (_("(not applicable)\n"));
printf_filtered (_(" Maximum hash chain length: %3d\n"), max_chain_length);
printf_filtered ("\n");
}
int
bcache_memory_used (struct bcache *bcache)
{
if (bcache->total_count == 0)
return 0;
return obstack_memory_used (&bcache->cache);
}

View File

@@ -1,173 +0,0 @@
/* Include file cached obstack implementation.
Written by Fred Fish <fnf@cygnus.com>
Rewritten by Jim Blandy <jimb@cygnus.com>
Copyright (C) 1999, 2000, 2002, 2003, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef BCACHE_H
#define BCACHE_H 1
/* A bcache is a data structure for factoring out duplication in
read-only structures. You give the bcache some string of bytes S.
If the bcache already contains a copy of S, it hands you back a
pointer to its copy. Otherwise, it makes a fresh copy of S, and
hands you back a pointer to that. In either case, you can throw
away your copy of S, and use the bcache's.
The "strings" in question are arbitrary strings of bytes --- they
can contain zero bytes. You pass in the length explicitly when you
call the bcache function.
This means that you can put ordinary C objects in a bcache.
However, if you do this, remember that structs can contain `holes'
between members, added for alignment. These bytes usually contain
garbage. If you try to bcache two objects which are identical from
your code's point of view, but have different garbage values in the
structure's holes, then the bcache will treat them as separate
strings, and you won't get the nice elimination of duplicates you
were hoping for. So, remember to memset your structures full of
zeros before bcaching them!
You shouldn't modify the strings you get from a bcache, because:
- You don't necessarily know who you're sharing space with. If I
stick eight bytes of text in a bcache, and then stick an eight-byte
structure in the same bcache, there's no guarantee those two
objects don't actually comprise the same sequence of bytes. If
they happen to, the bcache will use a single byte string for both
of them. Then, modifying the structure will change the string. In
bizarre ways.
- Even if you know for some other reason that all that's okay,
there's another problem. A bcache stores all its strings in a hash
table. If you modify a string's contents, you will probably change
its hash value. This means that the modified string is now in the
wrong place in the hash table, and future bcache probes will never
find it. So by mutating a string, you give up any chance of
sharing its space with future duplicates.
Size of bcache VS hashtab:
For bcache, the most critical cost is size (or more exactly the
overhead added by the bcache). It turns out that the bcache is
remarkably efficient.
Assuming a 32-bit system (the hash table slots are 4 bytes),
ignoring alignment, and limit strings to 255 bytes (1 byte length)
we get ...
bcache: This uses a separate linked list to track the hash chain.
The numbers show roughly 100% occupancy of the hash table and an
average chain length of 4. Spreading the slot cost over the 4
chain elements:
4 (slot) / 4 (chain length) + 1 (length) + 4 (chain) = 6 bytes
hashtab: This uses a more traditional re-hash algorithm where the
chain is maintained within the hash table. The table occupancy is
kept below 75% but we'll assume its perfect:
4 (slot) x 4/3 (occupancy) + 1 (length) = 6 1/3 bytes
So a perfect hashtab has just slightly larger than an average
bcache.
It turns out that an average hashtab is far worse. Two things
hurt:
- Hashtab's occupancy is more like 50% (it ranges between 38% and
75%) giving a per slot cost of 4x2 vs 4x4/3.
- the string structure needs to be aligned to 8 bytes which for
hashtab wastes 7 bytes, while for bcache wastes only 3.
This gives:
hashtab: 4 x 2 + 1 + 7 = 16 bytes
bcache 4 / 4 + 1 + 4 + 3 = 9 bytes
The numbers of GDB debugging GDB support this. ~40% vs ~70% overhead.
Speed of bcache VS hashtab (the half hash hack):
While hashtab has a typical chain length of 1, bcache has a chain
length of round 4. This means that the bcache will require
something like double the number of compares after that initial
hash. In both cases the comparison takes the form:
a.length == b.length && memcmp (a.data, b.data, a.length) == 0
That is lengths are checked before doing the memcmp.
For GDB debugging GDB, it turned out that all lengths were 24 bytes
(no C++ so only psymbols were cached) and hence, all compares
required a call to memcmp. As a hack, two bytes of padding
(mentioned above) are used to store the upper 16 bits of the
string's hash value and then that is used in the comparison vis:
a.half_hash == b.half_hash && a.length == b.length && memcmp
(a.data, b.data, a.length)
The numbers from GDB debugging GDB show this to be a remarkable
100% effective (only necessary length and memcmp tests being
performed).
Mind you, looking at the wall clock, the same GDB debugging GDB
showed only marginal speed up (0.780 vs 0.773s). Seems GDB is too
busy doing something else :-(
*/
struct bcache;
/* Find a copy of the LENGTH bytes at ADDR in BCACHE. If BCACHE has
never seen those bytes before, add a copy of them to BCACHE. In
either case, return a pointer to BCACHE's copy of that string.
Since the cached value is ment to be read-only, return a const
buffer. */
extern const void *bcache (const void *addr, int length,
struct bcache *bcache);
/* Like bcache, but if ADDED is not NULL, set *ADDED to true if the
bytes were newly added to the cache, or to false if the bytes were
found in the cache. */
extern const void *bcache_full (const void *addr, int length,
struct bcache *bcache, int *added);
/* Free all the storage used by BCACHE. */
extern void bcache_xfree (struct bcache *bcache);
/* Create a new bcache object. */
extern struct bcache *bcache_xmalloc (void);
/* Print statistics on BCACHE's memory usage and efficacity at
eliminating duplication. TYPE should be a string describing the
kind of data BCACHE holds. Statistics are printed using
`printf_filtered' and its ilk. */
extern void print_bcache_statistics (struct bcache *bcache, char *type);
extern int bcache_memory_used (struct bcache *bcache);
/* The hash function */
extern unsigned long hash(const void *addr, int length);
#endif /* BCACHE_H */

View File

@@ -1,83 +0,0 @@
/* Very simple "bfd" target, for GDB, the GNU debugger.
Copyright (C) 2003, 2005, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "target.h"
#include "bfd-target.h"
#include "exec.h"
static LONGEST
target_bfd_xfer_partial (struct target_ops *ops,
enum target_object object,
const char *annex, gdb_byte *readbuf,
const gdb_byte *writebuf,
ULONGEST offset, LONGEST len)
{
switch (object)
{
case TARGET_OBJECT_MEMORY:
{
struct target_section_table *table = ops->to_data;
return section_table_xfer_memory_partial (readbuf, writebuf, offset, len,
table->sections,
table->sections_end,
NULL);
}
default:
return -1;
}
}
static struct target_section_table *
target_bfd_get_section_table (struct target_ops *ops)
{
return ops->to_data;
}
static void
target_bfd_xclose (struct target_ops *t, int quitting)
{
struct target_section_table *table = t->to_data;
if (table->sections)
bfd_close (table->sections->bfd);
xfree (table->sections);
xfree (table);
xfree (t);
}
struct target_ops *
target_bfd_reopen (struct bfd *bfd)
{
struct target_ops *t;
struct target_section_table *table;
table = XZALLOC (struct target_section_table);
build_section_table (bfd, &table->sections, &table->sections_end);
t = XZALLOC (struct target_ops);
t->to_shortname = "bfd";
t->to_longname = _("BFD backed target");
t->to_doc = _("You should never see this");
t->to_get_section_table = target_bfd_get_section_table;
t->to_xfer_partial = target_bfd_xfer_partial;
t->to_xclose = target_bfd_xclose;
t->to_data = table;
return t;
}

View File

@@ -1,31 +0,0 @@
/* Very simple "bfd" target, for GDB, the GNU debugger.
Copyright (C) 2003, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef BFD_TARGET_H
#define BFD_TARGET_H
struct bfd;
struct target_ops;
/* Given an existing BFD, re-open it as a "struct target_ops". On
close, it will also close the corresponding BFD (which is like
freopen and fdopen). */
struct target_ops *target_bfd_reopen (struct bfd *bfd);
#endif

View File

@@ -1,302 +0,0 @@
/* Block-related functions for the GNU debugger, GDB.
Copyright (C) 2003, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "block.h"
#include "symtab.h"
#include "symfile.h"
#include "gdb_obstack.h"
#include "cp-support.h"
#include "addrmap.h"
/* This is used by struct block to store namespace-related info for
C++ files, namely using declarations and the current namespace in
scope. */
struct block_namespace_info
{
const char *scope;
struct using_direct *using;
};
static void block_initialize_namespace (struct block *block,
struct obstack *obstack);
/* Return Nonzero if block a is lexically nested within block b,
or if a and b have the same pc range.
Return zero otherwise. */
int
contained_in (const struct block *a, const struct block *b)
{
if (!a || !b)
return 0;
return BLOCK_START (a) >= BLOCK_START (b)
&& BLOCK_END (a) <= BLOCK_END (b);
}
/* Return the symbol for the function which contains a specified
lexical block, described by a struct block BL. The return value
will not be an inlined function; the containing function will be
returned instead. */
struct symbol *
block_linkage_function (const struct block *bl)
{
while (BLOCK_FUNCTION (bl) == 0 && BLOCK_SUPERBLOCK (bl) != 0)
bl = BLOCK_SUPERBLOCK (bl);
return BLOCK_FUNCTION (bl);
}
/* Return the blockvector immediately containing the innermost lexical
block containing the specified pc value and section, or 0 if there
is none. PBLOCK is a pointer to the block. If PBLOCK is NULL, we
don't pass this information back to the caller. */
struct blockvector *
blockvector_for_pc_sect (CORE_ADDR pc, struct obj_section *section,
struct block **pblock, struct symtab *symtab)
{
struct block *b;
int bot, top, half;
struct blockvector *bl;
if (symtab == 0) /* if no symtab specified by caller */
{
/* First search all symtabs for one whose file contains our pc */
symtab = find_pc_sect_symtab (pc, section);
if (symtab == 0)
return 0;
}
bl = BLOCKVECTOR (symtab);
/* Then search that symtab for the smallest block that wins. */
/* If we have an addrmap mapping code addresses to blocks, then use
that. */
if (BLOCKVECTOR_MAP (bl))
{
b = addrmap_find (BLOCKVECTOR_MAP (bl), pc);
if (b)
{
if (pblock)
*pblock = b;
return bl;
}
else
return 0;
}
/* Otherwise, use binary search to find the last block that starts
before PC. */
bot = 0;
top = BLOCKVECTOR_NBLOCKS (bl);
while (top - bot > 1)
{
half = (top - bot + 1) >> 1;
b = BLOCKVECTOR_BLOCK (bl, bot + half);
if (BLOCK_START (b) <= pc)
bot += half;
else
top = bot + half;
}
/* Now search backward for a block that ends after PC. */
while (bot >= 0)
{
b = BLOCKVECTOR_BLOCK (bl, bot);
if (BLOCK_END (b) > pc)
{
if (pblock)
*pblock = b;
return bl;
}
bot--;
}
return 0;
}
/* Return the blockvector immediately containing the innermost lexical block
containing the specified pc value, or 0 if there is none.
Backward compatibility, no section. */
struct blockvector *
blockvector_for_pc (CORE_ADDR pc, struct block **pblock)
{
return blockvector_for_pc_sect (pc, find_pc_mapped_section (pc),
pblock, NULL);
}
/* Return the innermost lexical block containing the specified pc value
in the specified section, or 0 if there is none. */
struct block *
block_for_pc_sect (CORE_ADDR pc, struct obj_section *section)
{
struct blockvector *bl;
struct block *b;
bl = blockvector_for_pc_sect (pc, section, &b, NULL);
if (bl)
return b;
return 0;
}
/* Return the innermost lexical block containing the specified pc value,
or 0 if there is none. Backward compatibility, no section. */
struct block *
block_for_pc (CORE_ADDR pc)
{
return block_for_pc_sect (pc, find_pc_mapped_section (pc));
}
/* Now come some functions designed to deal with C++ namespace issues.
The accessors are safe to use even in the non-C++ case. */
/* This returns the namespace that BLOCK is enclosed in, or "" if it
isn't enclosed in a namespace at all. This travels the chain of
superblocks looking for a scope, if necessary. */
const char *
block_scope (const struct block *block)
{
for (; block != NULL; block = BLOCK_SUPERBLOCK (block))
{
if (BLOCK_NAMESPACE (block) != NULL
&& BLOCK_NAMESPACE (block)->scope != NULL)
return BLOCK_NAMESPACE (block)->scope;
}
return "";
}
/* Set BLOCK's scope member to SCOPE; if needed, allocate memory via
OBSTACK. (It won't make a copy of SCOPE, however, so that already
has to be allocated correctly.) */
void
block_set_scope (struct block *block, const char *scope,
struct obstack *obstack)
{
block_initialize_namespace (block, obstack);
BLOCK_NAMESPACE (block)->scope = scope;
}
/* This returns the using directives list associated with BLOCK, if
any. */
struct using_direct *
block_using (const struct block *block)
{
if (block == NULL || BLOCK_NAMESPACE (block) == NULL)
return NULL;
else
return BLOCK_NAMESPACE (block)->using;
}
/* Set BLOCK's using member to USING; if needed, allocate memory via
OBSTACK. (It won't make a copy of USING, however, so that already
has to be allocated correctly.) */
void
block_set_using (struct block *block,
struct using_direct *using,
struct obstack *obstack)
{
block_initialize_namespace (block, obstack);
BLOCK_NAMESPACE (block)->using = using;
}
/* If BLOCK_NAMESPACE (block) is NULL, allocate it via OBSTACK and
ititialize its members to zero. */
static void
block_initialize_namespace (struct block *block, struct obstack *obstack)
{
if (BLOCK_NAMESPACE (block) == NULL)
{
BLOCK_NAMESPACE (block)
= obstack_alloc (obstack, sizeof (struct block_namespace_info));
BLOCK_NAMESPACE (block)->scope = NULL;
BLOCK_NAMESPACE (block)->using = NULL;
}
}
/* Return the static block associated to BLOCK. Return NULL if block
is NULL or if block is a global block. */
const struct block *
block_static_block (const struct block *block)
{
if (block == NULL || BLOCK_SUPERBLOCK (block) == NULL)
return NULL;
while (BLOCK_SUPERBLOCK (BLOCK_SUPERBLOCK (block)) != NULL)
block = BLOCK_SUPERBLOCK (block);
return block;
}
/* Return the static block associated to BLOCK. Return NULL if block
is NULL. */
const struct block *
block_global_block (const struct block *block)
{
if (block == NULL)
return NULL;
while (BLOCK_SUPERBLOCK (block) != NULL)
block = BLOCK_SUPERBLOCK (block);
return block;
}
/* Allocate a block on OBSTACK, and initialize its elements to
zero/NULL. This is useful for creating "dummy" blocks that don't
correspond to actual source files.
Warning: it sets the block's BLOCK_DICT to NULL, which isn't a
valid value. If you really don't want the block to have a
dictionary, then you should subsequently set its BLOCK_DICT to
dict_create_linear (obstack, NULL). */
struct block *
allocate_block (struct obstack *obstack)
{
struct block *bl = obstack_alloc (obstack, sizeof (struct block));
BLOCK_START (bl) = 0;
BLOCK_END (bl) = 0;
BLOCK_FUNCTION (bl) = NULL;
BLOCK_SUPERBLOCK (bl) = NULL;
BLOCK_DICT (bl) = NULL;
BLOCK_NAMESPACE (bl) = NULL;
return bl;
}

View File

@@ -1,167 +0,0 @@
/* Code dealing with blocks for GDB.
Copyright (C) 2003, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
#ifndef BLOCK_H
#define BLOCK_H
/* Opaque declarations. */
struct symbol;
struct symtab;
struct block_namespace_info;
struct using_direct;
struct obstack;
struct dictionary;
struct addrmap;
/* All of the name-scope contours of the program
are represented by `struct block' objects.
All of these objects are pointed to by the blockvector.
Each block represents one name scope.
Each lexical context has its own block.
The blockvector begins with some special blocks.
The GLOBAL_BLOCK contains all the symbols defined in this compilation
whose scope is the entire program linked together.
The STATIC_BLOCK contains all the symbols whose scope is the
entire compilation excluding other separate compilations.
Blocks starting with the FIRST_LOCAL_BLOCK are not special.
Each block records a range of core addresses for the code that
is in the scope of the block. The STATIC_BLOCK and GLOBAL_BLOCK
give, for the range of code, the entire range of code produced
by the compilation that the symbol segment belongs to.
The blocks appear in the blockvector
in order of increasing starting-address,
and, within that, in order of decreasing ending-address.
This implies that within the body of one function
the blocks appear in the order of a depth-first tree walk. */
struct block
{
/* Addresses in the executable code that are in this block. */
CORE_ADDR startaddr;
CORE_ADDR endaddr;
/* The symbol that names this block, if the block is the body of a
function; otherwise, zero. */
struct symbol *function;
/* The `struct block' for the containing block, or 0 if none.
The superblock of a top-level local block (i.e. a function in the
case of C) is the STATIC_BLOCK. The superblock of the
STATIC_BLOCK is the GLOBAL_BLOCK. */
struct block *superblock;
/* This is used to store the symbols in the block. */
struct dictionary *dict;
/* Used for language-specific info. */
union
{
struct
{
/* Contains information about namespace-related info relevant to
this block: using directives and the current namespace
scope. */
struct block_namespace_info *namespace;
}
cplus_specific;
}
language_specific;
};
#define BLOCK_START(bl) (bl)->startaddr
#define BLOCK_END(bl) (bl)->endaddr
#define BLOCK_FUNCTION(bl) (bl)->function
#define BLOCK_SUPERBLOCK(bl) (bl)->superblock
#define BLOCK_DICT(bl) (bl)->dict
#define BLOCK_NAMESPACE(bl) (bl)->language_specific.cplus_specific.namespace
/* Macro to loop through all symbols in a block BL, in no particular
order. ITER helps keep track of the iteration, and should be a
struct dict_iterator. SYM points to the current symbol. */
#define ALL_BLOCK_SYMBOLS(block, iter, sym) \
ALL_DICT_SYMBOLS (BLOCK_DICT (block), iter, sym)
struct blockvector
{
/* Number of blocks in the list. */
int nblocks;
/* An address map mapping addresses to blocks in this blockvector.
This pointer is zero if the blocks' start and end addresses are
enough. */
struct addrmap *map;
/* The blocks themselves. */
struct block *block[1];
};
#define BLOCKVECTOR_NBLOCKS(blocklist) (blocklist)->nblocks
#define BLOCKVECTOR_BLOCK(blocklist,n) (blocklist)->block[n]
#define BLOCKVECTOR_MAP(blocklist) ((blocklist)->map)
/* Special block numbers */
enum { GLOBAL_BLOCK = 0, STATIC_BLOCK = 1, FIRST_LOCAL_BLOCK = 2 };
extern struct symbol *block_linkage_function (const struct block *);
extern int contained_in (const struct block *, const struct block *);
extern struct blockvector *blockvector_for_pc (CORE_ADDR, struct block **);
extern struct blockvector *blockvector_for_pc_sect (CORE_ADDR,
struct obj_section *,
struct block **,
struct symtab *);
extern struct block *block_for_pc (CORE_ADDR);
extern struct block *block_for_pc_sect (CORE_ADDR, struct obj_section *);
extern const char *block_scope (const struct block *block);
extern void block_set_scope (struct block *block, const char *scope,
struct obstack *obstack);
extern struct using_direct *block_using (const struct block *block);
extern void block_set_using (struct block *block,
struct using_direct *using,
struct obstack *obstack);
extern const struct block *block_static_block (const struct block *block);
extern const struct block *block_global_block (const struct block *block);
extern struct block *allocate_block (struct obstack *obstack);
#endif /* BLOCK_H */

View File

@@ -1,361 +0,0 @@
/* Get info from stack frames; convert between frames, blocks,
functions and pc values.
Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009
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 3 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, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "symtab.h"
#include "bfd.h"
#include "objfiles.h"
#include "frame.h"
#include "gdbcore.h"
#include "value.h"
#include "target.h"
#include "inferior.h"
#include "annotate.h"
#include "regcache.h"
#include "gdb_assert.h"
#include "dummy-frame.h"
#include "command.h"
#include "gdbcmd.h"
#include "block.h"
/* Prototypes for exported functions. */
void _initialize_blockframe (void);
/* Return the innermost lexical block in execution
in a specified stack frame. The frame address is assumed valid.
If ADDR_IN_BLOCK is non-zero, set *ADDR_IN_BLOCK to the exact code
address we used to choose the block. We use this to find a source
line, to decide which macro definitions are in scope.
The value returned in *ADDR_IN_BLOCK isn't necessarily the frame's
PC, and may not really be a valid PC at all. For example, in the
caller of a function declared to never return, the code at the
return address will never be reached, so the call instruction may
be the very last instruction in the block. So the address we use
to choose the block is actually one byte before the return address
--- hopefully pointing us at the call instruction, or its delay
slot instruction. */
struct block *
get_frame_block (struct frame_info *frame, CORE_ADDR *addr_in_block)
{
const CORE_ADDR pc = get_frame_address_in_block (frame);
if (addr_in_block)
*addr_in_block = pc;
return block_for_pc (pc);
}
CORE_ADDR
get_pc_function_start (CORE_ADDR pc)
{
struct block *bl;
struct minimal_symbol *msymbol;
bl = block_for_pc (pc);
if (bl)
{
struct symbol *symbol = block_linkage_function (bl);
if (symbol)
{
bl = SYMBOL_BLOCK_VALUE (symbol);
return BLOCK_START (bl);
}
}
msymbol = lookup_minimal_symbol_by_pc (pc);
if (msymbol)
{
CORE_ADDR fstart = SYMBOL_VALUE_ADDRESS (msymbol);
if (find_pc_section (fstart))
return fstart;
}
return 0;
}
/* Return the symbol for the function executing in frame FRAME. */
struct symbol *
get_frame_function (struct frame_info *frame)
{
struct block *bl = get_frame_block (frame, 0);
if (bl == 0)
return 0;
return block_linkage_function (bl);
}
/* Return the function containing pc value PC in section SECTION.
Returns 0 if function is not known. */
struct symbol *
find_pc_sect_function (CORE_ADDR pc, struct obj_section *section)
{
struct block *b = block_for_pc_sect (pc, section);
if (b == 0)
return 0;
return block_linkage_function (b);
}
/* Return the function containing pc value PC.
Returns 0 if function is not known. Backward compatibility, no section */
struct symbol *
find_pc_function (CORE_ADDR pc)
{
return find_pc_sect_function (pc, find_pc_mapped_section (pc));
}
/* These variables are used to cache the most recent result
* of find_pc_partial_function. */
static CORE_ADDR cache_pc_function_low = 0;
static CORE_ADDR cache_pc_function_high = 0;
static char *cache_pc_function_name = 0;
static struct obj_section *cache_pc_function_section = NULL;
/* Clear cache, e.g. when symbol table is discarded. */
void
clear_pc_function_cache (void)
{
cache_pc_function_low = 0;
cache_pc_function_high = 0;
cache_pc_function_name = (char *) 0;
cache_pc_function_section = NULL;
}
/* Finds the "function" (text symbol) that is smaller than PC but
greatest of all of the potential text symbols in SECTION. Sets
*NAME and/or *ADDRESS conditionally if that pointer is non-null.
If ENDADDR is non-null, then set *ENDADDR to be the end of the
function (exclusive), but passing ENDADDR as non-null means that
the function might cause symbols to be read. This function either
succeeds or fails (not halfway succeeds). If it succeeds, it sets
*NAME, *ADDRESS, and *ENDADDR to real information and returns 1.
If it fails, it sets *NAME, *ADDRESS, and *ENDADDR to zero and
returns 0. */
/* Backward compatibility, no section argument. */
int
find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address,
CORE_ADDR *endaddr)
{
struct obj_section *section;
struct partial_symtab *pst;
struct symbol *f;
struct minimal_symbol *msymbol;
struct partial_symbol *psb;
int i;
CORE_ADDR mapped_pc;
/* To ensure that the symbol returned belongs to the correct setion
(and that the last [random] symbol from the previous section
isn't returned) try to find the section containing PC. First try
the overlay code (which by default returns NULL); and second try
the normal section code (which almost always succeeds). */
section = find_pc_overlay (pc);
if (section == NULL)
section = find_pc_section (pc);
mapped_pc = overlay_mapped_address (pc, section);
if (mapped_pc >= cache_pc_function_low
&& mapped_pc < cache_pc_function_high
&& section == cache_pc_function_section)
goto return_cached_value;
msymbol = lookup_minimal_symbol_by_pc_section (mapped_pc, section);
pst = find_pc_sect_psymtab (mapped_pc, section);
if (pst)
{
/* Need to read the symbols to get a good value for the end address. */
if (endaddr != NULL && !pst->readin)
{
/* Need to get the terminal in case symbol-reading produces
output. */
target_terminal_ours_for_output ();
PSYMTAB_TO_SYMTAB (pst);
}
if (pst->readin)
{
/* Checking whether the msymbol has a larger value is for the
"pathological" case mentioned in print_frame_info. */
f = find_pc_sect_function (mapped_pc, section);
if (f != NULL
&& (msymbol == NULL
|| (BLOCK_START (SYMBOL_BLOCK_VALUE (f))
>= SYMBOL_VALUE_ADDRESS (msymbol))))
{
cache_pc_function_low = BLOCK_START (SYMBOL_BLOCK_VALUE (f));
cache_pc_function_high = BLOCK_END (SYMBOL_BLOCK_VALUE (f));
cache_pc_function_name = SYMBOL_LINKAGE_NAME (f);
cache_pc_function_section = section;
goto return_cached_value;
}
}
else
{
/* Now that static symbols go in the minimal symbol table, perhaps
we could just ignore the partial symbols. But at least for now
we use the partial or minimal symbol, whichever is larger. */
psb = find_pc_sect_psymbol (pst, mapped_pc, section);
if (psb
&& (msymbol == NULL ||
(SYMBOL_VALUE_ADDRESS (psb)
>= SYMBOL_VALUE_ADDRESS (msymbol))))
{
/* This case isn't being cached currently. */
if (address)
*address = SYMBOL_VALUE_ADDRESS (psb);
if (name)
*name = SYMBOL_LINKAGE_NAME (psb);
/* endaddr non-NULL can't happen here. */
return 1;
}
}
}
/* Not in the normal symbol tables, see if the pc is in a known section.
If it's not, then give up. This ensures that anything beyond the end
of the text seg doesn't appear to be part of the last function in the
text segment. */
if (!section)
msymbol = NULL;
/* Must be in the minimal symbol table. */
if (msymbol == NULL)
{
/* No available symbol. */
if (name != NULL)
*name = 0;
if (address != NULL)
*address = 0;
if (endaddr != NULL)
*endaddr = 0;
return 0;
}
cache_pc_function_low = SYMBOL_VALUE_ADDRESS (msymbol);
cache_pc_function_name = SYMBOL_LINKAGE_NAME (msymbol);
cache_pc_function_section = section;
/* If the minimal symbol has a size, use it for the cache.
Otherwise use the lesser of the next minimal symbol in the same
section, or the end of the section, as the end of the
function. */
if (MSYMBOL_SIZE (msymbol) != 0)
cache_pc_function_high = cache_pc_function_low + MSYMBOL_SIZE (msymbol);
else
{
/* Step over other symbols at this same address, and symbols in
other sections, to find the next symbol in this section with
a different address. */
for (i = 1; SYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
{
if (SYMBOL_VALUE_ADDRESS (msymbol + i) != SYMBOL_VALUE_ADDRESS (msymbol)
&& SYMBOL_OBJ_SECTION (msymbol + i) == SYMBOL_OBJ_SECTION (msymbol))
break;
}
if (SYMBOL_LINKAGE_NAME (msymbol + i) != NULL
&& SYMBOL_VALUE_ADDRESS (msymbol + i) < obj_section_endaddr (section))
cache_pc_function_high = SYMBOL_VALUE_ADDRESS (msymbol + i);
else
/* We got the start address from the last msymbol in the objfile.
So the end address is the end of the section. */
cache_pc_function_high = obj_section_endaddr (section);
}
return_cached_value:
if (address)
{
if (pc_in_unmapped_range (pc, section))
*address = overlay_unmapped_address (cache_pc_function_low, section);
else
*address = cache_pc_function_low;
}
if (name)
*name = cache_pc_function_name;
if (endaddr)
{
if (pc_in_unmapped_range (pc, section))
{
/* Because the high address is actually beyond the end of
the function (and therefore possibly beyond the end of
the overlay), we must actually convert (high - 1) and
then add one to that. */
*endaddr = 1 + overlay_unmapped_address (cache_pc_function_high - 1,
section);
}
else
*endaddr = cache_pc_function_high;
}
return 1;
}
/* Return the innermost stack frame executing inside of BLOCK,
or NULL if there is no such frame. If BLOCK is NULL, just return NULL. */
struct frame_info *
block_innermost_frame (struct block *block)
{
struct frame_info *frame;
CORE_ADDR start;
CORE_ADDR end;
CORE_ADDR calling_pc;
if (block == NULL)
return NULL;
start = BLOCK_START (block);
end = BLOCK_END (block);
frame = get_current_frame ();
while (frame != NULL)
{
calling_pc = get_frame_address_in_block (frame);
if (calling_pc >= start && calling_pc < end)
return frame;
frame = get_prev_frame (frame);
}
return NULL;
}

Some files were not shown because too many files have changed in this diff Show More