From c906108c21474dfb4ed285bcc0ac6fe02cd400cc Mon Sep 17 00:00:00 2001 From: Stan Shebs Date: Fri, 16 Apr 1999 01:35:26 +0000 Subject: Initial creation of sourceware repository --- gdb/testsuite/gdb.base/Makefile.in | 46 + gdb/testsuite/gdb.base/README | 13 + gdb/testsuite/gdb.base/a1-selftest.exp | 426 ++++++ gdb/testsuite/gdb.base/a2-run.exp | 253 ++++ gdb/testsuite/gdb.base/all-bin.exp | 467 +++++++ gdb/testsuite/gdb.base/all-types.c | 62 + gdb/testsuite/gdb.base/arithmet.exp | 375 ++++++ gdb/testsuite/gdb.base/assign.exp | 446 +++++++ gdb/testsuite/gdb.base/bar.c | 9 + gdb/testsuite/gdb.base/baz.c | 9 + gdb/testsuite/gdb.base/bitfields.c | 194 +++ gdb/testsuite/gdb.base/bitfields.exp | 268 ++++ gdb/testsuite/gdb.base/bitops.exp | 365 ++++++ gdb/testsuite/gdb.base/branches.c | 113 ++ gdb/testsuite/gdb.base/break.c | 81 ++ gdb/testsuite/gdb.base/break.exp | 769 +++++++++++ gdb/testsuite/gdb.base/call-ar-st.c | 1137 ++++++++++++++++ gdb/testsuite/gdb.base/call-ar-st.exp | 451 +++++++ gdb/testsuite/gdb.base/call-rt-st.c | 530 ++++++++ gdb/testsuite/gdb.base/call-rt-st.exp | 230 ++++ gdb/testsuite/gdb.base/call-strs.c | 54 + gdb/testsuite/gdb.base/call-strs.exp | 242 ++++ gdb/testsuite/gdb.base/callfuncs.c | 280 ++++ gdb/testsuite/gdb.base/callfuncs.exp | 269 ++++ gdb/testsuite/gdb.base/callfuncs2.c | 267 ++++ gdb/testsuite/gdb.base/callfuncs2.exp | 276 ++++ gdb/testsuite/gdb.base/commands.exp | 248 ++++ gdb/testsuite/gdb.base/compiler.c | 31 + gdb/testsuite/gdb.base/completion.exp | 568 ++++++++ gdb/testsuite/gdb.base/cond-expr.exp | 122 ++ gdb/testsuite/gdb.base/condbreak.c | 81 ++ gdb/testsuite/gdb.base/condbreak.exp | 157 +++ gdb/testsuite/gdb.base/configure | 899 +++++++++++++ gdb/testsuite/gdb.base/configure.in | 15 + gdb/testsuite/gdb.base/constvars.c | 183 +++ gdb/testsuite/gdb.base/constvars.exp | 251 ++++ gdb/testsuite/gdb.base/corefile.exp | 223 ++++ gdb/testsuite/gdb.base/coremaker.c | 120 ++ gdb/testsuite/gdb.base/crossload.exp | 380 ++++++ gdb/testsuite/gdb.base/d10v.ld | 155 +++ gdb/testsuite/gdb.base/d10vovly.c | 225 ++++ gdb/testsuite/gdb.base/default.exp | 793 ++++++++++++ gdb/testsuite/gdb.base/define.exp | 304 +++++ gdb/testsuite/gdb.base/display.c | 52 + gdb/testsuite/gdb.base/display.exp | 147 +++ gdb/testsuite/gdb.base/dollar.exp | 128 ++ gdb/testsuite/gdb.base/echo.exp | 44 + gdb/testsuite/gdb.base/ena-dis-br.exp | 525 ++++++++ gdb/testsuite/gdb.base/ending-run.c | 27 + gdb/testsuite/gdb.base/ending-run.exp | 176 +++ gdb/testsuite/gdb.base/environ.exp | 329 +++++ gdb/testsuite/gdb.base/eval-skip.exp | 352 +++++ gdb/testsuite/gdb.base/exprs.c | 253 ++++ gdb/testsuite/gdb.base/exprs.exp | 222 ++++ gdb/testsuite/gdb.base/foo.c | 9 + gdb/testsuite/gdb.base/funcargs.c | 582 +++++++++ gdb/testsuite/gdb.base/funcargs.exp | 1017 +++++++++++++++ gdb/testsuite/gdb.base/gdbvars.exp | 117 ++ gdb/testsuite/gdb.base/grbx.c | 10 + gdb/testsuite/gdb.base/help.exp | 542 ++++++++ gdb/testsuite/gdb.base/i486-elf.u | 287 +++++ gdb/testsuite/gdb.base/i860-elf.u | 314 +++++ gdb/testsuite/gdb.base/int-type.c | 25 + gdb/testsuite/gdb.base/interrupt.c | 37 + gdb/testsuite/gdb.base/interrupt.exp | 175 +++ gdb/testsuite/gdb.base/jump.c | 19 + gdb/testsuite/gdb.base/jump.exp | 192 +++ gdb/testsuite/gdb.base/langs.exp | 122 ++ gdb/testsuite/gdb.base/langs0.c | 28 + gdb/testsuite/gdb.base/langs1.c | 33 + gdb/testsuite/gdb.base/langs1.f | 7 + gdb/testsuite/gdb.base/langs2.c | 15 + gdb/testsuite/gdb.base/langs2.cxx | 13 + gdb/testsuite/gdb.base/list.exp | 521 ++++++++ gdb/testsuite/gdb.base/list0.c | 42 + gdb/testsuite/gdb.base/list0.h | 36 + gdb/testsuite/gdb.base/list1.c | 33 + gdb/testsuite/gdb.base/logical.exp | 575 +++++++++ gdb/testsuite/gdb.base/long_long.c | 55 + gdb/testsuite/gdb.base/long_long.exp | 163 +++ gdb/testsuite/gdb.base/m32r.ld | 160 +++ gdb/testsuite/gdb.base/m32rovly.c | 225 ++++ gdb/testsuite/gdb.base/m68k-aout.u | 459 +++++++ gdb/testsuite/gdb.base/m68k-aout2.u | 2208 ++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/m68k-elf.u | 298 +++++ gdb/testsuite/gdb.base/maint.exp | 578 +++++++++ gdb/testsuite/gdb.base/mips-ecoff.u | 671 ++++++++++ gdb/testsuite/gdb.base/mips_pro.c | 35 + gdb/testsuite/gdb.base/mips_pro.exp | 62 + gdb/testsuite/gdb.base/miscexprs.c | 165 +++ gdb/testsuite/gdb.base/miscexprs.exp | 283 ++++ gdb/testsuite/gdb.base/nodebug.c | 58 + gdb/testsuite/gdb.base/nodebug.exp | 163 +++ gdb/testsuite/gdb.base/opaque.exp | 244 ++++ gdb/testsuite/gdb.base/opaque0.c | 20 + gdb/testsuite/gdb.base/opaque1.c | 18 + gdb/testsuite/gdb.base/overlays.c | 34 + gdb/testsuite/gdb.base/overlays.exp | 246 ++++ gdb/testsuite/gdb.base/ovlymgr.c | 225 ++++ gdb/testsuite/gdb.base/ovlymgr.h | 17 + gdb/testsuite/gdb.base/pointers.c | 176 +++ gdb/testsuite/gdb.base/pointers.exp | 358 ++++++ gdb/testsuite/gdb.base/pointers2.c | 51 + gdb/testsuite/gdb.base/pointers2.exp | 288 +++++ gdb/testsuite/gdb.base/printcmds.c | 101 ++ gdb/testsuite/gdb.base/printcmds.exp | 695 ++++++++++ gdb/testsuite/gdb.base/ptype.c | 313 +++++ gdb/testsuite/gdb.base/ptype.exp | 532 ++++++++ gdb/testsuite/gdb.base/radix.exp | 201 +++ gdb/testsuite/gdb.base/recurse.c | 25 + gdb/testsuite/gdb.base/recurse.exp | 145 +++ gdb/testsuite/gdb.base/regs.exp | 86 ++ gdb/testsuite/gdb.base/relational.exp | 481 +++++++ gdb/testsuite/gdb.base/reread.exp | 117 ++ gdb/testsuite/gdb.base/reread1.c | 26 + gdb/testsuite/gdb.base/reread2.c | 21 + gdb/testsuite/gdb.base/restore.c | 260 ++++ gdb/testsuite/gdb.base/restore.exp | 111 ++ gdb/testsuite/gdb.base/return.c | 35 + gdb/testsuite/gdb.base/return.exp | 124 ++ gdb/testsuite/gdb.base/run.c | 67 + gdb/testsuite/gdb.base/scope.exp | 610 +++++++++ gdb/testsuite/gdb.base/scope0.c | 176 +++ gdb/testsuite/gdb.base/scope1.c | 45 + gdb/testsuite/gdb.base/sect-cmd.exp | 109 ++ gdb/testsuite/gdb.base/setshow.c | 22 + gdb/testsuite/gdb.base/setshow.exp | 243 ++++ gdb/testsuite/gdb.base/setvar.c | 271 ++++ gdb/testsuite/gdb.base/setvar.exp | 420 ++++++ gdb/testsuite/gdb.base/shlib-call.exp | 258 ++++ gdb/testsuite/gdb.base/shmain.c | 47 + gdb/testsuite/gdb.base/shr1.c | 47 + gdb/testsuite/gdb.base/shr2.c | 11 + gdb/testsuite/gdb.base/sigall.c | 1383 ++++++++++++++++++++ gdb/testsuite/gdb.base/sigall.exp | 210 +++ gdb/testsuite/gdb.base/signals.c | 53 + gdb/testsuite/gdb.base/signals.exp | 628 +++++++++ gdb/testsuite/gdb.base/smoke.c | 40 + gdb/testsuite/gdb.base/smoke.cc | 480 +++++++ gdb/testsuite/gdb.base/smoke.exp | 181 +++ gdb/testsuite/gdb.base/so-impl-ld.c | 18 + gdb/testsuite/gdb.base/so-impl-ld.exp | 167 +++ gdb/testsuite/gdb.base/so-indr-cl.c | 23 + gdb/testsuite/gdb.base/so-indr-cl.exp | 146 +++ gdb/testsuite/gdb.base/solib.c | 59 + gdb/testsuite/gdb.base/solib.exp | 319 +++++ gdb/testsuite/gdb.base/solib1.c | 9 + gdb/testsuite/gdb.base/solib2.c | 9 + gdb/testsuite/gdb.base/sparc-aout.u | 732 +++++++++++ gdb/testsuite/gdb.base/sparc-elf.u | 336 +++++ gdb/testsuite/gdb.base/ss.h | 4 + gdb/testsuite/gdb.base/step-test.c | 58 + gdb/testsuite/gdb.base/step-test.exp | 153 +++ gdb/testsuite/gdb.base/structs2.c | 38 + gdb/testsuite/gdb.base/structs2.exp | 79 ++ gdb/testsuite/gdb.base/term.exp | 73 ++ gdb/testsuite/gdb.base/twice.c | 19 + gdb/testsuite/gdb.base/twice.exp | 63 + gdb/testsuite/gdb.base/varargs.c | 108 ++ gdb/testsuite/gdb.base/varargs.exp | 139 ++ gdb/testsuite/gdb.base/volatile.exp | 243 ++++ gdb/testsuite/gdb.base/watchpoint.c | 124 ++ gdb/testsuite/gdb.base/watchpoint.exp | 583 +++++++++ gdb/testsuite/gdb.base/whatis-exp.exp | 217 ++++ gdb/testsuite/gdb.base/whatis.c | 269 ++++ gdb/testsuite/gdb.base/whatis.exp | 393 ++++++ 166 files changed, 39608 insertions(+) create mode 100644 gdb/testsuite/gdb.base/Makefile.in create mode 100644 gdb/testsuite/gdb.base/README create mode 100644 gdb/testsuite/gdb.base/a1-selftest.exp create mode 100644 gdb/testsuite/gdb.base/a2-run.exp create mode 100644 gdb/testsuite/gdb.base/all-bin.exp create mode 100644 gdb/testsuite/gdb.base/all-types.c create mode 100644 gdb/testsuite/gdb.base/arithmet.exp create mode 100644 gdb/testsuite/gdb.base/assign.exp create mode 100644 gdb/testsuite/gdb.base/bar.c create mode 100644 gdb/testsuite/gdb.base/baz.c create mode 100644 gdb/testsuite/gdb.base/bitfields.c create mode 100644 gdb/testsuite/gdb.base/bitfields.exp create mode 100644 gdb/testsuite/gdb.base/bitops.exp create mode 100644 gdb/testsuite/gdb.base/branches.c create mode 100644 gdb/testsuite/gdb.base/break.c create mode 100644 gdb/testsuite/gdb.base/break.exp create mode 100644 gdb/testsuite/gdb.base/call-ar-st.c create mode 100644 gdb/testsuite/gdb.base/call-ar-st.exp create mode 100644 gdb/testsuite/gdb.base/call-rt-st.c create mode 100644 gdb/testsuite/gdb.base/call-rt-st.exp create mode 100644 gdb/testsuite/gdb.base/call-strs.c create mode 100644 gdb/testsuite/gdb.base/call-strs.exp create mode 100644 gdb/testsuite/gdb.base/callfuncs.c create mode 100644 gdb/testsuite/gdb.base/callfuncs.exp create mode 100644 gdb/testsuite/gdb.base/callfuncs2.c create mode 100644 gdb/testsuite/gdb.base/callfuncs2.exp create mode 100644 gdb/testsuite/gdb.base/commands.exp create mode 100644 gdb/testsuite/gdb.base/compiler.c create mode 100644 gdb/testsuite/gdb.base/completion.exp create mode 100644 gdb/testsuite/gdb.base/cond-expr.exp create mode 100644 gdb/testsuite/gdb.base/condbreak.c create mode 100644 gdb/testsuite/gdb.base/condbreak.exp create mode 100644 gdb/testsuite/gdb.base/configure create mode 100644 gdb/testsuite/gdb.base/configure.in create mode 100644 gdb/testsuite/gdb.base/constvars.c create mode 100644 gdb/testsuite/gdb.base/constvars.exp create mode 100644 gdb/testsuite/gdb.base/corefile.exp create mode 100644 gdb/testsuite/gdb.base/coremaker.c create mode 100644 gdb/testsuite/gdb.base/crossload.exp create mode 100644 gdb/testsuite/gdb.base/d10v.ld create mode 100644 gdb/testsuite/gdb.base/d10vovly.c create mode 100644 gdb/testsuite/gdb.base/default.exp create mode 100644 gdb/testsuite/gdb.base/define.exp create mode 100644 gdb/testsuite/gdb.base/display.c create mode 100644 gdb/testsuite/gdb.base/display.exp create mode 100644 gdb/testsuite/gdb.base/dollar.exp create mode 100644 gdb/testsuite/gdb.base/echo.exp create mode 100644 gdb/testsuite/gdb.base/ena-dis-br.exp create mode 100644 gdb/testsuite/gdb.base/ending-run.c create mode 100644 gdb/testsuite/gdb.base/ending-run.exp create mode 100644 gdb/testsuite/gdb.base/environ.exp create mode 100644 gdb/testsuite/gdb.base/eval-skip.exp create mode 100644 gdb/testsuite/gdb.base/exprs.c create mode 100644 gdb/testsuite/gdb.base/exprs.exp create mode 100644 gdb/testsuite/gdb.base/foo.c create mode 100644 gdb/testsuite/gdb.base/funcargs.c create mode 100644 gdb/testsuite/gdb.base/funcargs.exp create mode 100644 gdb/testsuite/gdb.base/gdbvars.exp create mode 100644 gdb/testsuite/gdb.base/grbx.c create mode 100644 gdb/testsuite/gdb.base/help.exp create mode 100644 gdb/testsuite/gdb.base/i486-elf.u create mode 100644 gdb/testsuite/gdb.base/i860-elf.u create mode 100644 gdb/testsuite/gdb.base/int-type.c create mode 100644 gdb/testsuite/gdb.base/interrupt.c create mode 100644 gdb/testsuite/gdb.base/interrupt.exp create mode 100644 gdb/testsuite/gdb.base/jump.c create mode 100644 gdb/testsuite/gdb.base/jump.exp create mode 100644 gdb/testsuite/gdb.base/langs.exp create mode 100644 gdb/testsuite/gdb.base/langs0.c create mode 100644 gdb/testsuite/gdb.base/langs1.c create mode 100644 gdb/testsuite/gdb.base/langs1.f create mode 100644 gdb/testsuite/gdb.base/langs2.c create mode 100644 gdb/testsuite/gdb.base/langs2.cxx create mode 100644 gdb/testsuite/gdb.base/list.exp create mode 100644 gdb/testsuite/gdb.base/list0.c create mode 100644 gdb/testsuite/gdb.base/list0.h create mode 100644 gdb/testsuite/gdb.base/list1.c create mode 100644 gdb/testsuite/gdb.base/logical.exp create mode 100644 gdb/testsuite/gdb.base/long_long.c create mode 100644 gdb/testsuite/gdb.base/long_long.exp create mode 100644 gdb/testsuite/gdb.base/m32r.ld create mode 100644 gdb/testsuite/gdb.base/m32rovly.c create mode 100644 gdb/testsuite/gdb.base/m68k-aout.u create mode 100644 gdb/testsuite/gdb.base/m68k-aout2.u create mode 100644 gdb/testsuite/gdb.base/m68k-elf.u create mode 100644 gdb/testsuite/gdb.base/maint.exp create mode 100644 gdb/testsuite/gdb.base/mips-ecoff.u create mode 100644 gdb/testsuite/gdb.base/mips_pro.c create mode 100644 gdb/testsuite/gdb.base/mips_pro.exp create mode 100644 gdb/testsuite/gdb.base/miscexprs.c create mode 100644 gdb/testsuite/gdb.base/miscexprs.exp create mode 100644 gdb/testsuite/gdb.base/nodebug.c create mode 100644 gdb/testsuite/gdb.base/nodebug.exp create mode 100644 gdb/testsuite/gdb.base/opaque.exp create mode 100644 gdb/testsuite/gdb.base/opaque0.c create mode 100644 gdb/testsuite/gdb.base/opaque1.c create mode 100644 gdb/testsuite/gdb.base/overlays.c create mode 100644 gdb/testsuite/gdb.base/overlays.exp create mode 100644 gdb/testsuite/gdb.base/ovlymgr.c create mode 100644 gdb/testsuite/gdb.base/ovlymgr.h create mode 100644 gdb/testsuite/gdb.base/pointers.c create mode 100644 gdb/testsuite/gdb.base/pointers.exp create mode 100644 gdb/testsuite/gdb.base/pointers2.c create mode 100644 gdb/testsuite/gdb.base/pointers2.exp create mode 100644 gdb/testsuite/gdb.base/printcmds.c create mode 100644 gdb/testsuite/gdb.base/printcmds.exp create mode 100644 gdb/testsuite/gdb.base/ptype.c create mode 100644 gdb/testsuite/gdb.base/ptype.exp create mode 100644 gdb/testsuite/gdb.base/radix.exp create mode 100644 gdb/testsuite/gdb.base/recurse.c create mode 100644 gdb/testsuite/gdb.base/recurse.exp create mode 100644 gdb/testsuite/gdb.base/regs.exp create mode 100644 gdb/testsuite/gdb.base/relational.exp create mode 100644 gdb/testsuite/gdb.base/reread.exp create mode 100644 gdb/testsuite/gdb.base/reread1.c create mode 100644 gdb/testsuite/gdb.base/reread2.c create mode 100644 gdb/testsuite/gdb.base/restore.c create mode 100644 gdb/testsuite/gdb.base/restore.exp create mode 100644 gdb/testsuite/gdb.base/return.c create mode 100644 gdb/testsuite/gdb.base/return.exp create mode 100644 gdb/testsuite/gdb.base/run.c create mode 100644 gdb/testsuite/gdb.base/scope.exp create mode 100644 gdb/testsuite/gdb.base/scope0.c create mode 100644 gdb/testsuite/gdb.base/scope1.c create mode 100644 gdb/testsuite/gdb.base/sect-cmd.exp create mode 100644 gdb/testsuite/gdb.base/setshow.c create mode 100644 gdb/testsuite/gdb.base/setshow.exp create mode 100644 gdb/testsuite/gdb.base/setvar.c create mode 100644 gdb/testsuite/gdb.base/setvar.exp create mode 100644 gdb/testsuite/gdb.base/shlib-call.exp create mode 100644 gdb/testsuite/gdb.base/shmain.c create mode 100644 gdb/testsuite/gdb.base/shr1.c create mode 100644 gdb/testsuite/gdb.base/shr2.c create mode 100644 gdb/testsuite/gdb.base/sigall.c create mode 100644 gdb/testsuite/gdb.base/sigall.exp create mode 100644 gdb/testsuite/gdb.base/signals.c create mode 100644 gdb/testsuite/gdb.base/signals.exp create mode 100644 gdb/testsuite/gdb.base/smoke.c create mode 100644 gdb/testsuite/gdb.base/smoke.cc create mode 100644 gdb/testsuite/gdb.base/smoke.exp create mode 100644 gdb/testsuite/gdb.base/so-impl-ld.c create mode 100644 gdb/testsuite/gdb.base/so-impl-ld.exp create mode 100644 gdb/testsuite/gdb.base/so-indr-cl.c create mode 100644 gdb/testsuite/gdb.base/so-indr-cl.exp create mode 100644 gdb/testsuite/gdb.base/solib.c create mode 100644 gdb/testsuite/gdb.base/solib.exp create mode 100644 gdb/testsuite/gdb.base/solib1.c create mode 100644 gdb/testsuite/gdb.base/solib2.c create mode 100644 gdb/testsuite/gdb.base/sparc-aout.u create mode 100644 gdb/testsuite/gdb.base/sparc-elf.u create mode 100644 gdb/testsuite/gdb.base/ss.h create mode 100644 gdb/testsuite/gdb.base/step-test.c create mode 100644 gdb/testsuite/gdb.base/step-test.exp create mode 100644 gdb/testsuite/gdb.base/structs2.c create mode 100644 gdb/testsuite/gdb.base/structs2.exp create mode 100644 gdb/testsuite/gdb.base/term.exp create mode 100644 gdb/testsuite/gdb.base/twice.c create mode 100644 gdb/testsuite/gdb.base/twice.exp create mode 100644 gdb/testsuite/gdb.base/varargs.c create mode 100644 gdb/testsuite/gdb.base/varargs.exp create mode 100644 gdb/testsuite/gdb.base/volatile.exp create mode 100644 gdb/testsuite/gdb.base/watchpoint.c create mode 100644 gdb/testsuite/gdb.base/watchpoint.exp create mode 100644 gdb/testsuite/gdb.base/whatis-exp.exp create mode 100644 gdb/testsuite/gdb.base/whatis.c create mode 100644 gdb/testsuite/gdb.base/whatis.exp (limited to 'gdb/testsuite/gdb.base') diff --git a/gdb/testsuite/gdb.base/Makefile.in b/gdb/testsuite/gdb.base/Makefile.in new file mode 100644 index 00000000000..a5d637438bd --- /dev/null +++ b/gdb/testsuite/gdb.base/Makefile.in @@ -0,0 +1,46 @@ +VPATH = @srcdir@ +srcdir = @srcdir@ + +EXECUTABLES = all-types bitfields break \ + call-ar-st call-rt-st call-strs callfuncs callfuncs2 commands \ + compiler condbreak constvars coremaker display \ + ending-run exprs funcargs int-type interrupt \ + jump langs \ + list long_long \ + mips_pro miscexprs nodebug opaque pointers pointers2 printcmds ptype \ + recurse reread reread1 restore return run \ + scope section_command setshow setvar \ + shmain sigall signals smoke \ + solib so-impl-ld so-indr-cl \ + step-test structs structs2 twice-tmp varargs watchpoint whatis + +# uuencoded format to avoid SCCS/RCS problems with binary files. +CROSS_EXECUTABLES = i486-elf i860-elf m68k-elf m68k-aout m68k-aout2 \ + mips-ecoff sparc-aout sparc-elf + +MISCELLANEOUS = coremmap.data shr1.sl shr2.sl solib1.sl solib2.sl + +all: + @echo "Nothing to be done for all..." + +info: +install-info: +dvi: +install: +uninstall: force +installcheck: +check: + +clean mostlyclean: + -rm -f *~ *.o a.out xgdb *.x $(CROSS_EXECUTABLES) *.ci *.tmp + -rm -f core core.coremaker coremaker.core corefile $(EXECUTABLES) + -rm -f $(MISCELLANEOUS) twice-tmp.c + +distclean maintainer-clean realclean: clean + -rm -f *~ core + -rm -f Makefile config.status config.log + -rm -f *-init.exp + -rm -fr *.log summary detail *.plog *.sum *.psum site.* + +Makefile : $(srcdir)/Makefile.in $(srcdir)/configure.in + $(SHELL) ./config.status --recheck diff --git a/gdb/testsuite/gdb.base/README b/gdb/testsuite/gdb.base/README new file mode 100644 index 00000000000..556fc755bf2 --- /dev/null +++ b/gdb/testsuite/gdb.base/README @@ -0,0 +1,13 @@ +Information about the various executables found in this test: + + BFD CPU Objfile +Executable Target Type Type Info about compilation machine +---------- ------ ---- ------- ------------------------------- +i486-elf elf-little i486 ELF NCR 3000, /usr/ccs/ATT/cc +i860-elf elf-big i860 ELF Stratus +m68k-elf elf-big m68k ELF Amiga 3000 UX, /usr/ccs/bin/cc +m68k-aout a.out-newsos3 m68k a.out Sony NEWS +m68k-aout2 a.out-sunos-big m68k a.out SunOS 4.1, gcc cygnus-2.0.1 +sparc-aout a.out-sunos-big sparc a.out Sun 4, SunOS 4.1.1, gcc 2.1 +sparc-elf elf-big sparc ELF Sun 4, Solaris 1.0, gcc 2.0.2 +mips-ecoff ecoff-bigmips mips ecoff IRIX 4.0.1 diff --git a/gdb/testsuite/gdb.base/a1-selftest.exp b/gdb/testsuite/gdb.base/a1-selftest.exp new file mode 100644 index 00000000000..bc3893a0ccc --- /dev/null +++ b/gdb/testsuite/gdb.base/a1-selftest.exp @@ -0,0 +1,426 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1994, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +# are we on a target board +if [is_remote target] { + return +} + +if [istarget "m68k*-*-hpux*"] then { + # The top-level makefile passes CFLAGS= (no -g) for hp300. This probably + # should be fixed (it is only needed for gcc bootstrapping, not gdb), + # but until then..... + setup_xfail "*-*-*" + fail "cannot test self if compiled without debug info" + return -1 +} + +# Not all of the lines of code near the start of main are executed for +# every machine. Also, optimization may reorder some of the lines. +# So all we do is try to step or next over everything until we get +# to a line that we know is always executed. + +proc do_steps_and_nexts {} { + global gdb_prompt + global srcdir + + gdb_reinitialize_dir $srcdir/.. + + for {set count 0} {$count < 20} {incr count} { + send_gdb "list\n" + gdb_expect { + -re ".*symarg = NULL.*$gdb_prompt $" { + set description "step over symarg initialization" + set command "step" + } + -re ".*execarg = NULL.*$gdb_prompt $" { + set description "step over execarg initialization" + set command "step" + } + -re ".*corearg = NULL.*$gdb_prompt $" { + set description "step over corearg initialization" + set command "step" + } + -re ".*cdarg = NULL.*$gdb_prompt $" { + set description "step over cdarg initialization" + set command "step" + } + -re ".*ttyarg = NULL.*$gdb_prompt $" { + set description "step over ttyarg initialization" + set command "step" + } + -re ".*time_at_startup = get_run_time.*$gdb_prompt $" { + set description "next over get_run_time and everything it calls" + set command "next" + } + -re ".*START_PROGRESS.*$gdb_prompt $" { + set description "next over START_PROGRESS and everything it calls" + set command "next" + } + -re ".*mac_init.*$gdb_prompt $" { + set description "next over mac_init and everything it calls" + set command "next" + } + -re ".*init_malloc.*$gdb_prompt $" { + set description "next over init_malloc and everything it calls" + set command "next" + } + -re ".*count . 0x3.*$gdb_prompt $" { + set description "next over conditional stack alignment code 1" + set command "next" + } + -re ".*if .i != 0.*$gdb_prompt $" { + set description "next over conditional stack alignment code 2" + set command "next" + } + -re ".*alloca .i - 4.*$gdb_prompt $" { + set description "next over conditional stack alignment alloca" + set command "next" + } + -re ".*SET_TOP_LEVEL.*$gdb_prompt $" { + set description "next over SET_TOP_LEVEL call" + set command "next" + } + -re ".*cmdsize = 1.*$gdb_prompt $" { + set description "step over cmdsize initialization" + set command "next" + } + -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" { + set description "next over cmdarg initialization via xmalloc" + set command "next" + } + -re ".*ncmd = 0.*$gdb_prompt $" { + set description "next over ncmd initialization" + set command "next" + } + -re ".*dirsize = 1.*$gdb_prompt $" { + set description "next over dirsize initialization" + set command "next" + } + -re ".*dirarg = .* xmalloc.*$gdb_prompt $" { + return + } + -re "\[ \t\]+\{\r\n$gdb_prompt $" { + setup_xfail "mips-*-irix5*" + fail "$description ended up at odd location" + } + -re ".*main.c.*No such file or directory.*$gdb_prompt $" { + setup_xfail "rs6000-*-aix3*" + fail "must be able to list source lines" + return + } + -re ".*$gdb_prompt $" { + fail "unknown source line after $description" + return + } + default { + fail "unknown source line near main" + return + } + } + send_gdb "$command\n" + gdb_expect { + -re ".*No such file or directory.\r\n$gdb_prompt $" { + fail "$description (no source available)" + } + -re ".*A file or directory .* does not exist..\r\n$gdb_prompt $" { + fail "$description (no source available)" + } + -re ".*$gdb_prompt $" { + pass "$description" + } + timeout { + fail "$description (timeout)" + } + } + } +} + +proc test_with_self { executable } { + global gdb_prompt + global tool + global det_file + global decimal + global timeout + + # load yourself into the debugger + # This can take a relatively long time, particularly for testing where + # the executable is being accessed over a network, or where gdb does not + # support partial symbols for a particular target and has to load the + # entire symbol table. Set the timeout to 10 minutes, which should be + # adequate for most environments (it *has* timed out with 5 min on a + # SPARCstation SLC under moderate load, so this isn't unreasonable). + # After gdb is started, set the timeout to 30 seconds for the duration + # of this test, and then back to the original value. + + set oldtimeout $timeout + set timeout 600 + verbose "Timeout is now $timeout seconds" 2 + if {[gdb_load $executable] <0} then { + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + return -1 + } + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + + # disassemble yourself + gdb_test "x/10i main" \ + "x/10i.*main.*main.$decimal.*main.$decimal.*" \ + "Disassemble main" + + # Set a breakpoint at main + gdb_test "break main" \ + "Breakpoint.*at.* file.*, line.*" \ + "breakpoint in main" + + # We'll need this when we send a ^C to GDB. Need to do it before we + # run the program and gdb starts saving and restoring tty states. + # On Ultrix, we don't need it and it is really slow (because shell_escape + # doesn't use vfork). + if ![istarget "*-*-ultrix*"] then { + gdb_test "shell stty intr '^C'" "" \ + "set interrupt character in test_with_self" + } + + # FIXME: If we put this after the run to main, the first list + # command doesn't print the same line as the current line where + # gdb is stopped. + gdb_test "set listsize 1" "" "set listsize to 1" + + # run yourself + # It may take a very long time for the inferior gdb to start (lynx), + # so we bump it back up for the duration of this command. + set timeout 600 + + set description "run until breakpoint at main" + send_gdb "run -nw\n" + gdb_expect { + -re "Starting program.*Breakpoint \[0-9\]+,.*main .argc.*argv.* at .*main.c:.*$gdb_prompt $" { + pass "$description" + } + -re "Starting program.*Breakpoint \[0-9\]+,.*main .argc.*argv.*$gdb_prompt $" { + xfail "$description (line numbers scrambled?)" + } + -re "vfork: No more processes.*$gdb_prompt $" { + fail "$description (out of virtual memory)" + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + return -1 + } + -re ".*$gdb_prompt $" { + fail "$description" + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + return -1 + } + timeout { + fail "$description (timeout)" + } + } + + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + + # do we have a version number ? + send_gdb "print version\n" + gdb_expect { + -re ".\[0-9\]+ = +0x.*\[0-9.\]+.*$gdb_prompt $" { + pass "printed version" + } + -re ".\[0-9\]+ = +.+ +0x.*\[0-9.\]+.*$gdb_prompt $" { + pass "printed version with cast" + } + -re ".*$gdb_prompt $" { fail "printed version" } + timeout { fail "(timeout) printed version" } + } + + do_steps_and_nexts + + gdb_test "print \"foo\"" ".\[0-9\]+ = \"foo\"" "print a string" + + # do_steps_and_nexts left us ready to execute an xmalloc call, + # so give that a try. + # If we don't actually enter the xmalloc call when we give a + # step command that seems like a genuine bug. It seems to happen + # on most RISC processors. + setup_xfail "alpha-*-*" "hppa*-*-*" "mips-*-*" + set description "step into xmalloc call" + send_gdb "step\n" + gdb_expect { + -re "xmalloc.*size=.*at.*utils.c.*$gdb_prompt $" { + pass "$description" + } + -re ".*No such file or directory.\r\n$gdb_prompt $" { + pass "$description (no source available)" + } + -re "A file or directory .* does not exist..\r\n$gdb_prompt $" { + pass "$description (no source available)" + } + -re ".*$gdb_prompt $" { + fail "$description" + } + timeout { + fail "$description (timeout)" + } + } + + # start the "xgdb" process + send_gdb "continue\n" + gdb_expect { + -re "GNU gdb \[0-9\.\]*.* +Copyright \[0-9\]* Free Software Foundation, Inc.* +GDB is free software, covered by the GNU General Public License, and you are.* +welcome to change it and/or distribute copies of it under certain conditions.* +Type \"show copying\" to see the conditions.* +There is absolutely no warranty for GDB. Type \"show warranty\" for details.* +This GDB was configured as .*$gdb_prompt $"\ + { pass "xgdb is at prompt" } + -re "GDB is free software and you are welcome to distribute copies of it.* + under certain conditions; type \"show copying\" to see the conditions..* +There is absolutely no warranty for GDB; type \"show warranty\" for details..* +GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\ + { pass "xgdb is at prompt (obsolescent gdb)" } + -re ".*$gdb_prompt $" { fail "xgdb is at prompt" } + timeout { fail "(timeout) xgdb is at prompt" } + } + + # set xgdb prompt so we can tell which is which + send_gdb "set prompt (xgdb) \n" + gdb_expect { + -re "\[(\]xgdb\[)\].*\[(\]xgdb\[)\] $" { pass "Set xgdb prompt" } + -re ".*$gdb_prompt $" { fail "Set xgdb prompt" } + default { fail "(timeout) Set xgdb prompt" } + } + + # kill the xgdb process + set description "send ^C to child process" + send_gdb "\003" + gdb_expect { + -re "Program received signal SIGINT.*$gdb_prompt $" { + pass "$description" + } + -re ".*$gdb_prompt $" { + fail "$description" + } + timeout { + fail "$description (timeout)" + } + } + + set description "send SIGINT signal to child process" + send_gdb "signal SIGINT\n" + gdb_expect { + -re "Continuing with signal SIGINT.*$gdb_prompt $" { + pass "$description" + } + -re ".*$gdb_prompt $" { + fail "$description" + } + timeout { + fail "$description (timeout)" + } + } + + # get a stack trace + # + # This fails on some linux systems for unknown reasons. On the + # systems where it fails, sometimes it works fine when run manually. + # The testsuite failures may not be limited to just aout systems. + setup_xfail "i*86-pc-linuxaout-gnu" "hppa*-*-hpux*" + set description "backtrace through signal handler" + send_gdb "backtrace\n" + gdb_expect { + -re "#0.*read.*in main \\(.*\\) at .*main\\.c.*$gdb_prompt $" { + pass "$description" + } + -re ".*$gdb_prompt $" { + # On the alpha, we hit the infamous problem about gdb + # being unable to get the frame pointer (mentioned in + # gdb/README). As it is intermittent, there is no way to + # XFAIL it which will give us an XPASS if the problem goes + # away. + setup_xfail "alpha*-*-osf*" + fail "$description" + } + timeout { + fail "$description (timeout)" + } + } + + + # Set the timeout back to the value it had when we were called. + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + + # Restart gdb in case next test expects it to be started already. + return 0 +} + +# Find a pathname to a file that we would execute if the shell was asked +# to run $arg using the current PATH. + +proc find_gdb { arg } { + + # If the arg directly specifies an existing executable file, then + # simply use it. + + if [file executable $arg] then { + return $arg + } + + set result [which $arg] + if [string match "/" [ string range $result 0 0 ]] then { + return $result + } + + # If everything fails, just return the unqualified pathname as default + # and hope for best. + + return $arg +} + +# Run the test with self. +# Copy the file executable file in case this OS doesn't like to edit its own +# text space. + +set GDB_FULLPATH [find_gdb $GDB] + +# Remove any old copy lying around. +remote_file host delete x$tool + +gdb_start +set file [remote_download host $GDB_FULLPATH x$tool] +set result [test_with_self $file]; +gdb_exit; +catch "remote_file host delete $file"; + +if {$result <0} then { + warning "Couldn't test self" + return -1 +} diff --git a/gdb/testsuite/gdb.base/a2-run.exp b/gdb/testsuite/gdb.base/a2-run.exp new file mode 100644 index 00000000000..87a0edf293d --- /dev/null +++ b/gdb/testsuite/gdb.base/a2-run.exp @@ -0,0 +1,253 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1994, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +# These tests don't work for targets can't take arguments... + +if [target_info exists noargs] then { + verbose "Skipping a2-run.exp because of noargs." + return +} + +if [target_info exists gdb,noinferiorio] { + verbose "Skipping a2-run.exp because of noinferiorio." + return +} + +if $tracelevel then { + strace $tracelevel +} + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "run" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# Run with no arguments. +# On VxWorks this justs make sure the program was run. +gdb_run_cmd + +if [istarget "*-*-vxworks*"] then { + set timeout 120 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect { + "Program exited normally" { + unresolved "run \"$testfile\" with no args" + } + -re "usage: factorial " { + pass "run \"$testfile\" with no args" + } + timeout { + fail "(timeout) run \"$testfile\" with no args" + } + } + set timeout 10 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect -re "$gdb_prompt $" {} +} else { + gdb_expect { + -re ".*usage: factorial .*Program exited with code 01.*$gdb_prompt $" { + pass "run \"$testfile\" with no args" + } + -re ".*$gdb_prompt $" { + fail "run \"$testfile\" with no args" + verbose "expect_out is $expect_out(buffer)" 2 + } + timeout { + fail "(timeout) run \"$testfile\" no args" + } + } +} +# Now run with some arguments +if [istarget "*-*-vxworks*"] then { + send_gdb "run vxmain \"5\"\n" + gdb_expect -re "run vxmain \"5\"\r\n" {} + set timeout 120 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect { + "Program exited normally" { + unresolved "run \"$testfile\" with arg" + } + "120" { + pass "run \"$testfile\" with arg" + } + timeout { + fail "(timeout) run \"$testfile\" with arg" + } + } + set timeout 10 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect -re "$gdb_prompt $" {} +} else { + setup_xfail "mips-idt-*" "arm-*-coff" + gdb_run_cmd 5 + gdb_expect { + -re ".*120.*$gdb_prompt $"\ + { pass "run \"$testfile\" with arg" } + -re ".*$gdb_prompt $" { fail "run \"$testfile\" with arg" } + timeout { fail "(timeout) run \"$testfile\" with arg" } + } +} + +# Run again with same arguments. +setup_xfail "mips-idt-*" +gdb_run_cmd + +if [istarget "*-*-vxworks*"] then { + set timeout 120 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect { + "Program exited normally" { + unresolved "run \"$testfile\" again with same args" + } + "120" { pass "run \"$testfile\" again with same args" } + timeout { fail "(timeout) run \"$testfile\" again with same args" } + } + set timeout 10 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect -re "$gdb_prompt $" {} +} else { + setup_xfail "arm-*-coff" + gdb_expect { + -re ".*120.*$gdb_prompt $"\ + { pass "run \"$testfile\" again with same args" } + -re ".*$gdb_prompt $" { fail "run \"$testfile\" again with same args" } + timeout { fail "(timeout) run \"$testfile\" again with same args" } + } +} + +# Use "set args" command to specify no arguments as default and run again. +if [istarget "*-*-vxworks*"] then { + send_gdb "set args main\n" +} else { + send_gdb "set args\n" +} +gdb_expect -re "$gdb_prompt $" + +gdb_run_cmd + +if [istarget "*-*-vxworks*"] then { + set timeout 120 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect { + "Program exited normally" { + unresolved "run after setting args to nil" + } + "usage: factorial " { + pass "run after setting args to nil" + } + timeout { + fail "(timeout) run after setting args to nil" + } + } + set timeout 10 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect -re "$gdb_prompt $" {} +} else { + gdb_expect { + -re ".*usage: factorial .*$gdb_prompt $" { + pass "run after setting args to nil" + } + -re ".*$gdb_prompt $" { + fail "run after setting args to nil" + } + timeout { + fail "(timeout) run after setting args to nil" + } + } +} + +# Use "set args" command to specify an argument and run again. +setup_xfail "mips-idt-*" +if [istarget "*-*-vxworks*"] then { + send_gdb "set args vxmain \"6\"\n" +} else { + send_gdb "set args 6\n" +} +gdb_expect -re "$gdb_prompt $" +gdb_run_cmd + +if [istarget "*-*-vxworks*"] then { + set timeout 120 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect { + "Program exited normally" { + unresolved "run \"$testfile\" again after setting args" + } + "720" { + pass "run \"$testfile\" again after setting args" + } + timeout { + fail "(timeout) run \"$testfile\" again after setting args" + } + } + set timeout 10 + verbose "Timeout is now $timeout seconds" 2 + gdb_expect -re "$gdb_prompt $" {} +} else { + setup_xfail "arm-*-coff" + gdb_expect { + -re ".*720.*$gdb_prompt $" { + pass "run \"$testfile\" again after setting args" + } + -re ".*$gdb_prompt $" { + fail "run \"$testfile\" again after setting args" + } + timeout { + fail "(timeout) run \"$testfile\" again after setting args" + } + } +} + +# GOAL: Test that shell is being used with "run". For remote debugging +# targets, there is no guarantee that a "shell" (whatever that is) is used. +if [isnative] then { + send_gdb "run `echo 8`\n" + gdb_expect { + -re "Starting program.*40320.*$gdb_prompt $" { + pass "run \"$testfile\" with shell" + } + -re ".*$gdb_prompt $" { + fail "run \"$testfile\" with shell" + } + timeout { + fail "(timeout) run \"$testfile\" with shell" + } + } +} + +# Reset the default arguments for VxWorks +if [istarget "*-*-vxworks*"] then { + send_gdb "set args main\n" + gdb_expect -re ".*$gdb_prompt $" {} +} diff --git a/gdb/testsuite/gdb.base/all-bin.exp b/gdb/testsuite/gdb.base/all-bin.exp new file mode 100644 index 00000000000..4d6662b2581 --- /dev/null +++ b/gdb/testsuite/gdb.base/all-bin.exp @@ -0,0 +1,467 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite +# +# tests for arithmetic, logical and relational operators +# with mixed types +# + + + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "all-types" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +gdb_test "next" "return 0;" "continuing after dummy()" + +send_gdb "print v_int+v_char\n" +gdb_expect { + -re ".*71.*$gdb_prompt $" { + pass "print value of v_int+v_char" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_char" } + timeout { fail "(timeout) print value of v_int+v_char" } + } + +send_gdb "print v_int+v_short\n" +gdb_expect { + -re ".*9.*$gdb_prompt $" { + pass "print value of v_int+v_short" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_short" } + timeout { fail "(timeout) print value of v_int+v_short" } + } + + +send_gdb "print v_int+v_signed_char\n" +gdb_expect { + -re ".*72.*$gdb_prompt $" { + pass "print value of v_int+v_signed_char" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_signed_char" } + timeout { fail "(timeout) print value of v_int+v_signed_char" } + } + + +send_gdb "print v_int+v_unsigned_char\n" +gdb_expect { + -re ".*73.*$gdb_prompt $" { + pass "print value of v_int+v_unsigned_char" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_unsigned_char" } + timeout { fail "(timeout) print value of v_int+v_unsigned_char" } + } + + +send_gdb "print v_int+v_signed_short\n" +gdb_expect { + -re ".*10.*$gdb_prompt $" { + pass "print value of v_int+v_signed_short" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_signed_short" } + timeout { fail "(timeout) print value of v_int+v_signed_short" } + } + + +send_gdb "print v_int+v_unsigned_short\n" +gdb_expect { + -re ".*11.*$gdb_prompt $" { + pass "print value of v_int+v_unsigned_short" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_unsigned_short" } + timeout { fail "(timeout) print value of v_int+v_unsigned_short" } + } + + +send_gdb "print v_int+v_signed_int\n" +gdb_expect { + -re ".*13.*$gdb_prompt $" { + pass "print value of v_int+v_signed_int" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_signed_int" } + timeout { fail "(timeout) print value of v_int+v_signed_int" } + } + + +send_gdb "print v_int+v_unsigned_int\n" +gdb_expect { + -re ".*14.*$gdb_prompt $" { + pass "print value of v_int+v_unsigned_int" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_unsigned_int" } + timeout { fail "(timeout) print value of v_int+v_unsigned_int" } + } + + +send_gdb "print v_int+v_long\n" +gdb_expect { + -re ".*15.*$gdb_prompt $" { + pass "print value of v_int+v_long" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_long" } + timeout { fail "(timeout) print value of v_int+v_long" } + } + + +send_gdb "print v_int+v_signed_long\n" +gdb_expect { + -re ".*16.*$gdb_prompt $" { + pass "print value of v_int+v_signed_long" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_signed_long" } + timeout { fail "(timeout) print value of v_int+v_signed_long" } + } + + +send_gdb "print v_int+v_unsigned_long\n" +gdb_expect { + -re ".*17.*$gdb_prompt $" { + pass "print value of v_int+v_unsigned_long" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_unsigned_long" } + timeout { fail "(timeout) print value of v_int+v_unsigned_long" } + } + + +send_gdb "print v_int+v_float\n" +gdb_expect { + -re ".*106.34343.*$gdb_prompt $" { + pass "print value of v_int+v_float" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_float" } + timeout { fail "(timeout) print value of v_int+v_float" } + } + + +send_gdb "print v_int+v_double\n" +gdb_expect { + -re ".*206.56565.*$gdb_prompt $" { + pass "print value of v_int+v_double" + } + -re ".*$gdb_prompt $" { fail "print value of v_int+v_double" } + timeout { fail "(timeout) print value of v_int+" } + } + + +# +# test the relational operators with mixed types +# + +send_gdb "print v_int <= v_char\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_char" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_char" } + timeout { fail "(timeout) print value of v_int<=v_char" } + } + +send_gdb "print v_int <= v_short\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of v_int<=v_short" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_short" } + timeout { fail "(timeout) print value of v_int<=v_short" } + } + + +send_gdb "print v_int <= v_signed_char\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_signed_char" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_signed_char" } + timeout { fail "(timeout) print value of v_int<=v_signed_char" } + } + + +send_gdb "print v_int <= v_unsigned_char\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_unsigned_char" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_unsigned_char" } + timeout { fail "(timeout) print value of v_int<=v_unsigned_char" } + } + + +send_gdb "print v_int <= v_signed_short\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of v_int<=v_signed_short" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_signed_short" } + timeout { fail "(timeout) print value of v_int<=v_signed_short" } + } + + +send_gdb "print v_int <= v_unsigned_short\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of v_int<=v_unsigned_short" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_unsigned_short" } + timeout { fail "(timeout) print value of v_int<=v_unsigned_short" } + } + + +send_gdb "print v_int <= v_signed_int\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_signed_int" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_signed_int" } + timeout { fail "(timeout) print value of v_int<=v_signed_int" } + } + + +send_gdb "print v_int <= v_unsigned_int\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_unsigned_int" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_unsigned_int" } + timeout { fail "(timeout) print value of v_int<=v_unsigned_int" } + } + + +send_gdb "print v_int <= v_long\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_long" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_long" } + timeout { fail "(timeout) print value of v_int<=v_long" } + } + + +send_gdb "print v_int <= v_signed_long\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_signed_long" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_signed_long" } + timeout { fail "(timeout) print value of v_int<=v_signed_long" } + } + + +send_gdb "print v_int <= v_unsigned_long\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_unsigned_long" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_unsigned_long" } + timeout { fail "(timeout) print value of v_int<=v_unsigned_long" } + } + + +send_gdb "print v_int <= v_float\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_float" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_float" } + timeout { fail "(timeout) print value of v_int<=v_float" } + } + + +send_gdb "print v_int <= v_double\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int<=v_double" + } + -re ".*$gdb_prompt $" { fail "print value of v_int<=v_double" } + timeout { fail "(timeout) print value of v_int<=v_double" } + } + + + +# +# test the logical operators with mixed types +# + +gdb_test "set variable v_char=0" "" "set v_char=0" +gdb_test "set variable v_double=0.0" "" "set v_double=0" +gdb_test "set variable v_unsigned_long=0" "" "set v_unsigned_long=0" + +send_gdb "print v_int && v_char\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of v_int&&v_char" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_char" } + timeout { fail "(timeout) print value of v_int&&v_char" } + } + +send_gdb "print v_int && v_short\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_short" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_short" } + timeout { fail "(timeout) print value of v_int&&v_short" } + } + + +send_gdb "print v_int && v_signed_char\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_signed_char" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_signed_char" } + timeout { fail "(timeout) print value of v_int&&v_signed_char" } + } + + +send_gdb "print v_int && v_unsigned_char\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_unsigned_char" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_unsigned_char" } + timeout { fail "(timeout) print value of v_int&&v_unsigned_char" } + } + + +send_gdb "print v_int && v_signed_short\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_signed_short" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_signed_short" } + timeout { fail "(timeout) print value of v_int&&v_signed_short" } + } + + +send_gdb "print v_int && v_unsigned_short\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_unsigned_short" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_unsigned_short" } + timeout { fail "(timeout) print value of v_int&&v_unsigned_short" } + } + + +send_gdb "print v_int && v_signed_int\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_signed_int" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_signed_int" } + timeout { fail "(timeout) print value of v_int&&v_signed_int" } + } + + +send_gdb "print v_int && v_unsigned_int\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_unsigned_int" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_unsigned_int" } + timeout { fail "(timeout) print value of v_int&&v_unsigned_int" } + } + + +send_gdb "print v_int && v_long\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_long" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_long" } + timeout { fail "(timeout) print value of v_int&&v_long" } + } + + +send_gdb "print v_int && v_signed_long\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_signed_long" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_signed_long" } + timeout { fail "(timeout) print value of v_int&&v_signed_long" } + } + + +send_gdb "print v_int && v_unsigned_long\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of v_int&&v_unsigned_long" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_unsigned_long" } + timeout { fail "(timeout) print value of v_int&&v_unsigned_long" } + } + + +send_gdb "print v_int && v_float\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of v_int&&v_float" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_float" } + timeout { fail "(timeout) print value of v_int&&v_float" } + } + + +send_gdb "print v_int && v_double\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of v_int&&v_double" + } + -re ".*$gdb_prompt $" { fail "print value of v_int&&v_double" } + timeout { fail "(timeout) print value of v_int&&v_double" } + } + + + + + diff --git a/gdb/testsuite/gdb.base/all-types.c b/gdb/testsuite/gdb.base/all-types.c new file mode 100644 index 00000000000..2f3a31f739b --- /dev/null +++ b/gdb/testsuite/gdb.base/all-types.c @@ -0,0 +1,62 @@ +/* + * the basic C types. + */ + +#if !defined (__STDC__) && !defined (_AIX) +#define signed /**/ +#endif + +char v_char; +signed char v_signed_char; +unsigned char v_unsigned_char; + +short v_short; +signed short v_signed_short; +unsigned short v_unsigned_short; + +int v_int; +signed int v_signed_int; +unsigned int v_unsigned_int; + +long v_long; +signed long v_signed_long; +unsigned long v_unsigned_long; + +float v_float; +double v_double; + +int main () +{ + extern void dummy(); +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + dummy(); + return 0; + +} + +void dummy() +{ + /* Some linkers (e.g. on AIX) remove unreferenced variables, + so make sure to reference them. */ + v_char = 'A'; + v_signed_char = 'B'; + v_unsigned_char = 'C'; + + v_short = 3; + v_signed_short = 4; + v_unsigned_short = 5; + + v_int = 6; + v_signed_int = 7; + v_unsigned_int = 8; + + v_long = 9; + v_signed_long = 10; + v_unsigned_long = 11; + + v_float = 100.343434; + v_double = 200.565656; +} diff --git a/gdb/testsuite/gdb.base/arithmet.exp b/gdb/testsuite/gdb.base/arithmet.exp new file mode 100644 index 00000000000..69b9f74aeaa --- /dev/null +++ b/gdb/testsuite/gdb.base/arithmet.exp @@ -0,0 +1,375 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite +# +# tests for correctness of arithmetic operators, associativity and precedence +# with integer type variables +# + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "int-type" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# +# test expressions with "int" types +# + +gdb_test "set variable x=14" "" "set variable x=14" +gdb_test "set variable y=2" "" "set variable y=2" +gdb_test "set variable z=2" "" "set variable z=2" +gdb_test "set variable w=3" "" "set variable w=3" + +send_gdb "print x\n" +gdb_expect { + -re ".*14.*$gdb_prompt $" { + pass "print value of x" + } + -re ".*$gdb_prompt $" { fail "print value of x" } + timeout { fail "(timeout) print value of x" } + } + + +send_gdb "print y\n" +gdb_expect { + -re ".*2.*$gdb_prompt $" { + pass "print value of y" + } + -re ".*$gdb_prompt $" { fail "print value of y" } + timeout { fail "(timeout) print value of y" } + } + +send_gdb "print z\n" +gdb_expect { + -re ".*2.*$gdb_prompt $" { + pass "print value of z" + } + -re ".*$gdb_prompt $" { fail "print value of z" } + timeout { fail "(timeout) print value of z" } + } + +send_gdb "print w\n" +gdb_expect { + -re ".*3.*$gdb_prompt $" { + pass "print value of w" + } + -re ".*$gdb_prompt $" { fail "print value of w" } + timeout { fail "(timeout) print value of w" } + } + + + +send_gdb "print x+y\n" +gdb_expect { + -re ".*16.*$gdb_prompt $" { + pass "print value of x+y" + } + -re ".*$gdb_prompt $" { fail "print value of x+y" } + timeout { fail "(timeout) print value of x+y" } + } + +send_gdb "print x-y\n" +gdb_expect { + -re ".*12.*$gdb_prompt $" { + pass "print value of x-y" + } + -re ".*$gdb_prompt $" { fail "print value of x-y" } + timeout { fail "(timeout) print value of x-y" } + } + +send_gdb "print x*y\n" +gdb_expect { + -re ".*28.*$gdb_prompt $" { + pass "print value of x*y" + } + -re ".*$gdb_prompt $" { fail "print value of x*y" } + timeout { fail "(timeout) print value of x*y" } + } + +send_gdb "print x/y\n" +gdb_expect { + -re ".*7.*$gdb_prompt $" { + pass "print value of x/y" + } + -re ".*$gdb_prompt $" { fail "print value of x/y" } + timeout { fail "(timeout) print value of x/y" } + } + +send_gdb "print x%y\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x%y" + } + -re ".*$gdb_prompt $" { fail "print value of x%y" } + timeout { fail "(timeout) print value of x%y" } + } + + + +# Test associativity of +, -, *, % ,/ + + +send_gdb "print x+y+z\n" +gdb_expect { + -re ".*18.*$gdb_prompt $" { + pass "print value of x+y" + } + -re ".*$gdb_prompt $" { fail "print value of x+y" } + timeout { fail "(timeout) print value of x+y" } + } + +send_gdb "print x-y-z\n" +gdb_expect { + -re ".*10.*$gdb_prompt $" { + pass "print value of x-y" + } + -re ".*$gdb_prompt $" { fail "print value of x-y" } + timeout { fail "(timeout) print value of x-y" } + } + +send_gdb "print x*y*z\n" +gdb_expect { + -re ".*56.*$gdb_prompt $" { + pass "print value of x*y" + } + -re 8".*$gdb_prompt $" { fail "print value of x*y" } + timeout { fail "(timeout) print value of x*y" } + } + +send_gdb "print x/y/z\n" +gdb_expect { + -re ".*3.*$gdb_prompt $" { + pass "print value of x/y" + } + -re ".*$gdb_prompt $" { fail "print value of x/y" } + timeout { fail "(timeout) print value of x/y" } + } + +send_gdb "print x%y%z\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x%y" + } + -re ".*$gdb_prompt $" { fail "print value of x%y" } + timeout { fail "(timeout) print value of x%y" } + } + + +# test precedence rules on pairs of arithmetic operators + +gdb_test "set variable x=10" "" "set variable x" +gdb_test "set variable y=4" "" "set variable y" +gdb_test "set variable z=2" "" "set variable z" + + + +# x y z +# 10 4 2 +send_gdb "print x+y-z\n" +gdb_expect { + -re ".*12.*$gdb_prompt $" { + pass "print value of x+y-z" + } + -re ".*$gdb_prompt $" { fail "print value of x+y-z" } + timeout { fail "(timeout) print value of x+y-z" } + } + +# 10 4 2 +send_gdb "print x+y*z\n" +gdb_expect { + -re ".*18.*$gdb_prompt $" { + pass "print value of x+y*z" + } + -re ".*$gdb_prompt $" { fail "print value of x+y*z" } + timeout { fail "(timeout) print value of x+y*z" } + } + + +gdb_test "set variable z=3" "" "set variable z" + + +# 10 4 3 +send_gdb "print x+y%z\n" +gdb_expect { + -re ".*11.*$gdb_prompt $" { + pass "print value of x+y%z" + } + -re ".*$gdb_prompt $" { fail "print value of x+y%z" } + timeout { fail "(timeout) print value of x+y%z" } + } + + +# 10 4 3 +send_gdb "print x+y/z\n" +gdb_expect { + -re ".*11.*$gdb_prompt $" { + pass "print value of x+y/z" + } + -re ".*$gdb_prompt $" { fail "print value of x+y/z" } + timeout { fail "(timeout) print value of x+y/z" } + } + +gdb_test "set variable z=2" "" " set variable z" + + +# 10 4 2 +send_gdb "print x-y*z\n" +gdb_expect { + -re ".*2.*$gdb_prompt $" { + pass "print value of x-y*z" + } + -re ".*$gdb_prompt $" { fail "print value of x-y*z" } + timeout { fail "(timeout) print value of x-y*z" } + } + +# 10 4 2 +send_gdb "print x-y%z\n" +gdb_expect { + -re ".*10.*$gdb_prompt $" { + pass "print value of x-y%z" + } + -re ".*$gdb_prompt $" { fail "print value of x-y%z" } + timeout { fail "(timeout) print value of x-y%z" } + } + + +# 10 4 2 +send_gdb "print x-y/z\n" +gdb_expect { + -re ".*8.*$gdb_prompt $" { + pass "print value of x-y/z" + } + -re ".*$gdb_prompt $" { fail "print value of x-y/z" } + timeout { fail "(timeout) print value of x-y/z" } + } + +# 10 4 2 +send_gdb "print x*y/z\n" +gdb_expect { + -re ".*20.*$gdb_prompt $" { + pass "print value of x*y/z" + } + -re ".*$gdb_prompt $" { fail "print value of x*y/z" } + timeout { fail "(timeout) print value of x*y/z" } + } + +gdb_test "set variable z=3" "" "set z to 3" + +# 10 4 3 +send_gdb "print x*y%z\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of x*y%z" + } + -re ".*$gdb_prompt $" { fail "print value of x*y%z" } + timeout { fail "(timeout) print value of x*y%z" } + } + +# 10 4 3 +send_gdb "print x/y%z\n" +gdb_expect { + -re ".*2\r\n$gdb_prompt $" { + pass "print value of x/y%z" + } + -re ".*$gdb_prompt $" { fail "print value of x/y%z" } + timeout { fail "(timeout) print value of x/y%z" } + } + + + +# test use of parenthesis to enforce different order of evaluation + +# 10 4 3 +send_gdb "print x-(y+z)\n" +gdb_expect { + -re ".*3\r\n$gdb_prompt $" { + pass "print value of x-(y+z)" + } + -re ".*$gdb_prompt $" { fail "print value of x-(y+z)" } + timeout { fail "(timeout) print value of x-(y+z)" } + } + + +# 10 4 3 +send_gdb "print x/(y*z)\n" +gdb_expect { + -re ".*0\r\n$gdb_prompt $" { + pass "print value of x/(y*z)" + } + -re ".*$gdb_prompt $" { fail "print value of x/(y*z)" } + timeout { fail "(timeout) print value of x/(y*z)" } + } + +# 10 4 3 +send_gdb "print x-(y/z)\n" +gdb_expect { + -re ".*9\r\n$gdb_prompt $" { + pass "print value of x-(y/z)" + } + -re ".*$gdb_prompt $" { fail "print value of x-(y/z)" } + timeout { fail "(timeout) print value of x-(y/z)" } + } + + +# 10 4 3 +send_gdb "print (x+y)*z\n" +gdb_expect { + -re ".*42\r\n$gdb_prompt $" { + pass "print value of (x+y)*z" + } + -re ".*$gdb_prompt $" { fail "print value of (x+y)*z" } + timeout { fail "(timeout) print value of (x+y)*z" } + } + + + + + + diff --git a/gdb/testsuite/gdb.base/assign.exp b/gdb/testsuite/gdb.base/assign.exp new file mode 100644 index 00000000000..059862c91b8 --- /dev/null +++ b/gdb/testsuite/gdb.base/assign.exp @@ -0,0 +1,446 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite +# +# tests for all the assignemnt operators +# with mixed types and with int type variables +# + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "all-types" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +gdb_test "next" "return 0;" "continuing after dummy()" + +send_gdb "print v_int=57\n" +gdb_expect { + -re ".*57.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*57.*$gdb_prompt $" { + pass "v_int=57" + } + -re ".*$gdb_prompt $" { fail "v_int=57" } + timeout { fail "(timeout) v_int=57" } + } + } + -re ".*$gdb_prompt $" { fail "v_int=57" } + timeout { fail "(timeout) v_int=57" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + +send_gdb "print v_int+=57\n" +gdb_expect { + -re ".*63.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*63.*$gdb_prompt $" { + pass "v_int+=57" + } + -re ".*$gdb_prompt $" { fail "v_int+=57" } + timeout { fail "(timeout) v_int+=57" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=57" } + timeout { fail "(timeout) v_int+=57" } + } + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + +send_gdb "print v_int-=57\n" +gdb_expect { + -re ".*-51.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*-51.*$gdb_prompt $" { + pass "v_int-=57" + } + -re ".*$gdb_prompt $" { fail "v_int-=57" } + timeout { fail "(timeout) v_int-=57" } + } + } + -re ".*$gdb_prompt $" { fail "v_int-=57" } + timeout { fail "(timeout) v_int-=57" } + } + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + +send_gdb "print v_int*=5\n" +gdb_expect { + -re ".*30.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*30.*$gdb_prompt $" { + pass "v_int*=5" + } + -re ".*$gdb_prompt $" { fail "v_int*=5" } + timeout { fail "(timeout) v_int*=5" } + } + } + -re ".*$gdb_prompt $" { fail "v_int*=5" } + timeout { fail "(timeout) v_int*=5" } + } + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + +send_gdb "print v_int/=4\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "v_int/=4" + } + -re ".*$gdb_prompt $" { fail "v_int/=4" } + timeout { fail "(timeout) v_int/=4" } + } + } + -re ".*$gdb_prompt $" { fail "v_int/=4" } + timeout { fail "(timeout) v_int/=4" } + } + + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + +send_gdb "print v_int%=4\n" +gdb_expect { + -re ".*2.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*2.*$gdb_prompt $" { + pass "v_int%=4" + } + -re ".*$gdb_prompt $" { fail "v_int%=4" } + timeout { fail "(timeout) v_int%=4" } + } + } + -re ".*$gdb_prompt $" { fail "v_int%=4" } + timeout { fail "(timeout) v_int%=4" } + } + + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_char\n" +gdb_expect { + -re ".*71.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*71.*$gdb_prompt $" { + pass "v_int+=char" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_char" } + timeout { fail "(timeout) v_int+=v_char" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_char" } + timeout { fail "(timeout) v_int+=v_char" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_signed_char\n" +gdb_expect { + -re ".*72.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*72.*$gdb_prompt $" { + pass "v_int+=signed_char" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_signed_char" } + timeout { fail "(timeout) v_int+=v_signed_char" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_signed_char" } + timeout { fail "(timeout) v_int+=v_signed_char" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_unsigned_char\n" +gdb_expect { + -re ".*73.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*73.*$gdb_prompt $" { + pass "v_int+=unsigned_char" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_unsigned_char" } + timeout { fail "(timeout) v_int+=v_unsigned_char" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_unsigned_char" } + timeout { fail "(timeout) v_int+=v_unsigned_char" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_short\n" +gdb_expect { + -re ".*9.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*9.*$gdb_prompt $" { + pass "v_int+=short" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_short" } + timeout { fail "(timeout) v_int+=v_short" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_short" } + timeout { fail "(timeout) v_int+=v_short" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_signed_short\n" +gdb_expect { + -re ".*10.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*10.*$gdb_prompt $" { + pass "v_int+=signed_short" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_signed_short" } + timeout { fail "(timeout) v_int+=v_signed_short" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_signed_short" } + timeout { fail "(timeout) v_int+=v_signed_short" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_unsigned_short\n" +gdb_expect { + -re ".*11.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*11.*$gdb_prompt $" { + pass "v_int=+unsigned_short" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_unsigned_short" } + timeout { fail "(timeout) v_int+=v_unsigned_short" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_unsigned_short" } + timeout { fail "(timeout) v_int+=v_unsigned_short" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_signed_int\n" +gdb_expect { + -re ".*13.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*13.*$gdb_prompt $" { + pass "v_int+=signed_int" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_signed_int" } + timeout { fail "(timeout) v_int+=v_signed_int" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_signed_int" } + timeout { fail "(timeout) v_int+=v_signed_int" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_unsigned_int\n" +gdb_expect { + -re ".*14.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*14.*$gdb_prompt $" { + pass "v_int+=unsigned_int" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_unsigned_int" } + timeout { fail "(timeout) v_int+=v_unsigned_int" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_unsigned_int" } + timeout { fail "(timeout) v_int+=v_unsigned_int" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_long\n" +gdb_expect { + -re ".*15.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*15.*$gdb_prompt $" { + pass "v_int+=long" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_long" } + timeout { fail "(timeout) v_int+=v_long" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_long" } + timeout { fail "(timeout) v_int+=v_long" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + + +send_gdb "print v_int+=v_signed_long\n" +gdb_expect { + -re ".*16.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*16.*$gdb_prompt $" { + pass "v_int+=signed_long" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_signed_long" } + timeout { fail "(timeout) v_int+=v_signed_long" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_signed_long" } + timeout { fail "(timeout) v_int+=v_signed_long" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + +send_gdb "print v_int+=v_unsigned_long\n" +gdb_expect { + -re ".*17.*$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*17.*$gdb_prompt $" { + pass "v_int+=unsigned_long" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_unsigned_long" } + timeout { fail "(timeout) v_int+=v_unsigned_long" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_unsigned_long" } + timeout { fail "(timeout) v_int+=v_unsigned_long" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + +send_gdb "print v_int+=v_float\n" +gdb_expect { + -re ".*106\r\n$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*106\r\n$gdb_prompt $" { + pass "v_int+=v_float" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_float" } + timeout { fail "(timeout) v_int+=v_float" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_float" } + timeout { fail "(timeout) v_int+=v_float" } + } + + +gdb_test "set variable v_int = 6" "" "set v_int to 6" + + +send_gdb "print v_int+=v_double\n" +gdb_expect { + -re ".*206\r\n$gdb_prompt $" { + send_gdb "print v_int\n" + gdb_expect { + -re ".*206\r\n$gdb_prompt $" { + pass "v_int+=double" + } + -re ".*$gdb_prompt $" { fail "v_int+=v_double" } + timeout { fail "(timeout) v_int+=v_double" } + } + } + -re ".*$gdb_prompt $" { fail "v_int+=v_signed_long" } + timeout { fail "(timeout) v_int+=v_double" } + } + + diff --git a/gdb/testsuite/gdb.base/bar.c b/gdb/testsuite/gdb.base/bar.c new file mode 100644 index 00000000000..8a4da9802f8 --- /dev/null +++ b/gdb/testsuite/gdb.base/bar.c @@ -0,0 +1,9 @@ +static int barx __attribute__ ((section (".data01"))) = 'b' + 'a' + 'r'; + +int bar (int x) +{ + if (x) + return barx; + else + return 0; +} diff --git a/gdb/testsuite/gdb.base/baz.c b/gdb/testsuite/gdb.base/baz.c new file mode 100644 index 00000000000..a13cd16bbbe --- /dev/null +++ b/gdb/testsuite/gdb.base/baz.c @@ -0,0 +1,9 @@ +static int bazx __attribute__ ((section (".data02"))) = 'b' + 'a' + 'z'; + +int baz (int x) +{ + if (x) + return bazx; + else + return 0; +} diff --git a/gdb/testsuite/gdb.base/bitfields.c b/gdb/testsuite/gdb.base/bitfields.c new file mode 100644 index 00000000000..930b244fcd1 --- /dev/null +++ b/gdb/testsuite/gdb.base/bitfields.c @@ -0,0 +1,194 @@ +/* Test program to test bit field operations */ + +/* For non-ANSI compilers, use plain ints for the signed bit fields. However, + whether they actually end up signed or not is implementation defined, so + this may cause some tests to fail. But at least we can still compile + the test program and run the tests... */ + +#ifndef __STDC__ +#define signed /**/ +#endif + +struct fields +{ + unsigned char uc ; + signed int s1 : 1; + unsigned int u1 : 1; + signed int s2 : 2; + unsigned int u2 : 2; + signed int s3 : 3; + unsigned int u3 : 3; + signed int s9 : 9; + unsigned int u9 : 9; + signed char sc ; +} flags; + +void break1 () +{ +} + +void break2 () +{ +} + +void break3 () +{ +} + +void break4 () +{ +} + +void break5 () +{ +} + +void break6 () +{ +} + +void break7 () +{ +} + +void break8 () +{ +} + +void break9 () +{ +} + +void break10 () +{ +} + +/* This is used by bitfields.exp to determine if the target understands + signed bitfields. */ +int i; + +int main () +{ + /* For each member, set that member to 1, allow gdb to verify that the + member (and only that member) is 1, and then reset it back to 0. */ + +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + flags.uc = 1; + break1 (); + flags.uc = 0; + + flags.s1 = 1; + break1 (); + flags.s1 = 0; + + flags.u1 = 1; + break1 (); + flags.u1 = 0; + + flags.s2 = 1; + break1 (); + flags.s2 = 0; + + flags.u2 = 1; + break1 (); + flags.u2 = 0; + + flags.s3 = 1; + break1 (); + flags.s3 = 0; + + flags.u3 = 1; + break1 (); + flags.u3 = 0; + + flags.s9 = 1; + break1 (); + flags.s9 = 0; + + flags.u9 = 1; + break1 (); + flags.u9 = 0; + + flags.sc = 1; + break1 (); + flags.sc = 0; + + /* Fill alternating fields with all 1's and verify that none of the bits + "bleed over" to the other fields. */ + + flags.uc = 0xFF; + flags.u1 = 0x1; + flags.u2 = 0x3; + flags.u3 = 0x7; + flags.u9 = 0x1FF; + break2 (); + flags.uc = 0; + flags.u1 = 0; + flags.u2 = 0; + flags.u3 = 0; + flags.u9 = 0; + + flags.s1 = 0x1; + flags.s2 = 0x3; + flags.s3 = 0x7; + flags.s9 = 0x1FF; + flags.sc = 0xFF; + break2 (); + flags.s1 = 0; + flags.s2 = 0; + flags.s3 = 0; + flags.s9 = 0; + flags.sc = 0; + + /* Fill the unsigned fields with the maximum positive value and verify + that the values are printed correctly. */ + + /* Maximum positive values */ + flags.u1 = 0x1; + flags.u2 = 0x3; + flags.u3 = 0x7; + flags.u9 = 0x1FF; + break3 (); + flags.u1 = 0; + flags.u2 = 0; + flags.u3 = 0; + flags.u9 = 0; + + /* Fill the signed fields with the maximum positive value, then the maximally + negative value, then -1, and verify in each case that the values are + printed correctly. */ + + /* Maximum positive values */ + flags.s1 = 0x0; + flags.s2 = 0x1; + flags.s3 = 0x3; + flags.s9 = 0xFF; + break4 (); + + /* Maximally negative values */ + flags.s1 = 0x1; + flags.s2 = 0x2; + flags.s3 = 0x4; + flags.s9 = 0x100; + /* Extract bitfield value so that bitfield.exp can check if the target + understands signed bitfields. */ + i = flags.s9; + break4 (); + + /* -1 */ + flags.s1 = 0x1; + flags.s2 = 0x3; + flags.s3 = 0x7; + flags.s9 = 0x1FF; + break4 (); + + flags.s1 = 0; + flags.s2 = 0; + flags.s3 = 0; + flags.s9 = 0; + + return 0; +} diff --git a/gdb/testsuite/gdb.base/bitfields.exp b/gdb/testsuite/gdb.base/bitfields.exp new file mode 100644 index 00000000000..764e80c6504 --- /dev/null +++ b/gdb/testsuite/gdb.base/bitfields.exp @@ -0,0 +1,268 @@ +# Copyright (C) 1992, 1994, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "bitfields" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# +# Test bitfield locating and uniqueness. +# For each member, set that member to 1 and verify that the member (and only +# that member) is 1, then reset it back to 0. +# + +proc bitfield_uniqueness {} { + global decimal + global hex + global gdb_prompt + global srcfile + + if { ! [runto break1] } { + gdb_suppress_tests; + } + + if [gdb_test "print flags" ".*uc = 1 .*, s1 = 0, u1 = 0, s2 = 0, u2 = 0, s3 = 0, u3 = 0, s9 = 0, u9 = 0, sc = 0.*"] { + gdb_suppress_tests; + } + if [gdb_test "cont" "Break.*break1 \\(\\) at .*$srcfile:$decimal.*" "continuing to break1 #1"] { + gdb_suppress_tests; + } + # Note that we check for s1 as either 1 or -1, so that failure to + # treat it correctly as a signed 1bit field (values 0 or -1) while + # printing its value does not cause a spurious failure. We do the + # signedness preservation test later. + if [gdb_test "print flags" ".*uc = 0 .*, s1 = (1|-1), u1 = 0, s2 = 0, u2 = 0, s3 = 0, u3 = 0, s9 = 0, u9 = 0, sc = 0.*" "bitfield uniqueness (s1)"] { + gdb_suppress_tests; + } + if [gdb_test "cont" "Break.*break1 \\(\\) at .*$srcfile:$decimal.*" "continuing to break1 #2"] { + gdb_suppress_tests; + } + if [gdb_test "print flags" ".*uc = 0 .*, s1 = 0, u1 = 1, s2 = 0, u2 = 0, s3 = 0, u3 = 0, s9 = 0, u9 = 0, sc = 0.*" "bitfield uniqueness (u1)"] { + gdb_suppress_tests; + } + if [gdb_test "cont" "Break.*break1 \\(\\) at .*$srcfile:$decimal.*" "continuing to break1 #3"] { + gdb_suppress_tests; + } + if [gdb_test "print flags" ".*uc = 0 .*, s1 = 0, u1 = 0, s2 = 1, u2 = 0, s3 = 0, u3 = 0, s9 = 0, u9 = 0, sc = 0.*" "bitfield uniqueness (s2)"] { + gdb_suppress_tests; + } + if [gdb_test "cont" "Break.*break1 \\(\\) at .*$srcfile:$decimal.*" "continuing to break1 #4"] { + gdb_suppress_tests; + } + if [gdb_test "print flags" ".*uc = 0 .*, s1 = 0, u1 = 0, s2 = 0, u2 = 1, s3 = 0, u3 = 0, s9 = 0, u9 = 0, sc = 0.*" "bitfield uniqueness (u2)"] { + gdb_suppress_tests; + } + if [gdb_test "cont" "Break.*break1 \\(\\) at .*$srcfile:$decimal.*" "continuing to break1 #5"] { + gdb_suppress_tests; + } + if [gdb_test "print flags" ".*uc = 0 .*, s1 = 0, u1 = 0, s2 = 0, u2 = 0, s3 = 1, u3 = 0, s9 = 0, u9 = 0, sc = 0.*" "bitfield uniqueness (s3)"] { + gdb_suppress_tests; + } + if [gdb_test "cont" "Break.*break1 \\(\\) at .*$srcfile:$decimal.*" "continuing to break1 #6"] { + gdb_suppress_tests; + } + if [gdb_test "print flags" ".*uc = 0 .*, s1 = 0, u1 = 0, s2 = 0, u2 = 0, s3 = 0, u3 = 1, s9 = 0, u9 = 0, sc = 0.*" "bitfield uniqueness (u3)"] { + gdb_suppress_tests + } + if [gdb_test "cont" "Break.*break1 \\(\\) at .*$srcfile:$decimal.*" "continuing to break1 #7"] { + gdb_suppress_tests + } + if [gdb_test "print flags" ".*uc = 0 .*, s1 = 0, u1 = 0, s2 = 0, u2 = 0, s3 = 0, u3 = 0, s9 = 1, u9 = 0, sc = 0.*" "bitfield uniqueness (s9)"] { + gdb_suppress_tests + } + if [gdb_test "cont" "Break.*break1 \\(\\) at .*$srcfile:$decimal.*" "continuing to break1 #8"] { + gdb_suppress_tests + } + if [gdb_test "print flags" ".*uc = 0 .*, s1 = 0, u1 = 0, s2 = 0, u2 = 0, s3 = 0, u3 = 0, s9 = 0, u9 = 1, sc = 0.*" "bitfield uniqueness (u9)"] { + gdb_suppress_tests + } + if [gdb_test "cont" "Break.*break1 \\(\\) at .*$srcfile:$decimal.*" "continuing to break1 #9"] { + gdb_suppress_tests + } + if [gdb_test "print flags" ".*uc = 0 .*, s1 = 0, u1 = 0, s2 = 0, u2 = 0, s3 = 0, u3 = 0, s9 = 0, u9 = 0, sc = 1.*" "bitfield uniqueness (sc)"] { + gdb_suppress_tests + } + # Hmmmm? + gdb_stop_suppressing_tests; +} + + +# +# Test bitfield containment. +# Fill alternating fields with all 1's and verify that none of the bits +# "bleed over" to the other fields. +# + +proc bitfield_containment {} { + global decimal + global hex + global gdb_prompt + global srcfile + + delete_breakpoints + + if { ![runto break2] } { + gdb_suppress_tests + } + + if [gdb_test "print/x flags" "= {uc = 0xff, s1 = 0x0, u1 = 0x1, s2 = 0x0, u2 = 0x3, s3 = 0x0, u3 = 0x7, s9 = 0x0, u9 = 0x1ff, sc = 0x0}" "bitfield containment #1"] { + gdb_suppress_tests + } + + if [gdb_test "cont" "Break.*break2 \\(\\) at .*$srcfile:$decimal.*" "continuing to break2"] { + gdb_suppress_tests + } + + # If program is compiled with Sun CC, then these print out as their + # actual sizes; if compiled with gcc, they print out as 0xffffffff + # (which strikes me as bogus, but accept it at least for now). + if [gdb_test "print/x flags" "= {uc = 0x0, s1 = 0x(1|f*), u1 = 0x0, s2 = 0x(3|f*), u2 = 0x0, s3 = 0x(7|f*), u3 = 0x0, s9 = 0x(1ff|f*), u9 = 0x0, sc = 0xff}" "bitfield containment #2"] { + gdb_suppress_tests + } + gdb_stop_suppressing_tests; +} + +# Test unsigned bitfields for unsignedness and range. +# Fill the unsigned fields with the maximum positive value and verify that +# the values are printed correctly. + +proc bitfield_unsignedness {} { + global decimal + global hex + global gdb_prompt + global srcfile + + delete_breakpoints + + if { ![runto break3] } { + gdb_suppress_tests + } + + if [gdb_test "print flags" ".*uc = 0 .*, s1 = 0, u1 = 1, s2 = 0, u2 = 3, s3 = 0, u3 = 7, s9 = 0, u9 = 511, sc = 0.*" "unsigned bitfield ranges"] { + gdb_suppress_tests + } + gdb_stop_suppressing_tests; +} + +# +# Test signed bitfields for signedness and range. +# Fill the signed fields with the maximum positive value, then the maximally +# negative value, then -1, and verify in each case that the values are +# printed correctly. +# + +proc bitfield_signedness {} { + global decimal + global hex + global gdb_prompt + global srcfile + + delete_breakpoints + + if { ! [runto break4] } { + gdb_suppress_tests + } + + if [gdb_test "print flags" "= {uc = 0 .*, s1 = 0, u1 = 0, s2 = 1, u2 = 0, s3 = 3, u3 = 0, s9 = 255, u9 = 0, sc = 0 .*}" "signed bitfields, max positive values"] { + gdb_suppress_tests + } + + if [gdb_test "cont" "Break.*break4 \\(\\) at .*$srcfile:$decimal.*" "continuing to break4 #1"] { + gdb_suppress_tests + } + + # Determine if the target has signed bitfields so we can xfail the + # the signed bitfield tests if it doesn't. + send_gdb "print i\n" + gdb_expect { + -re ".* = -256.*$gdb_prompt $" { + pass "determining signed-ness of bitfields" + } + -re ".* = 256.*$gdb_prompt $" { + pass "determining signed-ness of bitfields" + setup_xfail "*-*-*" + } + -re ".*$gdb_prompt $" { + fail "determining signed-ness of bitfields" + gdb_suppress_tests + } + default { + fail "determining signed-ness of bitfields" ; + gdb_suppress_tests; + } + } + + if [gdb_test "print flags" ".*uc = 0 .*, s1 = -1, u1 = 0, s2 = -2, u2 = 0, s3 = -4, u3 = 0, s9 = -256, u9 = 0, sc = 0.*" "signed bitfields, max negative values"] { + gdb_suppress_tests + } + + if [gdb_test "cont" "Break.*break4 \\(\\) at .*$srcfile:$decimal.*" "continuing to break4 #2"] { + gdb_suppress_tests + } + + if [gdb_test "print flags" ".*uc = 0 .*, s1 = -1, u1 = 0, s2 = -1, u2 = 0, s3 = -1, u3 = 0, s9 = -1, u9 = 0, sc = 0.*" "signed bitfields with -1"] { + gdb_suppress_tests + } + # Hmmmm??? + gdb_stop_suppressing_tests; +} + +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" + +bitfield_uniqueness +if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} +} +bitfield_containment +if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} +} +bitfield_unsignedness +if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} +} +bitfield_signedness diff --git a/gdb/testsuite/gdb.base/bitops.exp b/gdb/testsuite/gdb.base/bitops.exp new file mode 100644 index 00000000000..f1c578ec75d --- /dev/null +++ b/gdb/testsuite/gdb.base/bitops.exp @@ -0,0 +1,365 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite +# +# tests expressions with bitwise operators, and some +# logical operators +# Does not use a target program +# + + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + + +send_gdb "print !1\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !1" + } + -re ".*$gdb_prompt $" { fail "print value of !1" } + timeout { fail "(timeout) print value of !1" } + } + + +send_gdb "print !0\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of !0" + } + -re ".*$gdb_prompt $" { fail "print value of !0" } + timeout { fail "(timeout) print value of !0" } + } + + +send_gdb "print !100\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !100" + } + -re ".*$gdb_prompt $" { fail "print value of !100" } + timeout { fail "(timeout) print value of !100" } + } + + +send_gdb "print !1000\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !1000" + } + -re ".*$gdb_prompt $" { fail "print value of !1000" } + timeout { fail "(timeout) print value of !1000" } + } + + +send_gdb "print !10\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !10" + } + -re ".*$gdb_prompt $" { fail "print value of !10" } + timeout { fail "(timeout) print value of !10" } + } + + +send_gdb "print !2\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !2 " + } + -re ".*$gdb_prompt $" { fail "print value of !2" } + timeout { fail "(timeout) print value of !2" } + } + + +send_gdb "print 10 | 5\n" +gdb_expect { + -re ".\[0-9\]* = 15.*$gdb_prompt $" { + pass "print value of 10 | 5" + } + -re ".*$gdb_prompt $" { fail "print value of 10 | 5" } + timeout { fail "(timeout) print value of 10 | 5" } + } + + +send_gdb "print 10 & 5\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of 10 & 5" + } + -re ".*$gdb_prompt $" { fail "print value of 10 & 5" } + timeout { fail "(timeout) print value of 10 & 5" } + } + + +send_gdb "print 10 ^ 5\n" +gdb_expect { + -re ".\[0-9\]* = 15.*$gdb_prompt $" { + pass "print value of 10 ^ 5" + } + -re ".*$gdb_prompt $" { fail "print value of 10 ^ 5" } + timeout { fail "(timeout) print value of 10 ^ 5" } + } + + +send_gdb "print -!0\n" +gdb_expect { + -re ".\[0-9\]* = -1.*$gdb_prompt $" { + pass "print value of -!0" + } + -re ".*$gdb_prompt $" { fail "print value of -!0" } + timeout { fail "(timeout) print value of -!0" } + } + + +send_gdb "print ~-!0\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of ~-!0" + } + -re ".*$gdb_prompt $" { fail "print value of ~-!0" } + timeout { fail "(timeout) print value of ~-!0" } + } + + + +send_gdb "print 3 * 2 / 4.0 * 2.0\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of 3 * 2 / 4.0 * 2.0" + } + -re ".*$gdb_prompt $" { fail "print value of 3 * 2 / 4.0 * 2.0" } + timeout { fail "(timeout) print value of 3 * 2 / 4.0 * 2.0" } + } + + +send_gdb "print 8 << 2 >> 4\n" +gdb_expect { + -re ".\[0-9\]* = 2.*$gdb_prompt $" { + pass "print value of 8 << 2 >> 4" + } + -re ".*$gdb_prompt $" { fail "print value of 8 << 2 >> 4" } + timeout { fail "(timeout) print value of 8 << 2 >> 4" } + } + + +send_gdb "print -1 < 0 > 1\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of -1 < 0 > 1" + } + -re ".*$gdb_prompt $" { fail "print value of -1 < 0 > 1" } + timeout { fail "(timeout) print value of -1 < 0 > 1" } + } + + +send_gdb "print 15 ^ 10 ^ 5 ^ 7\n" +gdb_expect { + -re ".\[0-9\]* = 7.*$gdb_prompt $" { + pass "print value of 15 ^ 10 ^ 5 ^ 7" + } + -re ".*$gdb_prompt $" { fail "print value of 15 ^ 10 ^ 5 ^ 7" } + timeout { fail "(timeout) print value of 15 ^ 10 ^ 5 ^ 7" } + } + + +send_gdb "print 3.5 < 4.0\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of 3.5 < 4.0" + } + -re ".*$gdb_prompt $" { fail "print value of 3.5 < 4.0" } + timeout { fail "(timeout) print value of 3.5 < 4.0" } + } + + +send_gdb "print 3.5 < -4.0\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of 3.5 < -4.0" + } + -re ".*$gdb_prompt $" { fail "print value of 3.5 < -4.0" } + timeout { fail "(timeout) print value of 3.5 < -4.0" } + } + + +send_gdb "print 2 > -3\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of 2 > -3" + } + -re ".*$gdb_prompt $" { fail "print value of 2 > -3" } + timeout { fail "(timeout) print value of 2 > -3" } + } + + +send_gdb "print -3>4\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of -3>4" + } + -re ".*$gdb_prompt $" { fail "print value of -3>4" } + timeout { fail "(timeout) print value of -3>4" } + } + + +send_gdb "print (-3 > 4)\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of (-3 > 4)" + } + -re ".*$gdb_prompt $" { fail "print value of (-3 > 4)" } + timeout { fail "(timeout) print value of (-3 > 4)" } + } + + +send_gdb "print 3>=2.5\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of 3>=2.5" + } + -re ".*$gdb_prompt $" { fail "print value of 3>=2.5" } + timeout { fail "(timeout) print value of 3>=2.5" } + } + + +send_gdb "print 3>=4.5\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of 3>=4.5" + } + -re ".*$gdb_prompt $" { fail "print value of 3>=4.5" } + timeout { fail "(timeout) print value of 3>=4.5" } + } + + +send_gdb "print 3==3.0\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of 3==3.0" + } + -re ".*$gdb_prompt $" { fail "print value of 3==3.0" } + timeout { fail "(timeout) print value of 3==3.0" } + } + + +send_gdb "print 3==4.0\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of 3==4.0" + } + -re ".*$gdb_prompt $" { fail "print value of 3==4.0" } + timeout { fail "(timeout) print value of 3==4.0" } + } + + +send_gdb "print 3!=3.0\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of 3!=3.0" + } + -re ".*$gdb_prompt $" { fail "print value of 3!=3.0" } + timeout { fail "(timeout) print value of 3!=3.0" } + } + + +send_gdb "print 3!=5.0\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of 3!=5.0" + } + -re ".*$gdb_prompt $" { fail "print value of 3!=5.0" } + timeout { fail "(timeout) print value of 3!=5.0" } + } + + +send_gdb "print 0 || 1 && 0 | 0 ^ 0 == 8 > 128 >>1 +2 *2\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of 0 || 1 && 0 | 0 ^ 0 == 8 > 128 >>1 +2 *2" + } + -re ".*$gdb_prompt $" { fail "print value of 0 || 1 && 0 | 0 ^ 0 == 8 > 128 >>1 +2 *2" } + timeout { fail "(timeout) print value of 0 || 1 && 0 | 0 ^ 0 == 8 > 128 >>1 +2 *2" } + } + + +send_gdb "print 1.0 || 0\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of 1.0 || 0" + } + -re ".*$gdb_prompt $" { fail "print value of 1.0 || 0" } + timeout { fail "(timeout) print value of 1.0 || 0" } + } + + +send_gdb "print 0.0 || 1.0\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of 0.0 || 1.0" + } + -re ".*$gdb_prompt $" { fail "print value of 0.0 || 1.0" } + timeout { fail "(timeout) print value of 0.0 || 1.0" } + } + + +send_gdb "print 0.0 || 0\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of 0.0 || 0" + } + -re ".*$gdb_prompt $" { fail "print value of 0.0 || 0" } + timeout { fail "(timeout) print value of 0.0 || 0" } + } + + +send_gdb "print 0 || 1 && 0 | 0 ^ 0 == 8\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of 0 || 1 && 0 | 0 ^ 0 == 8" + } + -re ".*$gdb_prompt $" { fail "print value of 0 || 1 && 0 | 0 ^ 0 == 8" } + timeout { fail "(timeout) print value of 0 || 1 && 0 | 0 ^ 0 == 8" } + } + + +send_gdb "print 0 == 8 > 128 >> 1 + 2 * 2\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of 0 == 8 > 128 >> 1 + 2 * 2" + } + -re ".*$gdb_prompt $" { fail "print value of 0 == 8 > 128 >> 1 + 2 * 2" } + timeout { fail "(timeout) print value of 0 == 8 > 128 >> 1 + 2 * 2" } + } + diff --git a/gdb/testsuite/gdb.base/branches.c b/gdb/testsuite/gdb.base/branches.c new file mode 100644 index 00000000000..df3b7c052be --- /dev/null +++ b/gdb/testsuite/gdb.base/branches.c @@ -0,0 +1,113 @@ +/* Tests for single stepping through various branch conditions */ + +int noscramble(int a) +{ + return a ; +} + +int echo(int a) +{ return noscramble(a) ; } + +int equaltest(int a,int b) +{ int retval ; + if (a == b) + retval = noscramble(1) ; + else retval = noscramble(0) ; + return retval ; +} + +int neqtest(int a , int b) +{ int retval ; + if (a != b) + retval = echo(1) ; + else retval = echo(2) ; + return retval ; +} +int zerotest(int a ) +{ int retval ; + a = echo(a) ; + if (a ==0) + retval = echo(1) ; + else + retval = echo(0) ; + retval = echo(retval) ; + return retval ; +} + +int zerotest2(int a) +{ + return (a==0) ; +} + +int nonzerotest(int a) +{ + int retval ; + if (a != 0) + retval = echo(0) ; + else retval = echo(1) ; + return retval ; +} + +int whiletest(int a) +{ + while (a > 0) + { + a-- ; + } + return 0 ; +} +int whiletest2(int a) +{ + while (a > 0) + { + a = noscramble(a) ; + a-- ; + } + return a ; +} + +int decr(int x) { return x - 1 ; } + +int while3(int a) +{ + int b = a ; + while (a == b) + { + a = echo(a) ; + b = decr(b) ; + } + return a ; +} + +void done (int x) { } + +int main() +{ + int a,b,c,d ; + done(1) ; + a = echo(123456) ; + b = echo(123456) ; + c = echo(56789) ; + d = echo(0) ; +#if 1 + equaltest(a,b) ; + done(7) ; + equaltest(a,c) ; + done(8) ; + whiletest(3) ; /* worked */ + done(3) ; + while3(3) ; + done(6) ; +#endif + neqtest(a,b) ; + neqtest(a,b) ; + neqtest(a,c) ; + zerotest(d) ; + zerotest(a) ; + done(5) ; + nonzerotest(d) ; + done(4) ; + nonzerotest(a) ; + done(111) ; + return 1 ; +} diff --git a/gdb/testsuite/gdb.base/break.c b/gdb/testsuite/gdb.base/break.c new file mode 100644 index 00000000000..491d6e5dd5d --- /dev/null +++ b/gdb/testsuite/gdb.base/break.c @@ -0,0 +1,81 @@ +#ifdef vxworks + +# include + +/* VxWorks does not supply atoi. */ +static int +atoi (z) + char *z; +{ + int i = 0; + + while (*z >= '0' && *z <= '9') + i = i * 10 + (*z++ - '0'); + return i; +} + +/* I don't know of any way to pass an array to VxWorks. This function + can be called directly from gdb. */ + +vxmain (arg) +char *arg; +{ + char *argv[2]; + + argv[0] = ""; + argv[1] = arg; + main (2, argv, (char **) 0); +} + +#else /* ! vxworks */ +# include +#endif /* ! vxworks */ + +/* + * The following functions do nothing useful. They are included simply + * as places to try setting breakpoints at. They are explicitly + * "one-line functions" to verify that this case works (some versions + * of gcc have or have had problems with this). + */ + +int marker1 () { return (0); } +int marker2 (a) int a; { return (1); } +void marker3 (a, b) char *a, *b; {} +void marker4 (d) long d; {} + +/* + * This simple classical example of recursion is useful for + * testing stack backtraces and such. + */ + +int +main (argc, argv, envp) +int argc; +char *argv[], **envp; +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + if (argc == 123456) { + fprintf (stderr, "usage: factorial \n"); + return 1; + } + printf ("%d\n", factorial (atoi ("6"))); + + marker1 (); + marker2 (43); + marker3 ("stack", "trace"); + marker4 (177601976L); + return 0; +} + +int factorial (value) +int value; +{ + if (value > 1) { + value *= factorial (value - 1); + } + return (value); +} + diff --git a/gdb/testsuite/gdb.base/break.exp b/gdb/testsuite/gdb.base/break.exp new file mode 100644 index 00000000000..b8f1d7f8fcb --- /dev/null +++ b/gdb/testsuite/gdb.base/break.exp @@ -0,0 +1,769 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1994, 1997, 1998 +# 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "break" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} +# +# test simple breakpoint setting commands +# + +# Test deleting all breakpoints when there are none installed, +# GDB should not prompt for confirmation. +# Note that gdb-init.exp provides a "delete_breakpoints" proc +# for general use elsewhere. + +send_gdb "delete breakpoints\n" +gdb_expect { + -re "Delete all breakpoints.*$" { + send_gdb "y\n" + gdb_expect { + -re "$gdb_prompt $" { + fail "Delete all breakpoints when none (unexpected prompt)" + } + timeout { fail "Delete all breakpoints when none (timeout after unexpected prompt)" } + } + } + -re ".*$gdb_prompt $" { pass "Delete all breakpoints when none" } + timeout { fail "Delete all breakpoints when none (timeout)" } +} + +# +# test break at function +# +gdb_test "break main" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint function" + +# +# test break at function in file +# +gdb_test "break $srcfile:factorial" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint function in file" + +# +# test break at line number +# +gdb_test "break 64" \ + "Breakpoint.*at.* file .*$srcfile, line 64\\." \ + "breakpoint line number" + +# +# test duplicate breakpoint +# +gdb_test "break 64" \ + "Note: breakpoint \[0-9\]+ also set at pc.*Breakpoint \[0-9\]+ at.* file .*$srcfile, line 64\\." \ + "breakpoint duplicate" + +# +# test break at line number in file +# +gdb_test "break $srcfile:70" \ + "Breakpoint.*at.* file .*$srcfile, line 70\\." \ + "breakpoint line number in file" + + +# +# check to see what breakpoints are set +# +if [target_info exists gdb_stub] { + set main_line 57 +} else { + set main_line 60 +} + +gdb_test "info break" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$main_line.* +\[0-9\]+\[\t \]+breakpoint keep y.* in factorial at .*$srcfile:76.* +\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:64.* +\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:64.* +\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:70" \ + "breakpoint info" + + +# FIXME: The rest of this test doesn't work with anything that can't +# handle arguments. +# Huh? There doesn't *appear* to be anything that passes arguments +# below. +if [istarget "mips-idt-*"] then { + return +} + +# +# run until the breakpoint at main is hit. For non-stubs-using targets. +# +if ![target_info exists use_gdb_stub] { + if [istarget "*-*-vxworks*"] then { + send_gdb "run vxmain \"2\"\n" + set timeout 120 + verbose "Timeout is now $timeout seconds" 2 + } else { + send_gdb "run\n" + } + gdb_expect { + -re "The program .* has been started already.*y or n. $" { + send_gdb "y\n" + exp_continue + } + -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:60.*60\[\t \]+if .argc.* \{.*$gdb_prompt $"\ + { pass "run until function breakpoint" } + -re ".*$gdb_prompt $" { fail "run until function breakpoint" } + timeout { fail "run until function breakpoint (timeout)" } + } +} else { + if ![target_info exists gdb_stub] { + gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:60.*60\[\t \]+if .argc.*\{" "stub continue" + } +} + +# +# run until the breakpoint at a line number +# +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:64.*64\[\t \]+printf.*factorial.*" \ + "run until breakpoint set at a line number" + +# +# Run until the breakpoint set in a function in a file +# +for {set i 6} {$i >= 1} {incr i -1} { + gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, factorial \\(value=$i\\) at .*$srcfile:76.*76\[\t \]+if .value > 1. \{" \ + "run until file:function($i) breakpoint" +} + +# +# run until the file:function breakpoint at a line number in a file +# +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:70.*70\[\t \]+return 0;" \ + "run until file:linenum breakpoint" + +# +# delete all breakpoints so we can start over, course this can be a test too +# +delete_breakpoints + +# +# test temporary breakpoint at function +# + +gdb_test "tbreak main" "Breakpoint.*at.* file .*$srcfile, line.*" "Temporary breakpoint function" + +# +# test break at function in file +# + +gdb_test "tbreak $srcfile:factorial" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "Temporary breakpoint function in file" + +# +# test break at line number +# +send_gdb "tbreak 64\n" +gdb_expect { + -re "Breakpoint.*at.* file .*$srcfile, line 64.*$gdb_prompt $" { pass "Temporary breakpoint line number #1" } + -re ".*$gdb_prompt $" { pass "Temporary breakpoint line number #1" } + timeout { fail "breakpoint line number #1 (timeout)" } +} + +gdb_test "tbreak 60" "Breakpoint.*at.* file .*$srcfile, line 60.*" "Temporary breakpoint line number #2" + +# +# test break at line number in file +# +send_gdb "tbreak $srcfile:70\n" +gdb_expect { + -re "Breakpoint.*at.* file .*$srcfile, line 70.*$gdb_prompt $" { pass "Temporary breakpoint line number in file #1" } + -re ".*$gdb_prompt $" { pass "Temporary breakpoint line number in file #1" } + timeout { fail "Temporary breakpoint line number in file #1 (timeout)" } +} + +gdb_test "tbreak $srcfile:66" "Breakpoint.*at.* file .*$srcfile, line 66.*" "Temporary breakpoint line number in file #2" + +# +# check to see what breakpoints are set (temporary this time) +# +gdb_test "info break" "Num Type.*Disp Enb Address.*What.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$main_line.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in factorial at .*$srcfile:76.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:64.*\[\r\n\]\[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:70.*" "Temporary breakpoint info" + + +#*********** + +# Verify that catchpoints for fork, vfork and exec don't trigger +# inappropriately. (There are no calls to those system functions +# in this test program.) +# +if ![runto_main] then { fail "break tests suppressed" } + +send_gdb "catch\n" +gdb_expect { + -re "Catch requires an event name.*$gdb_prompt $"\ + {pass "catch requires an event name"} + -re "$gdb_prompt $"\ + {fail "catch requires an event name"} + timeout {fail "(timeout) catch requires an event name"} +} + + +set name "set catch fork, never expected to trigger" +send_gdb "catch fork\n" +gdb_expect { + -re "Catchpoint \[0-9\]* .fork..*$gdb_prompt $" + {pass $name} + -re "Catch of fork not yet implemented.*$gdb_prompt $" + {pass $name} + -re "$gdb_prompt $" + {fail $name} + timeout {fail "(timeout) $name"} +} + + +set name "set catch vfork, never expected to trigger" +send_gdb "catch vfork\n" + +# If we are on HP-UX 10.20, we expect an error message to be +# printed if we type "catch vfork" at the gdb gdb_prompt. This is +# because on HP-UX 10.20, we cannot catch vfork events. + +if [istarget "hppa*-hp-hpux10.20"] then { + gdb_expect { + -re "Catch of vfork events not supported on HP-UX 10.20..*$gdb_prompt $" + {pass $name} + -re "$gdb_prompt $" + {fail $name} + timeout {fail "(timeout) $name"} + } +} else { + gdb_expect { + -re "Catchpoint \[0-9\]* .vfork..*$gdb_prompt $" + {pass $name} + -re "Catch of vfork not yet implemented.*$gdb_prompt $" + {pass $name} + -re "$gdb_prompt $" + {fail $name} + timeout {fail "(timeout) $name"} + } +} + +set name "set catch exec, never expected to trigger" +send_gdb "catch exec\n" +gdb_expect { + -re "Catchpoint \[0-9\]* .exec..*$gdb_prompt $" + {pass $name} + -re "Catch of exec not yet implemented.*$gdb_prompt $" + {pass $name} + -re "$gdb_prompt $" {fail $name} + timeout {fail "(timeout) $name"} +} + +# Verify that "until " works. (This is really just syntactic +# sugar for "tbreak ; continue".) +# +send_gdb "until 64\n" +gdb_expect { + -re "main .* at .*:64.*$gdb_prompt $"\ + {pass "until 64"} + -re "$gdb_prompt $"\ + {fail "until 64"} + timeout {fail "(timeout) until 64"} +} + +# Verify that a malformed "until" is gracefully caught. +# +send_gdb "until 65 then stop\n" +gdb_expect { + -re "Junk at end of arguments..*$gdb_prompt $"\ + {pass "malformed until"} + -re "$gdb_prompt $"\ + {fail "malformed until"} + timeout {fail "(timeout) malformed until"} +} + +# Verify that GDB responds gracefully when asked to set a breakpoint +# on a nonexistent source line. +# +send_gdb "break 999\n" +gdb_expect { + -re "No line 999 in file .*$gdb_prompt $"\ + {pass "break on non-existent source line"} + -re "$gdb_prompt $"\ + {fail "break on non-existent source line"} + timeout {fail "(timeout) break on non-existent source line"} +} + +# Verify that GDB allows one to just say "break", which is treated +# as the "default" breakpoint. Note that GDB gets cute when printing +# the informational message about other breakpoints at the same +# location. We'll hit that bird with this stone too. +# +send_gdb "break\n" +gdb_expect { + -re "Breakpoint \[0-9\]*.*$gdb_prompt $"\ + {pass "break on default location, 1st time"} + -re "$gdb_prompt $"\ + {fail "break on default location, 1st time"} + timeout {fail "(timeout) break on default location, 1st time"} +} + +send_gdb "break\n" +gdb_expect { + -re "Note: breakpoint \[0-9\]* also set at .*Breakpoint \[0-9\]*.*$gdb_prompt $"\ + {pass "break on default location, 2nd time"} + -re "$gdb_prompt $"\ + {fail "break on default location, 2nd time"} + timeout {fail "(timeout) break on default location, 2nd time"} +} + +send_gdb "break\n" +gdb_expect { + -re "Note: breakpoints \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*$gdb_prompt $"\ + {pass "break on default location, 3rd time"} + -re "$gdb_prompt $"\ + {fail "break on default location, 3rd time"} + timeout {fail "(timeout) break on default location, 3rd time"} +} + +send_gdb "break\n" +gdb_expect { + -re "Note: breakpoints \[0-9\]*, \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*$gdb_prompt $"\ + {pass "break on default location, 4th time"} + -re "$gdb_prompt $"\ + {fail "break on default location, 4th time"} + timeout {fail "(timeout) break on default location, 4th time"} +} + +# Verify that a "silent" breakpoint can be set, and that GDB is indeed +# "silent" about its triggering. +# +if ![runto_main] then { fail "break tests suppressed" } + +send_gdb "break 64\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 64.*$gdb_prompt $"\ + {pass "set to-be-silent break 64"} + -re "$gdb_prompt $"\ + {fail "set to-be-silent break 64"} + timeout {fail "(timeout) set to-be-silent break 64"} +} + +send_gdb "commands $expect_out(1,string)\n" +send_gdb "silent\n" +send_gdb "end\n" +gdb_expect { + -re ".*$gdb_prompt $"\ + {pass "set silent break 64"} + timeout {fail "(timeout) set silent break 64"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re "\[0-9\]*\[ \t\]*breakpoint.*:64\r\n\[ \t\]*silent.*$gdb_prompt $"\ + {pass "info silent break 64"} + -re "$gdb_prompt $"\ + {fail "info silent break 64"} + timeout {fail "(timeout) info silent break 64"} +} +send_gdb "continue\n" +gdb_expect { + -re "Continuing.\r\n$gdb_prompt $"\ + {pass "hit silent break 64"} + -re "$gdb_prompt $"\ + {fail "hit silent break 64"} + timeout {fail "(timeout) hit silent break 64"} +} +send_gdb "bt\n" +gdb_expect { + -re "#0 main .* at .*:64.*$gdb_prompt $"\ + {pass "stopped for silent break 64"} + -re "$gdb_prompt $"\ + {fail "stopped for silent break 64"} + timeout {fail "(timeout) stopped for silent break 64"} +} + +# Verify that GDB can at least parse a breakpoint with the +# "thread" keyword. (We won't attempt to test here that a +# thread-specific breakpoint really triggers appropriately. +# The gdb.threads subdirectory contains tests for that.) +# +send_gdb "break 65 thread 999\n" +gdb_expect { + -re "Unknown thread 999.*$gdb_prompt $"\ + {pass "thread-specific breakpoint on non-existent thread disallowed"} + -re "$gdb_prompt $"\ + {fail "thread-specific breakpoint on non-existent thread disallowed"} + timeout {fail "(timeout) thread-specific breakpoint on non-existent thread disallowed"} +} +send_gdb "break 65 thread foo\n" +gdb_expect { + -re "Junk after thread keyword..*$gdb_prompt $"\ + {pass "thread-specific breakpoint on bogus thread ID disallowed"} + -re "$gdb_prompt $"\ + {fail "thread-specific breakpoint on bogus thread ID disallowed"} + timeout {fail "(timeout) thread-specific breakpoint on bogus thread ID disallowed"} +} + +# Verify that GDB responds gracefully to a breakpoint command with +# trailing garbage. +# +send_gdb "break 65 foo\n" +gdb_expect { + -re "Junk at end of arguments..*$gdb_prompt $"\ + {pass "breakpoint with trailing garbage disallowed"} + -re "$gdb_prompt $"\ + {fail "breakpoint with trailing garbage disallowed"} + timeout {fail "(timeout) breakpoint with trailing garbage disallowed"} +} + +# Verify that GDB responds gracefully to a "clear" command that has +# no matching breakpoint. (First, get us off the current source line, +# which we know has a breakpoint.) +# +send_gdb "next\n" +gdb_expect { + -re ".*$gdb_prompt $"\ + {pass "step over breakpoint"} + timeout {fail "(timeout) step over breakpoint"} +} +send_gdb "clear 66\n" +gdb_expect { + -re "No breakpoint at 66..*$gdb_prompt $"\ + {pass "clear line has no breakpoint disallowed"} + -re "$gdb_prompt $"\ + {fail "clear line has no breakpoint disallowed"} + timeout {fail "(timeout) clear line has no breakpoint disallowed"} +} +send_gdb "clear\n" +gdb_expect { + -re "No breakpoint at this line..*$gdb_prompt $"\ + {pass "clear current line has no breakpoint disallowed"} + -re "$gdb_prompt $"\ + {fail "clear current line has no breakpoint disallowed"} + timeout {fail "(timeout) clear current line has no breakpoint disallowed"} +} + +# Verify that a breakpoint can be set via a convenience variable. +# +send_gdb "set \$foo=66\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "set convenience variable \$foo to 66"} + timeout {fail "(timeout) set convenience variable \$foo to 66"} +} +send_gdb "break \$foo\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 66.*$gdb_prompt $"\ + {pass "set breakpoint via convenience variable"} + -re "$gdb_prompt $"\ + {fail "set breakpoint via convenience variable"} + timeout {fail "(timeout) set breakpoint via convenience variable"} +} + +# Verify that GDB responds gracefully to an attempt to set a +# breakpoint via a convenience variable whose type is not integer. +# +send_gdb "set \$foo=66.5\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "set convenience variable \$foo to 66.5"} + timeout {fail "(timeout) set convenience variable \$foo to 66.5"} +} +send_gdb "break \$foo\n" +gdb_expect { + -re "Convenience variables used in line specs must have integer values..*$gdb_prompt $"\ + {pass "set breakpoint via non-integer convenience variable disallowed"} + -re "$gdb_prompt $"\ + {fail "set breakpoint via non-integer convenience variable disallowed"} + timeout {fail "(timeout) set breakpoint via non-integer convenience variable disallowed"} +} + +# Verify that we can set and trigger a breakpoint in a user-called function. +# +send_gdb "break marker2\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 42.*$gdb_prompt $"\ + {pass "set breakpoint on to-be-called function"} + -re "$gdb_prompt $"\ + {fail "set breakpoint on to-be-called function"} + timeout {fail "(timeout) set breakpoint on to-be-called function"} +} +send_gdb "print marker2(99)\n" +gdb_expect { + -re "The program being debugged stopped while in a function called from GDB.\r\nWhen the function .marker2. is done executing, GDB will silently\r\nstop .instead of continuing to evaluate the expression containing\r\nthe function call...*$gdb_prompt $"\ + {pass "hit breakpoint on called function"} + -re "$gdb_prompt $"\ + {fail "hit breakpoint on called function"} + timeout {fail "(timeout) hit breakpoint on called function"} +} + +# As long as we're stopped (breakpointed) in a called function, +# verify that we can successfully backtrace & such from here. +# +if [istarget "hppa*-*-hpux*"] then { + send_gdb "bt\n" + gdb_expect { + -re "#0\[ \t\]*marker2.*:42\r\n#1.*_sr4export.*$gdb_prompt $"\ + {pass "backtrace while in called function"} + -re "$gdb_prompt $"\ + {fail "backtrace while in called function"} + timeout {fail "(timeout) backtrace while in called function"} + } + send_gdb "finish\n" + gdb_expect { + -re "Run till exit from .*marker2.* at .*42\r\n.* in _sr4export.*$gdb_prompt $"\ + {pass "finish from called function"} + -re "$gdb_prompt $"\ + {fail "finish from called function"} + timeout {fail "(timeout) finish from called function"} + } +} + +# Verify that GDB responds gracefully to a "finish" command with +# arguments. +# +if ![runto_main] then { fail "break tests suppressed" } + +send_gdb "finish 123\n" +gdb_expect { + -re "The \"finish\" command does not take any arguments.\r\n$gdb_prompt $"\ + {pass "finish with arguments disallowed"} + -re "$gdb_prompt $"\ + {fail "finish with arguments disallowed"} + timeout {fail "(timeout) finish with arguments disallowed"} +} + +# Verify that GDB responds gracefully to a request to "finish" from +# the outermost frame. +# +send_gdb "finish\n" +gdb_expect { + -re "\"finish\" not meaningful in the outermost frame.\r\n$gdb_prompt $"\ + {pass "finish from outermost frame disallowed"} + -re "$gdb_prompt $"\ + {fail "finish from outermost frame disallowed"} + timeout {fail "(timeout) finish from outermost frame disallowed"} +} + +# Verify that we can explicitly ask GDB to stop on all shared library +# events, and that it does so. +# +if [istarget "hppa*-*-hpux*"] then { + if ![runto_main] then { fail "break tests suppressed" } + + send_gdb "set stop-on-solib-events 1\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "set stop-on-solib-events"} + timeout {fail "(timeout) set stop-on-solib-events"} + } + + send_gdb "run\n" + gdb_expect { + -re ".*Start it from the beginning.*y or n. $"\ + {send_gdb "y\n" + gdb_expect { + -re ".*Stopped due to shared library event.*$gdb_prompt $"\ + {pass "triggered stop-on-solib-events"} + -re "$gdb_prompt $"\ + {fail "triggered stop-on-solib-events"} + timeout {fail "(timeout) triggered stop-on-solib-events"} + } + } + -re "$gdb_prompt $"\ + {fail "rerun for stop-on-solib-events"} + timeout {fail "(timeout) rerun for stop-on-solib-events"} + } + + send_gdb "set stop-on-solib-events 0\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "reset stop-on-solib-events"} + timeout {fail "(timeout) reset stop-on-solib-events"} + } +} + +# Hardware breakpoints are unsupported on HP-UX. Verify that GDB +# gracefully responds to requests to create them. +# +if [istarget "hppa*-*-hpux*"] then { + if ![runto_main] then { fail "break tests suppressed" } + + send_gdb "hbreak\n" + gdb_expect { + -re "No hardware breakpoint support in the target.*$gdb_prompt $"\ + {pass "hw breaks disallowed"} + -re "$gdb_prompt $"\ + {fail "hw breaks disallowed"} + timeout {fail "(timeout) hw breaks disallowed"} + } + + send_gdb "thbreak\n" + gdb_expect { + -re "No hardware breakpoint support in the target.*$gdb_prompt $"\ + {pass "temporary hw breaks disallowed"} + -re "$gdb_prompt $"\ + {fail "temporary hw breaks disallowed"} + timeout {fail "(timeout) temporary hw breaks disallowed"} + } +} + +#******** + + +proc test_clear_command {} { + gdb_test "break main" "Breakpoint.*at.*" "break main #1" + gdb_test "break main" "Breakpoint.*at.*" "break main #2" + + # We don't test that it deletes the correct breakpoints. We do at + # least test that it deletes more than one breakpoint. + gdb_test "clear main" {Deleted breakpoints [0-9]+ [0-9]+.*} +} + +# +# Test "next" over recursive function call. +# + +proc test_next_with_recursion {} { + global gdb_prompt + global decimal + global binfile + + if [target_info exists use_gdb_stub] { + # Reload the program. + delete_breakpoints + gdb_load ${binfile}; + } else { + # FIXME: should be using runto + gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y" + + delete_breakpoints + } + + gdb_test "break factorial" "Breakpoint $decimal at .*" "break at factorial" + + # Run until we call factorial with 6 + + if [istarget "*-*-vxworks*"] then { + send_gdb "run vxmain \"6\"\n" + } else { + gdb_run_cmd + } + gdb_expect { + -re "Break.* factorial .value=6. .*$gdb_prompt $" {} + -re ".*$gdb_prompt $" { + fail "run to factorial(6)"; + gdb_suppress_tests; + } + timeout { fail "run to factorial(6) (timeout)" ; gdb_suppress_tests } + } + + # Continue until we call factorial recursively with 5. + + if [gdb_test "continue" \ + "Continuing.*Break.* factorial .value=5. .*" \ + "continue to factorial(5)"] then { gdb_suppress_tests } + + # Do a backtrace just to confirm how many levels deep we are. + + if [gdb_test "backtrace" \ + "#0\[ \t\]+ factorial .value=5..*" \ + "backtrace from factorial(5)"] then { gdb_suppress_tests } + + # Now a "next" should position us at the recursive call, which + # we will be performing with 4. + + if [gdb_test "next" \ + ".* factorial .value - 1.;.*" \ + "next to recursive call"] then { gdb_suppress_tests } + + # Disable the breakpoint at the entry to factorial by deleting them all. + # The "next" should run until we return to the next line from this + # recursive call to factorial with 4. + # Buggy versions of gdb will stop instead at the innermost frame on + # the line where we are trying to "next" to. + + delete_breakpoints + + if [istarget "mips*tx39-*"] { + set timeout 60 + } else { + set timeout 20 + } + + gdb_test next "\[0-9\]*\[\t \]+return \\(value\\);.*" \ + "next over recursive call" + + # OK, we should be back in the same stack frame we started from. + # Do a backtrace just to confirm. + + set result [gdb_test "backtrace" \ + "#0\[ \t\]+ factorial .value=120.*\r\n#1\[ \t\]+ \[0-9a-fx\]+ in factorial .value=6..*" \ + "backtrace from factorial(5.1)"] + if { $result != 0 } { gdb_suppress_tests } + + if [target_info exists gdb,noresults] { gdb_suppress_tests } + if [target_info exists use_gdb_stub] { + gdb_breakpoint "exit" + gdb_test "continue" "Continuing..*Breakpoint .*exit \[(\].*=0\[)\].*" "continue until exit in recursive next test" + } else { + # Continue until we exit. Should not stop again. + # Don't bother to check the output of the program, that may be + # extremely tough for some remote systems. + gdb_test "continue"\ + "Continuing.\[\r\n0-9\]+Program exited normally\\..*"\ + "continue until exit in recursive next test" + } + gdb_stop_suppressing_tests; +} + +test_clear_command +test_next_with_recursion + +# Reset the default arguments for VxWorks +if [istarget "*-*-vxworks*"] { + set timeout 10 + verbose "Timeout is now $timeout seconds" 2 + send_gdb "set args main\n" + gdb_expect -re ".*$gdb_prompt $" {} +} diff --git a/gdb/testsuite/gdb.base/call-ar-st.c b/gdb/testsuite/gdb.base/call-ar-st.c new file mode 100644 index 00000000000..c61977afb8e --- /dev/null +++ b/gdb/testsuite/gdb.base/call-ar-st.c @@ -0,0 +1,1137 @@ + +#include +#include +#include + +/************************************************************************** + * TESTS : + * -- function arguments that are enumerated types + * -- small structure arguments ( <= 64 bits ) + * -- stored in registers + * -- stored on the stack + * -- large structure arguments ( > 64 bits ) + * -- stored in registers + * -- stored on the stack + * -- array arguments + * -- caller is a leaf routine : + * -- use the call command from within an init routine (i.e. + * init_bit_flags, init_bit_flags_combo, init_array_rep) + * -- caller doesn't have enough space for all the function arguments : + * -- call print_long_arg_list from inside print_small_structs + ***************************************************************************/ + +/* Some enumerated types -- used to test that the structureal data type is + * retrieved for function arguments with typedef data types. + */ +typedef int id_int; + +typedef enum { + BLACK, + BLUE, + BROWN, + ECRUE, + GOLD, + GRAY, + GREEN, + IVORY, + MAUVE, + ORANGE, + PINK, + PURPLE, + RED, + SILVER, + TAN, + VIOLET, + WHITE, + YELLOW} colors; + +/* A large structure (> 64 bits) used to test passing large structures as + * parameters + */ + +struct array_rep_info_t { + int next_index[10]; + int values[10]; + int head; +}; + +/***************************************************************************** + * Small structures ( <= 64 bits). These are used to test passing small + * structures as parameters and test argument size promotion. + *****************************************************************************/ + + /* 64 bits + */ +struct small_rep_info_t { + int value; + int head; +}; + +/* 6 bits : really fits in 8 bits and is promoted to 32 bits + */ +struct bit_flags_t { + unsigned alpha :1; + unsigned beta :1; + unsigned gamma :1; + unsigned delta :1; + unsigned epsilon :1; + unsigned omega :1; +}; + +/* 22 bits : really fits in 40 bits and is promoted to 64 bits + */ +struct bit_flags_combo_t { + unsigned alpha :1; + unsigned beta :1; + char ch1; + unsigned gamma :1; + unsigned delta :1; + char ch2; + unsigned epsilon :1; + unsigned omega :1; +}; + +/* 64 bits + */ +struct one_double_t { + double double1; +}; + +/* 64 bits + */ +struct two_floats_t { + float float1; + float float2; +}; + +/* 16 bits : promoted to 32 bits + */ +struct two_char_t { + char ch1; + char ch2; +}; + +/* 24 bits : promoted to 32 bits + */ +struct three_char_t { + char ch1; + char ch2; + char ch3; +}; + +/* 40 bits : promoted to 64 bits + */ +struct five_char_t { + char ch1; + char ch2; + char ch3; + char ch4; + char ch5; +}; + +/* 40 bits : promoted to 64 bits + */ +struct int_char_combo_t { + int int1; + char ch1; +}; + +/***************************************************************** + * PRINT_STUDENT_ID_SHIRT_COLOR : + * IN id_int student -- enumerated type + * IN colors shirt -- enumerated type + *****************************************************************/ +void print_student_id_shirt_color ( student, shirt ) + id_int student; + colors shirt; +{ + + printf("student id : %d\t", student); + printf("shirt color : "); + switch (shirt) { + case BLACK : printf("BLACK\n"); + break; + case BLUE : printf("BLUE\n"); + break; + case BROWN : printf("BROWN\n"); + break; + case ECRUE : printf("ECRUE\n"); + break; + case GOLD : printf("GOLD\n"); + break; + case GRAY : printf("GRAY\n"); + break; + case GREEN : printf("GREEN\n"); + break; + case IVORY : printf("IVORY\n"); + break; + case MAUVE : printf("MAUVE\n"); + break; + case ORANGE : printf("ORANGE\n"); + break; + case PINK : printf("PINK\n"); + break; + case PURPLE : printf("PURPLE\n"); + break; + case RED : printf("RED\n"); + break; + case SILVER : printf("SILVER\n"); + break; + case TAN : printf("TAN\n"); + break; + case VIOLET : printf("VIOLET\n"); + break; + case WHITE : printf("WHITE\n"); + break; + case YELLOW : printf("YELLOW\n"); + break; + } +} + +/***************************************************************** + * PRINT_CHAR_ARRAY : + * IN char array_c[] -- character array + *****************************************************************/ +void print_char_array ( array_c ) + char array_c[]; + +{ + + int index; + + printf("array_c :\n"); + printf("=========\n\n"); + for (index = 0; index < 120; index++) { + printf("%1c", array_c[index]); + if ((index%50) == 0) printf("\n"); + } + printf("\n\n"); +} + +/***************************************************************** + * PRINT_DOUBLE_ARRAY : + * IN double array_d[] -- array of doubles + *****************************************************************/ +void print_double_array (array_d) + double array_d[]; + +{ + + int index; + + printf("array_d :\n"); + printf("=========\n\n"); + for (index = 0; index < 100; index++) { + printf("%f ", array_d[index]); + if ((index%8) == 0) printf("\n"); + } + printf("\n\n"); +} + +/***************************************************************** + * PRINT_FLOAT_ARRAY: + * IN float array_f[] -- array of floats + *****************************************************************/ +void print_float_array ( array_f ) + float array_f[]; + +{ + + int index; + + printf("array_f :\n"); + printf("=========\n\n"); + for (index = 0; index < 15; index++) { + printf("%f ", array_f[index]); + if ((index%8) == 0) printf("\n"); + + } + printf("\n\n"); +} + +/***************************************************************** + * PRINT_INT_ARRAY: + * IN int array_i[] -- array of integers + *****************************************************************/ +void print_int_array ( array_i ) + int array_i[]; + +{ + + int index; + + printf("array_i :\n"); + printf("=========\n\n"); + for (index = 0; index < 50; index++) { + printf("%d ", array_i[index]); + if ((index%8) == 0) printf("\n"); + } + printf("\n\n"); + +} + +/***************************************************************** + * PRINT_ALL_ARRAYS: + * IN int array_i[] -- array of integers + * IN char array_c[] -- array of characters + * IN float array_f[] -- array of floats + * IN double array_d[] -- array of doubles + *****************************************************************/ +void print_all_arrays( array_i, array_c, array_f, array_d ) + int array_i[]; + char array_c[]; + float array_f[]; + double array_d[]; + +{ + print_int_array(array_i); + print_char_array(array_c); + print_float_array(array_f); + print_double_array(array_d); +} + +/***************************************************************** + * LOOP_COUNT : + * A do nothing function. Used to provide a point at which calls can be made. + *****************************************************************/ +void loop_count () { + + int index; + + for (index=0; index<4; index++); +} + +/***************************************************************** + * COMPUTE_WITH_SMALL_STRUCTS : + * A do nothing function. Used to provide a point at which calls can be made. + * IN int seed + *****************************************************************/ +void compute_with_small_structs ( seed ) + int seed; +{ + + struct small_rep_info_t array[4]; + int index; + + for (index = 0; index < 4; index++) { + array[index].value = index*seed; + array[index].head = (index+1)*seed; + } + + for (index = 1; index < 4; index++) { + array[index].value = array[index].value + array[index-1].value; + array[index].head = array[index].head + array[index-1].head; + } +} + +/***************************************************************** + * INIT_BIT_FLAGS : + * Initializes a bit_flags_t structure. Can call this function see + * the call command behavior when integer arguments do not fit into + * registers and must be placed on the stack. + * OUT struct bit_flags_t *bit_flags -- structure to be filled + * IN unsigned a -- 0 or 1 + * IN unsigned b -- 0 or 1 + * IN unsigned g -- 0 or 1 + * IN unsigned d -- 0 or 1 + * IN unsigned e -- 0 or 1 + * IN unsigned o -- 0 or 1 + *****************************************************************/ +void init_bit_flags ( bit_flags, a, b, g, d, e, o ) +struct bit_flags_t *bit_flags; +unsigned a; +unsigned b; +unsigned g; +unsigned d; +unsigned e; +unsigned o; +{ + + bit_flags->alpha = a; + bit_flags->beta = b; + bit_flags->gamma = g; + bit_flags->delta = d; + bit_flags->epsilon = e; + bit_flags->omega = o; +} + +/***************************************************************** + * INIT_BIT_FLAGS_COMBO : + * Initializes a bit_flags_combo_t structure. Can call this function + * to see the call command behavior when integer and character arguments + * do not fit into registers and must be placed on the stack. + * OUT struct bit_flags_combo_t *bit_flags_combo -- structure to fill + * IN unsigned a -- 0 or 1 + * IN unsigned b -- 0 or 1 + * IN char ch1 + * IN unsigned g -- 0 or 1 + * IN unsigned d -- 0 or 1 + * IN char ch2 + * IN unsigned e -- 0 or 1 + * IN unsigned o -- 0 or 1 + *****************************************************************/ +void init_bit_flags_combo ( bit_flags_combo, a, b, ch1, g, d, ch2, e, o ) + struct bit_flags_combo_t *bit_flags_combo; + unsigned a; + unsigned b; + char ch1; + unsigned g; + unsigned d; + char ch2; + unsigned e; + unsigned o; +{ + + bit_flags_combo->alpha = a; + bit_flags_combo->beta = b; + bit_flags_combo->ch1 = ch1; + bit_flags_combo->gamma = g; + bit_flags_combo->delta = d; + bit_flags_combo->ch2 = ch2; + bit_flags_combo->epsilon = e; + bit_flags_combo->omega = o; +} + + +/***************************************************************** + * INIT_ONE_DOUBLE : + * OUT struct one_double_t *one_double -- structure to fill + * IN double init_val + *****************************************************************/ +void init_one_double ( one_double, init_val ) + struct one_double_t *one_double; + double init_val; +{ + + one_double->double1 = init_val; +} + +/***************************************************************** + * INIT_TWO_FLOATS : + * OUT struct two_floats_t *two_floats -- structure to be filled + * IN float init_val1 + * IN float init_val2 + *****************************************************************/ +void init_two_floats ( two_floats, init_val1, init_val2 ) + struct two_floats_t *two_floats; + float init_val1; + float init_val2; +{ + two_floats->float1 = init_val1; + two_floats->float2 = init_val2; +} + +/***************************************************************** + * INIT_TWO_CHARS : + * OUT struct two_char_t *two_char -- structure to be filled + * IN char init_val1 + * IN char init_val2 + *****************************************************************/ +void init_two_chars ( two_char, init_val1, init_val2 ) + struct two_char_t *two_char; + char init_val1; + char init_val2; +{ + + two_char->ch1 = init_val1; + two_char->ch2 = init_val2; +} + +/***************************************************************** + * INIT_THREE_CHARS : + * OUT struct three_char_t *three_char -- structure to be filled + * IN char init_val1 + * IN char init_val2 + * IN char init_val3 + *****************************************************************/ +void init_three_chars ( three_char, init_val1, init_val2, init_val3 ) + struct three_char_t *three_char; + char init_val1; + char init_val2; + char init_val3; +{ + + three_char->ch1 = init_val1; + three_char->ch2 = init_val2; + three_char->ch3 = init_val3; +} + +/***************************************************************** + * INIT_FIVE_CHARS : + * OUT struct five_char_t *five_char -- structure to be filled + * IN char init_val1 + * IN char init_val2 + * IN char init_val3 + * IN char init_val4 + * IN char init_val5 + *****************************************************************/ +void init_five_chars ( five_char, init_val1, init_val2, init_val3,init_val4,init_val5 ) + struct five_char_t *five_char; + char init_val1; + char init_val2; + char init_val3; + char init_val4; + char init_val5; +{ + five_char->ch1 = init_val1; + five_char->ch2 = init_val2; + five_char->ch3 = init_val3; + five_char->ch4 = init_val4; + five_char->ch5 = init_val5; +} + +/***************************************************************** + * INIT_INT_CHAR_COMBO : + * OUT struct int_char_combo_t *combo -- structure to be filled + * IN int init_val1 + * IN char init_val2 + *****************************************************************/ +void init_int_char_combo ( combo, init_val1, init_val2 ) + struct int_char_combo_t *combo; + int init_val1; + char init_val2; +{ + + combo->int1 = init_val1; + combo->ch1 = init_val2; +} + +/***************************************************************** + * INIT_STRUCT_REP : + * OUT struct small_rep_into_t *small_struct -- structure to be filled + * IN int seed + *****************************************************************/ +void init_struct_rep( small_struct, seed ) + struct small_rep_info_t *small_struct; + int seed; + +{ + + small_struct->value = 2 + (seed*2); + small_struct->head = 0; +} + +/***************************************************************** + * INIT_SMALL_STRUCTS : + * Takes all the small structures as input and calls the appropriate + * initialization routine for each structure + *****************************************************************/ +void init_small_structs (struct1, struct2, struct3,struct4,flags,flags_combo, +three_char, five_char,int_char_combo, d1, d2,d3,f1,f2,f3) + struct small_rep_info_t *struct1; + struct small_rep_info_t *struct2; + struct small_rep_info_t *struct3; + struct small_rep_info_t *struct4; + struct bit_flags_t *flags; + struct bit_flags_combo_t *flags_combo; + struct three_char_t *three_char; + struct five_char_t *five_char; + struct int_char_combo_t *int_char_combo; + struct one_double_t *d1; + struct one_double_t *d2; + struct one_double_t *d3; + struct two_floats_t *f1; + struct two_floats_t *f2; + struct two_floats_t *f3; + +{ + + init_bit_flags(flags, (unsigned)1, (unsigned)0, (unsigned)1, + (unsigned)0, (unsigned)1, (unsigned)0 ); + init_bit_flags_combo(flags_combo, (unsigned)1, (unsigned)0, 'y', + (unsigned)1, (unsigned)0, 'n', + (unsigned)1, (unsigned)0 ); + init_three_chars(three_char, 'a', 'b', 'c'); + init_five_chars(five_char, 'l', 'm', 'n', 'o', 'p'); + init_int_char_combo(int_char_combo, 123, 'z'); + init_struct_rep(struct1, 2); + init_struct_rep(struct2, 4); + init_struct_rep(struct3, 5); + init_struct_rep(struct4, 6); + init_one_double ( d1, 10.5); + init_one_double ( d2, -3.34); + init_one_double ( d3, 675.09123); + init_two_floats ( f1, 45.234, 43.6); + init_two_floats ( f2, 78.01, 122.10); + init_two_floats ( f3, -1232.345, -199.21); +} + +/***************************************************************** + * PRINT_TEN_DOUBLES : + * ????????????????????????????? + ****************************************************************/ +void print_ten_doubles ( d1, d2, d3, d4, d5, d6, d7, d8, d9, d10 ) + double d1; + double d2; + double d3; + double d4; + double d5; + double d6; + double d7; + double d8; + double d9; + double d10; +{ + + printf("Two Doubles : %f\t%f\n", d1, d2); + printf("Two Doubles : %f\t%f\n", d3, d4); + printf("Two Doubles : %f\t%f\n", d5, d6); + printf("Two Doubles : %f\t%f\n", d7, d8); + printf("Two Doubles : %f\t%f\n", d9, d10); +} + +/***************************************************************** + * PRINT_BIT_FLAGS : + * IN struct bit_flags_t bit_flags + ****************************************************************/ +void print_bit_flags ( bit_flags ) +struct bit_flags_t bit_flags; +{ + + if (bit_flags.alpha) printf("alpha\n"); + if (bit_flags.beta) printf("beta\n"); + if (bit_flags.gamma) printf("gamma\n"); + if (bit_flags.delta) printf("delta\n"); + if (bit_flags.epsilon) printf("epsilon\n"); + if (bit_flags.omega) printf("omega\n"); +} + +/***************************************************************** + * PRINT_BIT_FLAGS_COMBO : + * IN struct bit_flags_combo_t bit_flags_combo + ****************************************************************/ +void print_bit_flags_combo ( bit_flags_combo ) +struct bit_flags_combo_t bit_flags_combo; +{ + + if (bit_flags_combo.alpha) printf("alpha\n"); + if (bit_flags_combo.beta) printf("beta\n"); + if (bit_flags_combo.gamma) printf("gamma\n"); + if (bit_flags_combo.delta) printf("delta\n"); + if (bit_flags_combo.epsilon) printf("epsilon\n"); + if (bit_flags_combo.omega) printf("omega\n"); + printf("ch1: %c\tch2: %c\n", bit_flags_combo.ch1, bit_flags_combo.ch2); +} + +/***************************************************************** + * PRINT_ONE_DOUBLE : + * IN struct one_double_t one_double + ****************************************************************/ +void print_one_double ( one_double ) +struct one_double_t one_double; +{ + + printf("Contents of one_double_t: \n\n"); + printf("%f\n", one_double.double1); +} + +/***************************************************************** + * PRINT_TWO_FLOATS : + * IN struct two_floats_t two_floats + ****************************************************************/ +void print_two_floats ( two_floats ) +struct two_floats_t two_floats; +{ + + printf("Contents of two_floats_t: \n\n"); + printf("%f\t%f\n", two_floats.float1, two_floats.float2); +} + +/***************************************************************** + * PRINT_TWO_CHARS : + * IN struct two_char_t two_char + ****************************************************************/ +void print_two_chars ( two_char ) +struct two_char_t two_char; +{ + + printf("Contents of two_char_t: \n\n"); + printf("%c\t%c\n", two_char.ch1, two_char.ch2); +} + +/***************************************************************** + * PRINT_THREE_CHARS : + * IN struct three_char_t three_char + ****************************************************************/ +void print_three_chars ( three_char ) +struct three_char_t three_char; +{ + + printf("Contents of three_char_t: \n\n"); + printf("%c\t%c\t%c\n", three_char.ch1, three_char.ch2, three_char.ch3); +} + +/***************************************************************** + * PRINT_FIVE_CHARS : + * IN struct five_char_t five_char + ****************************************************************/ +void print_five_chars ( five_char ) +struct five_char_t five_char; +{ + + printf("Contents of five_char_t: \n\n"); + printf("%c\t%c\t%c\t%c\t%c\n", five_char.ch1, five_char.ch2, + five_char.ch3, five_char.ch4, + five_char.ch5); +} + +/***************************************************************** + * PRINT_INT_CHAR_COMBO : + * IN struct int_char_combo_t int_char_combo + ****************************************************************/ +void print_int_char_combo ( int_char_combo ) +struct int_char_combo_t int_char_combo; +{ + + printf("Contents of int_char_combo_t: \n\n"); + printf("%d\t%c\n", int_char_combo.int1, int_char_combo.ch1); +} + +/***************************************************************** + * PRINT_STRUCT_REP : + * The last parameter must go onto the stack rather than into a register. + * This is a good function to call to test small structures. + * IN struct small_rep_info_t struct1 + * IN struct small_rep_info_t struct2 + * IN struct small_rep_info_t struct3 + ****************************************************************/ +void print_struct_rep( struct1, struct2, struct3) + struct small_rep_info_t struct1; + struct small_rep_info_t struct2; + struct small_rep_info_t struct3; + +{ + + + printf("Contents of struct1: \n\n"); + printf("%10d%10d\n", struct1.value, struct1.head); + printf("Contents of struct2: \n\n"); + printf("%10d%10d\n", struct2.value, struct2.head); + printf("Contents of struct3: \n\n"); + printf("%10d%10d\n", struct3.value, struct3.head); + +} + +/***************************************************************** + * SUM_STRUCT_PRINT : + * The last two parameters must go onto the stack rather than into a register. + * This is a good function to call to test small structures. + * IN struct small_rep_info_t struct1 + * IN struct small_rep_info_t struct2 + * IN struct small_rep_info_t struct3 + * IN struct small_rep_info_t struct4 + ****************************************************************/ +void sum_struct_print ( seed, struct1, struct2, struct3, struct4) + int seed; + struct small_rep_info_t struct1; + struct small_rep_info_t struct2; + struct small_rep_info_t struct3; + struct small_rep_info_t struct4; + +{ + int sum; + + printf("Sum of the 4 struct values and seed : \n\n"); + sum = seed + struct1.value + struct2.value + struct3.value + struct4.value; + printf("%10d\n", sum); +} + +/***************************************************************** + * PRINT_SMALL_STRUCTS : + * This is a good function to call to test small structures. + * All of the small structures of odd sizes (40 bits, 8bits, etc.) + * are pushed onto the stack. + ****************************************************************/ +void print_small_structs ( struct1, struct2, struct3, struct4, flags, +flags_combo, three_char, five_char, int_char_combo, d1, d2,d3,f1,f2,f3) + struct small_rep_info_t struct1; + struct small_rep_info_t struct2; + struct small_rep_info_t struct3; + struct small_rep_info_t struct4; + struct bit_flags_t flags; + struct bit_flags_combo_t flags_combo; + struct three_char_t three_char; + struct five_char_t five_char; + struct int_char_combo_t int_char_combo; + struct one_double_t d1; + struct one_double_t d2; + struct one_double_t d3; + struct two_floats_t f1; + struct two_floats_t f2; + struct two_floats_t f3; +{ + print_bit_flags(flags); + print_bit_flags_combo(flags_combo); + print_three_chars(three_char); + print_five_chars(five_char); + print_int_char_combo(int_char_combo); + sum_struct_print(10, struct1, struct2, struct3, struct4); + print_struct_rep(struct1, struct2, struct3); + print_one_double(d1); + print_one_double(d2); + print_one_double(d3); + print_two_floats(f1); + print_two_floats(f2); + print_two_floats(f3); +} + +/***************************************************************** + * PRINT_LONG_ARG_LIST : + * This is a good function to call to test small structures. + * The first two parameters ( the doubles ) go into registers. The + * remaining arguments are pushed onto the stack. Depending on where + * print_long_arg_list is called from, the size of the argument list + * may force more space to be pushed onto the stack as part of the callers + * frame. + ****************************************************************/ +void print_long_arg_list ( a, b, c, d, e, f, struct1, struct2, struct3, +struct4, flags, flags_combo, three_char, five_char, int_char_combo, d1,d2,d3, +f1, f2, f3 ) + double a; + double b; + int c; + int d; + int e; + int f; + struct small_rep_info_t struct1; + struct small_rep_info_t struct2; + struct small_rep_info_t struct3; + struct small_rep_info_t struct4; + struct bit_flags_t flags; + struct bit_flags_combo_t flags_combo; + struct three_char_t three_char; + struct five_char_t five_char; + struct int_char_combo_t int_char_combo; + struct one_double_t d1; + struct one_double_t d2; + struct one_double_t d3; + struct two_floats_t f1; + struct two_floats_t f2; + struct two_floats_t f3; + +{ + printf("double : %f\n", a); + printf("double : %f\n", b); + printf("int : %d\n", c); + printf("int : %d\n", d); + printf("int : %d\n", e); + printf("int : %d\n", f); + print_small_structs( struct1, struct2, struct3, struct4, flags, flags_combo, + three_char, five_char, int_char_combo, d1, d2, d3, + f1, f2, f3); +} + + +void print_one_large_struct( linked_list1 ) + struct array_rep_info_t linked_list1; + +{ + + /* printf("Contents of linked list1: \n\n"); + printf("Element Value | Index of Next Element\n"); + printf("-------------------------------------\n"); + printf(" | \n");*/ + /*for (index = 0; index < 10; index++) {*/ + + printf("%10d%10d\n", linked_list1.values[0], + linked_list1.next_index[0]); + /*}*/ +} + +/***************************************************************** + * PRINT_ARRAY_REP : + * The three structure parameters should fit into registers. + * IN struct array_rep_info_t linked_list1 + * IN struct array_rep_info_t linked_list2 + * IN struct array_rep_info_t linked_list3 + ****************************************************************/ +void print_array_rep( linked_list1, linked_list2, linked_list3 ) + struct array_rep_info_t linked_list1; + struct array_rep_info_t linked_list2; + struct array_rep_info_t linked_list3; + +{ + + int index; + + printf("Contents of linked list1: \n\n"); + printf("Element Value | Index of Next Element\n"); + printf("-------------------------------------\n"); + printf(" | \n"); + for (index = 0; index < 10; index++) { + + printf("%10d%10d\n", linked_list1.values[index], + linked_list1.next_index[index]); + } + + printf("Contents of linked list2: \n\n"); + printf("Element Value | Index of Next Element\n"); + printf("-------------------------------------\n"); + printf(" | \n"); + for (index = 0; index < 10; index++) { + + printf("%10d%10d\n", linked_list2.values[index], + linked_list2.next_index[index]); + } + + printf("Contents of linked list3: \n\n"); + printf("Element Value | Index of Next Element\n"); + printf("-------------------------------------\n"); + printf(" | \n"); + for (index = 0; index < 10; index++) { + + printf("%10d%10d\n", linked_list3.values[index], + linked_list3.next_index[index]); + } + +} + +/***************************************************************** + * SUM_ARRAY_PRINT : + * The last structure parameter must be pushed onto the stack + * IN int seed + * IN struct array_rep_info_t linked_list1 + * IN struct array_rep_info_t linked_list2 + * IN struct array_rep_info_t linked_list3 + * IN struct array_rep_info_t linked_list4 + ****************************************************************/ +void sum_array_print ( seed, linked_list1, linked_list2, linked_list3,linked_list4) + int seed; + struct array_rep_info_t linked_list1; + struct array_rep_info_t linked_list2; + struct array_rep_info_t linked_list3; + struct array_rep_info_t linked_list4; + +{ + int index; + int sum; + + printf("Sum of 4 arrays, by element (add in seed as well): \n\n"); + printf("Seed: %d\n", seed); + printf("Element Index | Sum \n"); + printf("-------------------------\n"); + printf(" | \n"); + + for (index = 0; index < 10; index++) { + + sum = seed + linked_list1.values[index] + linked_list2.values[index] + + linked_list3.values[index] + linked_list4.values[index]; + printf("%10d%10d\n", index, sum); + } +} + +/***************************************************************** + * INIT_ARRAY_REP : + * IN struct array_rep_info_t *linked_list + * IN int seed + ****************************************************************/ +void init_array_rep( linked_list, seed ) + struct array_rep_info_t *linked_list; + int seed; + +{ + + int index; + + for (index = 0; index < 10; index++) { + + linked_list->values[index] = (2*index) + (seed*2); + linked_list->next_index[index] = index + 1; + } + linked_list->head = 0; +} + + +int main () { + + /* variables for array and enumerated type testing + */ + char char_array[121]; + double double_array[100]; + float float_array[15]; + int integer_array[50]; + int index; + id_int student_id = 23; + colors my_shirt = YELLOW; + + /* variables for large structure testing + */ + int number = 10; + struct array_rep_info_t *list1; + struct array_rep_info_t *list2; + struct array_rep_info_t *list3; + struct array_rep_info_t *list4; + + /* variables for testing a very long argument list + */ + double a; + double b; + int c; + int d; + int e; + int f; + + /* variables for testing a small structures and a very long argument list + */ + struct small_rep_info_t *struct1; + struct small_rep_info_t *struct2; + struct small_rep_info_t *struct3; + struct small_rep_info_t *struct4; + struct bit_flags_t *flags; + struct bit_flags_combo_t *flags_combo; + struct three_char_t *three_char; + struct five_char_t *five_char; + struct int_char_combo_t *int_char_combo; + struct one_double_t *d1; + struct one_double_t *d2; + struct one_double_t *d3; + struct two_floats_t *f1; + struct two_floats_t *f2; + struct two_floats_t *f3; + + /* Initialize arrays + */ + for (index = 0; index < 120; index++) { + if ((index%2) == 0) char_array[index] = 'Z'; + else char_array[index] = 'a'; + } /* call-ar-st.exp uses line numbers everywhere */ char_array[120] = '\0'; + + for (index = 0; index < 100; index++) { + double_array[index] = index*23.4567; + } + + for (index = 0; index < 15; index++) { + float_array[index] = index/7.02; + } + + for (index = 0; index < 50; index++) { + integer_array[index] = -index; + } + + /* Print arrays + */ + print_char_array(char_array); + print_double_array(double_array); + print_float_array(float_array); + print_student_id_shirt_color(student_id, my_shirt); + print_int_array(integer_array); + print_all_arrays(integer_array, char_array, float_array, double_array); + + /* Allocate space for large structures + */ + list1 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); + list2 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); + list3 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); + list4 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); + + /* Initialize large structures + */ + init_array_rep(list1, 2); + init_array_rep(list2, 4); + init_array_rep(list3, 5); + init_array_rep(list4, 10); + printf("HELLO WORLD\n"); + printf("BYE BYE FOR NOW\n"); + printf("VERY GREEN GRASS\n"); + + /* Print large structures + */ + sum_array_print(10, *list1, *list2, *list3, *list4); + print_array_rep(*list1, *list2, *list3); + print_one_large_struct(*list1); + + /* Allocate space for small structures + */ + struct1 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); + struct2 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); + struct3 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); + struct4 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); + flags = (struct bit_flags_t *)malloc(sizeof(struct bit_flags_t)); + flags_combo = (struct bit_flags_combo_t *)malloc(sizeof(struct bit_flags_combo_t)); + three_char = (struct three_char_t *)malloc(sizeof(struct three_char_t)); + five_char = (struct five_char_t *)malloc(sizeof(struct five_char_t)); + int_char_combo = (struct int_char_combo_t *)malloc(sizeof(struct int_char_combo_t)); + + d1 = (struct one_double_t *)malloc(sizeof(struct one_double_t)); + d2 = (struct one_double_t *)malloc(sizeof(struct one_double_t)); + d3 = (struct one_double_t *)malloc(sizeof(struct one_double_t)); + + f1 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t)); + f2 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t)); + f3 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t)); + + /* Initialize small structures + */ + init_small_structs ( struct1, struct2, struct3, struct4, flags, + flags_combo, three_char, five_char, int_char_combo, + d1, d2, d3, f1, f2, f3); + + /* Print small structures + */ + print_small_structs ( *struct1, *struct2, *struct3, *struct4, *flags, + *flags_combo, *three_char, *five_char, *int_char_combo, + *d1, *d2, *d3, *f1, *f2, *f3); + + /* Print a very long arg list + */ + a = 22.22; + b = 33.333; + c = 0; + d = -25; + e = 100; + f = 2345; + + print_long_arg_list ( a, b, c, d, e, f, *struct1, *struct2, *struct3, *struct4, + *flags, *flags_combo, *three_char, *five_char, *int_char_combo, + *d1, *d2, *d3, *f1, *f2, *f3); + + /* Initialize small structures + */ + init_one_double ( d1, 1.11111); + init_one_double ( d2, -345.34); + init_one_double ( d3, 546464.2); + init_two_floats ( f1, 0.234, 453.1); + init_two_floats ( f2, 78.345, 23.09); + init_two_floats ( f3, -2.345, 1.0); + init_bit_flags(flags, (unsigned)1, (unsigned)0, (unsigned)1, + (unsigned)0, (unsigned)1, (unsigned)0 ); + init_bit_flags_combo(flags_combo, (unsigned)1, (unsigned)0, 'y', + (unsigned)1, (unsigned)0, 'n', + (unsigned)1, (unsigned)0 ); + init_three_chars(three_char, 'x', 'y', 'z'); + init_five_chars(five_char, 'h', 'e', 'l', 'l', 'o'); + init_int_char_combo(int_char_combo, 13, '!'); + init_struct_rep(struct1, 10); + init_struct_rep(struct2, 20); + init_struct_rep(struct3, 30); + init_struct_rep(struct4, 40); + + compute_with_small_structs(35); + loop_count(); + printf("HELLO WORLD\n"); + printf("BYE BYE FOR NOW\n"); + printf("VERY GREEN GRASS\n"); + + /* Print small structures + */ + print_one_double(*d1); + print_one_double(*d2); + print_one_double(*d3); + print_two_floats(*f1); + print_two_floats(*f2); + print_two_floats(*f3); + print_bit_flags(*flags); + print_bit_flags_combo(*flags_combo); + print_three_chars(*three_char); + print_five_chars(*five_char); + print_int_char_combo(*int_char_combo); + sum_struct_print(10, *struct1, *struct2, *struct3, *struct4); + print_struct_rep(*struct1, *struct2, *struct3); + + return 0; +} + + + + + diff --git a/gdb/testsuite/gdb.base/call-ar-st.exp b/gdb/testsuite/gdb.base/call-ar-st.exp new file mode 100644 index 00000000000..d8ed4fef7dd --- /dev/null +++ b/gdb/testsuite/gdb.base/call-ar-st.exp @@ -0,0 +1,451 @@ +# Copyright (C) 1998 +# 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "call-ar-st" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +# Create and source the file that provides information about the compiler +# used to compile the test case. + +if [get_compiler_info ${binfile}] { + return -1; +} + +# The a29k can't call functions, so don't even bother with this test. +if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + continue +} + +# Set the current language to C. This counts as a test. If it +# fails, then we skip the other tests. + +proc set_lang_c {} { + global gdb_prompt + + send_gdb "set language c\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "set language c (timeout)" ; return 0; } + } + + send_gdb "show language\n" + gdb_expect { + -re ".* source language is \"c\".*$gdb_prompt $" { + pass "set language to \"c\"" + return 1 + } + -re ".*$gdb_prompt $" { + fail "setting language to \"c\"" + return 0 + } + timeout { + fail "can't show language (timeout)" + return 0 + } + } +} + + +source ${binfile}.ci + + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $" + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +#go -until 1007 +gdb_test "tbreak 1007" \ + "Breakpoint \[0-9\]+.*file.*$srcfile, line 1007.*" \ + "tbreakpoint line 1007" + +gdb_test continue \ +"Continuing\\..*main \\(\\) at.*$srcfile:1007.*" \ +"run until breakpoint set at a line" + + +#call print_double_array(double_array) +send_gdb "print print_double_array(double_array)\n" +gdb_expect { + -re "array_d :\[ \t\r\n\]+=========\[ \t\r\n\]+\[ \t\r\n\]+0.000000\[ \t\r\n\]+23.456700 46.913400 70.370100 93.826800 117.283500 140.740200 164.196900 187.653600\[ \t\r\n\]+211.110300 234.567000 258.023700 281.480400 304.937100 328.393800 351.850500 375.307200\[ \t\r\n\]+398.763900 422.220600 445.677300 469.134000 492.590700 516.047400 539.504100 562.960800\[ \t\r\n\]+586.417500 609.874200 633.330900 656.787600 680.244300 703.701000 727.157700 750.614400\[ \t\r\n\]+774.071100 797.527800 820.984500 844.441200 867.897900 891.354600 914.811300 938.268000\[ \t\r\n\]+961.724700 985.181400 1008.638100 1032.094800 1055.551500 1079.008200 1102.464900 1125.921600\[ \t\r\n\]+1149.378300 1172.835000 1196.291700 1219.748400 1243.205100 1266.661800 1290.118500 1313.575200\[ \t\r\n\]+1337.031900 1360.488600 1383.945300 1407.402000 1430.858700 1454.315400 1477.772100 1501.228800\[ \t\r\n\]+1524.685500 1548.142200 1571.598900 1595.055600 1618.512300 1641.969000 1665.425700 1688.882400\[ \t\r\n\]+1712.339100 1735.795800 1759.252500 1782.709200 1806.165900 1829.622600 1853.079300 1876.536000\[ \t\r\n\]+1899.992700 1923.449400 1946.906100 1970.362800 1993.819500 2017.276200 2040.732900 2064.189600\[ \t\r\n\]+2087.646300 2111.103000 2134.559700 2158.016400 2181.473100 2204.929800 2228.386500 2251.843200\[ \t\r\n\]+2275.299900 2298.756600 2322.213300\[ \t\r\n\]+\[ \t\r\n\]+.*$gdb_prompt $" { + pass "print print_double_array(double_array)" + } + -re ".*$gdb_prompt $" { fail "print print_double_array(double_array)" } + timeout { fail "(timeout) print print_double_array(double_array)" } + } + + +#call print_char_array(char_array) +send_gdb "print print_char_array(char_array)\n" +gdb_expect { + -re "array_c :\[ \t\r\n\]+=========\[ \t\r\n\]+\[ \t\r\n\]+Z\[ \t\r\n\]+aZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZ\[ \t\r\n\]+aZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZ\[ \t\r\n\]+aZaZaZaZaZaZaZaZaZa\[ \t\r\n\]+\[ \t\r\n\]+.*\[ \t\r\n\]+.*$gdb_prompt $" { + pass "print print_char_array(char_array)" + } + -re ".*$gdb_prompt $" { fail "print print_char_array(char_array)" } + timeout { fail "(timeout) print print_char_array(char_array)" } + } + + + +#go -until 1014 +gdb_test "tbreak 1014" \ +"Breakpoint.*file.*$srcfile, line 1014.*" \ +"tbreakpoint line 1014" + +send_gdb "continue\n" +gdb_expect { + -re "array_c :\[ \t\r\n\]+=========\[ \t\r\n\]+\[ \t\r\n\]+Z\[ \t\r\n\]+aZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZ\[ \t\r\n\]+aZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZ\[ \t\r\n\]+aZaZaZaZaZaZaZaZaZa\[ \t\r\n\]+\[ \t\r\n\]+\[ \t\r\n\]+main.*at.*$srcfile:1014\[ \t\r\n\]+.*print_double_array\\(double_array\\).*$gdb_prompt $" { + pass "continue to 1014" + } + -re ".*$gdb_prompt $" { fail "continue to 1014" } + timeout { fail "(timeout) continue to 1014" } +} + +# I am disabling this test, because it takes too long. I verified by +# hand that it works, feel free to check for yourself. +#call print_all_arrays(integer_array, char_array, float_array, double_array) +#send_gdb "print print_all_arrays(integer_array, char_array, float_array, double_array)\n" +#gdb_expect { +# -re ".*array_i :\[ \t\r\n\]+=========\[ \t\r\n\]+\[ \t\r\n\]+0\[ \t\r\n\]+-1 -2 -3 -4 -5 -6 -7 -8\[ \t\r\n\]+-9 -10 -11 -12 -13 -14 -15 -16\[ \t\r\n\]+-17 -18 -19 -20 -21 -22 -23 -24\[ \t\r\n\]+-25 -26 -27 -28 -29 -30 -31 -32\[ \t\r\n\]+-33 -34 -35 -36 -37 -38 -39 -40\[ \t\r\n\]+-41 -42 -43 -44 -45 -46 -47 -48\[ \t\r\n\]+-49\[ \t\r\n\]+\[ \t\r\n\]+array_c :\[ \t\r\n\]+=========\[ \t\r\n\]+\[ \t\r\n\]+Z\[ \t\r\n\]+aZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZ\[ \t\r\n\]+aZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZ\[ \t\r\n\]+aZaZaZaZaZaZaZaZaZa\[ \t\r\n\]+\[ \t\r\n\]+array_f :\[ \t\r\n\]+=========\[ \t\r\n\]+\[ \t\r\n\]+0.000000\[ \t\r\n\]+0.142450 0.284900 0.427350 0.569801 0.712251 0.854701 0.997151 1.139601\[ \t\r\n\]+1.282051 1.424501 1.566952 1.709402 1.851852 1.994302\[ \t\r\n\]+\[ \t\r\n\]+array_d :\[ \t\r\n\]+=========\[ \t\r\n\]+\[ \t\r\n\]+0.000000\[ \t\r\n\]+23.456700 46.913400 70.370100 93.826800 117.283500 140.740200 164.196900 187.653600\[ \t\r\n\]+211.110300 234.567000 258.023700 281.480400 304.937100 328.393800 351.850500 375.307200\[ \t\r\n\]+398.763900 422.220600 445.677300 469.134000 492.590700 516.047400 539.504100 562.960800\[ \t\r\n\]+586.41750 609.874200 633.330900 656.787600 680.244300 703.701000 727.157700 750.614400\[ \t\r\n\]+774.071100 797.527800 820.984500 844.441200 867.897900 891.354600 914.811300 938.268000\[ \t\r\n\]+961.724700 985.181400 1008.638100 1032.094800 1055.551500 1079.008200 1102.464900 1125.921600\[ \t\r\n\]+1149.378300 1172.835000 1196.291700 1219.748400 1243.205100 1266.661800 1290.118500 1313.575200\[ \t\r\n\]+1337.031900 1360.488600 1383.945300 1407.402000 1430.858700 1454.315400 1477.772100 1501.228800\[ \t\r\n\]+1524.685500 1548.142200 1571.598900 1595.055600 1618.512300 1641.969000 1665.425700 1688.882400\[ \t\r\n\]+1712.339100 1735.795800 1759.252500 1782.709200 1806.165900 1829.622600 1853.079300 1876.536000\[ \t\r\n\]+1899.992700 1923.449400 1946.906100 1970.362800 1993.819500 2017.276200 2040.732900 2064.189600\[ \t\r\n\]+2087.646300 2111.103000 2134.559700 2158.016400 2181.473100 2204.929800 2228.386500 2251.843200\[ \t\r\n\]+2275.299900 2298.756600 2322.213300.*$gdb_prompt $" { +# pass "print print_all_arrays(integer_array, char_array, float_array, double_array)" +# } +# -re ".*$gdb_prompt $" { fail "print print_all_arrays(integer_array, char_array, float_array, double_array)" } +# timeout { fail "(timeout) print print_all_arrays(integer_array, char_array, float_array, double_array)" } +# } + +#set timeout $oldtimeout +#go -until 1018 +gdb_test "tbreak 1018" \ + "Breakpoint.* file .*$srcfile, line 1018.*" \ + "tbreakpoint line 1018" + +gdb_test continue \ +"Continuing\\..*array_d :.*array_f :.*student id :\[\t \]+.*YELLOW.*array_i :.*main \\(\\) at .*call-ar-st.c:1018\[ \t\r\n\]+.*print_all_arrays\\(integer_array, char_array, float_array, double_array\\)." \ +"continuing to breakpoint 1018" + +#step + send_gdb "step\n" + gdb_expect { + -re "print_all_arrays \\(array_i=, array_c=.ZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZa., array_f=, array_d=\\) at .*call-ar-st.c:287\[ \t\r\n\]+287.*print_int_array\\(array_i\\);.*$gdb_prompt $" {pass "step inside print_all_arrays"} + -re ".*$gdb_prompt $" { fail "step inside print_all_arrays" } + timeout { fail "step inside print_all_arrays (timeout)" } + } + + +#step -over + send_gdb "next\n" + gdb_expect { + -re "array_i :.*288.*print_char_array\\(array_c\\);.*$gdb_prompt $" {pass "next over print_int_array in print-all_arrays"} + -re ".*$gdb_prompt $" { fail "next over print_int_array in print-all_arrays" } + timeout { fail "next over print_int_array in print-all_arrays (timeout)" } + } + + + +#call print_double_array(array_d) +send_gdb "print print_double_array(array_d)\n" +gdb_expect { + -re "array_d :\[ \t\r\n\]+=========\[ \t\r\n\]+\[ \t\r\n\]+0.000000\[ \t\r\n\]+23.456700 46.913400 70.370100 93.826800 117.283500 140.740200 164.196900 187.653600\[ \t\r\n\]+211.110300 234.567000 258.023700 281.480400 304.937100 328.393800 351.850500 375.307200\[ \t\r\n\]+398.763900 422.220600 445.677300 469.134000 492.590700 516.047400 539.504100 562.960800\[ \t\r\n\]+586.417500 609.874200 633.330900 656.787600 680.244300 703.701000 727.157700 750.614400\[ \t\r\n\]+774.071100 797.527800 820.984500 844.441200 867.897900 891.354600 914.811300 938.268000\[ \t\r\n\]+961.724700 985.181400 1008.638100 1032.094800 1055.551500 1079.008200 1102.464900 1125.921600\[ \t\r\n\]+1149.378300 1172.835000 1196.291700 1219.748400 1243.205100 1266.661800 1290.118500 1313.575200\[ \t\r\n\]+1337.031900 1360.488600 1383.945300 1407.402000 1430.858700 1454.315400 1477.772100 1501.228800\[ \t\r\n\]+1524.685500 1548.142200 1571.598900 1595.055600 1618.512300 1641.969000 1665.425700 1688.882400\[ \t\r\n\]+1712.339100 1735.795800 1759.252500 1782.709200 1806.165900 1829.622600 1853.079300 1876.536000\[ \t\r\n\]+1899.992700 1923.449400 1946.906100 1970.362800 1993.819500 2017.276200 2040.732900 2064.189600\[ \t\r\n\]+2087.646300 2111.103000 2134.559700 2158.016400 2181.473100 2204.929800 2228.386500 2251.843200\[ \t\r\n\]+2275.299900 2298.756600 2322.213300\[ \t\r\n\]+\[ \t\r\n\]+.*$gdb_prompt $" { + pass "print print_double_array(array_d)" + } + -re ".*$gdb_prompt $" { fail "print print_double_array(array_d)" } + timeout { fail "(timeout) print print_double_array(array_d)" } + } + + +#go -until 1034 +gdb_test "tbreak 1034" \ +"Breakpoint.* file .*$srcfile, line 1034.*" \ +"tbreakpoint line 1034" + +gdb_test continue "Continuing\\..*array_c.*array_f.*array_d.*HELLO WORLD.*main \\(\\) at .*call-ar-st.c:1034.*printf\\(.BYE BYE FOR NOW.n.\\)." "continuing to 1034" + + +#call sum_array_print(10, *list1, *list2, *list3, *list4) +send_gdb "print sum_array_print(10, *list1, *list2, *list3, *list4)\n" +gdb_expect { + -re ".*Sum of 4 arrays, by element \\(add in seed as well\\):\[ \t\r\n\]+Seed: 10\[ \t\r\n\]+Element Index . Sum\[ \t\r\n\]+-------------------------\[ \t\r\n\]+.*\[ \t\]+0\[ \t\]+52\[ \t\r\n\]+1\[ \t\]+60\[ \t\r\n\]+2\[ \t\]+68\[ \t\r\n\]+3\[ \t\]+76\[ \t\r\n\]+4\[ \t\]+84\[ \t\r\n\]+5\[ \t\]+92\[ \t\r\n\]+6\[ \t\]+100\[ \t\r\n\]+7\[ \t\]+108\[ \t\r\n\]+8\[ \t\]+116\[ \t\r\n\]+9\[ \t\]+124\[ \t\r\n\]+.*$gdb_prompt $" { + pass "print sum_array_print(10, *list1, *list2, *list3, *list4)" + } + -re ".*$gdb_prompt $" { fail "print sum_array_print(10, *list1, *list2, *list3, *list4)" } + timeout { fail "(timeout) print sum_array_print(10, *list1, *list2, *list3, *list4)" } + } + + +#step -over + send_gdb "next\n" + gdb_expect { + -re "BYE BYE FOR NOW\[ \t\r\n\]+1035\[ \t\r\n\]+printf\\(.VERY GREEN GRASS.n.\\);\[ \t\r\n\]+.*$gdb_prompt $" { pass "next to 1035"} + -re ".*$gdb_prompt $" { fail "next to 1035" } + timeout { fail "next to 1035(timeout)" } + } + +#call print_array_rep(\*list1, \*list2, \*list3) + +send_gdb "print print_array_rep(\*list1, \*list2, \*list3)\n" +gdb_expect { + -re ".*.*$gdb_prompt $" { + pass "print print_array_rep(*list1, *list2, *list3)" + } + -re ".*$gdb_prompt $" { fail "print print_array_rep(*list1, *list2, *list3)" } + timeout { fail "(timeout) print print_array_rep(*list1, *list2, *list3)"# } + } + + + +#go -until 1039 +gdb_test "tbreak 1039" \ + "Breakpoint..* file .*$srcfile, line 1039.*" \ + "tbreakpoint line 1039" + +send_gdb "continue\n" +gdb_expect { + -re ".*main \\(\\) at .*call-ar-st.c:1039\r\n1039\t\[ \]+sum_array_print\\(10, \\*list1, \\*list2, \\*list3, \\*list4\\);.*$gdb_prompt $" { + pass "continue to 1039"} + -re ".*$gdb_prompt $" { fail "continue to 1039"} + timeout { fail "(timeout) continue to 1039"} +} + + + +# Run into sum_array_print, and verify that the arguments were passed +# accurately. +# +# Note that we shouldn't use a `step' here to get into +# sum_array_print; GCC may emit calls to memcpy to put the arguments +# in the right place, and a step may end up in memcpy instead. This +# may itself be a bug, but it's not the one we're trying to catch +# here. I've added something to step-test.exp for this. +gdb_test "break sum_array_print" \ + ".*Breakpoint ${decimal}: file .*call-ar-st.c, line.*" \ + "set breakpoint in sum_array_print" +gdb_test "continue" \ + ".*Breakpoint ${decimal}, sum_array_print \\(seed=10, linked_list1=.next_index = .1, 2, 3, 4, 5, 6, 7, 8, 9, 10., values = .4, 6, 8, 10, 12, 14, 16, 18, 20, 22., head = 0., linked_list2=.next_index = .1, 2, 3, 4, 5, 6, 7, 8, 9, 10., values = .8, 10, 12, 14, 16, 18, 20, 22, 24, 26., head = 0., linked_list3=.next_index = .1, 2, 3, 4, 5, 6, 7, 8, 9, 10., values = .10, 12, 14, 16, 18, 20, 22, 24, 26, 28., head = 0., linked_list4=.next_index = .1, 2, 3, 4, 5, 6, 7, 8, 9, 10., values = .20, 22, 24, 26, 28, 30, 32, 34, 36, 38., head = 0.\\) at .*call-ar-st.c:909\[ \t\n\r\]+909.*printf\\(.Sum of 4 arrays, by element \\(add in seed as well\\).*\\);.*" \ + "check args of sum_array_print" + +#call print_array_rep(linked_list1, linked_list2, linked_list3) +# this calls works from gdb without gdb_expect. But it does seem to hang +#from within gdb_expect. +#I comment this out +#send_gdb "print print_array_rep(linked_list1, linked_list2, linked_list3)\n" +#gdb_expect { +# -re ".*Contents of linked list1:\[ \t\n\r\]+Element Value . Index of Next Element\[ \t\n\r\]+-------------------------------------\[ \t\n\r\]+.*\[ \t\n\r\]+.*4.*1\[ \t\n\r\]+.*6.*2\[ \t\n\r\]+.*8.*3\[ \t\n\r\]+.*10.*4\[ \t\n\r\]+.*12.*5\[ \t\n\r\]+.*14.*6\[ \t\n\r\]+.*16.*7\[ \t\n\r\]+.*18.*8\[ \t\n\r\]+.*20.*9\[ \t\n\r\]+.*22.*10\[ \t\n\r\]+Contents of linked list2:\[ \t\n\r\]+Element Value | Index of Next Element\[ \t\n\r\]+-------------------------------------\[ \t\n\r\]+.*\[ \t\n\r\]+.*8.*1\[ \t\n\r\]+.*10.*2\[ \t\n\r\]+.*12.*3\[ \t\n\r\]+.*14.*4\[ \t\n\r\]+.*16.*5\[ \t\n\r\]+.*18.*6\[ \t\n\r\]+.*20.*7\[ \t\n\r\]+.*22.*8\[ \t\n\r\]+.*24.*9\[ \t\n\r\]+.*26.*10\[ \t\n\r\]+Contents of linked list3:\[ \t\n\r\]+Element Value | Index of Next Element\[ \t\n\r\]+-------------------------------------\[ \t\n\r\]+.*\[ \t\n\r\]+.*10.*1\[ \t\n\r\]+.*12.*2\[ \t\n\r\]+.*14.*3\[ \t\n\r\]+.*16.*4\[ \t\n\r\]+.*18.*5\[ \t\n\r\]+.*20.*6\[ \t\n\r\]+.*22.*7\[ \t\n\r\]+.*24.*8\[ \t\n\r\]+.*26.*9\[ \t\n\r\]+.*28.*10\[ \t\n\r\]+.*$gdb_prompt $" { +# pass "print print_array_rep(linked_list1, linked_list2, linked_list3)" +# } +# -re ".*$gdb_prompt $" { fail "print print_array_rep(linked_list1, linked_list2, linked_list3)" } +# timeout { fail "(timeout) print print_array_rep(linked_list1, linked_list2, linked_list3)" } +#} + + +#go -until 1079 +gdb_test "tbreak 1079" \ + "Breakpoint.* file .*call-ar-st.c, line 1079.*" \ + "tbreakpoint line 1079" + +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\..*Sum of 4 arrays.*Contents of linked list1.*Contents of two_floats_t.*main \\(\\) at .*call-ar-st.c:1079.*c = 0.*$gdb_prompt $" { + pass "continue to 1079"} + -re ".*$gdb_prompt $" { fail "continue to 1079"} + timeout { fail "(timeout) continue to 1079"} +} + +#call print_small_structs(*struct1, *struct2, *struct3, *struct4,*flags, *flags_combo, +#*three_char, *five_char, *int_char_combo, *d1, *d2, *d3, *f1, *f2, *f3) +send_gdb "print print_small_structs(*struct1, *struct2, *struct3, *struct4, *flags, *flags_combo, *three_char, *five_char, *int_char_combo, *d1, *d2, *d3, *f1, *f2, *f3)\n" +gdb_expect { + -re ".*alpha\[\t\r\n \]+gamma\[\t\r\n \]+epsilon\[\t\r\n \]+alpha\[\t\r\n \]+gamma\[\t\r\n \]+epsilon\[\t\r\n \]+ch1: y\tch2: n\[\t\r\n \]+Contents of three_char_t:\[\t\r\n \]+a\tb\tc\[\t\r\n \]+Contents of five_char_t:\[\t\r\n \]+l\tm\tn\to\tp\[\t\r\n \]+Contents of int_char_combo_t:\[\t\r\n \]+123.*z\[\t\r\n \]+Sum of the 4 struct values and seed :\[\t\r\n \]+52\[\t\r\n \]+Contents of struct1:\[\t\r\n \]+6.*0\[\t\r\n \]+Contents of struct2:\[\t\r\n \]+10.*0\[\t\r\n \]+Contents of struct3:\[\t\r\n \]+12.*0\[\t\r\n \]+Contents of one_double_t:\[\t\r\n \]+10.500000\[\t\r\n \]+Contents of one_double_t:.*-3.340000\[\t\r\n \]+Contents of one_double_t:.*675.091230\[\t\r\n \]+Contents of two_floats_t:.*45.234001.*43.599998\[\t\r\n \]+Contents of two_floats_t:.*78.010002.*122.099998\[\t\r\n \]+Contents of two_floats_t:.*-1232.344971.*-199.210007\[\t\r\n \]+.*$gdb_prompt $" { + pass "print print_small_structs" + } + -re ".*$gdb_prompt $" { fail "print print_small_structs" } + timeout { fail "(timeout) print_small_structs" } + } + + +#call compute_with_small_structs(20) +send_gdb "print compute_with_small_structs(20)\n" +gdb_expect { + -re ".*\[0-9\]+ =.*$gdb_prompt $" { + pass "print compute_with_small_structs(20)" + } + -re ".*$gdb_prompt $" { fail "print compute_with_small_structs(20)" } + timeout { fail "(timeout) compute_with_small_structs(20)" } + } + + +#call print_ten_doubles(123.456, 123.456, -0.12, -1.23, 343434.8, 89.098, 3.14, -5678.12345, -0.11111111, 216.97065) +send_gdb "print print_ten_doubles(123.456, 123.456, -0.12, -1.23, 343434.8, 89.098, 3.14, -5678.12345, -0.11111111, 216.97065)\n" +gdb_expect { + -re ".*Two Doubles : 123.456000.*123.456000\[\t\r\n \]+Two Doubles : -0.120000.*-1.230000\[\t\r\n \]+Two Doubles : 343434.800000.*89.098000\[\t\r\n \]+Two Doubles : 3.140000.*-5678.123450\[\t\r\n \]+Two Doubles : -0.111111.*216.970650\[\t\r\n \]+.*$gdb_prompt $" { + pass "print print_ten_doubles" + } + -re ".*$gdb_prompt $" { fail "print print_ten_doubles" } + timeout { fail "(timeout) print_ten_doubles" } + } + +#go -until 1084 +gdb_test "tbreak 1084" \ + "Breakpoint .* file .*call-ar-st.c, line 1084.*" \ + "tbreakpoint line 1084" + +gdb_test continue "Continuing\\..*main \\(.*\\) at.*call-ar-st.c:1084\[\t\r\n \]+1084.*print_long_arg_list \\( a, b, c, d, e, f, .struct1, .struct2, .struct3, .struct4,.*" "continue to 1084" + + + send_gdb "step\n" + gdb_expect { + -re ".*print_long_arg_list \\(a=22.219999999999999, b=33.332999999999998, c=0, d=-25, e=100, f=2345, struct1=\{value = 6, head = 0\}, struct2=\{value = 10, head = 0\}, struct3=\{value = 12, head = 0\}, struct4=\{value = 14, head = 0\}, flags=\{alpha = 1, beta = 0, gamma = 1, delta = 0, epsilon = 1, omega = 0\}, flags_combo=\{alpha = 1, beta = 0, ch1 = 121 \'y\', gamma = 1, delta = 0, ch2 = 110 \'n\', epsilon = 1, omega = 0\}, three_char=\{ch1 = 97 \'a\', ch2 = 98 \'b\', ch3 = 99 \'c\'\}, five_char=\{ch1 = 108 \'l\', ch2 = 109 \'m\', ch3 = 110 \'n\', ch4 = 111 \'o\', ch5 = 112 \'p\'\}, int_char_combo=\{int1 = 123, ch1 = 122 \'z\'\}, d1=\{double1 = 10.5\}, d2=\{double1 = -3.3399999999999999\}, d3=\{double1 = 675.09123\}, f1=\{float1 = 45.2340012, float2 = 43.5999985\}, f2=\{float1 = 78.0100021, float2 = 122.099998\}, f3=\{float1 = -1232.34497, float2 = -199.210007\}\\) at ${srcdir}/${subdir}/${srcfile}:813\[\r\n\]+813\[ \t\]+printf\\(\"double :.*\", a\\);.*$gdb_prompt $" {pass "step into print_long_arg_list"} + -re ".*$gdb_prompt $" { fail "step into print_long_arg_list" } + timeout { fail "step into print_long_arg_list (timeout)" } + } + + +#call print_small_structs(struct1, struct2, struct3, struct4, flags, flags_combo, three_char, five_char, int_char_combo, d1, d2, d3, f1, f2, f3) +send_gdb "print print_small_structs(struct1, struct2, struct3, struct4, flags, flags_combo, three_char, five_char, int_char_combo, d1, d2, d3, f1, f2, f3)\n" +gdb_expect { + -re ".*alpha\[\t\r\n \]+gamma\[\t\r\n \]+epsilon\[\t\r\n \]+alpha\[\t\r\n \]+gamma\[\t\r\n \]+epsilon\[\t\r\n \]+ch1: y\tch2: n\[\t\r\n \]+Contents of three_char_t:\[\t\r\n \]+a\tb\tc\[\t\r\n \]+Contents of five_char_t:\[\t\r\n \]+l\tm\tn\to\tp\[\t\r\n \]+Contents of int_char_combo_t:\[\t\r\n \]+123.*z\[\t\r\n \]+Sum of the 4 struct values and seed :\[\t\r\n \]+52\[\t\r\n \]+Contents of struct1:\[\t\r\n \]+6.*0\[\t\r\n \]+Contents of struct2:\[\t\r\n \]+10.*0\[\t\r\n \]+Contents of struct3:\[\t\r\n \]+12.*0\[\t\r\n \]+Contents of one_double_t:\[\t\r\n \]+10.500000\[\t\r\n \]+Contents of one_double_t:\[\t\r\n \]+-3.340000\[\t\r\n \]+Contents of one_double_t:\[\t\r\n \]+675.091230\[\t\r\n \]+Contents of two_floats_t:\[\t\r\n \]+45.234001.*43.599998\[\t\r\n \]+Contents of two_floats_t:\[\t\r\n \]+78.010002.*122.099998\[\t\r\n \]+Contents of two_floats_t:\[\t\r\n \]+-1232.344971.*-199.210007\[\t\r\n \]+.*$gdb_prompt $" { + pass "print print_small_structs from print_long_arg_list " + } + -re ".*$gdb_prompt $" { fail "print print_small_structs from print_long_arg_list" } + timeout { fail "(timeout) print_small_structs from print_long_arg_list" } + } + + + +#go -until 1098 +gdb_test "tbreak 1098" \ + "Breakpoint.* file .*call-ar-st.c, line 1098.*" \ + "tbreakpoint line 1098" + +gdb_test continue "Continuing\\..*Contents of two_floats_t:.*-1232.344971.*-199.210007.*main \\(\\) at.*call-ar-st.c:1098.*1098.*init_bit_flags_combo\\(flags_combo, \\(unsigned\\)1, \\(unsigned\\)0, .y.,.*" \ +"continue to 1098" + + +#step + send_gdb "step\n" + gdb_expect { + -re " +init_bit_flags_combo \\(bit_flags_combo=, a=1, b=0, ch1=121 .y., g=1, d=0, ch2=110 .n., e=1, o=0\\) at .*call-ar-st.c:385\[ \t\n\r\]+385.*bit_flags_combo->alpha = a;.*$gdb_prompt $" { + pass "step into init_bit_flags_combo"} + -re ".*$gdb_prompt $" { fail "step into init_bit_flags_combo" } + timeout { fail "step into init_bit_flags_combo (timeout)" } + } + +#call print_bit_flags_combo(*bit_flags_combo) +send_gdb "print print_bit_flags_combo(*bit_flags_combo)\n" +gdb_expect { + -re ".*alpha.*gamma.*epsilon.*ch1: y\tch2: n.*$gdb_prompt $" { + pass "print print_bit_flags_combo from init_bit_flags_combo" + } + -re ".*$gdb_prompt $" { fail "print print_bit_flags_combo from init_bit_flags_combo" } + timeout { fail "(timeout) print_bit_flags_combo from init_bit_flags_combo" } + } + + +#go -until 1103 +gdb_test "tbreak 1103" \ + "Breakpoint.* file .*call-ar-st.c, line 1103.*" \ + "tbreakpoint line 1103" + +gdb_test continue "Continuing\\..*main \\(\\) at .*call-ar-st.c:1103\[\r\n\t \]+1103.*init_int_char_combo\\(int_char_combo, 13, .!.\\);" \ +"continue to 1103" + +#call print_long_arg_list(a, b, c, d, e, f, *struct1, *struct2, *struct3, *struct4, *flags, *flags_combo, *three_char, *five_char, *int_char_combo, *d1, *d2, *d3, *f1, *f2, *f3) +send_gdb "print print_long_arg_list(a, b, c, d, e, f, *struct1, *struct2, *struct3, *struct4, *flags, *flags_combo, *three_char, *five_char, *int_char_combo, *d1, *d2, *d3, *f1, *f2, *f3)\n" +gdb_expect { + -re ".*double : 22.220000.*double : 33.333000.*int : 0.*int : -25.*int : 100.*int : 2345.*alpha.*gamma.*epsilon.*ch1: y\tch2: n.*Contents of three_char_t:.*x\ty\tz.*Contents of five_char_t:.*h\te\tl\tl\to.*Contents of int_char_combo_t:.*123\tz.*Sum of the 4 struct values and seed :.*52.*Contents of struct1:.*6\[ \]+0.*Contents of struct2:.*10\[ \]+0.*Contents of struct3:.*12.*0.*Contents of one_double_t:\[ \n\r\t\]+1.111110\[ \n\r\t\]+Contents of one_double_t:\[ \n\r\t\]+-345.340000\[ \n\r\t\]+Contents of one_double_t:\[ \n\r\t\]+546464.200000\[ \n\r\t\]+Contents of two_floats_t:\[ \n\r\t\]+0.234000\t453.100006\[ \n\r\t\]+Contents of two_floats_t:\[ \n\r\t\]+78.345001\t23.090000\[ \n\r\t\]+Contents of two_floats_t:\[ \n\r\t\]+-2.345000\t1.000000.*$gdb_prompt $" { + pass "print print_long_arg_list" + } + -re ".*$gdb_prompt $" { fail "print print_long_arg_list" } + timeout { fail "(timeout) print_long_arg_list" } + } + + +#go -until 1109 +gdb_test "tbreak 1109" \ + "Breakpoint.* file .*call-ar-st.c, line 1109.*" \ + "tbreakpoint line 1109" + +gdb_test continue "Continuing\\..*main \\(\\) at .*call-ar-st.c:1109\[ \t\n\r\]+1109.*compute_with_small_structs\\(35\\);" \ +"continue to 1109" + + +#call sum_struct_print(10, *struct1, *struct2, *struct3, *struct4) +send_gdb "print sum_struct_print(10, *struct1, *struct2, *struct3, *struct4)\n" +gdb_expect { + -re ".*Sum of the 4 struct values and seed :\[ \t\n\r\]+218.*$gdb_prompt $" { + pass "print sum_struct_print(10, *struct1, *struct2, *struct3, *struct4)" + } + -re ".*$gdb_prompt $" { fail "print sum_struct_print(10, *struct1, *struct2, *struct3, *struct4)" } + timeout { fail "(timeout) sum_struct_print(10, *struct1, *struct2, *struct3, *struct4)" } + } + + +#call print_struct_rep(*struct1, *struct2, *struct3) +send_gdb "print print_struct_rep(*struct1, *struct2, *struct3)\n" +gdb_expect { + -re ".*Contents of struct1:\[ \t\n\r\]+ 22 0\[ \t\n\r\]+Contents of struct2:\[ \t\n\r\]+ 42 0\[ \t\n\r\]+Contents of struct3:\[ \t\n\r\]+ 62 0\[ \t\n\r\]+.*$gdb_prompt $" { + pass "print print_struct_rep(*struct1, *struct2, *struct3)" + } + -re ".*$gdb_prompt $" { fail "print print_struct_rep(*struct1, *struct2, *struct3)" } + timeout { fail "(timeout) print_struct_rep(*struct1, *struct2, *struct3)" } + } + +send_gdb "print print_one_large_struct(*list1)\n" +gdb_expect { + -re ".* 4 1.*$gdb_prompt $" { + pass "print print_one_large_struct(*list1)" + } + -re ".*$gdb_prompt $" { fail "print print_one_large_struct(*list1)" } + timeout { fail "(timeout) print_one_large_struct(*list1)" } + } + +return + +~ diff --git a/gdb/testsuite/gdb.base/call-rt-st.c b/gdb/testsuite/gdb.base/call-rt-st.c new file mode 100644 index 00000000000..ad40a70e7d4 --- /dev/null +++ b/gdb/testsuite/gdb.base/call-rt-st.c @@ -0,0 +1,530 @@ +#include +#include +#include + +/************************************************************************** + * TESTS : + * function returning large structures, which go on the stack + * functions returning varied sized structs which go on in the registers. + ***************************************************************************/ + + +/* A large structure (> 64 bits) used to test passing large structures as + * parameters + */ + +struct array_rep_info_t { + int next_index[10]; + int values[10]; + int head; +}; + +/***************************************************************************** + * Small structures ( <= 64 bits). These are used to test passing small + * structures as parameters and test argument size promotion. + *****************************************************************************/ + + /* 64 bits + */ +struct small_rep_info_t { + int value; + int head; +}; + +/* 6 bits : really fits in 8 bits and is promoted to 32 bits + */ +struct bit_flags_t { + unsigned alpha :1; + unsigned beta :1; + unsigned gamma :1; + unsigned delta :1; + unsigned epsilon :1; + unsigned omega :1; +}; + +/* 22 bits : really fits in 40 bits and is promoted to 64 bits + */ +struct bit_flags_combo_t { + unsigned alpha :1; + unsigned beta :1; + char ch1; + unsigned gamma :1; + unsigned delta :1; + char ch2; + unsigned epsilon :1; + unsigned omega :1; +}; + +/* 64 bits + */ +struct one_double_t { + double double1; +}; + +/* 64 bits + */ +struct two_floats_t { + float float1; + float float2; +}; + + +/* 24 bits : promoted to 32 bits + */ +struct three_char_t { + char ch1; + char ch2; + char ch3; +}; + +/* 40 bits : promoted to 64 bits + */ +struct five_char_t { + char ch1; + char ch2; + char ch3; + char ch4; + char ch5; +}; + +/* 40 bits : promoted to 64 bits + */ +struct int_char_combo_t { + int int1; + char ch1; +}; + + +/***************************************************************** + * LOOP_COUNT : + * A do nothing function. Used to provide a point at which calls can be made. + *****************************************************************/ +void loop_count () { + + int index; + + for (index=0; index<4; index++); +} + +/***************************************************************** + * INIT_BIT_FLAGS : + * Initializes a bit_flags_t structure. Can call this function see + * the call command behavior when integer arguments do not fit into + * registers and must be placed on the stack. + * OUT struct bit_flags_t *bit_flags -- structure to be filled + * IN unsigned a -- 0 or 1 + * IN unsigned b -- 0 or 1 + * IN unsigned g -- 0 or 1 + * IN unsigned d -- 0 or 1 + * IN unsigned e -- 0 or 1 + * IN unsigned o -- 0 or 1 + *****************************************************************/ +void init_bit_flags (bit_flags,a,b,g,d,e,o) +struct bit_flags_t *bit_flags; +unsigned a; +unsigned b; +unsigned g; +unsigned d; +unsigned e; +unsigned o; +{ + + bit_flags->alpha = a; + bit_flags->beta = b; + bit_flags->gamma = g; + bit_flags->delta = d; + bit_flags->epsilon = e; + bit_flags->omega = o; +} + +/***************************************************************** + * INIT_BIT_FLAGS_COMBO : + * Initializes a bit_flags_combo_t structure. Can call this function + * to see the call command behavior when integer and character arguments + * do not fit into registers and must be placed on the stack. + * OUT struct bit_flags_combo_t *bit_flags_combo -- structure to fill + * IN unsigned a -- 0 or 1 + * IN unsigned b -- 0 or 1 + * IN char ch1 + * IN unsigned g -- 0 or 1 + * IN unsigned d -- 0 or 1 + * IN char ch2 + * IN unsigned e -- 0 or 1 + * IN unsigned o -- 0 or 1 + *****************************************************************/ +void init_bit_flags_combo (bit_flags_combo, a, b, ch1, g, d, ch2, e, o) +struct bit_flags_combo_t *bit_flags_combo; +unsigned a; +unsigned b; +char ch1; +unsigned g; +unsigned d; +char ch2; +unsigned e; +unsigned o; +{ + + bit_flags_combo->alpha = a; + bit_flags_combo->beta = b; + bit_flags_combo->ch1 = ch1; + bit_flags_combo->gamma = g; + bit_flags_combo->delta = d; + bit_flags_combo->ch2 = ch2; + bit_flags_combo->epsilon = e; + bit_flags_combo->omega = o; +} + + +/***************************************************************** + * INIT_ONE_DOUBLE : + * OUT struct one_double_t *one_double -- structure to fill + * IN double init_val + *****************************************************************/ +void init_one_double (one_double, init_val) +struct one_double_t *one_double; +double init_val; +{ + + one_double->double1 = init_val; +} + +/***************************************************************** + * INIT_TWO_FLOATS : + * OUT struct two_floats_t *two_floats -- structure to be filled + * IN float init_val1 + * IN float init_val2 + *****************************************************************/ +void init_two_floats (two_floats, init_val1, init_val2) +struct two_floats_t *two_floats; +float init_val1; +float init_val2; +{ + + two_floats->float1 = init_val1; + two_floats->float2 = init_val2; +} + +/***************************************************************** + * INIT_THREE_CHARS : + * OUT struct three_char_t *three_char -- structure to be filled + * IN char init_val1 + * IN char init_val2 + * IN char init_val3 + *****************************************************************/ +void init_three_chars ( three_char, init_val1, init_val2, init_val3) +struct three_char_t *three_char; +char init_val1; +char init_val2; +char init_val3; +{ + + three_char->ch1 = init_val1; + three_char->ch2 = init_val2; + three_char->ch3 = init_val3; +} + +/***************************************************************** + * INIT_FIVE_CHARS : + * OUT struct five_char_t *five_char -- structure to be filled + * IN char init_val1 + * IN char init_val2 + * IN char init_val3 + * IN char init_val4 + * IN char init_val5 + *****************************************************************/ +void init_five_chars ( five_char, init_val1, init_val2, init_val3, init_val4, init_val5) +struct five_char_t *five_char; +char init_val1; +char init_val2; +char init_val3; +char init_val4; +char init_val5; +{ + + five_char->ch1 = init_val1; + five_char->ch2 = init_val2; + five_char->ch3 = init_val3; + five_char->ch4 = init_val4; + five_char->ch5 = init_val5; +} + +/***************************************************************** + * INIT_INT_CHAR_COMBO : + * OUT struct int_char_combo_t *combo -- structure to be filled + * IN int init_val1 + * IN char init_val2 + *****************************************************************/ +void init_int_char_combo ( combo, init_val1, init_val2) +struct int_char_combo_t *combo; +int init_val1; +char init_val2; +{ + + combo->int1 = init_val1; + combo->ch1 = init_val2; +} + +/***************************************************************** + * INIT_STRUCT_REP : + * OUT struct small_rep_into_t *small_struct -- structure to be filled + * IN int seed + *****************************************************************/ +void init_struct_rep( small_struct, seed) +struct small_rep_info_t *small_struct; +int seed; + +{ + + small_struct->value = 2 + (seed*2); + small_struct->head = 0; +} + +/***************************************************************** + * PRINT_BIT_FLAGS : + * IN struct bit_flags_t bit_flags + ****************************************************************/ +struct bit_flags_t print_bit_flags ( bit_flags) +struct bit_flags_t bit_flags; +{ + + if (bit_flags.alpha) printf("alpha\n"); + if (bit_flags.beta) printf("beta\n"); + if (bit_flags.gamma) printf("gamma\n"); + if (bit_flags.delta) printf("delta\n"); + if (bit_flags.epsilon) printf("epsilon\n"); + if (bit_flags.omega) printf("omega\n"); + return bit_flags; + +} + +/***************************************************************** + * PRINT_BIT_FLAGS_COMBO : + * IN struct bit_flags_combo_t bit_flags_combo + ****************************************************************/ +struct bit_flags_combo_t print_bit_flags_combo ( bit_flags_combo ) +struct bit_flags_combo_t bit_flags_combo; +{ + + if (bit_flags_combo.alpha) printf("alpha\n"); + if (bit_flags_combo.beta) printf("beta\n"); + if (bit_flags_combo.gamma) printf("gamma\n"); + if (bit_flags_combo.delta) printf("delta\n"); + if (bit_flags_combo.epsilon) printf("epsilon\n"); + if (bit_flags_combo.omega) printf("omega\n"); + printf("ch1: %c\tch2: %c\n", bit_flags_combo.ch1, bit_flags_combo.ch2); + return bit_flags_combo; + +} + +/***************************************************************** + * PRINT_ONE_DOUBLE : + * IN struct one_double_t one_double + ****************************************************************/ +struct one_double_t print_one_double ( one_double ) +struct one_double_t one_double; +{ + + printf("Contents of one_double_t: \n\n"); + printf("%f\n", one_double.double1); + return one_double; + +} + +/***************************************************************** + * PRINT_TWO_FLOATS : + * IN struct two_floats_t two_floats + ****************************************************************/ +struct two_floats_t print_two_floats ( two_floats ) +struct two_floats_t two_floats; +{ + + printf("Contents of two_floats_t: \n\n"); + printf("%f\t%f\n", two_floats.float1, two_floats.float2); + return two_floats; + +} + +/***************************************************************** + * PRINT_THREE_CHARS : + * IN struct three_char_t three_char + ****************************************************************/ +struct three_char_t print_three_chars ( three_char ) +struct three_char_t three_char; +{ + + printf("Contents of three_char_t: \n\n"); + printf("%c\t%c\t%c\n", three_char.ch1, three_char.ch2, three_char.ch3); + return three_char; + +} + +/***************************************************************** + * PRINT_FIVE_CHARS : + * IN struct five_char_t five_char + ****************************************************************/ +struct five_char_t print_five_chars ( five_char ) +struct five_char_t five_char; +{ + + printf("Contents of five_char_t: \n\n"); + printf("%c\t%c\t%c\t%c\t%c\n", five_char.ch1, five_char.ch2, + five_char.ch3, five_char.ch4, + five_char.ch5); + return five_char; + +} + +/***************************************************************** + * PRINT_INT_CHAR_COMBO : + * IN struct int_char_combo_t int_char_combo + ****************************************************************/ +struct int_char_combo_t print_int_char_combo ( int_char_combo ) +struct int_char_combo_t int_char_combo; +{ + + printf("Contents of int_char_combo_t: \n\n"); + printf("%d\t%c\n", int_char_combo.int1, int_char_combo.ch1); + return int_char_combo; + +} + +/***************************************************************** + * PRINT_STRUCT_REP : + ****************************************************************/ +struct small_rep_info_t print_struct_rep( struct1 ) +struct small_rep_info_t struct1; + +{ + + printf("Contents of struct1: \n\n"); + printf("%10d%10d\n", struct1.value, struct1.head); + struct1.value =+5; + + return struct1; + + +} + + +struct array_rep_info_t print_one_large_struct( linked_list1 ) +struct array_rep_info_t linked_list1; +{ + + + printf("%10d%10d\n", linked_list1.values[0], + linked_list1.next_index[0]); + + return linked_list1; + +} + +/***************************************************************** + * INIT_ARRAY_REP : + * IN struct array_rep_info_t *linked_list + * IN int seed + ****************************************************************/ +void init_array_rep( linked_list, seed ) +struct array_rep_info_t *linked_list; +int seed; + +{ + + int index; + + for (index = 0; index < 10; index++) { + + linked_list->values[index] = (2*index) + (seed*2); + linked_list->next_index[index] = index + 1; + } + linked_list->head = 0; +} + + +int main () { + + /* variables for large structure testing + */ + int number = 10; + struct array_rep_info_t *list1; + + /* variables for testing a small structures and a very long argument list + */ + struct small_rep_info_t *struct1; + struct bit_flags_t *flags; + struct bit_flags_combo_t *flags_combo; + struct three_char_t *three_char; + struct five_char_t *five_char; + struct int_char_combo_t *int_char_combo; + struct one_double_t *d1; + struct two_floats_t *f3; + + + /* Allocate space for large structures + */ + list1 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); + + /* Initialize large structures + */ + init_array_rep(list1, 2); + + /* Print large structures + */ + print_one_large_struct(*list1); + + /* Allocate space for small structures + */ + struct1 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); + flags = (struct bit_flags_t *)malloc(sizeof(struct bit_flags_t)); + flags_combo = (struct bit_flags_combo_t *)malloc(sizeof(struct bit_flags_combo_t)); + three_char = (struct three_char_t *)malloc(sizeof(struct three_char_t)); + five_char = (struct five_char_t *)malloc(sizeof(struct five_char_t)); + int_char_combo = (struct int_char_combo_t *)malloc(sizeof(struct int_char_combo_t)); + + d1 = (struct one_double_t *)malloc(sizeof(struct one_double_t)); + f3 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t)); + + /* Initialize small structures + */ + init_one_double ( d1, 1.11111); + init_two_floats ( f3, -2.345, 1.0); + init_bit_flags(flags, (unsigned)1, (unsigned)0, (unsigned)1, + (unsigned)0, (unsigned)1, (unsigned)0 ); + init_bit_flags_combo(flags_combo, (unsigned)1, (unsigned)0, 'y', + (unsigned)1, (unsigned)0, 'n', + (unsigned)1, (unsigned)0 ); + init_three_chars(three_char, 'x', 'y', 'z'); + init_five_chars(five_char, 'h', 'e', 'l', 'l', 'o'); + init_int_char_combo(int_char_combo, 13, '!'); + init_struct_rep(struct1, 10); + + + /* Print small structures + */ + print_one_double(*d1); + print_two_floats(*f3); + print_bit_flags(*flags); + print_bit_flags_combo(*flags_combo); + print_three_chars(*three_char); + print_five_chars(*five_char); + print_int_char_combo(*int_char_combo); + print_struct_rep(*struct1); + + loop_count(); + + return 0; +} + + + + + + + + + + + + + + + diff --git a/gdb/testsuite/gdb.base/call-rt-st.exp b/gdb/testsuite/gdb.base/call-rt-st.exp new file mode 100644 index 00000000000..12ca14caf57 --- /dev/null +++ b/gdb/testsuite/gdb.base/call-rt-st.exp @@ -0,0 +1,230 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# this file tests command line calls with functions returning structures +# corresponding source file: call_return_struct.c + + + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "call-rt-st" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + + +# Create and source the file that provides information about the compiler +# used to compile the test case. + +if [get_compiler_info ${binfile}] { + return -1; +} + +# The a29k can't call functions, so don't even bother with this test. +if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + continue +} + +# Set the current language to C. This counts as a test. If it +# fails, then we skip the other tests. + +proc set_lang_c {} { + global gdb_prompt + + send_gdb "set language c\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "set language c (timeout)" ; return 0; } + } + + send_gdb "show language\n" + gdb_expect { + -re ".* source language is \"c\".*$gdb_prompt $" { + pass "set language to \"c\"" + return 1 + } + -re ".*$gdb_prompt $" { + fail "setting language to \"c\"" + return 0 + } + timeout { + fail "can't show language (timeout)" + return 0 + } + } +} + + + +source ${binfile}.ci + + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $" + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + + +gdb_test "break loop_count" \ + "Breakpoint.* file .*call-rt-st.c, line 106\\." \ + "breakpoint loop_count" + + +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\..*Breakpoint.*loop_count \\(\\) at.*call-rt-st.c:106\[ \t\r\n\]+106\[\t \]+for \\(index=0; index.4; index..\\);\[\r\n \]+$gdb_prompt $" { + pass "continue to loop_count"} + -re ".*$gdb_prompt $" { fail "continue to loop_count"} + timeout { fail "(timeout) continue to loop_count"} +} + +send_gdb "finish\n" +gdb_expect { + -re "Run till exit from .0 loop_count \\(\\) at.*call-rt-st.c:106\[ \t\r\n\]+main \\(\\) at.*call-rt-st.c:514\[ \t\r\n\]+514\[\t \]+return 0;.*$gdb_prompt $" { + pass "finish out from loop_count"} + -re ".*$gdb_prompt $" { fail "finish out from loop_count"} + timeout { fail "(timeout)finish out from loop_count"} +} + + +send_gdb "print print_struct_rep(*struct1)\n" +gdb_expect { + -re ".*Contents of struct1:\[ \t\n\r\]+22\[ \t\]+0\[ \t\n\r\]+.\[0-9\]+ = \{value = 5, head = 0\}.*$gdb_prompt $" { + pass "print print_struct_rep(*struct1, *struct2, *struct3)" + } + -re ".*$gdb_prompt $" { fail "print print_struct_rep(*struct1, *struct2, *struct3)" } + timeout { fail "(timeout) print_struct_rep(*struct1, *struct2, *struct3)" } + } + +send_gdb "print print_one_large_struct(*list1)\n" +gdb_expect { + -re ".*\[ \t\]+4\[ \t\]+1\[ \r\n\]+.\[0-9\]+ = \{next_index = \{1, 2, 3, 4, 5, 6, 7, 8, 9, 10\}, values = \{4, 6, 8, 10, 12, 14, 16, 18, 20, 22\}, head = 0\}.*$gdb_prompt $" { + pass "print print_one_large_struct(*list1)" + } + -re ".*$gdb_prompt $" { fail "print print_one_large_struct(*list1)" } + timeout { fail "(timeout) print_one_large_struct(*list1)" } + } + +send_gdb "print print_one_double(*d1)\n" +gdb_expect { + -re ".*Contents of one_double_t:\[ \r\n\]+1\\.111110\[ \r\n\]+.\[0-9\]+ = \{double1 = 1\\.11111\}.*$gdb_prompt $" { + pass "print print_one_double(*d1)" + } + -re ".*$gdb_prompt $" { fail "print print_one_double(*d1)" } + timeout { fail "(timeout) print_one_double(*d1)" } + } + + + +send_gdb "print print_two_floats(*f3)\n" +gdb_expect { + -re ".*Contents of two_floats_t:\[ \r\n\]+-2\\.345000\[ \t]+1\\.000000\[ \r\n\]+.\[0-9\]+ = \{float1 = -2\\.34500003, float2 = 1\}.*$gdb_prompt $" { + pass "print print_two_floats(*f3)" + } + -re ".*$gdb_prompt $" { fail "print print_two_floats(*f3)" } + timeout { fail "(timeout) print_two_floats(*f3)" } + } + +send_gdb "print print_bit_flags(*flags)\n" +gdb_expect { + -re ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+.\[0-9\]+ = \{alpha = 1, beta = 0, gamma = 1, delta = 0, epsilon = 1, omega = 0\}\[ \r\n\]+$gdb_prompt $" { + pass "print print_bit_flags(*flags)" + } + -re ".*$gdb_prompt $" { fail "print print_bit_flags(*flags)" } + timeout { fail "(timeout) print_bit_flags(*flags)" } + } + +send_gdb "print print_bit_flags_combo(*flags_combo)\n" +gdb_expect { + -re ".*alpha\[ \r\n\]+gamma\[ \r\n\]+epsilon\[ \r\n\]+ch1: y\[ \t\]+ch2: n\[ \r\n\]+.\[0-9\]+ = \{alpha = 1, beta = 0, ch1 = 121 'y', gamma = 1, delta = 0, ch2 = 110 'n', epsilon = 1, omega = 0\}\[ \r\n\]+$gdb_prompt $" { + pass "print print_bit_flags_combo(*flags_combo)" + } + -re ".*$gdb_prompt $" { fail "print print_bit_flags_combo(*flags_combo)" } + timeout { fail "(timeout) print_bit_flags_combo(*flags_combo)" } + } + +send_gdb "print print_three_chars(*three_char)\n" +gdb_expect { + -re ".*Contents of three_char_t:\[ \r\n\]+x\[ \t\]+y\[ \t\]+z\[ \r\n\]+.\[0-9\]+ = \{ch1 = 120 'x', ch2 = 121 'y', ch3 = 122 'z'\}\[ \r\n\]+$gdb_prompt $" { + pass "print print_three_chars(*three_char)" + } + -re ".*$gdb_prompt $" { fail "print print_three_chars(*three_char)" } + timeout { fail "(timeout) print_three_chars(*three_char)" } + } + +send_gdb "print print_five_chars(*five_char)\n" +gdb_expect { + -re ".*Contents of five_char_t:\[ \r\n\]+h\[ \t\]+e\[ \t\]+l\[ \t\]+l\[ \t\]+o\[ \r\n\]+.\[0-9\]+ = \{ch1 = 104 'h', ch2 = 101 'e', ch3 = 108 'l', ch4 = 108 'l', ch5 = 111 'o'\}\[ \r\n\]+$gdb_prompt $" { + pass "print print_five_chars(*five_char)" + } + -re ".*$gdb_prompt $" { fail "print print_five_chars(*five_char)" } + timeout { fail "(timeout) print_five_chars(*five_char)" } + } + +send_gdb "print print_int_char_combo(*int_char_combo)\n" +gdb_expect { + -re ".*Contents of int_char_combo_t:\[ \r\n\]+13\[ \t\]+!\[ \r\n\]+.\[0-9\]+ = \{int1 = 13, ch1 = 33 '!'\}\[ \r\n\]+$gdb_prompt $" { + pass "print print_int_char_combo(*int_char_combo)" + } + -re ".*$gdb_prompt $" { fail "print print_int_char_combo(*int_char_combo)" } + timeout { fail "(timeout) print_int_char_combo(*int_char_combo)" } + } + +return + + + + + + + + + + + + + + + diff --git a/gdb/testsuite/gdb.base/call-strs.c b/gdb/testsuite/gdb.base/call-strs.c new file mode 100644 index 00000000000..9ba875b5d32 --- /dev/null +++ b/gdb/testsuite/gdb.base/call-strs.c @@ -0,0 +1,54 @@ +#include +char buf[100]; +char bigbuf[1000]; +char * s; + +char * str_func1(s1) +char *s1; +{ + printf("first string arg is: %s\n", s1); + strcpy(bigbuf, s1); + return bigbuf; +} + +char * str_func(s1, + s2, + s3, + s4, + s5, + s6, + s7) +char * s1; +char * s2; +char * s3; +char * s4; +char * s5; +char * s6; +char * s7; +{ + printf("first string arg is: %s\n", s1); + printf("second string arg is: %s\n", s2); + printf("third string arg is: %s\n", s3); + printf("fourth string arg is: %s\n", s4); + printf("fifth string arg is: %s\n", s5); + printf("sixth string arg is: %s\n", s6); + printf("seventh string arg is: %s\n", s7); + strcpy(bigbuf, s1); + strcat(bigbuf, s2); + strcat(bigbuf, s3); + strcat(bigbuf, s4); + strcat(bigbuf, s5); + strcat(bigbuf, s6); + strcat(bigbuf, s7); + return bigbuf; +} + + +main() +{ + s = &buf[0]; + strcpy(buf, "test string"); + str_func("abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx", "yz12"); + str_func1("abcd"); +} + diff --git a/gdb/testsuite/gdb.base/call-strs.exp b/gdb/testsuite/gdb.base/call-strs.exp new file mode 100644 index 00000000000..20f358a3b63 --- /dev/null +++ b/gdb/testsuite/gdb.base/call-strs.exp @@ -0,0 +1,242 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This test deals with calling functions which have strings as parameters. +# it plays around with constant strings. +# the corresponding source file is call-strs.c +# + +#debug strarg + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "call-strs" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + + +# The a29k can't call functions, so don't even bother with this test. +if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + continue +} + +# Set the current language to C. This counts as a test. If it +# fails, then we skip the other tests. + +proc set_lang_c {} { + global gdb_prompt + + send_gdb "set language c\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "set language c (timeout)" ; return 0; } + } + + send_gdb "show language\n" + gdb_expect { + -re ".* source language is \"c\".*$gdb_prompt $" { + pass "set language to \"c\"" + return 1 + } + -re ".*$gdb_prompt $" { + fail "setting language to \"c\"" + return 0 + } + timeout { + fail "can't show language (timeout)" + return 0 + } + } +} + + + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $" + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +#step +send_gdb "step\n" +gdb_expect { + -re ".*strcpy\\(buf, \"test string\"\\);.*$gdb_prompt $" {pass "step after assignment to s"} + -re ".*$gdb_prompt $" { fail "step after assignment to s" } + timeout { fail "step after assignment to s (timeout)" } + } + + +#step +send_gdb "step\n" +gdb_expect { + -re ".*str_func\\(\"abcd\", \"efgh\", \"ijkl\", \"mnop\", \"qrst\", \"uvwx\", \"yz12\"\\);.*$gdb_prompt $" {pass "step after strcpy"} + -re ".*$gdb_prompt $" { fail "step after strcpy" } + timeout { fail "step after strcpy (timeout)" } + } + +#print buf +send_gdb "print buf\n" +gdb_expect { + -re ".*\"test string\",.*repeats 88 times.*$gdb_prompt $" { + pass "print buf" + } + -re ".*$gdb_prompt $" { fail "print buf" } + timeout { fail "(timeout) print buf" } + } + + +#print s +send_gdb "print s\n" +gdb_expect { + -re ".*= \"test string\".*$gdb_prompt $" { + pass "print s" + } + -re ".*$gdb_prompt $" { fail "print s" } + timeout { fail "(timeout) print sum_array_print(10, *list1, *list2, *list3, *list4)" } + } + + +#print str_func1(s) +send_gdb "print str_func1(s)\n" +gdb_expect { + -re "first string arg is: test string.*\"test string\".*$gdb_prompt $" { + pass "print str_func1(s)" + } + -re ".*$gdb_prompt $" { fail "print str_func1(s)" } + timeout { fail "(timeout) print str_func1(s)" } + } + + +#print str_func1("test string") +send_gdb "print str_func1(\"test string\")\n" +gdb_expect { + -re "first string arg is: test string.*\"test string\".*$gdb_prompt $" { + pass "print str_func1(\"test string\")" + } + -re ".*$gdb_prompt $" { fail "print str_func1(\"test string\")" } + timeout { fail "(timeout) print str_func1(\"test string\")" } + } + +#call str_func1(s) +send_gdb "call str_func1(s)\n" +gdb_expect { + -re "first string arg is: test string.*\"test string\".*$gdb_prompt $" { + pass "call str_func1(s)" + } + -re ".*$gdb_prompt $" { fail "call str_func1(s)" } + timeout { fail "(timeout) call str_func1(s)" } + } + +#call str_func1("test string") +send_gdb "call str_func1(\"test string\")\n" +gdb_expect { + -re "first string arg is: test string.*\"test string\".*$gdb_prompt $" { + pass "call str_func1(\"test string\")" + } + -re ".*$gdb_prompt $" { fail "call str_func1(\"test string\")" } + timeout { fail "(timeout) call str_func1(\"test string\")" } + } + +#print str_func1(buf) +send_gdb "print str_func1(buf)\n" +gdb_expect { + -re "first string arg is: test string.*\"test string\".*$gdb_prompt $" { + pass "print str_func1(buf)" + } + -re ".*$gdb_prompt $" { fail "print str_func1(buf)" } + timeout { fail "(timeout) print str_func1(buf)" } + } + +#call str_func1(buf) +send_gdb "call str_func1(buf)\n" +gdb_expect { + -re "first string arg is: test string.*\"test string\".*$gdb_prompt $" { + pass "call str_func1(buf)" + } + -re ".*$gdb_prompt $" { fail "call str_func1(buf)" } + timeout { fail "(timeout) call str_func1(buf)" } + } + +#print str_func("a","b","c","d","e","f","g") +send_gdb "print str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")\n" +gdb_expect { + -re "first string arg is: a\[ \t\r\n\]+second string arg is: b\[ \t\r\n\]+third string arg is: c\[ \t\r\n\]+fourth string arg is: d\[ \t\r\n\]+fifth string arg is: e\[ \t\r\n\]+sixth string arg is: f\[ \t\r\n\]+seventh string arg is: g\[ \t\r\n\]+.*= \"abcdefg\".*$gdb_prompt $" { + pass "print str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")" + } + -re ".*$gdb_prompt $" { fail "print str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")" } + timeout { fail "(timeout) print str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")" } + } + +#call str_func("a","b","c","d","e","f","g") +send_gdb "call str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")\n" +gdb_expect { + -re "first string arg is: a\[ \t\r\n\]+second string arg is: b\[ \t\r\n\]+third string arg is: c\[ \t\r\n\]+fourth string arg is: d\[ \t\r\n\]+fifth string arg is: e\[ \t\r\n\]+sixth string arg is: f\[ \t\r\n\]+seventh string arg is: g\[ \t\r\n\]+.*= \"abcdefg\".*$gdb_prompt $" { + pass "call str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")" + } + -re ".*$gdb_prompt $" { fail "call str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")" } + timeout { fail "(timeout) call str_func(\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\")" } + } + +#print str_func(s,s,s,s,s,s,s,s) +send_gdb "print str_func(s,s,s,s,s,s,s,s)\n" +gdb_expect { + -re "first string arg is: test string\[ \t\r\n\]+second string arg is: test string\[ \t\r\n\]+third string arg is: test string\[ \t\r\n\]+fourth string arg is: test string\[ \t\r\n\]+fifth string arg is: test string\[ \t\r\n\]+sixth string arg is: test string\[ \t\r\n\]+seventh string arg is: test string\[ \t\r\n\]+.*\"test stringtest stringtest stringtest stringtest stringtest stringtest string\".*$gdb_prompt $" { + pass "print str_func(s,s,s,s,s,s,s,s)" + } + -re ".*$gdb_prompt $" { fail "print str_func(s,s,s,s,s,s,s,s)" } + timeout { fail "(timeout) print str_func(s,s,s,s,s,s,s,s)" } + } + +#call str_func(s,s,s,s,s,s,s,s) +send_gdb "call str_func(s,s,s,s,s,s,s,s)\n" +gdb_expect { + -re "first string arg is: test string\[ \t\r\n\]+second string arg is: test string\[ \t\r\n\]+third string arg is: test string\[ \t\r\n\]+fourth string arg is: test string\[ \t\r\n\]+fifth string arg is: test string\[ \t\r\n\]+sixth string arg is: test string\[ \t\r\n\]+seventh string arg is: test string\[ \t\r\n\]+.*\"test stringtest stringtest stringtest stringtest stringtest stringtest string\".*$gdb_prompt $" { + pass "call str_func(s,s,s,s,s,s,s,s)" + } + -re ".*$gdb_prompt $" { fail "call str_func(s,s,s,s,s,s,s,s)" } + timeout { fail "(timeout) call str_func(s,s,s,s,s,s,s,s)" } + } + +gdb_exit +return 0 +~ diff --git a/gdb/testsuite/gdb.base/callfuncs.c b/gdb/testsuite/gdb.base/callfuncs.c new file mode 100644 index 00000000000..56b9ba8153b --- /dev/null +++ b/gdb/testsuite/gdb.base/callfuncs.c @@ -0,0 +1,280 @@ +/* Support program for testing gdb's ability to call functions + in the inferior, pass appropriate arguments to those functions, + and get the returned result. */ + +#ifdef NO_PROTOTYPES +#define PARAMS(paramlist) () +#else +#define PARAMS(paramlist) paramlist +#endif + +char char_val1 = 'a'; +char char_val2 = 'b'; + +short short_val1 = 10; +short short_val2 = -23; + +int int_val1 = 87; +int int_val2 = -26; + +long long_val1 = 789; +long long_val2 = -321; + +float float_val1 = 3.14159; +float float_val2 = -2.3765; + +double double_val1 = 45.654; +double double_val2 = -67.66; + +#define DELTA (0.001) + +char *string_val1 = "string 1"; +char *string_val2 = "string 2"; + +char char_array_val1[] = "carray 1"; +char char_array_val2[] = "carray 2"; + +struct struct1 { + char c; + short s; + int i; + long l; + float f; + double d; + char a[4]; +} struct_val1 = { 'x', 87, 76, 51, 2.1234, 9.876, "foo" }; + +/* Some functions that can be passed as arguments to other test + functions, or called directly. */ + +int add (a, b) +int a, b; +{ + return (a + b); +} + +int doubleit (a) +int a; +{ + return (a + a); +} + +int (*func_val1) PARAMS((int,int)) = add; +int (*func_val2) PARAMS((int)) = doubleit; + +/* An enumeration and functions that test for specific values. */ + +enum enumtype { enumval1, enumval2, enumval3 }; +enum enumtype enum_val1 = enumval1; +enum enumtype enum_val2 = enumval2; +enum enumtype enum_val3 = enumval3; + +int t_enum_value1 (enum_arg) +enum enumtype enum_arg; +{ + return (enum_arg == enum_val1); +} + +int t_enum_value2 (enum_arg) +enum enumtype enum_arg; +{ + return (enum_arg == enum_val2); +} + +int t_enum_value3 (enum_arg) +enum enumtype enum_arg; +{ + return (enum_arg == enum_val3); +} + +/* A function that takes a vector of integers (along with an explicit + count) and returns their sum. */ + +int sum_args (argc, argv) +int argc; +int argv[]; +{ + int sumval = 0; + int idx; + + for (idx = 0; idx < argc; idx++) + { + sumval += argv[idx]; + } + return (sumval); +} + +/* Test that we can call functions that take structs and return + members from that struct */ + +char t_structs_c (tstruct) struct struct1 tstruct; { return (tstruct.c); } +short t_structs_s (tstruct) struct struct1 tstruct; { return (tstruct.s); } +int t_structs_i (tstruct) struct struct1 tstruct; { return (tstruct.i); } +long t_structs_l (tstruct) struct struct1 tstruct; { return (tstruct.l); } +float t_structs_f (tstruct) struct struct1 tstruct; { return (tstruct.f); } +double t_structs_d (tstruct) struct struct1 tstruct; { return (tstruct.d); } +char *t_structs_a (tstruct) struct struct1 tstruct; { return (tstruct.a); } + +/* Test that calling functions works if there are a lot of arguments. */ +int +sum10 (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) + int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9; +{ + return i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9; +} + +/* Test that args are passed in the right order. */ +int +cmp10 (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) + int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9; +{ + return + (i0 == 0) && (i1 == 1) && (i2 == 2) && (i3 == 3) && (i4 == 4) && + (i5 == 5) && (i6 == 6) && (i7 == 7) && (i8 == 8) && (i9 == 9); +} + + +/* Gotta have a main to be able to generate a linked, runnable + executable, and also provide a useful place to set a breakpoint. */ +extern void * malloc() ; +int main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + malloc(1); + t_structs_c(struct_val1); + return 0 ; +} + +/* Functions that expect specific values to be passed and return + either 0 or 1, depending upon whether the values were + passed incorrectly or correctly, respectively. */ + +int t_char_values (char_arg1, char_arg2) +char char_arg1, char_arg2; +{ + return ((char_arg1 == char_val1) && (char_arg2 == char_val2)); +} + +int +#ifdef NO_PROTOTYPES +t_small_values (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) + char arg1; + short arg2; + int arg3; + char arg4; + short arg5; + char arg6; + short arg7; + int arg8; + short arg9; + short arg10; +#else +t_small_values (char arg1, short arg2, int arg3, char arg4, short arg5, + char arg6, short arg7, int arg8, short arg9, short arg10) +#endif +{ + return arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9 + arg10; +} + +int t_short_values (short_arg1, short_arg2) +short short_arg1, short_arg2; +{ + return ((short_arg1 == short_val1) && (short_arg2 == short_val2)); +} + +int t_int_values (int_arg1, int_arg2) +int int_arg1, int_arg2; +{ + return ((int_arg1 == int_val1) && (int_arg2 == int_val2)); +} + +int t_long_values (long_arg1, long_arg2) +long long_arg1, long_arg2; +{ + return ((long_arg1 == long_val1) && (long_arg2 == long_val2)); +} + +int t_float_values (float_arg1, float_arg2) +float float_arg1, float_arg2; +{ + return ((float_arg1 - float_val1) < DELTA + && (float_arg1 - float_val1) > -DELTA + && (float_arg2 - float_val2) < DELTA + && (float_arg2 - float_val2) > -DELTA); +} + +int +#ifdef NO_PROTOTYPES +/* In this case we are just duplicating t_float_values, but that is the + easiest way to deal with either ANSI or non-ANSI. */ +t_float_values2 (float_arg1, float_arg2) + float float_arg1, float_arg2; +#else +t_float_values2 (float float_arg1, float float_arg2) +#endif +{ + return ((float_arg1 - float_val1) < DELTA + && (float_arg1 - float_val1) > -DELTA + && (float_arg2 - float_val2) < DELTA + && (float_arg2 - float_val2) > -DELTA); +} + +int t_double_values (double_arg1, double_arg2) +double double_arg1, double_arg2; +{ + return ((double_arg1 - double_val1) < DELTA + && (double_arg1 - double_val1) > -DELTA + && (double_arg2 - double_val2) < DELTA + && (double_arg2 - double_val2) > -DELTA); +} + +int t_string_values (string_arg1, string_arg2) +char *string_arg1, *string_arg2; +{ + return (!strcmp (string_arg1, string_val1) && + !strcmp (string_arg2, string_val2)); +} + +int t_char_array_values (char_array_arg1, char_array_arg2) +char char_array_arg1[], char_array_arg2[]; +{ + return (!strcmp (char_array_arg1, char_array_val1) && + !strcmp (char_array_arg2, char_array_val2)); +} + + +/* This used to simply compare the function pointer arguments with + known values for func_val1 and func_val2. Doing so is valid ANSI + code, but on some machines (RS6000, HPPA, others?) it may fail when + called directly by GDB. + + In a nutshell, it's not possible for GDB to determine when the address + of a function or the address of the function's stub/trampoline should + be passed. + + So, to avoid GDB lossage in the common case, we perform calls through the + various function pointers and compare the return values. For the HPPA + at least, this allows the common case to work. + + If one wants to try something more complicated, pass the address of + a function accepting a "double" as one of its first 4 arguments. Call + that function indirectly through the function pointer. This would fail + on the HPPA. */ + +int t_func_values (func_arg1, func_arg2) +int (*func_arg1) PARAMS ((int, int)); +int (*func_arg2) PARAMS ((int)); +{ + return ((*func_arg1) (5,5) == (*func_val1) (5,5) + && (*func_arg2) (6) == (*func_val2) (6)); +} + +int t_call_add (func_arg1, a, b) +int (*func_arg1) PARAMS ((int, int)); +int a, b; +{ + return ((*func_arg1)(a, b)); +} diff --git a/gdb/testsuite/gdb.base/callfuncs.exp b/gdb/testsuite/gdb.base/callfuncs.exp new file mode 100644 index 00000000000..19b5c965a94 --- /dev/null +++ b/gdb/testsuite/gdb.base/callfuncs.exp @@ -0,0 +1,269 @@ +# Copyright (C) 92, 96, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) +# and modified by Bob Manson. (manson@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "callfuncs" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +set prototypes 1 +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + set prototypes 0; + # built the second test case since we can't use prototypes + warning "Prototypes not supported, rebuilding with -DNO_PROTOTYPES" + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DNO_PROTOTYPES}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. + +if [get_compiler_info ${binfile}] { + return -1; +} + +# The a29k can't call functions, so don't even bother with this test. +if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + continue +} + +# Set the current language to C. This counts as a test. If it +# fails, then we skip the other tests. + +proc set_lang_c {} { + global gdb_prompt + + send_gdb "set language c\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "set language c (timeout)" ; return 0; } + } + + send_gdb "show language\n" + gdb_expect { + -re ".* source language is \"c\".*$gdb_prompt $" { + pass "set language to \"c\"" + return 1 + } + -re ".*$gdb_prompt $" { + fail "setting language to \"c\"" + return 0 + } + timeout { + fail "can't show language (timeout)" + return 0 + } + } +} + +# FIXME: Before calling this proc, we should probably verify that +# we can call inferior functions and get a valid integral value +# returned. +# Note that it is OK to check for 0 or 1 as the returned values, because C +# specifies that the numeric value of a relational or logical expression +# (computed in the inferior) is 1 for true and 0 for false. + +proc do_function_calls {} { + global prototypes + global gcc_compiled + # We need to up this because this can be really slow on some boards. + set timeout 60; + + gdb_test "p t_char_values(0,0)" " = 0" + gdb_test "p t_char_values('a','b')" " = 1" + gdb_test "p t_char_values(char_val1,char_val2)" " = 1" + gdb_test "p t_char_values('a',char_val2)" " = 1" + gdb_test "p t_char_values(char_val1,'b')" " = 1" + + gdb_test "p t_short_values(0,0)" " = 0" + gdb_test "p t_short_values(10,-23)" " = 1" + gdb_test "p t_short_values(short_val1,short_val2)" " = 1" + gdb_test "p t_short_values(10,short_val2)" " = 1" + gdb_test "p t_short_values(short_val1,-23)" " = 1" + + gdb_test "p t_int_values(0,0)" " = 0" + gdb_test "p t_int_values(87,-26)" " = 1" + gdb_test "p t_int_values(int_val1,int_val2)" " = 1" + gdb_test "p t_int_values(87,int_val2)" " = 1" + gdb_test "p t_int_values(int_val1,-26)" " = 1" + + gdb_test "p t_long_values(0,0)" " = 0" + gdb_test "p t_long_values(789,-321)" " = 1" + gdb_test "p t_long_values(long_val1,long_val2)" " = 1" + gdb_test "p t_long_values(789,long_val2)" " = 1" + gdb_test "p t_long_values(long_val1,-321)" " = 1" + + if ![target_info exists gdb,skip_float_tests] { + gdb_test "p t_float_values(0.0,0.0)" " = 0" + + # These next four tests fail on the mn10300. + # The first value is passed in regs, the other in memory. + # Gcc emits different stabs for the two parameters; the first is + # claimed to be a float, the second a double. + # dbxout.c in gcc claims this is the desired behavior. + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(3.14159,-2.3765)" " = 1" + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(float_val1,float_val2)" " = 1" + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(3.14159,float_val2)" " = 1" + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(float_val1,-2.3765)" " = 1" + + # Test passing of arguments which might not be widened. + gdb_test "p t_float_values2(0.0,0.0)" " = 0" + + # Although PR 5318 mentions SunOS specifically, this seems + # to be a generic problem on quite a few platforms. + if $prototypes then { + setup_xfail "hppa*-*-*" "sparc-*-*" "mips*-*-*" 5318 + if {!$gcc_compiled} then { + setup_xfail "alpha-dec-osf2*" "i*86-*-sysv4*" 5318 + } + } + gdb_test "p t_float_values2(3.14159,float_val2)" " = 1" + gdb_test "p t_small_values(1,2,3,4,5,6,7,8,9,10)" " = 55" + + gdb_test "p t_double_values(0.0,0.0)" " = 0" + gdb_test "p t_double_values(45.654,-67.66)" " = 1" + gdb_test "p t_double_values(double_val1,double_val2)" " = 1" + gdb_test "p t_double_values(45.654,double_val2)" " = 1" + gdb_test "p t_double_values(double_val1,-67.66)" " = 1" + } + + gdb_test "p t_string_values(string_val2,string_val1)" " = 0" + gdb_test "p t_string_values(string_val1,string_val2)" " = 1" + gdb_test "p t_string_values(\"string 1\",\"string 2\")" " = 1" + gdb_test "p t_string_values(\"string 1\",string_val2)" " = 1" + gdb_test "p t_string_values(string_val1,\"string 2\")" " = 1" + + gdb_test "p t_char_array_values(char_array_val2,char_array_val1)" " = 0" + gdb_test "p t_char_array_values(char_array_val1,char_array_val2)" " = 1" + gdb_test "p t_char_array_values(\"carray 1\",\"carray 2\")" " = 1" + gdb_test "p t_char_array_values(\"carray 1\",char_array_val2)" " = 1" + gdb_test "p t_char_array_values(char_array_val1,\"carray 2\")" " = 1" + + gdb_test "p doubleit(4)" " = 8" + gdb_test "p add(4,5)" " = 9" + gdb_test "p t_func_values(func_val2,func_val1)" " = 0" + gdb_test "p t_func_values(func_val1,func_val2)" " = 1" + + # On the rs6000, we need to pass the address of the trampoline routine, + # not the address of add itself. I don't know how to go from add to + # the address of the trampoline. Similar problems exist on the HPPA, + # and in fact can present an unsolvable problem as the stubs may not + # even exist in the user's program. We've slightly recoded t_func_values + # to avoid such problems in the common case. This may or may not help + # the RS6000. + setup_xfail "rs6000*-*-*" + setup_xfail "powerpc*-*-*" + if {!$gcc_compiled && [istarget hppa*-*-hpux*]} then { + gdb_test "p t_func_values(add,func_val2)" "You cannot.*ignored.*" + } else { + gdb_test "p t_func_values(add,func_val2)" " = 1" + } + + setup_xfail "rs6000*-*-*" + setup_xfail "powerpc*-*-*" + if {!$gcc_compiled && [istarget hppa*-*-hpux*]} then { + gdb_test "p t_func_values(func_val1,doubleit)" "You cannot.*ignored.*" + } else { + gdb_test "p t_func_values(func_val1,doubleit)" " = 1" + } + + gdb_test "p t_call_add(func_val1,3,4)" " = 7" + + setup_xfail "rs6000*-*-*" + setup_xfail "powerpc*-*-*" + if {!$gcc_compiled && [istarget hppa*-*-hpux*]} then { + gdb_test "p t_call_add(add,3,4)" "You cannot.*ignored.*" + } else { + gdb_test "p t_call_add(add,3,4)" " = 7" + } + + gdb_test "p t_enum_value1(enumval1)" " = 1" + gdb_test "p t_enum_value1(enum_val1)" " = 1" + gdb_test "p t_enum_value1(enum_val2)" " = 0" + + gdb_test "p t_enum_value2(enumval2)" " = 1" + gdb_test "p t_enum_value2(enum_val2)" " = 1" + gdb_test "p t_enum_value2(enum_val1)" " = 0" + + gdb_test "p sum_args(1,{2})" " = 2" + gdb_test "p sum_args(2,{2,3})" " = 5" + gdb_test "p sum_args(3,{2,3,4})" " = 9" + gdb_test "p sum_args(4,{2,3,4,5})" " = 14" + + gdb_test "p sum10 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)" " = 55" + + gdb_test "p cmp10 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)" " = 1" + + gdb_test "p t_structs_c(struct_val1)" "= 120 'x'" \ + "call inferior func with struct - returns char" + gdb_test "p t_structs_s(struct_val1)" "= 87" \ + "call inferior func with struct - returns short" + gdb_test "p t_structs_i(struct_val1)" "= 76" \ + "call inferior func with struct - returns int" + gdb_test "p t_structs_l(struct_val1)" "= 51" \ + "call inferior func with struct - returns long" + setup_xfail "i*86-*-*" + gdb_test "p t_structs_f(struct_val1)" "= 2.12.*" \ + "call inferior func with struct - returns float" + setup_xfail "i*86-*-*" + gdb_test "p t_structs_d(struct_val1)" "= 9.87.*" \ + "call inferior func with struct - returns double" + gdb_test "p t_structs_a(struct_val1)" "= (.unsigned char .. )?\"foo\"" \ + "call inferior func with struct - returns char *" +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +gdb_test "set print sevenbit-strings" "" +gdb_test "set print address off" "" +gdb_test "set width 0" "" + +if { ![set_lang_c] } { + gdb_suppress_tests; +} else { + if { ![runto_main] } { + gdb_suppress_tests; + } +} + +gdb_test "next" ".*" +do_function_calls + +return 0 diff --git a/gdb/testsuite/gdb.base/callfuncs2.c b/gdb/testsuite/gdb.base/callfuncs2.c new file mode 100644 index 00000000000..ac14d457ae3 --- /dev/null +++ b/gdb/testsuite/gdb.base/callfuncs2.c @@ -0,0 +1,267 @@ +/* Support program for testing gdb's ability to call functions + in an inferior which doesn't itself call malloc, pass appropriate + arguments to those functions, and get the returned result. */ + +#ifdef NO_PROTOTYPES +#define PARAMS(paramlist) () +#else +#define PARAMS(paramlist) paramlist +#endif + +char char_val1 = 'a'; +char char_val2 = 'b'; + +short short_val1 = 10; +short short_val2 = -23; + +int int_val1 = 87; +int int_val2 = -26; + +long long_val1 = 789; +long long_val2 = -321; + +float float_val1 = 3.14159; +float float_val2 = -2.3765; + +double double_val1 = 45.654; +double double_val2 = -67.66; + +#define DELTA (0.001) + +char *string_val1 = "string 1"; +char *string_val2 = "string 2"; + +char char_array_val1[] = "carray 1"; +char char_array_val2[] = "carray 2"; + +struct struct1 { + char c; + short s; + int i; + long l; + float f; + double d; + char a[4]; +} struct_val1 = { 'x', 87, 76, 51, 2.1234, 9.876, "foo" }; + +/* Some functions that can be passed as arguments to other test + functions, or called directly. */ + +int add (a, b) +int a, b; +{ + return (a + b); +} + +int doubleit (a) +int a; +{ + return (a + a); +} + +int (*func_val1) PARAMS((int,int)) = add; +int (*func_val2) PARAMS((int)) = doubleit; + +/* An enumeration and functions that test for specific values. */ + +enum enumtype { enumval1, enumval2, enumval3 }; +enum enumtype enum_val1 = enumval1; +enum enumtype enum_val2 = enumval2; +enum enumtype enum_val3 = enumval3; + +t_enum_value1 (enum_arg) +enum enumtype enum_arg; +{ + return (enum_arg == enum_val1); +} + +t_enum_value2 (enum_arg) +enum enumtype enum_arg; +{ + return (enum_arg == enum_val2); +} + +t_enum_value3 (enum_arg) +enum enumtype enum_arg; +{ + return (enum_arg == enum_val3); +} + +/* A function that takes a vector of integers (along with an explicit + count) and returns their sum. */ + +int sum_args (argc, argv) +int argc; +int argv[]; +{ + int sumval = 0; + int idx; + + for (idx = 0; idx < argc; idx++) + { + sumval += argv[idx]; + } + return (sumval); +} + +/* Test that we can call functions that take structs and return + members from that struct */ + +char t_structs_c (tstruct) struct struct1 tstruct; { return (tstruct.c); } +short t_structs_s (tstruct) struct struct1 tstruct; { return (tstruct.s); } +int t_structs_i (tstruct) struct struct1 tstruct; { return (tstruct.i); } +long t_structs_l (tstruct) struct struct1 tstruct; { return (tstruct.l); } +float t_structs_f (tstruct) struct struct1 tstruct; { return (tstruct.f); } +double t_structs_d (tstruct) struct struct1 tstruct; { return (tstruct.d); } +char *t_structs_a (tstruct) struct struct1 tstruct; { return (tstruct.a); } + +/* Test that calling functions works if there are a lot of arguments. */ +int +sum10 (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) + int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9; +{ + return i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9; +} + +/* Gotta have a main to be able to generate a linked, runnable + executable, and also provide a useful place to set a breakpoint. */ + +main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + t_structs_c(struct_val1); +} + +/* Functions that expect specific values to be passed and return + either 0 or 1, depending upon whether the values were + passed incorrectly or correctly, respectively. */ + +int t_char_values (char_arg1, char_arg2) +char char_arg1, char_arg2; +{ + return ((char_arg1 == char_val1) && (char_arg2 == char_val2)); +} + +int +#ifdef NO_PROTOTYPES +t_small_values (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) + char arg1; + short arg2; + int arg3; + char arg4; + short arg5; + char arg6; + short arg7; + int arg8; + short arg9; + short arg10; +#else +t_small_values (char arg1, short arg2, int arg3, char arg4, short arg5, + char arg6, short arg7, int arg8, short arg9, short arg10) +#endif +{ + return arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9 + arg10; +} + +int t_short_values (short_arg1, short_arg2) +short short_arg1, short_arg2; +{ + return ((short_arg1 == short_val1) && (short_arg2 == short_val2)); +} + +int t_int_values (int_arg1, int_arg2) +int int_arg1, int_arg2; +{ + return ((int_arg1 == int_val1) && (int_arg2 == int_val2)); +} + +int t_long_values (long_arg1, long_arg2) +long long_arg1, long_arg2; +{ + return ((long_arg1 == long_val1) && (long_arg2 == long_val2)); +} + +int t_float_values (float_arg1, float_arg2) +float float_arg1, float_arg2; +{ + return ((float_arg1 - float_val1) < DELTA + && (float_arg1 - float_val1) > -DELTA + && (float_arg2 - float_val2) < DELTA + && (float_arg2 - float_val2) > -DELTA); +} + +int +#ifdef NO_PROTOTYPES +/* In this case we are just duplicating t_float_values, but that is the + easiest way to deal with either ANSI or non-ANSI. */ +t_float_values2 (float_arg1, float_arg2) + float float_arg1, float_arg2; +#else +t_float_values2 (float float_arg1, float float_arg2) +#endif +{ + return ((float_arg1 - float_val1) < DELTA + && (float_arg1 - float_val1) > -DELTA + && (float_arg2 - float_val2) < DELTA + && (float_arg2 - float_val2) > -DELTA); +} + +int t_double_values (double_arg1, double_arg2) +double double_arg1, double_arg2; +{ + return ((double_arg1 - double_val1) < DELTA + && (double_arg1 - double_val1) > -DELTA + && (double_arg2 - double_val2) < DELTA + && (double_arg2 - double_val2) > -DELTA); +} + +int t_string_values (string_arg1, string_arg2) +char *string_arg1, *string_arg2; +{ + return (!strcmp (string_arg1, string_val1) && + !strcmp (string_arg2, string_val2)); +} + +int t_char_array_values (char_array_arg1, char_array_arg2) +char char_array_arg1[], char_array_arg2[]; +{ + return (!strcmp (char_array_arg1, char_array_val1) && + !strcmp (char_array_arg2, char_array_val2)); +} + + +/* This used to simply compare the function pointer arguments with + known values for func_val1 and func_val2. Doing so is valid ANSI + code, but on some machines (RS6000, HPPA, others?) it may fail when + called directly by GDB. + + In a nutshell, it's not possible for GDB to determine when the address + of a function or the address of the function's stub/trampoline should + be passed. + + So, to avoid GDB lossage in the common case, we perform calls through the + various function pointers and compare the return values. For the HPPA + at least, this allows the common case to work. + + If one wants to try something more complicated, pass the address of + a function accepting a "double" as one of its first 4 arguments. Call + that function indirectly through the function pointer. This would fail + on the HPPA. */ + +int t_func_values (func_arg1, func_arg2) +int (*func_arg1) PARAMS ((int, int)); +int (*func_arg2) PARAMS ((int)); +{ + return ((*func_arg1) (5,5) == (*func_val1) (5,5) + && (*func_arg2) (6) == (*func_val2) (6)); +} + +int t_call_add (func_arg1, a, b) +int (*func_arg1) PARAMS ((int, int)); +int a, b; +{ + return ((*func_arg1)(a, b)); +} diff --git a/gdb/testsuite/gdb.base/callfuncs2.exp b/gdb/testsuite/gdb.base/callfuncs2.exp new file mode 100644 index 00000000000..8b17b6346bb --- /dev/null +++ b/gdb/testsuite/gdb.base/callfuncs2.exp @@ -0,0 +1,276 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +# SAME tests as in callfuncs.exp but here the inferior program does not call malloc. + + + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "callfuncs2" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +set prototypes 1 +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + set prototypes 0; + # built the second test case since we can't use prototypes + warning "Prototypes not supported, rebuilding with -DNO_PROTOTYPES" + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DNO_PROTOTYPES}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. + +if [get_compiler_info ${binfile}] { + return -1; +} + + + +# The a29k can't call functions, so don't even bother with this test. +if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + continue +} + +# Set the current language to C. This counts as a test. If it +# fails, then we skip the other tests. + +proc set_lang_c {} { + global gdb_prompt + + send_gdb "set language c\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "set language c (timeout)" ; return 0 } + } + + send_gdb "show language\n" + gdb_expect { + -re ".* source language is \"c\".*$gdb_prompt $" { + pass "set language to \"c\"" + return 1 + } + -re ".*$gdb_prompt $" { + fail "setting language to \"c\"" + return 0 + } + timeout { + fail "can't show language (timeout)" + return 0 + } + } +} + +# FIXME: Before calling this proc, we should probably verify that +# we can call inferior functions and get a valid integral value +# returned. +# Note that it is OK to check for 0 or 1 as the returned values, because C +# specifies that the numeric value of a relational or logical expression +# (computed in the inferior) is 1 for true and 0 for false. + +proc do_function_calls {} { + global prototypes + global gcc_compiled + # We need to up this because this can be really slow on some boards. + set timeout 60; + + gdb_test "p t_char_values(0,0)" " = 0" + gdb_test "p t_char_values('a','b')" " = 1" + gdb_test "p t_char_values(char_val1,char_val2)" " = 1" + gdb_test "p t_char_values('a',char_val2)" " = 1" + gdb_test "p t_char_values(char_val1,'b')" " = 1" + + gdb_test "p t_short_values(0,0)" " = 0" + gdb_test "p t_short_values(10,-23)" " = 1" + gdb_test "p t_short_values(short_val1,short_val2)" " = 1" + gdb_test "p t_short_values(10,short_val2)" " = 1" + gdb_test "p t_short_values(short_val1,-23)" " = 1" + + gdb_test "p t_int_values(0,0)" " = 0" + gdb_test "p t_int_values(87,-26)" " = 1" + gdb_test "p t_int_values(int_val1,int_val2)" " = 1" + gdb_test "p t_int_values(87,int_val2)" " = 1" + gdb_test "p t_int_values(int_val1,-26)" " = 1" + + gdb_test "p t_long_values(0,0)" " = 0" + gdb_test "p t_long_values(789,-321)" " = 1" + gdb_test "p t_long_values(long_val1,long_val2)" " = 1" + gdb_test "p t_long_values(789,long_val2)" " = 1" + gdb_test "p t_long_values(long_val1,-321)" " = 1" + + if ![target_info exists gdb,skip_float_tests] { + gdb_test "p t_float_values(0.0,0.0)" " = 0" + + # These next four tests fail on the mn10300. + # The first value is passed in regs, the other in memory. + # Gcc emits different stabs for the two parameters; the first is + # claimed to be a float, the second a double. + # dbxout.c in gcc claims this is the desired behavior. + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(3.14159,-2.3765)" " = 1" + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(float_val1,float_val2)" " = 1" + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(3.14159,float_val2)" " = 1" + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(float_val1,-2.3765)" " = 1" + + # Test passing of arguments which might not be widened. + gdb_test "p t_float_values2(0.0,0.0)" " = 0" + + # Although PR 5318 mentions SunOS specifically, this seems + # to be a generic problem on quite a few platforms. + if $prototypes then { + setup_xfail "hppa*-*-*" "sparc-*-*" "mips*-*-*" 5318 + if {!$gcc_compiled} then { + setup_xfail "alpha-dec-osf2*" "i*86-*-sysv4*" 5318 + } + } + gdb_test "p t_float_values2(3.14159,float_val2)" " = 1" + gdb_test "p t_small_values(1,2,3,4,5,6,7,8,9,10)" " = 55" + + gdb_test "p t_double_values(0.0,0.0)" " = 0" + gdb_test "p t_double_values(45.654,-67.66)" " = 1" + gdb_test "p t_double_values(double_val1,double_val2)" " = 1" + gdb_test "p t_double_values(45.654,double_val2)" " = 1" + gdb_test "p t_double_values(double_val1,-67.66)" " = 1" + + } + + gdb_test "p t_string_values(string_val2,string_val1)" " = 0" + gdb_test "p t_string_values(string_val1,string_val2)" " = 1" + gdb_test "p t_string_values(\"string 1\",\"string 2\")" " = 1" + gdb_test "p t_string_values(\"string 1\",string_val2)" " = 1" + gdb_test "p t_string_values(string_val1,\"string 2\")" " = 1" + + gdb_test "p t_char_array_values(char_array_val2,char_array_val1)" " = 0" + gdb_test "p t_char_array_values(char_array_val1,char_array_val2)" " = 1" + gdb_test "p t_char_array_values(\"carray 1\",\"carray 2\")" " = 1" + gdb_test "p t_char_array_values(\"carray 1\",char_array_val2)" " = 1" + gdb_test "p t_char_array_values(char_array_val1,\"carray 2\")" " = 1" + + gdb_test "p doubleit(4)" " = 8" + gdb_test "p add(4,5)" " = 9" + gdb_test "p t_func_values(func_val2,func_val1)" " = 0" + gdb_test "p t_func_values(func_val1,func_val2)" " = 1" + + # On the rs6000, we need to pass the address of the trampoline routine, + # not the address of add itself. I don't know how to go from add to + # the address of the trampoline. Similar problems exist on the HPPA, + # and in fact can present an unsolvable problem as the stubs may not + # even exist in the user's program. We've slightly recoded t_func_values + # to avoid such problems in the common case. This may or may not help + # the RS6000. + setup_xfail "rs6000*-*-*" + setup_xfail "powerpc*-*-*" + + if {!$gcc_compiled && [istarget hppa*-*-hpux*]} then { + gdb_test "p t_func_values(add,func_val2)" "You cannot.*ignored.*" + } else { + gdb_test "p t_func_values(add,func_val2)" " = 1" + } + + setup_xfail "rs6000*-*-*" + setup_xfail "powerpc*-*-*" + + if {!$gcc_compiled && [istarget hppa*-*-hpux*]} then { + gdb_test "p t_func_values(func_val1,doubleit)" "You cannot.*ignored.*" + } else { + gdb_test "p t_func_values(func_val1,doubleit)" " = 1" + } + + gdb_test "p t_call_add(func_val1,3,4)" " = 7" + + setup_xfail "rs6000*-*-*" + setup_xfail "powerpc*-*-*" + + if {!$gcc_compiled && [istarget hppa*-*-hpux*]} then { + gdb_test "p t_call_add(add,3,4)" "You cannot.*ignored.*" + } else { + gdb_test "p t_call_add(add,3,4)" " = 7" + } + + gdb_test "p t_enum_value1(enumval1)" " = 1" + gdb_test "p t_enum_value1(enum_val1)" " = 1" + gdb_test "p t_enum_value1(enum_val2)" " = 0" + + gdb_test "p t_enum_value2(enumval2)" " = 1" + gdb_test "p t_enum_value2(enum_val2)" " = 1" + gdb_test "p t_enum_value2(enum_val1)" " = 0" + + gdb_test "p sum_args(1,{2})" " = 2" + gdb_test "p sum_args(2,{2,3})" " = 5" + gdb_test "p sum_args(3,{2,3,4})" " = 9" + gdb_test "p sum_args(4,{2,3,4,5})" " = 14" + gdb_test "p sum10 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)" " = 55" + + gdb_test "p t_structs_c(struct_val1)" "= 120 'x'" \ + "call inferior func with struct - returns char" + gdb_test "p t_structs_s(struct_val1)" "= 87" \ + "call inferior func with struct - returns short" + gdb_test "p t_structs_i(struct_val1)" "= 76" \ + "call inferior func with struct - returns int" + gdb_test "p t_structs_l(struct_val1)" "= 51" \ + "call inferior func with struct - returns long" + setup_xfail "i*86-*-*" + gdb_test "p t_structs_f(struct_val1)" "= 2.12.*" \ + "call inferior func with struct - returns float" + setup_xfail "i*86-*-*" + gdb_test "p t_structs_d(struct_val1)" "= 9.87.*" \ + "call inferior func with struct - returns double" + gdb_test "p t_structs_a(struct_val1)" "= (.unsigned char .. )?\"foo\"" \ + "call inferior func with struct - returns char *" + +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +gdb_test "set print sevenbit-strings" "" +gdb_test "set print address off" "" +gdb_test "set width 0" "" + +if { ![set_lang_c] } { + gdb_suppress_tests; +} else { + if { ![runto_main] } { + gdb_suppress_tests; + } +} + +gdb_test "next" ".*" +do_function_calls + +return 0 diff --git a/gdb/testsuite/gdb.base/commands.exp b/gdb/testsuite/gdb.base/commands.exp new file mode 100644 index 00000000000..f70ac6b01d5 --- /dev/null +++ b/gdb/testsuite/gdb.base/commands.exp @@ -0,0 +1,248 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel +} + +# +# test special commands (if, while, etc) +# +set prms_id 0 +set bug_id 0 + +set testfile "run" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/commands +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +delete_breakpoints +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +proc gdbvar_simple_if_test {} { + global gdb_prompt + + gdb_test "set \$foo = 0" "" "set foo in gdbvar_simple_if_test" + # All this test should do is print 0xdeadbeef once. + gdb_test "if \$foo == 1\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" "\\\$\[0-9\]* = 0xdeadbeef" "gdbvar_simple_if_test #1" + # All this test should do is print 0xfeedface once. + gdb_test "if \$foo == 0\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" "\\\$\[0-9\]* = 0xfeedface" "gdbvar_simple_if_test #2" +} + +proc gdbvar_simple_while_test {} { + global gdb_prompt + + gdb_test "set \$foo = 5" "" "set foo in gdbvar_simple_while_test" + # This test should print 0xfeedface five times. + gdb_test "while \$foo > 0\np/x 0xfeedface\nset \$foo -= 1\nend" "\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" "gdbvar_simple_while_test #1" +} + +proc gdbvar_complex_if_while_test {} { + global gdb_prompt + + gdb_test "set \$foo = 4" "" "set foo in gdbvar complex_if_while_test" + # This test should alternate between 0xdeadbeef and 0xfeedface two times. + gdb_test "while \$foo > 0\nset \$foo -= 1\nif \(\$foo % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend" "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" "gdbvar_complex_if_while_test #1" +} + +proc progvar_simple_if_test {} { + global gdb_prompt + + if [target_info exists noargs] { + verbose "Skipping progvar_simple_if_test because of noargs." + return + } + + if { ![runto factorial] } then { gdb_suppress_tests; } + # Don't depend upon argument passing, since most simulators don't currently + # support it. Bash value variable to be what we want. + gdb_test "p value=5" "" "set value to 5 in progvar_simple_if_test #1" + # All this test should do is print 0xdeadbeef once. + gdb_test "if value == 1\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" "\\\$\[0-9\]* = 0xdeadbeef" "progvar_simple_if_test #1" + # All this test should do is print 0xfeedface once. + gdb_test "if value == 5\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" "\\\$\[0-9\]* = 0xfeedface" "progvar_simple_if_test #2" + gdb_stop_suppressing_tests; +} + +proc progvar_simple_while_test {} { + global gdb_prompt + + if [target_info exists noargs] { + verbose "Skipping progvar_simple_while_test because of noargs." + return + } + + if { ![runto factorial] } then { gdb_suppress_tests } + # Don't depend upon argument passing, since most simulators don't currently + # support it. Bash value variable to be what we want. + gdb_test "p value=5" "" "set value to 5 in progvar_simple_if_test #2" + # This test should print 0xfeedface five times. + gdb_test "while value > 0\np/x 0xfeedface\nset value -= 1\nend" "\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" "progvar_simple_while_test #1" + gdb_stop_suppressing_tests; +} + +proc progvar_complex_if_while_test {} { + global gdb_prompt + + if [target_info exists noargs] { + verbose "Skipping progvar_simple_if_while_test because of noargs." + return + } + + if { ![runto factorial] } then { gdb_suppress_tests } + # Don't depend upon argument passing, since most simulators don't currently + # support it. Bash value variable to be what we want. + gdb_test "p value=4" "" "set value to 4 in progvar_simple_if_test" + # This test should alternate between 0xdeadbeef and 0xfeedface two times. + gdb_test "while value > 0\nset value -= 1\nif \(value % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend" "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" "progvar_complex_if_while_test #1" + gdb_stop_suppressing_tests; +} + +proc if_while_breakpoint_command_test {} { + if [target_info exists noargs] { + verbose "Skipping if_while_breakpoint_command_test because of noargs." + return + } + + if { ![runto factorial] } then { gdb_suppress_tests } + # Don't depend upon argument passing, since most simulators don't currently + # support it. Bash value variable to be what we want. + gdb_test "p value=5" "" "set value to 5 in progvar_simple_if_test" + delete_breakpoints + gdb_test "break factorial" "Breakpoint.*at.*" "break factorial #1" + + send_gdb "commands\n" + gdb_expect { + -re "End with" { + pass "commands in if_while_breakpoint_command_test" + } + default { + fail "(timeout or eof) commands in if_while_breakpoint_command_test" + } + } + # This test should alternate between 0xdeadbeef and 0xfeedface two times. + gdb_test "while value > 0\nset value -= 1\nif \(value % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend\nend" "" "commands part 2 in if_while_breakpoint_command_test" + gdb_test "continue" "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" "if_while_breakpoint_command_test #1" + gdb_test "info break" "while.*set.*if.*p/x.*else.*p/x.*end.*" "info break in if_while_breakpoint_command_test" + gdb_stop_suppressing_tests; +} + +# Test that we can run the inferior from breakpoint commands. +proc infrun_breakpoint_command_test {} { + if [target_info exists noargs] { + verbose "Skipping infrun_breakpoint_command_test because of noargs." + return + } + + if { ![runto factorial] } then { gdb_suppress_tests } + # Don't depend upon argument passing, since most simulators don't currently + # support it. Bash value variable to be what we want. + gdb_test "p value=6" "" "set value to 6 in progvar_simple_if_test #1" + delete_breakpoints + gdb_test "break factorial if value == 5" "Breakpoint.*at.*" + +# infrun_breakpoint_command_test - This test was broken into two parts +# to get around a synchronization problem in expect. +# part1: issue the gdb command "commands" +# part2: send the list of commands + send_gdb "commands\n" + gdb_expect { + -re "End with" { + pass "commands in infrun_breakpoint_command_test #1" + } + default { + fail "(timeout or eof) commands in infrun_breakpoint_command_test" + } + } + gdb_test "step\nstep\nstep\nstep\nbt\nend" "" \ + "commands in infrun_breakpoint_command_test #2" + + gdb_test "continue" "Breakpoint \[0-9\]*, factorial \\(value=5\\).*at.* +\[0-9\]*\[ \]*if \\(value > 1\\) \{.* +\[0-9\]*\[ \]*value \\*= factorial \\(value - 1\\);.* +factorial \\(value=4\\) at.*\[0-9\]*\[ \]*if \\(value > 1\\) \{.* +\[0-9\]*\[ \]*value \\*= factorial \\(value - 1\\);.* +factorial \\(value=3\\) at .* +\[0-9\]*\[ \]*if \\(value > 1\\) \{.* +#0 factorial \\(value=3\\).* +#1 \[0-9a-fx\]* in factorial \\(value=4\\).* +#2 \[0-9a-fx\]* in factorial \\(value=5\\).* +#3 \[0-9a-fx\]* in factorial \\(value=6\\).* +#4 \[0-9a-fx\]* in main \\(.*\\).*" \ + "continue in infrun_breakpoint_command_test"; + gdb_stop_suppressing_tests; +} + +proc breakpoint_command_test {} { + if [target_info exists noargs] { + verbose "Skipping breakpoint_command_test because of noargs." + return + } + + if { ![runto factorial] } then { gdb_suppress_tests; } + # Don't depend upon argument passing, since most simulators don't currently + # support it. Bash value variable to be what we want. + gdb_test "p value=6" "" "set value to 6 in progvar_simple_if_test #2" + delete_breakpoints + gdb_test "break factorial" "Breakpoint.*at.*" "break factorial #2" + gdb_test "commands\nprintf \"Now the value is %d\\n\", value\nend" \ + "Type commands.*\nEnd with.*" "commands in breakpoint_command_test" + gdb_test "continue" "Breakpoint \[0-9\]*, factorial.*Now the value is 5" \ + "continue in breakpoint_command_test" + gdb_test "print value" " = 5" "print value in breakpoint_command_test" + gdb_stop_suppressing_tests; +} + +# Test a simple user defined command (with arguments) +proc user_defined_command_test {} { + global gdb_prompt + + gdb_test "set \$foo = 4" "" "set foo in user_defined_command_test" + + send_gdb "define mycommand\n" + gdb_expect { + -re "End with" { + pass "define mycommand in user_defined_command_test" + } + default { + fail "(timeout or eof) define mycommand in user_defined_command_test" + } + } + # This test should alternate between 0xdeadbeef and 0xfeedface two times. + gdb_test "while \$arg0 > 0\nset \$arg0 -= 1\nif \(\$arg0 % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend\nend" "" "enter commands in user_defined_command_test" + + gdb_test "mycommand \$foo" "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" "execute user defined command in user_defined_command_test" + gdb_test "show user mycommand" "while.*set.*if.*p/x.*else.*p/x.*end.*" "display user command in user_defined_command_test" +} + +gdbvar_simple_if_test +gdbvar_simple_while_test +gdbvar_complex_if_while_test +progvar_simple_if_test +progvar_simple_while_test +progvar_complex_if_while_test +if_while_breakpoint_command_test +infrun_breakpoint_command_test +breakpoint_command_test +user_defined_command_test diff --git a/gdb/testsuite/gdb.base/compiler.c b/gdb/testsuite/gdb.base/compiler.c new file mode 100644 index 00000000000..8eb0d47dd19 --- /dev/null +++ b/gdb/testsuite/gdb.base/compiler.c @@ -0,0 +1,31 @@ +/* Often the behavior of any particular test depends upon what compiler was + used to compile the test. As each test is compiled, this file is + preprocessed by the same compiler used to compile that specific test + (different tests might be compiled by different compilers, particularly + if compiled at different times), and used to generate a *.ci (compiler + info) file for that test. + + I.E., when callfuncs is compiled, a callfuncs.ci file will be generated, + which can then be sourced by callfuncs.exp to give callfuncs.exp access + to information about the compilation environment. + + TODO: It might be a good idea to add expect code that tests each + definition made with 'set" to see if one already exists, and if so + warn about conflicts if it is being set to something else. */ + +/* This needs to be kept in sync with whatis.c and gdb.exp(get_compiler_info). + If this ends up being hairy, we could use a common header file. */ + +#if defined (__STDC__) || defined (_AIX) +set signed_keyword_not_used 0 +#else +set signed_keyword_not_used 1 +#endif + +#if defined (__GNUC__) +set gcc_compiled __GNUC__ +#else +set gcc_compiled 0 +#endif + +return 0 diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp new file mode 100644 index 00000000000..b4d97f0bc5a --- /dev/null +++ b/gdb/testsuite/gdb.base/completion.exp @@ -0,0 +1,568 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite. + +# +# tests for command completion +# +# Here are some useful test cases for completion. +# They should be tested with both M-? and TAB. +# +# "show output-" "radix" +# "show output" "-radix" +# "p" ambiguous (commands starting with p--path, print, printf, etc.) +# "p " ambiguous (all symbols) +# "info t foo" no completions +# "info t " no completions +# "info t" ambiguous ("info target", "info terminal", etc.) +# "info ajksdlfk" no completions +# "info ajksdlfk " no completions +# "info" " " +# "info " ambiguous (all info commands) +# "p \"a" no completions (string constant) +# "p 'a" ambiguous (all symbols starting with a) +# "p b-a" ambiguous (all symbols starting with a) +# "p b-" ambiguous (all symbols) +# "file Make" "file" (word break hard to screw up here) +# "file ../gdb.stabs/we" "ird" (needs to not break word at slash) +# + + +if $tracelevel then { + strace $tracelevel + } + + +#skip all these tests for now (FIXME) + +continue + +global usestubs + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "break" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + perror "tests suppressed" +} + +set oldtimeout1 $timeout +set timeout [expr $timeout + 500] + + +send_gdb "hfgfh\t" +sleep 1 +gdb_expect { + -re "^hfgfh\\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "Undefined command: \"hfgfh\"\\. Try \"help\"\\..*$gdb_prompt $"\ + { pass "complete 'hfgfh'"} + -re ".*$gdb_prompt $" { fail "complete 'hfgfh'"} + timeout {fail "(timeout) complete 'hfgfh'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'hfgfh'" } + timeout { fail "(timeout) complete 'hfgfh'" } + } + +#exp_internal 0 + +send_gdb "show output\t" +sleep 1 +gdb_expect { + -re "^show output-radix $"\ + { send_gdb "\n" + gdb_expect { + -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\ + { pass "complete 'show output'"} + -re ".*$gdb_prompt $" { fail "complete 'show output'"} + timeout {fail "(timeout) complete 'show output'"} + } + } + -re "^show output$"\ + { send_gdb "\n" + gdb_expect { + -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\ + { fail "complete 'show output'"} + -re ".*$gdb_prompt $" { fail "complete 'show output'"} + timeout { fail "(timeout) complete 'show output'"} + } + + } + + -re ".*$gdb_prompt $" { fail "complete 'show output'" } + timeout { fail "(timeout) complete 'show output'" } + } + + +send_gdb "show output-\t" +sleep 1 +gdb_expect { + -re "^show output-radix $"\ + { send_gdb "\n" + gdb_expect { + -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\ + { pass "complete 'show output-'"} + -re ".*$gdb_prompt $" { fail "complete 'show output-'"} + timeout {fail "(timeout) complete 'show output-'"} + } + } + -re "^show output-$"\ + { send_gdb "\n" + gdb_expect { + -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\ + { fail "complete 'show output-'"} + -re ".*$gdb_prompt $" { fail "complete 'show output-'"} + timeout { fail "(timeout) complete 'show output-'"} + } + + } + + -re ".*$gdb_prompt $" { fail "complete 'show output-'" } + timeout { fail "(timeout) complete 'show output-'" } + } + +send_gdb "p\t" +sleep 1 +gdb_expect { + -re "^p\\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "The history is empty\\..*$gdb_prompt $"\ + { pass "complete 'p'"} + -re ".*$gdb_prompt $" { fail "complete 'p'"} + timeout {fail "(timeout) complete 'p'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'p'" } + timeout { fail "(timeout) complete 'p'" } + } + +send_gdb "p \t" +sleep 1 +gdb_expect { + -re "^p \\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "The history is empty\\..*$gdb_prompt $"\ + { pass "complete 'p '"} + -re ".*$gdb_prompt $" { fail "complete 'p '"} + timeout {fail "(timeout) complete 'p '"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'p '" } + timeout { fail "(timeout) complete 'p '" } + } + + +send_gdb "info t foo\t" +sleep 1 +gdb_expect { + -re "^info t foo\\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "Ambiguous info command \"t foo\": target, terminal, threads, tp, tracepoints, types\\..*$gdb_prompt $"\ + { pass "complete 'info t foo'"} + -re ".*$gdb_prompt $" { fail "complete 'info t foo'"} + timeout {fail "(timeout) complete 'info t foo'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'info t foo'" } + timeout { fail "(timeout) complete 'info t foo'" } + } + +send_gdb "info t\t" +sleep 1 +gdb_expect { + -re "^info t\\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "Ambiguous info command \"t\": target, terminal, threads, tp, tracepoints, types\\.. +*$gdb_prompt $"\ + { pass "complete 'info t'"} + -re ".*$gdb_prompt $" { fail "complete 'info t'"} + timeout {fail "(timeout) complete 'info t'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'info t'" } + timeout { fail "(timeout) complete 'info t'" } + } + + +send_gdb "info t \t" +sleep 1 +gdb_expect { + -re "^info t \\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "Ambiguous info command \"t \": target, terminal, threads, tp, tracepoints, types\\.. +*$gdb_prompt $"\ + { pass "complete 'info t '"} + -re ".*$gdb_prompt $" { fail "complete 'info t '"} + timeout {fail "(timeout) complete 'info t '"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'info t '" } + timeout { fail "(timeout) complete 'info t '" } + } + + +send_gdb "info asdfgh\t" +sleep 1 +gdb_expect { + -re "^info asdfgh\\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "Undefined info command: \"asdfgh\". Try \"help info\"\\.. +*$gdb_prompt $"\ + { pass "complete 'info asdfgh'"} + -re ".*$gdb_prompt $" { fail "complete 'info asdfgh'"} + timeout {fail "(timeout) complete 'info asdfgh'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'info asdfgh'" } + timeout { fail "(timeout) complete 'info asdfgh'" } + } + + +send_gdb "info asdfgh \t" +sleep 1 +gdb_expect { + -re "^info asdfgh \\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "Undefined info command: \"asdfgh \". Try \"help info\"\\.. +*$gdb_prompt $"\ + { pass "complete 'info asdfgh '"} + -re ".*$gdb_prompt $" { fail "complete 'info asdfgh '"} + timeout {fail "(timeout) complete 'info asdfgh '"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'info asdfgh '" } + timeout { fail "(timeout) complete 'info asdfgh '" } + } + +send_gdb "info\t" +sleep 1 +gdb_expect { + -re "^info $"\ + { send_gdb "\n" + gdb_expect { + -re "\"info\" must be followed by the name of an info command\\.\r\nList of info subcommands:\r\n\r\ninfo address.*info watchpoints.*\r\n\r\nType \"help info\" followed by info subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous\\..*$gdb_prompt $"\ + { pass "complete 'info'"} + -re ".*$gdb_prompt $" { fail "complete 'info'"} + timeout {fail "(timeout) complete 'info'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'info'" } + timeout { fail "(timeout) complete 'info'" } + } + +send_gdb "info \t" +sleep 1 +gdb_expect { + -re "^info \\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "\"info\" must be followed by the name of an info command\\.\r\nList of info subcommands:\r\n\r\ninfo address.*Type \"help info\" followed by info subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous\\..*$gdb_prompt $"\ + { pass "complete 'info '"} + -re ".*$gdb_prompt $" { fail "complete 'info '"} + timeout {fail "(timeout) complete 'info '"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'info '" } + timeout { fail "(timeout) complete 'info '" } + } + + +send_gdb "info \t" +sleep 1 +gdb_expect { + -re "^info \0x7$"\ + { send_gdb "\t" + gdb_expect { + -re "address.*types.*$gdb_prompt info $"\ + { send_gdb "\n" + gdb_expect { + -re "\"info\".*unambiguous\\..*$gdb_prompt $"\ + { pass "complete (2) 'info '"} + -re ".*$gdb_prompt $" { fail "complete (2) 'info '"} + timeout {fail "(timeout) complete (2) 'info '"} + } + } + -re ".*$gdb_prompt $" { fail "complete (2) 'info '"} + timeout {fail "(timeout) complete (2) 'info '"} + } + } + -re ".*$gdb_prompt $" { fail "complete (2) 'info '" } + timeout { fail "(timeout) complete (2) 'info '" } + } + + +send_gdb "p \"a\t" +sleep 1 +gdb_expect { + -re "^p \"a\\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "Unterminated string in expression\\..*$gdb_prompt $"\ + { pass "complete 'p a'"} + -re ".*$gdb_prompt $" { fail "complete 'p a'"} + timeout {fail "(timeout) complete 'p a'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'p \"a'" } + timeout { fail "(timeout) complete 'p \"a'" } + } + +send_gdb "p 'a\t" +sleep 1 +gdb_expect { + -re "^p 'a\\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "Invalid character constant\\..*$gdb_prompt $"\ + { pass "complete 'p \'a'"} + -re ".*$gdb_prompt $" { fail "complete 'p \'a'"} + timeout {fail "(timeout) complete 'p \'a'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'p \'a'" } + timeout { fail "(timeout) complete 'p \'a'" } + } + +send_gdb "p 'a\t" +sleep 1 +gdb_expect { + -re "^p 'a\\\x07$"\ + { send_gdb "\t" + gdb_expect { + -re "a64l.*atol.*$gdb_prompt p .a$"\ + { send_gdb "\n" + gdb_expect { + -re "Invalid character constant\\..*$gdb_prompt $"\ + { pass "complete (2) 'p \'a'"} + -re ".*$gdb_prompt $" { fail "complete (2) 'p \'a'"} + timeout {fail "(timeout) complete (2) 'p \'a'"} + } + } + -re ".*$gdb_prompt $" { fail "complete (2) 'p \'a'"} + timeout {fail "(timeout) complete (2) 'p \'a'"} + } + } + -re ".*$gdb_prompt $" { fail "complete (2) 'p \'a'" } + timeout { fail "(timeout) complete (2) 'p \'a'" } + } + + +send_gdb "p b-a\t" +sleep 1 +gdb_expect { + -re "^p b-a\\\x07$"\ + { send_gdb "\n" + gdb_expect { + -re "No symbol \"b\" in current context\\..*$gdb_prompt $"\ + { pass "complete 'p b-a'"} + -re ".*$gdb_prompt $" { fail "complete 'p b-a'"} + timeout {fail "(timeout) complete 'p b-a'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'p b-a'" } + timeout { fail "(timeout) complete 'p b-a'" } + } + +send_gdb "p b-a\t" +sleep 1 +gdb_expect { + -re "^p b-a\\\x07$"\ + { send_gdb "\t" + gdb_expect { + -re "a64l.*atol.*$gdb_prompt p b-a$"\ + { send_gdb "\n" + gdb_expect { + -re "No symbol \"b\" in current context\\..*$gdb_prompt $"\ + { pass "complete (2) 'p b-a'"} + -re ".*$gdb_prompt $" { fail "complete (2) 'p b-a'"} + timeout {fail "(timeout) complete (2) 'p b-a'"} + } + } + -re ".*$gdb_prompt $" { fail "complete (2) 'p b-a'"} + timeout {fail "(timeout) complete (2) 'p b-a'"} + } + } + -re ".*$gdb_prompt $" { fail "complete (2) 'p b-a'" } + timeout { fail "(timeout) complete (2) 'p b-a'" } + } + + +send_gdb "p b-\t" +sleep 1 +gdb_expect { + -re "^p b-\\\x07$"\ + { send_gdb "\t" + gdb_expect { + -re "There are $decimal possibilities\\. Do you really\r\nwish to see them all. \\(y or n\\)$"\ + { send_gdb "n" + gdb_expect { + -re "\\(gdb\\) p b-$"\ + { send_gdb "\n" + gdb_expect { + -re "No symbol \"b\" in current context\\..*$gdb_prompt $"\ + { pass "complete (2) 'p b-'"} + -re ".*$gdb_prompt $" { fail "complete (2) 'p b-'"} + timeout {fail "(timeout) complete (2) 'p b-'"} + } + } + -re ".*$gdb_prompt $" { fail "complete (2) 'p b-'"} + timeout {fail "(timeout) complete (2) 'p b-'"} + } + } + -re ".*$gdb_prompt $" { fail "complete (2) 'p b-'"} + timeout {fail "(timeout) complete (2) 'p b-'"} + } + } + -re ".*$gdb_prompt $" { fail "complete (2) 'p b-'" } + timeout { fail "(timeout) complete (2) 'p b-'" } + } + +send_gdb "file ${objdir}/Make\t" +sleep 1 +gdb_expect { + -re "file ${objdir}/Makefile.*$"\ + { send_gdb "\n" + gdb_expect { + -re "\r\nA program is being debugged already\\. Kill it\\? \\(y or n\\) $"\ + { send_gdb "n\n" + gdb_expect { + -re "\r\nProgram not killed\\.\r\n$gdb_prompt $"\ + { pass "complete 'file Make'"} + -re ".*$gdb_prompt $" { fail "complete 'file Make'"} + timeout {fail "(timeout) complete 'file Make'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'file Make'"} + timeout {fail "(timeout) complete 'file Make'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'file Make'" } + timeout { fail "(timeout) complete 'file Make'" } + } + + +send_gdb "file ${srcdir}/gdb.base/a1\t" +sleep 1 +gdb_expect { + -re "^file ${srcdir}/gdb.base/.*'a1.*-selftest\\.exp' $"\ + { send_gdb "\n" + gdb_expect { + -re "\r\nA program is being debugged already\\. Kill it\\? \\(y or n\\) $" +\ + { send_gdb "n\n" + gdb_expect { + -re "\r\nProgram not killed\\.\r\n$gdb_prompt $"\ + { pass "complete 'file gdb.base/a1'"} + -re ".*$gdb_prompt $" { fail "complete 'file gdb.base/a1'"} + timeout {fail "(timeout) complete 'file gdb.base/a1'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'file gdb.base/a1'"} + timeout {fail "(timeout) complete 'file gdb.base/a1'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'file gdb.base/a1'" } + timeout { fail "(timeout) complete 'file gdb.base/a1'" } + } + + +send_gdb "info func mark\t" +sleep 1 +gdb_expect { + -re "^info func mark.*er$"\ + { send_gdb "\t\t" + sleep 3 + gdb_expect { + -re "marker1 marker2 marker3 marker4.*$gdb_prompt info func marker$"\ + { send_gdb "\n" + gdb_expect { + -re "All functions matching regular expression \"marker\":\r\n\r\nFile.*break.c:\r\nint marker1\\(\\);\r\nint marker2\\(int\\).*marker3\\(char.*char.*\\);\r\n$gdb_prompt $"\ + { pass "complete 'info func mar'"} + -re ".*$gdb_prompt $" { fail "complete 'info func mar'"} + timeout {fail "(timeout) complete 'info func mar'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'info func mar'"} + timeout {fail "(timeout) complete 'info func mar'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'info func mar'" } + timeout { fail "(timeout) complete 'info func mar'" } + } + + +send_gdb "set follow-fork-mode \t\t" +sleep 1 +gdb_expect { + -re "ask.*child.*parent.*$gdb_prompt set follow-fork-mode $"\ + { send_gdb "\n" + gdb_expect { + -re "Ambiguous item \"\"\\..*$gdb_prompt $"\ + { pass "complete 'set follow-fork-mode'"} + -re ".*$gdb_prompt $" { fail "complete 'set follow-fork-mode'"} + timeout {fail "(timeout) complete 'set follow-fork-mode'"} + } + } + -re ".*$gdb_prompt $" { fail "complete 'set follow-fork-mode'" } + timeout { fail "(timeout) complete 'set follow-fork-mode'" } + } + +set timeout $oldtimeout1 +return 0 + + + + + + + + + + + + + + diff --git a/gdb/testsuite/gdb.base/cond-expr.exp b/gdb/testsuite/gdb.base/cond-expr.exp new file mode 100644 index 00000000000..0e78b427795 --- /dev/null +++ b/gdb/testsuite/gdb.base/cond-expr.exp @@ -0,0 +1,122 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite + +# +# test of evaluation of conditional expressions, with constants and +# variables. Using the print and the whatis command +# written with the only purpose in mind to cover the holes in the +# eval.c file +# +# source file "int-type.c" +# + + +if $tracelevel then { + strace $tracelevel +} + +# Check to see if we have an executable to test. If not, then either we +# haven't tried to compile one, or the compilation failed for some reason. +# In either case, just notify the user and skip the tests in this file. + +set testfile "int-type" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "print (2 ? 3 : 4)\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of cond expr (const true)" + } + -re ".*$gdb_prompt $" { fail "print value of cond expr (const true)" } + timeout { fail "(timeout) print value of cond expr (const true)" } + } + +send_gdb "print (0 ? 3 : 4)\n" +gdb_expect { + -re ".\[0-9\]* = 4.*$gdb_prompt $" { + pass "print value of cond expr (const false)" + } + -re ".*$gdb_prompt $" { fail "print value of cond expr (const false)" } + timeout { fail "(timeout) print value of cond expr (const false)" } + } + +gdb_test "set variable x=14" "" "set variable x=14" +gdb_test "set variable y=2" "" "set variable y=2" +gdb_test "set variable z=3" "" "set variable z=3" + +send_gdb "print (x ? y : z)\n" +gdb_expect { + -re ".\[0-9\]* = 2.*$gdb_prompt $" { + pass "print value of cond expr (var true)" + } + -re ".*$gdb_prompt $" { fail "print value of cond expr (var true)" } + timeout { fail "(timeout) print value of cond expr (var true)" } + } + +gdb_test "set variable x=0" "" "set variable x=0" + +send_gdb "print (x ? y : z)\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of cond expr (var false)" + } + -re ".*$gdb_prompt $" { fail "print value of cond expr (var false)" } + timeout { fail "(timeout) print value of cond expr (var false)" } + } + + +send_gdb "whatis (0 ? 3 : 4)\n" +gdb_expect { + -re "type = int.*$gdb_prompt $" { + pass "print whatis of cond expr" + } + -re ".*$gdb_prompt $" { fail "print whatis of cond expr" } + timeout { fail "(timeout) print whatis of cond expr" } + } + + + + + + + + + + + diff --git a/gdb/testsuite/gdb.base/condbreak.c b/gdb/testsuite/gdb.base/condbreak.c new file mode 100644 index 00000000000..491d6e5dd5d --- /dev/null +++ b/gdb/testsuite/gdb.base/condbreak.c @@ -0,0 +1,81 @@ +#ifdef vxworks + +# include + +/* VxWorks does not supply atoi. */ +static int +atoi (z) + char *z; +{ + int i = 0; + + while (*z >= '0' && *z <= '9') + i = i * 10 + (*z++ - '0'); + return i; +} + +/* I don't know of any way to pass an array to VxWorks. This function + can be called directly from gdb. */ + +vxmain (arg) +char *arg; +{ + char *argv[2]; + + argv[0] = ""; + argv[1] = arg; + main (2, argv, (char **) 0); +} + +#else /* ! vxworks */ +# include +#endif /* ! vxworks */ + +/* + * The following functions do nothing useful. They are included simply + * as places to try setting breakpoints at. They are explicitly + * "one-line functions" to verify that this case works (some versions + * of gcc have or have had problems with this). + */ + +int marker1 () { return (0); } +int marker2 (a) int a; { return (1); } +void marker3 (a, b) char *a, *b; {} +void marker4 (d) long d; {} + +/* + * This simple classical example of recursion is useful for + * testing stack backtraces and such. + */ + +int +main (argc, argv, envp) +int argc; +char *argv[], **envp; +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + if (argc == 123456) { + fprintf (stderr, "usage: factorial \n"); + return 1; + } + printf ("%d\n", factorial (atoi ("6"))); + + marker1 (); + marker2 (43); + marker3 ("stack", "trace"); + marker4 (177601976L); + return 0; +} + +int factorial (value) +int value; +{ + if (value > 1) { + value *= factorial (value - 1); + } + return (value); +} + diff --git a/gdb/testsuite/gdb.base/condbreak.exp b/gdb/testsuite/gdb.base/condbreak.exp new file mode 100644 index 00000000000..76f752181ec --- /dev/null +++ b/gdb/testsuite/gdb.base/condbreak.exp @@ -0,0 +1,157 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This test was written by Rich Title. +# Purpose is to test conditional breakpoints. +# Modeled after "break.exp". + + + +if $tracelevel then { + strace $tracelevel + } + +global usestubs + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "condbreak" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + +# +# test break at function +# +gdb_test "break main" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint function" + +# +# test conditional break at function +# +gdb_test "break marker1 if 1==1" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break function if condition" + +gdb_test "delete 2" \ + "" \ + "delete break" + +# +# test conditional break at line number +# +gdb_test "break 64 if 1==1" \ + "Breakpoint.*at.* file .*$srcfile, line 64\\." \ + "break line if condition" + +gdb_test "delete 3" \ + "" \ + "delete break" + +# +# test conditional break at function +# +gdb_test "break marker1 if (1==1)" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break function if (condition)" + +# +# test conditional break at line number +# +gdb_test "break 64 if (1==1)" \ + "Breakpoint.*at.* file .*$srcfile, line 64\\." \ + "break line if (condition)" + +gdb_test "break marker2 if (a==43)" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break function if (condition)" + +# +# check to see what breakpoints are set +# + +set main_line 60 +gdb_test "info break" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$main_line.* +\[0-9\]+\[\t \]+breakpoint keep y.* in marker1 at .*$srcfile:41.* +\[\t \]+stop only if 1 == 1.* +\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:64.* +\[\t \]+stop only if 1 == 1.* +\[0-9\]+\[\t \]+breakpoint keep y.* in marker2 at .*$srcfile:42.* +\[\t \]+stop only if a == 43.*" \ + "breakpoint info" + + +# +# run until the breakpoint at main is hit. For non-stubs-using targets. +# +gdb_test "run" \ + "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:60.*60\[\t \]+if .argc.* \{.*" \ +"run until function breakpoint" + +# +# run until the breakpoint at a line number +# +gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:64.*64\[\t \]+printf.*factorial.*" \ + "run until breakpoint set at a line number" + +# +# run until the breakpoint at marker1 +# +gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker1 \\(\\) at .*$srcfile:41.*41\[\t \]+.*" \ + "run until breakpoint at marker1" + +# +# run until the breakpoint at marker2 +# +gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker2 \\(a=43\\) at .*$srcfile:42.*42\[\t \]+.*" \ + "run until breakpoint at marker2" + + + + + + + + + + + + + + diff --git a/gdb/testsuite/gdb.base/configure b/gdb/testsuite/gdb.base/configure new file mode 100644 index 00000000000..29e69bfe1a5 --- /dev/null +++ b/gdb/testsuite/gdb.base/configure @@ -0,0 +1,899 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.12.1 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.12.1" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=a1-selftest.exp + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + +CC=${CC-cc} + +ac_aux_dir= +for ac_dir in `cd $srcdir;pwd`/../../.. $srcdir/`cd $srcdir;pwd`/../../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in `cd $srcdir;pwd`/../../.. $srcdir/`cd $srcdir;pwd`/../../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + + +# Do some error checking and defaulting for the host and target type. +# The inputs are: +# configure --host=HOST --target=TARGET --build=BUILD NONOPT +# +# The rules are: +# 1. You are not allowed to specify --host, --target, and nonopt at the +# same time. +# 2. Host defaults to nonopt. +# 3. If nonopt is not specified, then host defaults to the current host, +# as determined by config.guess. +# 4. Target and build default to nonopt. +# 5. If nonopt is not specified, then target and build default to host. + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +case $host---$target---$nonopt in +NONE---*---* | *---NONE---* | *---*---NONE) ;; +*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; +esac + + +# Make sure we can run config.sub. +if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : +else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +fi + +echo $ac_n "checking host system type""... $ac_c" 1>&6 +echo "configure:573: checking host system type" >&5 + +host_alias=$host +case "$host_alias" in +NONE) + case $nonopt in + NONE) + if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : + else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } + fi ;; + *) host_alias=$nonopt ;; + esac ;; +esac + +host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$host" 1>&6 + +echo $ac_n "checking target system type""... $ac_c" 1>&6 +echo "configure:594: checking target system type" >&5 + +target_alias=$target +case "$target_alias" in +NONE) + case $nonopt in + NONE) target_alias=$host_alias ;; + *) target_alias=$nonopt ;; + esac ;; +esac + +target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` +target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$target" 1>&6 + +echo $ac_n "checking build system type""... $ac_c" 1>&6 +echo "configure:612: checking build system type" >&5 + +build_alias=$build +case "$build_alias" in +NONE) + case $nonopt in + NONE) build_alias=$host_alias ;; + *) build_alias=$nonopt ;; + esac ;; +esac + +build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` +build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$build" 1>&6 + +test "$host_alias" != "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set) 2>&1 | grep ac_space` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +cat > conftest.defs <<\EOF +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g +s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g +s%\[%\\&%g +s%\]%\\&%g +s%\$%$$%g +EOF +DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` +rm -f conftest.defs + + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.12.1" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@CC@%$CC%g +s%@host@%$host%g +s%@host_alias@%$host_alias%g +s%@host_cpu@%$host_cpu%g +s%@host_vendor@%$host_vendor%g +s%@host_os@%$host_os%g +s%@target@%$target%g +s%@target_alias@%$target_alias%g +s%@target_cpu@%$target_cpu%g +s%@target_vendor@%$target_vendor%g +s%@target_os@%$target_os%g +s%@build@%$build%g +s%@build_alias@%$build_alias%g +s%@build_cpu@%$build_cpu%g +s%@build_vendor@%$build_vendor%g +s%@build_os@%$build_os%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/gdb/testsuite/gdb.base/configure.in b/gdb/testsuite/gdb.base/configure.in new file mode 100644 index 00000000000..e5bcb19539b --- /dev/null +++ b/gdb/testsuite/gdb.base/configure.in @@ -0,0 +1,15 @@ +dnl Process this file file with autoconf to produce a configure script. +dnl This file is a shell script fragment that supplies the information +dnl necessary to tailor a template configure script into the configure +dnl script appropriate for this directory. For more information, check +dnl any existing configure script. + +AC_PREREQ(2.5) +AC_INIT(a1-selftest.exp) + +CC=${CC-cc} +AC_SUBST(CC) +AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/../../..) +AC_CANONICAL_SYSTEM + +AC_OUTPUT(Makefile) diff --git a/gdb/testsuite/gdb.base/constvars.c b/gdb/testsuite/gdb.base/constvars.c new file mode 100644 index 00000000000..b0ce7529ecb --- /dev/null +++ b/gdb/testsuite/gdb.base/constvars.c @@ -0,0 +1,183 @@ +void marker1 (void) +{ +} + +/* misc. function params */ + +int +qux1 (const char cc, const char /*&*/ccr, const char *ccp, char *const cpc) +{ + return 33; +} + +int +qux2 (volatile unsigned char vuc, const volatile int cvi, + volatile short /*&*/vsr, volatile long *vlp, float *volatile fpv, + const volatile signed char *const volatile cvscpcv) +{ + return 400; +} + +int +main (void) +{ + char lave = 'B'; + unsigned char lavish = 10; + short lax = 20; + unsigned short lecherous = 30; + long lechery = 40; + unsigned long lectern = 50; + float leeway = 60; + double legacy = 70; + signed char lemonade = 35; + + const char laconic = 'A'; + const unsigned char laggard = 1; + const short lagoon = 2; + const unsigned short laity = 3; + const long lambent = 4; + const unsigned long laminated = 5; + const float lampoon = 6; + const double languid = 7; + + /* pointers to constant variables */ + + const char *legend = &lave; + const unsigned char *legerdemain = &lavish; + const short *leniency = &lax; + const unsigned short *leonine = &lecherous; + const long *lesion = &lechery; + const unsigned long *lethal = &lectern; + const float *lethargic = &leeway; + const double *levity = &legacy; + + /* constant pointers to constant variables */ + + const char *const lewd = &laconic; + const unsigned char *const lexicographer = &laggard; + const short *const lexicon = &lagoon; + const unsigned short *const liaison = &laity; + const long *const libation = &lambent; + const unsigned long *const libelous = &laminated; + const float *const libertine = &lampoon; + const double *const libidinous = &languid; + + /* this is the same as const char * legend .... */ + + char const *languish = &laconic; + unsigned char const *languor = &laggard; + short const *lank = &lagoon; + unsigned short const *lapidary = &laity; + long const *larceny = &lambent; + unsigned long const *largess = &laminated; + float const *lascivious = &lampoon; + double const *lassitude = &languid; + + /* constant pointers to variable */ + + char *const lamprey = &lave; + unsigned char *const lariat = &lavish; + short *const laudanum = &lax; + unsigned short *const lecithin = &lecherous; + long *const leviathan = &lechery; + unsigned long *const libretto = &lectern; + float *const lissome = &leeway; + double *const locust = &legacy; + + /* volatile variables */ + + volatile char vox = 'X'; + volatile unsigned char victuals = 13; + volatile short vixen = 200; + volatile unsigned short vitriol = 300; + volatile long vellum = 1000; + volatile unsigned long valve = 2000; + volatile float vacuity = 3.0; + volatile double vertigo = 10.3; + + /* pointers to volatile variables */ + + volatile char * vampire = &vox; + volatile unsigned char * viper = &victuals; + volatile short * vigour = &vixen; + volatile unsigned short * vapour = &vitriol; + volatile long * ventricle = &vellum; + volatile unsigned long * vigintillion = &valve; + volatile float * vocation = &vacuity; + volatile double * veracity = &vertigo; + + /* volatile pointers to volatile variables */ + + volatile char * volatile vapidity = &vox; + volatile unsigned char * volatile velocity = &victuals; + volatile short * volatile veneer = &vixen; + volatile unsigned short * volatile video = &vitriol; + volatile long * volatile vacuum = &vellum; + volatile unsigned long * volatile veniality = &valve; + volatile float * volatile vitality = &vacuity; + volatile double * volatile voracity = &vertigo; + + /* const volatile vars */ + + const volatile char victor = 'Y'; + const volatile unsigned char vicar = 11; + + /* pointers to const volatiles */ + + const volatile char * victory = &victor; + const volatile unsigned char * vicarage = &vicar; + + /* const pointers to volatile vars */ + + volatile char * const vein = &vox; + volatile unsigned char * const vogue = &victuals; + + /* const pointers to const volatile vars */ + + const volatile char * const cavern = &victor; + const volatile unsigned char * const coverlet = &vicar; + + /* volatile pointers to const vars */ + + const char * volatile caveat = &laconic; + const unsigned char * volatile covenant = &laggard; + + /* volatile pointers to const volatile vars */ + + const volatile char * volatile vizier = &victor; + const volatile unsigned char * volatile vanadium = &vicar; + + /* const volatile pointers */ + + char * const volatile vane = &lave; + unsigned char * const volatile veldt = &lavish; + + /* const volatile pointers to const vars */ + + const char * const volatile cove = &laconic; + const unsigned char * const volatile cavity = &laggard; + + /* const volatile pointers to volatile vars */ + + volatile char * const volatile vagus = &vox; + volatile unsigned char * const volatile vagrancy = &victuals; + + /* const volatile pointers to const volatile */ + + const volatile char * const volatile vagary = &victor; + const volatile unsigned char * const volatile vendor = &vicar; + + /* misc. references */ + /* + const char & radiation = laconic; + volatile signed char & remuneration = lemonade; + */ +#ifdef usestubs + set_debug_traps (); + breakpoint (); +#endif + marker1 (); + + + return 0; +} diff --git a/gdb/testsuite/gdb.base/constvars.exp b/gdb/testsuite/gdb.base/constvars.exp new file mode 100644 index 00000000000..518e5ca9b0d --- /dev/null +++ b/gdb/testsuite/gdb.base/constvars.exp @@ -0,0 +1,251 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# written by Elena Zannoni (elz@apollo.hp.com) +# +# This file is part of the gdb testsuite +# +# tests for const variables +# const pointers to vars +# pointers to const variables +# const pointers to const vars +# with mixed types + +if $tracelevel then { + strace $tracelevel +} + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "constvars" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. + +if [get_compiler_info ${binfile}] { + return -1; +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "break marker1\n" ; gdb_expect -re ".*$gdb_prompt $" + + send_gdb "cont\n" + gdb_expect { + -re "Break.* marker1 \\(\\) at .*:$decimal.*$gdb_prompt $" { + send_gdb "up\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "up from marker1" } + } + } + -re "Break.* marker1__.* \\(\\) at .*:$decimal.*$gdb_prompt $" { + fail "continue to marker1 (demangling)" + send_gdb "up\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "up from marker1" } + } + } + -re "$gdb_prompt $" { fail "continue to marker1" } + timeout { fail "(timeout) continue to marker1" } + } + +# test function parameters + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +send_gdb "ptype qux1\n" +gdb_expect { + -re "type = int \\(const char, const char &, const char *, char * const\\).*$gdb_prompt $" { + pass "ptype qux1" + } + -re ".*$gdb_prompt $" { fail "ptype qux1" } + timeout { fail "(timeout) ptype qux1" } +} + +# test vars and pointers + +proc do_constvar_tests {} { + global gcc_compiled + + gdb_test "print lave" " = 66 'B'" + gdb_test "ptype lave" "type = char" + gdb_test "print lavish" " = 10 '\\\\n'" + gdb_test "ptype lavish" "type = unsigned char" + gdb_test "print lax" " = 20" + gdb_test "ptype lax" "type = short.*" + gdb_test "print lecherous" " = 30" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lecherous" "type = unsigned short.*" + gdb_test "print lechery" " = 40" + gdb_test "ptype lechery" "type = long.*" + gdb_test "print lectern" " = 50" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lectern" "type = unsigned long.*" + gdb_test "print leeway" " = 60" + gdb_test "ptype leeway" "type = float" + gdb_test "print legacy" " = 70" + gdb_test "ptype legacy" "type = double" + gdb_test "print laconic" " = 65 'A'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype laconic" "type = const char" + gdb_test "print laggard" " = 1 '.001'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype laggard" "type = const unsigned char" + gdb_test "print lagoon" " = 2" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lagoon" "type = const short" + gdb_test "print laity" " = 3" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype laity" "type = const unsigned short" + gdb_test "print lambent" " = 4" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lambent" "type = const long" + gdb_test "print laminated" " = 5" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype laminated" "type = const unsigned long" + gdb_test "print lampoon" " = 6" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lampoon" "type = const float" + gdb_test "print languid" " = 7" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype languid" "type = const double" + gdb_test "print *legend" " = 66 'B'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype legend" "type = const char *" + gdb_test "print *legerdemain" " = 10 '\\\\n'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype legerdemain" "type = const unsigned char *" + gdb_test "print *leniency" " = 20" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype leniency" "type = const short *" + gdb_test "print *leonine" " = 30" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype leonine" "type = const unsigned short *" + gdb_test "print *lesion" " = 40" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lesion" "type = const long *" + gdb_test "print *lethal" " = 50" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lethal" "type = const unsigned long *" + gdb_test "print *lethargic" " = 60" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lethargic" "type = const float *" + gdb_test "print *levity" " = 70" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype levity" "type = const double *" + gdb_test "print *lewd" " = 65 'A'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lewd" "type = const char * const" + gdb_test "print *lexicographer" " = 1 '.001'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lexicographer" "type = const unsigned char * const" + gdb_test "print *lexicon" " = 2" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lexicon" "type = const short * const" + gdb_test "print *liaison" " = 3" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype liaison" "type = const unsigned short * const" + gdb_test "print *libation" " = 4" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype libation" "type = const long * const" + gdb_test "print *libelous" " = 5" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype libelous" "type = const unsigned long * const" + gdb_test "print *libertine" " = 6" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype libertine" "type = const float * const" + gdb_test "print *libidinous" " = 7" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype libidinous" "type = const double * const" + gdb_test "print *languish" " = 65 'A'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype languish" "type = const char *" + gdb_test "print *languor" " = 1 '.001'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype languor" "type = const unsigned char *" + gdb_test "print *lank" " = 2" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lank" "type = const short *" + gdb_test "print *lapidary" " = 3" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lapidary" "type = const unsigned short *" + gdb_test "print *larceny" " = 4" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype larceny" "type = const long *" + gdb_test "print *largess" " = 5" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype largess" "type = const unsigned long *" + gdb_test "print *lascivious" " = 6" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lascivious" "type = const float *" + gdb_test "print *lassitude" " = 7" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lassitude" "type = const double *" + gdb_test "print *lamprey" " = 66 'B'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lamprey" "type = char * const" + gdb_test "print *lariat" " = 10 '\\\\n'" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lariat" "type = unsigned char * const" + gdb_test "print *laudanum" " = 20" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype laudanum" "type = short * const" + gdb_test "print *lecithin" " = 30" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lecithin" "type = unsigned short * const" + gdb_test "print *leviathan" " = 40" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype leviathan" "type = long * const" + gdb_test "print *libretto" " = 50" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype libretto" "type = unsigned long * const" + gdb_test "print *lissome" " = 60" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype lissome" "type = float * const" + gdb_test "print *locust" " = 70" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype locust" "type = double * const" + if {$gcc_compiled} then { setup_xfail "*-*-*" } + gdb_test "ptype radiation" "type = const char &" +} + +do_constvar_tests diff --git a/gdb/testsuite/gdb.base/corefile.exp b/gdb/testsuite/gdb.base/corefile.exp new file mode 100644 index 00000000000..83b78c4be99 --- /dev/null +++ b/gdb/testsuite/gdb.base/corefile.exp @@ -0,0 +1,223 @@ +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +# are we on a target board +if ![isnative] then { + return +} + +set testfile "coremaker" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +# Create a core file named "corefile" rather than just "core", to +# avoid problems with sys admin types that like to regularly prune all +# files named "core" from the system. +# +# Arbitrarily try setting the core size limit to "unlimited" since +# this does not hurt on systems where the command does not work and +# allows us to generate a core on systems where it does. +# +# Some systems append "core" to the name of the program; others append +# the name of the program to "core". +set found 0 +catch "system \"(cd ${objdir}/${subdir}; ulimit -c unlimited; ${binfile}; true) >/dev/null 2>&1\"" +# remote_exec host "${binfile}" +foreach i "${objdir}/${subdir}/core ${objdir}/${subdir}/core.coremaker.c ${binfile}.core" { + if [remote_file build exists $i] { + remote_exec build "mv $i ${objdir}/${subdir}/corefile" + set found 1 + } +} +if { $found == 0 } { + # The braindamaged HPUX shell quits after the ulimit -c above + # without executing ${binfile}. So we try again without the + # ulimit here if we didn't find a core file above. + # Oh, I should mention that any "braindamaged" non-Unix system has + # the same problem. I like the cd bit too, it's really neat'n stuff. + catch "system \"(cd ${objdir}/${subdir}; ${binfile}; true) >/dev/null 2>&1\"" + foreach i "${objdir}/${subdir}/core ${objdir}/${subdir}/core.coremaker.c ${binfile}.core" { + if [remote_file build exists $i] { + remote_exec build "mv $i ${objdir}/${subdir}/corefile" + set found 1 + } + } + + if { $found == 0 } { + warning "can't generate a core file - core tests suppressed - check ulimit -c" + return 0 + } +} + +# +# Test that we can simply startup with a "-core=corefile" command line arg +# and recognize that the core file is a valid, usable core file. +# To do this, we must shutdown the currently running gdb and restart +# with the -core args. We can't use gdb_start because it looks for +# the first gdb prompt, and the message we are looking for occurs +# before the first prompt. Also, we can't include GDBFLAGS because +# if it is empty, this confuses gdb with an empty argument that it +# grumbles about (said grumbling currently being ignored in gdb_start). +# **FIXME** +# +# Another problem is that on some systems (solaris for example), there +# is apparently a limit on the length of a fully specified path to +# the coremaker executable, at about 80 chars. For this case, consider +# it a pass, but note that the program name is bad. + +gdb_exit +if $verbose>1 then { + send_user "Spawning $GDB -nw $GDBFLAGS -core=$objdir/$subdir/corefile\n" +} + +set oldtimeout $timeout +set timeout [expr "$timeout + 60"] +verbose "Timeout is now $timeout seconds" 2 +eval "spawn $GDB -nw $GDBFLAGS -core=$objdir/$subdir/corefile" +expect { + -re "Core was generated by .*coremaker.*\r\n\#0 .*\(\).*\r\n$gdb_prompt $" { + pass "args: -core=corefile" + } + -re "Core was generated by .*\r\n\#0 .*\(\).*\r\n$gdb_prompt $" { + pass "args: -core=corefile (with bad program name)" + } + -re ".*registers from core file: File in wrong format.* $" { + fail "args: -core=corefile (could not read registers from core file)" + } + -re ".*$gdb_prompt $" { fail "args: -core=corefile" } + timeout { fail "(timeout) starting with -core" } +} + + +# +# Test that startup with both an executable file and -core argument. +# See previous comments above, they are still applicable. +# + +close; + +if $verbose>1 then { + send_user "Spawning $GDB -nw $GDBFLAGS $binfile -core=$objdir/$subdir/corefile\n" +} + + +eval "spawn $GDB -nw $GDBFLAGS $binfile -core=$objdir/$subdir/corefile"; +expect { + -re "Core was generated by .*coremaker.*\r\n\#0 .*\(\).*\r\n$gdb_prompt $" { + pass "args: execfile -core=corefile" + } + -re "Core was generated by .*\r\n\#0 .*\(\).*\r\n$gdb_prompt $" { + pass "args: execfile -core=corefile (with bad program name)" + } + -re ".*registers from core file: File in wrong format.* $" { + fail "args: execfile -core=corefile (could not read registers from core file)" + } + -re ".*$gdb_prompt $" { fail "args: execfile -core=corefile" } + timeout { fail "(timeout) starting with -core" } +} +set timeout $oldtimeout +verbose "Timeout is now $timeout seconds" 2 + +close; + +# Now restart normally. + +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# Test basic corefile recognition via core-file command. + +send_gdb "core-file $objdir/$subdir/corefile\n" +gdb_expect { + -re "Core was generated by .*coremaker.*\r\n\#0 .*\(\).*\r\n$gdb_prompt $" { + pass "core-file command" + } + -re "Core was generated by .*\r\n\#0 .*\(\).*\r\n$gdb_prompt $" { + pass "core-file command (with bad program name)" + } + -re ".*registers from core file: File in wrong format.* $" { + fail "core-file command (could not read registers from core file)" + } + -re ".*$gdb_prompt $" { fail "core-file command" } + timeout { fail "(timeout) core-file command" } +} + +# Test correct mapping of corefile sections by printing some variables. + +gdb_test "print coremaker_data" "\\\$$decimal = 202" +gdb_test "print coremaker_bss" "\\\$$decimal = 10" +gdb_test "print coremaker_ro" "\\\$$decimal = 201" + +if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } +gdb_test "print func2::coremaker_local" "\\\$$decimal = {0, 1, 2, 3, 4}" + +# Somehow we better test the ability to read the registers out of the core +# file correctly. I don't think the other tests do this. + +gdb_test "bt" "abort.*func2.*func1.*main.*" "backtrace in corefile.exp" + +# Test ability to read mmap'd data + +gdb_test "x/8bd buf1" ".*:.*0.*1.*2.*3.*4.*5.*6.*7" "accessing original mmap data in core file" +setup_xfail "*-*-sunos*" "*-*-ultrix*" "*-*-aix*" +send_gdb "x/8bd buf2\n" +gdb_expect { + -re ".*:.*0.*1.*2.*3.*4.*5.*6.*7.*$gdb_prompt $" { + pass "accessing mmapped data in core file" + } + -re "0x\[f\]*:.*Cannot access memory at address 0x\[f\]*.*$gdb_prompt $" { + fail "accessing mmapped data (mapping failed at runtime)" + } + -re "0x.*:.*Cannot access memory at address 0x.*$gdb_prompt $" { + fail "accessing mmapped data (mapping address not found in core file)" + } + -re ".*$gdb_prompt $" { + fail "accessing mmapped data (incorrect data found in core file)" + } + timeout { + fail "accessing mmapped data (timeout)" + } +} + +# test reinit_frame_cache + +gdb_load ${binfile} +setup_xfail "*-*-*" +gdb_test "up" "#\[0-9\]* *\[0-9xa-fH'\]* in .* \\(\\)" "up in corefile.exp" + +gdb_test "core" "No core file now." diff --git a/gdb/testsuite/gdb.base/coremaker.c b/gdb/testsuite/gdb.base/coremaker.c new file mode 100644 index 00000000000..56239e9286f --- /dev/null +++ b/gdb/testsuite/gdb.base/coremaker.c @@ -0,0 +1,120 @@ +/* Simple little program that just generates a core dump from inside some + nested function calls. */ + +#include +#include +#include +#include +#include + +#ifndef __STDC__ +#define const /**/ +#endif + +#define MAPSIZE (8 * 1024) + +/* Don't make these automatic vars or we will have to walk back up the + stack to access them. */ + +char *buf1; +char *buf2; + +int coremaker_data = 1; /* In Data section */ +int coremaker_bss; /* In BSS section */ + +const int coremaker_ro = 201; /* In Read-Only Data section */ + +/* Note that if the mapping fails for any reason, we set buf2 + to -1 and the testsuite notices this and reports it as + a failure due to a mapping error. This way we don't have + to test for specific errors when running the core maker. */ + +void +mmapdata () +{ + int j, fd; + extern void *malloc (); + + /* Allocate and initialize a buffer that will be used to write + the file that is later mapped in. */ + + buf1 = (char *) malloc (MAPSIZE); + for (j = 0; j < MAPSIZE; ++j) + { + buf1[j] = j; + } + + /* Write the file to map in */ + + fd = open ("coremmap.data", O_CREAT | O_RDWR, 0666); + if (fd == -1) + { + perror ("coremmap.data open failed"); + buf2 = (char *) -1; + return; + } + write (fd, buf1, MAPSIZE); + + /* Now map the file into our address space as buf2 */ + + buf2 = (char *) mmap (0, MAPSIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + if (buf2 == (char *) -1) + { + perror ("mmap failed"); + return; + } + + /* Verify that the original data and the mapped data are identical. + If not, we'd rather fail now than when trying to access the mapped + data from the core file. */ + + for (j = 0; j < MAPSIZE; ++j) + { + if (buf1[j] != buf2[j]) + { + fprintf (stderr, "mapped data is incorrect"); + buf2 = (char *) -1; + return; + } + } +} + +void +func2 () +{ + int coremaker_local[5]; + int i; + +#ifdef SA_FULLDUMP + /* Force a corefile that includes the data section for AIX. */ + { + struct sigaction sa; + + sigaction (SIGABRT, (struct sigaction *)0, &sa); + sa.sa_flags |= SA_FULLDUMP; + sigaction (SIGABRT, &sa, (struct sigaction *)0); + } +#endif + + /* Make sure that coremaker_local doesn't get optimized away. */ + for (i = 0; i < 5; i++) + coremaker_local[i] = i; + coremaker_bss = 0; + for (i = 0; i < 5; i++) + coremaker_bss += coremaker_local[i]; + coremaker_data = coremaker_ro + 1; + abort (); +} + +void +func1 () +{ + func2 (); +} + +main () +{ + mmapdata (); + func1 (); +} + diff --git a/gdb/testsuite/gdb.base/crossload.exp b/gdb/testsuite/gdb.base/crossload.exp new file mode 100644 index 00000000000..26bb7a1b0b2 --- /dev/null +++ b/gdb/testsuite/gdb.base/crossload.exp @@ -0,0 +1,380 @@ +# Copyright (C) 1992, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) +# Rob Savoye changed it to use gdb_test (rob@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +# FIXME: The configure.in for this test should look for --with-targets +# and deal accordingly. Until that has been done, skip the whole thing. +# With a minimal bfd (the default), few if any of these tests work. + +verbose "FIXME: all the crossload tests ignored" +return + +foreach i "m68k-elf m68k-aout m68k-aout2 mips-ecoff i486-elf sparc-aout i860-elf sparc-elf" { + remote_exec build "cd ${objdir}/${subdir} ; uudecode ${srcdir}/${subdir}/$i.u " +} + +# FIXME: These tests don't work for the i960, because +# bfd/config/i960-bout.mt sets SELECT_VECS. I could use setup_xfail +# for each test, but rebooting the board between each one takes a long +# time so I'm just punting the whole file. +if [istarget "i960-*-*"] then { + if $verbose>1 then { + warning "FIXME: crossload test case doesn't run on the i960." + } + continue +} + +# FIXME: These tests don't work for the a29k, because SELECT_VECS is +# used when compiling bfd. It would be nice if there were some better +# way of detecting this case. +if [istarget "a29k-*-*"] then { + if $verbose>1 then { + warning "FIXME: crossload test case doesn't run on the a29k." + } + continue +} + +# Test if gdb can automatically determine the bfd format of an +# executable and read it's symbols. + +proc bfddefault {} { + global GDB + global GDBFLAGS + global gdb_prompt + global objdir + global subdir + global binfile + global bfdformat + global file_loaded + + gdb_unload + set file_loaded 0 + send_gdb "file $objdir/$subdir/$binfile\n" + gdb_expect { + -re "A program is being debugged already. Kill it.*y or n." { + send_gdb "y\n" + exp_continue + } + -re "Reading symbols from $objdir/$subdir/$binfile\[.\]+done\..*$gdb_prompt $" { + pass "$binfile ($bfdformat) auto format" + } + -re "Reading symbols from $objdir/$subdir/$binfile\[.\]+.no debugging symbols found.\[.\]+done\..*$gdb_prompt $" { + pass "$binfile ($bfdformat) auto format (but no symbols found)" + } + -re "File format not recognized.*$gdb_prompt $" { + fail "$binfile ($bfdformat) auto format (format not recognized)" + return + } + -re "File format is ambiguous.*$gdb_prompt $" { + fail "$binfile ($bfdformat) auto format (format is ambiguous)" + return + } + -re "$gdb_prompt $" { + fail "$binfile ($bfdformat) auto format" + return + } + timeout { + fail "(timeout) $binfile ($bfdformat) auto format" + return + } + } + + if [gdb_test "info target" ".*file type $bfdformat" ""]==0 then { + set file_loaded 1 + } else { + fail "$binfile ($bfdformat) wrong format found" + } +} + +# Test if gdb can read symbols from an executable when the bfd format +# is explicitly set via the environment variable GNUTARGET. + +proc bfdexplicit {} { + global GDB + global GDBFLAGS + global gdb_prompt + global subdir + global objdir + global det_file + global binfile + global bfdformat + global file_loaded + + gdb_unload + set file_loaded 0 + + # Once GDB 4.10 (the last to lack `set gnutarget') is forgotten, + # change this to use set gnutarget. + if [gdb_test "set env GNUTARGET=$bfdformat" "" ""]!=0 then { + fail "setting GNUTARGET=$bfdformat in environment" + return + } + + send_gdb "file $objdir/$subdir/$binfile\n" + gdb_expect { + -re "A program is being debugged already. Kill it.*y or n." { + send_gdb "y\n" + exp_continue + } + -re "Reading symbols from $objdir/$subdir/$binfile\[.\]+done\..*$gdb_prompt $" { + pass "$binfile ($bfdformat) explicit format" + } + -re "Invalid target.*$gdb_prompt $" { + fail "$binfile ($bfdformat) explicit format (invalid target)" + return + } + -re "$gdb_prompt $" { + fail "$binfile ($bfdformat) explicit format" + return + } + timeout { + fail "(timeout) $binfile ($bfdformat) explicit format" + return + } + } + + set file_loaded 1 +} + +proc test_ptype_functions {} { + global gdb_prompt + global binfile + global bfdformat + global det_file + send_gdb "ptype main\n" + gdb_expect { + -re "type = int \[)(\]+\r\n$gdb_prompt $" {} + timeout { fail "(timeout) $binfile ($bfdformat) function main" ; return } + } + + # set up a list of lists of command and patterns + set command [list { "ptype v_char_func" "type =(\ unsigned\ |\ signed\ |\ )char \[)(\]+" }\ + { "ptype v_short_func" "type = (short|short int) \[)(\]+" } \ + { "ptype v_int_func" "type = int \[)(\]+" } \ + { "ptype v_long_func" "type = (long|long int|int) \[)(\]+" } \ + { "ptype v_float_func" "type = float \[)(\]+" } \ + { "ptype v_double_func" "type = double \[)(\]+" } ] + + foreach i $command { + if [gdb_test [lindex $i 0] [lindex $i 1] ""] then { + fail "$binfile ($bfdformat) \"[lindex $i 0]\" function types" + return + } + } + pass "$binfile ($bfdformat) ptype function types" +} + +# Note that plain chars can be either signed or unsigned. + +proc test_ptype_plain_types {} { + global gdb_prompt + global binfile + global bfdformat + + # set up a list of lists of command and patterns + set command [list { "ptype v_char" "type =(\ unsigned\ |\ signed\ |\ )char" }\ + { "ptype v_short" "type = short" } \ + { "ptype v_int" "type = int" } \ + { "ptype v_long" "type = long" } \ + { "ptype v_float" "type = float" } \ + { "ptype v_double" "type = double" } ] + + foreach i $command { + if [gdb_test [lindex $i 0] [lindex $i 1] ""] then { + fail "$binfile ($bfdformat) \"[lindex $i 0]\" plain C types" + return + } + } + pass "$binfile ($bfdformat) ptype plain C types" +} + +# Note that if compiled with pre-ANSI compilers, the "signed" keywords are +# defined away and the variables default to plain types. So accept either. + +proc test_ptype_signed_types {} { + global gdb_prompt + global binfile + global bfdformat + global det_file + + # set up a list of lists of command and patterns + set command [list { "ptype v_signed_char" "type =(\ signed\ |\ )char" }\ + { "ptype v_signed_short" "type =(\ signed\ |\ )short" } \ + { "ptype v_signed_int" "type =(\ signed\ |\ )int" } \ + { "ptype v_signed_long" "type =(\ signed\ |\ )long" } ] + + foreach i $command { + if [gdb_test [lindex $i 0] [lindex $i 1] ""] then { + if [expr [string match "ecoff-bigmips" $bfdformat]+[string match "ptype v_signed_char" [lindex $i 0]]]==2 then { + setup_xfail "*-*-*" + } + fail "$binfile ($bfdformat) \"[lindex $i 0]\" signed C types" + return + } + } + pass "$binfile ($bfdformat) ptype signed C types" +} + +proc test_ptype_unsigned_types {} { + global gdb_prompt + global binfile + global bfdformat + global det_file + + # set up a list of lists of command and patterns + set command [list { "ptype v_unsigned_char" "type = unsigned char" }\ + { "ptype v_unsigned_short" \ + "type = (unsigned short|short unsigned int)" } \ + { "ptype v_unsigned_int" "type = unsigned int" } \ + { "ptype v_unsigned_long" \ + "type = (unsigned long|long unsigned int)" } ] + + foreach i $command { + if [gdb_test [lindex $i 0] [lindex $i 1] ""] then { + fail "$binfile ($bfdformat) \"[lindex $i 0]\" unsigned C types" + return + } + } + pass "$binfile ($bfdformat) ptype unsigned C types" +} + +# Note that plain chars can be either signed or unsigned. + +proc test_ptype_array_types {} { + global gdb_prompt + global binfile + global bfdformat + global det_file + + # set up a list of lists of command and patterns + set command [list { "ptype v_char_array" "type =(\ unsigned\ |\ signed\ |\ )char \\\[2\\\]" }\ + { "ptype v_short_array" \ + "type = (short|short int) \\\[2\\\]" } \ + { "ptype v_int_array" "type = int \\\[2\\\]" } \ + { "ptype v_long_array" "type = (long|long int) \\\[2\\\]" } \ + { "ptype v_float_array" "type = float \\\[2\\\]" } \ + { "ptype v_double_array" "type = double \\\[2\\\]" } ] + + foreach i $command { + if [gdb_test [lindex $i 0] [lindex $i 1] ""] then { + fail "$binfile ($bfdformat) \"[lindex $i 0]\" C array types" + return + } + } + pass "$binfile ($bfdformat) ptype C array types" +} + +proc test_ptype_pointer_types {} { + global gdb_prompt + global binfile + global bfdformat + global det_file + + # set up a list of lists of command and patterns + set command [list { "ptype v_char_pointer" "type =(\ unsigned\ |\ signed\ |\ )char \*" }\ + { "ptype v_short_pointer" "type = (short|short int) \*" } \ + { "ptype v_int_pointer" "type = int \*" } \ + { "ptype v_long_pointer" "type = (long|long int) \*" } \ + { "ptype v_float_pointer" "type = float \*" } \ + { "ptype v_double_pointer" "type = double \*" } ] + + foreach i $command { + if [gdb_test [lindex $i 0] [lindex $i 1] ""] then { + fail "$binfile ($bfdformat) \"[lindex $i 0]\" C pointer types" + return + } + } + pass "$binfile ($bfdformat) ptype C pointer types" +} + +proc loadandtest { args } { + global verbose + global GDB + global GDBFLAGS + global gdb_prompt + global subdir + global objdir + global binfile + global bfdformat + global file_loaded + + set binfile [ lindex $args 0 ] + set bfdformat [ lindex $args 1 ] + set fixme [ lindex $args 2 ] + + if ![file exists $objdir/$subdir/$binfile] then { + perror "$objdir/$subdir/$binfile does not exist" + return 0 + } + gdb_exit + gdb_start + if $fixme then { setup_xfail "*-*-*" } + bfddefault + if $fixme then { setup_xfail "*-*-*" } + if [string match $bfdformat "elf-big"] then { + if [string match $binfile "i860-elf"] then { + setup_xfail "*-*-*" + } + } + bfdexplicit + if $file_loaded==1 then { + test_ptype_functions + if $fixme then { setup_xfail "*-*-*" } + test_ptype_plain_types + if $fixme then { setup_xfail "*-*-*" } + test_ptype_signed_types + if $fixme then { setup_xfail "*-*-*" } + test_ptype_unsigned_types + if $fixme then { setup_xfail "*-*-*" } + test_ptype_array_types + if $fixme then { setup_xfail "*-*-*" } + test_ptype_pointer_types + } +} + +# Run tests for each of the test executables. +# If the third argument is 1, the tests will be expected to fail. +# We should extract the information about available tests and bfd formats +# from the makefile or some other control file (FIXME). + +loadandtest m68k-elf "elf32-m68k" 0 + +# I'm getting an XPASS for explicit format on this one +loadandtest m68k-aout "a.out-newsos3" 1 + +loadandtest m68k-aout2 "a.out-sunos-big" 0 +loadandtest mips-ecoff "ecoff-bigmips" 0 +loadandtest i486-elf "elf32-i386" 0 +loadandtest sparc-aout "a.out-sunos-big" 0 +loadandtest sparc-elf "elf32-sparc" 0 + +#FIXME: i860 support is unlikely to be working in the near future +# so suppress this test until it is working. -fnf +#loadandtest i860-elf "elf32-i860" 0 + +gdb_test "set gnutarget auto" "" diff --git a/gdb/testsuite/gdb.base/d10v.ld b/gdb/testsuite/gdb.base/d10v.ld new file mode 100644 index 00000000000..3c4c38a3c9c --- /dev/null +++ b/gdb/testsuite/gdb.base/d10v.ld @@ -0,0 +1,155 @@ +OUTPUT_FORMAT("elf32-d10v", "elf32-d10v", + "elf32-d10v") +OUTPUT_ARCH(d10v) +ENTRY(_start) + SEARCH_DIR(/usr/cygnus/d10v-961230/H-sparc-sun-sunos4.1//lib); +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + /* Overlay sections: */ + .ovly0 0x01010000 : AT (0x12010000) { foo.o(.text) } + .ovly1 0x01010000 : AT (0x12011000) { bar.o(.text) } + .ovly2 0x01011000 : AT (0x12012000) { baz.o(.text) } + .ovly3 0x01011000 : AT (0x12013000) { grbx.o(.text) } + .data00 0x00001000 : AT (0x12014000) { foo.o(.data) } + .data01 0x00001000 : AT (0x12015000) { bar.o(.data) } + .data02 0x00002000 : AT (0x12016000) { baz.o(.data) } + .data03 0x00002000 : AT (0x12017000) { grbx.o(.data) } + /* Read-only sections, merged into data segment: */ + . = 0x00000004; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .rel.text : { *(.rel.text) } + .rela.text : { *(.rela.text) } + .rel.data : { *(.rel.data) } + .rela.data : { *(.rela.data) } + .rel.rodata : { *(.rel.rodata) } + .rela.rodata : { *(.rela.rodata) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .plt : { *(.plt) } + .rodata : { *(.rodata) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + /* Adjust the address for the data segment. */ + . = ALIGN(4); + .data : + { + *(.data) + *(.gnu.linkonce.d*) + _ovly_table = .; + LONG(ABSOLUTE(ADDR(.ovly0))); + LONG(SIZEOF(.ovly0)); + LONG(LOADADDR(.ovly0)); + LONG(0); + LONG(ABSOLUTE(ADDR(.ovly1))); + LONG(SIZEOF(.ovly1)); + LONG(LOADADDR(.ovly1)); + LONG(0); + LONG(ABSOLUTE(ADDR(.ovly2))); + LONG(SIZEOF(.ovly2)); + LONG(LOADADDR(.ovly2)); + LONG(0); + LONG(ABSOLUTE(ADDR(.ovly3))); + LONG(SIZEOF(.ovly3)); + LONG(LOADADDR(.ovly3)); + LONG(0); + LONG(ABSOLUTE(ADDR(.data00))); + LONG(SIZEOF(.data00)); + LONG(LOADADDR(.data00)); + LONG(0); + LONG(ABSOLUTE(ADDR(.data01))); + LONG(SIZEOF(.data01)); + LONG(LOADADDR(.data01)); + LONG(0); + LONG(ABSOLUTE(ADDR(.data02))); + LONG(SIZEOF(.data02)); + LONG(LOADADDR(.data02)); + LONG(0); + LONG(ABSOLUTE(ADDR(.data03))); + LONG(SIZEOF(.data03)); + LONG(LOADADDR(.data03)); + LONG(0); + _novlys = .; + LONG((_novlys - _ovly_table) / 16); + CONSTRUCTORS + } + .data1 : { *(.data1) } + .ctors : + { + *(.ctors) + } + .dtors : + { + *(.dtors) + } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : { *(.sdata) } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + .sbss : { *(.sbss) *(.scommon) } + .bss : + { + *(.dynbss) + *(.bss) + *(COMMON) + } + _end = . ; + PROVIDE (end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the .debug DWARF section are relative to the beginning of the + section so we begin .debug at 0. It's not clear yet what needs to happen + for the others. */ + .debug 0 : { *(.debug) } + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .line 0 : { *(.line) } + /* These must appear regardless of . */ + /* Hmmm, there's got to be a better way. This sets the stack to the + top of the simulator memory (i.e. top of 64K data space). */ + .stack 0x00007FFE : { _stack = .; *(.stack) } + .text 0x1000000 : + { + *(.init) + *(.fini) + *(.text) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + } =0 + _etext = .; + PROVIDE (etext = .); +} diff --git a/gdb/testsuite/gdb.base/d10vovly.c b/gdb/testsuite/gdb.base/d10vovly.c new file mode 100644 index 00000000000..bdb90feae6b --- /dev/null +++ b/gdb/testsuite/gdb.base/d10vovly.c @@ -0,0 +1,225 @@ + +/* + * Ovlymgr.c -- Runtime Overlay Manager for the GDB testsuite. + */ + +#include "ovlymgr.h" + +/* Local functions and data: */ + +extern unsigned long _ovly_table[][4]; +extern unsigned long _novlys __attribute__ ((section (".data"))); +enum ovly_index { VMA, SIZE, LMA, MAPPED}; + +static void ovly_copy (unsigned long dst, unsigned long src, long size); + +/* Flush the data and instruction caches at address START for SIZE bytes. + Support for each new port must be added here. */ +/* FIXME: Might be better to have a standard libgloss function that + ports provide that we can then use. Use libgloss instead of newlib + since libgloss is the one intended to handle low level system issues. + I would suggest something like _flush_cache to avoid the user's namespace + but not be completely obscure as other things may need this facility. */ + +static void +FlushCache (void) +{ +#ifdef __M32R__ + volatile char *mspr = (char *) 0xfffffff7; + *mspr = 1; +#endif +} + +/* OverlayLoad: + * Copy the overlay into its runtime region, + * and mark the overlay as "mapped". + */ + +bool +OverlayLoad (unsigned long ovlyno) +{ + unsigned long i; + + if (ovlyno < 0 || ovlyno >= _novlys) + exit (-1); /* fail, bad ovly number */ + + if (_ovly_table[ovlyno][MAPPED]) + return TRUE; /* this overlay already mapped -- nothing to do! */ + + for (i = 0; i < _novlys; i++) + if (i == ovlyno) + _ovly_table[i][MAPPED] = 1; /* this one now mapped */ + else if (_ovly_table[i][VMA] == _ovly_table[ovlyno][VMA]) + _ovly_table[i][MAPPED] = 0; /* this one now un-mapped */ + + ovly_copy (_ovly_table[ovlyno][VMA], + _ovly_table[ovlyno][LMA], + _ovly_table[ovlyno][SIZE]); + + FlushCache (); + + return TRUE; +} + +/* OverlayUnload: + * Copy the overlay back into its "load" region. + * Does NOT mark overlay as "unmapped", therefore may be called + * more than once for the same mapped overlay. + */ + +bool +OverlayUnload (unsigned long ovlyno) +{ + if (ovlyno < 0 || ovlyno >= _novlys) + exit (-1); /* fail, bad ovly number */ + + if (!_ovly_table[ovlyno][MAPPED]) + exit (-1); /* error, can't copy out a segment that's not "in" */ + + ovly_copy (_ovly_table[ovlyno][LMA], + _ovly_table[ovlyno][VMA], + _ovly_table[ovlyno][SIZE]); + + return TRUE; +} + +#ifdef __D10V__ +#define IMAP0 (*(short *)(0xff00)) +#define IMAP1 (*(short *)(0xff02)) +#define DMAP (*(short *)(0xff04)) + +static void +D10VTranslate (unsigned long logical, + short *dmap, + unsigned long **addr) +{ + unsigned long physical; + unsigned long seg; + unsigned long off; + + /* to access data, we use the following mapping + 0x00xxxxxx: Logical data address segment (DMAP translated memory) + 0x01xxxxxx: Logical instruction address segment (IMAP translated memory) + 0x10xxxxxx: Physical data memory segment (On-chip data memory) + 0x11xxxxxx: Physical instruction memory segment (On-chip insn memory) + 0x12xxxxxx: Phisical unified memory segment (Unified memory) + */ + + /* Addresses must be correctly aligned */ + if (logical & (sizeof (**addr) - 1)) + exit (-1); + + /* If the address is in one of the two logical address spaces, it is + first translated into a physical address */ + seg = (logical >> 24); + off = (logical & 0xffffffL); + switch (seg) + { + case 0x00: /* in logical data address segment */ + if (off <= 0x7fffL) + physical = (0x10L << 24) + off; + else + /* Logical address out side of on-chip segment, not + supported */ + exit (-1); + break; + case 0x01: /* in logical instruction address segment */ + { + short map; + if (off <= 0x1ffffL) + map = IMAP0; + else if (off <= 0x3ffffL) + map = IMAP1; + else + /* Logical address outside of IMAP[01] segment, not + supported */ + exit (-1); + if (map & 0x1000L) + { + /* Instruction memory */ + physical = (0x11L << 24) | off; + } + else + { + /* Unified memory */ + physical = ((map & 0x7fL) << 17) + (off & 0x1ffffL); + if (physical > 0xffffffL) + /* Address outside of unified address segment */ + exit (-1); + physical |= (0x12L << 24); + } + break; + } + case 0x10: + case 0x11: + case 0x12: + physical = logical; + break; + default: + exit (-1); /* error */ + } + + seg = (physical >> 24); + off = (physical & 0xffffffL); + switch (seg) + { + case 0x10: /* dst is a 15 bit offset into the on-chip memory */ + *dmap = 0; + *addr = (long *) (0x0000 + ((short)off & 0x7fff)); + break; + case 0x11: /* dst is an 18-bit offset into the on-chip + instruction memory */ + *dmap = 0x1000L | ((off & 0x3ffffL) >> 14); + *addr = (long *) (0x8000 + ((short)off & 0x3fff)); + break; + case 0x12: /* dst is a 24-bit offset into unified memory */ + *dmap = off >> 14; + *addr = (long *) (0x8000 + ((short)off & 0x3fff)); + break; + default: + exit (-1); /* error */ + } +} +#endif /* __D10V__ */ + +static void +ovly_copy (unsigned long dst, unsigned long src, long size) +{ +#ifdef __M32R__ + memcpy ((void *) dst, (void *) src, size); + return; +#endif /* M32R */ + +#ifdef __D10V__ + unsigned long *s, *d, tmp; + short dmap_src, dmap_dst; + short dmap_save; + + /* all section sizes should by multiples of 4 bytes */ + dmap_save = DMAP; + + D10VTranslate (src, &dmap_src, &s); + D10VTranslate (dst, &dmap_dst, &d); + + while (size > 0) + { + /* NB: Transfer 4 byte (long) quantites, problems occure + when only two bytes are transfered */ + DMAP = dmap_src; + tmp = *s; + DMAP = dmap_dst; + *d = tmp; + d++; + s++; + size -= sizeof (tmp); + src += sizeof (tmp); + dst += sizeof (tmp); + if ((src & 0x3fff) == 0) + D10VTranslate (src, &dmap_src, &s); + if ((dst & 0x3fff) == 0) + D10VTranslate (dst, &dmap_dst, &d); + } + DMAP = dmap_save; +#endif /* D10V */ +} + diff --git a/gdb/testsuite/gdb.base/default.exp b/gdb/testsuite/gdb.base/default.exp new file mode 100644 index 00000000000..8e1506aeb02 --- /dev/null +++ b/gdb/testsuite/gdb.base/default.exp @@ -0,0 +1,793 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1994, 1997, 1998 +# 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# Start with a fresh gdb + +gdb_exit +gdb_start + +set timeout 60 + +# +# test default actions of gdb commands +# + +#load_lib gdb.exp + +gdb_test "add-symbol-file" "add-symbol-file takes a file name and an address" "add-symbol-file" + +setup_xfail "mips-idt-*" +send_gdb "attach\n" +gdb_expect { + -re "Argument required .(process-id|program) to attach.*$gdb_prompt $"\ + { pass "attach" } + -re "You can't do that when your target is `None'.*$gdb_prompt $"\ + { pass "attach" } + -re "Don't know how to attach. Try \"help target\"..*$gdb_prompt $"\ + { pass "attach" } + -re "Kill it. .y or n." { + send_gdb "y\n" + exp_continue + } + -re "$gdb_prompt $" { fail "attach" } + timeout { fail "(timeout) attach" } +} + +# FIXME: attach kills the udi connection +if { [istarget "a29k-*-udi"] } { + gdb_exit + gdb_start +} + +if ![target_info exists use_gdb_stub] { + gdb_test "break" "No default breakpoint address now." "break" + foreach i "b br bre brea" { + gdb_test $i "No default breakpoint address now." "break \"$i\" abbreviation" + } + + + setup_xfail "mips-idt-*" "a29k-*-udi" + gdb_test "backtrace" "No stack." + foreach i "bt ba bac" { + setup_xfail "mips-idt-*" "a29k-*-udi" + gdb_test $i "No stack." "backtrace \"$i\" abbreviation" + } +} else { + warning "Skipping backtrace and break tests because of GDB stub." +} + +# This works on the MIPS IDT board, but confuses future tests. +if ![istarget "mips-idt-*"] then { + setup_xfail "a29k-*-udi" + gdb_test "continue" "The program is not being run." "continue" + setup_xfail "a29k-*-udi" + gdb_test "c" "The program is not being run." "continue \"c\" abbreviation" +} + +# FIXME: continue kills the udi connection +if [istarget "a29k-*-udi"] then { + gdb_exit + gdb_start +} + +#test call +gdb_test "call" "The history is empty..*" "call" + + +#test catch +gdb_test "catch" "Catch requires an event name..*" "catch" + +#test cd +gdb_test "cd" "Argument required .new working directory.*" "cd" + +#test clear +gdb_test "clear" "No source file specified..*" "clear" + +#test commands +gdb_test "commands" "No breakpoint number 0..*" "commands" + +#test condition +gdb_test "condition" "Argument required .breakpoint number.*" "condition" + +#test core-file +gdb_test "core-file" "No core file now.|GDB can't read core files on this machine." "core-file" +#test delete "d" abbreviation +gdb_test "d" "" "delete \"d\" abbreviation" +#test delete +gdb_test "delete" "" "delete" +#test define +gdb_test "define" "Argument required \[(\]name of command to define\[)\]." "define" +#test delete breakpoints +gdb_test "delete breakpoints" "" "delete breakpoints" +#test delete display +# FIXME -- need to dump full output to detailed log +send_gdb "delete display\n" +gdb_expect { + -re "Delete all auto-display expressions.*y or n. $" { + send_gdb "y\n" + gdb_expect { + -re "$gdb_prompt $" { pass "delete display prompt" } + timeout { fail "(timeout) delete display prompt" } + } + } + timeout { fail "(timeout) delete display prompt" } + +} + +#test detach +gdb_test "detach" "" "detach" + +# FIXME: continue kills the udi connection +if [istarget "a29k-*-udi"] then { + gdb_exit + gdb_start +} +if [istarget "h8300-*-hms"] then { + gdb_exit + gdb_start +} + +#test directory +# FIXME -- need to dump full output to detailed log + +send_gdb "directory\n" +gdb_expect { + -re "Reinitialize source path to empty.*y or n. $" { + send_gdb "y\n" + gdb_expect { + -re "Source directories searched: .cdir:.cwd.*$gdb_prompt $"\ + { pass "directory prompt" } + timeout { fail "(timeout) directory prompt" } + } + } +} + +#test disable "dis" abbreviation +gdb_test "dis" "" "disable \"dis\" abbreviation" +#test disable "disa" abbreviation +gdb_test "disa" "" "disable \"disa\" abbreviation" +#test disable +gdb_test "disable" "" "disable" +#test disable breakpoints +gdb_test "disable breakpoints" "" "disable breakpoints" +#test disable display +gdb_test "disable display" "" "disable display" +#test disassemble +gdb_test "disassemble" "No frame selected." "disassemble" +#test display +gdb_test "display" "" "display" +#test do +gdb_test "do" "No stack." "do" +#test document +gdb_test "document" "Argument required .name of command to define.*" "document" +#test down +gdb_test "down" "No stack.*" "down" +#test down-silently +gdb_test "down-silently" "No stack." "down-silently" +#test echo +gdb_test "echo" "" "echo" +#test enable breakpoints delete +gdb_test "enable breakpoints delete" "Argument required .one or more breakpoint numbers.*" "enable breakpoints delete" +#test enable breakpoints once +gdb_test "enable breakpoints once" "Argument required .one or more breakpoint numbers.*" "enable breakpoints once" +#test enable breakpoints +gdb_test "enable breakpoints" "" "enable breakpoints" +#test enable delete +gdb_test "enable delete" "Argument required .one or more breakpoint numbers.*" "enable delete" +#test enable display +gdb_test "enable display" "" "enable display" +#test enable once +gdb_test "enable once" "Argument required .one or more breakpoint numbers.*" "enable once" +#test enable +gdb_test "enable" "" "enable" +#test exec-file +send_gdb "exec-file\n" +gdb_expect { + -re "No executable file now..*$gdb_prompt $" { + pass "exec-file" + } + -re "exec-file.*A program is being debugged already. Kill it. .y or n.*$" { + send_gdb "n\n" + if $verbose>1 then { + send_user "\tDidn't kill program being debugged\n" + } + gdb_expect -re "$gdb_prompt $" { } + pass "exec-file" + } + -re "$gdb_prompt $" { fail "exec-file" } + timeout { fail "(timeout) exec-file" } +} + +#test frame "f" abbreviation +setup_xfail "a29k-*-udi" +gdb_test "f" "No stack." "frame \"f\" abbreviation" +#test frame +setup_xfail "a29k-*-udi" +gdb_test "frame" "No stack." "frame" +#test fg +setup_xfail "a29k-*-udi" +gdb_test "fg" "The program is not being run." "fg" +# FIXME: fg kills the udi connection +#test file +send_gdb "file\n" +gdb_expect { + -re "No executable file now..*$gdb_prompt $"\ + { pass "file" } + -re ".*A program is being debugged already. Kill it. .y or n.*$" { + send_gdb "n\n" + if $verbose>1 then { + send_user "\t\tDidn't kill program being debugged\n" + } + gdb_expect -re "$gdb_prompt $" { } + pass "file" + } + -re ".*$gdb_prompt $" { fail "file" } + timeout { fail "(timeout) file" } +} + +#test finish +setup_xfail "a29k-*-udi" +gdb_test "finish" "The program is not running." "finish" +#test forward-search +# The message here comes from the regexp library, not gdb, and so can +# vary on different systems. +gdb_test "forward-search" "No previous regular expression.*|There is no previous regular expression.*" "forward-search" +#test help "h" abbreviation +gdb_test "h" "List of classes of commands:.*\[\r\n\]+aliases -- Aliases of other commands.*\[\r\n\]+breakpoints -- Making program stop at certain points.*\[\r\n\]+data -- Examining data.*\[\r\n\]+files -- Specifying and examining files.*\[\r\n\]+obscure -- Obscure features.*\[\r\n\]+running -- Running the program.*\[\r\n\]+stack -- Examining the stack.*\[\r\n\]+status -- Status inquiries.*\[\r\n\]+support -- Support facilities.*\[\r\n\]+user-defined -- User-defined commands.*\[\r\n\]+Type \"help\" followed by a class name for a list of commands in that class..*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help \"h\" abbreviation" +#test help +gdb_test "help" "List of classes of commands:.*\[\r\n\]+aliases -- Aliases of other commands.*\[\r\n\]+breakpoints -- Making program stop at certain points.*\[\r\n\]+data -- Examining data.*\[\r\n\]+files -- Specifying and examining files.*\[\r\n\]+obscure -- Obscure features.*\[\r\n\]+running -- Running the program.*\[\r\n\]+stack -- Examining the stack.*\[\r\n\]+status -- Status inquiries.*\[\r\n\]+support -- Support facilities.*\[\r\n\]+user-defined -- User-defined commands.*\[\r\n\]+Type \"help\" followed by a class name for a list of commands in that class..*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help" +#test handle +gdb_test "handle" "Argument required .signal to handle.*" "handle" +#test info "i" abbreviation +gdb_test "i" "\"info\" must be followed by the name of an info command..*\[\r\n\]+List of info subcommands:.*\[\r\n\]+Type \"help info\" followed by info subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "info \"i\" abbreviation" +#test info +gdb_test "info" "\"info\" must be followed by the name of an info command..*\[\r\n\]+List of info subcommands:.*\[\r\n\]+Type \"help info\" followed by info subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "info" +#test ignore +gdb_test "ignore" "Argument required .a breakpoint number.*" "ignore" +#test info address +gdb_test "info address" "Argument required." "info address" +#test info all-registers +setup_xfail "a29k-*-udi" +gdb_test "info all-registers" "The program has no registers now." "info all-registers" +#test info args +gdb_test "info args" "No frame selected." "info args" +#test info bogus-gdb-command +gdb_test "info bogus-gdb-command" "Undefined info command: \"bogus-gdb-command\". Try \"help info\".*" "info bogus-gdb-command" +#test info breakpoints +gdb_test "info breakpoints" "No breakpoints or watchpoints." "info breakpoints" +#test info catch +gdb_test "info catch" "You can't do that without a process to debug." "info catch" +#test info copying +# FIXME -- doesn't work worth a shit +#send_gdb "info copying" +# -re "GNU GENERAL PUBLIC LICENSE.*#of preserving the free status of all derivatives of our free software and.*#of promoting the sharing and reuse of software generally."# +gdb_test "info copying" +# } +# +# +#test info display +gdb_test "info display" "There are no auto-display expressions now." "info display" +#test info frame "f" abbreviation +gdb_test "info f" "No stack.*|No selected frame.*" "info frame \"f\" abbreviation" +#test info frame +gdb_test "info frame" "No stack.|No selected frame." "info frame" +#test info files +gdb_test "info files" "" "info files" +#test info float +if [istarget "arm-*-*"] then { + gdb_test "info float" "Software FPU type.*mask:.*flags:.*" "info float" +} elseif [istarget "thumb-*-*"] then { + gdb_test "info float" "Software FPU type.*mask:.*flags:.*" "info float" +} else { + gdb_test "info float" "No floating point info available for this processor." "info float" +} +#test info functions +gdb_test "info functions" "All defined functions:" "info functions" +#test info locals +gdb_test "info locals" "No frame selected." "info locals" +#test info program +setup_xfail "a29k-*-udi" +gdb_test "info program" "The program being debugged is not being run." "info program" +#test info registers +setup_xfail "a29k-*-udi" +gdb_test "info registers" "The program has no registers now." "info registers" +#test info stack "s" abbreviation +setup_xfail "a29k-*-udi" +gdb_test "info s" "No stack." "info stack \"s\" abbreviation" +#test info stack +setup_xfail "a29k-*-udi" +gdb_test "info stack" "No stack." "info stack" +#test info set +# FIXME -- needs to match the entire output +gdb_test "info set" "confirm: Whether to confirm potentially dangerous operations is o\[a-z\]*..*\[\r\n\]+history filename: The filename in which to record the command history is .*\[\r\n\]+listsize: Number of source lines gdb will list by default is 10.*" "info set" +gdb_test "info symbol" "Argument required .address.." +#test info source +gdb_test "info source" "No current source file..*" "info source" +#test info sources +gdb_test "info sources" "No symbol table is loaded. Use the \"file\" command.*" "info sources" +#test info target +gdb_test "info target" "" "info target" +#test info terminal +gdb_test "info terminal" "No saved terminal information." "info terminal" +#test info types +gdb_test "info types" "All defined types:" "info types" +#test info variables +gdb_test "info variables" "All defined variables:" "info variables" +#test info warranty +gdb_test "info warranty" "NO WARRANTY.*\[\r\n\]+ *11. *BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY.*\[\r\n\]+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN.*\[\r\n\]+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES.*\[\r\n\]+PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED.*\[\r\n\]+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF.*\[\r\n\]+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS.*\[\r\n\]+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE.*\[\r\n\]+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,.*\[\r\n\]+REPAIR OR CORRECTION..*\[\r\n\]+ *12. *IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING.*\[\r\n\]+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR.*\[\r\n\]+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,.*\[\r\n\]+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING.*\[\r\n\]+OUT OF THE USE OR INABILITY TO USE THE PROGRAM .INCLUDING BUT NOT LIMITED.*\[\r\n\]+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY.*\[\r\n\]+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER.*\[\r\n\]+PROGRAMS., EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE.*\[\r\n\]+POSSIBILITY OF SUCH DAMAGES.*" "info warranty" +#test info watchpoints +gdb_test "info watchpoints" "No breakpoints or watchpoints." "info watchpoints" +#test inspect +gdb_test "inspect" "The history is empty." "inspect" +#test jump +setup_xfail "a29k-*-udi" +gdb_test "jump" "The program is not being run." "jump" +#test kill +gdb_test "kill" "The program is not being run." "kill" +#test list "l" abbreviation +gdb_test "l" "No symbol table is loaded. Use the \"file\" command.*" "list \"l\" abbreviation" +#test list +gdb_test "list" "No symbol table is loaded. Use the \"file\" command.*" "list" +#test load +# The ``takes a file name'' case is for vxgdb. +# The ``Use the "file" command'' case is for newer GDB versions which try +# to deduce the filename from the exec file. +gdb_test "load" "You can't do that when your target is `None'.*|The load command takes a file name.*|Must specify at least a file name with the load command.*|.*Use the .file. or .exec-file. command.*" "load" +#test next "n" abbreviation +setup_xfail "a29k-*-udi" +gdb_test "n" "The program is not being run." "next \"n\" abbreviation" +#test next +setup_xfail "a29k-*-udi" +gdb_test "next" "The program is not being run." "next" +#test nexti "ni" abbreviation +setup_xfail "a29k-*-udi" +gdb_test "ni" "The program is not being run." "nexti \"ni\" abbreviation" +#test nexti +setup_xfail "a29k-*-udi" +gdb_test "nexti" "The program is not being run." "nexti" +#test output +gdb_test "output" "Argument required .expression to compute.*" "output" + +#test overlay +gdb_test "overlay" "\"overlay\" must be followed by the name of .*" +#test a non-existant overlay subcommand +gdb_test "overlay on" "Undefined overlay command.* Try \"help overlay\"." +gdb_test "overlay manual" "" "overlay manual #1" +gdb_test "overlay auto" "" +gdb_test "overlay off" "" +gdb_test "overlay list" "No sections are mapped." +gdb_test "overlay map" "Overlay debugging not enabled.*" "overlay map #1" +gdb_test "overlay unmap" "Overlay debugging not enabled.*" "overlay unmap #2" +gdb_test "overlay manual" "" "overlay manual #2" +gdb_test "overlay map" "Argument required: name of an overlay section." "overlay map #2" +gdb_test "overlay unmap" "Argument required: name of an overlay section." "overlay unmap #2" + +#test print "p" abbreviation +gdb_test "p" "The history is empty." "print \"p\" abbreviation" +#test print +gdb_test "print" "The history is empty." "print" +#test printf +gdb_test "printf" "Argument required .format-control string and values to print.*" "printf" +#test ptype +gdb_test "ptype" "The history is empty." "ptype" +#test pwd +gdb_test "pwd" "Working directory .*" "pwd" + +#test run "r" abbreviation +if [istarget "*-*-vxworks*"] then { + gdb_test "set args" "" "" + + gdb_test "r" "Starting program: .* +You must specify a function name to run, and arguments if any"\ + "run \"r\" abbreviation" + gdb_test "set args main" "" "" + +} else { + send_gdb "r\n" + gdb_expect { + -re "Starting program: .* +You can't do that when your target is `None'.*$gdb_prompt $"\ + { pass "run \"r\" abbreviation" } + -re "Starting program: .* +No executable file specified.* +Use the \"file\" or \"exec-file\" command.*$gdb_prompt $"\ + { pass "run \"r\" abbreviation" } + -re "Starting program: .* +No image loaded into target.*$gdb_prompt $"\ + { pass "run \"r\" abbreviation" } + -re "Starting program: .* +No program loaded.*$gdb_prompt $"\ + { pass "run \"r\" abbreviation" } + -re "Don't know how to run. Try \"help target\"..*$gdb_prompt $"\ + { pass "run \"r\" abbreviation" } + -re ".*$gdb_prompt $" { fail "run \"r\" abbreviation" } + timeout { fail "(timeout) run \"r\" abbreviation" } + } +} + +#test run +if [istarget "*-*-vxworks*"] then { + gdb_test "set args" "" "" + + gdb_test "run" "Starting program: .* +You must specify a function name to run, and arguments if any" + gdb_test "set args main" "" "" + +} else { + send_gdb "run\n" + gdb_expect { + -re "Starting program:.*You can't do that when your target is `None'.*$gdb_prompt $" { pass "run" } + -re "Starting program: .* +No executable file specified.* +Use the \"file\" or \"exec-file\" command.*$gdb_prompt $"\ + { pass "run" } + -re "Starting program: .* +No image loaded into target.*$gdb_prompt $"\ + { pass "run" } + -re "Starting program: .* +No program loaded.*$gdb_prompt $"\ + { pass "run \"r\" abbreviation" } + -re "Don't know how to run. Try \"help target\"..*$gdb_prompt $"\ + { pass "run" } + -re ".*$gdb_prompt $" { fail "run" } + timeout { fail "(timeout) run" } + } +} + +#test rbreak +gdb_test "rbreak" "" "rbreak" + +#test return +# The middle case accommodates the a29k, where doing the "ni" above causes +# an initial stack to be created. +gdb_test "return" "No selected frame..*" "return" "Make .* return now.*y or n. $" "y" + + +#test reverse-search +gdb_test "reverse-search" "No previous regular expression.*|There is no previous regular expression.*" "reverse-search" +#test step "s" abbreviation +setup_xfail "a29k-*-udi" +gdb_test "s" "The program is not being run." "step \"s\" abbreviation #1" +#test step +setup_xfail "a29k-*-udi" +gdb_test "step" "The program is not being run." "step #1" +#test search +gdb_test "search" "No previous regular expression.*|There is no previous regular expression.*" "search" +#test section +gdb_test "section" "Must specify section name and its virtual address.*" "section" +#test set annotate +gdb_test "set annotate" "Argument required .integer to set it to.*" "set annotate" +#test set args +gdb_test "set args" "" "set args" +#test set check "c" abbreviation +gdb_test "set c" "\"set check\" must be followed by the name of a check subcommand..*\[\r\n\]+List of set check subcommands:.*\[\r\n\]+set check range -- Set range checking.*\[\r\n\]+set check type -- Set type checking.*\[\r\n\]+Type \"help set check\" followed by set check subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "set check \"c\" abbreviation" +#test set check "ch" abbreviation +gdb_test "set ch" "\"set check\" must be followed by the name of a check subcommand..*\[\r\n\]+List of set check subcommands:.*\[\r\n\]+set check range -- Set range checking.*\[\r\n\]+set check type -- Set type checking.*\[\r\n\]+Type \"help set check\" followed by set check subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "set check \"ch\" abbreviation" +#test set check +gdb_test "set check" "\"set check\" must be followed by the name of a check subcommand..*\[\r\n\]+List of set check subcommands:.*\[\r\n\]+set check range -- Set range checking.*\[\r\n\]+set check type -- Set type checking.*\[\r\n\]+Type \"help set check\" followed by set check subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "set check" +#test set check range +gdb_test "set check range" "" "set check range" +#test set check type +gdb_test "set check type" "" "set check type" +#test set complaints +gdb_test "set complaints" "Argument required .integer to set it to.*" "set complaints" +#test set confirm +gdb_test "set confirm" "" "set confirm" +# Don't test set editing. What if we're talking to a gdb that +# won't do editing correctly while we're talking to it? +# gdb_test "set editing" "" "set editing" + +#test set environment +gdb_test "set environment" "Argument required .environment variable and value.*" "set environment" +#test set height +gdb_test "set height" "Argument required .integer to set it to.*" "set height" +#test set history expansion +gdb_test "set history expansion" "" "set history expansion" +#test set history filename +gdb_test "set history filename" "Argument required .filename to set it to.*" "set history filename" +#test set history save +gdb_test "set history save" "" "set history save" +#test set history size +gdb_test "set history size" "Argument required .integer to set it to.*" "set history size" +#test set history +gdb_test "set history" "\"set history\" must be followed by the name of a history subcommand..*\[\r\n\]+List of set history subcommands:.*\[\r\n\]+set history expansion -- Set history expansion on command input.*\[\r\n\]+set history filename -- Set the filename in which to record the command history.*\[\r\n\]+set history save -- Set saving of the history record on exit.*\[\r\n\]+set history size -- Set the size of the command history.*\[\r\n\]+Type \"help set history\" followed by set history subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "set history" +#test set language +gdb_test "set language" "The currently understood settings are:.*\[\r\n\]+local or auto *Automatic setting based on source file.*\[\r\n\]+c *Use the C language.*\[\r\n\]+c\[+\]+ *Use the C\[+\]+ language.*\[\r\n\]+modula-2 *Use the Modula-2 language.*" "set language" +#test set listsize +gdb_test "set listsize" "Argument required .integer to set it to.*" "set listsize" +#test set print "p" abbreviation +gdb_test "set p" "\"set print\" must be followed by the name of a print subcommand..*\[\r\n\]+List of set print subcommands:.*\[\r\n\]+Type \"help set print\" followed by set print subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "set print \"p\" abbreviation" +#test set print "pr" abbreviation +gdb_test "set pr" "\"set print\" must be followed by the name of a print subcommand..*\[\r\n\]+List of set print subcommands:.*\[\r\n\]+Type \"help set print\" followed by set print subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "set print \"pr\" abbreviation" +#test set print +gdb_test "set print" "\"set print\" must be followed by the name of a print subcommand..*\[\r\n\]+List of set print subcommands:.*\[\r\n\]+Type \"help set print\" followed by set print subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "set print" +#test set print address +gdb_test "set print address" "" "set print address" +#test set print array +gdb_test "set print array" "" "set print array" +#test set print asm-demangle +gdb_test "set print asm-demangle" "" "set print asm-demangle" +#test set print demangle +gdb_test "set print demangle" "" "set print demangle" +#test set print elements +gdb_test "set print elements" "Argument required .integer to set it to.*" "set print elements" +#test set print object +gdb_test "set print object" "" "set print object" +#test set print pretty +gdb_test "set print pretty" "" "set print pretty" +#test set print sevenbit-strings +gdb_test "set print sevenbit-strings" "" "set print sevenbit-strings" +#test set print union +gdb_test "set print union" "" "set print union" +#test set print vtbl +gdb_test "set print vtbl" "" "set print vtbl" +# FIXME -- need a test for "set prompt" +#test set radix +gdb_test "set radix" "Input and output radices now set to decimal 10, hex a, octal 12.*" "set radix" +#test set symbol-reloading +gdb_test "set symbol-reloading" "" "set symbol-reloading" +#test set variable +gdb_test "set variable" "Argument required .expression to compute.*" "set variable" +#test set verbose +gdb_test "set verbose" "" "set verbose" +#test set width +gdb_test "set width" "Argument required .integer to set it to.*" "set width" +#test set write +# This is only supported on targets which use exec.o. +gdb_test "set write" "" "set write" +#test set +gdb_test "set" "Argument required .expression to compute.*" "set" +#test shell echo Hi dad! +gdb_test "shell echo Hi dad!" "Hi dad!" "shell echo Hi dad!" +#test show annotate +gdb_test "show annotate" "Annotation_level is 0." "show annotate" +#test show args +gdb_test "show args" "Argument list to give program being debugged when it is started is \"\"." "show args" +#test show check "c" abbreviation +gdb_test "show c" "range: *Range checking is \"auto; currently off\"..*\[\r\n\]+type: *Type checking is \"auto; currently off\".*" "show check \"c\" abbreviation" +#test show check "ch" abbreviation +gdb_test "show ch" "range: *Range checking is \"auto; currently off\"..*\[\r\n\]+type: *Type checking is \"auto; currently off\"." "show check \"ch\" abbreviation" +#test show check +gdb_test "show check" "range: *Range checking is \"auto; currently off\"..*\[\r\n\]+type: *Type checking is \"auto; currently off\"." "show check" +#test show check range +gdb_test "show check range" "Range checking is \"auto; currently off\"." "show check range" +#test show check type +gdb_test "show check type" "Type checking is \"auto; currently off\"." "show check type" +#test show commands +gdb_test "show commands" "" "show commands" +#test show complaints +gdb_test "show complaints" "Max number of complaints about incorrect symbols is 0." "show complaints" +#test show confirm +gdb_test "show confirm" "Whether to confirm potentially dangerous operations is o\[a-z\]*." "show confirm" +#test show convenience +gdb_test "show convenience" "No debugger convenience variables now defined..*\[\r\n\]+Convenience variables have names starting with \".\";.*\[\r\n\]+use \"set\" as in \"set .foo = 5\" to define them." "show convenience" +#test show directories +gdb_test "show directories" "Source directories searched: .cdir:.cwd" "show directories" +#test show editing +gdb_test "show editing" "Editing of command lines as they are typed is o\[a-z\]*." "show editing" +#test show height +gdb_test "show height" "Number of lines gdb thinks are in a page is.*" "show height" +#test show history expansion +gdb_test "show history expansion" "History expansion on command input is o\[a-z\]*.*" "show history expansion" +#test show history filename +gdb_test "show history filename" "The filename in which to record the command history is.*.gdb_history.*" "show history filename" +#test show history save +gdb_test "show history save" "Saving of the history record on exit is on." "show history save" +#test show history size +gdb_test "show history size" "The size of the command history is.*" "show history size" +#test show history +gdb_test "show history" "expansion: *History expansion on command input is o.*\[\r\n\]+filename: *The filename in which to record the command history is.*.gdb_history.*\[\r\n\]+save: *Saving of the history record on exit is o.*\[\r\n\]+size: * The size of the command history is.*" "show history" +#test show language +gdb_test "show language" "The current source language is \"auto; currently c\"." "show language" +#test show listsize +gdb_test "show listsize" "Number of source lines gdb will list by default is 10." "show listsize" +#test show print "p" abbreviation +gdb_test "show p" ".*" "show p" +#test show print "pr" abbreviation +gdb_test "show pr" ".*" "show pr" +#test show print +gdb_test "show print" "" "show print" +#test show paths +gdb_test "show paths" "Executable and object file path:.*" "show paths" +#test show print address +gdb_test "show print address" "Printing of addresses is on." "show print address" +#test show print array +gdb_test "show print array" "Prettyprinting of arrays is on." "show print array" +#test show print asm-demangle +gdb_test "show print asm-demangle" "Demangling of C\[+\]+ names in disassembly listings is on." "show print asm-demangle" +#test show print demangle +gdb_test "show print demangle" "Demangling of encoded C\[+\]+ names when displaying symbols is on." "show print demangle" +#test show print elements +gdb_test "show print elements" "Limit on string chars or array elements to print is 200." "show print elements" +#test show print object +gdb_test "show print object" "Printing of object's derived type based on vtable info is on." "show print object" +#test show print pretty +gdb_test "show print pretty" "Prettyprinting of structures is on." "show print pretty" +#test show print sevenbit-strings +gdb_test "show print sevenbit-strings" "Printing of 8-bit characters in strings as .nnn is on." "show print sevenbit-strings" +#test show print union +gdb_test "show print union" "Printing of unions interior to structures is on." "show print union" +#test show print vtbl +gdb_test "show print vtbl" "Printing of C\[+\]+ virtual function tables is on." "show print vtbl" +#test show prompt +# In the FAIL case, can't just look for $gdb_prompt because that will match +# the output, rather than the prompt. So look for $gdb_prompt at the start +# of a line. +gdb_test "show prompt" "Gdb's prompt is \"$gdb_prompt \".*" "show prompt" +#test show radix +gdb_test "show radix" "Input and output radices set to decimal 10, hex a, octal 12." "show radix" +#test show symbol-reloading +gdb_test "show symbol-reloading" "Dynamic symbol table reloading multiple times in one run is on." "show symbol-reloading" +#test show user +gdb_test "show user" "" "show user" +#test show values +gdb_test "show values" "" "show values" +#test show verbose +gdb_test "show verbose" "Verbose printing of informational messages is o.*|Verbosity is off.*" "show verbose" +#test show version + +gdb_test "show version" "GNU gdb \[0-9\.\]*.*\[\r\n\]+Copyright \[0-9\]* Free Software Foundation, Inc.*\[\r\n\]+GDB is free software, covered by the GNU General Public License, and you are.*\[\r\n\]+welcome to change it and/or distribute copies of it under certain conditions.*\[\r\n\]+Type \"show copying\" to see the conditions.*\[\r\n\]+There is absolutely no warranty for GDB. Type \"show warranty\" for details.*\[\r\n\]+This GDB was configured as .*|GDB is free software and you are welcome to distribute copies of it.*\[\r\n\]+ under certain conditions; type \"show copying\" to see the conditions..*\[\r\n\]+There is absolutely no warranty for GDB; type \"show warranty\" for details..*\[\r\n\]+GDB.*Copyright \[0-9\]* Free Software Foundation, Inc.*" "show version" +#test show width +gdb_test "show width" "Number of characters gdb thinks are in a line is.*" "show width" +#test show write +# This is only supported on targets which use exec.o. +gdb_test "show write" "Writing into executable and core files is o.*" "show write" +#test show +gdb_test "show" "confirm: *Whether to confirm potentially dangerous operations is on..*\[\r\n\]+history filename: *The filename in which to record the command history is .*\[\r\n\]+history save: *Saving of the history record on exit is on..*\[\r\n\]+history size: *The size of the command history is.*\[\r\n\]+listsize: *Number of source lines gdb will list by default is 10.*\[\r\n\]+print elements: *Limit on string chars or array elements to print is 200..*" "show" +#test stepi "si" abbreviation +setup_xfail "a29k-*-udi" +gdb_test "si" "The program is not being run." "stepi \"si\" abbreviation" +#test stepi +setup_xfail "a29k-*-udi" +gdb_test "stepi" "The program is not being run." "stepi" +#test signal +setup_xfail "a29k-*-udi" +gdb_test "signal" "The program is not being run." "signal" +#test source +gdb_test "source" "source command requires pathname of file to source..*|No such file or directory.*" "source" +#test step "s" abbreviation +setup_xfail "a29k-*-udi" +gdb_test "s" "The program is not being run." "step \"s\" abbreviation #2" +#test step +setup_xfail "a29k-*-udi" +gdb_test "step" "The program is not being run." "step #2" +#test symbol-file +gdb_test "symbol-file" "" "symbol-file" + +#test target child +gdb_test "target child" "Use the \"run\" command to start a Unix child process.*|Undefined target command: \"child\". *Try \"help target\".*" "target child" + +#test target procfs +gdb_test "target procfs" "Use the \"run\" command to start a Unix child process.*|Undefined target command: \"procfs\". *Try \"help target\".*" "target procfs" + +#test target core +send_gdb "target core\n" +gdb_expect { + -re "No core file specified..*$gdb_prompt $" { pass "target core" } + -re ".*A program is being debugged already. Kill it. .y or n.*$" { + send_gdb "n\n" + if $verbose>1 then { + send_user "\t\tDidn't kill program being debugged\n" + } + gdb_expect -re "$gdb_prompt $" { } + pass "target core" + } + -re "Undefined target command: \"core\". Try \"help target\"..*$gdb_prompt $" { pass "target core" } + -re ".*$gdb_prompt $" { fail "target core" } + timeout { fail "(timeout) target core" } +} + +#test target exec +send_gdb "target exec\n" +gdb_expect { + -re "No executable file now..*$gdb_prompt $"\ + { pass "target exec" } + -re ".*A program is being debugged already. Kill it. .y or n.*$" { + send_gdb "n\n" + if $verbose>1 then { + send_user "\t\tDidn't kill program being debugged\n" + } + gdb_expect -re "$gdb_prompt $" { } + pass "target exec" + } + -re ".*$gdb_prompt $" { fail "target exec" } + timeout { fail "(timeout) target exec" } + } + +#test target remote +if ![istarget "*-*-udi*"] then { + send_gdb "target remote\n" + gdb_expect { + -re "To open a remote debug connection, you need to specify what.* +serial device is attached to the remote system .e.g. /dev/ttya.*$gdb_prompt $"\ + { pass "target remote" } + -re ".*A program is being debugged already. Kill it. .y or n.*$" { + send_gdb "n\n" + if $verbose>1 then { + send_user "\t\tDidn't kill program being debugged\n" + } + gdb_expect -re "$gdb_prompt $" { } + pass "target remote" + } + -re ".*$gdb_prompt $" { fail "target remote" } + timeout { fail "(timeout) target remote" } + } +} + +#test target +gdb_test "target" "Argument required .target name.*" "target" +#test tbreak +gdb_test "tbreak" "No default breakpoint address now." "tbreak" +#test tty +gdb_test "tty" "Argument required .terminal name for running target process.*" "tty" +#test until "u" abbreviation +setup_xfail "a29k-*-udi" +gdb_test "u" "The program is not running." "until \"u\" abbreviation" +#test until +setup_xfail "a29k-*-udi" +gdb_test "until" "The program is not running." "until" +#test undisplay +# FIXME -- need to dump full output to detailed log +send_gdb "undisplay\n" +gdb_expect { + -re "Delete all auto-display expressions.*y or n. $" { + send_gdb "y\n" + gdb_expect { + -re "$gdb_prompt $" { pass "undisplay prompt" } + timeout { fail "(timeout) (timeout) undisplay prompt" } + } + } + timeout { fail "(timeout) (timeout) undisplay prompt" } +} + +#test unset environment +send_gdb "unset environment\n" +gdb_expect { + -re "Delete all environment variables?.*y or n. $" { + send_gdb "y\n" + gdb_expect { + -re "$gdb_prompt $" { pass "unset environmentprompt" } + timeout { + fail "(timeout) (timeout) unset environment prompt" + } + } + } + timeout { + fail "(timeout) (timeout) unset environment prompt" + } +} + +#test unset +gdb_test "unset" "\"unset\" must be followed by the name of an unset subcommand..*\[\r\n\]+List of unset subcommands:.*\[\r\n\]+unset environment -- Cancel environment variable VAR for the program.*\[\r\n\]+Type \"help unset\" followed by unset subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "unset" +#test up +#test up-silently +gdb_test "up-silently" "No stack." "up-silently" +#test watch +gdb_test "watch" "Argument required .expression to compute.*" "watch" +#test whatis +gdb_test "whatis" "The history is empty." "whatis" +#test where +setup_xfail "a29k-*-udi" +gdb_test "where" "No stack." "where" +#test x +#The case in which it prints a number is for vxgdb. +gdb_test "x" "0x0:.*0x\[0-9\]*|0x0:.*Cannot access memory at address 0x0." "x" + +gdb_exit diff --git a/gdb/testsuite/gdb.base/define.exp b/gdb/testsuite/gdb.base/define.exp new file mode 100644 index 00000000000..1cd06a92710 --- /dev/null +++ b/gdb/testsuite/gdb.base/define.exp @@ -0,0 +1,304 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni. (ezannoni@cygnus.com) + +if $tracelevel then { + strace $tracelevel + } + +global usestubs + + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "break" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { fail "define tests suppressed" } + +# Verify that GDB allows a user to define their very own commands. +# +send_gdb "define nextwhere\n" +gdb_expect { + -re "Type commands for definition of \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\ + {send_gdb "next\nbt\nend\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "define user command: nextwhere"} + timeout {fail "(timeout) define user command: nextwhere"} + } + } + -re "$gdb_prompt $"\ + {fail "define user command: nextwhere"} + timeout {fail "(timeout) define user command: nextwhere"} +} + +# Verify that those commands work as gdb_expected. +# +send_gdb "nextwhere\n" +gdb_expect { + -re ".*64\[ \t\]*printf.*#0\[ \t\]*main.*:64.*$gdb_prompt $"\ + {pass "use user command: nextwhere"} + -re "$gdb_prompt $"\ + {fail "use user command: nextwhere"} + timeout {fail "(timeout) use user command: nextwhere"} +} + +# Verify that a user can define a command whose spelling is a +# proper substring of another user-defined command. +# +send_gdb "define nextwh\n" +gdb_expect { + -re "Type commands for definition of \"nextwh\".\r\nEnd with a line saying just \"end\".\r\n>$"\ + {send_gdb "next 2\nbt\nend\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "define user command: nextwh"} + timeout {fail "(timeout) define user command: nextwh"} + } + } + -re "$gdb_prompt $"\ + {fail "define user command: nextwh"} + timeout {fail "(timeout) define user command: nextwh"} +} + +# Verify that a user can redefine their commands. (Test both the +# confirmed and unconfirmed cases.) +# +send_gdb "define nextwhere\n" +gdb_expect { + -re "Redefine command \"nextwhere\".*y or n. $"\ + {send_gdb "n\n" + gdb_expect { + -re "Command \"nextwhere\" not redefined.*$gdb_prompt $"\ + {pass "redefine user command aborted: nextwhere"} + -re "$gdb_prompt $"\ + {fail "redefine user command aborted: nextwhere"} + timeout {fail "(timeout) redefine user command aborted: nextwhere"} + } + } + -re "$gdb_prompt $"\ + {fail "redefine user command aborted: nextwhere"} + timeout {fail "(timeout) redefine user command aborted: nextwhere"} +} + +send_gdb "define nextwhere\n" +gdb_expect { + -re "Redefine command \"nextwhere\".*y or n. $"\ + {send_gdb "y\n" + gdb_expect { + -re "Type commands for definition of \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\ + {send_gdb "bt\nnext\nend\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "redefine user command: nextwhere"} + timeout {fail "(timeout) redefine user command: nextwhere"} + } + } + timeout {fail "(timeout) redefine user command: nextwhere"} + } + } + -re "$gdb_prompt $"\ + {fail "redefine user command: nextwhere"} + timeout {fail "(timeout) redefine user command: nextwhere"} +} + +# Verify that GDB gracefully handles an attempt to redefine the +# help text for a builtin command. +# +send_gdb "document step\n" +gdb_expect { + -re "Command \"step\" is built-in..*$gdb_prompt $"\ + {pass "redocumenting builtin command disallowed"} + -re "$gdb_prompt $"\ + {fail "redocumenting builtin command disallowed"} + timeout {fail "(timeout) redocumenting builtin command disallowed"} +} + +# Verify that a user can document their own commands. (And redocument +# them.) +# +send_gdb "document nextwhere\n" +gdb_expect { + -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\ + {send_gdb "A next command that frist shows you where you're stepping from.\nend\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "document user command: nextwhere"} + timeout {fail "(timeout) document user command: nextwhere"} + } + } + -re "$gdb_prompt $"\ + {fail "documenting user command: nextwhere"} + timeout {fail "(timeout) documenting user command: nextwhere"} +} + +send_gdb "document nextwhere\n" +gdb_expect { + -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\ + {send_gdb "A next command that first shows you where you're stepping from.\nend\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "document user command: nextwhere"} + timeout {fail "(timeout) document user command: nextwhere"} + } + } + -re "$gdb_prompt $"\ + {fail "documenting user command: nextwhere"} + timeout {fail "(timeout) documenting user command: nextwhere"} +} + +send_gdb "help nextwhere\n" +gdb_expect { + -re "A next command that first shows you where you're stepping from.\r\n$gdb_prompt $"\ + {pass "help user command: nextwhere"} + -re "$gdb_prompt $"\ + {fail "help user command: nextwhere"} + timeout {fail "(timeout) help user command: nextwhere"} +} + +# Verify that the user can "hook" a builtin command. We choose to +# hook the "stop" pseudo command, and we'll define it to use a user- +# define command. +# +send_gdb "define user-bt\n" +gdb_expect { + -re "Type commands for definition of \"user-bt\".\r\nEnd with a line saying just \"end\".\r\n>$"\ + {send_gdb "bt\nend\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "define user command: user-bt"} + timeout {fail "(timeout) define user command: user-bt"} + } + } + -re "$gdb_prompt $"\ + {fail "define user command: user-bt"} + timeout {fail "(timeout) define user command: user-bt"} +} + +send_gdb "define hook-stop\n" +gdb_expect { + -re "Type commands for definition of \"hook-stop\".\r\nEnd with a line saying just \"end\".\r\n>$"\ + {send_gdb "user-b\nend\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "define hook-stop command"} + timeout {fail "(timeout) define hook-stop command"} + } + } + -re "$gdb_prompt $"\ + {fail "define hook-stop command"} + timeout {fail "(timeout) define hook-stop command"} +} + +send_gdb "next\n" +gdb_expect { + -re "#0\[ \t\]*main.*:66.*$gdb_prompt $"\ + {pass "use hook-stop command"} + -re "$gdb_prompt $"\ + {fail "use hook-stop command"} + timeout {fail "(timeout) use hook-stop command"} +} + +# Verify that GDB responds gracefully to an attempt to define a "hook +# command" which doesn't exist. (Test both the confirmed and unconfirmed +# cases.) +# +send_gdb "define hook-bar\n" +gdb_expect { + -re "warning: Your new `hook-bar' command does not hook any existing command.\r\nProceed.*y or n. $"\ + {send_gdb "n\n" + gdb_expect { + -re "Not confirmed.*$gdb_prompt $"\ + {pass "define hook undefined command aborted: bar"} + -re "$gdb_prompt $"\ + {fail "define hook undefined command aborted: bar"} + timeout {fail "(timeout) define hook undefined command aborted: bar"} + } + } + -re "$gdb_prompt $"\ + {fail "define hook undefined command aborted: bar"} + timeout {fail "(timeout) define hook undefined command aborted: bar"} +} + +send_gdb "define hook-bar\n" +gdb_expect { + -re "warning: Your new `hook-bar' command does not hook any existing command.\r\nProceed.*y or n. $"\ + {send_gdb "y\n" + gdb_expect { + -re "Type commands for definition of \"hook-bar\".\r\nEnd with a line saying just \"end\".\r\n>$"\ + {send_gdb "nextwhere\nend\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "define hook undefined command: bar"} + timeout {fail "(timeout) define hook undefined command: bar"} + } + } + -re "$gdb_prompt $"\ + {fail "define hook undefined command: bar"} + timeout {fail "(timeout) define hook undefined command: bar"} + } + } + -re "$gdb_prompt $"\ + {fail "define hook undefined command: bar"} + timeout {fail "(timeout) define hook undefined command: bar"} +} + +# This is a quasi-define command: Verify that the user can redefine +# GDB's gdb_prompt. +# +send_gdb "set prompt \\(blah\\) \n" +gdb_expect { + -re "\\(blah\\) $"\ + {pass "set gdb_prompt"} + -re "$gdb_prompt $"\ + {fail "set gdb_prompt"} + timeout {fail "(timeout) set gdb_prompt"} +} + +send_gdb "set prompt \\(gdb\\) \n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "reset gdb_prompt"} + timeout {fail "(timeout) reset gdb_prompt"} +} + +gdb_exit +return 0 + + + + + + diff --git a/gdb/testsuite/gdb.base/display.c b/gdb/testsuite/gdb.base/display.c new file mode 100644 index 00000000000..a85f0670f27 --- /dev/null +++ b/gdb/testsuite/gdb.base/display.c @@ -0,0 +1,52 @@ +/* Loop and vars for tests of display commands +*/ +#include +#define LOOP 10 + +int sum = 0; + +int do_loops() +{ + int i=0; + int k=0; + int j=0; + + for( i = 0; i < LOOP; i++ ) { + for( j = 0; j < LOOP; j++ ) { + for( k = 0; k < LOOP; k++ ) { + sum++; + } + } + } + return i; +} + +int do_vars() +{ + int j; + int i = 9; + float f = 1.234; + char c = 'Q'; + int *p_i = &i; + float *p_f = &f; + char *p_c = "rubarb and fries"; + + /* Need some code here to set breaks on. + */ + for( j = 0; j < LOOP; j++ ) { + if( p_c[j] == c ) { + j++; + } + else { + i++; + } + } + + return *p_i; +} + +main() +{ + do_loops(); + do_vars(); +} diff --git a/gdb/testsuite/gdb.base/display.exp b/gdb/testsuite/gdb.base/display.exp new file mode 100644 index 00000000000..f5c2641226d --- /dev/null +++ b/gdb/testsuite/gdb.base/display.exp @@ -0,0 +1,147 @@ +# Copyright (C) 1997, 1998 +# 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# display.exp Test display commands +# Also do some printing stuff for coverage's sake. +# +if $tracelevel then { + strace $tracelevel +} + +set testfile display +set srcfile ${srcdir}/${subdir}/${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + + + +if { [gdb_compile "${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + + +# use this to debug: +#log_user 1 + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# Ok, on to real life +# +gdb_test "b main" ".*Breakpoint 1.*" "break main" +gdb_test "r" ".*Breakpoint 1, main.*" "get to main" +gdb_test "b 14" ".*Breakpoint 2.*" "break do_loops" +gdb_test "c" ".*Breakpoint 2, do_loops.*" "get to do_loops" + +# Create stopping points. +# +gdb_test "wat sum" ".*\[Ww\]atchpoint 3: sum.*" "set watch" +gdb_test "b 19" ".*Breakpoint 4.*" "break 19" + +# Create displays for those points +# +gdb_test "info disp" ".*There are no auto-display expressions now..*" "inf disp" +gdb_test "disp i" ".*1: i = 0.*" "display i" +gdb_test "disp/x j" ".*2: /x j = 0x0.*" "display j" +gdb_test "disp/i &k" ".*3: x/i &k $hex:.*" "display &k" +gdb_test "disp/f sum" ".*4: /f sum = 0.*" "display/f sum" +gdb_test "disp/s &sum" ".*5: x/s &sum $hex.*sum.:.*" "display/s &sum" + +# Hit the displays +# +gdb_test "c" ".*\[Ww\]atchpoint 3: sum.*\[1-9\]*: x/s &sum.*\[1-9\]*: /f sum = 1.40129846e.45\r\n\[1-9\]*: x/i &k.*\r\n\[1-9\]*: /x j = 0x0\r\n\[1-9\]*: i = 0.*" "first disp" +gdb_test "c" ".*\[Ww\]atchpoint 3: sum.*\[1-9\]*: x/s &sum.*\[1-9\]*: /f sum = 2.80259693e.45\r\n\[1-9\]*: x/i &k.*\r\n\[1-9\]*: /x j = 0x0.*\[1-9\]*: i = 0.*" "second disp" + +gdb_test "enab disp 6" ".*No display number 6..*" "catch err" +gdb_test "disab disp 1" ".*" "disab" +gdb_test "disab disp 2" ".*" "" +gdb_test "enab disp 1" ".*" "re-enab" +gdb_test "enab disp 1" ".*" "re-enab of enab" +gdb_test "undisp 5" ".*" "undisp" +gdb_test "i disp" ".*Auto-display expressions now in effect.*y /f sum.*y /1bi &k.*n /x j.*y i.*" "info disp" + +gdb_test "c" ".*\[Ww\]atch.*4.20389539e-45.*.*i = 0.*" "next hit" + +send_gdb "undisp\n" +gdb_expect { + -re ".*Delete all auto-display expressions.*y or n. $" { + send_gdb "y\n" + gdb_expect { + -re "y\r\n$gdb_prompt $" { + pass "undisp all" + } + -re ".*$gdb_prompt $" { + fail "some un-helpful response" + } + -re ".*Delete all.*$" { + fail "re-ask question" + } + timeout { fail "timeout" } + } + } + -re ".*$gdb_prompt $" { + fail "undisp all" + } + timeout { fail "timeout" } +} + +gdb_test "disab 3" ".*.*" "" +gdb_test "c" ".*Breakpoint 4.*" "watch off" + +# Now the printf tests +# +gdb_test "fin" ".*Run till exit.*Value returned is.*= 10.*" "finish" +gdb_test "s" ".*do_vars.*.*25" "" +gdb_test "tb 35" ".*Breakpoint 5 a.*" "" +gdb_test "c" ".*do_vars.*35.*35.*" "" + +# Beat on printf a bit +# +gdb_test "printf" ".*Argument required.*" "" +gdb_test "printf %d" ".*Bad format string, missing.*" "" +gdb_test "printf \"%d" ".*Bad format string, non-terminated.*" "" +gdb_test "printf \"%d%d\",i" ".*Wrong number of arguments.*" "" +gdb_test "printf \"\\\\!\\a\\f\\r\\t\\v\\b\"" ".*!.*" "" +gdb_test "printf \"\"" ".*" "re-set term" +gdb_test "printf \"\\w\"" ".*Unrecognized escape character.*" "" +gdb_test "printf \"%d\" j" ".*Invalid argument syntax.*" "" + +# play with "p", too +# +gdb_test "p/r j" ".*Undefined output format.*" "" +#gdb_test "x/rx j" ".*Cannot access memory.*" "no error!" +gdb_test "x/0 j" ".*" "x/0 j" +gdb_test "p/0 j" ".*Item count other than 1 is meaningless.*" "p/0 j" +gdb_test "p/s sum" ".*Format letter.*is meaningless.*" " no s" +gdb_test "p/i sum" ".*Format letter.*is meaningless.*.*" "no i" +gdb_test "p/a &sum" ".*= 0x.*.*" "" +gdb_test "p/a main+1000" ".*= 0x.*<.*>.*" "" +gdb_test "p/a \\\$pc" ".*= 0x.*.*" "" +gdb_test "p/a &j" ".*= 0x.*<.*>.*" "" +gdb_test "p/a &&j" ".*A syntax error.*" "" + +# Done! +# +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/dollar.exp b/gdb/testsuite/gdb.base/dollar.exp new file mode 100644 index 00000000000..50fac6abf04 --- /dev/null +++ b/gdb/testsuite/gdb.base/dollar.exp @@ -0,0 +1,128 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# GDB tests for names beginning with '$' + +# This is aimed at HP-UX systems where a lot of system +# routines and names begin with '$' or '$$'. GDB 4.16 was +# unable to deal with these names as they clashed with +# convenience variables. Wildebeest should accept such +# names in preference to convenience variables. + +# This file was written by Satish Pai +# 1997-09-24 + +if ![ istarget "*-*-hpux*" ] then { + return +} + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "exprs" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +#source ${binfile}.ci + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# Test for millicode routines +send_gdb "print \$\$dyncall\n" +gdb_expect { + -re "\\$\[0-9\]* = \\{\\} $hex <>.*$gdb_prompt $" { pass "print \$\$dyncall" } + -re "\\$\[0-9\]* = void" { fail "print \$\$dyncall -- interpreted as convenience var" } + -re "$gdb_prompt $" { fail "print \$\$dyncall" } + timeout { fail "(timeout) print \$\$dyncall" } +} +send_gdb "print \$\$dyncall_external\n" +gdb_expect { + -re "\\$\[0-9\]* = \\{\\} $hex <>.*$gdb_prompt $" { pass "print \$\$dyncall_external" } + -re "\\$\[0-9\]* = void" { fail "print \$\$dyncall_external -- interpreted as convenience var" } + -re "$gdb_prompt $" { fail "print \$\$dyncall_external" } + timeout { fail "(timeout) print \$\$dyncall_external" } +} + +# Set a breakpoint on a millicode routine +send_gdb "break \$\$dyncall\n" +gdb_expect { + -re "Breakpoint \[0-9\]* at $hex.*$gdb_prompt $" { pass "break \$\$dyncall" } + -re "Function.*not defined.*$gdb_prompt $" {fail "break \$\$dyncall -- no \$\$dyncall?" } + -re "Convenience variables used in line specs must have integer values\\..*$gdb_prompt $" { + fail "break \$\$dyncall -- treated as convenince variable" + } + -re "$gdb_prompt $" { fail "print break \$\$dyncall" } + timeout { fail "(timeout) print break \$\$dyncall" } +} + +# Disassemble $$dyncall +send_gdb "disassemble \$\$dyncall\n" +gdb_expect { + -re "Dump of assembler code for function.*$gdb_prompt $" { pass "disas \$\$dyncall" } + -re "$gdb_prompt $" { fail "disas \$\$dyncall" } + timeout { fail "(timeout) disas \$\$dyncall" } +} + +# Try to set $$dyncall like a convenience var. +send_gdb "set \$\$dyncall = 77\n" +gdb_expect { + -re "Invalid cast.*$gdb_prompt $" { pass "set \$\$dyncall = 77" } + -re "$gdb_prompt $" { fail "set \$\$dyncall = 77" } + timeout { fail "(timeout) set \$\$dyncall = 77" } +} + +# Try out some other $ name, not millicode +send_gdb "print \$ARGV\n" +gdb_expect { + -re "\\$\[0-9\]* = \[0-9\]*.*$gdb_prompt $" { pass "print \$ARGV" } + -re "\\$\[0-9\]* = void.*$gdb_prompt $" { fail "print \$ARGV (interpreted as convenience var)" } + -re "$gdb_prompt $" { fail "print \$ARGV" } + timeout { fail "(timeout) print \$ARGV" } +} +send_gdb "ptype \$ARGV\n" +gdb_expect { + -re "type = .*$gdb_prompt $" { pass "ptype \$ARGV" } + -re "type = void.*$gdb_prompt $" { fail "ptype \$ARGV (interpreted as convenience var)" } + -re "$gdb_prompt $" { fail "ptype \$ARGV" } + timeout { fail "(timeout) ptype \$ARGV" } +} + diff --git a/gdb/testsuite/gdb.base/echo.exp b/gdb/testsuite/gdb.base/echo.exp new file mode 100644 index 00000000000..c8220ff2d65 --- /dev/null +++ b/gdb/testsuite/gdb.base/echo.exp @@ -0,0 +1,44 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +# Crank up gdb. +gdb_start + +if $tracelevel then { + strace $tracelevel +} + +# +# test the echo command +# + +# this sets the prms id number. This is the number that will appear +# on all the output logs. +# ex: set prms_id 643 +set prms_id 0 + +# this sets the bug id id. This is the number that will appear +# on all the output logs. This is optional and if it is not set +# it will appear on all output logs as a 0. +# ex: set bug_id 12 +set bug_id 0 + +gdb_test "echo Hello world!\\n" "Hello world!" "Echo test" diff --git a/gdb/testsuite/gdb.base/ena-dis-br.exp b/gdb/testsuite/gdb.base/ena-dis-br.exp new file mode 100644 index 00000000000..6593d824294 --- /dev/null +++ b/gdb/testsuite/gdb.base/ena-dis-br.exp @@ -0,0 +1,525 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel + } + +global usestubs + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "break" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { fail "enable/disable break tests suppressed" } + +# Verify that we can set a breakpoint (the location is irrelevant), +# then enable it (yes, it's already enabled by default), then hit it. +# +send_gdb "break marker1\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 41.*$gdb_prompt $"\ + {pass "break marker1"} + -re "$gdb_prompt $"\ + {fail "break marker1"} + timeout {fail "(timeout) break marker1"} +} + +send_gdb "enable $expect_out(1,string)\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "enable break marker1"} + timeout {fail "(timeout) enable break marker1"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y.*$gdb_prompt $"\ + {pass "info break marker1"} + -re "$gdb_prompt $"\ + {fail "info break marker1"} + timeout {fail "(timeout) info break marker1"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $"\ + {pass "continue to break marker1"} + -re "$gdb_prompt $"\ + {fail "continue to break marker1"} + timeout {fail "(timeout) continue to break marker1"} +} + +send_gdb "delete $expect_out(1,string)\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "delete break marker1"} + timeout {fail "(timeout) delete break marker1"} +} + +# Verify that we can set a breakpoint to be self-disabling after +# the first time it triggers. +# +send_gdb "break marker2\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 42.*$gdb_prompt $"\ + {pass "break marker2"} + -re "$gdb_prompt $"\ + {fail "break marker2"} + timeout {fail "(timeout) break marker2"} +} + +send_gdb "enable once $expect_out(1,string)\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "enable once break marker2"} + timeout {fail "(timeout) enable once break marker2"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+dis\[ \t\]+y.*$gdb_prompt $"\ + {pass "info auto-disabled break marker2"} + -re "$gdb_prompt $"\ + {fail "info auto-disabled break marker2"} + timeout {fail "(timeout) info auto-disabled break marker2"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint \[0-9\]*, marker2.*$gdb_prompt $"\ + {pass "continue to auto-disabled break marker2"} + -re "$gdb_prompt $"\ + {fail "continue to auto-disabled break marker2"} + timeout {fail "(timeout) continue to auto-disabled break marker2"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+dis\[ \t\]+n.*$gdb_prompt $"\ + {pass "info auto-disabled break marker2"} + -re "$gdb_prompt $"\ + {fail "info auto-disabled break marker2"} + timeout {fail "(timeout) info auto-disabled break marker2"} +} + +# Verify that we don't stop at a disabled breakpoint. +# +send_gdb "continue\n" +gdb_expect { + -re ".*Program exited normally.*$gdb_prompt $"\ + {pass "no stop"} + -re "$gdb_prompt $"\ + {fail "no stop"} + timeout {fail "(timeout) no stop"} +} + +send_gdb "run\n" +gdb_expect { + -re "Starting program.*$gdb_prompt $"\ + {pass "rerun to main"} + -re "$gdb_prompt $"\ + {fail "rerun to main"} + timeout {fail "(timeout) rerun to main"} +} + +send_gdb "continue\n" +gdb_expect { + -re ".*Program exited normally.*$gdb_prompt $"\ + {pass "no stop at auto-disabled break marker2"} + -re "$gdb_prompt $"\ + {fail "no stop at auto-disabled break marker2"} + timeout {fail "(timeout) no stop at auto-disabled break marker2"} +} + +# Verify that we can set a breakpoint to be self-deleting after +# the first time it triggers. +# +if ![runto_main] then { fail "enable/disable break tests suppressed" } + +send_gdb "break marker3\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 43.*$gdb_prompt $"\ + {pass "break marker3"} + -re "$gdb_prompt $"\ + {fail "break marker3"} + timeout {fail "(timeout) break marker3"} +} + +send_gdb "enable del $expect_out(1,string)\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "enable del break marker3"} + timeout {fail "(timeout) enable del break marker3"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+del\[ \t\]+y.*$gdb_prompt $"\ + {pass "info auto-deleted break marker2"} + -re "$gdb_prompt $"\ + {fail "info auto-deleted break marker2"} + timeout {fail "(timeout) info auto-deleted break marker2"} +} + +send_gdb "continue\n" +gdb_expect { + -re ".*marker3 .*:43.*$gdb_prompt $"\ + {pass "continue to auto-deleted break marker3"} + -re "Breakpoint \[0-9\]*, marker3.*$gdb_prompt $"\ + {fail "continue to auto-deleted break marker3"} + -re "$gdb_prompt $"\ + {fail "continue to auto-deleted break marker3"} + timeout {fail "(timeout) continue to break marker3"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re ".*No breakpoint or watchpoint number.*$gdb_prompt $"\ + {pass "info auto-deleted break marker3"} + -re "\[0-9\]*\[ \t\]+breakpoint\[ \t\].*$gdb_prompt $"\ + {fail "info auto-deleted break marker3"} + -re "$gdb_prompt $"\ + {fail "info auto-deleted break marker3"} + timeout {fail "(timeout) info auto-deleted break marker3"} +} + +# Verify that we can set a breakpoint and manually disable it (we've +# already proven that disabled bp's don't trigger). +# +send_gdb "break marker4\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 44.*$gdb_prompt $"\ + {pass "break marker4"} + -re "$gdb_prompt $"\ + {fail "break marker4"} + timeout {fail "(timeout) break marker4"} +} + +send_gdb "disable $expect_out(1,string)\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "disable break marker4"} + timeout {fail "(timeout) disable break marker4"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+n.*$gdb_prompt $"\ + {pass "info break marker4"} + -re "$gdb_prompt $"\ + {fail "info break marker4"} + timeout {fail "(timeout) info break marker4"} +} + +# Verify that we can set a breakpoint with an ignore count N, which +# should cause the next N triggers of the bp to be ignored. (This is +# a flavor of enablement/disablement, after all.) +# +if ![runto_main] then { fail "enable/disable break tests suppressed" } + +send_gdb "break marker1\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 41.*$gdb_prompt $"\ + {pass "break marker1"} + -re "$gdb_prompt $"\ + {fail "break marker1"} + timeout {fail "(timeout) break marker1"} +} + +# Verify that an ignore of a non-existent breakpoint is gracefully +# handled. +# +send_gdb "ignore 999 2\n" +gdb_expect { + -re "No breakpoint number 999..*$gdb_prompt $"\ + {pass "ignore non-existent break"} + -re "$gdb_prompt $"\ + {fail "ignore non-existent break"} + timeout {fail "(timeout) ignore non-existent break"} +} + +# Verify that a missing ignore count is gracefully handled. +# +send_gdb "ignore $expect_out(1,string) \n" +gdb_expect { + -re "Second argument .specified ignore-count. is missing..*$gdb_prompt $"\ + {pass "ignore break with missing ignore count"} + -re "$gdb_prompt $"\ + {fail "ignore break with missing ignore count"} + timeout {fail "(timeout) ignore break with missing ignore count"} +} + +# Verify that a negative or zero ignore count is handled gracefully +# (they both are treated the same). +# +send_gdb "ignore $expect_out(1,string) -1\n" +gdb_expect { + -re "Will stop next time breakpoint \[0-9\]* is reached..*$gdb_prompt $"\ + {pass "ignore break marker1 -1"} + -re "$gdb_prompt $"\ + {fail "ignore break marker1 -1"} + timeout {fail "(timeout) ignore break marker1 -1"} +} + +send_gdb "ignore $expect_out(1,string) 0\n" +gdb_expect { + -re "Will stop next time breakpoint \[0-9\]* is reached..*$gdb_prompt $"\ + {pass "ignore break marker1 0"} + -re "$gdb_prompt $"\ + {fail "ignore break marker1 0"} + timeout {fail "(timeout) ignore break marker1 0"} +} + +send_gdb "ignore $expect_out(1,string) 1\n" +gdb_expect { + -re "Will ignore next crossing of breakpoint \[0-9\]*.*$gdb_prompt $"\ + {pass "ignore break marker1"} + -re "$gdb_prompt $"\ + {fail "ignore break marker1"} + timeout {fail "(timeout) ignore break marker1"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y.*ignore next 1 hits.*$gdb_prompt $"\ + {pass "info ignored break marker1"} + -re "$gdb_prompt $"\ + {fail "info ignored break marker1"} + timeout {fail "(timeout) info ignored break marker1"} +} + +send_gdb "continue\n" +gdb_expect { + -re ".*Program exited normally.*$gdb_prompt $"\ + {pass "no stop at ignored break marker1"} + -re "$gdb_prompt $"\ + {fail "no stop at ignored break marker1"} + timeout {fail "(timeout) no stop at ignored break marker1"} +} + +send_gdb "run\n" +gdb_expect { + -re "Starting program.*$gdb_prompt $"\ + {pass "rerun to main"} + -re "$gdb_prompt $"\ + {fail "rerun to main"} + timeout {fail "(timeout) rerun to main"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $"\ + {pass "continue to break marker1"} + -re "$gdb_prompt $"\ + {fail "continue to break marker1"} + timeout {fail "(timeout) continue to break marker1"} +} + +# Verify that we can specify both an ignore count and an auto-delete. +# +if ![runto_main] then { fail "enable/disable break tests suppressed" } + +send_gdb "break marker1\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 41.*$gdb_prompt $"\ + {pass "break marker1"} + -re "$gdb_prompt $"\ + {fail "break marker1"} + timeout {fail "(timeout) break marker1"} +} + +send_gdb "ignore $expect_out(1,string) 1\n" +gdb_expect { + -re "Will ignore next crossing of breakpoint \[0-9\]*.*$gdb_prompt $"\ + {pass "ignore break marker1"} + -re "$gdb_prompt $"\ + {fail "ignore break marker1"} + timeout {fail "(timeout) ignore break marker1"} +} + +send_gdb "enable del $expect_out(1,string)\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "enable del break marker1"} + timeout {fail "(timeout) enable del break marker1"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+del\[ \t\]+y.*ignore next 1 hits.*$gdb_prompt $"\ + {pass "info break marker1"} + -re "$gdb_prompt $"\ + {fail "info break marker1"} + timeout {fail "(timeout) info break marker2"} +} + +send_gdb "continue\n" +gdb_expect { + -re ".*Program exited normally.*$gdb_prompt $"\ + {pass "no stop at ignored & auto-deleted break marker1"} + -re "$gdb_prompt $"\ + {fail "no stop at ignored & auto-deleted break marker1"} + timeout {fail "(timeout) no stop at ignored & auto-deleted break marker1"} +} + +send_gdb "run\n" +gdb_expect { + -re "Starting program.*$gdb_prompt $"\ + {pass "rerun to main"} + -re "$gdb_prompt $"\ + {fail "rerun to main"} + timeout {fail "(timeout) rerun to main"} +} + +send_gdb "continue\n" +gdb_expect { + -re ".*marker1 .*:41.*$gdb_prompt $"\ + {pass "continue to ignored & auto-deleted break marker1"} + -re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $"\ + {fail "continue to ignored & auto-deleted break marker1"} + -re "$gdb_prompt $"\ + {fail "continue to ignored & auto-deleted break marker1"} + timeout {fail "(timeout) continue to ignored & auto-deleted break marker1"} +} + +# Verify that a disabled breakpoint's ignore count isn't updated when +# the bp is encountered. +# +if ![runto_main] then { fail "enable/disable break tests suppressed" } + +send_gdb "break marker1\n" +gdb_expect { + -re "Breakpoint (\[0-9\]*) at .*, line 41.*$gdb_prompt $"\ + {pass "break marker1"} + -re "$gdb_prompt $"\ + {fail "break marker1"} + timeout {fail "(timeout) break marker1"} +} + +send_gdb "ignore $expect_out(1,string) 10\n" +gdb_expect { + -re "Will ignore next 10 crossings of breakpoint \[0-9\]*.*$gdb_prompt $"\ + {pass "ignore break marker1"} + -re "$gdb_prompt $"\ + {fail "ignore break marker1"} + timeout {fail "(timeout) ignore break marker1"} +} + +send_gdb "disable $expect_out(1,string)\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "disable break marker1"} + timeout {fail "(timeout) disable break marker1"} +} + +send_gdb "continue\n" +gdb_expect { + -re ".*Program exited normally.*$gdb_prompt $"\ + {pass "no stop at ignored & disabled break marker1"} + -re "$gdb_prompt $"\ + {fail "no stop at ignored & disabled break marker1"} + timeout {fail "(timeout) no stop at ignored & disabled break marker1"} +} + +send_gdb "run\n" +gdb_expect { + -re "Starting program.*$gdb_prompt $"\ + {pass "rerun to main"} + -re "$gdb_prompt $"\ + {fail "rerun to main"} + timeout {fail "(timeout) rerun to main"} +} + +send_gdb "info break $expect_out(1,string)\n" +gdb_expect { + -re "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+n.*ignore next 10 hits.*$gdb_prompt $"\ + {pass "info ignored & disabled break marker1"} + -re "$gdb_prompt $"\ + {fail "info ignored & disabled break marker1"} + timeout {fail "(timeout) info ignored & disabled break marker1"} +} + +# Verify that GDB correctly handles the "continue" command with an argument, +# which is an ignore count to set on the currently stopped-at breakpoint. +# (Also verify that GDB gracefully handles the case where the inferior +# isn't stopped at a breakpoint.) +# +if ![runto_main] then { fail "enable/disable break tests suppressed" } + +send_gdb "break 64\n" +gdb_expect { + -re "Breakpoint \[0-9\]*.*, line 64.*$gdb_prompt $"\ + {pass "prepare to continue with ignore count"} + -re "$gdb_prompt $"\ + {fail "prepare to continue with ignore count"} + timeout {fail "(timeout) prepare to continue with ignore count"} +} +send_gdb "continue 2\n" +gdb_expect { + -re "Will ignore next crossing of breakpoint \[0-9\]*. Continuing..*$gdb_prompt $"\ + {pass "continue with ignore count"} + -re "$gdb_prompt $"\ + {fail "continue with ignore count"} + timeout {fail "(timeout) continue with ignore count"} +} + +send_gdb "next\n" +gdb_expect { + -re ".*66\[ \t\]*marker1.*$gdb_prompt $"\ + {pass "step after continue with ignore count"} + -re "$gdb_prompt $"\ + {fail "step after continue with ignore count"} + timeout {fail "(timeout) step after continue with ignore count"} +} + +# ??rehrauer: Huh. This appears to be an actual bug. (No big +# surprise, since this feature hasn't been tested...) Looks like +# GDB is currently trying to set the ignore count of bp # -1! +# +setup_xfail hppa_*_* +send_gdb "continue 2\n" +gdb_expect { + -re "Not stopped at any breakpoint; argument ignored..*$gdb_prompt $"\ + {pass "continue with ignore count, not stopped at bpt"} + -re "No breakpoint number -1.*$gdb_prompt $"\ + {xfail "(DTS'd) continue with ignore count, not stopped at bpt"} + -re "$gdb_prompt $"\ + {fail "continue with ignore count, not stopped at bpt"} + timeout {fail "(timeout) step after continue with ignore count, not stopped at bpt"} +} + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/ending-run.c b/gdb/testsuite/gdb.base/ending-run.c new file mode 100644 index 00000000000..56335cf1cd7 --- /dev/null +++ b/gdb/testsuite/gdb.base/ending-run.c @@ -0,0 +1,27 @@ +/* Test program for and + * bugs. + */ +#include + +int callee( x ) +int x; +{ + int y = x * x; + return (y - 2); +} + +main() +{ + + int *p; + int i; + + p = (int *) malloc( 4 ); + + for (i = 1; i < 10; i++) + { + printf( "%d ", callee( i )); + + } + printf( " Goodbye!\n" ); +} diff --git a/gdb/testsuite/gdb.base/ending-run.exp b/gdb/testsuite/gdb.base/ending-run.exp new file mode 100644 index 00000000000..61b42c75712 --- /dev/null +++ b/gdb/testsuite/gdb.base/ending-run.exp @@ -0,0 +1,176 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# use this to debug: +# +#log_user 1 + +# ending-run.exp -- Expect script to test ending a test run in gdb + +if $tracelevel then { + strace $tracelevel +} + +set testfile ending-run +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +remote_exec build "rm -f ${binfile}" +remote_exec build "rm -f core" + + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# CHFts23469: Test that you can "clear" a bp set at +# a line _before_ the routine (which will default to the +# first line in the routine, which turns out to correspond +# to the prolog--that's another bug...) +# +gdb_test "b 1" ".*Breakpoint.*line 1.*" "bpt at line before routine" +gdb_test "b 8" ".*Note.*also.*Breakpoint.*2.*" "" + +# Set up to go to the next-to-last line of the program +# +gdb_test "b 26" ".*Breakpoint.*3.*" "" + +# Expect to hit the bp at line "1", but symbolize this +# as line "8". Then try to clear it--this should work. +# +gdb_test "r" ".*Breakpoint.*1.*callee.*8.*" "" +gdb_test "cle" ".*Deleted breakpoints 2 1.*" "clear worked" +send_gdb "i b\n" +gdb_expect { + -re ".*breakpoint.*breakpoint.*$gdb_prompt $" { fail "clear bp" } + -re ".*3.*main.*26.*$gdb_prompt $" { pass "cleared bp at line before routine" } + -re ".*$gdb_prompt $" { fail "info b" } +} + +# Test some other "clear" combinations +# +gdb_test "b 1" ".*Breakpoint.*4.*" "" +gdb_test "b 8" ".*Note.*also.*Breakpoint.*5.*" "" +gdb_test "cle 8" ".*Deleted breakpoint 5.*" "Only cleared 1 by line" + +send_gdb "inf line 8\n" +gdb_expect { + -re ".*address (0x\[0-9a-fA-F]*).*$gdb_prompt $" { + set line_eight $expect_out(1,string) + gdb_test "b 8" ".*Breakpoint.*6.*" "" + gdb_test "cle *$line_eight" ".*Deleted breakpoints 6 4.*" "Clear 2 by address" + } + -re ".*$gdb_prompt $" { + fail "need to fix test for new compile outcome" + } +} + +send_gdb "inf line 9\n" +gdb_expect { + -re ".*address (0x\[0-9a-fA-F]*).*$gdb_prompt $" { + set line_nine $expect_out(1,string) + gdb_test "b 9" ".*Breakpoint.*7.*" "" + gdb_test "b *$line_nine" ".*Note.*also.*Breakpoint.*8.*" "" + gdb_test "c" ".*Breakpoint.*7.*callee.*9.*" "" + gdb_test "cle" ".*Deleted breakpoints 8 7.*" "Clear 2 by default" + } + -re ".*$gdb_prompt $" { + fail "need to fix test for new compile outcome" + } +} + +send_gdb "i b\n" +gdb_expect { + -re ".*breakpoint.*breakpoint.*$gdb_prompt $" { + fail "didn't clear bps" + } + -re ".*3.*main.*26.*$gdb_prompt $" { + pass "all set to continue" + } + -re ".*$gdb_prompt $" { + fail "missing bp at end" + } +} + + +# See if we can step out with control. The "1 2 3" stuff +# is output from the program. +# +gdb_test "cont" ".*Breakpoint.*26.*" "" +gdb_test "next" ".*1 2 7 14 23 34 47 62 79 Goodbye!.*27.*" "Step to return" + +set old_timeout $timeout +set timeout 50 +send_gdb "next\n" +gdb_expect { + -re "27.*$gdb_prompt $" { + # sometimes we stop at the closing brace, if so, do another next + send_gdb "next\n" + gdb_expect { + -re ".*Unable to find return pc for this frame.*$gdb_prompt $" { + fail "Old bug came back!" + gdb_test "n" ".*" "" + } + -re ".*in.*start.*$gdb_prompt $" { + pass "step out of main" + } + timeout { fail "hang or timeout on step at end 2" } + } + } + -re ".*Unable to find return pc for this frame.*$gdb_prompt $" { + fail "Old bug came back!" + gdb_test "n" ".*" "" + } + -re ".*in.*start.*$gdb_prompt $" { + pass "step out of main" + } + timeout { fail "hang or timeout on step at end 1" } +} + +gdb_test "n" ".*Single.*Program exited.*" "step to end of run" +set timeout $old_timeout + +gdb_test "n" ".*The program is not being run.*" "don't step after run" + +set exec_output [remote_exec host "ls core"] + +if [ regexp "core not found" $exec_output] { + pass "No core dumped on quit" +} else { + if [ regexp "No such file or directory" $exec_output] { + pass "ls: core: No core dumped on quit" + } else { + remote_exec build "rm -f core" + fail "Core dumped on quit" + } +} + +#remote_exec build "rm -f ${binfile}" +return 0 + + + + diff --git a/gdb/testsuite/gdb.base/environ.exp b/gdb/testsuite/gdb.base/environ.exp new file mode 100644 index 00000000000..0033917fb06 --- /dev/null +++ b/gdb/testsuite/gdb.base/environ.exp @@ -0,0 +1,329 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel + } + +global usestubs + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +# This test exists solely to exercise the "environment" commands for +# code-coverage on HP-UX. +# +if ![istarget "hppa*-*-hpux*"] then { + return +} + +set testfile "break" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { fail "environment command tests suppressed" } + +# (No, this is not really related to the environment commands. But it's +# a convenient place to verify that this command works.) +# +send_gdb "info program\n" +gdb_expect { + -re ".*Using the running image of child process \[0-9\]*.\r\nProgram stopped at 0x\[0-9a-fA-F\]*.\r\nIt stopped at breakpoint 1..*$gdb_prompt $"\ + {pass "info program"} + -re "$gdb_prompt $"\ + {fail "info program"} + timeout {fail "(timeout) info program"} +} + +# We don't really care where this step lands, so long as it gets +# the inferior pushed off the breakpoint it's currently on... +# +send_gdb "next\n" +gdb_expect { + -re ".*$gdb_prompt $"\ + {pass "step before info program"} + timeout {fail "(timeout) step before info program"} +} +send_gdb "info program\n" +gdb_expect { + -re ".*Using the running image of child process \[0-9\]*.\r\nProgram stopped at 0x\[0-9a-fA-F\]*.\r\nIt stopped after being stepped..*$gdb_prompt $"\ + {pass "info program after step"} + -re "$gdb_prompt $"\ + {fail "info program after step"} + timeout {fail "(timeout) info program after step"} +} + +if ![runto_main] then { fail "environment command tests suppressed" } + +send_gdb "delete\n" +gdb_expect { + -re ".*y or n. $"\ + {send_gdb "y\n" + gdb_expect { + -re ".*$gdb_prompt $"\ + {pass "delete breakpoint before info program"} + timeout {fail "(timeout) delete breakpoint before info program"} + } + } + -re "$gdb_prompt $"\ + {fail "delete breakpoint before info program"} + timeout {fail "(timeout) delete breakpoint before info program"} +} +send_gdb "info program\n" +gdb_expect { + -re ".*Using the running image of child process \[0-9\]*.\r\nProgram stopped at 0x\[0-9a-fA-F\]*.\r\nIt stopped at a breakpoint that has since been deleted..*$gdb_prompt $"\ + {pass "info program after deleted breakpoint"} + -re "$gdb_prompt $"\ + {fail "info program after deleted breakpoint"} + timeout {fail "(timeout) info program after deleted breakpoint"} +} + +# Verify that we can show all currently-set environment variables. +# (It's a bit hacky, but nonetheless probably safe to check for at +# least the SHELL variable.) +# +# need to increase timeout because of very long output +set oldtimeout $timeout +set timeout [expr "$timeout + 300"] + +send_gdb "show environment\n" +gdb_expect { + -re ".*SHELL=(\[a-zA-Z0-9\]*).*$gdb_prompt $"\ + {pass "show environment"} + -re "$gdb_prompt $"\ + {fail "show environment"} + timeout {fail "(timeout) show environment"} +} +set timeout $oldtimeout + +# Verify that we can unset a specific environment variable. +# +send_gdb "unset environment EDITOR\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "issue unset environment"} + timeout {fail "(timeout) issue unset environment"} +} +send_gdb "show environment EDITOR\n" +gdb_expect { + -re "Environment variable \"EDITOR\" not defined.\r\n$gdb_prompt $"\ + {pass "unset environment"} + -re "$gdb_prompt $"\ + {fail "unset environment"} + timeout {fail "(timeout) unset environment"} +} + +# Verify that we can unset all environment variables. +# +send_gdb "unset environment\n" +gdb_expect { + -re "Delete all environment variables.*y or n. $"\ + {send_gdb "y\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "unset entire environment"} + timeout {fail "(timeout) unset entire environment"} + } + } + -re "$gdb_prompt $"\ + {fail "unset entire environment"} + timeout {fail "(timeout) unset entire environment"} +} + +# Verify that we can set a specific environment variable. +# +send_gdb "set environment EDITOR emacs\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "issue set environment"} + timeout {fail "(timeout) issue set environment"} +} +send_gdb "show environment EDITOR\n" +gdb_expect { + -re "EDITOR = emacs\r\n$gdb_prompt $"\ + {pass "set environment"} + -re "$gdb_prompt $"\ + {fail "set environment"} + timeout {fail "(timeout) set environment"} +} + +# Verify that GDB responds gracefully to a request to set environment, +# with no variable name. +# +send_gdb "set environment\n" +gdb_expect { + -re "Argument required .environment variable and value..*$gdb_prompt $"\ + {pass "set environment without variable disallowed"} + -re "$gdb_prompt $"\ + {fail "set environment without variable disallowed"} + timeout {fail "(timeout) set environment without variable disallowed"} +} + +# I'm not sure just what GDB has in mind in explicitly checking +# for this variant, but since GDB handles it, test it. +# +send_gdb "set environment =\n" +gdb_expect { + -re "Argument required .environment variable to set..*$gdb_prompt $"\ + {pass "set environment equals without variable disallowed"} + -re "$gdb_prompt $"\ + {fail "set environment equals without variable disallowed"} + timeout {fail "(timeout) set environment equals without variable disallowed"} +} + +# Setting an environment variable without a value sets it to a NULL +# value. +# +send_gdb "set environment EDITOR\n" +gdb_expect { + -re "Setting environment variable \"EDITOR\" to null value..*$gdb_prompt $"\ + {pass "issue set environment without variable value"} + -re "$gdb_prompt $"\ + {fail "issue set environment without variable value"} + timeout {fail "(timeout) issue set environment without variable value"} +} +send_gdb "show environment EDITOR\n" +gdb_expect { + -re "EDITOR = \r\n$gdb_prompt $"\ + {pass "set environment without variable value"} + -re "$gdb_prompt $"\ + {fail "set environment without variable value"} + timeout {fail "(timeout) set environment without variable value"} +} + +# Verify that GDB responds gracefully to an attempt to show a +# non-existent environment variable. (We hope this variable is +# undefined!) +# +send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" +gdb_expect { + -re "Environment variable \"FOOBARBAZGRUNGESPAZBALL\" not defined..*$gdb_prompt $"\ + {pass "show non-existent environment variable disallowed"} + -re "$gdb_prompt $"\ + {fail "show non-existent environment variable disallowed"} + timeout {fail "(timeout) show non-existent environment variable disallowed"} +} + +# Verify that GDB can set an environment variable hitherto undefined. +# +send_gdb "set environment FOOBARBAZGRUNGESPAZBALL t\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "issue set environment for previously undefined variable"} + timeout {fail "(timeout) issue set environment for previously undefined variable"} +} +send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" +gdb_expect { + -re "FOOBARBAZGRUNGESPAZBALL = t\r\n$gdb_prompt $"\ + {pass "set environment for previously undefined variable"} + -re "$gdb_prompt $"\ + {fail "set environment for previously undefined variable"} + timeout {fail "(timeout) set environment for previously undefined variable"} +} + +# Verify that GDB can also set an environment variable using the "=" +# syntax. +# +send_gdb "set environment FOOBARBAZGRUNGESPAZBALL = t\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "issue set environment with equals"} + timeout {fail "(timeout) issue set environment with equals"} +} +send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" +gdb_expect { + -re "FOOBARBAZGRUNGESPAZBALL = t\r\n$gdb_prompt $"\ + {pass "set environment with equals"} + -re "$gdb_prompt $"\ + {fail "set environment with equals"} + timeout {fail "(timeout) set environment with equals"} +} + +# Verify that GDB can set an environment variable to a value that has +# an embedded (trailing, in this case) equals. +# +send_gdb "set environment FOOBARBAZGRUNGESPAZBALL t=\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "issue set environment with trailing equals"} + timeout {fail "(timeout) issue set environment with trailing equals"} +} +send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" +gdb_expect { + -re "FOOBARBAZGRUNGESPAZBALL = t=\r\n$gdb_prompt $"\ + {pass "set environment with trailing equals"} + -re "$gdb_prompt $"\ + {fail "set environment with trailing equals"} + timeout {fail "(timeout) set environment with trailing equals"} +} + +# Verify that GDB can set an environment variable to a value preceded +# by whitespace, and that such whitespace is ignored (not included +# in the set value). +# +send_gdb "set environment FOOBARBAZGRUNGESPAZBALL = foo\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "issue set environment with preceding whitespace"} + timeout {fail "(timeout) issue set environment with preceding whitespace"} +} +send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" +gdb_expect { + -re "FOOBARBAZGRUNGESPAZBALL = foo\r\n$gdb_prompt $"\ + {pass "set environment with preceding whitespace"} + -re "$gdb_prompt $"\ + {fail "set environment with preceding whitespace"} + timeout {fail "(timeout) set environment with preceding whitespace"} +} + +# Verify that GDB can manipulate the distinguished PATH variable. +# +send_gdb "path /tmp/FOOBARBAZGRUNGESPAZBALL\n" +gdb_expect { + -re ".*Executable and object file path: /tmp/FOOBARBAZGRUNGESPAZBALL.*$gdb_prompt $"\ + {pass "issue path"} + -re "$gdb_prompt $"\ + {fail "issue path"} + timeout {fail "(timeout) issue path"} +} +send_gdb "show paths\n" +gdb_expect { + -re "Executable and object file path: /tmp/FOOBARBAZGRUNGESPAZBALL.*$gdb_prompt $"\ + {pass "show paths"} + -re "$gdb_prompt $"\ + {fail "show paths"} + timeout {fail "(timeout) show paths"} +} + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/eval-skip.exp b/gdb/testsuite/gdb.base/eval-skip.exp new file mode 100644 index 00000000000..4e17e611975 --- /dev/null +++ b/gdb/testsuite/gdb.base/eval-skip.exp @@ -0,0 +1,352 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite + +# +# tests to cover evaluate_subexp_standard with the EVAL_SKIP flag set. +# this happens for instance when there is short circuit evaluation in the && and || +# operators, or in the non returned part of a (x ? y: z) expression. +# the part that is not evaluated is parsed and evaluated anyway, but with +# the EVAL_SKIP flag set +# +# source file "int-type.c" +# + + +if $tracelevel then { + strace $tracelevel +} + +# Check to see if we have an executable to test. If not, then either we +# haven't tried to compile one, or the compilation failed for some reason. +# In either case, just notify the user and skip the tests in this file. + +set testfile "int-type" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +gdb_test "set variable x=14" "" "set variable x=14" +gdb_test "set variable y=2" "" "set variable y=2" +gdb_test "set variable z=2" "" "set variable z=2" +gdb_test "set variable w=3" "" "set variable w=3" + + +send_gdb "print (0 && (x+y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x+y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x+y))" } + timeout { fail "(timeout) print value of (0 && (x+y))" } + } + + +send_gdb "print (0 && (x-y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x-y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x-y))" } + timeout { fail "(timeout) print value of (0 && (x-y))" } + } + + +send_gdb "print (0 && (x*y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x*y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x*y))" } + timeout { fail "(timeout) print value of (0 && (x*y))" } + } + + + +send_gdb "print (0 && (x/y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x/y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x/y))" } + timeout { fail "(timeout) print value of (0 && (x/y))" } + } + + +send_gdb "print (0 && (x%y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x%y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x%y))" } + timeout { fail "(timeout) print value of (0 && (x%y))" } + } + + +send_gdb "print (0 && (x&&y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x&&y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x&&y))" } + timeout { fail "(timeout) print value of (0 && (x&&y))" } + } + + + +send_gdb "print (0 && (x||y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x||y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x||y))" } + timeout { fail "(timeout) print value of (0 && (x||y))" } + } + + + +send_gdb "print (0 && (x&y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x&y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x&y))" } + timeout { fail "(timeout) print value of (0 && (x&y))" } + } + + +send_gdb "print (0 && (x|y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x|y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x|y))" } + timeout { fail "(timeout) print value of (0 && (x|y))" } + } + + +send_gdb "print (0 && (x^y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x^y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x^y))" } + timeout { fail "(timeout) print value of (0 && (x^y))" } + } + + + +send_gdb "print (0 && (x < y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x < y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x < y))" } + timeout { fail "(timeout) print value of (0 && (x < y))" } + } + + +send_gdb "print (0 && (x <= y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x <= y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x <= y))" } + timeout { fail "(timeout) print value of (0 && (x <= y))" } + } + + + +send_gdb "print (0 && (x>y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x>y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x>y))" } + timeout { fail "(timeout) print value of (0 && (x>y))" } + } + + +send_gdb "print (0 && (x>=y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x>=y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x>=y))" } + timeout { fail "(timeout) print value of (0 && (x>=y))" } + } + + + +send_gdb "print (0 && (x==y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x==y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x==y))" } + timeout { fail "(timeout) print value of (0 && (x==y))" } + } + + +send_gdb "print (0 && (x!=y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x!=y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x!=y))" } + timeout { fail "(timeout) print value of (0 && (x!=y))" } + } + + +send_gdb "print (0 && (x<<31))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x<<31))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x<<31))" } + timeout { fail "(timeout) print value of (0 && (x<<31))" } + } + + +send_gdb "print (0 && (x>>31))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x>>31))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x>>31))" } + timeout { fail "(timeout) print value of (0 && (x>>31))" } + } + + + +send_gdb "print (0 && (!x))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (!x))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (!x))" } + timeout { fail "(timeout) print value of (0 && (!x))" } + } + + +send_gdb "print (0 && (~x))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (~x))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (~x))" } + timeout { fail "(timeout) print value of (0 && (~x))" } + } + +send_gdb "print (0 && (-x))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (-x))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (-x))" } + timeout { fail "(timeout) print value of (0 && (-x))" } + } + + +send_gdb "print (0 && (x++))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x++))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x++))" } + timeout { fail "(timeout) print value of (0 && (x++))" } + } + + +send_gdb "print (0 && (++x))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (++x))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (++x))" } + timeout { fail "(timeout) print value of (0 && (++x))" } + } + + +send_gdb "print (0 && (x--))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x--))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x--))" } + timeout { fail "(timeout) print value of (0 && (x--))" } + } + + +send_gdb "print (0 && (--x))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (--x))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (--x))" } + timeout { fail "(timeout) print value of (0 && (--x))" } + } + +send_gdb "print (0 && (x+=7))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x+=7))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x+=7))" } + timeout { fail "(timeout) print value of (0 && (x+=7))" } + } + +send_gdb "print (0 && (x=y))\n" +gdb_expect { + -re ".$decimal = 0\r\n$gdb_prompt $" { + pass "print value of (0 && (x=y))" + } + -re ".*$gdb_prompt $" { fail "print value of (0 && (x=y))" } + timeout { fail "(timeout) print value of (0 && (x=y))" } + } + +gdb_exit +return 0 + + + + + + + diff --git a/gdb/testsuite/gdb.base/exprs.c b/gdb/testsuite/gdb.base/exprs.c new file mode 100644 index 00000000000..e5c73512815 --- /dev/null +++ b/gdb/testsuite/gdb.base/exprs.c @@ -0,0 +1,253 @@ +main (argc, argv, envp) + int argc; + char **argv; + char **envp; +{ + extern void dummy(); +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + dummy(); +} + +/* We put main() right up front so its line number doesn't keep changing. */ + +/* + * Test file with lots of different types, for testing the + * "whatis" command. + */ + +/* + * First the basic C types. + */ + +#if !defined (__STDC__) && !defined (_AIX) +#define signed /**/ +#endif + +char v_char; +signed char v_signed_char; +unsigned char v_unsigned_char; + +short v_short; +signed short v_signed_short; +unsigned short v_unsigned_short; + +int v_int; +signed int v_signed_int; +unsigned int v_unsigned_int; + +long v_long; +signed long v_signed_long; +unsigned long v_unsigned_long; + +float v_float; +double v_double; + +/* + * Now some derived types, which are arrays, functions-returning, + * pointers, structures, unions, and enumerations. + */ + +/**** arrays *******/ + +char v_char_array[2]; +signed char v_signed_char_array[2]; +unsigned char v_unsigned_char_array[2]; + +short v_short_array[2]; +signed short v_signed_short_array[2]; +unsigned short v_unsigned_short_array[2]; + +int v_int_array[2]; +signed int v_signed_int_array[2]; +unsigned int v_unsigned_int_array[2]; + +long v_long_array[2]; +signed long v_signed_long_array[2]; +unsigned long v_unsigned_long_array[2]; + +float v_float_array[2]; +double v_double_array[2]; + +/**** pointers *******/ + +char *v_char_pointer; +signed char *v_signed_char_pointer; +unsigned char *v_unsigned_char_pointer; + +short *v_short_pointer; +signed short *v_signed_short_pointer; +unsigned short *v_unsigned_short_pointer; + +int *v_int_pointer; +signed int *v_signed_int_pointer; +unsigned int *v_unsigned_int_pointer; + +long *v_long_pointer; +signed long *v_signed_long_pointer; +unsigned long *v_unsigned_long_pointer; + +float *v_float_pointer; +double *v_double_pointer; + +/**** structs *******/ + +struct t_struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_struct1; + +struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_struct2; + +/**** unions *******/ + +union t_union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_union; + +union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_union2; + +/*** Functions returning type ********/ + +char v_char_func () { return(0); } +signed char v_signed_char_func () { return (0); } +unsigned char v_unsigned_char_func () { return (0); } + +short v_short_func () { return (0); } +signed short v_signed_short_func () { return (0); } +unsigned short v_unsigned_short_func () { return (0); } + +int v_int_func () { return (0); } +signed int v_signed_int_func () { return (0); } +unsigned int v_unsigned_int_func () { return (0); } + +long v_long_func () { return (0); } +signed long v_signed_long_func () { return (0); } +unsigned long v_unsigned_long_func () { return (0); } + +float v_float_func () { return (0.0); } +double v_double_func () { return (0.0); } + +/**** Some misc more complicated things *******/ + +struct link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *this, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} *s_link; + +union tu_link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *this, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} u_link; + +/**** Enumerations *******/ + +enum colors {red, green, blue} color; +enum cars {chevy, ford, porsche} clunker; + + +void dummy() +{ + /* Some linkers (e.g. on AIX) remove unreferenced variables, + so make sure to reference them. */ + v_char = 0; + v_signed_char = 1; + v_unsigned_char = 2; + + v_short = 3; + v_signed_short = 4; + v_unsigned_short = 5; + + v_int = 6; + v_signed_int = 7; + v_unsigned_int = 8; + + v_long = 9; + v_signed_long = 10; + v_unsigned_long = 11; + + v_float = 100.0; + v_double = 200.0; + + + v_char_array[0] = v_char; + v_signed_char_array[0] = v_signed_char; + v_unsigned_char_array[0] = v_unsigned_char; + + v_short_array[0] = v_short; + v_signed_short_array[0] = v_signed_short; + v_unsigned_short_array[0] = v_unsigned_short; + + v_int_array[0] = v_int; + v_signed_int_array[0] = v_signed_int; + v_unsigned_int_array[0] = v_unsigned_int; + + v_long_array[0] = v_long; + v_signed_long_array[0] = v_signed_long; + v_unsigned_long_array[0] = v_unsigned_long; + + v_float_array[0] = v_float; + v_double_array[0] = v_double; + + v_char_pointer = &v_char; + v_signed_char_pointer = &v_signed_char; + v_unsigned_char_pointer = &v_unsigned_char; + + v_short_pointer = &v_short; + v_signed_short_pointer = &v_signed_short; + v_unsigned_short_pointer = &v_unsigned_short; + + v_int_pointer = &v_int; + v_signed_int_pointer = &v_signed_int; + v_unsigned_int_pointer = &v_unsigned_int; + + v_long_pointer = &v_long; + v_signed_long_pointer = &v_signed_long; + v_unsigned_long_pointer = &v_unsigned_long; + + v_float_pointer = &v_float; + v_double_pointer = &v_double; + + color = red; + clunker = porsche; + + u_link.next = s_link; + + v_struct2.v_int_member = v_struct1.v_int_member; + v_union2.v_short_member = v_union.v_short_member; +} diff --git a/gdb/testsuite/gdb.base/exprs.exp b/gdb/testsuite/gdb.base/exprs.exp new file mode 100644 index 00000000000..cdf33dc9435 --- /dev/null +++ b/gdb/testsuite/gdb.base/exprs.exp @@ -0,0 +1,222 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1994, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +if $tracelevel { + strace $tracelevel +} + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "exprs" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile}] { + return -1; +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +proc test_expr { args } { + if { [llength $args] % 2 } { + warning "an even # of arguments should be passed to test_expr" + } + set last_ent [expr [llength $args] - 1]; + set testname [lindex $args $last_ent]; + if [gdb_test [lindex $args 0] "" "$testname (setup)"] { + gdb_suppress_tests; + } + for {set x 1} {$x < $last_ent} {set x [expr $x + 2]} { + if [gdb_test [lindex $args $x] [lindex $args [expr $x + 1]] "$testname ([lindex $args $x])"] { + gdb_suppress_tests; + } + } + gdb_stop_suppressing_tests; +} +# +# test expressions with "char" types +# +test_expr "set variable v_char=127" "print v_char == 0" "\\$\[0-9\]* = 0" "print v_char == 127" "\\$\[0-9\]* = 1" "print char ==" +test_expr "set variable v_char=127" "print v_char != 0" "\\$\[0-9\]* = 1" "print v_char != 127" "\\$\[0-9\]* = 0" "print char !=" +test_expr "set variable v_char=127" "print v_char < 0" "\\$\[0-9\]* = 0" "print v_char < 127" "\\$\[0-9\]* = 0" "print char <" +test_expr "set variable v_char=127" "print v_char > 0" "\\$\[0-9\]* = 1" "print v_char > 127" "\\$\[0-9\]* = 0" "print char >" +# +# test expressions with "signed char" types +# +test_expr "set variable v_signed_char=127" "print v_signed_char == 0" "\\$\[0-9\]* = 0" "print v_signed_char == 127" "\\$\[0-9\]* = 1" "print signed char ==" +test_expr "set variable v_signed_char=127" "print v_signed_char != 0" "\\$\[0-9\]* = 1" "print v_signed_char != 127" "\\$\[0-9\]* = 0" "print signed char !=" +test_expr "set variable v_signed_char=127" "print v_signed_char < 0" "\\$\[0-9\]* = 0" "print v_signed_char < 127" "\\$\[0-9\]* = 0" "print signed char <" +test_expr "set variable v_signed_char=127" "print v_signed_char > 0" "\\$\[0-9\]* = 1" "print v_signed_char > 127" "\\$\[0-9\]* = 0" "print signed char >" +# make char a minus +test_expr "set variable v_signed_char=-1" "print v_signed_char == 0" "\\$\[0-9\]* = 0" "print v_signed_char == -1" "\\$\[0-9\]* = 1" "print signed char == (minus)" +test_expr "set variable v_signed_char=-1" "print v_signed_char != 0" "\\$\[0-9\]* = 1" "print v_signed_char != -1" "\\$\[0-9\]* = 0" "print signed char != (minus)" +test_expr "set variable v_signed_char=-1" "print v_signed_char < 0" "\\$\[0-9\]* = 1" "print v_signed_char < 127" "\\$\[0-9\]* = 1" "print signed char < (minus)" +test_expr "set variable v_signed_char=-1" "print v_signed_char > 0" "\\$\[0-9\]* = 0" "print v_signed_char > 127" "\\$\[0-9\]* = 0" "print signed char > (minus)" +# +# test expressions with "unsigned char" types +# +test_expr "set variable v_unsigned_char=127" "print v_unsigned_char == 0" "\\$\[0-9\]* = 0" "print v_unsigned_char == 127" "\\$\[0-9\]* = 1" "print unsigned char ==" +test_expr "set variable v_unsigned_char=127" "print v_unsigned_char != 0" "\\$\[0-9\]* = 1" "print v_unsigned_char != 127" "\\$\[0-9\]* = 0" "print unsigned char !=" +test_expr "set variable v_unsigned_char=127" "print v_unsigned_char < 0" "\\$\[0-9\]* = 0" "print v_unsigned_char < 127" "\\$\[0-9\]* = 0" "print unsigned char <" +test_expr "set variable v_unsigned_char=127" "print v_unsigned_char > 0" "\\$\[0-9\]* = 1" "print v_unsigned_char > 127" "\\$\[0-9\]* = 0" "print unsigned char >" +# make char a minus +# FIXME: gdb mishandles the cast (unsigned char) on the i960, so I've +# set up an expected failure for this case. +setup_xfail "i960-*-*" 1821 +test_expr "set variable v_unsigned_char=~0" "print v_unsigned_char == 0" "\\$\[0-9\]* = 0" "print v_unsigned_char == ~0" "\\$\[0-9\]* = 0" "print v_unsigned_char == (unsigned char)~0" "\\$\[0-9\]* = 1" "print unsigned char == (~0)" +# FIXME: gdb mishandles the cast (unsigned char) on the i960, so I've +# set up an expected failure for this case. +setup_xfail "i960-*-*" 1821 +test_expr "set variable v_unsigned_char=~0" "print v_unsigned_char != 0" "\\$\[0-9\]* = 1" "print v_unsigned_char != (unsigned char)~0" "\\$\[0-9\]* = 0" "print unsigned char != (~0)" +test_expr "set variable v_unsigned_char=~0" "print v_unsigned_char < 0" "\\$\[0-9\]* = 0" "print v_unsigned_char < 127" "\\$\[0-9\]* = 0" "print unsigned char < (~0)" +test_expr "set variable v_unsigned_char=~0" "print v_unsigned_char > 0" "\\$\[0-9\]* = 1" "print v_unsigned_char > 127" "\\$\[0-9\]* = 1" "print unsigned char > (~0)" +# +# test expressions with "short" types +# +test_expr "set variable v_short=0x7FFF" "print v_short == 0" "\\$\[0-9\]* = 0" "print v_short == 0x7FFF" "\\$\[0-9\]* = 1" "print signed short ==" +test_expr "set variable v_short=0x7FFF" "print v_short != 0" "\\$\[0-9\]* = 1" "print v_short != 0x7FFF" "\\$\[0-9\]* = 0" "print signed short !=" +test_expr "set variable v_short=0x7FFF" "print v_short < 0" "\\$\[0-9\]* = 0" "print v_short < 0x7FFF" "\\$\[0-9\]* = 0" "print signed short <" +test_expr "set variable v_short=0x7FFF" "print v_short > 0" "\\$\[0-9\]* = 1" "print v_short > 0x7FFF" "\\$\[0-9\]* = 0" "print signed short >" +# make short a minus +test_expr "set variable v_short=-1" "print v_short == 0" "\\$\[0-9\]* = 0" "print v_short == -1" "\\$\[0-9\]* = 1" "print signed short == (minus)" +test_expr "set variable v_short=-1" "print v_short != 0" "\\$\[0-9\]* = 1" "print v_short != -1" "\\$\[0-9\]* = 0" "print signed short != (minus)" +test_expr "set variable v_short=-1" "print v_short < 0" "\\$\[0-9\]* = 1" "print v_short < 0x7FFF" "\\$\[0-9\]* = 1" "print signed short < (minus)" +test_expr "set variable v_short=-1" "print v_short > 0" "\\$\[0-9\]* = 0" "print v_short > 0x7FFF" "\\$\[0-9\]* = 0" "print signed short > (minus)" +# +# test expressions with "signed short" types +# +test_expr "set variable v_signed_short=0x7FFF" "print v_signed_short == 0" "\\$\[0-9\]* = 0" "print v_signed_short == 0x7FFF" "\\$\[0-9\]* = 1" "print signed signed short ==" +test_expr "set variable v_signed_short=0x7FFF" "print v_signed_short != 0" "\\$\[0-9\]* = 1" "print v_signed_short != 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed short !=" +test_expr "set variable v_signed_short=0x7FFF" "print v_signed_short < 0" "\\$\[0-9\]* = 0" "print v_signed_short < 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed short <" +test_expr "set variable v_signed_short=0x7FFF" "print v_signed_short > 0" "\\$\[0-9\]* = 1" "print v_signed_short > 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed short >" +# make short a minus +test_expr "set variable v_signed_short=-1" "print v_signed_short == 0" "\\$\[0-9\]* = 0" "print v_signed_short == -1" "\\$\[0-9\]* = 1" "print signed signed short == (minus)" +test_expr "set variable v_signed_short=-1" "print v_signed_short != 0" "\\$\[0-9\]* = 1" "print v_signed_short != -1" "\\$\[0-9\]* = 0" "print signed signed short != (minus)" +test_expr "set variable v_signed_short=-1" "print v_signed_short < 0" "\\$\[0-9\]* = 1" "print v_signed_short < 0x7FFF" "\\$\[0-9\]* = 1" "print signed signed short < (minus)" +test_expr "set variable v_signed_short=-1" "print v_signed_short > 0" "\\$\[0-9\]* = 0" "print v_signed_short > 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed short > (minus)" +# +# test expressions with "unsigned short" types +# +test_expr "set variable v_unsigned_short=0x7FFF" "print v_unsigned_short == 0" "\\$\[0-9\]* = 0" "print v_unsigned_short == 0x7FFF" "\\$\[0-9\]* = 1" "print unsigned short ==" +test_expr "set variable v_unsigned_short=0x7FFF" "print v_unsigned_short != 0" "\\$\[0-9\]* = 1" "print v_unsigned_short != 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned short !=" +test_expr "set variable v_unsigned_short=0x7FFF" "print v_unsigned_short < 0" "\\$\[0-9\]* = 0" "print v_unsigned_short < 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned short <" +test_expr "set variable v_unsigned_short=0x7FFF" "print v_unsigned_short > 0" "\\$\[0-9\]* = 1" "print v_unsigned_short > 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned short >" +# make short a minus +# note that (unsigned short) ~0 == ~0 iff sizeof(short) == sizeof(int), +# so we can't test v_unsigned_short != ~0 +test_expr "set variable v_unsigned_short=~0" \ + "print v_unsigned_short == 0" "\\$\[0-9\]* = 0" \ + "print v_unsigned_short == (unsigned short)~0" "\\$\[0-9\]* = 1" \ + "print unsigned short == (~0)" +test_expr "set variable v_unsigned_short=~0" "print v_unsigned_short != 0" "\\$\[0-9\]* = 1" "print v_unsigned_short != (unsigned short)~0" "\\$\[0-9\]* = 0" "print unsigned short != (~0)" +test_expr "set variable v_unsigned_short=~0" "print v_unsigned_short < 0" "\\$\[0-9\]* = 0" "print v_unsigned_short < 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned short < (~0)" +test_expr "set variable v_unsigned_short=~0" "print v_unsigned_short > 0" "\\$\[0-9\]* = 1" "print v_unsigned_short > 0x7FFF" "\\$\[0-9\]* = 1" "print unsigned short > (~0)" +# +# test expressions with "int" types +# +test_expr "set variable v_int=0x7FFF" "print v_int == 0" "\\$\[0-9\]* = 0" "print v_int == 0x7FFF" "\\$\[0-9\]* = 1" "print signed int ==" +test_expr "set variable v_int=0x7FFF" "print v_int != 0" "\\$\[0-9\]* = 1" "print v_int != 0x7FFF" "\\$\[0-9\]* = 0" "print signed int !=" +test_expr "set variable v_int=0x7FFF" "print v_int < 0" "\\$\[0-9\]* = 0" "print v_int < 0x7FFF" "\\$\[0-9\]* = 0" "print signed int <" +test_expr "set variable v_int=0x7FFF" "print v_int > 0" "\\$\[0-9\]* = 1" "print v_int > 0x7FFF" "\\$\[0-9\]* = 0" "print signed int >" +# make int a minus +test_expr "set variable v_int=-1" "print v_int == 0" "\\$\[0-9\]* = 0" "print v_int == -1" "\\$\[0-9\]* = 1" "print signed int == (minus)" +test_expr "set variable v_int=-1" "print v_int != 0" "\\$\[0-9\]* = 1" "print v_int != -1" "\\$\[0-9\]* = 0" "print signed int != (minus)" +test_expr "set variable v_int=-1" "print v_int < 0" "\\$\[0-9\]* = 1" "print v_int < 0x7FFF" "\\$\[0-9\]* = 1" "print signed int < (minus)" +test_expr "set variable v_int=-1" "print v_int > 0" "\\$\[0-9\]* = 0" "print v_int > 0x7FFF" "\\$\[0-9\]* = 0" "print signed int > (minus)" +# +# test expressions with "signed int" types +# +test_expr "set variable v_signed_int=0x7FFF" "print v_signed_int == 0" "\\$\[0-9\]* = 0" "print v_signed_int == 0x7FFF" "\\$\[0-9\]* = 1" "print signed signed int ==" +test_expr "set variable v_signed_int=0x7FFF" "print v_signed_int != 0" "\\$\[0-9\]* = 1" "print v_signed_int != 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed int !=" +test_expr "set variable v_signed_int=0x7FFF" "print v_signed_int < 0" "\\$\[0-9\]* = 0" "print v_signed_int < 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed int <" +test_expr "set variable v_signed_int=0x7FFF" "print v_signed_int > 0" "\\$\[0-9\]* = 1" "print v_signed_int > 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed int >" +# make int a minus +test_expr "set variable v_signed_int=-1" "print v_signed_int == 0" "\\$\[0-9\]* = 0" "print v_signed_int == -1" "\\$\[0-9\]* = 1" "print signed signed int == (minus)" +test_expr "set variable v_signed_int=-1" "print v_signed_int != 0" "\\$\[0-9\]* = 1" "print v_signed_int != -1" "\\$\[0-9\]* = 0" "print signed signed int != (minus)" +test_expr "set variable v_signed_int=-1" "print v_signed_int < 0" "\\$\[0-9\]* = 1" "print v_signed_int < 0x7FFF" "\\$\[0-9\]* = 1" "print signed signed int < (minus)" +test_expr "set variable v_signed_int=-1" "print v_signed_int > 0" "\\$\[0-9\]* = 0" "print v_signed_int > 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed int > (minus)" +# +# test expressions with "unsigned int" types +# +test_expr "set variable v_unsigned_int=0x7FFF" "print v_unsigned_int == 0" "\\$\[0-9\]* = 0" "print v_unsigned_int == 0x7FFF" "\\$\[0-9\]* = 1" "print unsigned int ==" +test_expr "set variable v_unsigned_int=0x7FFF" "print v_unsigned_int != 0" "\\$\[0-9\]* = 1" "print v_unsigned_int != 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned int !=" +test_expr "set variable v_unsigned_int=0x7FFF" "print v_unsigned_int < 0" "\\$\[0-9\]* = 0" "print v_unsigned_int < 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned int <" +test_expr "set variable v_unsigned_int=0x7FFF" "print v_unsigned_int > 0" "\\$\[0-9\]* = 1" "print v_unsigned_int > 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned int >" +# make int a minus +test_expr "set variable v_unsigned_int=~0" "print v_unsigned_int == 0" "\\$\[0-9\]* = 0" "print v_unsigned_int == ~0" "\\$\[0-9\]* = 1" "print v_unsigned_int == (unsigned int)~0" "\\$\[0-9\]* = 1" "print unsigned int == (~0)" +test_expr "set variable v_unsigned_int=~0" "print v_unsigned_int != 0" "\\$\[0-9\]* = 1" "print v_unsigned_int != (unsigned int)~0" "\\$\[0-9\]* = 0" "print unsigned int != (~0)" +test_expr "set variable v_unsigned_int=~0" "print v_unsigned_int < 0" "\\$\[0-9\]* = 0" "print v_unsigned_int < 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned int < (~0)" +test_expr "set variable v_unsigned_int=~0" "print v_unsigned_int > 0" "\\$\[0-9\]* = 1" "print v_unsigned_int > 0x7FFF" "\\$\[0-9\]* = 1" "print unsigned int > (~0)" +# +# test expressions with "long" types +# +test_expr "set variable v_long=0x7FFF" "print v_long == 0" "\\$\[0-9\]* = 0" "print v_long == 0x7FFF" "\\$\[0-9\]* = 1" "print signed long ==" +test_expr "set variable v_long=0x7FFF" "print v_long != 0" "\\$\[0-9\]* = 1" "print v_long != 0x7FFF" "\\$\[0-9\]* = 0" "print signed long !=" +test_expr "set variable v_long=0x7FFF" "print v_long < 0" "\\$\[0-9\]* = 0" "print v_long < 0x7FFF" "\\$\[0-9\]* = 0" "print signed long <" +test_expr "set variable v_long=0x7FFF" "print v_long > 0" "\\$\[0-9\]* = 1" "print v_long > 0x7FFF" "\\$\[0-9\]* = 0" "print signed long >" +# make long a minus +test_expr "set variable v_long=-1" "print v_long == 0" "\\$\[0-9\]* = 0" "print v_long == -1" "\\$\[0-9\]* = 1" "print signed long == (minus)" +test_expr "set variable v_long=-1" "print v_long != 0" "\\$\[0-9\]* = 1" "print v_long != -1" "\\$\[0-9\]* = 0" "print signed long != (minus)" +test_expr "set variable v_long=-1" "print v_long < 0" "\\$\[0-9\]* = 1" "print v_long < 0x7FFF" "\\$\[0-9\]* = 1" "print signed long < (minus)" +test_expr "set variable v_long=-1" "print v_long > 0" "\\$\[0-9\]* = 0" "print v_long > 0x7FFF" "\\$\[0-9\]* = 0" "print signed long > (minus)" +# +# test expressions with "signed long" types +# +test_expr "set variable v_signed_long=0x7FFF" "print v_signed_long == 0" "\\$\[0-9\]* = 0" "print v_signed_long == 0x7FFF" "\\$\[0-9\]* = 1" "print signed signed long ==" +test_expr "set variable v_signed_long=0x7FFF" "print v_signed_long != 0" "\\$\[0-9\]* = 1" "print v_signed_long != 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed long !=" +test_expr "set variable v_signed_long=0x7FFF" "print v_signed_long < 0" "\\$\[0-9\]* = 0" "print v_signed_long < 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed long <" +test_expr "set variable v_signed_long=0x7FFF" "print v_signed_long > 0" "\\$\[0-9\]* = 1" "print v_signed_long > 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed long >" +# make long a minus +test_expr "set variable v_signed_long=-1" "print v_signed_long == 0" "\\$\[0-9\]* = 0" "print v_signed_long == -1" "\\$\[0-9\]* = 1" "print signed signed long == (minus)" +test_expr "set variable v_signed_long=-1" "print v_signed_long != 0" "\\$\[0-9\]* = 1" "print v_signed_long != -1" "\\$\[0-9\]* = 0" "print signed signed long != (minus)" +test_expr "set variable v_signed_long=-1" "print v_signed_long < 0" "\\$\[0-9\]* = 1" "print v_signed_long < 0x7FFF" "\\$\[0-9\]* = 1" "print signed signed long < (minus)" +test_expr "set variable v_signed_long=-1" "print v_signed_long > 0" "\\$\[0-9\]* = 0" "print v_signed_long > 0x7FFF" "\\$\[0-9\]* = 0" "print signed signed long > (minus)" +# +# test expressions with "unsigned long" types +# +test_expr "set variable v_unsigned_long=0x7FFF" "print v_unsigned_long == 0" "\\$\[0-9\]* = 0" "print v_unsigned_long == 0x7FFF" "\\$\[0-9\]* = 1" "print unsigned long ==" +test_expr "set variable v_unsigned_long=0x7FFF" "print v_unsigned_long != 0" "\\$\[0-9\]* = 1" "print v_unsigned_long != 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned long !=" +test_expr "set variable v_unsigned_long=0x7FFF" "print v_unsigned_long < 0" "\\$\[0-9\]* = 0" "print v_unsigned_long < 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned long <" +test_expr "set variable v_unsigned_long=0x7FFF" "print v_unsigned_long > 0" "\\$\[0-9\]* = 1" "print v_unsigned_long > 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned long >" +# make long a minus +test_expr "set variable v_unsigned_long=~0" "print v_unsigned_long == 0" "\\$\[0-9\]* = 0" "print v_unsigned_long == ~0" "\\$\[0-9\]* = 1" "print v_unsigned_long == (unsigned long)~0" "\\$\[0-9\]* = 1" "print unsigned long == (~0)" +test_expr "set variable v_unsigned_long=~0" "print v_unsigned_long != 0" "\\$\[0-9\]* = 1" "print v_unsigned_long != (unsigned long)~0" "\\$\[0-9\]* = 0" "print unsigned long != (~0)" +test_expr "set variable v_unsigned_long=~0" "print v_unsigned_long < 0" "\\$\[0-9\]* = 0" "print v_unsigned_long < 0x7FFF" "\\$\[0-9\]* = 0" "print unsigned long < (~0)" +test_expr "set variable v_unsigned_long=~0" "print v_unsigned_long > 0" "\\$\[0-9\]* = 1" "print v_unsigned_long > 0x7FFF" "\\$\[0-9\]* = 1" "print unsigned long > (~0)" diff --git a/gdb/testsuite/gdb.base/foo.c b/gdb/testsuite/gdb.base/foo.c new file mode 100644 index 00000000000..ada9cf471ee --- /dev/null +++ b/gdb/testsuite/gdb.base/foo.c @@ -0,0 +1,9 @@ +static int foox __attribute__ ((section (".data00"))) = 'f' + 'o' + 'o'; + +int foo (int x) +{ + if (x) + return foox; + else + return 0; +} diff --git a/gdb/testsuite/gdb.base/funcargs.c b/gdb/testsuite/gdb.base/funcargs.c new file mode 100644 index 00000000000..ead67e551ee --- /dev/null +++ b/gdb/testsuite/gdb.base/funcargs.c @@ -0,0 +1,582 @@ +/* Test passing of arguments to functions. Use various sorts of arguments, + including basic types, pointers to those types, structures, lots of + args, etc, in various combinations. */ + +/* AIX requires this to be the first thing in the file. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_STACK_ALLOCA 1 +#else /* not __GNUC__ */ +# ifdef _AIX + #pragma alloca +# define HAVE_STACK_ALLOCA 1 +# else /* Not AIX */ +# ifdef sparc +# include +# define HAVE_STACK_ALLOCA 1 +# ifdef __STDC__ + void *alloca (); +# else + char *alloca (); +# endif /* __STDC__ */ +# endif /* sparc */ +# endif /* Not AIX */ +#endif /* not __GNUC__ */ + +char c = 'a'; +char *cp = &c; + +unsigned char uc = 'b'; +unsigned char *ucp = &uc; + +short s = 1; +short *sp = &s; + +unsigned short us = 6; +unsigned short *usp = &us; + +int i = 2; +int *ip = &i; + +unsigned int ui = 7; +unsigned int *uip = &ui; + +long l = 3; +long *lp = &l; + +unsigned long ul = 8; +unsigned long *ulp = &ul; + +float f = 4.0; +float *fp = &f; + +double d = 5.0; +double *dp = &d; + +struct stag { + int s1; + int s2; +} st = { 101, 102 }; +struct stag *stp = &st; + +union utag { + int u1; + long u2; +} un; +union utag *unp = &un; + +char carray[] = {'a', 'n', ' ', 'a', 'r', 'r', 'a', 'y', '\0'}; + + +/* Test various permutations and interleaving of integral arguments */ + + +call0a (c, s, i, l) +char c; short s; int i; long l; +{ + c = 'a'; + s = 5; + i = 6; + l = 7; +} + +call0b (s, i, l, c) +short s; int i; long l; char c; +{ + s = 6; i = 7; l = 8; c = 'j'; +} + +call0c (i, l, c, s) +int i; long l; char c; short s; +{ + i = 3; l = 4; c = 'k'; s = 5; +} + +call0d (l, c, s, i) +long l; char c; short s; int i; +{ + l = 7; c = 'z'; s = 8; i = 9; +} + +call0e (c1, l, c2, i, c3, s, c4, c5) +char c1; long l; char c2; int i; char c3; short s; char c4; char c5; +{ + c1 = 'a'; l = 5; c2 = 'b'; i = 7; c3 = 'c'; s = 7; c4 = 'f'; c5 = 'g'; +} + + +/* Test various permutations and interleaving of unsigned integral arguments */ + + +call1a (uc, us, ui, ul) +unsigned char uc; unsigned short us; unsigned int ui; unsigned long ul; +{ + uc = 5; us = 6; ui = 7; ul = 8; +} + +call1b (us, ui, ul, uc) +unsigned short us; unsigned int ui; unsigned long ul; unsigned char uc; +{ + uc = 5; us = 6; ui = 7; ul = 8; +} + +call1c (ui, ul, uc, us) +unsigned int ui; unsigned long ul; unsigned char uc; unsigned short us; +{ + uc = 5; us = 6; ui = 7; ul = 8; +} + +call1d (ul, uc, us, ui) +unsigned long ul; unsigned char uc; unsigned short us; unsigned int ui; +{ + uc = 5; us = 6; ui = 7; ul = 8; +} + +call1e (uc1, ul, uc2, ui, uc3, us, uc4, uc5) +unsigned char uc1; unsigned long ul; unsigned char uc2; unsigned int ui; +unsigned char uc3; unsigned short us; unsigned char uc4; unsigned char uc5; +{ + uc1 = 5; ul = 7; uc2 = 8; ui = 9; uc3 = 10; us = 11; uc4 = 12; uc5 = 55; +} + +/* Test various permutations and interleaving of integral arguments with + floating point arguments. */ + + +call2a (c, f1, s, d1, i, f2, l, d2) +char c; float f1; short s; double d1; int i; float f2; long l; double d2; +{ + c = 'a'; f1 = 0.0; s = 5; d1 = 0.0; i = 6; f2 = 0.1; l = 7; d2 = 0.2; +} + +call2b (f1, s, d1, i, f2, l, d2, c) +float f1; short s; double d1; int i; float f2; long l; double d2; char c; +{ + c = 'a'; f1 = 0.0; s = 5; d1 = 0.0; i = 6; f2 = 0.1; l = 7; d2 = 0.2; +} + +call2c (s, d1, i, f2, l, d2, c, f1) +short s; double d1; int i; float f2; long l; double d2; char c; float f1; +{ + c = 'a'; f1 = 0.0; s = 5; d1 = 0.0; i = 6; f2 = 0.1; l = 7; d2 = 0.2; +} + +call2d (d1, i, f2, l, d2, c, f1, s) +double d1; int i; float f2; long l; double d2; char c; float f1; short s; +{ + c = 'a'; f1 = 0.0; s = 5; d1 = 0.0; i = 6; f2 = 0.1; l = 7; d2 = 0.2; +} + +call2e (i, f2, l, d2, c, f1, s, d1) +int i; float f2; long l; double d2; char c; float f1; short s; double d1; +{ + c = 'a'; f1 = 0.0; s = 5; d1 = 0.0; i = 6; f2 = 0.1; l = 7; d2 = 0.2; +} + +call2f (f2, l, d2, c, f1, s, d1, i) +float f2; long l; double d2; char c; float f1; short s; double d1; int i; +{ + c = 'a'; f1 = 0.0; s = 5; d1 = 0.0; i = 6; f2 = 0.1; l = 7; d2 = 0.2; +} + +call2g (l, d2, c, f1, s, d1, i, f2) +long l; double d2; char c; float f1; short s; double d1; int i; float f2; +{ + c = 'a'; f1 = 0.0; s = 5; d1 = 0.0; i = 6; f2 = 0.1; l = 7; d2 = 0.2; +} + +call2h (d2, c, f1, s, d1, i, f2, l) +double d2; char c; float f1; short s; double d1; int i; float f2; long l; +{ + c = 'a'; f1 = 0.0; s = 5; d1 = 0.0; i = 6; f2 = 0.1; l = 7; d2 = 0.2; +} + +call2i (c1, f1, c2, c3, d1, c4, c5, c6, f2, s, c7, d2) +char c1; float f1; char c2; char c3; double d1; char c4; char c5; char c6; +float f2; short s; char c7; double d2; +{ + c1 = 'a'; f1 = 0.0; c2 = 5; d1 = 0.0; c3 = 6; f2 = 0.1; c4 = 7; d2 = 0.2; + c5 = 's'; c6 = 'f'; c7 = 'z'; s = 77; +} + + +/* Test pointers to various integral and floating types. */ + + +call3a (cp, sp, ip, lp) +char *cp; short *sp; int *ip; long *lp; +{ + cp = 0; sp = 0; ip = 0; lp = 0; +} + +call3b (ucp, usp, uip, ulp) +unsigned char *ucp; unsigned short *usp; unsigned int *uip; +unsigned long *ulp; +{ + ucp = 0; usp = 0; uip = 0; ulp = 0; +} + +call3c (fp, dp) +float *fp; double *dp; +{ + fp = 0; dp = 0; +} + + +/* Test passing structures and unions by reference. */ + + +call4a (stp) +struct stag *stp; { +stp = 0;} + +call4b (unp) +union utag *unp; +{ + unp = 0; +} + + +/* Test passing structures and unions by value. */ + + +call5a (st) +struct stag st; {st.s1 = 5;} + +call5b (un) +union utag un; {un.u1 = 7;} + + +/* Test shuffling of args */ + + +call6a (c, s, i, l, f, d, uc, us, ui, ul) +char c; short s; int i; long l; float f; double d; +unsigned char uc; unsigned short us; unsigned int ui; unsigned long ul; +{ + c = c; + call6b (s, i, l, f, d, uc, us, ui, ul); +} + +call6b (s, i, l, f, d, uc, us, ui, ul) +short s; int i; long l; float f; double d; +unsigned char uc; unsigned short us; unsigned int ui; unsigned long ul; +{ + s = s; + call6c (i, l, f, d, uc, us, ui, ul); +} + +call6c (i, l, f, d, uc, us, ui, ul) +int i; long l; float f; double d; +unsigned char uc; unsigned short us; unsigned int ui; unsigned long ul; +{ + i = i; + call6d (l, f, d, uc, us, ui, ul); +} + +call6d (l, f, d, uc, us, ui, ul) +long l; float f; double d; +unsigned char uc; unsigned short us; unsigned int ui; unsigned long ul; +{ + l = l; + call6e (f, d, uc, us, ui, ul); +} + +call6e (f, d, uc, us, ui, ul) +float f; double d; +unsigned char uc; unsigned short us; unsigned int ui; unsigned long ul; +{ + f = f; + call6f (d, uc, us, ui, ul); +} + +call6f (d, uc, us, ui, ul) +double d; +unsigned char uc; unsigned short us; unsigned int ui; unsigned long ul; +{ + d = d; + call6g (uc, us, ui, ul); +} + +call6g (uc, us, ui, ul) +unsigned char uc; unsigned short us; unsigned int ui; unsigned long ul; +{ + uc = uc; + call6h (us, ui, ul); +} + +call6h (us, ui, ul) +unsigned short us; unsigned int ui; unsigned long ul; +{ + us = us; + call6i (ui, ul); +} + +call6i (ui, ul) +unsigned int ui; unsigned long ul; +{ + ui = ui; + call6j (ul); +} + +call6j (ul) +unsigned long ul; +{ + ul = ul; + call6k (); +} + +call6k () +{ +} + + +/* Test shuffling of args, round robin */ + + +call7a (c, i, s, l, f, uc, d, us, ul, ui) +char c; int i; short s; long l; float f; unsigned char uc; double d; unsigned short us; unsigned long ul; unsigned int ui; +{ + call7b (i, s, l, f, uc, d, us, ul, ui, c); +} + +call7b (i, s, l, f, uc, d, us, ul, ui, c) +int i; short s; long l; float f; unsigned char uc; double d; unsigned short us; unsigned long ul; unsigned int ui; char c; +{ + call7c (s, l, f, uc, d, us, ul, ui, c, i); +} + +call7c (s, l, f, uc, d, us, ul, ui, c, i) +short s; long l; float f; unsigned char uc; double d; unsigned short us; unsigned long ul; unsigned int ui; char c; int i; +{ + call7d (l, f, uc, d, us, ul, ui, c, i, s); +} + +call7d (l, f, uc, d, us, ul, ui, c, i, s) +long l; float f; unsigned char uc; double d; unsigned short us; unsigned long ul; unsigned int ui; char c; int i; short s; +{ + call7e (f, uc, d, us, ul, ui, c, i, s, l); +} + +call7e (f, uc, d, us, ul, ui, c, i, s, l) +float f; unsigned char uc; double d; unsigned short us; unsigned long ul; unsigned int ui; char c; int i; short s; long l; +{ + call7f (uc, d, us, ul, ui, c, i, s, l, f); +} + +call7f (uc, d, us, ul, ui, c, i, s, l, f) +unsigned char uc; double d; unsigned short us; unsigned long ul; unsigned int ui; char c; int i; short s; long l; float f; +{ + call7g (d, us, ul, ui, c, i, s, l, f, uc); +} + +call7g (d, us, ul, ui, c, i, s, l, f, uc) +double d; unsigned short us; unsigned long ul; unsigned int ui; char c; int i; short s; long l; float f; unsigned char uc; +{ + call7h (us, ul, ui, c, i, s, l, f, uc, d); +} + +call7h (us, ul, ui, c, i, s, l, f, uc, d) +unsigned short us; unsigned long ul; unsigned int ui; char c; int i; short s; long l; float f; unsigned char uc; double d; +{ + call7i (ul, ui, c, i, s, l, f, uc, d, us); +} + +call7i (ul, ui, c, i, s, l, f, uc, d, us) +unsigned long ul; unsigned int ui; char c; int i; short s; long l; float f; unsigned char uc; double d; unsigned short us; +{ + call7j (ui, c, i, s, l, f, uc, d, us, ul); +} + +call7j (ui, c, i, s, l, f, uc, d, us, ul) +unsigned int ui; char c; int i; short s; long l; float f; unsigned char uc; double d; unsigned short us; unsigned long ul; +{ + call7k (c, i, s, l, f, uc, d, us, ul, ui); +} + +call7k (c, i, s, l, f, uc, d, us, ul, ui) +char c; int i; short s; long l; float f; unsigned char uc; double d; unsigned short us; unsigned long ul; unsigned int ui; +{ + c = 'a'; i = 7; s = 8; l = 7; f = 0.3; uc = 44; d = 0.44; us = 77; + ul = 43; ui = 33; +} + + +/* Test printing of structures passed as arguments to recursive functions. */ + + +typedef struct s +{ + short s; + int i; + long l; +} SVAL; + +hitbottom () +{ +} + +void recurse (a, depth) +SVAL a; +int depth; +{ + a.s = a.i = a.l = --depth; + if (depth == 0) + hitbottom (); + else + recurse (a, depth); +} + +test_struct_args () +{ + SVAL s; s.s = 5; s.i = 5; s.l = 5; + + recurse (s, 5); +} + +/* On various machines (pa, 29k, and rs/6000, at least), a function which + calls alloca may do things differently with respect to frames. So give + it a try. */ + +int +localvars_after_alloca (c, s, i, l) + char c; + short s; + int i; + long l; +{ +#ifdef HAVE_STACK_ALLOCA + /* No need to use the alloca.c alloca-on-top-of-malloc; it doesn't + test what we are looking for, so if we don't have an alloca which + allocates on the stack, just don't bother to call alloca at all. */ + + char *z = alloca (s + 50); +#endif + c = 'a'; + s = 5; + i = 6; + l = 7; +} + +void +call_after_alloca_subr (c, s, i, l, uc, us, ui, ul) +char c; int i; short s; long l; unsigned char uc; unsigned short us; unsigned long ul; unsigned int ui; +{ + c = 'a'; + i = 7; s = 8; l = 7; uc = 44; us = 77; + ul = 43; ui = 33; +} + +int +call_after_alloca (c, s, i, l) + char c; + short s; + int i; + long l; +{ +#ifdef HAVE_STACK_ALLOCA + /* No need to use the alloca.c alloca-on-top-of-malloc; it doesn't + test what we are looking for, so if we don't have an alloca which + allocates on the stack, just don't bother to call alloca at all. */ + + char *z = alloca (s + 50); +#endif + call_after_alloca_subr (c, s, i, l, 'b', 11, 12, (unsigned long)13); +} + + + +/* The point behind this test is the PA will call this indirectly + through dyncall. Unlike the indirect calls to call0a, this test + will require a trampoline between dyncall and this function on the + call path, then another trampoline on between this function and main + on the return path. */ +double +call_with_trampolines (d1) +double d1; +{ + return d1; +} /* End of call_with_trampolines, this comment is needed by funcargs.exp */ + +/* Dummy functions which the testsuite can use to run to, etc. */ + +void +marker_indirect_call () {} + +void +marker_call_with_trampolines () {} + +main () +{ + int (*pointer_to_call0a) () = call0a; + double (*pointer_to_call_with_trampolines) () = call_with_trampolines; + +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + /* Test calling with basic integer types */ + call0a (c, s, i, l); + call0b (s, i, l, c); + call0c (i, l, c, s); + call0d (l, c, s, i); + call0e (c, l, c, i, c, s, c, c); + + /* Test calling with unsigned integer types */ + call1a (uc, us, ui, ul); + call1b (us, ui, ul, uc); + call1c (ui, ul, uc, us); + call1d (ul, uc, us, ui); + call1e (uc, ul, uc, ui, uc, us, uc, uc); + + /* Test calling with integral types mixed with floating point types */ + call2a (c, f, s, d, i, f, l, d); + call2b (f, s, d, i, f, l, d, c); + call2c (s, d, i, f, l, d, c, f); + call2d (d, i, f, l, d, c, f, s); + call2e (i, f, l, d, c, f, s, d); + call2f (f, l, d, c, f, s, d, i); + call2g (l, d, c, f, s, d, i, f); + call2h (d, c, f, s, d, i, f, l); + call2i (c, f, c, c, d, c, c, c, f, s, c, d);; + + /* Test dereferencing pointers to various integral and floating types */ + + call3a (cp, sp, ip, lp); + call3b (ucp, usp, uip, ulp); + call3c (fp, dp); + + /* Test dereferencing pointers to structs and unions */ + + call4a (stp); + un.u1 = 1; + call4b (unp); + + /* Test calling with structures and unions. */ + + call5a (st); + un.u1 = 2; + call5b (un); + + /* Test shuffling of args */ + + call6a (c, s, i, l, f, d, uc, us, ui, ul); + call7a (c, i, s, l, f, uc, d, us, ul, ui); + + /* Test passing structures recursively. */ + + test_struct_args (); + + localvars_after_alloca (c, s, i, l); + + call_after_alloca (c, s, i, l); + + /* This is for localvars_in_indirect_call. */ + marker_indirect_call (); + /* The comment on the following two lines is used by funcargs.exp, + don't change it. */ + (*pointer_to_call0a) (c, s, i, l); /* First step into call0a. */ + (*pointer_to_call0a) (c, s, i, l); /* Second step into call0a. */ + marker_call_with_trampolines (); + (*pointer_to_call_with_trampolines) (d); /* Test multiple trampolines. */ +} diff --git a/gdb/testsuite/gdb.base/funcargs.exp b/gdb/testsuite/gdb.base/funcargs.exp new file mode 100644 index 00000000000..e6245dcfce5 --- /dev/null +++ b/gdb/testsuite/gdb.base/funcargs.exp @@ -0,0 +1,1017 @@ +# Copyright (C) 1992, 1994, 1995, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "funcargs" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +# +# Locate actual args; integral types. +# + +proc integral_args {} { + global gdb_prompt + global det_file + global gcc_compiled + + delete_breakpoints + + gdb_breakpoint call0a + gdb_breakpoint call0b + gdb_breakpoint call0c + gdb_breakpoint call0d + gdb_breakpoint call0e + + # Run; should stop at call0a and print actual arguments. + # The a29k fails all of these tests, perhaps because the prologue + # code is broken. + setup_xfail "a29k-*-udi" + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_run_cmd + gdb_expect { + -re ".* call0a \\(c=97 'a', s=1, i=2, l=3\\) .*$gdb_prompt $" { + pass "run to call0a" + } + -re "$gdb_prompt $" { fail "run to call0a" ; gdb_suppress_tests } + timeout { fail "(timeout) run to call0a" ; gdb_suppress_tests } + } + + # Print each arg as a double check to see if we can print + # them here as well as with backtrace. + gdb_test "print c" ".* = 97 'a'" "print c after run to call0a" + gdb_test "print s" ".* = 1" "print s after run to call0a" + gdb_test "print i" ".* = 2" "print i after run to call0a" + gdb_test "print l " ".* = 3" "print l after run to call0a" + + # Continue; should stop at call0b and print actual arguments. + if [gdb_test "cont" ".* call0b \\(s=1, i=2, l=3, c=97 'a'\\) .*" "continue to call0b"] { + gdb_suppress_tests; + } + + # Continue; should stop at call0c and print actual arguments. + if [gdb_test "cont" ".* call0c \\(i=2, l=3, c=97 'a', s=1\\) .*" "continue to call0c"] { + gdb_suppress_tests; + } + + # Continue; should stop at call0d and print actual arguments. + if [gdb_test "cont" ".* call0d \\(l=3, c=97 'a', s=1, i=2\\) .*" "continue to call0d";] { + gdb_suppress_tests; + } + + # Continue; should stop at call0e and print actual arguments. + if [gdb_test "cont" ".* call0e \\(c1=97 'a', l=3, c2=97 'a', i=2, c3=97 'a', s=1, c4=97 'a', c5=97 'a'\\) .*" "continue to call0e" ] { + gdb_suppress_tests; + } + gdb_stop_suppressing_tests; +} + +# +# Locate actual args; unsigned integral types. +# + +proc unsigned_integral_args {} { + global gdb_prompt + global det_file + global gcc_compiled + + delete_breakpoints + + gdb_breakpoint call1a; + gdb_breakpoint call1b; + gdb_breakpoint call1c; + gdb_breakpoint call1d; + gdb_breakpoint call1e; + + # Run; should stop at call1a and print actual arguments. + # The a29k fails all of these tests, perhaps because the prologue + # code is broken. + setup_xfail "a29k-*-udi" + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_run_cmd + gdb_expect { + -re ".* call1a \\(uc=98 'b', us=6, ui=7, ul=8\\) .*$gdb_prompt $" { + pass "run to call1a" + } + -re "$gdb_prompt $" { fail "run to call1a" ; gdb_suppress_tests; } + timeout { fail "(timeout) run to call1a" ; gdb_suppress_tests; } + } + + # Print each arg as a double check to see if we can print + # them here as well as with backtrace. + gdb_test "print uc" ".* = 98 'b'" + gdb_test "print us" ".* = 6" + gdb_test "print ui" ".* = 7" + gdb_test "print ul" ".* = 8" + + # Continue; should stop at call1b and print actual arguments. + if [gdb_test "cont" ".* call1b \\(us=6, ui=7, ul=8, uc=98 'b'\\) .*" "continue to call1b"] { + gdb_suppress_tests; + } + + # Continue; should stop at call1c and print actual arguments. + if [gdb_test "cont" ".* call1c \\(ui=7, ul=8, uc=98 'b', us=6\\) .*" "continue to call1c"] { + gdb_suppress_tests; + } + + # Continue; should stop at call1d and print actual arguments. + if [gdb_test "cont" ".* call1d \\(ul=8, uc=98 'b', us=6, ui=7\\) .*" "continue to call1d"] { + gdb_suppress_tests; + } + + # Continue; should stop at call1e and print actual arguments. + if [gdb_test "cont" ".* call1e \\(uc1=98 'b', ul=8, uc2=98 'b', ui=7, uc3=98 'b', us=6, uc4=98 'b', uc5=98 'b'\\) .*" "continue to call1e"] { + gdb_suppress_tests; + } + gdb_stop_suppressing_tests; +} + +# +# Locate actual args; integrals mixed with floating point. +# + +proc float_and_integral_args {} { + global gdb_prompt + global det_file + global gcc_compiled + + delete_breakpoints + + gdb_breakpoint call2a + gdb_breakpoint call2b + gdb_breakpoint call2c + gdb_breakpoint call2d + gdb_breakpoint call2e + gdb_breakpoint call2f + gdb_breakpoint call2g + gdb_breakpoint call2h + + # Run; should stop at call2a and print actual arguments. + + setup_xfail "i960-*-*" 1813 + # The a29k fails all of these tests, perhaps because the prologue + # code is broken. + setup_xfail "a29k-*-udi" + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "mips-sgi-irix5*" } + gdb_run_cmd + gdb_expect { + -re ".* call2a \\(c=97 'a', f1=4, s=1, d1=5, i=2, f2=4, l=3, d2=5\\) .*$gdb_prompt $" { pass "run to call2a" } + -re "$gdb_prompt $" { fail "run to call2a" ; gdb_suppress_tests; } + timeout { fail "(timeout) run to call2a" ; gdb_suppress_tests; } + } + + # Print each arg as a double check to see if we can print + gdb_test "print c" ".* = 97 'a'" "print c after run to call2a" + gdb_test "print f1" ".* = 4" "print f1 after run to call2a" + gdb_test "print s" ".* = 1" "print s after run to call2a" + gdb_test "print d1" ".* = 5" "print d1 after run to call2a" + gdb_test "print i" ".* = 2" "print i after run to call2a" + gdb_test "print f2" ".* = 4" "print f2 after run to call2a" + gdb_test "print l" ".* = 3" "print l after run to call2a" + gdb_test "print d2" ".* = 5" "print d2 after run to call2a" + + setup_xfail "rs6000-*-*" + if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" } + # Continue; should stop at call2b and print actual arguments. + if [gdb_test "cont" ".* call2b \\(f1=4, s=1, d1=5, i=2, f2=4, l=3, d2=5, c=97 'a'\\) .*" "continue to call2b"] { + gdb_suppress_tests; + } + + # Continue; should stop at call2c and print actual arguments. + if [gdb_test "cont" ".* call2c \\(s=1, d1=5, i=2, f2=4, l=3, d2=5, c=97 'a', f1=4\\) .*" "continue to call2c"] { + gdb_suppress_tests; + } + + # Continue; should stop at call2d and print actual arguments. + if [gdb_test "cont" ".* call2d \\(d1=5, i=2, f2=4, l=3, d2=5, c=97 'a', f1=4, s=1\\) .*" "continue to call2d"] { + gdb_suppress_tests; + } + + # Continue; should stop at call2e and print actual arguments. + if [gdb_test "cont" ".* call2e \\(i=2, f2=4, l=3, d2=5, c=97 'a', f1=4, s=1, d1=5\\) .*" "continue to call2e"] { + gdb_suppress_tests; + } + + # Continue; should stop at call2f and print actual arguments. + if [gdb_test "cont" ".* call2f \\(f2=4, l=3, d2=5, c=97 'a', f1=4, s=1, d1=5, i=2\\) .*" "continue to call2f"] { + gdb_suppress_tests; + } + + # Continue; should stop at call2g and print actual arguments. + if [gdb_test "cont" ".* call2g \\(l=3, d2=5, c=97 'a', f1=4, s=1, d1=5, i=2, f2=4\\) .*" "continue to call2g"] { + gdb_suppress_tests; + } + + # Continue; should stop at call2h and print actual arguments. + if [gdb_test "cont" ".* call2h \\(d2=5, c=97 'a', f1=4, s=1, d1=5, i=2, f2=4, l=3\\) .*" "continue to call2h"] { + gdb_suppress_tests; + } + + # monitor only allows 8 breakpoints; w89k board allows 10, so + # break them up into two groups. + delete_breakpoints + gdb_breakpoint call2i + + # Continue; should stop at call2i and print actual arguments. + if [gdb_test "cont" ".* call2i \\(c1=97 'a', f1=4, c2=97 'a', c3=97 'a', d1=5, c4=97 'a', c5=97 'a', c6=97 'a', f2=4, s=1, c7=97 'a', d2=5\\) .*" "continue to call2i"] { + gdb_suppress_tests; + } + gdb_stop_suppressing_tests; +} + +# +# Locate actual args; dereference pointers to ints and floats. +# + +proc pointer_args {} { + global gdb_prompt + global hex + global det_file + + delete_breakpoints + + gdb_breakpoint call3a + gdb_breakpoint call3b + gdb_breakpoint call3c + + # Run; should stop at call3a and print actual arguments. + # Try dereferencing the arguments. + + # The a29k fails all of these tests, perhaps because the prologue + # code is broken. + setup_xfail "a29k-*-udi" + gdb_run_cmd + gdb_expect { + -re ".* call3a \\(cp=$hex \"a\", sp=$hex, ip=$hex, lp=$hex\\) .*$gdb_prompt $" { pass "run to call3a" } + -re "$gdb_prompt $" { fail "run to call3a" ; gdb_suppress_tests; } + timeout { fail "(timeout) run to call3a" ; gdb_suppress_tests; } + } + + gdb_test "print *cp" ".* = 97 'a'" + gdb_test "print *sp" ".* = 1" + gdb_test "print *ip" ".* = 2" + gdb_test "print *lp" ".* = 3" + + # Continue; should stop at call3b and print actual arguments. + # Try dereferencing the arguments. + if [gdb_test "cont" ".* call3b \\(ucp=$hex \"b\", usp=$hex, uip=$hex, ulp=$hex\\) .*" "continue to call3b"] { + gdb_suppress_tests; + } + + gdb_test "print *ucp" ".* = 98 'b'" + gdb_test "print *usp" ".* = 6" + gdb_test "print *uip" ".* = 7" + gdb_test "print *ulp" ".* = 8" + + # Continue; should stop at call3c and print actual arguments. + # Try dereferencing the arguments. + if [gdb_test "cont" ".* call3c \\(fp=$hex, dp=$hex\\) .*" "continue to call3c"] { + gdb_suppress_tests; + } + + gdb_test "print *fp" ".* = 4" + gdb_test "print *dp" ".* = 5" + +# pass "locate actual args, pointer types" + gdb_stop_suppressing_tests; +} + +# +# Locate actual args; structures and unions passed by reference. +# + +proc structs_by_reference {} { + global gdb_prompt + global hex + global det_file + global target_sizeof_int + global target_sizeof_long + global target_bigendian_p + + delete_breakpoints + + gdb_breakpoint call4a + gdb_breakpoint call4b + + # Run; should stop at call4a and print actual arguments. + # Try dereferencing the arguments. + + # The a29k fails all of these tests, perhaps because the prologue + # code is broken. + setup_xfail "a29k-*-udi" + gdb_run_cmd + gdb_expect { + -re ".* call4a \\(stp=$hex\\) .*$gdb_prompt $" { + pass "run to call4a" + } + -re "$gdb_prompt $" { fail "run to call4a" ; gdb_suppress_tests; } + timeout { fail "(timeout) run to call4a" ; gdb_suppress_tests; } + } + + gdb_test "print *stp" ".* = \{s1 = 101, s2 = 102\}" + + # Continue; should stop at call4b and print actual arguments. + + gdb_test "cont" ".* call4b \\(unp=$hex\\) .*" "continue to call4b" + + # Try dereferencing the arguments. + if { $target_sizeof_long == $target_sizeof_int } { + gdb_test "print *unp" ".* = \{u1 = 1, u2 = 1\}" \ + "print *unp (sizeof long == sizeof int)" + } elseif { ! $target_bigendian_p } { + gdb_test "print *unp" ".* = \{u1 = 1, u2 = 1\}" \ + "print *unp (little-endian, sizeof long != sizeof int)" + } elseif { $target_sizeof_long == 8 && $target_sizeof_int == 4 } { + gdb_test "print *unp" ".* = \{u1 = 1, u2 = 4294967296\}" \ + "print *unp (big-endian, sizeof long == 8, sizeof int = 4)" + } elseif { $target_sizeof_long == 4 && $target_sizeof_int == 2 } { + gdb_test "print *unp" ".* = \{u1 = 1, u2 = 65536\}" \ + "print *unp (big-endian, sizeof long == 4, sizeof int = 2)" + } else { + fail "print *unp (unknown case)" + } + + pass "locate actual args, structs/unions passed by reference" + gdb_stop_suppressing_tests; +} + +# +# Locate actual args; structures and unions passed by value. +# + +proc structs_by_value {} { + global gdb_prompt + global hex + global det_file + global target_sizeof_int + global target_sizeof_long + global target_bigendian_p + + delete_breakpoints + + gdb_breakpoint call5a + gdb_breakpoint call5b + + # Run; should stop at call5a and print actual arguments. + # Try dereferencing the arguments. + + # The a29k fails all of these tests, perhaps because the prologue + # code is broken. + setup_xfail "a29k-*-udi" + gdb_run_cmd + gdb_expect { + -re ".* call5a \\(st=\{s1 = 101, s2 = 102\}\\) .*$gdb_prompt $" { + pass "run to call5a" + } + -re "$gdb_prompt $" { fail "run to call5a" ; gdb_suppress_tests; } + timeout { fail "(timeout) run to call5a" ; gdb_suppress_tests; } + } + + gdb_test "print st" ".* = \{s1 = 101, s2 = 102\}" + + # Continue; should stop at call5b and print actual arguments. + if { $target_sizeof_long == $target_sizeof_int } { + gdb_test "cont" ".* call5b \\(un=\{u1 = 2, u2 = 2\}\\) .*" \ + "continue to call5b (sizeof long == sizeof int)" + } elseif { ! $target_bigendian_p } { + gdb_test "cont" ".* call5b \\(un=\{u1 = 2, u2 = 2\}\\) .*" \ + "continue to call5b (little-endian, sizeof long != sizeof int)" + } elseif { $target_sizeof_long == 8 && $target_sizeof_int == 4 } { + gdb_test "cont" ".* call5b \\(un=\{u1 = 2, u2 = 8589934592\}\\) .*" \ + "continue to call5b (big-endian, sizeof long == 8, sizeof int = 4)" + } elseif { $target_sizeof_long == 4 && $target_sizeof_int == 2 } { + gdb_test "cont" ".* call5b \\(un=\{u1 = 2, u2 = 131072\}\\) .*" \ + "continue to call5b (big-endian, sizeof long == 4, sizeof int = 2)" + } else { + fail "continue to call5b (unknown case)" + } + + # Try dereferencing the arguments. + if { $target_sizeof_long == $target_sizeof_int } { + gdb_test "print un" ".* = \{u1 = 2, u2 = 2\}" \ + "print un (sizeof long == sizeof int)" + } elseif { ! $target_bigendian_p } { + gdb_test "print un" ".* = \{u1 = 2, u2 = 2\}" \ + "print un (little-endian, sizeof long != sizeof int)" + } elseif { $target_sizeof_long == 8 && $target_sizeof_int == 4 } { + gdb_test "print un" ".* = \{u1 = 2, u2 = 8589934592\}" \ + "print un (big-endian, sizeof long == 8, sizeof int = 4)" + } elseif { $target_sizeof_long == 4 && $target_sizeof_int == 2 } { + gdb_test "print un" ".* = \{u1 = 2, u2 = 131072\}" \ + "print un (big-endian, sizeof long == 4, sizeof int = 2)" + } else { + fail "print un (unknown case)" + } + + gdb_stop_suppressing_tests; +} + +# +# Locate actual args; discard, shuffle, and call +# + +proc discard_and_shuffle {} { + global gdb_prompt + global hex + global decimal + global det_file + global gcc_compiled + + delete_breakpoints + + gdb_breakpoint call6a + gdb_breakpoint call6b + gdb_breakpoint call6c + gdb_breakpoint call6d + gdb_breakpoint call6e + gdb_breakpoint call6f + gdb_breakpoint call6g + gdb_breakpoint call6h + + # Run; should stop at call6a and print actual arguments. + # Print backtrace. + + # The a29k fails all of these tests, perhaps because the prologue + # code is broken. + setup_xfail "a29k-*-udi" + gdb_run_cmd + gdb_expect { + -re ".*Breakpoint $decimal, call6a .*$gdb_prompt $" { pass "run to call6a" } + -re "$gdb_prompt $" { fail "run to call6a" ; gdb_suppress_tests; } + timeout { fail "(timeout) run to call6a" ; gdb_suppress_tests; } + } + + setup_xfail "rs6000-*-*" + + if {!$gcc_compiled} { + setup_xfail "mips-sgi-irix5*" + } + + if [gdb_test "backtrace 100" " call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6a"] { + gdb_suppress_tests; + } + + # Continue; should stop at call6b and print actual arguments. + # Print backtrace. + + gdb_continue call6b + + if [gdb_test "backtrace 100" " call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6b"] { + gdb_suppress_tests; + } + + # Continue; should stop at call6c and print actual arguments. + # Print backtrace. + + gdb_continue call6c + + if [gdb_test "backtrace 100" " call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6c"] { + gdb_suppress_tests; + } + # Continue; should stop at call6d and print actual arguments. + # Print backtrace. + + gdb_continue call6d + + if [gdb_test "backtrace 100" " call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6d"] { + gdb_suppress_tests; + } + + # Continue; should stop at call6e and print actual arguments. + # Print backtrace. + + gdb_continue call6e + + if [gdb_test "backtrace 100" " call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6e"] { + gdb_suppress_tests; + } + + # Continue; should stop at call6f and print actual arguments. + # Print backtrace. + + gdb_continue call6f + + if [gdb_test "backtrace 100" " call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6f"] { + gdb_suppress_tests; + } + + # Continue; should stop at call6g and print actual arguments. + # Print backtrace. + + gdb_continue call6g + + if [gdb_test "backtrace 100" " call6g \\(uc=98 'b', us=6, ui=7, ul=8\\).* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6g"] { + gdb_suppress_tests; + } + + # Continue; should stop at call6h and print actual arguments. + # Print backtrace. + + gdb_continue call6h + + if [gdb_test "backtrace 100" " call6h \\(us=6, ui=7, ul=8\\).* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\).* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6h"] { + gdb_suppress_tests; + } + + # monitor only allows 8 breakpoints; w89k board allows 10, so + # break them up into two groups. + delete_breakpoints + gdb_breakpoint call6i + gdb_breakpoint call6j + gdb_breakpoint call6k + + # Continue; should stop at call6i and print actual arguments. + # Print backtrace. + + gdb_continue call6i + + if [gdb_test "backtrace 100" " call6i \\(ui=7, ul=8\\).* call6h \\(us=6, ui=7, ul=8\\).* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\).* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6i"] { + gdb_suppress_tests; + } + + # Continue; should stop at call6j and print actual arguments. + # Print backtrace. + + gdb_continue call6j + + if [gdb_test "backtrace 100" " call6j \\(ul=8\\).* call6i \\(ui=7, ul=8\\).* call6h \\(us=6, ui=7, ul=8\\).* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\).* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6j"] { + gdb_suppress_tests; + } + + # Continue; should stop at call6k and print actual arguments. + # Print backtrace. + # This fails on i960-*-vxworks because gdb gets confused by + # breakpoints on adjacent instructions. + setup_xfail "i960-*-vxworks" 1786 + gdb_continue call6k + + if [gdb_test "backtrace 100" " call6k \\(\\).* call6j \\(ul=8\\).* call6i \\(ui=7, ul=8\\).* call6h \\(us=6, ui=7, ul=8\\).* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\).* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\).* main \\(.*\\).*" "backtrace from call6k"] { + gdb_suppress_tests; + } + gdb_stop_suppressing_tests; +} + + +# +# Locate actual args; shuffle round robin and call +# + +proc shuffle_round_robin {} { + global gdb_prompt + global hex + global decimal + global det_file + global gcc_compiled + + delete_breakpoints + + gdb_breakpoint call7a + gdb_breakpoint call7b + gdb_breakpoint call7c + gdb_breakpoint call7d + gdb_breakpoint call7e + gdb_breakpoint call7f + gdb_breakpoint call7g + gdb_breakpoint call7h + + # Run; should stop at call7a and print actual arguments. + # Print backtrace. + + # The a29k fails all of these tests, perhaps because the prologue + # code is broken. + setup_xfail "a29k-*-udi" + gdb_run_cmd + gdb_expect { + -re ".*Breakpoint $decimal, call7a .*$gdb_prompt $" { + pass "run to call7a" + } + -re "$gdb_prompt $" { fail "run to call7a" ; gdb_suppress_tests; } + timeout { fail "(timeout) run to call7a" ; gdb_suppress_tests; } + } + + setup_xfail "i960-*-*" 1813 + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "mips-sgi-irix5*" } + gdb_test "backtrace 100" " call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7a" + + # Continue; should stop at call7b and print actual arguments. + # Print backtrace. + + gdb_continue call7b + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + + gdb_test "backtrace 100" " call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7b" + + # Continue; should stop at call7c and print actual arguments. + # Print backtrace. + + gdb_continue call7c + + gdb_test "backtrace 100" " call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\).* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7c" + + # Continue; should stop at call7d and print actual arguments. + # Print backtrace. + + gdb_continue call7d + + gdb_test "backtrace 100" " call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\).* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\).* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7d" + + gdb_continue call7e + + gdb_test "backtrace 100" " call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\).* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\).* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\).* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7e" + + # Continue; should stop at call7f and print actual arguments. + # Print backtrace. + + gdb_continue call7f + + gdb_test "backtrace 100" " call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\).* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\).* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\).* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\).* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7f" + + # Continue; should stop at call7g and print actual arguments. + # Print backtrace. + + gdb_continue call7g + + gdb_test "backtrace 100" " call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\).* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\).* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\).* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\).* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\).* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7g" + + gdb_continue call7h + + gdb_test "backtrace 100" " call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\).* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\).* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\).* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\).* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\).* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\).* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7h" + + # monitor only allows 8 breakpoints; w89k board allows 10, so + # break them up into two groups. + delete_breakpoints + gdb_breakpoint call7i + gdb_breakpoint call7j + gdb_breakpoint call7k + + # Continue; should stop at call7i and print actual arguments. + # Print backtrace. + + gdb_continue call7i + + gdb_test "backtrace 100" " call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\).* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\).* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\).* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\).* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\).* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\).* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\).* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7i" + + # Continue; should stop at call7j and print actual arguments. + # Print backtrace. + + gdb_continue call7j + + gdb_test "backtrace 100" " call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\).* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\).* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\).* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\).* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\).* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\).* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\).* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\).* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7j" + + # Continue; should stop at call7k and print actual arguments. + # Print backtrace. + + gdb_continue call7k + + if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" } + gdb_test "backtrace 100" " call7k \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\).* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\).* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\).* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\).* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\).* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\).* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\).* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\).* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\).* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\).* main \\(.*\\).*" "backtrace from call7k" + gdb_stop_suppressing_tests; +} + +# +# Locate actual args; recursive passing of structs by value +# + +proc recursive_structs_by_value {} { + global gdb_prompt + global hex + global decimal + global det_file + + delete_breakpoints + + gdb_breakpoint hitbottom + + # Run; should stop at hitbottom and print actual arguments. + # Print backtrace. + gdb_run_cmd + gdb_expect { + -re ".*Breakpoint $decimal, hitbottom .*$gdb_prompt $" { pass "run to hitbottom" } + -re "$gdb_prompt $" { fail "run to hitbottom" ; gdb_suppress_tests; } + timeout { fail "(timeout) run to hitbottom" ; gdb_suppress_tests; } + } + + if ![istarget sparclet-*-*] { + # The a29k fails all of these tests, perhaps because the prologue + # code is broken. + setup_xfail "a29k-*-udi" + gdb_test "backtrace 100" " hitbottom \\(\\).* recurse \\(a=\{s = 0, i = 0, l = 0\}, depth=0\\).* recurse \\(a=\{s = 1, i = 1, l = 1\}, depth=1\\).* recurse \\(a=\{s = 2, i = 2, l = 2\}, depth=2\\).* recurse \\(a=\{s = 3, i = 3, l = 3\}, depth=3\\).* recurse \\(a=\{s = 4, i = 4, l = 4\}, depth=4\\).* test_struct_args \\(\\).* main \\(.*\\).*" "recursive passing of structs by value" + } else { + fail "recursive passing of structs by value (sparclet)" + } + gdb_stop_suppressing_tests; +} + +proc funcargs_reload { } { + global objdir + global subdir + global binfile + global srcdir + + if [istarget "mips-idt-*"] { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} + } +} + +# +# Test for accessing local stack variables in functions which call alloca +# +proc localvars_after_alloca { } { + global gdb_prompt + global hex + global decimal + global gcc_compiled + + if { ! [ runto localvars_after_alloca ] } then { gdb_suppress_tests; } + + # Print each arg as a double check to see if we can print + # them here as well as with backtrace. + + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "print c" " = 97 'a'" "print c after runto localvars_after_alloca" + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "print s" " = 1" "print s after runto localvars_after_alloca" + gdb_test "print i" " = 2" "print i after runto localvars_after_alloca" + gdb_test "print l" " = 3" "print l after runto localvars_after_alloca" + + # Lame regexp. + gdb_test "next" ".*" "next in localvars_after_alloca()" + + # Print each arg as a double check to see if we can print + # them here as well as with backtrace. + + gdb_test "print c" " = 97 'a'" "print c in localvars_after_alloca" + gdb_test "print s" " = 1" "print s in localvars_after_alloca" + gdb_test "print i" " = 2" "print i in localvars_after_alloca" + gdb_test "print l" " = 3" "print l in localvars_after_alloca" + + gdb_test "backtrace 8" "#0.*localvars_after_alloca \\(c=97 'a', s=1, i=2, l=3\\).*#1.*main.*" "backtrace after alloca" + gdb_stop_suppressing_tests; +} + +proc call_after_alloca { } { + global gdb_prompt + global hex + global decimal + global gcc_compiled + + if { ! [ runto call_after_alloca_subr ] } then { gdb_suppress_tests; } + + # Print each arg as a double check to see if we can print + # them here as well as with backtrace. + + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "print c" " = 97 'a'" "print c in call_after_alloca" + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "print s" " = 1" "print s in call_after_alloca" + gdb_test "print i" " = 2" "print i in call_after_alloca" + gdb_test "print l" " = 3" "print l in call_after_alloca" + + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "backtrace 8" "#0.*call_after_alloca_subr \\(c=97 'a', s=1, i=2, l=3, uc=98 'b', us=11, ui=12, ul=13\\).*#1.*call_after_alloca \\(c=97 'a', s=1, i=2, l=3\\).*#2.*main.*" "backtrace from call_after_alloca_subr" + gdb_stop_suppressing_tests; +} + +# +# Test for accessing local stack variables, backtraces, finish, +# and finally stepping into indirect calls. The point is that on the PA +# these use a funky `dyncall' mechanism which GDB needs to know about. +# +proc localvars_in_indirect_call { } { + global gdb_prompt + global hex + global decimal + global gcc_compiled + + # Can not use "runto call0a" as call0a is called several times + # during single run. Instead stop in a marker function and + # take control from there. + if { ! [ runto marker_indirect_call ] } then { gdb_suppress_tests; } + + # break on the next call to call0a, then delete all the breakpoints + # and start testing. + gdb_breakpoint call0a + gdb_continue call0a + delete_breakpoints + + # Print each arg as a double check to see if we can print + # them here as well as with backtrace. + + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "print c" " = 97 'a'" "print c in localvars_in_indirect_call" + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "print s" " = 1" "print s in localvars_in_indirect_call" + gdb_test "print i" " = 2" "print i in localvars_in_indirect_call" + gdb_test "print l" " = 3" "print l in localvars_in_indirect_call" + + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "backtrace 8" \ + "#0.*call0a \\(c=97 'a', s=1, i=2, l=3\\).*#1.*main.*" \ + "backtrace in indirectly called function" + + # + # "finish" brings us back to main. We then will try to step through + # the second indirect call. + # On some targets (e.g. m68k) gdb will stop from the finish in midline + # of the first indirect call. This is due to stack adjustment instructions + # after the indirect call. In these cases we will step till we hit the + # second indirect call. + # + + send_gdb "finish\n" + gdb_expect { + -re "\\(\\*pointer_to_call0a\\) \\(c, s, i, l\\);.*First.*$gdb_prompt $" { + send_gdb "step\n" + exp_continue + } + -re "\\(\\*pointer_to_call0a\\) \\(c, s, i, l\\);.*Second.*$gdb_prompt $" { + pass "finish from indirectly called function" + } + -re ".*$gdb_prompt $" { + fail "finish from indirectly called function" + gdb_suppress_tests; + } + default { fail "finish from indirectly called function" ; gdb_suppress_tests; } + } + + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "step" "call0a \\(c=97 'a', s=1, i=2, l=3\\).*" \ + "stepping into indirectly called function" + gdb_stop_suppressing_tests; +} + +# +# Test for stepping into indirect calls which may have trampolines (possibly +# cascaded) on both the call path and the gdb_suppress_tests; path. +# to handle trampolines. +# +proc test_stepping_over_trampolines { } { + global gdb_prompt + global hex + global decimal + + # Stop in a marker function and take control from there. + if { ! [ runto marker_call_with_trampolines ] } then { gdb_suppress_tests; } + + # Cater for gdb stopping in midline, see comment for finish above. + send_gdb "finish\n" + gdb_expect { + -re "marker_call_with_trampolines ..;.*$gdb_prompt $" { + send_gdb "step\n" + exp_continue + } + -re "pointer_to_call_with_trampolines.*$gdb_prompt $" { + pass "finish from marker_call_with_trampolines" + } + -re ".*$gdb_prompt $" { + fail "finish from marker_call_with_trampolines" + } + default { fail "finish from marker_call_with_trampolines" ; gdb_suppress_tests; } + } + + # Try to step into the target function. + gdb_test "step" "call_with_trampolines \\(d1=5\\).*" \ + "stepping into function called with trampolines" + + # Make we can backtrace and the argument looks correct. */ + gdb_test "backtrace 8" "#0.*call_with_trampolines \\(d1=5\\).*1.*main.*" \ + "backtrace through call with trampolines" + + # Make sure we can get back to main. + # Stepping back to main might stop again after the gdb_suppress_tests; statement + # or immediately transfer control back to main if optimizations + # are performed. + send_gdb "step\n" + gdb_expect { + -re "main .* at.*$gdb_prompt $" { + pass "stepping back to main from function called with trampolines" ; + } + -re "\}.*End of call_with_trampolines.*$gdb_prompt $" { + send_gdb "step\n" + exp_continue + } + -re ".*$gdb_prompt $" { + fail "stepping back to main from function called with trampolines" + } + default { fail "stepping back to main from function called with trampolines" ; gdb_suppress_tests; } + } + gdb_stop_suppressing_tests; +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if [istarget "mips*tx39-*"] { + set timeout 300 +} elseif [istarget "hppa*-hp-hpux*"] then { + set timeout 240 +} else { + set timeout 60 +} + +# Determine expected output for unsigned long variables, +# the output varies with sizeof (unsigned long). + +set target_sizeof_long 4 +send_gdb "print sizeof (long)\n" +gdb_expect { + -re ".\[0-9\]* = 4.*$gdb_prompt $" { } + -re ".\[0-9\]* = 8.*$gdb_prompt $" { set target_sizeof_long 8 } + -re ".*$gdb_prompt $" { + fail "getting sizeof long" + } + default { fail "(timeout) getting sizeof long" } +} + +set target_sizeof_int 4 +send_gdb "print sizeof (int)\n" +gdb_expect { + -re ".\[0-9\]* = 2.*$gdb_prompt $" { set target_sizeof_int 2 } + -re ".\[0-9\]* = 4.*$gdb_prompt $" { } + -re ".\[0-9\]* = 8.*$gdb_prompt $" { set target_sizeof_int 8 } + -re ".*$gdb_prompt $" { + fail "getting sizeof unsigned long" + } + default { fail "(timeout) getting sizeof int" } +} + +set target_bigendian_p 1 +send_gdb "show endian\n" +gdb_expect { + -re ".*little endian.*$gdb_prompt $" { set target_bigendian_p 0 } + -re ".*big endian.*$gdb_prompt $" { } + -re ".*$gdb_prompt $" { + fail "getting target endian" + } + default { fail "(timeout) getting target endian" } +} + +# Perform tests + +integral_args +funcargs_reload +unsigned_integral_args +funcargs_reload +float_and_integral_args +funcargs_reload +pointer_args +funcargs_reload +structs_by_reference +funcargs_reload +structs_by_value +funcargs_reload +discard_and_shuffle +funcargs_reload +shuffle_round_robin +funcargs_reload +recursive_structs_by_value +funcargs_reload +localvars_after_alloca +funcargs_reload +call_after_alloca +funcargs_reload +localvars_in_indirect_call +funcargs_reload +test_stepping_over_trampolines diff --git a/gdb/testsuite/gdb.base/gdbvars.exp b/gdb/testsuite/gdb.base/gdbvars.exp new file mode 100644 index 00000000000..2ab37e0222f --- /dev/null +++ b/gdb/testsuite/gdb.base/gdbvars.exp @@ -0,0 +1,117 @@ +# Copyright (C) 1992, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +proc test_convenience_variables {} { + global gdb_prompt + + gdb_test "set \$foo = 101" "" \ + "Set a new convenience variable" + + gdb_test "print \$foo" " = 101" \ + "Print contents of new convenience variable" + + gdb_test "set \$foo = 301" "" \ + "Set convenience variable to a new value" + + gdb_test "print \$foo" " = 301" \ + "Print new contents of convenience variable" + + gdb_test "set \$_ = 11" "" \ + "Set convenience variable \$_" + + gdb_test "print \$_" " = 11" \ + "Print contents of convenience variable \$_" + + gdb_test "print \$foo + 10" " = 311" \ + "Use convenience variable in arithmetic expression" + + gdb_test "print (\$foo = 32) + 4" " = 36" \ + "Use convenience variable assignment in arithmetic expression" + + gdb_test "print \$bar" " = void" \ + "Print contents of uninitialized convenience variable" +} + +proc test_value_history {} { + global gdb_prompt + + gdb_test "print 101" "\\\$1 = 101" \ + "Set value-history\[1\] using \$1" + + gdb_test "print 102" "\\\$2 = 102" \ + "Set value-history\[2\] using \$2" + + gdb_test "print 103" "\\\$3 = 103" \ + "Set value-history\[3\] using \$3" + + gdb_test "print \$\$" "\\\$4 = 102" \ + "Print value-history\[MAX-1\] using inplicit index \$\$" + + gdb_test "print \$\$" "\\\$5 = 103" \ + "Print value-history\[MAX-1\] again using implicit index \$\$" + + gdb_test "print \$" "\\\$6 = 103" \ + "Print value-history\[MAX\] using implicit index \$" + + gdb_test "print \$\$2" "\\\$7 = 102" \ + "Print value-history\[MAX-2\] using explicit index \$\$2" + + gdb_test "print \$0" "\\\$8 = 102" \ + "Print value-history\[MAX\] using explicit index \$0" + + gdb_test "print 108" "\\\$9 = 108" "" + + gdb_test "print \$\$0" "\\\$10 = 108" \ + "Print value-history\[MAX\] using explicit index \$\$0" + + gdb_test "print \$1" "\\\$11 = 101" \ + "Print value-history\[1\] using explicit index \$1" + + gdb_test "print \$2" "\\\$12 = 102" \ + "Print value-history\[2\] using explicit index \$2" + + gdb_test "print \$3" "\\\$13 = 103" \ + "Print value-history\[3\] using explicit index \$3" + + gdb_test "print \$-3" "\\\$14 = 100" \ + "Print (value-history\[MAX\] - 3) using implicit index \$" + + gdb_test "print \$1 + 3" "\\\$15 = 104" \ + "Use value-history element in arithmetic expression" +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +send_gdb "set print sevenbit-strings\n" ; gdb_expect -re ".*$gdb_prompt $" + +test_value_history +test_convenience_variables diff --git a/gdb/testsuite/gdb.base/grbx.c b/gdb/testsuite/gdb.base/grbx.c new file mode 100644 index 00000000000..92f732344a3 --- /dev/null +++ b/gdb/testsuite/gdb.base/grbx.c @@ -0,0 +1,10 @@ +static int grbxx __attribute__ ((section (".data03"))) = 'g' + 'r' + 'b' + 'x'; + +int grbx (int x) +{ + if (x) + return grbxx; + else + return 0; +} + diff --git a/gdb/testsuite/gdb.base/help.exp b/gdb/testsuite/gdb.base/help.exp new file mode 100644 index 00000000000..54bfdb10c68 --- /dev/null +++ b/gdb/testsuite/gdb.base/help.exp @@ -0,0 +1,542 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1997, 1998 +# 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +# +# test gdb help commands +# + +set prms_id 0 +set bug_id 0 + +gdb_start + +# force the height of the debugger to be pretty large so no pagers getused +gdb_test "set height 400" "" "test set height" + +# use a larger expect input buffer for long help outputs. +# test help add-symbol-file +gdb_test "help add-symbol-file" "Usage: add-symbol-file FILE ADDR.*\[\r\n\]+Load the symbols from FILE, assuming FILE has been dynamically loaded..*\[\r\n\]+ADDR is the starting address of the file\'s text." "help add-symbol-file" +# test help aliases +gdb_test "help aliases" "Aliases of other commands..*\[\r\n\]+List of commands\:.*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help aliases" +gdb_test "help attach" "Attach to a process or file outside of GDB..*\[\r\n\]+This command attaches to another target, of the same type as your last.*\[\r\n\]+\"target\" command .\"info files\" will show your target stack.*\[\r\n\]+The command may take as argument a process id or a device file..*\[\r\n\]+For a process id, you must have permission to send the process a signal,.*\[\r\n\]+and it must have the same effective uid as the debugger..*\[\r\n\]+When using \"attach\" with a process id, the debugger finds the.*\[\r\n\]+program running in the process, looking first in the current working.*\[\r\n\]+directory, or .if not found there. using the source file search path.*\[\r\n\]+\\(see the \"directory\" command\\). You can also use the \"file\" command.*\[\r\n\]+to specify the program, and to load its symbol table." "help attach" +# test help breakpoint "b" abbreviation +gdb_test "help b" "Set breakpoint at specified line or function..*\[\r\n\]+Argument may be line number, function name, or \"\[*\]\" and an address..*\[\r\n\]+If line number is specified, break at start of code for that line..*\[\r\n\]+If function is specified, break at start of code for that function..*\[\r\n\]+If an address is specified, break at that exact address..*\[\r\n\]+With no arg, uses current execution address of selected stack frame..*\[\r\n\]+This is useful for breaking on return to a stack frame..*\[\r\n\]+Multiple breakpoints at one place are permitted, and useful if conditional..*\[\r\n\]+Do \"help breakpoints\" for info on other commands dealing with breakpoints." "help breakpoint \"b\" abbreviation" +# test help breakpoint "br" abbreviation +gdb_test "help br" "Set breakpoint at specified line or function..*\[\r\n\]+Argument may be line number, function name, or \"\[*\]\" and an address..*\[\r\n\]+If line number is specified, break at start of code for that line..*\[\r\n\]+If function is specified, break at start of code for that function..*\[\r\n\]+If an address is specified, break at that exact address..*\[\r\n\]+With no arg, uses current execution address of selected stack frame..*\[\r\n\]+This is useful for breaking on return to a stack frame..*\[\r\n\]+Multiple breakpoints at one place are permitted, and useful if conditional..*\[\r\n\]+Do \"help breakpoints\" for info on other commands dealing with breakpoints." "help breakpoint \"br\" abbreviation" +# test help breakpoint "bre" abbreviation +gdb_test "help bre" "Set breakpoint at specified line or function..*\[\r\n\]+Argument may be line number, function name, or \"\[*\]\" and an address..*\[\r\n\]+If line number is specified, break at start of code for that line..*\[\r\n\]+If function is specified, break at start of code for that function..*\[\r\n\]+If an address is specified, break at that exact address..*\[\r\n\]+With no arg, uses current execution address of selected stack frame..*\[\r\n\]+This is useful for breaking on return to a stack frame..*\[\r\n\]+Multiple breakpoints at one place are permitted, and useful if conditional..*\[\r\n\]+Do \"help breakpoints\" for info on other commands dealing with breakpoints." "help breakpoint \"bre\" abbreviation" +# test help breakpoint "brea" abbreviation +gdb_test "help brea" "Set breakpoint at specified line or function..*\[\r\n\]+Argument may be line number, function name, or \"\[*\]\" and an address..*\[\r\n\]+If line number is specified, break at start of code for that line..*\[\r\n\]+If function is specified, break at start of code for that function..*\[\r\n\]+If an address is specified, break at that exact address..*\[\r\n\]+With no arg, uses current execution address of selected stack frame..*\[\r\n\]+This is useful for breaking on return to a stack frame..*\[\r\n\]+Multiple breakpoints at one place are permitted, and useful if conditional..*\[\r\n\]+Do \"help breakpoints\" for info on other commands dealing with breakpoints." "help breakpoint \"brea\" abbreviation" +# test help breakpoint "break" abbreviation +gdb_test "help break" "Set breakpoint at specified line or function..*\[\r\n\]+Argument may be line number, function name, or \"\[*\]\" and an address..*\[\r\n\]+If line number is specified, break at start of code for that line..*\[\r\n\]+If function is specified, break at start of code for that function..*\[\r\n\]+If an address is specified, break at that exact address..*\[\r\n\]+With no arg, uses current execution address of selected stack frame..*\[\r\n\]+This is useful for breaking on return to a stack frame..*\[\r\n\]+Multiple breakpoints at one place are permitted, and useful if conditional..*\[\r\n\]+Do \"help breakpoints\" for info on other commands dealing with breakpoints." "help breakpoint \"break\" abbreviation" +# test help breakpoints +gdb_test "help breakpoints" "Making program stop at certain points..*\[\r\n\]+List of commands\:.*\[\r\n\]+awatch -- Set a watchpoint for an expression.*\[\r\n\]+break -- Set breakpoint at specified line or function.*\[\r\n\]+catch -- Set catchpoints to catch events.*\[\r\n\]+clear -- Clear breakpoint at specified line or function.*\[\r\n\]+commands -- Set commands to be executed when a breakpoint is hit.*\[\r\n\]+condition -- Specify breakpoint number N to break only if COND is true.*\[\r\n\]+delete -- Delete some breakpoints or auto-display expressions.*\[\r\n\]+disable -- Disable some breakpoints.*\[\r\n\]+enable -- Enable some breakpoints.*\[\r\n\]+hbreak -- Set a hardware assisted breakpoint.*\[\r\n\]+ignore -- Set ignore-count of breakpoint number N to COUNT.*\[\r\n\]+rwatch -- Set a read watchpoint for an expression.*\[\r\n\]+tbreak -- Set a temporary breakpoint.*\[\r\n\]+tcatch -- Set temporary catchpoints to catch events.*\[\r\n\]+thbreak -- Set a temporary hardware assisted breakpoint.*\[\r\n\]+watch -- Set a watchpoint for an expression.*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help breakpoints" +# test help backtrace "bt" abbreviation +gdb_test "help bt" "Print backtrace of all stack frames, or innermost COUNT frames..*\[\r\n\]+With a negative argument, print outermost -COUNT frames..*\[\r\n\]+Use of the 'full' qualifier also prints the values of the local variables." "help backtrace \"bt\" abbreviation" +# test help backtrace +gdb_test "help backtrace" "Print backtrace of all stack frames, or innermost COUNT frames..*\[\r\n\]+With a negative argument, print outermost -COUNT frames..*\[\r\n\]+Use of the 'full' qualifier also prints the values of the local variables." "help backtrace" +# test help continue "c" abbreviation +gdb_test "help c" "Continue program being debugged.*" "help continue \"c\" abbreviation" +# test help continue +gdb_test "help continue" "Continue program being debugged.*" "help continue" +# test help call +gdb_test "help call" "Call a function.*" "help call" +# test help catch +gdb_test "help catch" "Set catchpoints to catch events.*Raised signals may be caught:.*catch signal.*all signals.*catch signal.*signame.*a particular signal.*Raised exceptions may be caught:.*catch throw.*all exceptions, when thrown.*catch throw.*exceptname.*a particular exception, when thrown.*catch catch.*all exceptions, when caught.*catch catch.*exceptname.*a particular exception, when caught.*Thread or process events may be caught:.*catch thread_start.*any threads, just after creation.*catch thread_exit.*any threads, just before expiration.*catch thread_join.*any threads, just after joins.*catch start.*any processes, just after creation.*catch exit.*any processes, just before expiration.*catch fork.*calls to fork.*catch vfork.*calls to vfork.*catch exec.*calls to exec.*Dynamically.linked library events may be caught:.*catch load.*loads of any library.*catch load.*libname.*loads of a particular library.*catch unload.*unloads of any library.*catch unload.*libname.*unloads of a particular library.*The act of your program's execution stopping may also be caught:.*catch stop.*Do.*help set follow-fork-mode.*for info on debugging your program.*after a fork or vfork is caught.*Do.*help breakpoints.*for info on other commands dealing with breakpoints." "help catch" +# test help cd +gdb_test "help cd" "Set working directory to DIR for debugger and program being debugged..*\[\r\n\]+The change does not take effect for the program being debugged.*\[\r\n\]+until the next time it is started." "help cd" +# test help clear +gdb_test "help clear" "Clear breakpoint at specified line or function.*\[\r\n\]+Argument may be line number, function name, or .* and an address.*\[\r\n\]+If line number is specified, all breakpoints in that line are cleared.*\[\r\n\]+If function is specified, breakpoints at beginning of function are cleared.*\[\r\n\]+If an address is specified, breakpoints at that address are cleared.*\[\r\n\]+With no argument, clears all breakpoints in the line that the selected frame.*\[\r\n\]+is executing in..*\[\r\n\]+See also the \"delete\" command which clears breakpoints by number." "help clear" +# test help commands +gdb_test "help commands" "Set commands to be executed when a breakpoint is hit..*\[\r\n\]+Give breakpoint number as argument after \"commands\"..*\[\r\n\]+With no argument, the targeted breakpoint is the last one set..*\[\r\n\]+The commands themselves follow starting on the next line..*\[\r\n\]+Type a line containing \"end\" to indicate the end of them..*\[\r\n\]+Give \"silent\" as the first line to make the breakpoint silent;.*\[\r\n\]+then no output is printed when it is hit, except what the commands print." "help commands" +# test help condition +gdb_test "help condition" "Specify breakpoint number N to break only if COND is true..*\[\r\n\]+Usage is `condition N COND', where N is an integer and COND is an.*\[\r\n\]+expression to be evaluated whenever breakpoint N is reached. " "help condition" +# test help core-file +gdb_test "help core-file" "Use FILE as core dump for examining memory and registers..*\[\r\n\]+No arg means have no core file. This command has been superseded by the.*\[\r\n\]+`target core' and `detach' commands." "help core-file" +# test help delete "d" abbreviation +gdb_test "help d" "Delete some breakpoints or auto-display expressions..*\[\r\n\]+Arguments are breakpoint numbers with spaces in between..*\[\r\n\]+To delete all breakpoints, give no argument..*\[\r\n\]+Also a prefix command for deletion of other GDB objects..*\[\r\n\]+The \"unset\" command is also an alias for \"delete\"..*\[\r\n\]+List of delete subcommands:.*\[\r\n\]+delete breakpoints -- Delete some breakpoints or auto-display expressions.*\[\r\n\]+delete display -- Cancel some expressions to be displayed when program stops.*\[\r\n\]+Type \"help delete\" followed by delete subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help delete \"d\" abbreviation" +# test help delete +gdb_test "help delete" "Delete some breakpoints or auto-display expressions..*\[\r\n\]+Arguments are breakpoint numbers with spaces in between..*\[\r\n\]+To delete all breakpoints, give no argument..*\[\r\n\]+Also a prefix command for deletion of other GDB objects..*\[\r\n\]+The \"unset\" command is also an alias for \"delete\"..*\[\r\n\]+List of delete subcommands:.*\[\r\n\]+delete breakpoints -- Delete some breakpoints or auto-display expressions.*\[\r\n\]+delete display -- Cancel some expressions to be displayed when program stops.*\[\r\n\]+Type \"help delete\" followed by delete subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help delete" +# test help data +gdb_test "help data" ".*\[\r\n\]+Examining data..*\[\r\n\]+List of commands:.*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help data" +# test help define +gdb_test "help define" "Define a new command.*" "help define" +# test help delete breakpoints +gdb_test "help delete breakpoints" "Delete some breakpoints or auto-display expressions..*\[\r\n\]+Arguments are breakpoint numbers with spaces in between..*\[\r\n\]+To delete all breakpoints, give no argument..*\[\r\n\]+This command may be abbreviated \"delete\"." "help delete breakpoints" +# test help delete display +gdb_test "help delete display" "Cancel some expressions to be displayed when program stops..*\[\r\n\]+Arguments are the code numbers of the expressions to stop displaying..*\[\r\n\]+No argument means cancel all automatic-display expressions..*\[\r\n\]+Do \"info display\" to see current list of code numbers." "help delete display" +# test help detach +gdb_test "help detach" "Detach a process or file previously attached.\[\r\n\]+If a process, it is no longer traced, and it continues its execution.\[ \r\n\]+If\[ \r\n\]+you were debugging a file, the file is closed and gdb no longer accesses it." "help detach" +# test help directory +gdb_test "help directory" "Add directory DIR to beginning of search path for source files..*\[\r\n\]+Forget cached info on source file locations and line positions..*\[\r\n\]+DIR can also be .cwd for the current working directory, or .cdir for the.*\[\r\n\]+directory in which the source file was compiled into object code..*\[\r\n\]+With no argument, reset the search path to .cdir:.cwd, the default." "help directory" +# test help disable "dis" abbreviation +gdb_test "help dis" "Disable some breakpoints..*\[\r\n\]+Arguments are breakpoint numbers with spaces in between..*\[\r\n\]+To disable all breakpoints, give no argument..*\[\r\n\]+A disabled breakpoint is not forgotten, but has no effect until reenabled..*\[\r\n\]+List of disable subcommands:.*\[\r\n\]+disable breakpoints -- Disable some breakpoints.*\[\r\n\]+disable display -- Disable some expressions to be displayed when program stops.*\[\r\n\]+Type \"help disable\" followed by disable subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help disable \"dis\" abbreviation" +# test help disable "disa" abbreviation +gdb_test "help disa" "Disable some breakpoints..*\[\r\n\]+Arguments are breakpoint numbers with spaces in between..*\[\r\n\]+To disable all breakpoints, give no argument..*\[\r\n\]+A disabled breakpoint is not forgotten, but has no effect until reenabled..*\[\r\n\]+List of disable subcommands:.*\[\r\n\]+disable breakpoints -- Disable some breakpoints.*\[\r\n\]+disable display -- Disable some expressions to be displayed when program stops.*\[\r\n\]+Type \"help disable\" followed by disable subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help disable \"disa\" abbreviation" +# test help disable +gdb_test "help disable" "Disable some breakpoints..*\[\r\n\]+Arguments are breakpoint numbers with spaces in between..*\[\r\n\]+To disable all breakpoints, give no argument..*\[\r\n\]+A disabled breakpoint is not forgotten, but has no effect until reenabled..*\[\r\n\]+List of disable subcommands:.*\[\r\n\]+disable breakpoints -- Disable some breakpoints.*\[\r\n\]+disable display -- Disable some expressions to be displayed when program stops.*\[\r\n\]+Type \"help disable\" followed by disable subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help disable" +# test help disable breakpoints +gdb_test "help disable breakpoints" "Disable some breakpoints..*\[\r\n\]+Arguments are breakpoint numbers with spaces in between..*\[\r\n\]+To disable all breakpoints, give no argument..*\[\r\n\]+A disabled breakpoint is not forgotten, but has no effect until reenabled..*\[\r\n\]+This command may be abbreviated \"disable\"." "help disable breakpoints" +# test help disable display +gdb_test "help disable display" "Disable some expressions to be displayed when program stops..*\[\r\n\]+Arguments are the code numbers of the expressions to stop displaying..*\[\r\n\]+No argument means disable all automatic-display expressions..*\[\r\n\]+Do \"info display\" to see current list of code numbers." "help disable display" +# test help disassemble +gdb_test "help disassemble" "Disassemble a specified section of memory..*\[\r\n\]+Default is the function surrounding the pc of the selected frame..*\[\r\n\]+With a single argument, the function surrounding that address is dumped..*\[\r\n\]+Two arguments are taken as a range of memory to dump." "help disassemble" +# test help display +gdb_test "help display" "Print value of expression EXP each time the program stops..*\[\r\n\]+/FMT may be used before EXP as in the \"print\" command..*\[\r\n\]+/FMT \"i\" or \"s\" or including a size-letter is allowed,.*\[\r\n\]+as in the \"x\" command, and then EXP is used to get the address to examine.*\[\r\n\]+and examining is done as in the \"x\" command..*\[\r\n\]+With no argument, display all currently requested auto-display expressions..*\[\r\n\]+Use \"undisplay\" to cancel display requests previously made." "help display" +# test help do +gdb_test "help do" "Select and print stack frame called by this one..*\[\r\n\]+An argument says how many frames down to go." "help do" +# test help document +gdb_test "help document" "Document a user-defined command..*\[\r\n\]+Give command name as argument. Give documentation on following lines..*\[\r\n\]+End with a line of just \"end\"." "help document" +# test help down +gdb_test "help down" "Select and print stack frame called by this one..*\[\r\n\]+An argument says how many frames down to go." "help down" +# test help down-silently +gdb_test "help down-silently" "Same as the `down' command, but does not print anything..*\[\r\n\]+This is useful in command scripts." "help down-silently" +# this command was removed from GDB 4.5.8 +# test help dump-me +#send_gdb "help dump-me" +# -re "Get fatal error; make debugger dump its core." +# +# } +# test help echo +gdb_test "help echo" "Print a constant string. Give string as argument..*\[\r\n\]+C escape sequences may be used in the argument..*\[\r\n\]+No newline is added at the end of the argument;.*\[\r\n\]+use \".n\" if you want a newline to be printed..*\[\r\n\]+Since leading and trailing whitespace are ignored in command arguments,.*\[\r\n\]+if you want to print some you must use \".\" before leading whitespace.*\[\r\n\]+to be printed or after trailing whitespace." "help echo" +# test help enable breakpoints delete +gdb_test "help enable breakpoints delete" "Enable breakpoints and delete when hit. Give breakpoint numbers..*\[\r\n\]+If a breakpoint is hit while enabled in this fashion, it is deleted." "help enable breakpoints delete" +# test help enable breakpoints once +gdb_test "help enable breakpoints once" "Enable breakpoints for one hit..*" "help enable breakpoints once" +# test help enable breakpoints +gdb_test "help enable breakpoints" "Enable some breakpoints..*\[\r\n\]+Give breakpoint numbers .separated by spaces. as arguments..*\[\r\n\]+This is used to cancel the effect of the \"disable\" command..*\[\r\n\]+May be abbreviated to simply \"enable\"..*.*\[\r\n\]+List of enable breakpoints subcommands:.*\[\r\n\]+enable breakpoints delete -- Enable breakpoints and delete when hit.*\[\r\n\]+enable breakpoints once -- Enable breakpoints for one hit.*\[\r\n\]+Type \"help enable breakpoints\" followed by enable breakpoints subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help enable breakpoints" +# test help enable delete +gdb_test "help enable delete" "Enable breakpoints and delete when hit. Give breakpoint numbers..*\[\r\n\]+If a breakpoint is hit while enabled in this fashion, it is deleted." "help enable delete" +# test help enable display +gdb_test "help enable display" "Enable some expressions to be displayed when program stops..*\[\r\n\]+Arguments are the code numbers of the expressions to resume displaying..*\[\r\n\]+No argument means enable all automatic-display expressions..*\[\r\n\]+Do \"info display\" to see current list of code numbers." "help enable display" +# test help enable once +gdb_test "help enable once" "Enable breakpoints for one hit.*" "help enable once" +# test help enable +gdb_test "help enable" "Enable some breakpoints..*\[\r\n\]+Give breakpoint numbers .separated by spaces. as arguments..*\[\r\n\]+With no subcommand, breakpoints are enabled until you command otherwise..*\[\r\n\]+This is used to cancel the effect of the \"disable\" command..*\[\r\n\]+With a subcommand you can enable temporarily..*\[\r\n\]+List of enable subcommands:.*\[\r\n\]+enable delete -- Enable breakpoints and delete when hit.*\[\r\n\]+enable display -- Enable some expressions to be displayed when program stops.*\[\r\n\]+enable once -- Enable breakpoints for one hit.*\[\r\n\]+Type \"help enable\" followed by enable subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help enable" +# test help exec-file +gdb_test "help exec-file" "Use FILE as program for getting contents of pure memory..*\[\r\n\]+If FILE cannot be found as specified, your execution directory path.*\[\r\n\]+is searched for a command of that name..*\[\r\n\]+No arg means have no executable file." "help exec-file" +# test help frame "f" abbreviation +gdb_test "help f" "Select and print a stack frame..*\[\r\n\]+With no argument, print the selected stack frame. .See also \"info frame\".*\[\r\n\]+An argument specifies the frame to select..*\[\r\n\]+It can be a stack frame number or the address of the frame..*\[\r\n\]+With argument, nothing is printed if input is coming from.*\[\r\n\]+a command file or a user-defined command." "help frame \"f\" abbreviation" +# test help frame +gdb_test "help frame" "Select and print a stack frame..*\[\r\n\]+With no argument, print the selected stack frame. .See also \"info frame\"...*\[\r\n\]+An argument specifies the frame to select..*\[\r\n\]+It can be a stack frame number or the address of the frame..*\[\r\n\]+With argument, nothing is printed if input is coming from.*\[\r\n\]+a command file or a user-defined command." "help frame" +# test help fg +gdb_test "help fg" "Continue program being debugged.*" "help fg" +# test help file +gdb_test "help file" "Use FILE as program to be debugged..*\[\r\n\]+It is read for its symbols, for getting the contents of pure memory,.*\[\r\n\]+and it is the program executed when you use the `run' command..*\[\r\n\]+If FILE cannot be found as specified, your execution directory path.*\[\r\n\]+..PATH. is searched for a command of that name..*\[\r\n\]+No arg means to have no executable file and no symbols." "help file" +# test help files +gdb_test "help files" "Specifying.*" "help files" +# test help finish +gdb_test "help finish" "Execute until selected stack frame returns..*\[\r\n\]+Upon return, the value returned is printed and put in the value history." "help finish" +# test help forward-search +gdb_test "help forward-search" "Search for regular expression .see regex.3.. from last line listed..*" "help forward-search" +# test help help "h" abbreviation +gdb_test "help h" "Print list of commands." "help help \"h\" abbreviation" +# test help help +gdb_test "help help" "Print list of commands." "help help" +# test help handle +gdb_test "help handle" "Specify how to handle a signal..*" "help handle" +# test help info "i" abbreviation +gdb_test "help i" "Generic command for showing things about the program being debugged..*\[\r\n\]+List of info subcommands:.*\[\r\n\]+Type \"help info\" followed by info subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help info \"i\" abbreviation" +# test help info +gdb_test "help info" "Generic command for showing things about the program being debugged..*\[\r\n\]+List of info subcommands:.*\[\r\n\]+Type \"help info\" followed by info subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help info" +# test help ignore +gdb_test "help ignore" "Set ignore-count of breakpoint number N to COUNT..*\[\r\n\]+Usage is `ignore N COUNT'." "help ignore" +# test help info address +gdb_test "help info address" "Describe where symbol SYM is stored." "help info address" +# test help info all-registers +gdb_test "help info all-registers" "List of all registers and their contents, for selected stack frame..*\[\r\n\]+Register name as argument means describe only that register." "help info all-registers" +# test help info args +gdb_test "help info args" "Argument variables of current stack frame." "help info args" +# test help info breakpoints +gdb_test "help info breakpoints" "Status of user-settable breakpoints, or breakpoint number NUMBER..*\[\r\n\]+breakpoint set." "help info breakpoints" +# test help info catch +gdb_test "help info catch" "Exceptions that can be caught in the current stack frame." "help info catch" +# test help info copying +gdb_test "help info copying" "Conditions for redistributing copies of GDB." "help info copying" +# test help info display +gdb_test "help info display" "Expressions to display when program stops, with code numbers." "help info display" +# test help info frame "f" abbreviation +gdb_test "help info f" "All about selected stack frame, or frame at ADDR." "help info frame \"f\" abbreviation" +# test help info frame +gdb_test "help info frame" "All about selected stack frame, or frame at ADDR." "help info frame" +# test help info files +gdb_test "help info files" "Names of targets and files being debugged..*\[\r\n\]+Shows the entire stack of targets currently in use .including the exec-file,.*\[\r\n\]+core-file, and process, if any., as well as the symbol file name." "help info files" +# test help info float +gdb_test "help info float" "Print the status of the floating point unit" "help info float" +# test help info functions +gdb_test "help info functions" "All function names, or those matching REGEXP." "help info functions" +# test help info line +gdb_test "help info line" "Core addresses of the code for a source line..*\[\r\n\]+Line can be specified as.*\[\r\n\]+ LINENUM, to list around that line in current file,.*\[\r\n\]+ FILE:LINENUM, to list around that line in that file,.*\[\r\n\]+ FUNCTION, to list around beginning of that function,.*\[\r\n\]+ FILE:FUNCTION, to distinguish among like-named static functions..*\[\r\n\]+Default is to describe the last source line that was listed..*\[\r\n\]+This sets the default address for \"x\" to the line's first instruction.*\[\r\n\]+so that \"x.i\" suffices to start examining the machine code..*\[\r\n\]+The address is also stored as the value of \"._\"." "help info line" +# test help info locals +gdb_test "help info locals" "Local variables of current stack frame." "help info locals" +# test help info program +gdb_test "help info program" "Execution status of the program." "help info program" +# test help info registers +gdb_test "help info registers" "List of integer registers and their contents, for selected stack frame..*\[\r\n\]+Register name as argument means describe only that register." "help info registers" +# test help info stack "s" abbreviation +gdb_test "help info s" "Backtrace of the stack, or innermost COUNT frames." "help info stack \"s\" abbreviation" +# test help info stack +gdb_test "help info stack" "Backtrace of the stack, or innermost COUNT frames." "help info stack" +# test help info set +gdb_test "help info set" "Show all GDB settings." "help info set" +# test help info signals +gdb_test "help info signals" "What debugger does when program gets various signals.*" "help info signals" +# test help info source +gdb_test "help info source" "Information about the current source file." "help info source" +# test help info sources +gdb_test "help info sources" "Source files in the program." "help info sources" +# test help info symbol +gdb_test "help info symbol" "Describe what symbol is at location ADDR.*" +# test help info target +gdb_test "help info target" "Names of targets and files being debugged..*\[\r\n\]+Shows the entire stack of targets currently in use .including the exec-file,.*\[\r\n\]+core-file, and process, if any., as well as the symbol file name." "help info target" +# test help info terminal +gdb_test "help info terminal" "Print inferior's saved terminal status." "help info terminal" +# test help info types +gdb_test "help info types" "All type names, or those matching REGEXP." "help info types" +# test help info variables +gdb_test "help info variables" "All global and static variable names, or those matching REGEXP." "help info variables" +# test help info warranty +gdb_test "help info warranty" "Various kinds of warranty you do not have." "help info warranty" +# test help info watchpoints +gdb_test "help info watchpoints" "Synonym for ``info breakpoints''." "help info watchpoints" +# test help inspect +gdb_test "help inspect" "Same as \"print\" command, except that if you are running in the epoch.*\[\r\n\]+environment, the value is printed in its own window." "help inspect" +# test help jump +gdb_test "help jump" "Continue program being debugged at specified line or address..*\[\r\n\]+Give as argument either LINENUM or \[*\]+ADDR, where ADDR is an expression.*\[\r\n\]+for an address to start at." "help jump" +# test help kill +gdb_test "help kill" "Kill execution of program being debugged." "help kill" +# test help list "l" abbreviation +gdb_test "help l" "List specified function or line..*\[\r\n\]+With no argument, lists ten more lines after or around previous listing..*\[\r\n\]+\"list -\" lists the ten lines before a previous ten-line listing..*\[\r\n\]+One argument specifies a line, and ten lines are listed around that line..*\[\r\n\]+Two arguments with comma between specify starting and ending lines to list..*\[\r\n\]+Lines can be specified in these ways:.*\[\r\n\]+ LINENUM, to list around that line in current file,.*\[\r\n\]+ FILE:LINENUM, to list around that line in that file,.*\[\r\n\]+ FUNCTION, to list around beginning of that function,.*\[\r\n\]+ FILE:FUNCTION, to distinguish among like-named static functions..*\[\r\n\]+ \[*\]+ADDRESS, to list around the line containing that address..*\[\r\n\]+With two args if one is empty it stands for ten lines away from the other arg." "help list \"l\" abbreviation" +# test help list +gdb_test "help list" "List specified function or line..*\[\r\n\]+With no argument, lists ten more lines after or around previous listing..*\[\r\n\]+\"list -\" lists the ten lines before a previous ten-line listing..*\[\r\n\]+One argument specifies a line, and ten lines are listed around that line..*\[\r\n\]+Two arguments with comma between specify starting and ending lines to list..*\[\r\n\]+Lines can be specified in these ways:.*\[\r\n\]+ LINENUM, to list around that line in current file,.*\[\r\n\]+ FILE:LINENUM, to list around that line in that file,.*\[\r\n\]+ FUNCTION, to list around beginning of that function,.*\[\r\n\]+ FILE:FUNCTION, to distinguish among like-named static functions..*\[\r\n\]+ \[*\]+ADDRESS, to list around the line containing that address..*\[\r\n\]+With two args if one is empty it stands for ten lines away from the other arg." "help list" +# test help load +gdb_test "help load" "Dynamically load FILE into the running program, and record its symbols.*\[\r\n\]+for access from GDB." "help load" +# test help make +gdb_test "help make" "Run the ``make'' program using the rest of the line as arguments." "help make" +# test help next "n" abbreviation +gdb_test "help n" "Step program, proceeding through subroutine calls..*\[\r\n\]+Like the \"step\" command as long as subroutine calls do not happen;.*\[\r\n\]+when they do, the call is treated as one instruction..*\[\r\n\]+Argument N means do this N times .or till program stops for another reason.." "help next \"n\" abbreviation" +# test help next +gdb_test "help next" "Step program, proceeding through subroutine calls..*\[\r\n\]+Like the \"step\" command as long as subroutine calls do not happen;.*\[\r\n\]+when they do, the call is treated as one instruction..*\[\r\n\]+Argument N means do this N times .or till program stops for another reason.." "help next" +# test help nexti +gdb_test "help ni" "Step one instruction, but proceed through subroutine calls..*\[\r\n\]+Argument N means do this N times .or till program stops for another reason.." "help nexti" +# all the commands that used to be here are now in "maintainance" instead +# test help obscure +gdb_test "help obscure" "Obscure features..*\[\r\n\]+List of commands:.*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help obscure" +# test help output +gdb_test "help output" "Like \"print\" but don't put in value history and don't print newline..*\[\r\n\]+This is useful in user-defined commands." "help output" +# test help overlay +gdb_test "help overlay" "Commands for debugging overlays.*" +gdb_test "help overlay off" "Disable overlay debugging." +gdb_test "help overlay manual" "Enable overlay debugging." +gdb_test "help overlay auto" "Enable automatic overlay debugging." +gdb_test "help overlay list" "List mappings of overlay sections." +gdb_test "help overlay map" "Assert that an overlay section is mapped." +gdb_test "help overlay unmap" "Assert that an overlay section is unmapped." +gdb_test "help overlay load" "Read the overlay mapping state from the target." +# test help print "p" abbreviation +gdb_test "help p" "Print value of expression EXP..*\[\r\n\]+Variables accessible are those of the lexical environment of the selected.*\[\r\n\]+EXP may be preceded with /FMT, where FMT is a format letter.*\[\r\n\]+but no count or size letter .see \"x\" command.." "help print \"p\" abbreviation" +# test help print +gdb_test "help print" "Print value of expression EXP..*\[\r\n\]+Variables accessible are those of the lexical environment of the selected.*\[\r\n\]+EXP may be preceded with /FMT, where FMT is a format letter.*\[\r\n\]+but no count or size letter .see \"x\" command.." "help print" +# test help path +gdb_test "help path" "Add directory DIR.s. to beginning of search path for object files..*\[\r\n\]+.cwd in the path means the current working directory..*\[\r\n\]+This path is equivalent to the .PATH shell variable. It is a list of.*\[\r\n\]+directories, separated by colons. These directories are searched to find.*\[\r\n\]+fully linked executable files and separately compiled object files as needed." "help path" +# test help printcmds +gdb_test "help printcmds" "Undefined command: \"printcmds\". Try \"help\"." "help printcmds" +# test help printf +gdb_test "help printf" "printf \"printf format string\", arg1, arg2, arg3, ..., argn.*\[\r\n\]+This is useful for formatted output in user-defined commands." "help printf" +# test help ptype +gdb_test "help ptype" "Print definition of type.*" "help ptype" +# test help pwd +gdb_test "help pwd" "Print working directory. This is used for your program as well." "help pwd" +# test help quit "q" abbreviation +gdb_test "help q" "Exit gdb." "help quit \"q\" abbreviation" +# test help quit +gdb_test "help quit" "Exit gdb." "help quit" +# test help run "r" abbreviation +gdb_test "help r" "Start debugged program. You may specify arguments to give it..*\[\r\n\]+Args may include .*, or .*; they are expanded using \"sh\"..*\[\r\n\]+Input and output redirection with \".\", \".\", or \"..\" are also allowed..*\[\r\n\]+With no arguments, uses arguments last specified .with \"run\" or \"set args\"...*\[\r\n\]+To cancel previous arguments and run with no arguments,.*\[\r\n\]+use \"set args\" without arguments." "help run \"r\" abbreviation" +# test help run +gdb_test "help run" "Start debugged program. You may specify arguments to give it..*\[\r\n\]+Args may include .*, or .*; they are expanded using \"sh\"..*\[\r\n\]+Input and output redirection with \".\", \".\", or \"..\" are also allowed..*\[\r\n\]+With no arguments, uses arguments last specified .with \"run\" or \"set args\"...*\[\r\n\]+To cancel previous arguments and run with no arguments,.*\[\r\n\]+use \"set args\" without arguments." "help run" +# test help rbreak +gdb_test "help rbreak" "Set a breakpoint for all functions matching REGEXP." "help rbreak" +# test help return +gdb_test "help return" "Make selected stack frame return to its caller..*\[\r\n\]+Control remains in the debugger, but when you continue.*\[\r\n\]+execution will resume in the frame above the one now selected..*\[\r\n\]+If an argument is given, it is an expression for the value to return." "help return" +# test help reverse-search +gdb_test "help reverse-search" "Search backward for regular expression .see regex.3.. from last line listed..*" "help reverse-search" +# test help running +gdb_test "help running" "Running the program..*\[\r\n\]+List of commands:.*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help running" +# test help step "s" abbreviation +gdb_test "help s" "Step program until it reaches a different source line..*\[\r\n\]+Argument N means do this N times .or till program stops for another reason.." "help step \"s\" abbreviation" +# test help step +gdb_test "help step" "Step program until it reaches a different source line..*\[\r\n\]+Argument N means do this N times .or till program stops for another reason.." "help step #1" +# test help search +gdb_test "help search" "Search for regular expression .see regex.3.. from last line listed..*" "help search" +# test help section +gdb_test "help section" "Change the base address of section SECTION of the exec file to ADDR..*\[\r\n\]+This can be used if the exec file does not contain section addresses,.*\[\r\n\]+.such as in the a.out format., or when the addresses specified in the.*\[\r\n\]+file itself are wrong. Each section must be changed separately. The.*\[\r\n\]+``info files'' command lists all the sections and their addresses." "help section" +#test help set annotate +gdb_test "help set annotate" "Set annotation_level.*\[\r\n\]+0 == normal; 1 == fullname \\(for use when running under emacs\\).*\[\r\n\]+2 == output annotated suitably for use by programs that control GDB." "help set annotate" +# test help set args +gdb_test "help set args" "Set argument list to give program being debugged when it is started..*\[\r\n\]+Follow this command with any number of args, to be passed to the program." +# test help set check "c" abbreviation +gdb_test "help set c" "Set the status of the type/range checker.*\[\r\n\]+List of set check subcommands:.*\[\r\n\]+set check range -- Set range checking.*\[\r\n\]+set check type -- Set type checking.*\[\r\n\]+Type \"help set check\" followed by set check subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help set check \"c\" abbreviation" +# test help set check "ch" abbreviation +gdb_test "help set ch" "Set the status of the type/range checker.*\[\r\n\]+List of set check subcommands:.*\[\r\n\]+set check range -- Set range checking.*\[\r\n\]+set check type -- Set type checking.*\[\r\n\]+Type \"help set check\" followed by set check subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help set check \"ch\" abbreviation" +# test help set check +gdb_test "help set check" "Set the status of the type/range checker.*\[\r\n\]+List of set check subcommands:.*\[\r\n\]+set check range -- Set range checking.*\[\r\n\]+set check type -- Set type checking.*\[\r\n\]+Type \"help set check\" followed by set check subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help set check" +# test help set check range +gdb_test "help set check range" "Set range checking. .on/warn/off/auto." "help set check range" +# test help set check type +gdb_test "help set check type" "Set type checking. .on/warn/off/auto." "help set check type" +# test help set complaints +gdb_test "help set complaints" "Set max number of complaints about incorrect symbols." "help set complaints" +# test help set confirm +gdb_test "help set confirm" "Set whether to confirm potentially dangerous operations." "help set confirm" +# test help set editing +gdb_test "help set editing" "Set editing of command lines as they are typed..*\[\r\n\]+Use \"on\" to enable the editing, and \"off\" to disable it..*\[\r\n\]+Without an argument, command line editing is enabled. To edit, use.*\[\r\n\]+EMACS-like or VI-like commands like control-P or ESC." "help set editing" +# test help set environment +gdb_test "help set environment" "Set environment variable value to give the program..*\[\r\n\]+Arguments are VAR VALUE where VAR is variable name and VALUE is value..*\[\r\n\]+VALUES of environment variables are uninterpreted strings..*\[\r\n\]+This does not affect the program until the next \"run\" command." "help set environment" +# test help set height +gdb_test "help set height" "Set number of lines gdb thinks are in a page." "help set height" +# test help set history expansion +gdb_test "help set history expansion" "Set history expansion on command input..*\[\r\n\]+Without an argument, history expansion is enabled." "help set history expansion" +# test help set history filename +gdb_test "help set history filename" "Set the filename in which to record the command history.*\[\r\n\]+ .the list of previous commands of which a record is kept.." "help set history filename" +# test help set history save +gdb_test "help set history save" "Set saving of the history record on exit..*\[\r\n\]+Use \"on\" to enable the saving, and \"off\" to disable it..*\[\r\n\]+Without an argument, saving is enabled." "help set history save" +# test help set history size +gdb_test "help set history size" "Set the size of the command history, .*\[\r\n\]+ie. the number of previous commands to keep a record of." "help set history size" +# test help set history +gdb_test "help set history" "Generic command for setting command history parameters..*\[\r\n\]+List of set history subcommands:.*\[\r\n\]+set history expansion -- Set history expansion on command input.*\[\r\n\]+set history filename -- Set the filename in which to record the command history.*\[\r\n\]+set history save -- Set saving of the history record on exit.*\[\r\n\]+set history size -- Set the size of the command history.*\[\r\n\]+Type \"help set history\" followed by set history subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help set history" +# test help set language +gdb_test "help set language" "Set the current source language." "help set language" +# test help set listsize +gdb_test "help set listsize" "Set number of source lines gdb will list by default." "help set listsize" +# test help set print "p" abbreviation +# FIXME -- Ultrix hangs randomly on this very long output from gdb and +# continues with its output only if something is sent to gdb. +# Also, if the system is slow, it may time out because the output is large. +gdb_test "help set p" ".*\[\r\n\]+Generic command for setting how things print..*\[\r\n\]+List of set print subcommands:.*\[\r\n\]+Type \"help set print\" followed by set print subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help set print \"p\" abbreviatio" +# test help set print "pr" abbreviation +gdb_test "help set pr" ".*\[\r\n\]+Generic command for setting how things print..*\[\r\n\]+List of set print subcommands:.*\[\r\n\]+Type \"help set print\" followed by set print subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help set print \"pr\" abbreviation" +# test help set print +gdb_test "help set print" ".*\[\r\n\]+Generic command for setting how things print..*\[\r\n\]+List of set print subcommands:.*\[\r\n\]+Type \"help set print\" followed by set print subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help set print" +# test help set print address +gdb_test "help set print address" "Set printing of addresses." "help set print address" +# test help set print array +gdb_test "help set print array" "Set prettyprinting of arrays." "help set print array" +# test help set print asm-demangle +gdb_test "help set print asm-demangle" "Set demangling of C\[+\]+ names in disassembly listings." "help set print asm-demangle" +# test help set print demangle +gdb_test "help set print demangle" "Set demangling of encoded C\[+\]+ names when displaying symbols." "help set print demangle" +# test help set print elements +gdb_test "help set print elements" "Set limit on string chars or array elements to print..*\[\r\n\]+\"set print elements 0\" causes there to be no limit." "help set print elements" +# test help set print object +gdb_test "help set print object" "Set printing of object's derived type based on vtable info." "help set print object" +# test help set print pretty +gdb_test "help set print pretty" "Set prettyprinting of structures." "help set print pretty" +# test help set print sevenbit-strings +gdb_test "help set print sevenbit-strings" "Set printing of 8-bit characters in strings as .nnn." "help set print sevenbit-strings" +# test help set print union +gdb_test "help set print union" "Set printing of unions interior to structures." "help set print union" +# test help set print vtbl +gdb_test "help set print vtbl" "Set printing of C\[+\]+ virtual function tables." "help set print vtbl" +# test help set prompt +gdb_test "help set prompt" "Set gdb's prompt" "help set prompt" +# test help set radix +gdb_test "help set radix" "Set default input and output number radices.*\[\r\n\]+Use \'set input-radix\' or \'set output-radix\' to independently set each..*\[\r\n\]+Without an argument, sets both radices back to the default value of 10..*\[\r\n\]+" "help set radix" +# test help set symbol-reloading +gdb_test "help set symbol-reloading" "Set dynamic symbol table reloading multiple times in one run." "help set symbol-reloading" +# test help set variable +gdb_test "help set variable" ".*\[\r\n\]+Evaluate expression EXP and assign result to variable VAR, using assignment.*\[\r\n\]+syntax appropriate for the current language .VAR = EXP or VAR := EXP for.*\[\r\n\]+example.. VAR may be a debugger \"convenience\" variable .names starting.*\[\r\n\]+with \\\$., a register .a few standard names starting with \\\$., or an actual.*\[\r\n\]+variable in the program being debugged. EXP is any valid expression.*\[\r\n\]+This may usually be abbreviated to simply \"set\"." "help set variable" +# test help set verbose +gdb_test "help set verbose" "Set verbosity." "help set verbose" +#test help set width +gdb_test "help set width" "Set number of characters gdb thinks are in a line." "help set width" +# test help set write +# This is only supported on targets which use exec.o. +gdb_test "help set write" "Set writing into executable and core files." "help set write" +# test help set +# FIXME -- Ultrix hangs randomly on this very long output from gdb and +# continues with its output only if something is sent to gdb. +# Also, if the system is slow, it may time out because the output is large. +#gdb_test "help set" ".*\[\r\n\]+Evaluate expression EXP and assign result to variable VAR, using assignment.*\[\r\n\]+syntax appropriate for the current language .VAR = EXP or VAR := EXP for.*\[\r\n\]+example.. VAR may be a debugger \"convenience\" variable .names starting.*\[\r\n\]+with \\\$., a register .a few standard names starting with \\\$., or an actual.*\[\r\n\]+variable in the program being debugged. EXP is any valid expression.*\[\r\n\]+set listsize -- Set number of source lines gdb will list by default.*\[\r\n\]+Type \"help set\" followed by set subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous..*\[\r\n\]+" "help set" +# test help shell +gdb_test "help shell" "Execute the rest of the line as a shell command. .*\[\r\n\]+With no arguments, run an inferior shell." "help shell" +#test help show annotate +gdb_test "help show annotate" "Show annotation_level.*\[\r\n\]+0 == normal; 1 == fullname \\(for use when running under emacs\\).*\[\r\n\]+2 == output annotated suitably for use by programs that control GDB." "help show annotate" +# test help show args +gdb_test "help show args" "Show argument list to give program being debugged when it is started..*\[\r\n\]+Follow this command with any number of args, to be passed to the program." +# test help show check "c" abbreviation +gdb_test "help show c" "Show the status of the type/range checker.*\[\r\n\]+List of show check subcommands:.*\[\r\n\]+show check range -- Show range checking.*\[\r\n\]+show check type -- Show type checking.*\[\r\n\]+Type \"help show check\" followed by show check subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help show check \"c\" abbreviation" +# test help show check +gdb_test "help show check" "Show the status of the type/range checker.*\[\r\n\]+List of show check subcommands:.*\[\r\n\]+show check range -- Show range checking.*\[\r\n\]+show check type -- Show type checking.*\[\r\n\]+Type \"help show check\" followed by show check subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help show check" +# test help show check range +gdb_test "help show check range" "Show range checking. .on/warn/off/auto." "help show check range" +# test help show check type +gdb_test "help show check type" "Show type checking. .on/warn/off/auto." "help show check type" +# test help show commands +gdb_test "help show commands" "Show the history of commands you typed..*\[\r\n\]+You can supply a command number to start with, or a `\[+\]' to start after.*\[\r\n\]+the previous command number shown." "help show commands" +# test help show complaints +gdb_test "help show complaints" "Show max number of complaints about incorrect symbols." "help show complaints" +# test help show confirm +gdb_test "help show confirm" "Show whether to confirm potentially dangerous operations." "help show confirm" +# test help show convenience +gdb_test "help show convenience" "Debugger convenience .\".foo\". variables..*\[\r\n\]+These variables are created when you assign them values;.*\[\r\n\]+thus, \"print .foo=1\" gives \".foo\" the value 1. Values may be any type..*\[\r\n\]+A few convenience variables are given values automatically:.*\[\r\n\]+\"._\"holds the last address examined with \"x\" or \"info lines\",.*\[\r\n\]+\".__\" holds the contents of the last address examined with \"x\"." "help show convenience" +# test help show directories +gdb_test "help show directories" "Current search path for finding source files..*\[\r\n\]+.cwd in the path means the current working directory..*\[\r\n\]+.cdir in the path means the compilation directory of the source file." "help show directories" +# test help show editing +gdb_test "help show editing" "Show editing of command lines as they are typed..*\[\r\n\]+Use \"on\" to enable the editing, and \"off\" to disable it..*\[\r\n\]+Without an argument, command line editing is enabled. To edit, use.*\[\r\n\]+EMACS-like or VI-like commands like control-P or ESC." "help show editing" +# test help show environment +gdb_test "help show environment" "The environment to give the program, or one variable's value..*\[\r\n\]+With an argument VAR, prints the value of environment variable VAR to.*\[\r\n\]+give the program being debugged. With no arguments, prints the entire.*\[\r\n\]+environment to be given to the program." "help show environment" +# test help show height +gdb_test "help show height" "Show number of lines gdb thinks are in a page." "help show height" +# test help show history expansion +gdb_test "help show history expansion" "Show history expansion on command input..*\[\r\n\]+Without an argument, history expansion is enabled." "help show history expansion" +# test help show history filename +gdb_test "help show history filename" "Show the filename in which to record the command history.*\[\r\n\]+ .the list of previous commands of which a record is kept.." "help show history filename" +# test help show history save +gdb_test "help show history save" "Show saving of the history record on exit..*\[\r\n\]+Use \"on\" to enable the saving, and \"off\" to disable it..*\[\r\n\]+Without an argument, saving is enabled." "help show history save" +# test help show history size +gdb_test "help show history size" "Show the size of the command history, .*\[\r\n\]+ie. the number of previous commands to keep a record of." "help show history size" +# test help show history +gdb_test "help show history" "Generic command for showing command history parameters..*\[\r\n\]+List of show history subcommands:.*\[\r\n\]+show history expansion -- Show history expansion on command input.*\[\r\n\]+show history filename -- Show the filename in which to record the command history.*\[\r\n\]+show history save -- Show saving of the history record on exit.*\[\r\n\]+show history size -- Show the size of the command history.*\[\r\n\]+Type \"help show history\" followed by show history subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help show history" +# test help show language +gdb_test "help show language" "Show the current source language." "help show language" +# test help show listsize +gdb_test "help show listsize" "Show number of source lines gdb will list by default." "help show listsize" +# test help show print "p" abbreviation +gdb_test "help show p" "Generic command for showing print settings..*\[\r\n\]+List of show print subcommands:.*\[\r\n\]+Type \"help show print\" followed by show print subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help show print \"p\" abbreviation" +# test help show print "pr" abbreviation +gdb_test "help show pr" "Generic command for showing print settings..*\[\r\n\]+List of show print subcommands:.*\[\r\n\]+Type \"help show print\" followed by show print subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help show print \"pr\" abbreviation" +# test help show print +gdb_test "help show print" "Generic command for showing print settings..*\[\r\n\]+List of show print subcommands:.*\[\r\n\]+Type \"help show print\" followed by show print subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help show print" +# test help show paths +gdb_test "help show paths" "Current search path for finding object files..*\[\r\n\]+.cwd in the path means the current working directory..*\[\r\n\]+This path is equivalent to the .PATH shell variable. It is a list of.*\[\r\n\]+directories, separated by colons. These directories are searched to find.*\[\r\n\]+fully linked executable files and separately compiled object files as needed." "help show paths" +# test help show print address +gdb_test "help show print address" "Show printing of addresses." "help show print address" +# test help show print array +gdb_test "help show print array" "Show prettyprinting of arrays." "help show print array" +# test help show print asm-demangle +gdb_test "help show print asm-demangle" "Show demangling of C\[+\]+ names in disassembly listings." "help show print asm-demangle" +# test help show print demangle +gdb_test "help show print demangle" "Show demangling of encoded C\[+\]+ names when displaying symbols." "help show print demangle" +# test help show print elements +gdb_test "help show print elements" "Show limit on string chars or array elements to print..*\[\r\n\]+\"set print elements 0\" causes there to be no limit." "help show print elements" +# test help show print object +gdb_test "help show print object" "Show printing of object's derived type based on vtable info." "help show print object" +# test help show print pretty +gdb_test "help show print pretty" "Show prettyprinting of structures." "help show print pretty" +# test help show print sevenbit-strings +gdb_test "help show print sevenbit-strings" "Show printing of 8-bit characters in strings as .nnn." "help show print sevenbit-strings" +# test help show print union +gdb_test "help show print union" "Show printing of unions interior to structures." "help show print union" +# test help show print vtbl +gdb_test "help show print vtbl" "Show printing of C\[+\]+ virtual function tables." "help show print vtbl" +# test help show prompt +gdb_test "help show prompt" "Show gdb's prompt" "help show prompt" +# test help show radix +gdb_test "help show radix" "Show the default input and output number radices.*\[\r\n\]+Use \'show input-radix\' or \'show output-radix\' to independently show each.*\[\r\n\]+" "help show radix" +# test help show symbol-reloading +gdb_test "help show symbol-reloading" "Show dynamic symbol table reloading multiple times in one run." "help show symbol-reloading" +# test help show user +gdb_test "help show user" "Show definitions of user defined commands..*\[\r\n\]+Argument is the name of the user defined command..*\[\r\n\]+With no argument, show definitions of all user defined commands." "help show user" +# test help show values +gdb_test "help show values" "Elements of value history around item number IDX .or last ten.." "help show values" +# test help show verbose +gdb_test "help show verbose" "Show verbosity..*" "help show verbose" +# test help show version +gdb_test "help show version" "Show what version of GDB this is." "help show version" +# test help show width +gdb_test "help show width" "Show number of characters gdb thinks are in a line." "help show width" +# test help show write +# This is only supported on targets which use exec.o. +gdb_test "help show write" "Show writing into executable and core files." "help show write" +# test help show +# FIXME -- Ultrix hangs randomly on this very long output from gdb and +# continues with its output only if something is sent to gdb. +# Also, if the system is slow, it may time out because the output is large. +#gdb_test "help show" "Generic command for showing things about the debugger..*\[\r\n\]+List of show subcommands:.*\[\r\n\]+show listsize -- Show number of source lines gdb will list by default.*\[\r\n\]+show directories -- Current search path for finding source files.*\[\r\n\]+Type \"help show\" followed by show subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help show" +# test help step +gdb_test "help step" "Step program until it reaches a different source line..*\[\r\n\]+Argument N means do this N times .or till program stops for another reason.." "help step #2" +# test help stepi "si" abbreviation +gdb_test "help si" "Step one instruction exactly..*\[\r\n\]+Argument N means do this N times .or till program stops for another reason.." "help stepi \"si\" abbreviation" +# test help stepi +gdb_test "help stepi" "Step one instruction exactly..*\[\r\n\]+Argument N means do this N times .or till program stops for another reason.." "help stepi" +# test help signal +gdb_test "help signal" "Continue program giving it signal.*" "help signal" +# test help source +# vxgdb reads .vxgdbinit +gdb_test "help source" "Read commands from a file named FILE..*\[\r\n\]+Note that the file \"\[^\"\]*\" is read automatically in this way.*\[\r\n\]+when gdb is started." "help source" +# test help stack +gdb_test "help stack" "Examining the stack..*\[\r\n\]+When the program being debugged stops, gdb selects the innermost frame..*\[\r\n\]+The commands below can be used to select other frames by number or address..*\[\r\n\]+List of commands:.*\[\r\n\]+backtrace -- Print backtrace of all stack frames.*\[\r\n\]+bt -- Print backtrace of all stack frames.*\[\r\n\]+down -- Select and print stack frame called by this one.*\[\r\n\]+frame -- Select and print a stack frame.*\[\r\n\]+return -- Make selected stack frame return to its caller.*\[\r\n\]+select-frame -- Select a stack frame without printing anything.*\[\r\n\]+up -- Select and print stack frame that called this one.*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help stack" +# test help status +gdb_test "help status" "Status inquiries..*\[\r\n\]+List of commands:.*\[\r\n\]+info -- Generic command for showing things about the program being debugged.*\[\r\n\]+show -- Generic command for showing things about the debugger.*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help status" +# test help support +# FIXME -- Ultrix hangs randomly on this very long output from gdb and +# continues with its output only if something is sent to gdb. +# Also, if the system is slow, it may time out because the output is large. +#gdb_test "help support" "Support facilities..*\[\r\n\]+List of commands:.*\[\r\n\]+show confirm -- Show whether to confirm potentially dangerous operations.*\[\r\n\]+show history -- Generic command for showing command history parameters.*\[\r\n\]+down-silently -- Same as the `down' command.*\[\r\n\]+up-silently -- Same as the `up' command.*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help support" +# test help symbol-file +gdb_test "help symbol-file" "Load symbol table from executable file FILE..*\[\r\n\]+The `file' command can also load symbol tables, as well as setting the file.*\[\r\n\]+to execute." "help symbol-file" +# test help target child +gdb_test "help target child" "Unix child process .started by the \"run\" command..*|Undefined target command: \"child\". Try \"help target\"." "help target child" +# test help target procfs +gdb_test "help target procfs" "Unix /proc child process .started by the \"run\" command.*|Undefined target command: \"procfs\". Try \"help target\"." "help target procfs (procfs version)" +# test help target core +gdb_test "help target core" ".*Use a core file as a target.*Specify the filename of the core file.*|(Undefined target command: \"core\". Try \"help target\".)" "help target core" +# test help target exec +gdb_test "help target exec" "Use an executable file as a target..*\[\r\n\]+Specify the filename of the executable file." "help target exec" +# test help target remote +gdb_test "help target remote" "Use a remote computer via a serial line, using a gdb-specific protocol..*\[\r\n\]+Specify the serial device it is connected to .e.g. /dev/ttya..*" "help target remote" +# test help target +# the child process target may be "target child" or "target procfs" +gdb_test "help target" "Connect to a target machine or process..*\[\r\n\]+The first argument is the type or protocol of the target machine..*\[\r\n\]+Remaining arguments are interpreted by the target protocol. For more.*\[\r\n\]+information on the arguments for a particular protocol, type.*\[\r\n\]+`help target ' followed by the protocol name..*\[\r\n\]+List of target subcommands:.*\[\r\n\]+target exec -- Use an executable file as a target.*\[\r\n\]+Type \"help target\" followed by target subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help target" +# test help tbreak +gdb_test "help tbreak" "Set a temporary breakpoint.*" "help tbreak" +# test help tty +gdb_test "help tty" "Set terminal for future runs of program being debugged." "help tty" +# test help until "u" abbreviation +gdb_test "help u" "Execute until the program reaches a source line greater than the current.*\[\r\n\]+or a specified line or address or function .same args as break command...*\[\r\n\]+Execution will also stop upon exit from the current stack frame." "help until \"u\" abbreviation" +# test help until +gdb_test "help until" "Execute until the program reaches a source line greater than the current.*\[\r\n\]+or a specified line or address or function .same args as break command...*\[\r\n\]+Execution will also stop upon exit from the current stack frame." "help until" +# test help undisplay +gdb_test "help undisplay" "Cancel some expressions to be displayed when program stops..*\[\r\n\]+Arguments are the code numbers of the expressions to stop displaying..*\[\r\n\]+No argument means cancel all automatic-display expressions..*\[\r\n\]+\"delete display\" has the same effect as this command..*\[\r\n\]+Do \"info display\" to see current list of code numbers." "help undisplay" +# test help unset environment +gdb_test "help unset environment" "Cancel environment variable VAR for the program..*\[\r\n\]+This does not affect the program until the next \"run\" command." "help unset environment" +# test help unset +gdb_test "help unset" "Complement to certain \"set\" commands.*\[\r\n\]+List of unset subcommands:.*\[\r\n\]+unset environment -- Cancel environment variable VAR for the program.*\[\r\n\]+Type \"help unset\" followed by unset subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help unset" +# test help up +gdb_test "help up" "Select and print stack frame that called this one..*\[\r\n\]+An argument says how many frames up to go." "help up" +# test help up-silently +gdb_test "help up-silently" "Same as the `up' command, but does not print anything..*\[\r\n\]+This is useful in command scripts." "help up-silently" +# test help user-defined +gdb_test "help user-defined" "User-defined commands..*\[\r\n\]+The commands in this class are those defined by the user..*\[\r\n\]+Use the \"define\" command to define a command..*\[\r\n\]+List of commands:.*\[\r\n\]+Type \"help\" followed by command name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help user-defined" +# test help watch +gdb_test "help watch" "Set a watchpoint for an expression..*\[\r\n\]+A watchpoint stops execution of your program whenever the value of.*\[\r\n\]+an expression changes." "help watch" +# test help whatis +gdb_test "help whatis" "Print data type of expression EXP." "help whatis" +# test help where +gdb_test "help where" "Print backtrace of all stack frames, or innermost COUNT frames..*\[\r\n\]+With a negative argument, print outermost -COUNT frames..*\[\r\n\]+Use of the 'full' qualifier also prints the values of the local variables." "help where" +# test help x +gdb_test "help x" "Examine memory: x/FMT ADDRESS..*\[\r\n\]+ADDRESS is an expression for the memory address to examine..*\[\r\n\]+FMT is a repeat count followed by a format letter and a size letter..*\[\r\n\]+Defaults for format and size letters are those previously used..*\[\r\n\]+Default count is 1. Default address is following last thing printed.*\[\r\n\]+with this command or \"print\"." "help x" +# test help info bogus-gdb-command +gdb_test "help info bogus-gdb-command" "Undefined info command: \"bogus-gdb-command\". Try \"help info\"." "help info bogus-gdb-command" +# test help gotcha +gdb_test "help gotcha" "Undefined command: \"gotcha\". Try \"help\"." "help gotcha" diff --git a/gdb/testsuite/gdb.base/i486-elf.u b/gdb/testsuite/gdb.base/i486-elf.u new file mode 100644 index 00000000000..882338b9dea --- /dev/null +++ b/gdb/testsuite/gdb.base/i486-elf.u @@ -0,0 +1,287 @@ +begin 777 i486-elf +M?T5,1@$! 0 ( P ! W(($"#0 !\+@ #0 ( % +M "@ %0 1 8 T -( $" "@ H 4 P -0 +M !, ! ! - #2 ! @ * 8 +M "@& % ! $ !)8$"&@0 Z<#_____)7R6 +M! AH& .FP____:@!J (OL4KB<@@0(A)<$" L "A4(8$"*,\EP0(H5B&! BC#)<$"*%4A@0( +MHPB7! B@^)<$"*+4EP0(H'27! BB.)<$"* ZEP0(HOB6! AFH6R7! AFHWR7 +M! AFH5R7! AFHTB7! AFH027! AFHX"7! BA$)<$"*,B7! ALEP0(QP6P L 0 %0 # 9)8$" ( @ % +M !$ 7 :(($" $ +M 0 \?\ U( $" # $ .B ! @ P " L +M@00( , P [($$" # 0 &B"! @ P % +M "(@@0( , !@ C(($" # < -R"! @ P ( +M XA@0( , "0 /(8$" # H %R6! @ +M P + !DE@0( , # @)8$" # T /"6! @ +M P . , #P # ! +M P 1 , $@ # !, +M P 4 H 0 \?\1 $ /'_ +M& ! #Q_R0 0 \?\L $ +M /'_-@ ! #Q_ST !,@P0(#0 !( " !) \)8$" 0 +M 1 X 5@ /26! @$ $0 . &4 XA@0( !( "0!K ^)8$ +M" ( 1 X @0 #2$! @! @ $@ ( (8 #\E@0(! !$ #@"4 +M )<$" 0 1 X K0 )R"! @< $@ +8 "DF 0( !$ \?^[ +M !)<$" ( 1 X S )R#! @- $@ ( .( (EP0(" !$ +M#@#K $)<$" 0 1 X \0 -R"! @ $@ ( /@ 4EP0(! +M !$ #@ # 0 8)8$" 0 1 L # $ !B7! @$ $0 . "0! )<$" 0 +M 1 X L@( 'R7! @$ $0 . , " " EP0(! !$ #@#7 @ /(8$ +M" 0 1 H Y ( $N#! @ $@ ( .P" "$EP0(! !$ #@#[ @ +MB)<$" 0 1 X $P, (R7! @( $0 . "8# "\@@0( !( P +M P E)<$" 0 1 X 10, )B7! @$ $0 . $P# !DE@0( !$ +M\?]B P G)<$" 0 1 X >0, *"7! @$ $0 . (H# !6YS>6T +F1Y;G-T<@ N6UT +M86( +G-T 0 . !V7V9L;V%T +M7VUE;6)E<@!5 X (P & 0, !RP - !( 2@$ #@ =E]D;W5B;&5? +M;65M8F5R %4 #P C 8 !! '! !L 3 !( ; ( #@ +C!F86ME +M +8 & "H - !( DP$ #@ =E]C:&%R7VUE;6)E<@!5 $ (P & 0 +M !RL - !( O@$ #@ =E]S:&]R=%]M96UB97( 50 $ ", !@ $ @ +M 00 #@ =E]F +M;&]A=%]M96UB97( 50 . ", !@ $ F#! @$ ,0 +M 8 $@#:!@ . !V7W-I9VYE9%]L;VYG7V9U;F, 50 + !$![(,$""$!^8,$ +M" 0 S !@ 2 !$' X '9?=6YS:6=N961?;&]N9U]F=6YC %4 # 1 +M ?R#! @A 0F$! @$ *P 8 $@! !P . !V7V9L;V%T7V9U;F, 50 . +M !$!#(0$""$!'80$" 0 L !@ 2 ' ' X '9?9&]U8FQE7V9U;F, +M50 / !$!((0$""$!,80$" 0 5 %0 2 *X' "# 4 >H' 5 +M!0 2 )H' "# 4 >H' 0 !0 2 *H' !5 < ! #P ! !( +MZ@< )4 "C "@ @ " 0 ( " +M"'( +@ !D 3 !( >P@ #@ ;&EN:P"V )@ F #0 2 "D( X +M &YE>'0 @P % 'J!P (P & 0 !RH - !( 4P@ #@ ;&EN:V9U +M;F, @P % %P!P (P & 0$ !R0 - !( =P@ #@ H' 5 !0 2 +M *4( "# 4 >H' 0 !0 2 +4( !5 < ! #P ! !( ]0@ +M )4 "C "@ @ " 0 ( " "'( +M+@ !P 7 !( B0D #@ ='5?;&EN:P"V ) F #0 2 #<) X +M &YE>'0 @P % 'J!P (P & 0 !RH - !( 80D #@ ;&EN:V9U +M;F, @P % %[" (P & 0 !R0 - !( A0D #@ F5R;P ! ;VYE ( !T=V\ ! ", & +M !( B0L #@ ;6%I;@!5 < $0$TA 0((0$UA@0(! "< ' !( L L +M #@ 0!R \0 +M C 4 ^"7! @D 0 2 ((0 "5 HP 0 ( ! "%4 +M# S !P 2 +40 X '9?=6YS:6=N961?;&]N9U]A0!R %X0 C +M 4 V"7! @D 0 2 -D0 "5 HP 0 ( ! "%4 "P Q +M !P 2 H1 X '9?0!R %@1 C 4 U"7! @D 0 2 -(1 "5 +M HP 0 ( ! "%4 " P !P 2 (2 X '9?0!R *X1 C 4 XR7! @D 0 2 "82 "5 HP 0 +M ( ! "%4 !P I !P 2 $\2 X '9?:6YT7V%R0!R $\2 +M C 4 X"7! @D 0 2 ,L2 "5 HP 0 ( ! "%4 +M!0 R !P 2 /T2 X '9?0!R /T2 C 4 WR7! @D +M 0 2 ' 3 "5 HP 0 ( ! "%4 P S !P 2 *,3 X +M '9?=6YS:6=N961?8VAA0!R $P3 C 4 _B6! @D 0 2 +M ,<3 "5 HP 0 ( ! "%4 @ Q !P 2 /@3 X '9? +MP /__( 'T #__S !^ __] +M ?P /__4 ($ #__V "" __]P @P /__@ (4 +M #__Y "& __^@ AP /__L (D #__\ "* ___4 +M L@ /__Z +4 #__^X "V ___U MP /___ +D +M #__P,! "Z __\, 0 NP /__%0$ +T #__QX! "^ __\H +M 0 OP /__,@$ ,$ #__SP! #" __]& 0 PP /__4 $ ,4 +M #__UH! #& __]D 0 R0 /__> $ ,H #__X(! #+ __^, +M 0 S0 /__E@$ ,X #__Z(! #/ __^N 0 T0 /__N@$ -( +M #__\0! #3 ___. 0 U0 /__V $ -8 #__^(! #7 ___L +M 0 V0 /__]@$ -H #__P " #< __\4 @ W0 /__'@( -X +M #__R@" #@ __\R @ X0 /__/ ( .( #__T8" #D __]0 +M @ Y0 /__6@( .8 #__V0" #H __]N @ Z0 /__> ( .H +M #__X(" #L __^, @ [0 /__E@( .\ #__Z " #P __^J +M @ \0 /__M ( /( #__[X" #T ___( @ ]@ /__T@( /< +M #__]X" ___I @ +M 0 $ " U( $"-0 3 +M ! D % @ .B ! CH 1 , ! +M 0 / "P ( L@00(+ $ , $ 0 0 0 +M%P , " [($$".P! ![ ! !\ ) +M @ &B"! AH @ ( , ' ! @ H 0 8 +M "(@@0(B ( $ 0 +@ $ & C(($ +M"(P" !0 $ ! #, ! !@ -R"! C< @ +M60, ! Y 0 8 XA@0(. 8 $ +M 0 /P $ " /(8$"#P& @ +M $ $< ! P %R6! A'0 871E>&ET %]E9&%T80!E>&ET %]L:6)?=F5R*35 /@ +M%_\I/>P? #D'0 0 #X &O___;OO0 [!\ .P> ! /@ %_\I0>^] #D +M'0 ,[!X &O__^\7_RE%[!\ .0= !A /@ :___Z.^] #L'P [!X $ +M^ 7_RE)[[T .0= "3L'@ :___X: #( 4'$ 81"__"@0P '$ +M!>P0 #40@ /6@ N80$M"@ ;___X.??*4SL'@ ;___VUO@ +L$ +MH) .80&0!O___8H &___\>@ ;___VZ82 (4< 1AE( &()2& ? +MY9$I[!\ &P )J$<0 4;___UZ "@$ H $?@^ "$'P !H\$ * _ +M "@ 0 #X * "@ H ,@ P<0!@!A$+_\* 0 "$0P %&, +M 81_ !"GX@ 0 ( * #( ,'$ 8 81"__"@$ A$, !1C &$?P 0 +MI^( $ " "@ R #!Q & &$0O_PH! (1# 48P !A'\ $*?B ! +M @ H ,@ P<0!@!A$+_\* 0 "$0P %&, 81_ !"GX@ 0 ( * +M #( ,'$ 8 81"__"@$ A$, !1C &$?P 0I^( $ " "@ R +M#!Q & &$0O_PH! (1# 48P !A'\ $*?B ! @ H ,@ P<0!@! +MA$+_\* 0 "$0P %&, 81_ !"GX@ 0 ( * #( ,'$ 8 81"__"@ +M$ A$, !1C &$?P 0I^( $ " "@ R #!Q & &$0O_PH! (1# +M 48P !A'\ $*?B ! @ H ,@ P<0!@!A$+_\* 0 "$0P %&, +M 81_ !"GX@ 0 ( * #( ,'$ 8 81"__"@$ A$, !1C &$?P 0 +MI^( $ " "@ R #!Q & &$0O_PH! (1# 48P !A'\ $*?B ! +M @ H ,@ P<0!@!A$+_\$@( (([!\ ?\*@KL'P +M#^7AR.P? 7_"H\[!\ !_EXDSL'P %_PJ+.P? ?Y>(8[!\ !?\*=3L +M'P '^7B4.P? 7_"GA[!\ !_EX>WL'P %_PIQ>P? ?Y>)=[!\ !?\ +M*<'L'P '^7B(>P? 7_"HY[!\ !_EXL7L'P %_PIS>P? ?Y>(1[!\ +M !?\*DGL'P '^7B,>P? G\"H.[!\ "_P*K;L'P )_ IV.P? O\"GX +M[!\ .?\*LSL'P '^7B5>P? #G_"I$[!\ !_EXL'L'P Y_PJ"NP? ? +MY>)9[!\ .?\*CSL'P '^7BO>P? #G_"HL[!\ !_EXFWL'P Y_PIU.P? +M ?Y>'1[!\ .?\*>#L'P '^7B'>P? #G_"G$[!\ !_EXF7L'P Y_PI +MP.P? ?Y>(I[!\ .?\*CCL'P '^7B0>P? #G_"G,[!\ !_EXK'L'P +MY_PJ2.P? ?Y>'I[!\ .?\*@SL'P '^7BK>P? #G_"G8[!\ !_EXG'L +M'P [!\ )0< *4' "'^7A]1_EX>7L'P [!\ )0< &4' !'^7C:1_E +MXM'L'P %_PJ:>P? ?Y>+9[!\ !?\*WCL'P '^7C<.P? 48P !A'\ +M$*?B ! @ H $ " "@ H 0&D !"R +M I3 2W $O@ !,4 3, $ +M !H # $K - 9 0 !#H !0 $@ & 1, +M H ![ "P ! 5 , "DP @ # 4 +M!P !< !)\ $ +M 0 __$ 0U # ! $.@ P @ +M !$P , , 2 # $ $GP P !0 +M !*P , 8 2P # ' $T P +M" !D , D 9$ # * *20 +M P "P "DP , P I3 # - *< +M P #@ , \ # 0 +M P $0 , !( # 3 +M P % < 0 __$ . $ /_Q +M %0 ! #_\0 "$ 0 __$ I $ +M /_Q ,P ! #_\0 #H "G !!$ X !) IQ +M 01 . 5@ $_@ @$@ " &( !D !( D !H I +MR (1 . ?@ %B@ +8$@ " (, "G, !!$ X "1 +M IT 01 . J@ $X !,$@ +, "N !$ __$ +M "X IU (1 . R0 %, @$@ " -\ "G8 "!$ +M X #H IX 01 . [@ $T@ $@ " /4 "GD +M!!$ X $ I* 01 + !"0 *>@ $$0 #@ 2$ "GL +M "!$ X $M I] 01 . !-0 %" @$@ " 4@ +M "GX $!$ X %7 9) 1 /_Q !7@ *@@ "$0 #@ +M 7( "H* 1$ X &" J# 01 . !B@ *A ($0 +M#@ 9X !30 F!( &E I* 0A + !K0 %6 @ +M$@ " ;D "H8 !!$ X '. 5L " 2 ( !XP *AP +M $$0 #@ ?$ "F\ !$ __$ 'X 4< " 2 ( "!0 +M*B ($0 #@ AH "HH !!$ X (Q 4Z " 2 ( " +M/ *BP "$0 #@ DL !78 (!( @ )8 7< 2 +M "70 *C ($0 #@ G, "HX !!$ X )Z J/ (1 +M . "@@ *D $$0 #@ I$ "I$ 1$ X *? J2 +M 01 . "KP *DP $$0 #@ KT "I0 !!$ X +4 9 +M$ 01 * "X0 $]@ $@ " ND "I4 !!$ X +X +M J6 01 . #$ *EP ($0 #@ R, !8@ !( +M ,M J9 01 . #0@ *F@ $$0 #@ TD "DP !$ +M__$ -? J; 01 . #=@ *G $$0 #@ X< "DD +M!!$ L .9 J> !@1 . #HP *I 8$0 #@ ZT "JH +M A$ X .Z JK 01 . #R@ *K $$0 #@ ^ +M !8 (!( @ /N 5$ " 2 ( $ *4P $0#_\0 +M! D "JT "!$ X 07 JO 01 . $)P %8@ @$@ +M" !#H "K !!$ X 10 JQ @1 . $70 $K +M$@ !@ !&, "K, 1$ X 1J JT 01 . $<@ %$@ +M @$@ " !(< "K8 D!$ X 2. K: 01 . $F +M%)@ @$@ " !*P "MP "!$ X 2U K> @1 . $ +MO0 %3@ @$@ " !G9&)M90!C6YS>6T +F1Y;G-T<@ N' @) ! *",I1E18(#(N,2XP+C$@' @) D2&5A9&5R.B O<"]20U,O=71I;#(M,BXQ+W5S +M6US+F@L=B R+C$@.3(O,#4O,30@ +M,#N (, !0$ ?J %0 % !( >: (, !0$ ?J +M$ % !( >J %4 !P 0 \ $ $@ !^H E0 *, * " +M ( $ @ @@ <@ "X 9 !, $@ "'L +M.&QI;FL +8 "8 )@ - !( @I #AN97AT "# 4! 'Z@ C 8$ +M < J T $@ "%, .&QI;FMF=6YC "# 4! '< C 8$ +M! < D T $@ "'< .'-T=69F !R 'K@ C 8$ " < $ +M%0 5 !( BY (, !0$ ?J %0 % !( BE (, !0$ ?J $ % +M !( BU %4 !P 0 \ $ $@ "/4 E0 *, * " +M ( $ @ @@ <@ "X < !< $@ "8D .'1U +M7VQI;FL +8 "0 )@ - !( DW #AN97AT "# 4! 'Z@ C 8$ +M < J T $@ "6$ .&QI;FMF=6YC "# 4! (>P C 8$ +M < D T $@ "84 .'-T=69F !R (N0 C 8$ < $ +M.@ $ !( G' #@N,F9A:V4 +8 $ /, &P )B;'5E %G65L;&]W 0 R 0 $@ +M"C\ ."XS9F%K90 M@ 0 \P 3 69O0 <@ "8D (P % P *?0 D < $@ #$8 +M.'5?;&EN:P <@ "/4 (P % P *M@ G < $@ #&T .'-?;&EN:P +M@P % 0 !^H (P % P *F@ F < $@ #), .'9?=6YI;VXR !R # +MBP C 4# K< "4 !P 2 ,N X=E]U;FEO;@ <@ FP (P % P +M*W@ G < $@ #-\ .'9?@ T < $@ #0 <@ #[\ (P % P +M*?@ D $ $@ $#, E0 *, $ " !" !5 X K < +M$@ $%X .'9?9FQO871?87)R87D '( ! / ", !0, "JT ) ! !( +M !"" )4 "C ! @ 0@ 50 , ,P ' !( !"U #AV7W5N +M ", !0, "HP ) ! !( !#9 +M )4 "C ! @ 0@ 50 + ,0 ' !( !$* #AV7W-I9VYE +M9%]L;VYG7V%R0 <@ $@( (P % P *>P D $ +M$@ $G, E0 *, $ " !" !5 8 T < $@ $J< .'9? +M=6YS:6=N961?0 <@ $J< (P % P *A@ D $ $@ $R$ +ME0 *, $ " !" !5 0 K < $@ $TP .'9? L < $@ +M%:( .'9?=6YS:6=N961?O__ , +M 'O__P %@ !]__\ " ?O__ J '___P - "!__\ +M #X @O__ !( (/__P 4@ "%__\ %P AO__ !F +M (?__P < ")__\ 'H BO__ "$ ++__P C@ "U__\ +M )$ MO__ "3 +?__P E@ "Y__\ )D NO__ "< +M +O__P GP "]__\ *( OO__ "E +___P J #!__\ +M *L PO__ "N ,/__P L0 #%__\ +0 QO__ "X +M ,G__P O #*__\ , R___ #$ ,W__P R #.__\ +M ,P S___ #0 -'__P U #2__\ -@ T___ #< +M -7__P X #6__\ .0 U___ #H -G__P [ #:__\ +M / W/__ #T -W__P ^ #>__\ /P X/__ $ +M .'__P !! #B__\ 0@ Y/__ $, .7__P !$ #F__\ +M 10 Z/__ $8 .G__P !' #J__\ 2 [/__ $D +M .W__P !* #O__\ 2P \/__ $O /'__P !,@ #R__\ +M 34 ]/__ $X /;__P !/ #W__\ 3P /__ %$ +M $ +M ! @ $-0 #4 $P 0 ) !0 +M ( !#H Z $@ # 0 $ #P L " 1 +M, 3 #0 ! ( $ $ !< # @ $@ ( +M >P 0 ? ! ( !)\ "? # +M # !P 0 , *0 P & 2L K 0 +M 0 " "\ , !@ $L + @ +M$ @ T # 8 !- #0 !< ! ( +M .@ P & 9 "0 0 0 " $ +M ! @ &1 D0 % " !( 0 +M , "DD )) @ 0 3@ $ # I +M, "3 < 0 ! %, & P *4P E, +M < 0 ! @ !< " , "G )P < +M @ 80 ( "< < $ +M !P $ $ &D # !# $T0 +M 0 !Q P 5D0 )$ $ +M >P $ %B( 0N ! (0 +M ! !I0 6< ! "+ 0 +> PP I( $ + +end diff --git a/gdb/testsuite/gdb.base/int-type.c b/gdb/testsuite/gdb.base/int-type.c new file mode 100644 index 00000000000..548ca9c36bb --- /dev/null +++ b/gdb/testsuite/gdb.base/int-type.c @@ -0,0 +1,25 @@ + +int x; +int y; +int z; +int w; + + + +int main () +{ + +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + + x = 14; + y = 3; + z = 2; + w = 2; + + return 0; + +} + diff --git a/gdb/testsuite/gdb.base/interrupt.c b/gdb/testsuite/gdb.base/interrupt.c new file mode 100644 index 00000000000..120697b77e5 --- /dev/null +++ b/gdb/testsuite/gdb.base/interrupt.c @@ -0,0 +1,37 @@ +#include +#include +int +main () +{ + char x; + int nbytes; +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + printf ("talk to me baby\n"); + while (1) + { + nbytes = read (0, &x, 1); + if (nbytes < 0) + { +#ifdef EINTR + if (errno != EINTR) +#endif + perror (""); + } + else if (nbytes == 0) + { + printf ("end of file\n"); + exit (0); + } + else + write (1, &x, 1); + } +} + +int +func1 () +{ + return 4; +} diff --git a/gdb/testsuite/gdb.base/interrupt.exp b/gdb/testsuite/gdb.base/interrupt.exp new file mode 100644 index 00000000000..60cf83817cb --- /dev/null +++ b/gdb/testsuite/gdb.base/interrupt.exp @@ -0,0 +1,175 @@ +# Copyright (C) 1994, 1995, 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if [host_info exists name] { + if [board_info host exists gdb,nointerrupts] { + verbose "Skipping interrupt.exp because of nointerrupts." + continue + } +} + +if [target_info exists gdb,noinferiorio] { + verbose "Skipping interrupt.exp because of noinferiorio." + return +} + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile interrupt +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_start + + +if ![file exists $binfile] then { + perror "$binfile does not exist." + return 0 +} else { + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + # Hope this is unix :-) + gdb_test "shell stty intr '^C'" "" \ + "set interrupt character in interrupt.exp" + if [runto_main] then { + send_gdb "continue\n" + gdb_expect { + -re "\r\ntalk to me baby\r\n$" { + pass "child process is alive" + } + timeout { fail "run (timeout)" } + eof { fail "run (eof)" } + } + # This should appear twice, once for the echo and once for the + # program's output. Under dejagnu (but not interactively) for + # SunOS4, it only appears once. Don't worry about it, I imagine + # dejagnu has just done something to the tty modes. + send_gdb "a\n" + gdb_expect { + -re "^a\r\n(|a\r\n)$" { + pass "child process ate our char" + } + timeout { fail "echo a (timeout)" } + eof { fail "echo a (eof)" } + } + # Wait until the program is in the read system call again. + sleep 2 + + # Cntrl-c may fail for simulator targets running on a BSD host. + # This is the result of a combination of the read syscall + # being restarted and gdb capturing the cntrl-c signal. + + # Cntrl-c may fail for simulator targets on slow hosts. + # This is because there is a race condition between entering + # the read and delivering the cntrl-c. + + send_gdb "\003" + gdb_expect { + -re "Program received signal SIGINT.*$gdb_prompt $" { + pass "send_gdb control C" + } + -re ".*$gdb_prompt $" { fail "send_gdb control C" } + timeout { fail "send_gdb control C (timeout)" } + eof { fail "send_gdb control C (eof)" } + } + + send_gdb "p func1 ()\n" + gdb_expect { + -re " = 4.*$gdb_prompt $" { pass "call function when asleep" } + -re ".*Program received signal SIGSEGV.*$gdb_prompt $" { + setup_xfail "i*86-pc-linux*-gnu*" + fail "child died when we called func1, skipped rest of tests" + return + } + -re "$gdb_prompt $" { fail "call function when asleep (wrong output)" } + default { + + # This fail probably happens whenever we use /proc (we + # don't use PRSABORT), but apparently also happens on + # other machines as well. + + setup_xfail "sparc*-*-solaris2*" + setup_xfail "mips-*-ultrix*" + setup_xfail "hppa*-*-*" + setup_xfail "i386*-*-bsd*" + setup_xfail "i*86-*-solaris2*" + setup_xfail "*-*-sysv4*" + setup_xfail "vax-*-*" + setup_xfail "alpha-*-*" + setup_xfail "*-*-irix*" + setup_xfail "*-*-hpux*" + setup_xfail "*-*-*lynx*" + fail "call function when asleep (stays asleep)" + # Send_Gdb a newline to wake it up + send_gdb "\n" + gdb_test "" " = 4" "call function after waking it" + } +# eof { fail "call function when asleep (eof)" } + } + + # Now try calling the function again. + gdb_test "p func1 ()" " = 4" "call function a second time" + + # And the program should still be doing the same thing. + # The optional trailing \r\n is in case we sent a newline above + # to wake the program, in which case the program now sends it + # back. We check for it either here or in the next gdb_expect + # command, because which one it ends up in is timing dependent. + send_gdb "continue\n" + # For some reason, i386-*-sysv4 gdb fails to issue the Continuing + # message, but otherwise appears normal (FIXME). + gdb_expect { + -re "^continue\r\nContinuing.\r\n(\r\n|)$" { pass "continue" } + -re "^continue\r\n\r\n" { fail "continue (missing Continuing.)" } + -re "$gdb_prompt $" { fail "continue" } + timeout { fail "continue (timeout)" } + eof { fail "continue (eof)" } + } + + send_gdb "data\n" + # The optional leading \r\n is in case we sent a newline above + # to wake the program, in which case the program now sends it + # back. + gdb_expect { + -re "^(\r\n|)data\r\n(|data\r\n)$" { pass "echo data" } + timeout { fail "echo data (timeout)" } + eof { fail "echo data (eof)" } + } + + setup_xfail "i*86-pc-linux*-gnu*" + send_gdb "\004" + gdb_expect { + -re "end of file.*Program exited normally.*$gdb_prompt $" { + pass "send_gdb end of file" + } + -re "$gdb_prompt $" { fail "send end of file" } + timeout { fail "send end of file (timeout)" } + eof { fail "send end of file (eof)" } + } + } +} +return 0 diff --git a/gdb/testsuite/gdb.base/jump.c b/gdb/testsuite/gdb.base/jump.c new file mode 100644 index 00000000000..e16d0fd384d --- /dev/null +++ b/gdb/testsuite/gdb.base/jump.c @@ -0,0 +1,19 @@ +/* This program is used to test the "jump" command. There's nothing + particularly deep about the functionality nor names in here. + */ + +static int square (x) + int x; +{ + return x*x; +} + + +main () +{ + int i = 99; + + i++; + i = square (i); + i--; +} diff --git a/gdb/testsuite/gdb.base/jump.exp b/gdb/testsuite/gdb.base/jump.exp new file mode 100644 index 00000000000..c110e21cf04 --- /dev/null +++ b/gdb/testsuite/gdb.base/jump.exp @@ -0,0 +1,192 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel + } + +set prms_id 0 +set bug_id 0 + +# are we on a target board +if ![isnative] then { + return 0 +} + +clear_xfail "*-*-*" + +set testfile "jump" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +# Build the test case +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + +# Start with a fresh gdb + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + perror "Couldn't run to main" + return -1 +} + +# Set a breakpoint on the statement that we're about to jump to. +# The statement doesn't contain a function call. +# +send_gdb "break 18\n" +set bp_on_non_call 0 +gdb_expect { + -re "\[Bb\]reakpoint (\[0-9\]*) at 0x\[0-9a-fA-F\]*: file .*${srcfile}, line 18.*$gdb_prompt $"\ + {set bp_on_non_call $expect_out(1,string) + pass "break before jump to non-call"} + -re "$gdb_prompt $"\ + {fail "break before jump to non-call"} + timeout {fail "(timeout) break before jump to non-call"} +} + +# Can we jump to the statement? Do we stop there? +# +send_gdb "jump 18\n" +gdb_expect { + -re "Breakpoint \[0-9\]*, .*${srcfile}:18.*$gdb_prompt $"\ + {pass "jump to non-call"} + -re "$gdb_prompt $"\ + {fail "jump to non-call"} + timeout {fail "(timeout) jump to non-call"} +} + +# Set a breakpoint on the statement that we're about to jump to. +# The statement does contain a function call. +# +send_gdb "break 17\n" +set bp_on_call 0 +gdb_expect { + -re "\[Bb\]reakpoint (\[0-9\]*) at 0x\[0-9a-fA-F\]*: file .*${srcfile}, line 17.*$gdb_prompt $"\ + {set bp_on_call $expect_out(1,string) + pass "break before jump to call"} + -re "$gdb_prompt $"\ + {fail "break before jump to call"} + timeout {fail "(timeout) break before jump to call"} +} + +# Can we jump to the statement? Do we stop there? +# +send_gdb "jump 17\n" +gdb_expect { + -re "Breakpoint \[0-9\]*, .*${srcfile}:17.*$gdb_prompt $"\ + {pass "jump to call"} + -re "$gdb_prompt $"\ + {fail "jump to call"} + timeout {fail "(timeout) jump to call"} +} + +# If we disable the breakpoint at the function call, and then +# if we jump to that statement, do we not stop there, but at +# the following breakpoint? +# +send_gdb "disable $bp_on_call\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "disable breakpoint on call"} + timeout {fail "(timeout) disable breakpoint on call"} +} + +send_gdb "jump 17\n" +gdb_expect { + -re "Breakpoint \[0-9\]*, .*${srcfile}:18.*$gdb_prompt $"\ + {pass "jump to call with disabled breakpoint"} + -re "$gdb_prompt $"\ + {fail "jump to call with disabled breakpoint"} + timeout {fail "(timeout) jump to call with disabled breakpoint"} +} + +# Verify that GDB responds gracefully to the "jump" command without +# an argument. +# +send_gdb "jump\n" +gdb_expect { + -re "Argument required .starting address..*$gdb_prompt $"\ + {pass "jump without argument disallowed"} + -re "$gdb_prompt $"\ + {fail "jump without argument disallowed"} + timeout {fail "(timeout) jump without argument disallowed"} +} + +# Verify that GDB responds gracefully to the "jump" command with +# trailing junk. +# +send_gdb "jump 17 100\n" +gdb_expect { + -re "Junk at end of line specification: 100.*$gdb_prompt $"\ + {pass "jump with trailing argument junk"} + -re "$gdb_prompt $"\ + {fail "jump with trailing argument junk"} + timeout {fail "(timeout) jump with trailing argument junk"} +} + +# Verify that GDB responds gracefully to a request to jump out of +# the current function. (Note that this will very likely cause the +# inferior to die. Be prepared to rerun the inferior, if further +# testing is desired.) +# +# Try it both ways: confirming and not confirming the jump. +# +send_gdb "jump 8\n" +gdb_expect { + -re "Line 8 is not in `main'. Jump anyway.*y or n. $"\ + {send_gdb "n\n" + gdb_expect { + -re "Not confirmed.*$gdb_prompt $"\ + {pass "aborted jump out of current function"} + -re "$gdb_prompt $"\ + {fail "aborted jump out of current function"} + timeout {fail "(timeout) aborted jump out of current function"} + } + } + -re "$gdb_prompt $"\ + {fail "aborted jump out of current function"} + timeout {fail "(timeout) aborted jump out of current function"} +} + +send_gdb "jump 8\n" +gdb_expect { + -re "Line 8 is not in `main'. Jump anyway.*y or n. $"\ + {send_gdb "y\n" + gdb_expect { + -re "Continuing at.*$gdb_prompt $"\ + {pass "jump out of current function"} + -re "$gdb_prompt $"\ + {fail "jump out of current function"} + timeout {fail "(timeout) jump out of current function"} + } + } + -re "$gdb_prompt $"\ + {fail "jump out of current function"} + timeout {fail "(timeout) jump out of current function"} +} + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/langs.exp b/gdb/testsuite/gdb.base/langs.exp new file mode 100644 index 00000000000..464c79786e0 --- /dev/null +++ b/gdb/testsuite/gdb.base/langs.exp @@ -0,0 +1,122 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile langs +set binfile ${objdir}/${subdir}/${testfile} + +if [is_remote host] { + remote_download host ${srcdir}/${subdir}/langs1.f + remote_download host ${srcdir}/${subdir}/langs2.cxx +} + + +if { [gdb_compile "${srcdir}/${subdir}/langs0.c" "${binfile}0.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${srcdir}/${subdir}/langs1.c" "${binfile}1.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${srcdir}/${subdir}/langs2.c" "${binfile}2.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${binfile}0.o ${binfile}1.o ${binfile}2.o" ${binfile} executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + + + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile + +gdb_test "b langs0" {Function "langs0" not defined\.} \ + "break on nonexistent function in langs.exp" + +if [runto csub] then { + + gdb_test "show language" "currently c\".*" \ + "show language at csub in langs.exp" + # On some machines, foo doesn't get demangled because the N_SOL for + # langs2.cxx is seen only after the function stab for foo. So + # the following regexps are kludged to accept foo__Fi as well as foo, + # even though only the latter is correct. I haven't tried to xfail it + # because it depends on details of the compiler. + + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "bt" "#0.*csub.*#1.*(foo|foo__Fi) \\(.*#2.*cppsub_ .*#3.*fsub.*#4.*langs0__2do \\(.*#5 \[0-9a-fx\]* in main.*" "backtrace in langs.exp" + + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "up" ".* in (foo|foo__Fi) .* at langs2\\.cxx.*return csub \\(.*" \ + "up to foo in langs.exp" + gdb_test "show language" "currently c\\+\\+.*" \ + "show language at foo in langs.exp" + + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "up" ".* in cppsub_ .* at langs2\\.cxx.*return foo \\(.*" \ + "up to cppsub_ in langs.exp" + gdb_test "show language" "currently c\\+\\+.*" \ + "show language at cppsub_ in langs.exp" + + if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "up" ".* in fsub.* at langs1\\.f.*return \\(cppsub .*" \ + "up to fsub in langs.exp" + gdb_test "show language" "currently fortran.*" \ + "show language at fsub in langs.exp" + + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "up" ".* in langs0__2do .* at .*langs0\\.c.*return fsub.*" \ + "up to langs0__2do in langs.exp" + gdb_test "show language" "currently c\".*" \ + "show language at langs0__2do in langs.exp" + + gdb_test "up" ".* in main .* at .*langs0\\.c.*if \\(langs0__2do \\(.*" \ + "up to main in langs.exp" + gdb_test "show language" "currently c\".*" \ + "show language at main in langs.exp" + + if [target_info exists gdb,noresults] { return } + + if [target_info exists use_gdb_stub] { + gdb_breakpoint "exit" + gdb_test "cont" "Breakpoint .*exit.*" "continue to exit in langs.exp" + } else { + gdb_test "cont" "Program exited normally\\..*" \ + "continue to exit in langs.exp" + } +} + +return 0 diff --git a/gdb/testsuite/gdb.base/langs0.c b/gdb/testsuite/gdb.base/langs0.c new file mode 100644 index 00000000000..69c0ce8b0fa --- /dev/null +++ b/gdb/testsuite/gdb.base/langs0.c @@ -0,0 +1,28 @@ +/* This file is actually in C, it is not supposed to simulate something + translated from another language or anything like that. */ +int +csub (x) + int x; +{ + return x + 1; +} + +int +langs0__2do () +{ + return fsub_ () + 2; +} + +int +main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + if (langs0__2do () == 5003) + /* Success. */ + return 0; + else + return 1; +} diff --git a/gdb/testsuite/gdb.base/langs1.c b/gdb/testsuite/gdb.base/langs1.c new file mode 100644 index 00000000000..784225902c4 --- /dev/null +++ b/gdb/testsuite/gdb.base/langs1.c @@ -0,0 +1,33 @@ +/* langs1.f -- translated by f2c (version of 5 May 1990 1:12:08). */ + +/* f2c output hacked as follows for GDB testsuite: + 1. Change commented out "#" lines to #line directives. + I don't know why this behavior isn't the default for f2c -g. + 2. Remove include of f2c.h and put in just a typedef for "integer". + Additional notes: + 3. f2c was called as "f2c -g langs1.f". + 4. We don't need to use the fortran libraries. */ + +typedef int integer; + +/* Table of constant values */ + +static integer c__10000 = 10000; + +/* I am not sure whether there is a way to have a fortran program without */ +/* a MAIN, but it does not really harm us to have one. */ +/* Main program */ MAIN__() +{ +} /* MAIN__ */ + +#line 4 "langs1.f" +/* Subroutine */ int fsub_() +{ + extern integer cppsub_(); + +#line 5 "langs1.f" +#line 6 "langs1.f" + return cppsub_(&c__10000); +#line 7 "langs1.f" +} /* fsub_ */ + diff --git a/gdb/testsuite/gdb.base/langs1.f b/gdb/testsuite/gdb.base/langs1.f new file mode 100644 index 00000000000..35ce6911472 --- /dev/null +++ b/gdb/testsuite/gdb.base/langs1.f @@ -0,0 +1,7 @@ +c I am not sure whether there is a way to have a fortran program without +c a MAIN, but it does not really harm us to have one. + end + subroutine fsub + integer*4 cppsub + return (cppsub (10000)) + end diff --git a/gdb/testsuite/gdb.base/langs2.c b/gdb/testsuite/gdb.base/langs2.c new file mode 100644 index 00000000000..be2a60cfbb8 --- /dev/null +++ b/gdb/testsuite/gdb.base/langs2.c @@ -0,0 +1,15 @@ +/* This is intended to be a vague simulation of cfront output. */ +#line 1 "langs2.cxx" +extern int csub (); +int +foo__Fi (x) int x; +{ + return csub (x / 2); +} + +extern int cppsub_ (); +int +cppsub_ (y) int *y; +{ + return foo__Fi (*y); +} diff --git a/gdb/testsuite/gdb.base/langs2.cxx b/gdb/testsuite/gdb.base/langs2.cxx new file mode 100644 index 00000000000..5a2ca8a1568 --- /dev/null +++ b/gdb/testsuite/gdb.base/langs2.cxx @@ -0,0 +1,13 @@ +extern "C" int csub (int); +int +foo (int x) +{ + return csub (x / 2); +} + +extern "C" int cppsub_ (int *); +int +cppsub_ (int *y) +{ + return foo (*y); +} diff --git a/gdb/testsuite/gdb.base/list.exp b/gdb/testsuite/gdb.base/list.exp new file mode 100644 index 00000000000..f597b9ad2ce --- /dev/null +++ b/gdb/testsuite/gdb.base/list.exp @@ -0,0 +1,521 @@ +# Copyright (C) 1992, 1994, 1995, 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "list" +set binfile ${objdir}/${subdir}/${testfile} + +# Need to download the header to the host. +remote_download host ${srcdir}/${subdir}/list0.h list0.h + + +if { [gdb_compile "${srcdir}/${subdir}/list0.c" "${binfile}0.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${srcdir}/${subdir}/list1.c" "${binfile}1.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${binfile}0.o ${binfile}1.o" ${binfile} executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +# +# Local utility proc just to set and verify listsize +# Return 1 if success, 0 if fail. +# + +set set_listsize_count 0; + +proc set_listsize { arg } { + global gdb_prompt + global set_listsize_count; + + incr set_listsize_count; + if [gdb_test "set listsize $arg" "" "setting listsize to $arg #$set_listsize_count"] { + return 0; + } + if { $arg <= 0 } { + set arg "unlimited"; + } + + if [gdb_test "show listsize" "Number of source lines.* is ${arg}.*" "show listsize $arg #$set_listsize_count"] { + return 0; + } + return 1 +} + +# +# Test display of listsize lines around a given line number. +# + +proc test_listsize {} { + global gdb_prompt + + # Show default size + + gdb_test "show listsize" "Number of source lines gdb will list by default is 10.*" "show default list size" + + # Show the default lines + # The second case is for optimized code, it is still correct. + + if ![isnative] { + runto_main; + unsupported "list default lines around main"; + } else { + gdb_test "list" "(1\[ \t\]+#include \"list0.h\".*10\[ \t\]+x = 0;|2.*11\[ \t\]+foo .x\[+)\]+;)" "list default lines around main" + } + + # Ensure we can limit printouts to one line + + if [ set_listsize 1 ] then { + setup_xfail "*-*-*" + gdb_test "list 1" "1\[ \t\]+#include \"list0.h\"" "list line 1 with listsize 1" + setup_xfail "*-*-*" + gdb_test "list 2" "2\[ \t\]+" "list line 2 with listsize 1" + } + + # Try just two lines + + if [ set_listsize 2 ] { + gdb_test "list 1" "1\[ \t\]+#include \"list0.h\"" "list line 1 with listsize 2" + gdb_test "list 2" "1\[ \t\]+#include \"list0.h\"\r\n2\[ \t\]+" "list line 2 with listsize 2" + gdb_test "list 3" "2\[ \t\]+\r\n3\[ \t\]+main \[)(\]+" "list line 3 with listsize 2" + } + + # Try small listsize > 1 that is an odd number + + if [ set_listsize 3 ] { + setup_xfail "*-*-*" + gdb_test "list 1" "1\[ \t\]+#include \"list0.h\"2\[ \t\]+" "list line 1 with listsize 3" + setup_xfail "*-*-*" + gdb_test "list 2" "1\[ \t\]+#include \"list0.h\".*3\[ \t\]+main \[)(\]+" "list line 2 with listsize 3" + + setup_xfail "*-*-*" + gdb_test "list 3" "2\[ \t\]+\r\n3\[ \t\]+main \[(\]+\[)\]+\r\n4\[ \t\]+\{" "list line 3 with listsize 3" + } + + # Try small listsize > 2 that is an even number. + + if [ set_listsize 4 ] then { + gdb_test "list 1" "1\[ \t\]+#include \"list0.h\"\r\n2\[ \t\]+" "list line 1 with listsize 4" + gdb_test "list 2" "1\[ \t\]+#include \"list0.h\".*3\[ \t\]+main \[)(\]+" "list line 2 with listsize 4" + + gdb_test "list 3" "1\[ \t\]+#include \"list0.h\".*4\[ \t\]+\{" "list line 3 with listsize 4" + gdb_test "list 4" "2\[ \t\]+\r\n.*5\[ \t\]+int x;.*" "list line 4 with listsize 4" + } + + # Try a size larger than the entire file. + + if [ set_listsize 100 ] then { + gdb_test "list 1" "1\[ \t\]+#include \"list0.h\".*\r\n42\[ \t\]+\}" "list line 1 with listsize 100" + + gdb_test "list 10" "1\[ \t\]+#include \"list0.h\".*\r\n42\[ \t\]+\}" "list line 10 with listsize 100" + } + + # Try listsize of 0 which suppresses printing. + + set_listsize 0 + gdb_test "list 1" "" "listsize of 0 suppresses output" + + # Try listsize of -1 which is special, and means unlimited. + + set_listsize -1 + setup_xfail "*-*-*" + gdb_test "list 1" "1\[ \t\]+#include .*\r\n39\[ \t\]+\}" "list line 1 with unlimited listsize" +} + +# +# Test "list filename:number" for C include file +# + +proc test_list_include_file {} { + global gdb_prompt + + setup_xfail "a29k-*-udi" + setup_xfail_format "DWARF 1" + setup_xfail_format "COFF" + gdb_test "list list0.h:1" "1\[ \t\]+/\[*\]+ An include file .*5\[ \t\]+foo \[(\]+x\[)\]+" "list line 1 in include file" + + setup_xfail "a29k-*-udi" + setup_xfail_format "DWARF 1" + setup_xfail_format "COFF" + gdb_test "list list0.h:100" "Line number 95 out of range; .*list0.h has 36 lines." "list message for lines past EOF" +} + +# +# Test "list filename:number" for C source file +# + +proc test_list_filename_and_number {} { + global gdb_prompt + + set testcnt 0 + + send_gdb "list list0.c:1\n" + gdb_expect { + -re "1\[ \t\]+#include \"list0.h\".*5\[ \t\]+int x;\r\n$gdb_prompt $" { + incr testcnt + } + -re ".*$gdb_prompt $" { fail "list list0.c:1" ; gdb_suppress_tests } + timeout { fail "list list0.c:1 (timeout)" ; gdb_suppress_tests } + } + send_gdb "list list0.c:10\n" + gdb_expect { + -re "5\[ \t\]+int x;.*14\[ \t\]+foo .x\[+)\]+;\r\n$gdb_prompt $" { + incr testcnt + } + -re ".*$gdb_prompt $" { fail "list list.c:10" ; gdb_suppress_tests } + timeout { fail "list list.c:10 (timeout)" ; gdb_suppress_tests } + } + send_gdb "list list1.c:1\n" + gdb_expect { + -re "1\[ \t\]+void.*5\[ \t\]+printf \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { + incr testcnt + } + -re ".*$gdb_prompt $" { fail "list list1.c:1" ; gdb_suppress_tests } + timeout { fail "list list1.c:1 (timeout)" ; gdb_suppress_tests } + } + send_gdb "list list1.c:12\n" + gdb_expect { + -re "7\[ \t\]+long_line \[(\]+.*\[)\]+;.*14\[ \t\]+\}\r\n.*$gdb_prompt $" { + incr testcnt + } + -re ".*$gdb_prompt $" { fail "list list1.c:12" ; gdb_suppress_tests } + timeout { fail "list list1.c:12 (timeout)" ; gdb_suppress_tests } + } + pass "list filename:number ($testcnt tests)" + gdb_stop_suppressing_tests; +} + +# +# Test "list function" for C source file +# + +proc test_list_function {} { + global gdb_prompt + global gcc_compiled + + # gcc appears to generate incorrect debugging information for code + # in include files, which breaks this test. + # SunPRO cc is the second case below, it's also correct. + setup_xfail "a29k-*-udi" + gdb_test "list main" "(5\[ \t\]+int x;.*14\[ \t\]+foo \[(\]+.*\[)\]+;|1\[ \t\]+#include .*8\[ \t\]+breakpoint\[(\]\[)\]+;)" "list function in source file 1" + + # Ultrix gdb takes the second case below; it's also correct. + # SunPRO cc is the third case. + gdb_test "list bar" "(1\[ \t\]+void.*7\[ \t\]*long_line ..;.*9\[ \t\]*|1\[ \t\]+void.*8\[ \t\]+\}|1\[ \t\]+void.*7\[ \t\]*long_line ..;)" "list function in source file 2" + + # Test "list function" for C include file + # Ultrix gdb is the second case, still correct. + # SunPRO cc is the third case. + setup_xfail "powerpc-*-*" + setup_xfail_format "DWARF 1" + gdb_test "list foo" "(3\[ \t\]+.*12\[ \t\]+bar \[(\]+.*\[)\]+;|2\[ \t\]+including file.*11\[ \t\]+bar \[(\]+.*\[)\]+;|1\[ \t\]+/. An include file.*10\[ \t\]+bar \[(\]+.*\[)\]+;)" "list function in include file" +} + +proc test_list_forward {} { + global gdb_prompt + + set testcnt 0 + + send_gdb "list list0.c:10\n" + gdb_expect { + -re "5\[ \t\]+int x;.*14\[ \t\]+foo \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { incr testcnt } + -re ".*$gdb_prompt $" { fail "list list0.c:10" ; gdb_suppress_tests } + timeout { fail "list list0.c:10 (timeout)" ; gdb_suppress_tests } + } + + send_gdb "list\n" + gdb_expect { + -re "15\[ \t\]+foo \[(\]+.*\[)\]+;.*24\[ \t\]+foo \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { incr testcnt } + -re ".*$gdb_prompt $" { fail "list 15-24" ; gdb_suppress_tests } + timeout { fail "list 15-24 (timeout)" ; gdb_suppress_tests } + } + + send_gdb "list\n" + gdb_expect { + -re "25\[ \t\]+foo \[(\]+.*\[)\]+;.*34\[ \t\]+foo \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { incr testcnt } + -re ".*$gdb_prompt $" { fail "list 25-34" ; gdb_suppress_tests } + timeout { fail "list 25-34 (timeout)" ; gdb_suppress_tests } + } + + send_gdb "list\n" + gdb_expect { + -re "35\[ \t\]+foo \[(\]+.*\[)\]+;.*42\[ \t\]+\}\r\n$gdb_prompt $" { incr testcnt } + -re ".*$gdb_prompt $" { fail "list 35-42" ; gdb_suppress_tests } + timeout { fail "list 35-42 (timeout)" ; gdb_suppress_tests } + } + + pass "successive list commands to page forward ($testcnt tests)" + gdb_stop_suppressing_tests; +} + +proc test_list_backwards {} { + global gdb_prompt + + set testcnt 0 + + send_gdb "list list0.c:33\n" + gdb_expect { + -re "28\[ \t\]+foo \[(\]+.*\[)\]+;.*37\[ \t\]+\r\n$gdb_prompt $" { incr testcnt } + -re ".*$gdb_prompt $" { fail "list list0.c:33" ; gdb_suppress_tests } + timeout { fail "list list0.c:33 (timeout)" ; gdb_suppress_tests } + } + + send_gdb "list -\n" + gdb_expect { + -re "18\[ \t\]+foo \[(\]+.*\[)\]+;.*27\[ \t\]+foo \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { incr testcnt } + -re ".*$gdb_prompt $" { fail "list 18-27" ; gdb_suppress_tests } + timeout { fail "list 18-27 (timeout)" ; gdb_suppress_tests } + } + + send_gdb "list -\n" + gdb_expect { + -re "8\[ \t\]+breakpoint\[(\]\[)\];.*17\[ \t\]+foo \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { incr testcnt } + -re ".*$gdb_prompt $" { fail "list 8-17" ; gdb_suppress_tests } + timeout { fail "list 8-17 (timeout)" ; gdb_suppress_tests } + } + + send_gdb "list -\n" + gdb_expect { + -re "1\[ \t\]+#include .*7\[ \t\]+set_debug_traps\[(\]\[)\]+;\r\n$gdb_prompt $" { incr testcnt } + -re ".*$gdb_prompt $" { fail "list 1-7" ; gdb_suppress_tests } + timeout { fail "list 1-7 (timeout)" ; gdb_suppress_tests } + } + + pass "$testcnt successive \"list -\" commands to page backwards" + gdb_stop_suppressing_tests; +} + +# +# Test "list first,last" +# + +proc test_list_range {} { + global gdb_prompt + + gdb_test "list list0.c:2,list0.c:5" "2\[ \t\]+\r\n3\[ \t\]+main \[)(\]+.*5\[ \t\]+int x;" "list range; filename:line1,filename:line2" + + gdb_test "list 2,5" "2\[ \t\]+\r\n3\[ \t\]+main \[)(\]+.*5\[ \t\]+int x;" "list range; line1,line2" + +# gdb_test "list -1,6" "Line number 0 out of range; .*list0.c has 39 lines." "list range; lower bound negative" + +# gdb_test "list -100,-40" "Line number -60 out of range; .*list0.c has 39 lines." "list range; both bounds negative" + + gdb_test "list 30,43" "30\[ \t\]+foo \[(\]+.*\[)\]+;.*42\[ \t\]+\}" "list range; upper bound past EOF" + + gdb_test "list 43,100" "Line number 43 out of range; .*list0.c has 42 lines." "list range; both bounds past EOF" + + gdb_test "list list0.c:2,list1.c:17" "Specified start and end are in different files." "list range, must be same files" +} + +# +# Test "list filename:function" +# + +proc test_list_filename_and_function {} { + global gdb_prompt + + set testcnt 0 + + # gcc appears to generate incorrect debugging information for code + # in include files, which breaks this test. + # SunPRO cc is the second case below, it's also correct. + setup_xfail "a29k-*-udi" + send_gdb "list list0.c:main\n" + gdb_expect { + -re "1\[ \t\]+#include .*8\[ \t\]+breakpoint\[(\]\[)\]+;\r\n$gdb_prompt $" { + incr testcnt + } + -re "5\[ \t\]+int x;.*14\[ \t\]+foo \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { + pass "list function in source file 1" + } + -re ".*$gdb_prompt $" { fail "list list0.c:main" } + timeout { fail "list list0.c:main (timeout)" } + } + + # The i960 and a29k-amd-udi are the second case + + # Not sure what the point of having this function be unused is. + # AIX is legitimately removing it. + setup_xfail "rs6000-*-aix*" + send_gdb "list list0.c:unused\n" + gdb_expect { + -re "36\[ \t\]+\}.*42\[ \t\]+\}\r\n$gdb_prompt $" { + incr testcnt + } + -re "37.*42\[ \t\]+\}\r\n$gdb_prompt $" { + incr testcnt + } + -re ".*$gdb_prompt $" { fail "list list0.c:unused" } + timeout { fail "list list0.c:unused (timeout)" } + } + clear_xfail "rs6000-*-aix*" + + # gcc appears to generate incorrect debugging information for code + # in include files, which breaks this test. + # Ultrix gdb is the second case, one line different but still correct. + # SunPRO cc is the third case. + setup_xfail "rs6000-*-*" 1804 + setup_xfail "powerpc-*-*" 1804 + setup_xfail "a29k-*-udi" + setup_xfail_format "DWARF 1" + setup_xfail_format "COFF" + send_gdb "list list0.h:foo\n" + gdb_expect { + -re "2\[ \t\]+including file. This.*11\[ \t\]+bar \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { + incr testcnt + } + -re "1\[ \t\]+/. An include file.*10\[ \t\]+bar \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { + incr testcnt + } + -re "3\[ \t\]+.*12\[ \t\]+bar \[(\]+.*\[)\]+;\r\n$gdb_prompt $" { + incr testcnt + } + -re "No source file named list0.h.\r\n$gdb_prompt $" { + fail "list list0.h:foo" + } + -re ".*$gdb_prompt $" { fail "list list0.h:foo" } + timeout { fail "list list0.h:foo (timeout)" } + } + + # Ultrix gdb is the second case. + # a29k-amd-udi is the third case. + send_gdb "list list1.c:bar\n" + gdb_expect { + -re "1\[ \t\]+void.*8\[ \t\]+\}\r\n$gdb_prompt $" { + incr testcnt + } + -re "1\[ \t\]+void.*7\[ \t\]*long_line ..;\r\n$gdb_prompt $" { + incr testcnt + } + -re "1\[ \t\]+void.*9\[ \t\]*\r\n$gdb_prompt $" { + incr testcnt + } + -re ".*$gdb_prompt $" { fail "list list1.c:bar" } + timeout { fail "list list1.c:bar (timeout)" } + } + + # The i960 and a29k-amd-udi are the second case + + # Not sure what the point of having this function be unused is. + # AIX is legitimately removing it. + setup_xfail "rs6000-*-aix*" + send_gdb "list list1.c:unused\n" + gdb_expect { + -re "7\[ \t\]+long_line \[(\]\[)\];.*14\[ \t\]+\}\r\n.*$gdb_prompt $" { + incr testcnt + } + -re "9.*14\[ \t\]+\}\r\n.*$gdb_prompt $" { + incr testcnt + } + -re ".*$gdb_prompt $" { fail "list list1.c:unused" } + timeout { fail "list list1.c:unused (timeout)" } + } + clear_xfail "rs6000-*-aix*" + + pass "list filename:function ($testcnt tests)" + + # Test some invalid specs + # The following test takes the FIXME result on most systems using + # DWARF. It fails to notice that main() is not in the file requested. + + setup_xfail "*-*-*" + +# Does this actually work ANYWHERE? I believe not, as this is an `aspect' of +# lookup_symbol(), where, when it is given a specific symtab which does not +# contain the requested symbol, it will subsequently search all of the symtabs +# for the requested symbol. + + gdb_test "list list0.c:foo" "Function \"foo\" not defined in .*list0.c" "list filename:function; wrong filename rejected" + + gdb_test "list foobar.c:main" "No source file named foobar.c." "list filename:function; nonexistant file" + + setup_xfail_format "DWARF 1" + gdb_test "list list0.h:foobar" "Function \"foobar\" not defined." "list filename:function; nonexistant function" + +} + +proc test_forward_search {} { + global timeout + + gdb_test "set listsize 4" "" + # On SunOS4, this gives us lines 19-22. On AIX, it gives us + # lines 20-23. This depends on whether the line number of a function + # is considered to be the openbrace or the first statement--either one + # is acceptable. + gdb_test "list long_line" "20\[ \t\]+long_line .*" + + gdb_test "search 4321" " not found" + + gdb_test "search 6789" "24\[ \t\]+oof .6789.;" + + # Test that GDB won't crash if the line being searched is extremely long. + + set oldtimeout $timeout + set timeout [expr "$timeout + 300"] + verbose "Timeout is now $timeout seconds" 2 + gdb_test "search 1234" ".*1234.*" "search extremely long line (> 5000 chars)" + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + +gdb_test "set width 0" "" "set width 0" + +test_listsize +get_debug_format +if [ set_listsize 10 ] then { + test_list_include_file + test_list_filename_and_number + test_list_function + test_list_forward + test_list_backwards + test_list_range + test_list_filename_and_function + test_forward_search +} diff --git a/gdb/testsuite/gdb.base/list0.c b/gdb/testsuite/gdb.base/list0.c new file mode 100644 index 00000000000..a5561a766a1 --- /dev/null +++ b/gdb/testsuite/gdb.base/list0.c @@ -0,0 +1,42 @@ +#include "list0.h" + +main () +{ + int x; +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + x = 0; + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); + foo (x++); +} + +static void +unused () +{ + /* Not used for anything */ +} diff --git a/gdb/testsuite/gdb.base/list0.h b/gdb/testsuite/gdb.base/list0.h new file mode 100644 index 00000000000..c4d337c6770 --- /dev/null +++ b/gdb/testsuite/gdb.base/list0.h @@ -0,0 +1,36 @@ +/* An include file that actually causes code to be generated in the + including file. This is known to cause problems on some systems. */ + +static void +foo (x) +int x; +{ + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); + bar (x++); +} diff --git a/gdb/testsuite/gdb.base/list1.c b/gdb/testsuite/gdb.base/list1.c new file mode 100644 index 00000000000..51632b94d07 --- /dev/null +++ b/gdb/testsuite/gdb.base/list1.c @@ -0,0 +1,33 @@ +void +bar (x) +int x; +{ + printf ("%d\n", x); + + long_line (); +} + +static void +unused () +{ + /* Not used for anything */ +} + + +/* This routine has a very long line that will break searching in older + versions of GDB. */ + +long_line () +{ + oof (67); + + oof (6789); + + oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 5 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 10 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 15 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 20 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 25 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 30 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 35 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 40 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 45 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 50 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 55 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 60 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* 65 */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (12); /* */ oof (12); oof (12); oof (12); oof (12); oof (12); oof (1234); /* 70 */ +} + +oof (n) + int n; +{ + return n + 1; +} diff --git a/gdb/testsuite/gdb.base/logical.exp b/gdb/testsuite/gdb.base/logical.exp new file mode 100644 index 00000000000..0458e61cb11 --- /dev/null +++ b/gdb/testsuite/gdb.base/logical.exp @@ -0,0 +1,575 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite + +# +# tests for correctenss of logical operators, associativity and precedence +# with integer type variables +# + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "int-type" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# +# test expressions with "int" types +# + +gdb_test "set variable x=0" "" "set variable x=0" +gdb_test "set variable y=0" "" "set variable y=0" +gdb_test "set variable z=0" "" "set variable z=0" + +send_gdb "print x\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x" + } + -re ".*$gdb_prompt $" { fail "print value of x" } + timeout { fail "(timeout) print value of x" } + } + + +send_gdb "print y\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of y" + } + -re ".*$gdb_prompt $" { fail "print value of y" } + timeout { fail "(timeout) print value of y" } + } + +send_gdb "print z\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of z" + } + -re ".*$gdb_prompt $" { fail "print value of z" } + timeout { fail "(timeout) print value of z" } + } + + +# truth tables for && , || , ! + +send_gdb "print x && y\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of xy" + } + -re ".*$gdb_prompt $" { fail "print value of x>y" } + timeout { fail "(timeout) print value of x>y" } + } + +gdb_test "set variable y=1" "" "set variable y=1" + +send_gdb "print x && y\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of xy" + } + -re ".*$gdb_prompt $" { fail "print value of x>y" } + timeout { fail "(timeout) print value of x>y" } + } + +gdb_test "set variable y=0" "" "set variable y=0" + +send_gdb "print x && y\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x y || w == z\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of x > y || w == z" + } + -re ".*$gdb_prompt $" { fail "print value of x > y || w == z" } + timeout { fail "(timeout) print value of x > y || w == z " } + } + + +gdb_test "set variable x=1" "" "set variable x=1" +gdb_test "set variable y=2" "" "set variable y=2" +gdb_test "set variable w=1" "" "set variable w=1" +gdb_test "set variable z=3" "" "set variable z=3" + + +send_gdb "print x >= y && w != z\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x >= y || w != z" + } + -re ".*$gdb_prompt $" { fail "print value of x >= y || w != z" } + timeout { fail "(timeout) print value of x >= y || w != z " } + } + + + +gdb_test "set variable x=2" "" "set variable x=2" +gdb_test "set variable y=2" "" "set variable y=2" +gdb_test "set variable w=2" "" "set variable w=2" +gdb_test "set variable z=3" "" "set variable z=3" + + +send_gdb "print ! x > y || w + z\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of x > y || w != z" + } + -re ".*$gdb_prompt $" { fail "print value of x > y || w != z" } + timeout { fail "(timeout) print value of x > y || w != z " } + } + + + + + + + + + + + + + + + + + diff --git a/gdb/testsuite/gdb.base/long_long.c b/gdb/testsuite/gdb.base/long_long.c new file mode 100644 index 00000000000..096528d1d20 --- /dev/null +++ b/gdb/testsuite/gdb.base/long_long.c @@ -0,0 +1,55 @@ +/* Test long long expression; test printing in general. + * + * /CLO/BUILD_ENV/Exports/cc -g +e -o long_long long_long.c + * + * or + * + * cc +e +DA2.0 -g -o long_long long_long.c + */ + +long long callee( i ) +long long i; +{ + register long long result; + + result = 0x12345678; + result = result << i; + result += 0x9abcdef0; + + return result; +} + +int known_types() +{ + long long bin = 0, oct = 0, dec = 0, hex = 0; + + /* Known values, filling the full 64 bits. + */ + bin = 0x123456789abcdefLL; /* 64 bits = 16 hex digits */ + oct = 01234567123456701234567LL; /* = 21+ octal digits */ + dec = 12345678901234567890LL; /* = 19+ decimal digits */ + + /* Stop here and look! + */ + hex = bin - dec | oct; +} + +int main() { + + register long long x, y; + register long long i; + + x = (long long) 0xfedcba9876543210LL; + y = x++; + x +=y; + i = 11; + x = callee( i ); + y += x; + + known_types(); + + return 0; +} + + + diff --git a/gdb/testsuite/gdb.base/long_long.exp b/gdb/testsuite/gdb.base/long_long.exp new file mode 100644 index 00000000000..aca59c2e546 --- /dev/null +++ b/gdb/testsuite/gdb.base/long_long.exp @@ -0,0 +1,163 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + + +# long_long.exp Test printing of 64-bit things in 32-bit gdb. +# Also test differnet kinds of formats. +# +if $tracelevel then { + strace $tracelevel +} + +set testfile long_long +set srcfile ${srcdir}/${subdir}/${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +# What compiler are we using? +# +if [get_compiler_info ${binfile}] { + return -1 +} + +if {$gcc_compiled == 0} { + if [istarget "hppa*-hp-hpux*"] then { + ### FIXME +e only works with HP's compiler + set additional_flags "additional_flags=+e -w" + } else { + # don't know what the compiler is, hope it supports long long! + set additional_flags "additional_flags=-w" + } +} else { + set additional_flags "additional_flags=-w" +} + +if { [gdb_compile "${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# use this to debug: +#log_user 1 + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if { ![runto known_types] } then { + fail "run to known_types" + return +} + +gdb_test "n 4" ".*34.*" "get to known place" + +# Check the hack for long long prints. +# +gdb_test "p/x hex" ".*0x0.*" "default print hex" +gdb_test "p/x dec" ".*0xab54a98ceb1f0ad2.*" "default print dec" +gdb_test "p/x bin" ".*0x123456789abcdef.*" "default print bin" +gdb_test "p/x oct" ".*0xa72ee53977053977.*" "default print oct" + +gdb_test "p/x hex" ".*0x0.*" "hex print" +gdb_test "p/u dec" ".*12345678901234567890.*" "decimal print" +gdb_test "p/t bin" ".*100100011010001010110011110001001101010111100110111101111.*" "binary print" +gdb_test "p/o oct" ".*01234567123456701234567.*" "octal print" + +# Try all the combinations to bump up coverage. +# +gdb_test "p/d oct" ".*12046818088235383159.*" "" +gdb_test "p/u oct" ".*0xa72ee53977053977.*" "" +gdb_test "p/o oct" ".*.*" "" +gdb_test "p/t oct" ".*1010011100101110111001010011100101110111000001010011100101110111.*" "" +gdb_test "p/a oct" ".*That operation is not available.*" "" +gdb_test "p/c oct" ".*0xa72ee53977053977.*" "" +gdb_test "p/f oct" ".*-5.9822653797615723e-120.*" "" + +gdb_test "p/d *(int *)&oct" ".*-1490098887.*" "" +gdb_test "p/u *(int *)&oct" ".*2804868409.*" "" +gdb_test "p/o *(int *)&oct" ".*024713562471.*" "" +gdb_test "p/t *(int *)&oct" ".*10100111001011101110010100111001.*" "" +gdb_test "p/a *(int *)&oct" ".*0xa72ee539.*" "" +gdb_test "p/c *(int *)&oct" ".*57 '9'.*" "" +gdb_test "p/f *(int *)&oct" ".*-2.42716126e-15.*" "" + +gdb_test "p/d *(short *)&oct" ".*-22738.*" "" +gdb_test "p/u *(short *)&oct" ".*42798.*" "" +gdb_test "p/o *(short *)&oct" ".*0123456.*" "" +gdb_test "p/t *(short *)&oct" ".*1010011100101110.*" "" +gdb_test "p/a *(short *)&oct" ".*0xffffa72e.*" "" +gdb_test "p/c *(short *)&oct" ".* 46 '.'.*" "" +gdb_test "p/a **short *)&oct" ".*0xffffa72e <.*" "" +gdb_test "p/f *(short *)&oct" ".*-22738.*" "" + +gdb_test "x/x &oct" ".*0xa72ee539.*" "" +gdb_test "x/d &oct" ".*.-1490098887*" "" +gdb_test "x/u &oct" ".*2804868409.*" "" +gdb_test "x/o &oct" ".*024713562471.*" "" +gdb_test "x/t &oct" ".*10100111001011101110010100111001.*" "" +gdb_test "x/a &oct" ".*0xa72ee539 <.*" "" +gdb_test "x/c &oct" ".*-89 'M-''.*" "" +gdb_test "x/f &oct" ".*-5.9822653797615723e-120.*" "" + +gdb_test "x/2x &oct" ".*.*" "" +gdb_test "x/2d &oct" ".*.*" "" +gdb_test "x/2u &oct" ".*.*" "" +gdb_test "x/2o &oct" ".*.*" "" +gdb_test "x/2t &oct" ".*.*" "" +gdb_test "x/2a &oct" ".*.*" "" +gdb_test "x/2c &oct" ".*.*" "" +gdb_test "x/2f &oct" ".*.*" "" + +gdb_test "x/2bx &oct" ".*.*" "" +gdb_test "x/2bd &oct" ".*.*" "" +gdb_test "x/2bu &oct" ".*.*" "" +gdb_test "x/2bo &oct" ".*.*" "" +gdb_test "x/2bt &oct" ".*.*" "" +gdb_test "x/2ba &oct" ".*.*" "" +gdb_test "x/2bc &oct" ".*.*" "" +gdb_test "x/2bf &oct" ".*.*" "" + +gdb_test "x/2hx &oct" ".*.*" "" +gdb_test "x/2hd &oct" ".*.*" "" +gdb_test "x/2hu &oct" ".*.*" "" +gdb_test "x/2ho &oct" ".*.*" "" +gdb_test "x/2ht &oct" ".*.*" "" +gdb_test "x/2ha &oct" ".*.*" "" +gdb_test "x/2hc &oct" ".*.*" "" +gdb_test "x/2hf &oct" ".*.*" "" + +gdb_test "x/2wx &oct" ".*.*" "" +gdb_test "x/2wd &oct" ".*.*" "" +gdb_test "x/2wu &oct" ".*.*" "" +gdb_test "x/2wo &oct" ".*.*" "" +gdb_test "x/2wt &oct" ".*.*" "" +gdb_test "x/2wa &oct" ".*.*" "" +gdb_test "x/2wc &oct" ".*.*" "" +gdb_test "x/2wf &oct" ".*.*" "" + +gdb_test "x/2gx &oct" ".*.*" "" +gdb_test "x/2gd &oct" ".*.*" "" +gdb_test "x/2gu &oct" ".*.*" "" +gdb_test "x/2go &oct" ".*.*" "" +gdb_test "x/2gt &oct" ".*.*" "" +gdb_test "x/2ga &oct" ".*.*" "" +gdb_test "x/2gc &oct" ".*.*" "" +gdb_test "x/2gf &oct" ".*.*" "" + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/m32r.ld b/gdb/testsuite/gdb.base/m32r.ld new file mode 100644 index 00000000000..b96077adb6a --- /dev/null +++ b/gdb/testsuite/gdb.base/m32r.ld @@ -0,0 +1,160 @@ +OUTPUT_FORMAT("elf32-m32r", "elf32-m32r", + "elf32-m32r") +OUTPUT_ARCH(m32r) +ENTRY(_start) + SEARCH_DIR(/usr/cygnus/m32r-961018/H-sparc-sun-sunos4.1//lib); +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + OVERLAY 0x300000 : AT (0x400000) + { + .ovly0 { foo.o(.text) } + .ovly1 { bar.o(.text) } + } + OVERLAY 0x380000 : AT (0x480000) + { + .ovly2 { baz.o(.text) } + .ovly3 { grbx.o(.text) } + } + OVERLAY 0x340000 : AT (0x440000) + { + .data00 { foo.o(.data) } + .data01 { bar.o(.data) } + } + OVERLAY 0x3C0000 : AT (0x4C0000) + { + .data02 { baz.o(.data) } + .data03 { grbx.o(.data) } + } + + /* Read-only sections, merged into text segment: */ + . = 0x208000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .rel.text : { *(.rel.text) } + .rela.text : { *(.rela.text) } + .rel.data : { *(.rel.data) } + .rela.data : { *(.rela.data) } + .rel.rodata : { *(.rel.rodata) } + .rela.rodata : { *(.rela.rodata) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .init : { *(.init) } =0 + .plt : { *(.plt) } + .text : + { + *(.text) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : { *(.fini) } =0 + .rodata : { *(.rodata) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(32) + (ALIGN(8) & (32 - 1)); + .data : + { + *(.data) + *(.gnu.linkonce.d*) + _ovly_table = .; + _ovly0_entry = .; + LONG(ABSOLUTE(ADDR(.ovly0))); + LONG(SIZEOF(.ovly0)); + LONG(LOADADDR(.ovly0)); + LONG(0); + _ovly1_entry = .; + LONG(ABSOLUTE(ADDR(.ovly1))); + LONG(SIZEOF(.ovly1)); + LONG(LOADADDR(.ovly1)); + LONG(0); + _ovly2_entry = .; + LONG(ABSOLUTE(ADDR(.ovly2))); + LONG(SIZEOF(.ovly2)); + LONG(LOADADDR(.ovly2)); + LONG(0); + _ovly3_entry = .; + LONG(ABSOLUTE(ADDR(.ovly3))); + LONG(SIZEOF(.ovly3)); + LONG(LOADADDR(.ovly3)); + LONG(0); + _data00_entry = .; + LONG(ABSOLUTE(ADDR(.data00))); + LONG(SIZEOF(.data00)); + LONG(LOADADDR(.data00)); + LONG(0); + _data01_entry = .; + LONG(ABSOLUTE(ADDR(.data01))); + LONG(SIZEOF(.data01)); + LONG(LOADADDR(.data01)); + LONG(0); + _data02_entry = .; + LONG(ABSOLUTE(ADDR(.data02))); + LONG(SIZEOF(.data02)); + LONG(LOADADDR(.data02)); + LONG(0); + _data03_entry = .; + LONG(ABSOLUTE(ADDR(.data03))); + LONG(SIZEOF(.data03)); + LONG(LOADADDR(.data03)); + LONG(0); + _novlys = .; + LONG((_novlys - _ovly_table) / 16); + + CONSTRUCTORS + } + .data1 : { *(.data1) } + .ctors : { *(.ctors) } + .dtors : { *(.dtors) } + .got : { *(.got.plt) *(.got)} + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : { *(.sdata) } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + .sbss : { *(.sbss) *(.scommon) } + .bss : { *(.dynbss) *(.bss) *(COMMON) } + _end = . ; + PROVIDE (end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the .debug DWARF section are relative to the beginning of the + section so we begin .debug at 0. It's not clear yet what needs to happen + for the others. */ + .debug 0 : { *(.debug) } + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_sfnames 0 : { *(.debug_sfnames) } + .line 0 : { *(.line) } + .stack 0x5ffffc : { _stack = .; *(.stack) } + /* These must appear regardless of . */ +} diff --git a/gdb/testsuite/gdb.base/m32rovly.c b/gdb/testsuite/gdb.base/m32rovly.c new file mode 100644 index 00000000000..bdb90feae6b --- /dev/null +++ b/gdb/testsuite/gdb.base/m32rovly.c @@ -0,0 +1,225 @@ + +/* + * Ovlymgr.c -- Runtime Overlay Manager for the GDB testsuite. + */ + +#include "ovlymgr.h" + +/* Local functions and data: */ + +extern unsigned long _ovly_table[][4]; +extern unsigned long _novlys __attribute__ ((section (".data"))); +enum ovly_index { VMA, SIZE, LMA, MAPPED}; + +static void ovly_copy (unsigned long dst, unsigned long src, long size); + +/* Flush the data and instruction caches at address START for SIZE bytes. + Support for each new port must be added here. */ +/* FIXME: Might be better to have a standard libgloss function that + ports provide that we can then use. Use libgloss instead of newlib + since libgloss is the one intended to handle low level system issues. + I would suggest something like _flush_cache to avoid the user's namespace + but not be completely obscure as other things may need this facility. */ + +static void +FlushCache (void) +{ +#ifdef __M32R__ + volatile char *mspr = (char *) 0xfffffff7; + *mspr = 1; +#endif +} + +/* OverlayLoad: + * Copy the overlay into its runtime region, + * and mark the overlay as "mapped". + */ + +bool +OverlayLoad (unsigned long ovlyno) +{ + unsigned long i; + + if (ovlyno < 0 || ovlyno >= _novlys) + exit (-1); /* fail, bad ovly number */ + + if (_ovly_table[ovlyno][MAPPED]) + return TRUE; /* this overlay already mapped -- nothing to do! */ + + for (i = 0; i < _novlys; i++) + if (i == ovlyno) + _ovly_table[i][MAPPED] = 1; /* this one now mapped */ + else if (_ovly_table[i][VMA] == _ovly_table[ovlyno][VMA]) + _ovly_table[i][MAPPED] = 0; /* this one now un-mapped */ + + ovly_copy (_ovly_table[ovlyno][VMA], + _ovly_table[ovlyno][LMA], + _ovly_table[ovlyno][SIZE]); + + FlushCache (); + + return TRUE; +} + +/* OverlayUnload: + * Copy the overlay back into its "load" region. + * Does NOT mark overlay as "unmapped", therefore may be called + * more than once for the same mapped overlay. + */ + +bool +OverlayUnload (unsigned long ovlyno) +{ + if (ovlyno < 0 || ovlyno >= _novlys) + exit (-1); /* fail, bad ovly number */ + + if (!_ovly_table[ovlyno][MAPPED]) + exit (-1); /* error, can't copy out a segment that's not "in" */ + + ovly_copy (_ovly_table[ovlyno][LMA], + _ovly_table[ovlyno][VMA], + _ovly_table[ovlyno][SIZE]); + + return TRUE; +} + +#ifdef __D10V__ +#define IMAP0 (*(short *)(0xff00)) +#define IMAP1 (*(short *)(0xff02)) +#define DMAP (*(short *)(0xff04)) + +static void +D10VTranslate (unsigned long logical, + short *dmap, + unsigned long **addr) +{ + unsigned long physical; + unsigned long seg; + unsigned long off; + + /* to access data, we use the following mapping + 0x00xxxxxx: Logical data address segment (DMAP translated memory) + 0x01xxxxxx: Logical instruction address segment (IMAP translated memory) + 0x10xxxxxx: Physical data memory segment (On-chip data memory) + 0x11xxxxxx: Physical instruction memory segment (On-chip insn memory) + 0x12xxxxxx: Phisical unified memory segment (Unified memory) + */ + + /* Addresses must be correctly aligned */ + if (logical & (sizeof (**addr) - 1)) + exit (-1); + + /* If the address is in one of the two logical address spaces, it is + first translated into a physical address */ + seg = (logical >> 24); + off = (logical & 0xffffffL); + switch (seg) + { + case 0x00: /* in logical data address segment */ + if (off <= 0x7fffL) + physical = (0x10L << 24) + off; + else + /* Logical address out side of on-chip segment, not + supported */ + exit (-1); + break; + case 0x01: /* in logical instruction address segment */ + { + short map; + if (off <= 0x1ffffL) + map = IMAP0; + else if (off <= 0x3ffffL) + map = IMAP1; + else + /* Logical address outside of IMAP[01] segment, not + supported */ + exit (-1); + if (map & 0x1000L) + { + /* Instruction memory */ + physical = (0x11L << 24) | off; + } + else + { + /* Unified memory */ + physical = ((map & 0x7fL) << 17) + (off & 0x1ffffL); + if (physical > 0xffffffL) + /* Address outside of unified address segment */ + exit (-1); + physical |= (0x12L << 24); + } + break; + } + case 0x10: + case 0x11: + case 0x12: + physical = logical; + break; + default: + exit (-1); /* error */ + } + + seg = (physical >> 24); + off = (physical & 0xffffffL); + switch (seg) + { + case 0x10: /* dst is a 15 bit offset into the on-chip memory */ + *dmap = 0; + *addr = (long *) (0x0000 + ((short)off & 0x7fff)); + break; + case 0x11: /* dst is an 18-bit offset into the on-chip + instruction memory */ + *dmap = 0x1000L | ((off & 0x3ffffL) >> 14); + *addr = (long *) (0x8000 + ((short)off & 0x3fff)); + break; + case 0x12: /* dst is a 24-bit offset into unified memory */ + *dmap = off >> 14; + *addr = (long *) (0x8000 + ((short)off & 0x3fff)); + break; + default: + exit (-1); /* error */ + } +} +#endif /* __D10V__ */ + +static void +ovly_copy (unsigned long dst, unsigned long src, long size) +{ +#ifdef __M32R__ + memcpy ((void *) dst, (void *) src, size); + return; +#endif /* M32R */ + +#ifdef __D10V__ + unsigned long *s, *d, tmp; + short dmap_src, dmap_dst; + short dmap_save; + + /* all section sizes should by multiples of 4 bytes */ + dmap_save = DMAP; + + D10VTranslate (src, &dmap_src, &s); + D10VTranslate (dst, &dmap_dst, &d); + + while (size > 0) + { + /* NB: Transfer 4 byte (long) quantites, problems occure + when only two bytes are transfered */ + DMAP = dmap_src; + tmp = *s; + DMAP = dmap_dst; + *d = tmp; + d++; + s++; + size -= sizeof (tmp); + src += sizeof (tmp); + dst += sizeof (tmp); + if ((src & 0x3fff) == 0) + D10VTranslate (src, &dmap_src, &s); + if ((dst & 0x3fff) == 0) + D10VTranslate (dst, &dmap_dst, &d); + } + DMAP = dmap_save; +#endif /* D10V */ +} + diff --git a/gdb/testsuite/gdb.base/m68k-aout.u b/gdb/testsuite/gdb.base/m68k-aout.u new file mode 100644 index 00000000000..3095fc0727c --- /dev/null +++ b/gdb/testsuite/gdb.base/m68k-aout.u @@ -0,0 +1,459 @@ +begin 777 m68k-aout +M !"P $ ! #$@ +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M $Y6__!(USB 2^X !$GM 0F3$J<9ORYTV4"68PCS $ 0O.0 $ 0O"R\5 +M8?\ %"WOP #"\ 8?\ -.6(],[CB __!.7DYU3E8 $Y>3G4 $@. +M $C7 !P & ).7DYU2 X 2-< ' 8 DY>3G5(#@ !(UP +M< !@ "3EY.=4@. $C7 !P & ).7DYU2 X 2-< ' 8 +M DY>3G5(#@ !(UP < !@ "3EY.=4@. $C7 !"@& ).7DYU +M2 X 2-< $* 8 DY>3G5(#@ !(UP 0H!@ "3EY.=4@. +M $C7 !"@& ).7DYU2 X 2-< $* 8 DY>3G5(#@ !(UP +M0H!@ "3EY.=4@. $C7 #R %P/8 DY>3G5(#@ !(UP \@!< +M#V ).7DYU2 X 2-< $(Y 0-!/\ $ ! V$_P @ $#@S_ # +M 0.C/\ 0 ! \,_P !0 $#YP!B/ 00' '(\ !!$< @CP $$AP +M"2/ 03' *(\ !!0< LCP $%0C_$+( !!8(_Q :0 07"/\ +M $& 3^0 $#0 !!D$_D ! V 09A/Y 0. $&@S^0 $#H +M !!L,_D ! \ 0<#/Y 0/@ $'0C^0 $$ !!\(_D !!$ 0A"/Y +M 02 $(PC^0 $$P !"4(_D !!0 0G"/Y 05 $*0C^0 $%@ +M !"L(_D !!< 0M"/Y 08 $+@C_ $#0 !#$(_P ! V 0R"/\ +M 0. $,PC_ $#H !#0(_P ! \ 0U"/\ 0/@ $-@C_ $$ +M !#<(_P !!$ 0X"/\ 02 $.0C_ $$P !#H(_P !!0 0["/\ +M 05 $/ C_ $%@ !#T(_P !!< 0^' "(\ !'4< (CP $=AP +M 2/ 1X' !(\ !'<(_D !$\ 11#/Y 1+ $31.7DYU0"@C*61B +M>'AX+G,)-2XR("A"97)K96QE>2D@-R\Q,B\X-0 2'D !'H('D !'D3I!8 +MCTYR"HQ.5@ 8?\ 6+RX "&'_ %%B/3EY.=0 3E8 $Y>3G5.5@ +M< %.0"/ 3Y'#_3EY.=0 +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M ! , $YU ! *",I8W)T,"YC"30N-B H0F5R:V5L97DI(#,O,S O +M.#, ! +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M ! 0 &0 "P0 )( !4 $V0 !4 &X +M /8 3X ':20 $ !H $0 'H !R ' +M?R0 $ !\ $0 'L "& 'ER0 ( "0 $0 'T ": +M 'IR0 ( "D $0 'X "N 'OB0 ( "X $0 '\ +M #" 'UR0 0 #, $0 ($ #6 'Y20 0 #@ $0 +M (( #J '^B0 0 #T $0 (, #^ ($20 0 $( +M $0 (4 $2 (("0 0 $< $0 (8 $F (-B0 0 $P +M $0 (< $Z (3B0 0 %$ $0 (D %. (7B0 @ +M %: $0 (H %D (<( )C___L% (W" )@ (YX +M )#___L% ))R ) ),B 0 )5H 3___L% ) +M?2 0 )C" 0 )JH 3___L% )QB 0 +M )U( 3___L% )\H 3___L% *#H 3___L% *&X 3_ +M__L% *2"0 0 %P $0 +( %Z $0 +, %Z $0 +M +0 %Z $0 +4 %Z $0 +8 & $0 +< &( +M $0 +@ &0 $0 +D &0 $0 +H &8 $0 +L &@ +M $0 +P &H $0 +T &H $0 +X &P $0 +\ +M &X $0 , ' $0 ,$ ' $0 ,( '( $0 +M ,, '0 $0 ,0 '8 $0 ,4 '8 $0 ,8 'B +M $0 ,< 'V $0 ,@ 'V $0 ,D 'V $0 ,H ( +M $0 ,L (* $0 ,P (4 $0 ,T (4 $0 ,X +M (> $0 ,\ (H $0 - (R $0 -$ (R $0 +M -( (\ $0 -, )& $0 -0 )0 $0 -4 )0 +M $0 -8 ): $0 -< )D $0 -@ )N $0 -D )N +M $0 -H )X $0 -L *, $0 -P *, $0 -T +M *6 $0 -X *@ $0 -\ *J $0 . *J $0 +M .$ *T $0 .( *^ $0 ., +( $0 .0 +( +M $0 .4 +2 $0 .8 +< $0 .< +F $0 .@ +F +M $0 .D +P $0 .H +Z $0 .L ,$ $0 .P +M ,$ $0 .T ,. $0 .X ,8 $0 .\ ,8 $0 +M / ,@ $0 /$ ,H $0 /( ,P $0 /, ,X +M $0 /0 ,X $0 /4 -" $0 /8 -" $0 /< -, +M *4 0 /< -0 *5 0 -0 *7 0 .( *8P0 !N( +M .D *:P0 Y8 .L *3I',3,]87(Q.S [,3LR '9? +M3I' +M,30]87(Q.S [,3LU '9?3I',34 =E]U;G-I9VYE9%]S:&]R=%]A3I' +M,38]87(Q.S [,3LV '9?:6YT7V%R3I',3@]87(Q +M.S [,3LX '9?;&]N9U]A3I',3< =E]S:6=N961?;&]N9U]A3I' +M,3< =E]U;G-I9VYE9%]L;VYG7V%R'0Z,S0]*C,S+# L,S([;&EN:V9U;F,Z,S4]*C,V/68S +M-"PS,BPS,CMS='5F9CHS-SUA0!?=E]S:6=N961?:6YT7V%R0!?=E]L;VYG7V%R +R[_\"\Z 9@O.@&@+P!(> 3KH S-_\ &"U _^@O+O_,+R[_\"\Z +M 7@O.@%X+R[_T" "T*[_Z"\ 3KH HM_\ &"8 E*[_S"\"("[_Z-"N_\PO +M $ZZ )#?_ Q(>@$B2'@ $AZ ,E.N@!F4(\M0/_L2J[_U&8$6(]@(DAX +M O "\Z 1@O.@$8+R[_U-:N_] O TZZ $3?_ !Q!^O[(+4C__"UY ( +M /_X+7H ;/_T2&[_Z$AX $@;O_HT>[_W$Z04(],WP ,3EY.=2!O Q(> % +M8!P@;P <2'@ 1V 2(&\ #$AX $E@""!O !!(> #3D!E DYU+QA(4$AX )( +M> 2'@ !$Y +WP !_ 1(> !3D +W5SF5R;PH @ H !( ' !0 $[Y ER 3E8 +M $* 8 DY>3G5.5@ 0H!@ "3EY.=4Y6 !"@& ).7DYU3E8 $* +M8 DY>3G5.5@ 0H!@ "3EY.=4Y6 !"@& ).7DYU3E8 $* 8 +M DY>3G5.5@ 0H!@ "3EY.=4Y6 !"@& ).7DYU3E8 $* 8 DY> +M3G5.5@ 0H!@ "3EY.=4Y6 !"@& ).7DYU3E8 ' 8 DY>3G5. +M5@ < !R & ).7DYU3E8 &'_ "0D(Y *P4!/\ $ K!2$_P @ " +ML%0S_ # *P5C/\ 0 K!8,_P !0 "L%IP!B/ *P7' '(\ K!@< @C +MP "L&1P"2/ *P:' *(\ K!L< LCP "L' C_$+( K!T(_Q :0 +M *P>$*Y *P?!/Y *P4 "L( 3^0 "L%( K""$_D K!4 *PA#/Y *P +M5@ "L(@S^0 "L%@ K",,_D K!: *PD"/Y *P7 "L)@C^0 "L& K"@ +M(_D K!D *PJ"/Y *P: "L+ C^0 "L&P K"X(_D K!P *PP"/Y *P +M= "L,@C^0 "L'@ K#0(_D K!\ *PU"/\ *P4 "L. C_ "L%( K#D +M(_P K!4 *PZ"/\ *P5@ "L.PC_ "L%@ K#P(_P K!: *P]"/\ *P +M7 "L/@C_ "L& K#\(_P K!D *Q "/\ *P: "L00C_ "L&P K$( +M(_P K!P *Q#"/\ *P= "L1 C_ "L'@ K$4< (CP "L1@CP "L1QP +M 2/ *Q("/ *Q)"/Y *Q* "L3 S^0 "L< K'(3EY.=0 3E8 "\+ +M+PI"@$'Y *R#$J09PA82%* 2I!F^$J ;Q1'^0 "L@A%\PP (%).D%E*M\IM +M]B1N__@F;O_\3EY.=4Y6 O"D7Y *R%$J29P@@6DZ02I)F^$*G2'D "5 +M8?\ #F)&[__$Y>3G5.5@ 2KD @ \9@IP 2/ ( /&&\3EY.=4CG@,!. +MN0 *\A*0&<,3KD "MH3-\# 4YU2'@ /4AZ !9(> "3KD ";.2'@ 8TZY +M FV$U#-C@X.#$@9FQO871I;F<@<&]I;G0@;F]T(&%V86EL86)L92 M+2!P +M0 "LAA*C6;B3KD ";P+P=.N0 )MA83TSN((#_ +M^$Y>3G4 $Y6__PNC4AX Q.N0 +PA83RI 2HUF!'#_8!HJK@ (*VX # $ +M*WD K(8 @CS0 "LAAP "IN__Q.7DYU !.^0 )N!(> $3D!E\DYU2'@ +M 4Y CP " $1P_TYU 3E8 $AY G!DZY W(%A/3EY.=4Y6 +M__A(UR" *FX "'[_2HUG<# M ! "@ 0-G.C M ! ( &9C P+0 0" +M F<$?@!@#$A53KD ">46$\N ! M !))P"\ 3KD #AV6$]*@&P"?O\P+0 0 +M" V<0+RT "$ZY P'EA/0JT "$)M !!"E2MM @ !$*M P@!TSN((#_ +M^$Y>3G5.5O_\+HTJ;@ (,"T $ @ %F)F \,"T $ @ %G)$JM AG'B M +M 2PK0 (8Q1(54ZY I8EA/,"T $ @ )GTC M ! ( %9P1P_V "< J +M;O_\3EY.=4Y6_^Q(UR# *FX #!PN LP+0 0 H "2#( ""9CP@+0 ( +MT*T #+"M 1C "\(&T !%)(*T@ !!%&__\,!@ *9@ !'DA53KD "EB6$]^ +M_["'9@ !#& 00P+0 0?A; AWX&L(=F,!U&__]"E4AX %(;O__$"T $DG +M+P!.N0 )LY^ ;"'9P U@!M " $'#_8 SC M !!^$L"'?@*PAV8@2JT +M"&<:("T !+"M AF)$J59B P+0 0 H "$9A1(54ZY IYEA/2H!G!G#_ +M8 C# M ! "@ (1F /\F2%5.N0 *6)83U.5;1 @;0 $4D@K2 $$4;_ +M_V!,,"T $ @ =G,B 51("PK0 ,;"@@;0 $$(8,!@ *9Q @;0 $4D@K2 $ +M$"C__V <2%4@;0 $< 0$& &2%5P ! &+P!.N0 )_!03S M ! ( %9P1P +M_V $< 0!DSN(,#_[$Y>3G5.5O_P2-3G5.5O_X2-<@@"IN @P+0 0?A+ AWX"L(=G'C M ! " +M@ 0)F!'#_8&AP[\!M !!R H!!.T $# M ! ( &9DY*K0 (9@I(54ZY +M J@EA/("T !+"M AF-# M ! "@ (1F*"JM Q*E6P$?@!@ BX5("T +M"-"M R0K0 $L(=L"DA53KD "M 6$]P $SN((#_^$Y>3G5.5O^T2-<@P"IN +M @0+0 22< L # M ! ( "9Q8@>0 " I1!\&X *T@ "'X(*T< #&!Z+P9. +MN0 -7!83TJ 9PX ;0" ! N/ (!@'DAN_\0O!DZY XAE!/2H!M!BXN +M__!N!BX\ $ " '4( O $ZY O"%A/*T "&<, &T " 0*T< #& @('D +M @*40?!N "M( A^""M' P";?]_ ! ;0 $ ! K;0 ( 1,[B# _[1.7DYU +M3E;_]")N @@:0 (T>D #" (D*D !&H&(T@ !& &L)%L B* 3EY.=4CGP, @ +M.0 " $P,0 $9@8P/ 28"0,0 #9@8P/ .8!@,0 "9@8P/ *8 P,0 ! +M9@8P/ &3G%!^0 "JZQ@!B-Q B)8L_P 9O!.0DS? P-.=0 +M $[Y KZ 3E8 '(!(\$ K(<(&X $%RH Q.7DYU3E;_Y"Z'2KD @!8 +M9QH,N0 ( @!89@ Q'X#(\< @!,8 N"U\ KT/_T0J[_^$*N__Q( +M;O_H2&[_]$AX =.N0 -Z!/[P ,0KD K(<3KD #H82&[_]$AN_^A(> ' +M3KD #>@3^\ #$JY *R'&<$?@%@ GX"(\< @!8#+D " ( 6&9.?@,C +MQP " $Q.N0 .C!*@&8V2'D "S@2'D @+$3KD #EP4$](>0 +2!(>0 " +M L1.N0 .7!03TAY ("Q$ZY GE%A/3KD #H8#+D " ( 6&8$< %@ +M G +B[_Y$Y>3G4*(%!L96%S92!N;W1E.B!-0S8X.#@Q('5P9W)A9&4@=&\@ +M03DS3B!M87-K(&UA>2!B92!A9'9IO*T "&,,*(U)[0 $ +M*FT !& (($<@C2X-*E5*C6;BF\T@1R"-*(U,[C#@_^Q.7DYU3E;_Z$C7,/ J +M;@ (*%4L%&8$> !@!B!&*"@ #"XL 1F!'H 8 8@1RHH R\AV=TN(5E.$J& +M9VA*A&8:($8@* (6( O $AY ( \$ZY U7%!/8$XJAEB&*D8L%68$> !@ +M/"!&*"@ #& T2H=G,$J%9AH@1R H A8@"\ 2'D @$$3KD #5<4$]@%BJ' +M*D@!@!B!'*B@ #+R'9HQ"E4A43KD #5"6$],[C#P_^A.7DYU3E;_ +MY$C7,( J;@ ((%5*B&8$< !@!" H PH4")H 1*C&8$?@!@)BXL Q@(+Z! +M918JC$OL 0H54J,9@1^ & 8+BP #& 2*HDJ22)52HEF!'( 8 0B*0 ,OH!B +MT+* 8LPJB"",(4D !$SN,(#_Y$Y>3G5.5O_D2-0 " + J* ,NH1D%"\$3KD #/(6$]* +M@&8&< !@ #"*'P @"P*E1@(+Z&8@R^A&042>T !"I#8!"\A&4(2>T !"I# +M8 0H32I%*A4F+0 $2H5F!'X 8 8@12XH Q*@V8$? !@!B!#+"@ #+Z$9+J\ +MA&2V("T #)"$?@BPAV(0*BT "$A43KD "W:6$]@+BHM @N!=Z$($4F$):$ +M*T, #"!'((-2N0 " '0K1P (2%1.N0 +I183R!%((0@12 0T;D @"D4KD +M @"HN+D @"89 92N0 " 'A8A2 %3.XP^/_D3EY.=4Y6_^!(US#\)"X "! " +M?@/ AV<6+P)(>0 " 1A.N0 -5Q03W 8 \+2Y ( M&4(M+D @"X8PY^ +M%B/' ( 1' 8 TBP"688@1B@0F;D @"D4[D @"H*'P @"P*E1*C6< +M *(N+0 ()BT #+R'9#@J!MJ$NH=F%-B#4[D @!T2%1.N0 +=I83V!PNH=C +M%"\'+P9(>0 " 5=.N0 -5QP &!N*$U@5+R'8SPJ!]J#NH9F%BP'V(-3N0 " +M '1(5$ZY MVEA/8#*ZAF,4+P)(>0 " 79.N0 -5Q03W 8#!)[0 $8!0O +M DAY (!F$ZY U7%!/< !@%BI42HUF /]B+P0O!DZY M2%!/< %,[C#\ +M_^!.7DYU3E;_\$C7,, H;@ (+"X $"XN R>AG((OH%E($OT: JARB&4KD +M @!T4KD @"H2&T !$ZY P'EA/6$P@#$SN,,#_\$Y>3G5.5O_@2-@B^A60$=@A@"%:'Y(_ECR8'N(-E$"\#+P1(4TZY Q0& )Z\ +MN0 " +AD8BA\ ( L"I4($8J$& *2>T !& "*$TJ5$J-9@1^ & $+BT #+Z% +M93HN+0 (O(=EY+R'8MHN!-Z%OH-E)DA43KD "W:6$]3N0 " '3;N0 " *0F +MAR\#+P=(4TZY Q0& R+RX #$ZY O"%A/*D!*C6<>6$M9A"\$2%5(4TZY +M ]"$_O Q(4TZY P'EA/( U,[CCX_^!.7DYU3E;_Y$C7/. J+@ ,+"X +M""1&U<4F? " +!@""9-8 1'[0 $*E-*C68$?@!@!"XM R^A64 ,8H;0 ( +MO(QF'$A33KD "W:6$_;N0 " *12N0 " *AP 6 *2\C&6\+@S>E+R'9+BU +MQV,:2JX $&<0+P9(>0 " D=.N0 -5Q03W#_8'BUQV8N2%-.N0 +=I83U*Y +M ( =-NY ( I%2Y ( J)N42&P !$ZY P'EA/< %@1DA33KD "W:6$]4 +MN0 " '0@%-&Y ( I%:Y ( J" 'D(:1E)Z*)(=(; $3KD # >6$](:@ $ +M3KD # >6$]P 6 "< !,[CS@_^1.7DYU3E;_]$C7(,!*N0 " &QF(DZY X +MIB/ ( ;$ZY TA"I 2HUG.DA53KD #5"6$\N.0 " &Q3A]ZN A,>7 ' +M ( ;$PY< < @!L+ 6$]P 4SN(,#_]$Y>3G5.5O_X2-<@@$JY ( +MQ&<6*GD @#$('D @#$(] @#$8 CDJY ( P&YP+CP " $+P=.N0 +M..!83RI 3G5.5@ 4 25 $O+@ (3KD #BV2H!L"B/' ( 1' 8 )P +M 2XN_^A.7DYU3E;__"Z-2KD JZL9C@J? " IPP+0 0 H $#9@0@#6!H +M2^T %+O\ (%'&7D3KD #8\2H!F#'(,(\$ @!$< !@1BIY *NK$J59R0@ +M53 H ! "@ 0-G%EA-N_D JZP9>1R&"/! ( 1' 8!A*E6822'@ %$AX +M %.N0 /9!03RJ (!4J;O_\3EY.=4Y6__A(UR" 3KD #B6+@!(> $+P=. +MN0 /9!03R/ *NK$JY *NK&8$< !@7" 'YX O $ZY O"%A/(\ @*4 +M9A@O.0 "KJQ.N0 ,!Y83T*Y *NK' 8"X@>0 "KJQ!\'P (\@ JZP+CP +M @*<*GD JZL8 8JQW(4WH$,AP "!1QE\G !3.X@@/_X3EY.=4Y6__PNC4JY +M *NK&8*3KD #8\2H!G+BIY *NK+OY *NL&0@2I5F$DAX !1(> !3KD +M #V04$\J@%A-N_D JZP9> J;O_\3EY.=4Y6__PNC4JN AG9DJY *NK&8J +M*GP @*<,"T $ * ! V<*2%4@;@ (3I!83TOM !2[_ "!1QD-F#<*GD +M JZLN_D JZP9"9*E6<8(%4P* 0 H $#9PHO%2!N A.D%A/6$V[^0 " +MKK!EVBIN__Q.7DYU 3E;_V$C7/. N+@ (;P9\(+Z&;09^%F *8D +M;@ 0+"X #" '4X!R >&A+P%.N0 .,983RH 2_D K(@2_5\ "952%(O!B\' +M3KD #EF3^\ #$J :U9*AF[_]")&(-D@V2#92>[_]"P49PYR ;R!9P@J +MABB\ Y&$*G2%0O!TZY Y9D_O Q*@&L<2HIG"@R2 Y&&8")(LO!4ZY +M XUEA/< !@&BXY ( 1"\%3KD #C66$\JBR/' ( 1'#_3.X\X/_83EY. +M=4[Y FX$AX 9.0&7R3G5.^0 )N!(> ^3D!E\DYU3OD ";@2'@ 64Y +M9?).=4[Y FX$AX $!.0&7R3G5.^0 )N!(> V3D!E\DYU3OD ";@2'@ +M;4Y 9?).=4[Y FX$AX &Y.0&7R3G4@+P $5H!R_,"!T+D @4<+T !$AX +M !%.0&40(#D @4<(^\ ! "!1Q.=4[Y FX $CGP,!.N0 .G @ +M+P$0Y8@@? "LB @< @ +R\!'"\O 1PO+P$<+R\!'$Z0W_P 03KD #JX +M3-\# ]_\ "$AX (M.0$[Y FX$AX &Q.0&7R3G5.5OOX2-<@@"IN A! +M[@ 0+@@P+0 0" 686,"T $ @ AG" !M ( $& $46$\ ;0 $ !!"K0 (0JT #$*58!!(52\'+RX #$ZY +M ]X"X ( =,[B" ^_A.7DYU #R.IP 1.=0 #R +M.E04 "CR &0 #( E@ 9A;R.E0 ![R &0 #( @ 9@1P 6 "0H!.=3_P +M !. ____X G_P #\+R\ _$'O 0@* $0(, ,0 (9RP@ +M.0 " $P@P Q 1F"$ZY [YF 6#$ V8(3KD #KZ8 @,0 "9@)A6DYU +M0>\ !" 8#$ "&("C__$'H +M A.N0 /-Y.=4A " #V8: D ?_".0 !(0 @ ]F"@) '_PCJ $ !. +M=0 "!O 0B;P (("\ #&],(@F2B&P 1$@;* ;0 0#((" $ &<$ +M$MA3@"()" $ &8>(@#DB& "(MA1R/_\0D!3@&3T( $"@ -@ A+843G5.5@ +RX "$ZY P'EA/3EY.=4Y6 +M]H!(USS\3KD %XV($ @4!U0__]"KO_X?@$M1__T0J[_\"UN S_Y"UN_^3_ +MZ"UN_^C_["UN_^S_X"IN @<'6=&)FX $# K !!^$L"'?@*PAV8@2JL "&<: +M("L !+"K AF*DJ39B8P*P 0 H "$9AI(4TZY IYEA/2H!G#'#_8 . +M>' 8 .[VQ"U(]K!![O;$+4CVM$'N]L0M2/;4# 8 )6< +M BA3AVHL,"L $ * A&<*( =$@+"K QM%B=* 1(4TZY I8EA/)&L +M!"X34X<4QE*"8 -NB!N_^@H4%BN_^A*C&8&*'D @4D'!QG V@4X=J+# K +M ! "@ (1G"B '1("PJP ,;18G2@ $2%-.N0 *6)83R1K 0N$U.'%,92 +M@F#$(&[_Z" 0' !8KO_H4X=J+# K ! "@ (1G"B '1("PJP ,;18G2@ $ +M2%-.N0 *6)83R1K 0N$U.'%,92@F #28@;O_H+!!8KO_H2H9J1%.':BPP +M*P 0 H "$9PH@!T2 L*L #&T6)TH !$A33KD "EB6$\D:P $+A-3AQ3\ +M "U2@D2&8 H@;O_H+!!8KO_H*'D @4H2>[[WRHY (%*" &3'P 0 H@ +M11DP& !,?& & "F;F8 B"HY (%+"!N_^@L$%BN_^A)[OO?2H9G "X +M2H9G:' /P(8@11DP" #HCF;R8%@J.0 "!2@@;O_H+!!8KO_H2>[[WTJ&9P +MBDJ&9SIP#\"&($49, @ Z(YF\F J*CD @4H(&[_Z"P06*[_Z$GN^]]*AF=< +M2H9G#G 'P(8@11DP" #FCF;R0>[[WR8(N<-D P4'!Q3AVHL,"L $ * +MA&<*( =$@+"K QM%B=* 1(4TZY I8EA/)&L !"X34X<4QE*"N<-EQF +M"]9\,& _G1536!.($U231 02+"&8NY!^@ P<@VP&%3)__QFX# [$@9. +M^P "_H+_7O[*_P+^/OZ"_]S^@O_<_U[_,/WN_LK_,'AU4$\J &=T2J[_ +M]&<:2&[[ "\N_^0O+@ (3KD $SJ3^\ #$*N__0,K@ #+[R&X4("[[R$/V +M#2#Z_"U)]JHM4?_@8!PM;OO$_^ O+OO(2&[_X"\N A.N0 3GY/[P ,(&[_ +MX"P06*[_X$J&:@A$AAU\ '[T2I%8$@@;O_H+!!8KO_H2H9J.D2&'7P ?O1 +M8#!\ $*N__!@%A =2@ 0%4B 0?D @7="# @ 9Q80 +M'4G >#"0A-J%(@7E@=J!VH!@VGK_#!4 )&< _@)"KOKX+7P @5$^O1"KOKP +M+7P @5$^NQ@ 9H'7P ?O38 &7AU\ KZZV .'7P "/KK8 8=? 0^NM* +MA6P">@$@;O_H*!!8KO_H#"X 9/KJ9Q ,+@!$^NIG" PN &GZZF8N2H1L#"U\ +M (%1?KT1(1@'DHN^])G"BU\ (%1_KT8 Y*+OO09P@M? "!4GZ]$HN^\YG +M%B\N^O1.N0 4)!83RA&F<"YQ6\"*@P,+@!8^NIF""8Y (%+& &)CD @4H +M2>[[WQ N^NM)P'((L(%G"'(0L(%G%F! 2H1G0' 'P(0@0QDP" #FC&;R8#!* +MA&+"%9]!@ 5D2H5L GH&2B[[TV8X(&[_Z"U0^N M: $^N10 +MKO_H2&[VV$AN^MA(;OK<( 52@"\ +R[ZY"\N^N!.N0 8?A/[P 88#8H;O;4 +M=A#6C"!N_^@HT%BN_^BYPV7R2&[VV$AN^MA(;OK<( 52@"\ 2&[VQ$ZY "( +M<$_O !0H0$JN^MAG"BU\ (%4?KT8!Y*+OO29PHM? "!5/Z]& .2B[[T&<( +M+7P @55^O0,+@ Y]MAO%DGN]MA![ !)@@@0TH09P SE*#8/1![OO4)@A* +M%&<$&!Q@ G@P($,0A%*#2H5F!DHN^\]G""!#$*[__U*#+47Z\& .2A1G$%.N +M^O @0Q"<4H-*KOKP;NQ)[OO4#"X ,/;89Q8J+OK<4X5J$$2%8 Q![O; *@AX +M!& X>@!(;O:^< P!2\ 3KD 'B04$]"+O;">&2ZA&W8#(4 /H; I![O:_ +M*@AX!6 (0>[VOBH(> 8M1/:X4X4H!4JN^MQN" PN ##VV&8$>BM@ GHM($00 +MA5.$+43Z["!$$*[ZZDHN^]%F!'H!8 )Z ! N^\Y)P,"%9P #O"\N^O1.N0 +M4)!83T'N^]0B Y*(T('0KOKPT*[VN"(&DH M0?KX8 #DDJ%; )Z!DHN^]-F +M-"!N_^@M4/K@+6@ !/KD4*[_Z$AN]MA(;OK82&[ZW"\%+R[ZY"\N^N!.N0 +M8LY/[P 88#(H;O:T=A#6C"!N_^@HT%BN_^BYPV7R2&[VV$AN^MA(;OK<+P5( +M;O;$3KD (E&3^\ %"A 2J[ZV&<*+7P @57^O1@'DHN^])G"BU\ (%6?KT +M8 Y*+OO09P@M? "!5OZ] PN #GVV&\62>[VV$'L $F""!#2A!G +64H-@ +M]$'N^]0F""@N^MQN"B!#$+P ,%*#8!9*%&8(($,0O P8 0@0Q"<4H-3A&;J +M2B[[SV8$2H5O""!#$*[__U*#* 4@!9"%+4#Z\& <4J[ZW$JN^MQO!$H49@@@ +M0Q"\ #!@!"!#$)Q2@U.$:N!*+OO19@8X? !8 *9S! N^\Y)P"(,P(%G(B\N +M^O1.N0 4)!83T'N^]0B Y*(T('0KOKP(@:2@"U!^OA)[OO48 ")$J%; 1Z +M!F &2H5F GH!2B[[TV8T(&[_Z"U0^N M: $^N10KO_H2&[VV! N^\])P"\ +M+P4O+OKD+R[ZX$ZY !EKD_O !1@,BAN]K!V$-:,(&[_Z"C06*[_Z+G#9?)( +M;O;8$"[[STG +P O!4AN]L1.N0 BCQ/[P 02>[VV PN "WVV&8,+7P @5= +M^O123& >2B[[TF<*+7P @5?^O1@#DHN^]!G""U\ (%8?KT$"[ZZDB 0?D +M @7="# 9RHF#& *($,,$ !E9PA2@R!#2A!F\"!##! 968$$+P 12!# +M2A!G$%*#8/8F#& "4H,@0TH09OA"KOKP2B[[T68$>@%@ GH $"[[SDG P(5G +M $.+R[Z]$ZY !0D%A/(@.2C-"!(@:2@"U!^OA@ #P(&[_Z" 0'4#[U%BN +M_^A)[OO40>P 28(8 U"!N_^@H4%BN_^A*A6H&*CQ_____2HQF!BAY (% +M)'@ 8 :XA6P(4H0=7/:O9O1*+OO19@1Z 6 ">@ 0+OO.2<# A6<(( :0A"U +M^OA33"8,F<1@?GH!+47_^&!V2>[ZZD'L $F"&!J($U231U0^NH0+OKJ2+"$8N!!^@ ^OK>_A[YOF*>'5S;VYL:6AG9F5D8UA53TQ'140 +M $JN^O!L!'H 8 0J+OKP2J[Z^&P$> !@!"@N^O@O+OKT3KD %"06$\M0/:J +M+R[Z[$ZY !0D%A/G(6<@" #D(R<@)R$G*[VJDHN^]%F>F V4X=J+# K ! " +M@ (1G"B '1("PJP ,;18G2@ $2%-.N0 *6)83R1K 0N$U.'%/P (%*" +M4X9JQF \4X=J+# K ! "@ (1G"B '1("PJP ,;18G2@ $2%-.N0 *6)8 +M3R1K 0N$U.'(&[Z]!304H)2KOKT(&[Z]$H09KQ@-E.':BPP*P 0 H "$ +M9PH@!T2 L*L #&T6)TH !$A33KD "EB6$\D:P $+A-3AQ3\ #!2@E.N^OAJ +MQ+G#9'!3AVHL,"L $ * A&<*( =$@+"K QM%B=* 1(4TZY I8EA/ +M)&L !"X34X<4W%*"N<-ER& V4X=J+# K ! "@ (1G"B '1("PJP ,;18G +M2@ $2%-.N0 *6)83R1K 0N$U.'%/P ,%*"4Z[Z\&K$8#Q3AVHL,"L $ * +M A&<*( =$@+"K QM%B=* 1(4TZY I8EA/)&L !"X34X<@;OKL%-!2 +M@E*N^NP@;OKL2A!FO$HN^]%G/& V4X=J+# K ! "@ (1G"B '1("PJP , +M;18G2@ $2%-.N0 *6)83R1K 0N$U.'%/P (%*"4X9JQ@RN ?_X9A @ +M;O_H(%!8KO_H(()"KO_X'!UF /($)TH !":',"L $ * A&3G5.5O\<2-<\X$AX ,A"ITAN_SA.N0 +M4#A/[P ,>O]\ "AN A(> E2%1.N0 80A03RX 9P _E*'*$ !F$DA43KD %"P6$]3@"P 4H?9QWX ( ;E@$?V +M"2#_."\Y (%-$A43KD &%84$_9P"1,4DP0$DG .GP "& 8" < +M &?0.GP F , E2%1.N0 80A03RX +M9P Q%*'*$ !F$$A43KD %"P6$\L +M %*'V<>ZAF:R> %^ "\Y (%/$A43KD &%84$_9P"9,4DP0$TG &)$@#AB1( X8D2 ")O 0@+P ,;S ( +M+P =G!!+!4X @0.2(8 (BP5'(__Q"0%. 9/0@" @ %G C+!" &<" +M$L$@+P $3G4 (&\ !")( !F!' 8#)\,)R'8 [3G4 !.5O_\0?D @7=T>X +M"! 0<@/ @4Y>3G5.5O_\0?D @7=T>X "! 0<@' @4Y>3G5.5O_\0?D @7= +MT>X "! 0<@+ @4Y>3G5.5O_\0?D @7=T>X "! 0<@3 @4Y>3G5.5O_\0?D +M @7=T>X "! 03G5.5O_\0?D @7=T>X "! 0<@C @4Y>3G5.5O_\ +M0?D @7=T>X "! 03G5.5O_\0?D @7=T>X "! 0<@? @4Y>3G5. +M5O_\0?D @7=T>X "! 0 H "73EY.=4Y6__Q!^0 "!=W1[@ ($!!R%\"! +M3EY.=4Y6__Q!^0 "!=W1[@ ($!!R(,"!3EY.=4Y6__QP RN ?P (4\!$ +M $Y>3G5.5O_\("X "')_P(%.7DYU3E;_\$C7 , @;@ ($BX #RXN !!3AVL, +M'!B\ 6;V4T@@"& "< !,[@# __!.7DYU3E;]O$C7 /!*.0 "LM!F!DZY !@ +MDB@N @J+@ ,9@ $ DJ$9@ EG@ ?@ L/ "LM J/ "LM\O!2\&3KD &$H +M4$]*@&824H=R#]J!W(%R!KZ!;>)*A&=82'D K+02'D J[$3KD (OX4$]^ +M#P:' *RT"P\ *S.4AY ((5$AY *NQ$ZY "+T%!/+P=(>0 "KL1.N0 +MB]!03WH/WH6^AF74(#P J[$8 #GB \ *RT& Y0@!"( Z8%$@-"!!H +M K+!8 #@$AX "\O!4ZY !A"%!/2H!G $V+P5.N0 4)!83WYXL(=N ,8 +M+P5(>0 "KL1.N0 B_A03RX\ *NQ'P 2'D @A6+P=.N0 89!03RX 9@ +MMG 8 #)B\'2'@ 4ZY !2N%!/2H!F "Z< !@ ,,+P=(> "3KD %*X +M4$]*@&8 *!P & O(O!TAX -.N0 4KA03TJ 9@ AG 8 "V"\'2'@ +M!$ZY !2N%!/2H!F;' 8 "P"\'2'@ !4ZY !2N%!/2H!F5' 8 "J"\' +M2'@ !DZY !2N%!/2H!F/' 8 "D"\'2'@ !TZY !2N%!/2H!F)' 8 " +M>" &<@:P@6(6,#L*!D[[ +_0O]<_W;_D/^H_\#_V'X 4H9R![R!;0#_#DAY +M ((6$*G3KD &&04$]*@&8 .)(>0 "LM!(;OW\+P5.N0 5Q!/[P ,/@!M +M ':2D=G,$AX 0%(;OW\2'D @7<3KD (M 3^\ #$AX 0%(;O[]2'D @< +M3KD (M 3^\ #$J$9@ !UDAY *RWTAN_0 "LNXO!4AX -( +M>0 ""%I.N0 6Y9/[P 0/@!L!G 8 !4DI'9PQ(QR\'3KD #AV6$]*A&8 +M 3!(>0 "LOU(;OW,+P5.N0 6&1/[P ,+@!G #>($=*$&0 "LRHO +M!4AX =(>0 ""'9.N0 6Y9/[P 0/@!L!' 8#Y*1V3G5.5O_\+H0 ""().N0 6Y9/[P 0 +M+@!O,DAX @(O+@ ,+P=.N0 BI9/[P ,#( ("9PPO!TZY X=EA/?O\O +M!TZY X=EA/( "2'D @B+ +M3KD %N63^\ $"H ;0 ODJ%9@H@/ "")9@ "R2&[_Q"\%3KD #B&4$]* +M@&8 )P@+O_45( O $ZY O"%A/+@!G "&+R[_U"\'+P5.N0 BI9/[P , +ML*[_U&9B*FX #"P'W*[_U"!&$+P "E*&($9"$$A5+P=.N0 6C)03RP 9S)( +M;0 $+P9.N0 6C)03RP 9R!(;0 (+P9.N0 6FA03TJ 9PXO!4ZY X=EA/ +M( =@%B\%3KD #AV6$\O!TZY P'EA/< !,[B#@_[1.7DYU3E;_M$C7(. O +M+@ 0+RX "$AX 1(>0 "")=.N0 6Y9/[P 0+ !M &:2H9F"B \ ((HV +M 8Y(;O_$+P9.N0 .(903TJ 9@ !>" N_]14@"\ 3KD "\(6$\J &< 6(O +M+O_4+P4O!DZY "*ED_O RPKO_49@ !/BIN PN!=ZN_]0@1Q"\ I2AR!' +M0A!(;0 ,+P5.N0 6C)03RX 9P !"DAM ! O!TZY !:,E!/+@!G #V2&T +M%"\'3KD %HR4$\N &< .)(;0 8+P=.N0 6C)03RX 9P SDAM !PO!TZY +M !::%!/+@!G "Z2&T ("\'3KD %HR4$\N &< *9(;0 D+P=.N0 6C)0 +M3RX 9P DDAM "DO!TZY !:N%!/+@!G?DAM "HO!TZY !;'%!/+@!G;$AM +M "LO!TZY !;'%!/+@!G6DAM "PO!TZY !;'%!/+@!G2$AM "TO!TZY !; +M'%!/+@!G-DAM "XO!TZY !:N%!/+@!G)$AM "\O!TZY !:N%!/2H!G$B\& +M3KD #AV6$\@/ "LOU@%B\&3KD #AV6$\O!4ZY P'EA/< !,[B#@_[1. +M7DYU3E;__"Z'+BX ""!N P@ATAX HO!TZY !A"%!/+@!F!' 8 @@1T(0 +M4H<@!RXN__Q.7DYU3E;_^"Z'(FX "$H19PP@;@ ,((E@(DJ'9@1P & J@1*'8 02O !_4DD0$4G +@!R"KZ!9M)"&2 )+B[_^$Y> +M3G5.5O_T2-< P")N A*$6<@#!$ "F8*(&X #!"\ ']@-GP 8"!R,+Z!;09R +M.;Z!;P1P & FW(8B!N6!W('^< !@#@P5 IG!' 8 1"'2 -*F[_]$Y>3G5. +M5OO<2-<@P"IN @N+@ 0($=*$&9J2%5.N0 C'!83RX 9P8@1TH09E9(>0 " +M"*1.N0 C'!83RX 9P8@1TH09CY*.0 "KK1F,$AY ((J4ZY ",<%A/+@!G +M!B!'2A!F"$AY ((M& "+P=(>0 "KK1.N0 B_A03RX\ *NM" N PB .F! +M1(#0@0: *RP2\ +P=.N0 82A03TJ 9A0O!R\N !1.N0 B_A03W 8 ! +MR"\'3KD %"06$]\#K"&;P9P_V ;)(>0 ""+9(;OP 3KD (OX4$](54AN +M_ !.N0 B]!03TAY ((PTAN_ !.N0 B]!03R\'2&[\ $ZY "+T%!/0J=( +M;OP 3KD (LV4$\L &Q<#+D " ( 1&902'D @C%2&[\ $ZY "+^%!/ +M2%5(;OP 3KD (O04$](>0 ""-Q(;OP 3KD (O04$\O!TAN_ !.N0 B]!0 +M3T*G2&[\ $ZY "+-E!/+ !*AFT.+P0 ""-Y(;OP 3KD (O04$]"ITAN_ !.N0 BS903RX 0 "!N1.N0 B_A03R/N^_@ @;T2KD @;X9PXO +M.0 "!OA.N0 ,!Y83TJN^_QO5B\N^_Q.N0 +PA83RI +R[[_$A5+P=.N0 +MBI9/[P ,L*[[_&<4+P=.N0 .'983TZY !@3G#_8!(CS0 "!O@O!TZY X +M=EA/( 9,[B# ^]Q.7DYU0KD @;X+P=.N0 .'983TZY !@3G#_8-Q.5O_\ +M(#D @A$3EY.=4Y6__!(UR# +#P @CB+CP @EH*GP @F]2KD @@"9@ ! +MV$AX +!.N0 +PA83R/ (( DJY (( F=Z+P9.N0 4)!83U* +P!.N0 +M+PA83R/ ((!F=<+P8O.0 "" 9.N0 B_A03R\'3KD %"06$]2@"\ 3KD +M "\(6$\CP "" IG+B\'+SD @@*3KD (OX4$](54ZY !0D%A/4H O $ZY +M O"%A/(\ @@.9@9P & 41(52\Y ((#DZY "+^%!/+#D @@&?@ @ +M>0 "" )(<'0 +P9.N0 6C)03RP 4D<,1P ,;>)^ "!Y (( DAP=# O!DZY +M !:,E!/+ !21PQ' QMXBPY (("GX ('D @@"2'!T8"\&3KD %HR4$\L +M %)'#$< !VWB?@ @>0 "" )(<'1\+P9.N0 6C)03RP 4D<,1P ';>(L.0 " +M" X@.0 "" (&@ )@O "\&3KD %HR4$\L " Y (( @: G"\ +P9. +MN0 6C)03RP (#D @@"!H "@+P O!DZY !:,E!/+ @.0 "" (&@ +M *0O "\&3KD %HR4$\L " Y (( @: J"\ +P9.N0 6C)03RP (#D +M @@"!H "L+P O!DZY !:,E!/(#D @@"3.X@P/_P3EY.=4Y6 !(>0 " +MKK1(>0 "!N1.N0 B_A03T*Y (&]$JY (&^&<.+SD @;X3KD # >6$]" +MN0 "!OA"N0 "!OQ.7DYU3E;__"Z'?@!(>0 ""?8P!TC (@#I@42 T($&@ " +MLM O $ZY "+^%!/4D<,1P ';=9(>0 ""?A(>0 "!N1.N0 B_A03TAY (* +M $AY *RP$ZY "+^%!/(_P @H" *RL"/\ (*!@ "LK0N+O_\3EY.=4Y6 +M__0@;@ ($BX #[(09@0@"& &2AAF]' 3EY.=0 3E;_]"Z'(&X #")N @> +M&+X19@A*&6;V< !@"A 12< 2($G!D($N+O_T3EY.=0 3E;_]"Z-(FX ""!N +M Q@%BI(8 @0%; 19P9234H59O1*%6<&4DE*$6;FD^X "" )*F[_]$Y>3G5. +M5O_X2-<@@"XN AF!BXY *O1$J'9Q8O+@ ,+P=.N0 85A03]"'*D!*%68$ +M< !@*"\N Q(54ZY "-"%!/+@!F"$*Y *O1& ,($="$%*'(\< J]$( U, +M[B" __A.7DYU $Y6_ +M3G5.5OW(2-<@\"HN ! M>0 "LSS_]$*N__@M1?_\2&[]W$AN_>!(;O_T2&X +M"$ZY !R5B!N !@@KOWD*"X '"XN !0@+OW@? 6PAF( +(P.PH&3OL @!$ +M P # !R (8 ADJ%;0P@1R N__"0A2" 8 8@1R"N__!^ $ON_>PL!& (($80 +MG5*'4H:^KO_P;?(@1-'N__!"$&!D($="D"!$$+P ,#I\ &ZC6\6?@'>A-J$ +M+ 4@1Q"\ #!235*'OH9E\D(U2 !@-B!'0I L.0 ""B!^"+J';0YZ"& ,($=" +MD"PY (*''H#+@8J1-R%($<:T%*'OH9E]B!$0C!8 " $3.X@\/W(3EY.=4Y6 +M_^!(USS@*&X #"XN !1.N0 7C8@0"!0'! J1TJL 1G & ($<0O M4H0 ""CQ*%&< 58:W&#V2JP "&X.( I6@$2 L*P +M"&\ )H:[ ,&L8V? !?@%@!AK24DM2AT7T> Q*$F;R2H5F# PE #!G^KP5 +M9P)231K\ &4H; (VX:QB9'2C2X#&= OHIL/"X+)DH:]'@,4H>^BVWV8"P:_ P +M&L9^ & &&OP ,%*'("P "-"*1("^@&WN?@!@!!K34H=']'@,2A-F]$J%9C0, +M)0 P9_J\%6!(;O_T2&X "$ZY !R5D_O ! O+@ 8+RX %$AN_> O+@ 03KD &/8 +M("X &$Y>3G5.5O_\+RX %$*G+RX $"\N PO+@ (3KD &6N3EY.=0 3E;_ +M\$C7(, J;@ ,+"X &!XN !<,!P P9@9*AF< ,XB;@ 0<@&#D2!N @@$'(# +ML(%B7C ["@9.^P " @ L !0 $@,!P U;0 H@P' #5N0$J&9CQ*K0(0;P +MD$'M P@+0(0$# (_TG ?C"0AW(!2H!L"$2 P(%$@& "P(%*@& ,2JT !&9B +M8 9*K0 $9UHN+0(04X3G5. +M5OLL2-0 ""G%(;OM$3KD (KP3^\ #$AN^T1(> ,3KD (#N +M4$](;OM (&[[Y' ,"@ D'P"@9P # H__XO $ZY !XD%!/?@!+[OM 8 12 +MAU)-#!4 ,&?V)FX $)O-? .^AFX>0?9Y(/M +@@H2T'N^T!62"P(($<8T%*' +M4DV^AF/T(&[[Y' ,"@ E6 +@!M)N.'0?/8 "P(+P8@;OOD< P,'@&+P!. +MN0 >)!03UA-6(95AVKB0C/8 "!N !@@C2!N^^0P* $2, @;@ 4((!![OOP +M("[[Y+"(9PHO $ZY " TEA/3.XXP/LL3EY.=4Y6^R1(UR#\*FX %"HN ! L +M+@ ,+BX ""!N !A"D"!'2J@ !&8T?@ H#6 *($00O P4H=2A+Z%8_)!]7@ +M*@A@"B!%$+P ,%*'4H6^AF/R(&X '""'8 "=CU\ 0#]^#U\ 0#[\$AN^^Q( +M;OWX+P=.N0 ?HI/[P ,/6[[[OW\=!&4KOOL<@ R+OWZZ8F4@4P\( ( $T1 +M *2&[]^$ZY "!,D_O !0@+OOH9R9^ ;"'9D8O DAY (*ADAN +M^YA.N0 BO!/[P ,2&[[F$AX ")@'B\"2'D @J<2&[[2$ZY "*\$_O Q( +M;OM(2'@ #$ZY " [E!/(&[[Z QH__ !&YV,"@ !$C 1(!J!'X/T(?H@"@ +M?@!\ & .(&[[Z$IP: 9F"%*'5(:^A&WNOH1L"B!N^^@ < !2@8N!"P$XX8J +M!..%( :0A2H 8! @;OOH,;!H!E@&4H=4A52&(&[[Z' ,"@ KZ 9>*9: " +M(&[[Z.F$V6@ !"!N^^A*: $;#!(;OM&,"@ !$C 1( "@ __\O "\(3KD +M 'RV3^\ #$IN^T9G"B!N^^@ : ! 9(;OOP+R[[Z$ZY !_RE!/?@ ^+OOR +M4X@!![OM + A@!%*%4H8@1@P0 #!G]'P > .ZA&XB0?99(/M *@@H#4'N +M^T!62"8(($0B11"14H52AE*$NH-C\%.':S+CAT'V>2#[]BX(0?5H "H(0>[[ +M]B@(+P4@1W ,! O $ZY !XD%!/6(98A56'OH1DY$(U: @;@ <((8@;@ 8 +ME(8@@D'N_?@@+OOHL(AG"B\ 3KD (#26$],[B#\^R1.7DYU3E;J0$C7./PF +M;@ 0+BX "'8P0J[__"!')U !":H 0,J ( !&<,#*@ ! 1F 9> +M*&X # RL " (;!0,K $ !&86#*P ! AL#"!N !1^"(^08 & +M,$'N_]PB1S \ <@V5'(__Q![O_<0^[_O# \ @ %"P(($="D%B'OH9E]F!R("[_Y%* :@1^']"'ZH L +M 'X 2^[_R& $0IU2A[Z&9?@@+O_D.@ +M4X N!N6'P;9XR$: P;9XZ%*&+@9\!;Z&;!SEAT'V>.@N"$'N_^A!Z 4+ @@ +M1T*06(>^AF7V2&[_O$ZY !S:%A/2J[_X&L #"P' +MW(C;R"!&$+P ,%*'4H:\C67ROJP "&8 *0G1P(0( *0AR= B^@FQ,OJ[L +M<&0*%C9Y(.QX4H=@ G8P0?9Y(.QX+ A@"KZN['!D#%*'4H8@1@P0 #!G[KZN +M['!D!GX!+4?__$JN_\!G $N?@$M1__\8 !)$JN_\!G $<2J[J;&\&=C!\ +M & &%B[J<'P!+@9!]FD@ZG L"& (OH1L#%*'4H8@1@P0 #!G\+Z$; Z'X! +M+4?__& -XJ+ (FH=*AV8>? !+[NIP8 12AE)-#!4 ,&?VVH;:KNILW*[J +M;& "? "ZA&\"*@0@!42 )T "+JNZFQO!B@NZFQ@ B@%O(1L$DOK S;QQK\ +M #!2AU*&O(1M]+R%;!I+ZP ,V\<@!I"NZFP:]@D@ZG!2AU*&O(5M[)RNZFR\ +MKNIH;#I*AFP$=C!@!A8V:2#J<%*&:@)\ $OV:2#J<& *O*[J:&P*4H9230P5 +M #!G\+RNZFAL(GP!+4;__& :0>L #"P(W(=@"B!&$+P ,%*'4H:^K (;? G +M1P(0+R[__$G#+P,O+@ 42%-(5$ZY !F(& C9*K (;0 !'B "T*P " R +M " &P ^^1^ $OK Q![NQX+ A@""!&&M!2AU*&OJ[L<&7ROH)L&DOK Q! +M]7@ + C;PB!&$+P ,%*'4H:\C67R*@2XK (;P0J+ (NJ[J;&\&*"[J;& " +M* 5\ $J$;Q)+ZP ,V\<:_ P4H=2AKR$;?2\A6P:2^L #-O'( :0KNIL&O8) +M(.IP4H=2AKR%;>Q+ZP ,V\=@"!K\ #!2AU*&O*P "&WR)T<"$)2')T( ")RN +MZFPN!KZNZFAL/$J'; 1V,& &%C9Y(.IP4H=J GX 0?9Y(.IP+ A@"KZNZFAL +M#%*'4H8@1@P0 #!G[KZNZFAL!GX!+4?__"\N__Q)PR\#+RX %$A32%1.N0 +M9B!@ $2+"P "$2&#(( ( ; #ZR R& " &P ^KZTAFXZM(9F"!8N['A^ +M 6 $=C!^ $OV>2#L>& *OJ[L<&0*4H=230P5 #!G\+ZN['!D!GX!+4?__$*K +M A!@;GX 0>L #"@&2^[L>"H(8 @@11"=4H=2A2 N['"0A+Z 9>Y^ $OK R4 +MABH"8 8:_ P4H>^A6WV)T<"$+ZN['!D+!8V>2#L>%*'2_9Y(.QX8 J^KNQP +M9 I2AU)-#!4 ,&?POJ[L<&0&?@$M1__\2J[_P&<&?@$M1__\+R[__$G#+P,O +M+@ 42%-(5$ZY !F("XK A!)ZP ,V<=@!AC\ #!2AR K A#0AKZ ;?!"JP ( +M)T<"$$(S> Q,[CC\ZD!.7DYU3E;_U"Z-*FX $"!N !1"D"!N @M4/_X+6@ +M!/_\Z>X ?_X*T !"\N A.N0 =,!83RJ (!5R!;"!8A0P.PH&3OL @ P +M P # P # ,$AN__A(;O_83KD '5X4$\O+@ 42%4O+@ ,2&[_V$ZY !K +MNBIN_]1.7DYU3E;_O$C7., H;@ ((&X %$*0?@!+[O_P0>[_\$'H ! L""KT +M> !8A[O&9?9@%# ["@9.^P " % +@ N % 4 !0)FX $.GN '_\"= 1( +M5$ZY !VHEA/)H @$WX%L(=CRDA42&[_T$ZY !W1%!/+RX %$A3+RX #$AN +M_]!.N0 :[I,[CC _[Q.7DYU $Y6_]A(UP#X(&X " RH @ $9@ ! +M(GX 8 @,1P %9 Q21W , =*L P,9^X,1P %90A"J $8 _DI'9UI"KO_\ +M>@ Z!W@%F(63R6 .W(4AL&P,F Q2KO_\6$DL+O_\O(1EZ@RN !?_\;!SE +MABU&__0@+O_T0K (#%BN__0,K@ !3_]&WJ< P!^N(D:@ "& "4D=P # ' +M<@22@")!2K"<#&?N0F[_^BXH P,AP __]B"' 0X:\]0/_Z#(< ____8@;A +MCU!N__H,AP____]B!NF/6&[_^@R'/____V(&Y8]4;O_Z#(=_____8@12;O_Z +M< P+O_ZD:@ " QN '_^F4N? !*B6TH< P+O_Z=B"6@"X)Y8=#\'@,*A$R +M+O_ZXZTH$>:LC(4BABP$68=JYDSN /C_V$Y>3G5.5@ < $R+@ *XZ"!N0 " +MLT1.7DYU3E;_]"!N @M4/_X+6@ !/_\,"[_^ ) ?_!F&B N__@"@ /__]F +M"DJN__QF!' 8$1P 6! ,"[_^ ) ?_ ,0'_P9C @+O_X H #___9@I*KO_\ +M9@1P V <("[_^ * ___PR 0 &4$< 1@!G %8 )P DY>3G5.5O_D2-< +M\'P (BX #" N A^#-"'>""8@3!\ !#1P"X0XZ\J$.BMC(<@ABP%64BQP&3L +M3.X \/_D3EY.=4Y6__!(UR" *FX ""!N PM4/_X+6@ !/_\Z>X ?_X*H K +M;O_\ !!^"$*U> Q8AW(4OH%M]# N__@"0'_P9VPP+O_X D!_\ Q ?_!G "2 +MZ>X 2__X!( /_*T "'X"*T< !" N__@"@ /__\ @ 0 K0 ,2'@ +M"TA53KD '4Z4$]@&$JN__QF7'X#*T< !& *2J[__&8:0JT !$SN((#_\$Y> +M3G4@+O_X H #___9^!^ BM' 0K?/___ T "" N__@"@ /__\K0 ,2%5. +MN0 >("[_^ * ___P@ !-G"'X$*T< !& 2 +M?@0K1P $2'@ !$ZY !TJEA/("[_^ * ___P" @ & _TY.5O_@2-< +MP")N A\ $'N__ N"$'N__!!Z 0(@@@1R"Q: !8AEB'OH%E\C N__ "0'__ +M9THP+O_P D!__PQ ?_]G1G "8"YP!& J2J[_]&8^2J[_^&8X2J[__&8R< -@ +M%$JN__1F'DJN__AF&$JN__QF$G 3.X P/_@3EY.=4IN__)GW' !8.Q*;O_R +M9[QP # N__(,@ @ !DJG %8-1.5O_<2- / +M2%5.N0 =3I03V ,?@,K1P $8 1"K0 $3.XPX/_<3EY.=7 ,"[_\H"N__2 +MKO_X@*[__&?>?@(K1P $*WS__\ 1 AP # N__(K0 ,2%5.N0 08 #_7 $Y6__1(UP# +M? ,@;@ ,/BX "G , @ H;@ 0=@ V+@ *) -3@BIN Q@,"\& +M( *0AS T"@ "@ __\O ' ,!4O $ZY !Y^$_O PN +Z&9 )21"P'4H54 +M32X%OH-ERB9N !0P//__P$8V@'(0XJXW1@ "-T0 !$SN./S_W$Y>3G5.5O_< +M2- !\ "AN !!V #8N HD U."*FX #& X+P<@ I"%,#0* * #_ +M_R\ < P%2\ 3KD 'GX3^\ #"X #(>RT%X 90A21 2'LM!> %*&5$TJ!KJ# +M9<(F;@ 4( =,? ! G$#:!3'QP!P )Q @!TQ\ $ "<0-T$ DQ\< < +M "<0< P!$2 Y8@B -*!T('0AS= 1,[CC\_]Q.7DYU $Y6__PP+@ * +MP.X #M"N !!.7DYU3E;_^$C7 (1^ #XN K>K@ ,( =,? G$'(0XZA, +M?' " G$(""3.X A/_X3EY.=4Y6__@NARXN AG&"!N QP # 0WH P//__ +MP$@Q03RX ,#S__\!'.L!R$.*O9N!,[B" __A.7DYU3E;_^$C7 (0P+@ * +MP.X #M"N ! N $Q\ "<03G5.5O_X2-< A"XN @@!TQ\ "<0@ Z +M+@ .< P!"@ 8"0O!R\%< P%2\ 3KD 'L@3^\ #"X ,#S__\!'.L!R$.*G +M4H:\A&782H=G)DOL 8J!N.%V\4O!TZY ![IEA/+@ P//__P$3G5.5O_D2-< ^"!N @^* ">@!\ #8N Y#Z & +M> X!V 8?@ ^$>>OWH4P//__P$@ Z*0 "4X5K.%Q) +M+@EP # N YX$)B XX7:AR)%*@=^ #X1Z:]T$.6NWH8@!W(0XJ@R@ *' #_ +M_RP'54FSQ63>(&X $#"&3.X ]/_H3EY.=4Y6_^A(US#@?@!\ "AN A+[ & +M>@ Z+@ .8"0O!R\%< P%2\ 3KD 'JH3^\ #"X ,#S__\!'.L!R$.*G4H9P +M # L *\@&722H=G)DOL 8J!N.%V\4O!TZY ![IEA/+@ P//__P$3G5.5O_D2-?A/[P ,*@ P//__P$4ZP'(0 +MXJU2AKR#9=A*A6<,,#S__\!%.8!J!E*&.48 DSN,/C_Y$Y>3G5.5O_D2-

R!/[P ,+@ P//__P$D #$*N__0@ +M!^. D*[_]"U __@J2"P'Y8;Z983RX ,#S__\!'.L!2AG(0XJ]FY#E& ),[C#@_^Q.7DYU3E;_ +M\$C7,, H;@ (*FX #$'L 8L"' ,"P B!&,# *_@* #__X#\)Q!(0#M +M 9P # L (R+0 &LG *_F8(.WP 0 "8" [? " )P # L (@1C P"OX" +M@ __^ _"<0.T "'X /BP E6':QSCA]Z&($=P # 0+P!(54ZY !_4%!/ +M58>^AF3H?@!@$$*G2%5.N0 ?U!03WP0WH8P+ $2,!\$)"&OH!OXC L 1( +MP+"';QHP+ $2,"0AP* #__R\ 2%5.N0 >]103T)M 1,[C# __!.7DYU +M !.5O_P,"X $G( 2D!G$"!N PB;@ (,MA20;) 9?A.7DYU3E;__"Z-*FX +M"$A53KD # >6$\J;O_\3EY.=4Y6_V C[@ ( ( 1"\N Q(> O2'D @K> +M2'D @JT2&[_8$ZY "*\$_O !1(;O]@3KD (S@6$].N0 C!!.7DYU3E;_ +M:$C7//PJ;@ (*"X %$)N__XM3?_X2H1M"G[_+4?_]& /1$A$*N__1@ #J +M/7P "O_R/7D G9._^P]>0 "BM#_[CUY (PSO_P+7P G90_^ M? "BM+_ +MY"U\ (PT/_H0J[_U$*N_]A"KO_<+7P G9V_\@M? "H=;_S"U\ )V"/_0 +M( 12@&H"5H#D@%2 /4#_QF ) ]? "__(]>0 "=BS_[#UY )VFO_N/7D +M @M4__ M? "=B[_X"U\ )VG/_D+7P @M6_^@M? "=CC_R"U\ *)8O_, +M+7P C"0_] M? "=D3_U"U\ **&O_8+7P C"P_]P@!%* :@1^#]"'Z(!4 +M@#U _\9@%" N Q^ K"'9P#_#GX*L(=G /]T+"X $$'N_^PN"$'N_[@J"$'N +M_^Q<2"@(($=P # 0(@9,0! ($4P@"!'< P$$Q 8 94A52'OH1EWGX"+4?_ +MM'@$0?9(N"@(8 P@1$I09@Q3KO^T581*KO^T;.Y*AF\R+P9P # N_[PO ' +M,"[_NB\ < P+O^X+P!(>0 ""N1.N0 BJ @;@ 8?@$@AV !78\+0 "0>[_ +MN"X(0>[_R"H(0>[_N%Q(* @@1W ,! @12!00? * ")'< P$2)%(E%#\0H +M,"D I!0W$!4AUB%OH1EU+QN_\9D!#U&_\:\56(((&X &""-8'!X #@&!(0 +M $ XXP&A @8O!$ZY O"%A/* !F"B!N !A"D& !/(@;@ 8((1P # M +M (O $AM 8@;@ 8(!!<@"\ 3KD ("P3^\ #"!N !@@4#%M ( B!N !@@ +M4#%M 0 !"!N !@J4#J&0J[_P$JN_[1K 1&< P+O_R+4#_D' ,"[_QBU +M_Z!![O_@+4C_F$?N_[A%[O_(0>[_U"U(_Y1*4V< _AP # 3(%(P, H" H +M /__<@ R$R!2,C : *! #__Y"!+4#_L' ,"T BU _ZQ*KO_T;"Q@.C M +M 1(P$2 :@1^#]"'Z( M0/_T8"0P+0 $2,!$@&H"5H#D@"U __1@$" N_Y!^ +M K"'9\Q^"K"'9]P,;@ "__)F*G ,!,@;O^4(%!!\ H ,!#1;O_^< P$R!N +M_Y0@4$'P"@ P$.E(T6T ! RN ?^P9UP,K@ '_K&=F("[_D'X"L(=G +M #0?@JPAV< ,Y@ #0< P$R\ 2%5.N0 ?@103V Q1"IW ,!,@;O^8 +M(%!!\ H < P$"\ 2%5.N0 ?9A/[P ,8 "[B N_Y!^ K"'9]!^"K"'9[9@ +M +:/"T !B\N_[!P # 3(%(P, H H /__(&[_F"!02' * $AM 9.N0 +M@+!/[P ,.V[_L@ "("[_D'X"L(=G''X*L(=F *2< P!B\ 2%5.N0 ?190 +M3V GY"IW , 8O $A53KD 'V83^\ #& F9";O^J8 8]?"<0_ZH@+O^L +ML*[_L&4$("[_L%: D6[_JB@N_ZS8KO^P0?5*!D)H__XL!%6&:P !M' ,"[_ +M_B(N__22@"U!_YPV!"0N_ZQ3@B@&XX0N!IZN_[!2ARH"< P$R!2,# * * +M #__RAN_Y@H5$GT"@"\@FP"*@9*AVP -)^ & ,Q(;O^D( :0A4AT"@!( +M=7H&FH=2A0*% #__R\%3KD 'C.3^\ $$IN_ZAG&$'U2 9(: $< P+O^H +M+P!.N0 >D!03TIN_Z9G "20?5(!DAH )P # N_Z8O $ZY !Z0%!/8'9( +M;O^D( :0A4AT"@!(=7H&FH=2A0*% #__R\%3KD 'E(3^\ $$IN_ZAG&$'U +M2 9(: $< P+O^H+P!.N0 >FQ03TIN_Z9G+$'U2 9(: "< P+O^F+P!. +MN0 >FQ03V 2("[_D'("L(%G /\L<@JP@6>*2?5(!CBN_Z0^ W , -!]0H& +M2FC__F8$/@-31[YN_\9C#' , >0KO^@.@!@ GH ("[_P+"N_[1F0"X&5(=P +M # %OH!B-# L *P;O^J8BIP # L )R #(4@(%G'#H'2J[_]&T&OJ[_G&X. +M< P!0!U $*!CP%8 Q3AE6$2H9J /YL? @+O^LT*[_L#M )P # M )! +M]0H&2FC__F8(4VT F "4D9P # &0?4*!BX(2E!G\$I&9T)X #@&< P+0 " +MD(0O "\'2&T !DZY " L$_O R=;0 "("[_D'X"L(=G"'X*L(=G"& .( 3I +MB& $( 3EB-%M 12KO_ 5$M8KO^46$I8KO^8("[_P+"N_[1O /OJ("[_^+"- +M9U(@0# M *P4&)((&[_^#%M ( B!N__@Q;0 $ 1P # M (O $AM 8@ +M+O_X7( O $ZY " L$_O P@;@ 8+Q!.N0 @-)83R!N !@@KO_X3.X\_/]H +M3EY.=0 3E;]R$C7,. L+@ ,+7D K,\__1^ 2U'__@M1O_\2&[]W$AN_>!( +M;O_T+RX "$ZY !RU"!N !0@KOWD*FX $"HN !@@+OW@?@6PAV)\,#L*!D[[ +M ( +@ , P 1@!8 %@@+OWHT(8J@$J&;U9+[OWL*$5!]FD@_>PN"!C=N\=E +M^F! ?@$JATJ&;S@J12A&V<4:_ PN\QE^& H0I4N.0 ""RAR"+R!;0Q\"& * +M0I4N.0 ""R1\ RI'*$7>AAC=N\=E^B!%0C!H " %3.XPX/W(3EY.=4Y6_0J+@ 8+BX $" N_>!R!;"!8@ GC ["@9.^P " $0 # , ' +MB@"*2H9M#"!'("[_\)"&((!@!B!'(*[_\'X 2^[]["P%8 @@1A"=4H=2AKZN +M__!M\B!%T>[_\$(08% @1T*0($40O P.GP ;R-;Q1^ =Z%W(4@1Q"\ #!2 +M35*'OH9E\D(U6 !@)"!'0I!^"+R'; @J/ ""SE@$BH\ (+/6 *($="D"H\ +M (+1B %3.X@X/W,3EY.=4Y6_=PM>0 "LSS_]'(!+4'_^"UN S__$AN_=Q( +M;OW@2&[_]"\N A.N0 0 " ("P& $ % +M3D!E\DYU(F\ !"!O @@+P ,;TPB"9*(; !$2!LH!M !$,@@( 0 9P02 +MV%. (@D( 0 9AXB .2(8 (BV%'(__Q"0%. 9/0@ 0* V "$MA1R/_\ +M0D!3@&3T("\ !$YUL\AN%& "$MA1R/_\0D!3@&3T("\ !$YUT<#3P& "$R!1 +MR/_\0D!3@&3T("\ !$YU(&\ !")O @@"'+_2AA7R?_\9@#_^%.( &3KD (U&+P!.N0 C>Y03RXN__Q.7DYU $Y6__1( +MUS" *GD @ 2HUG'"AN A*E6<4+QU(5$ZY ",JE!/+@!G[" '8 )P $SN +M,(#_]$Y>3G5.5O_T(&X #")N @2&+(19@H,&0 ]9O0@"& 22A%F# PH #W_ +M_V8$( A@ G 3EY.=0 !.5@ 2'D @+$3KD ">46$\O+@ (3KD (WX +M6$].7DYU 3E;_\"Z-(&X #")N @J2& ($!6P$6<&4DU*%6;T2A5G +M!" )8 9*&6;D< J;O_P3EY.=0 !.^0 )N!(> 43D!E\DYU3E;_W$C7 +M,( N+@ (+6X #/_T( ?E@"I !H J],*$ M5/_XV_P J_,+57__$AN_^A( +M;O_T+P=.N0 -Z!/[P ,2H!K0" N__BPKO_L9@H@+O_\L*[_\&3G5.^0 )N!(> E3D!E\DYU3E;_V$C7, H;@ (2^[_X$J, +M9R1*%&<@*HQ(5$ZY !0D%A/*T !%!-*KP J)L<@(K00 $4$T@.0 " $2P +MN0 "H_!D$B Y ( 1$'Y *BA"AP# !@!BA\ *B;RJ,+Q5.N0 4)!83RM +M 1032J\ *B?7(!*T$ !$'N_^ @#9"(YH!2@"\ 2&[_X$AX ).N0 CJ9, +M[C _]A.7DYU 3OD ";@2'@ >4Y 9?).=0 +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M $ H(RE-8W)T,2YS(#$N-B X."\P,B\P."!#;W!Y +MF4],"!A=" E(W@* &)L +M;V-K H 9G)E93H@:6QL96=A;"!A9&1R97-S("@E(W@I +M"@!F H 9G)E93H@8FQO +M8VMS("4C>"P@)2-X(&]V97)L87 * &9R964Z(&)L;V-K("4C>"!W87,@86QR +M96%D>2!F H H 7I;7%U>7V!!0D-$149'2$E*2TQ-3D]045)35%565UA96GM\?7Y_ +M +M +M +M ! (*# ""@X @H/ (*$ ""A$ @H2 (*$P ""A0 @H5 (* +M%G]_?W]_?W]_ ((% "\ +P O $Q#7U1)344 3$%.1TE. +M1D\ 3$-?0T],3$%410!,0U]-15-304=%4P!,0U]#5%E010!,0U].54U%4DE# +M !,0U]-3TY%5$%260 3$%.1P!,0U]D969A=6QT $, +V5T8R]L;V-A;&4O +M "\ +W5S0I*=6YE"DIU;'D*075G=7-T"E-E<'1E +M;6)E<@I/8W1O8F5R"DYO=F5M8F5R"D1E8V5M8F5R %-U;@I-;VX*5'5E"E=E +M9 I4:'4*1G)I"E-A= I3=6YD87D*36]N9&%Y"E1U97-D87D*5V5D;F5S9&%Y +M"E1H=7)S9&%Y"D9R:61A>0I3871U0 E2#HE33HE4PHE;2\E9"\E>0HE +M82 E8B E92 E5" E6B E60I!30I030HE02P@)4(@)64L("59"@!# &1E9F%U +M;'0 0P!Y97, ;F\ +@ ""B0 @HH3F%. $EN +M9FEN:71Y ""D0 @I- (*40 !);F9I;FET>0!);F8 3F%. +M @8FEN87)Y(&5X<&]N96YT("5D( @8FEN87)Y(&5X<&]N96YT("5D +M( @9&5C:6UA;"!E>'!O;F5N=" E9" (&1E8VEM86P@97AP;VYE;G0@)60@ +M (&QI8F,@8F%S92!C;VYV97)S:6]N(&9I;&4@)7,@;&EN92 E9#H@)7, +M7UA8+F, "B!?=&EM97-?<&]W97(@9F%I;&5D(&1U92!T;R!E>'!O;F5N=" E +M9" E9" E9"!L969T;W9E0!.84X 3L %A &>P"AK2 >' T 5S +M.]L2+C^CGYWB8;+8XD +MK@[>A,$;D\-GP5?#RZ;WM9#@[BPV3-FR7PT0EM1=L+=XT&,&92PRFI$L>;6R +M23$ _B$HRQ&O9':DX48 (PEW4QW. $5WCL+>K<\"+?2%BI@WL9B2FOG?1H?'WU>D^'D0)E_IK=4.<3RO05 +M'9*K:&*D@&AC4$6S25MP*,WQ+QV0DT,>20"BWB80PD!J% P4GO"^;T@!R\"# +M05[^X&C]_&:B0\"Z)J&Y]>9[+VJ]$ETM/?JAN2<,Q@#=(0#0_6;A>O&?_9ZW +MOPW0T5#_.K06G=.1.$O6I.3T03_N!9(H-;]4CSYX']Y32L+\QM,I!/!J_2AA +M-;L66 \>9'95LV0ON9>1WH]Q%":^I*_]!B92R719S%5#)/4S4;\BA&/'9)"K +M8O0% -R+,2B^6CGMS+X'^1,JU\!=WQK#60 +M'N&*M]#Y6 S,%6;E*> "G3EN0U1-, U\R@%F(;Y, =L9'$$4F\,AT*2%7H [ +MDQ+_3WH/A4BV2."13SAULF_&4P%X<9VUK*0@ HU=Y&(*#J^*(FX ;4;0'6&[ +M0>(^DIS5APH1(U18B6/!*@Q*CQM<"(.ASA839E]&2<10EL4->>Z[44>KY7"B +M,Y\>Z<]#$82]V$,*B>$2E\ 6J??K%A;,>2=7SY[HUH, #)F!<'U,4"T9^@_- +M;S8TYBE<@@?"WIU'3%+9@]'-0\?J"MY+EA?=D371>@OH!;79K4]JQ P"WWL\\:A;CQ UJJK&4Q&^MRV&\(U$W+ +MM>Q^]O4>1@R^HD +MNB.2PXCB0C'00;J'%U#N3,EP9/G]I@=#7V\1-BMZW6DI..F:4%$@T2LRNFU)5*2J2"ZW:\.5_5'KD_TF_HV>\;#D-BFY2=J Q*)D)QC"=K +M?-(J;0"N)N!UII3R)SII]MQX"I8>9WD]UL4G/NCW7U\=@AL).,^?!,1IMS +M1V;:47\4< .NS$\%,1P!0!=;UVUB;-69&X^526EG!T +MTNK:K1JV!$K>\JO-8CKS[DD3MUBM.:-)0[EL>4$W=*2N5= -+:]SWVNY:F4D +M[I)T>0 V_ -L!> !;=R=)QT0TXBCUL +M*6;Y#2 +X/F+^XOQU)4H*N8?M5,<\.B<]I\\H@0#_E#1;X:HE,#GGW8HS9TZ4+%3Y!4>K?W+/&RP9N1,'! +M4XR=:-DEK1.G4@&._[-QLHT5Y0/9?3$> -@-.8FIO SL/ +MVJ(83Q?)I 0ZGE52J(=]4$JKU.>)A=G8M@"!+P<^M=7]*J*XK^<(,P, []\U +M7@^F9$R.2E&GB".>L0PQ=C?<7-CXR!SDU@$DAROKK=(% +M-3*$*P.[U,9XDL(G1DKDC

7=@@5 O3;W%KQ D>6<>U'-_DHPQ@>VC%&P$]2\V5?(6@'[)LNM5ZH!B&AT +MJ#$N5#@4]\H\#CFT;_ZAV0>VTVI"EL:VY-85%D3^W2[0N:N9\HEL6@*6_(@"92XR%O]BS>-P=^3A$E1"DZJX/%MY;I\;VX@^M,\/,T +M2.MTFQV1+"U4OBG!VHEQJL[ ^W*L>$$1WP2IJF&6\$0(&@\<0&LS9R:C&!FF +M94KTLTE:TQ!V"0O"Y!7W6'::B+A,2C+@RCO4;"5'#_(NN2Y;L9]V0YF6G]@B +MZF.#X+'-'.+I7NA>6FH\?%[;#+?0LJ\W(- 7 *2A +5&Y[KONLDCP<[ MQX;T]X? 'BG;Q.8244>Z#T='0#P31(26HJ$W2%&P*/B!(!_0YO>Y&XX:J'NF8UGZ7ZN,V[>UOHP +MY.X\#;+&;Y4!U'?V_E#7L3@G\@S&8:+>0WKC1XI^<,J^@BOV(>:#="EQD[^! +M$+IY3#M=['4DI7T3Q$GO!F!LAW.TN*7#T*-\?)8[G(;OU$I<=3Q;L@X@31LD +M?VKL7.?1DI(YYVB4]*!9L& B%'UM;B-X:Z3%UC2KX >2'=WO$/8=@M%PW\9JYZN1*B:VG<; +MSJW) 11"&$]_)#\L25'?2 +MI-U94$76?330G?@7)N1" !+&[1]_BJH]YB<@ +M[R<)A4BLX"+I'6::?#I0U-"U_#Y0)@EYHI'A7O.8NQT CH5\%6F\H= Y,7>1 +MU+<5 )#.&HGS,PNB3?G.*")GBS+T[2-[F$[Z*PP7S'F5MR^? C/U@>$WKC5^ +M-V:LDTHZ*LFDW@M@[KA2#K9LK_$UW)1@[L,+:-*65E>VQXMK9Z;G+QGEE8R< +MS80)L!F>AO=()C280I"P@URD+1VB&F1I\,;[1=&%EJA(Y#6-[U:\DF4 "7,! +M) 6LD&A$[:Y\9W&B8ON,6E%L'VM%/65',^A_"1^^QE>OICP!)%O\Z1V\8+QS +MY33SQK"M9[O3Y,VF/.\4^]TNTJ-P#KUO4; +M'.IBAVV4MOZWA"&A(W:#2=$!B'* R'=]@!2J@SI[16_?\OV +M\,)&GET9 E7U=WLR_BA9?* ,9#4VLR*TW2C@.[U&&42 \5;?CY68L5R5/$;+ +M<08))I/Y*F9]7Q-[VNIE@",[LR(87+0IL4-)>F8_Q&I2Y\-K,EW_*!?-U^D)93=5>:YR_OT&8+RFFPS#X0D0FE,2_?>!6CZ)+?O\C4$0_' +M^O;XIW_@NQ79D L,EI .(H+EV<8P5C@+0_LV>&(J Q]P:TU^? $?97HBY%AN +MI(O5GY2$TQZ$Z@F_44\S[^R71GV5%FJ\6_3NA49CHE1+<%+51[,018TCC3OV +MB@2:$>+@+2FX_+ /)[VYA0BZ]2SG3E?J7R)10;.[W!2;F@OSVRYHV<&=LE;U +M6K:1Y6/[K*>[.")[A%8I8'3%YC'9!_0^#=1P>[+,KCEW5UULZG6 +MIZ6XDE-G2?HSG T^ ;QY1NF"87I)<%8XP+*&S?XHA]TIM?:Q?"&3'F +MFP_3"B*3^DRQ(G;H$UJK,^C$9UJ)K1B$)HI,ED*;)W6GZS,H_A$MZNL4G\T@ +M?MX +M87WD+N)#2?*Y5LBHO:V +MK452U;-*>D*T=LX(S/=9+EDN-'D4]BTO $OU1PQJWUH*._0-H[9CR2./\(&( +M,27W6-V5!QVKN)P]232^I:-R7C@^$M:XU]KQ/8"9)2'864C7O"UGI%E2"5?K +MC0_*9"@)]4_^R:*CUSX]PNNCF,9Y';4ZS:Z4:$,1F-X2T.,"P,JA[RQR#L:I +M& 5HI ?#12&@G!S)6S_11$*VT^+=NXY/80"(0TK$RP9,3@'MS%\S':P^TK,V +M=U+-14TR"4*[NP>L>(Q2GU(3Z"'H)#ZN2)9HCDC(8;GP$?$1K@"5YZ*LBZ^D +M8?:3Z#5.]D_C?I0FBP(I: V(SX)NT42Y#PQS*>G$:Q!J0-LI^FZ\S,0$39VZ +M#=C6]E+X33K4=Z+Y<-S&M.2;06!SCD3:F8S?]MWMV,_@0,9217J"?.&5 +PEI_L'2CRKP_']^/EJJ._]MV\(Z%-L<_ +M =TU*QTYA]UW[R@G(O'D0H_EOVG*^;KJ^T^;'._ /1M<$RWY=I*_E)PTX 4KPBP(",S'5P<2<.6B3IT1+?D1ZE:F9X865W>P++PPE50H"T3V&0A,B[?'9VU" +M-)#K_ZZHZJ>W[0%,W3":$E:>'=AZ,Y\!;A0@SUF6*?.FT\@83>X9/#29._1K,NYX8%"^BPT7\< +M&=NV4Y,"XA$76-4[3URQQX+;Q@A#-\$;^[7GRG/#J29("O!_+9EG),]AF)CDWP%:;POVQH[GFP-CSVT;MTR;B].@ +M9"7*NV$Q 9?:<>TL^*$P^%UQ\,]O5 &85X.ETWLES)0'5+AH_^VXZ=EHQA[. 6VX@&L[12J +M,=O8S)N8:EF\\/'BG/"=3A1F"ZEHZU634>+WIM8O[Z0LQFD*JS+$$>J"P_ZY +MA\Q!+L.G:2#!:#Q<:2B+UM2>#V1\54#BERIR#QPJA2P +M,V:ZS0-/0<#M7IWK#P%POT[H!'(.D5F M)J#]*%!FV&*-AF6V/VO ];(H>Q. +M.;^4.[F8QG#;,>,F+C '4@"/&I\!\(6/>\/856*1M+0KS+E.14X]O_8Q_$A%F@Y]V+_D7Z=Q^!]/-+WZNM$]="? +M'_V'+O#X-AJ*CVP#D(WP.]CFVZ"B@.J( UFE/Y4,E,6NST#AU1"61S>:'WQY +M@?A&'&5Y79!+I<$V)IVPD/]E /WY4$6.!?N-13"6K\*-Z+Y5]9WX2^3)"T)R +MCD[EYPF4"H>N)+/Q>)GK=]:7A:A8I^2QO3@ZJFSO7%7V2Q&V-$+)DYU!S7P" +ML\GS/:I4W#/>VAFMDGB-R%<7"2>CY>B4U3?619>[ &[I/A)1P/8*I]+>.@/3 +M/4&Z.9@*C/SA5OQ7@V%NLHAFX'G"R4A@U1C>S!QL*[[A'ED%/I$G2UK%5+&B +M-+8S88&L<[\L\[H;YR2I*R;^%.(6WTBXU+&%"K[DYB6#I=9WYLM;"TR,;V,NGK*#P"WBX$= T#,0>RMG/LIPZ_=X(>* +M&*QP+(])/% YDL"4/H^']<*\O-A[ P1"UZHL&)*?N)63G]E0R+Q/I.F69P+: +M"P96[ZB!HWCCUEQV.P44N)$CKX##OJ\.!3EYRWL?T'E ):H+77VQO8,&.-2C +M*A318 N-0S/D9BII8^1PUU-J$8LY3/9UY&&O?(RH6B'T!89 +ME&#;[Q?SZ.JXM*.*/!4*H03%^?@(9MV;0#UMY4!,Q3O8]5*J\T!1\KG]X +M7%:3(U D)__0HFA';GHOE*J.F ;QHCM]Y[.1\5L4*TX)HN,Z>G-NQ+[?]5Y2 +MW*0I/1BN$]U,83#7JB&CL@7F1PAH0-<0&3HB RQ>-R$ENB4[E15,@K5$74U[ +M/63;>I/1Q#S2K=HE92&BDF)V@LKI=-2)C'U@D5!_]W55+^9R(*)O* +M:+$-5(J>J1$MGW_1; Z(:,!5W,%.33]OOWB[3YSGB?N.VZ>[C8# %XTY@T.6 +M')?8$$ 9;0$H0U"X9E&"7W.MN!D:L=\KE=7< G9/4DUSPD2)U#*V)N@X:=_V +MSG9:OS&;VX8M-WHF^B0H+6E&8ZZ<>V0E[4*K"; I-\PFZ.H65UA3"PVYI!*/ +M[X,$IF^NGS3#Q /(FTWH8 "8*68E0Z1IAHA34HNIX G_9N\PNLI+Y!,=$+PO +M*"F9<<>'#4%-I+KM8R)]!)W5K'!\_30C-O[Q>VNS?>5[/DE/F5/CZ83&=L$# +MR#>0*3".3T^&^;C>57SW8C[)QSD5S28'>(:I@F?2O%TQ$,!PP)NM U +MV-@\ >)MJ4O/.5#?=OW^H@<]G]4VI7[]_?;>T8^%IE$HO(&Q"2^J\ '"2"L0 +M-)]J!B:PD=8;)>!'0!"Y RYP'VO^Q4NGWW8/-)0J9/':ER,QMZ_RT673">;X +M.;LL$[/P,-FJI5M:.+ARKA(3K%76V84\&&' ITE8P4^EQ8P;#U&^LO$0#M@> +MB-S#!==R<"()C "J7#[314PSVNW\4*7T=>!'3 +M-PG]Q@'/\HU/H %]K ]%2DCPN84_-T!A:$( ]6(P5.A!!U\"A?@Q0_ $6L-W +M"GZ%RR7*5, SK)QDU;JXM@B&5H"O1'P.734M!53B#E%H"./(?4""\W8[GU^/ +M=-8 E.445",X^LU"@[RW@[VDT.<:JNN.;B^](B?Y4T&.;E"!*]#"_'E!O-'P +M1DZ1-[HFU20>Y0IZ-7SG)17JAN7*4-@H88.HC8^Q!5<-SJM"$ +M7HF-5M5A'9<_"^\+]>*0%^VCA'HAP,2V"R8DC"5UT,$"&[RZORG>%:&PZ8UD +M?DO[7?$$%UT9^1C&"P;-Q5;NF7[C"HQ55R8&0SI8I]XQ4'HY!/(JH2!2DV'" +M&95V7X?9(QL!Q(EV@=H)_=2ACLKD* )+4#3;79(]W[;Q!DZVFJ>,Y7:NJJ[, +M6M(*<0IEW.-372+^ >,@?_W3W(OTM[&:UM1O8@RE&OT"04R/H=I$XBQT@,V +MHFD$_WC:72]JTD\A0["ND0IX$9WQ0+^W[:_J%+9NK]ZM5Z@I>^=Z&LVB'/+7 +MX?00)8O_6+AJ.*2^MJ)H .]ZZITPD2>)&*F3O!=W[P T3V,GOX>7#*GQ.O'] +MXA,/*SY89Q@__]]MUH]'C%)0I);.@#DD$=M6!B_'F+$HZFP(0Z-H[,MS+&23 +MZ5/$)X)Y)C&"3!'!H-WKUCU*B1?Y9A L((0V4+X)BH ?M*2MQ!Z*1,FSF2K>0)_)$#J:+8;?0MA^XRO&.3$]?D**U9/.J*;Y5H1^OIM VJR8 : +M"WS_QLW7PJ>A3"@R4-58DS"X33V>I&N]NZ#EWDJL)4PF[^FZ"\':S*%+ZO_G +M0;0*4\,7B4VHA UO_X\<3HZ_)J@-_B>E6\B*U0H6+ 6F)Z[?P^CR')J)W2&0 +MQ2".L$HW$)U6.PK!/]WH/1#4C?ICM6..<]"K*A0M :I<_01/2\T:152:D>O- +M4P.%["F,K"AI&+,AJG=>_O'3'L:"Z3T ]@>T.!R15"N1:[6G81R]I54F5T8W +M,U81S#?QH3^WQRV.A-S-7RG*&IB'K+5W1<.@S&- -;;)$N[U^(P6JW$*YT:_ +M/P:0>:H.!H(+FC!-EB :>:^!,GB'OA06 .^JBJ0W.;B))B57L"#0=)7:I=RH +M[B#U/J"- =>97F?ID!^=C<"4_!>H?I$$>$&=7YI;BI1*=6'-]=LNX^2/PF#\ +MO8E+U612LUH -R^>IMGKXT'4^&EKU]?<;)K4SW(#(BR&,!1YL=3JD@&5MG"@ +M5F=MLT/J=LK @TNLK'=TZF1)5WY4;\ZQXK^5]X=:L\?@I^:@L/>R>>VHI9-> +M2Q9RNJUR3"=:@#!20S@]JKEU;+Q- Q/?B>E"#U#_T_$2A5KI-_R1 +M&T;_LCZ>-V%V1L$CKR4=53TQ)BN#]88!T#$)NDS0WV23 +MTA8TZ!_VLS.[_]:DJV;9^?#2,SE(@$ +M*D@G"2,D/'7KB++1W6\[I=9(%1L'S0!#8XO"T'[$+U9E( +MF51=B^OT7I,_72UEULWT8B$)X8;P*8(7TKM=>2?R<:N5]NTL*!CC'H'EBV-_ +MG,R-D\]2*W="_PY/NH&^A(?H]\DVU[GMXW_)V8!7FTGVQM78RT>FA>&]'3K3 +M!T!=E4;D:AOA $OL=<^=2?E3AW6^:(IRKLIJ 2G(PXO"&-D/NY5JTS"'SFO- +M8QDGM#OBM/F7Q5D*3XLA.OV*'\OUA,[\%>LS8IW3+FHJ(1IHS2C%3.\$&F+? +M*!(?'(K7G\ME*DE\$0I]DN^.>RS''# GMM[_13,8OY_L)!&2JJNR[!*/7;(_9*_W_64L+\1 +M\%IHHJNY+T69ZX)9M3G<]+BQ2B.U(RZX&B!1]RDS>F1 +M B>F';(R"0:H=IS_GRPPK<0F"/H>"^WF/GG[&RT.3K;05\M,5LKCQ8GYI[Y^ +MYSA:T./3'Z.#B%%YZK'41XW5-QYYE(KLKJ;H1]-6?YK+<(G&:\T)V1YX/(X[ +M7WO$/?2H\8M67:QI8@;RYH&[6I&A).KM81]_^ZB.]-+9%+4])S7TSXJEO3]0 +M+T=-S)-[SZ7WCAIOMBO&&X+42%+1EY&>%_IQJT+P&HO'9JA+?-4BJ[6;?Q-( +MG!A8T%8V]A1;$X,UF).X\+)P%.7/55&4D1$D#V+W$?#=X4$&[(6X_EO^K +MG4.TY,8)G#G+3=NIN7EYN0&$T(^2A^O1(,>'^8X% ^+]=6M +MO74WJ S+;7@%EB/A)D!.:;#]W$"VQ6E0#2:R4_2K=P%VK>/=P2 ?O/R?.#>Q +MFNB'1J%%.X[SR[K0O-"0,1M 0(#AK^'H? +MAM:O\WZT+^:VK6OBP.F!0SYBB90"5?+L!=RD%VI#G-6TD3'>S +MP)H+FH=S9]H1=C8Z\D*FESDZ?;-[[/@T&1:R%+[S/R]$1Q\NR(<.>5]_7P93 +M^9A/CYU#"7&O&I ( +M+4EYX(+8=>7#S",A?FZJ%>^[,2TW!3F374>N3N7I2ASKV/O<:-3.)=-W(A,, +M+3$ARAPP(]@OBK2L">CY@''P-)D!(8R5OC +M=6K+8YD&F\>B 1/PPKP9N^(:!?FXXK5H0!;?+*SO!Z]=IY7MA*6+:3DM%US: +M/H#"XE>FXG(/#OV]#;^ +M")"=FX=U[J\^7"Z)G?5D"[1/[;> (RELY[R,M)/ J<$N^6KQ)]8*IYM<$V;> +MT9;_4&.1&431KJ:SSMKH"A"+]WAA:[W][T)HML'=)BBEC=,=)M$OB),@$@?9 +M:@1C_T?K)+$(V_YWOD[K@;&BX:XN753^_5-/9,WPL.2D(IIP,S3OK\19R;PD +M0_F^>O?G*:>?=*R;'@N0O 8I ! #8 GP$] @X#% 1.!;T'7PDV"T$- +M@0_T$IP !8 +0!# %H < "' )T M #* .$ ]P$. 20 0: $1X!32 +M"F,*2@J, /$"X!?F"V811!"G T(>QQY&$9L,$24-)>T@D<##TES!'%%?T1V"/;"]PC[1P!#"\F9!8&#M02"1D5%V8E&P(+%%,( +M:!QZ&M\F51%9%R4#'AQ$#[,8HR#. )T)U!?_(<8=1"5O)M(4(!J_'T8"JP#T +M'T8$K ZN)3P!Q &1%V@=&@75 O$F8P1F"Q,6:AX]#7,#<0B\!LT0B12?#E<+ +M?!2N'MHF?!U0(3P/<0G?#=H*F L?"^@<_ [7&G,@"A$"'!(?_A':&2@5AR%E +M%"$5Q6G#R$8U"-V%0H&-QO'$#\)$" $&:D7L $B)OH NR,0(A(2 +M+P'B'Z\/Y@!,"T,EDQPQ&W,6K@S9'7D<2B"A"E0A! :0!&,?X1+P(;L#VQ9> +M(V\,%@F$&4@%%PBP'(D%N LG)K(%M 3.&5$CD@)W#&X#QB8$#Y0>>A4;$5T( +MK@JH#:$A>P#*$W !&1=\ !$BCQ*\#/@F< %G#[\0JB @$[ C,AG.(*H/'@KS +M!1,*YA7%(3 = 0T!&U@!\0MN"T86LQQC$?0C1QAX#OP2@PLO#6@14"-M"7\+ +M+Q#7"KX2 0=,)FXA"P%K!Q$*%16 !^@8FA8J(]P2=2$F'?0*E0$A#2 !$PH9 +M")T0"0K2'P028B'-$/L;\@Y<&;$!5!D_"$D*H!7B)6,0V V*'U0' +M? _F"ZP-@1D0)E0(?B+B(]47O"!X UD$2 2< FP2^P"8!$0=0Q*)#S$// HG +M$3$.;!$,"K 0]0;A&D,5*QRS#'87922T"\T#EA^3'"@5501*&P4?AQ7P'BH; +MQ"2T"R\%4B.))> 7" "D(LT"*P&R(/T361L)"4 !'09I&CD:6"<%&Q(F>@FK +M $<3/12S$2PC& ^Z(+4%]P.L%L 4V1LY$(P+G0C;"?X:? "Z"'T4?!H/#ODE +MEQ$7&+<8PQ\=%]H*>B,K)@L%(@ R#]@1(1\*!987T27R <$: Q;4!JL6>P@\ +M"Z4.\ CY(F<3.!5= S\+:B/I")(@:1?G""@+Y1GQ$W$*T1QR$O 8:P7%!KTF +MG U( 'L1B2(K),X+=@CV)N(.;""Y!B(/JQPT#5L2RA5)",( 0'['R$4]!Z; +M(L\@#B)J!>LDN1-,# \5U G8"TD L #5"B\FTP%5&I<3[@B?(8 FMA6E!MP, +M'!;Y"LX&VAO] J8@1 HQ%($0%P./"R47. >C'E81+AT!%Y(+5@:&%(T:8"'X +M(L4"TP@-!*$1"03$&)] F!"M ;RR:A'W@3" TS&,L O M4#BP"S@HI CD1C23_'D<:3A"% +M'+81V@W3)NP)0FC$OX8QAD=!MLA?R6U'>H7L"$T#IL:,27M(A<<% ]0 H,-TB/L +M!_P)T ^^$H8BF@KN%2TDZ1&-'O,>@Q] )/H#?0F3": "4P*($F@EU00M&2 6 +M4"26"/,@727) \,#'0ZO(AHF.PPN&!\:Z!RL%JP&^Q&3)#H5X"&O!] +Q!UE +M#KP6R")(("DB(!Y_#]<$[AR6$*L")PEE'3@.2027$"4"9A-W#B8"V081#'(#]P1N +M&2T,82:1$M4 $PN##/($,@B/#F,E/B;Y!/H8#!/X!UX3T1\\$J$5T!",!^\; +M[ O2'H@.\Q0R'&$!241!!1> +M&B@%G@, (B 9A L@)#0%>P1/)5,(XA-\!/87VQ6+(K,)RP$3'_L2/@// *4: +MU >U X8G"P6- $X9AAX( *L$?P $%0 +( P9'38E;1*? C0<^ M.)48"U@GG +M&:@9(A:/((X:!!^M P 1'1\, T E_QI0$1,>!B%& 4P K2 Q(3( !!FB#:4, +M*!.& I0%]!JG&&(92Q_R'OD@:B3?(\D($1.=#3P:YQEO&AL0-P2X'T40(@YL +M&R0(C0,E!(( A1!)&>\'$P/>%80AM0$L"08-OA.9%.X6VB'?&:T ,160%9@? +M@ UQ%R\4[!=+%@ 7(B1'":X&.R)[!+PF:Q+P"@TBEABM(&P;Z QY&% (^1B3 +M""XD.@[U)"(.&"0(&(X-YQNI% 8>+ LA'-XE' D#"UP"@17^!/<(=1VD$OTD +MX1N6" X/#@$#%0\%Q0QH%L@-%P[##:<7Q28/!"P0-0Z:)@D*R1C[!B<7^"5B +M :,BT!*' (L3\B35&-(9[P?@ " 99PJ /T, "#V!Q$.%1T%&0<-PPQZ#.4- +M5Q^3'1( #1CH#@,F? R> Y,8R!^B(^@0'P5/#H$6>AK@"FL/C0:1 )L*Z1E! +M&+X>MPG>#^L* !.G!)( 31D_!U45,Q\J"HL!+1,>"0P:/":# .L8K"9J%TT1 +M@2-[&),A;B22'XLFS!D%&O8.]1>H">$"LQIR!N$, $H6>Q3L :4& +M!0*, IP6,P=7#O$ >B*W&64EU ,]!3<&^ Y'&G<+Q1V@(PLB[Q'2#4X2R N: +M#_4;[!7Y%UL+D05V"_L*50G.!"X*Y@-2(?H-L@3%'$@"JPJ\#OP6E@\Q$.@A +M#A7:&B0*E!M'% \:G SY%KX'>P@] ?05=1;[&[\/:P-)(E\=[0)I"VD(QP!] +M&F8@WP=E" (CR![['J8BY0,[#88? B**%B<@8PC" 8L?F@;B'Y$@I1K=!N\/ +ME@II$)0-TB:5%5T061P+!Z0B=!%:! H#MA/(%*H +1'3!L\=& ^Y(X,F\Q;U +M'HL/8 ]D%]D .@) (QP"F ]/)+4AN1[<%@$#"@'A!V $M!/M'K8=I2/G)>X* +M@1&%!PP8QQ#K# (@I1:U#+XF PY!"" +,!8J $TC>AB) ]4+WQ&\%!H&=A ? +M#'\%=A1_!O(4T1 +M9B'<&, F*B'M)4P#Y1;6'8S0LE!8,(Y!CP +M((D3:12E",L9\R9I"Z8D%P.?&?4%L!\N(? 7LQZR"!P7V!1A H0-O1CA2;)4$$7@[V +M!V$-#B$2&0 _@HZ);492A-@ 8T*$!T\)#L@* #'(78 H1C8&:T5J0>F"_L4 +MCP(O$UX!.P82(ID<$B&N#L8>/ S.!P(<9 I(%7TEDB(B#CL8A1=\#AH!(!!N +M%J0-DQP&$S B-ABS#T$CP!\1$0D1;PP7#>(&DQ>.!XD1"0Z$-30=5'8X"7 0,'_$?Z0;Q':(/UP;1"HP?10 ! 70#2PR=%ML62 ZH"6D@ +MI!+F Z(/ZQ_5"CP9IPSF&TP@3@+U#,L/.QZ8 >@M X%(7X+X!Z%$2( +M' 8Y$2H%3A-Y(JF&A,<_Q@)&WH6QP4Z!"H'CP)' & B30P$$L +M&LH7MB/>#T@-:!0= J4=30/I#FL%U L &WD/\Q0K"\X'Z!= #Y$A? HC%V$4 +MU0#4$:P*;Q4H')\BAPK"&JH@CQH4%A4DT@2A!W0&C1MF)14:G@??$$H=8".) +M"A4<#1_?( P%K!K0)/L4XR9F$3,6X P/%YL2"D'O,>' PC(&'T 2'AW[#'T?2AQ$(T,+[ &M$)L";1)/ D0EQB'4'JP8DR#Y$VD) +M9P','*L::1ED)O\#)0.3(?@170 X)%<:_ ]-(&07V"8S#>\"M 3K 20#00QV +M)+X.G $3!$L%RAK%!#@A;Q_+!703)@LZ)8T6L@#L(/L5*"#)(B\.( !F&+ / +MI0,I"2T<7@0D Y\81 [ +M)>4B]PN+!D$E,2<@E<#_ %GAOY "8)10@A 6<6 B#<',8&4002)G(![ &J%5 DV!;' +M&)4-?P-_) (!,P]O !(XFP0[_(PX=30XR(1,@LA!Q#*H" +M:0 F%SL-,!GN!@<0SQAR!]@C!17G$JD671,L$-@5;!B$$TL+F0?%'^ )$PX= +M%O 8,P0;"4 4"A/Z$#TBG0VQ(1L4@P4@)=XF2QD@ 5X;M"$[&1T3(!"@ [D6 +M[1+4%W84C"%+ XD(:!XO"SD0IB;7":09R@$K![<.H21T$;<0?1"Q&^@!*0^I +M(5A$^!;0(YAZU()4.70NH$E,!PPWH!BP=GQEM#\T?) %!$: & +M?B/B 7,>[P38(Q8#Y0,"'P"D%MT2^![B"%$&O [*(54,/PW3"/P;(1Q,$/8/XP-Z'A$E +M;!X #T7=R*F'A0C)!H[#2H'R -Y#Q09OA7C!^0EJ0;A"U\"0!*&$-T'UQ;T +M"MHBMPLL"#@'SB(]#!8"' Q[)*T5M W2$SX,=ATP F$5DB;N)D<6' =A $# +MT!-S"^ C]@.[$2<+ 0.J!%@5DQ4+!1H70@>U(TPA+!=)(V$0[1#- D<0BPVU +M(UL#F J%%1X#P1)4T1IPSS)G,+[0.H +M"+,&&R,;$38,A@Y8%B,3/PY&#$<@LP\ #J<7Q1>Q',L+2Q4/ 50+ 1!5(#,* +M"!"T$ZT5RP_W)ID,5!W" N(1T0=]%6,!9"!H AT#JP^I$U$=YB,V%$8'IB(Z +M(5@)TQ>9!98@_Q[8$W 75@XR$.&(8)5P2U)9(AG!OD%FX6 +M_":?#=,F'!IU!O<,HAO8".T0- #\\,E1E"".\ERA60!0T=( V"%H<"\PZH&1 <\QD* +M!IT-7R/V'K@7 "&F$4D2$Q8?%I@9_P*##&0'B2&3 :09NAM)"]P98!C*%'($ +MBR;9 2P#(!X$'WP:81IZ$?@9=@MQ%5P/[1; :\>9@-)"Y@$"!XD)*XG P@5 +M"%<21@!Q'(0-.")>$ T',1H-&B$6-P,;$N0BFR.J!'$"+0W?$&T/O@ID%P@' +MUAG#!,@8F0H[%+H1J@(F"M@6S"8R!#0-&QC"(=X=S@Z!'30$Y!>F)405M@KS +M(,P/;!7. &D+TB53 (H&=AYL)ELF70XB D89U@4M'CT"$@F\#3L#M@U@$M<= +M$B:))?('!!/K"Y02!0Y$$L<: QU&$'\B3A_;!F0(D <2"E(.32.((%P>="4* +M)L ;)QC3(QP!7@V8!\ # !9S$5,+4B!@ \<'2A%C(BL=R@YD&4P2D!G, BX) +M42,I"9X4'A2+&=@)5A!8)387-0Q"#Q4-F@ 3&,4;?!CA .,5RB8Q$&@"&AH^ +M"L %.A"-" 6F1<+$B@*PPL#)10DZB5B!BT#N@SO#FLE)A)7)CX3*PG&&<4@ +MK1$L#&( 7 QA)+\#9B/0&\0 6A/O$+04X!,X&X4&CP7P&XLBO1L]&J()T (^ +M&",5\@#A!FP+AP4B)JT%VPH6#N8)M2("#6DEQ0\S =48UR"^%4\5IAIB$1P! +M#P^N V,?GQI! Y(): A5'',D>!93)>T(N0V0#R$FHQ<6%5\8R@#>'_$E2P8' +M'+,$9A-R">@;4A;U(Q4DQ08&)P@=2!R+&>L#/QB\#KD!B@=5 "41P0NF%/X> +MU"-=&:((E1CL(3X(TP>@"XP@N@7.&< 7T"C0]J(> B82;H%ED+U!II +M%O &(@AU"0\9,QYL 0D5(!3Y $,B+ B:&043^@IG$5$8<@\K)8\/Z!VD#]L) +M;Q".("L* 25N$+(0+188!U\BVB$$!P !\AH'"HD7$QA^)1X<1P/<%!P5V2-) +M&J,*@!PL(= 0TPB''X<3#@-_%/ 9FP#A&HP;8P45!0$&[00"2(0%EL772:V%+$0#@Y#$WP6O1(($G<69A]J)1@%=1"J'0D!AP+B +M#VD1]A"O'9H"$0'8&ATF/QJ2#)H%TL)TP3.$!D/U@M\ D84>" 2!#@D 00) EH=$0@1 +M&U8-,P'I I(=31@7#*H*L254!A( \@D3#1D#"Q2:#!$8Q0 8!3 @^03!"U4F +MLR.)#L2!UP7)",1"7P@=PR9!+H+ +M'A,4'/$4J!!E')O,5GR-8#WTDD078"\$;.0J%%GL) +M&AJ:"3 %Z G;)?<=*!Y;(.\+V0+O'N +M$QT6> -%CL(N1#N%?X89@&R!,4=)0EZ%@H29@K\! D1! P1!C,'R1G/$T,= +MTP1*$X4 %PD=%G<<+PG'%DZ@B*)!,8EQ#^"NH,QPW@'5L83PA<$-H(R@>W G,1;A8Z#54.(Q$Y(6(* +M^ADS'VH;11;7&@XAK!>I"ZD"" \.%&LCUQW0":\*YB5Z(@DF2!@\ R0@- (! +M HHA& P?(H$+X02*!/,>S!^R%@ <20]1)=\)*0+T)?PE!0L$&UP+JP7K&.,< +MEAU''^X%U 7>"#LF<26F'=HFCR&M&T\)+A+^))P&S287#P029";5 ZX#80K= +M%4< #P(0#C 6]@%? %<1]<$E ?4AV %J8,00=; /$%8!'J#"8?K0,M"6T< +MSA%K'<\B\A%F"9,"L!;K(#(-(2* $545CPOU 6P/K""5$(<@J!9<%Z<'HQT^ +M(1@)&"61!7,@$PH"#RD#)!8T!BP5]@#]"$0H4VB) '&$3E"'@%PP5I1,;%] 1'QBS%NX%]!W6#4@8WAA% :P' +M4!/S&"H)=17(!UDB9"5D'C8/*25["D0>4!/"'O05L10D$ (CX@$-'_T-_2 I +M&% +2QX #78?RAV0)G,@# ?"%^X-C"/N(,0%)"##)&$.D!KI)E41% >O(7$7 +MTQ^J$ 04H0\5))\CB27H'#@'J0H)#F,91 AY"2D65B'T%0D;D Q+![HDY1*: +M%0X9C1H'(4HB1R U _X !!T;!E<12A4W"HP-E@#8(@DCNB/ )4<)+ #)%+<7 +M!A6O#>P'$P"4$YH6EPU7"EX1(Q&\,2D!8\#DL(/P&6&P49_B:N%#<$6QNA%4@DW )]"]<2 @BE(8@9 +MT" =&U<6G24; '<1&R(/";\DV11]&$L9N06^'K@ $1_%!E<0ZR.@';$*Y!*1 +M!%D,Z"7?".TD22:F&Q(.# WA((<.=B%( [@9)0<")(0)11]J)9<23P-4'AX+ +M#@+(&R438AV, TT!12&6%QL>I@"&#_P@@ HB#2$-G@AD#R($CQXI"[42GA\4 +M"ZX.>AA6&_8(WAS7&_0 W '-$24::0T_'?4-S1!3$60'OP!@$OT3:0>C!L(6 +MK J" > 5D2!S)+\4DQ1H%=4!8A_K!XLD-A3:&44,/@CV'547S!ZP$M$EWB;2 +M!L8 MPP.(H<%8@:@&ET411HM!9$9'0NM&),1S0F)(+\,IA)H)+T+=@DO%6@< +M#PGP'R\1@NI!! >5@K#&FX8NR.'%Y\5S!5]&*$&DB4" +M @TS!3 ?P!=4&NP2_ @[#0(.> 2U ',6 +M$"! #.P!=B,S(C83MA0B$^060AJ:&_0E/0PI#N$/H!-D'.,:H 4")88D_R9F +M)M$-[R'_"4@:[11B''T,CPU&(64)O@8S#MP+*B,[%U >FQ:]'3L;T0(@(T @ +MSQU6$=L(+@W2!BD;VA:^!\P%RP:D%9<".@,7"A(,"!,G$J,9 +M&&,E$Q%9(8H$^Q@M(>( *!)@%@HF0P!8#6$7>B%=%!(^(@:R5*&A,$%QJ4!I *>@R]'T@:(0_R.U'S\96@= #LP3;!03$0<:EP3B(*4-'PY! +M&F(;C2)5#>H.T1 R #P7;A\K(7\"4!'H$ H-3!W!&N$*B0Q0(2@8N0OC&SHD +M$ ==##H2^Q@L#RT$% ,V(3(9" >!&E$B)P&O&04A0:'0\'#P1R%S4 - 82(!8A/0OA#[L0?@1.";4, +MN@\@'8(:O QO#DP7?PAF!)L/]@N^%A $+AZ?)+(!H1%\%QH,41_7(C(1UARZ +M"-H*(R7+)GD* 0\##L<1001#&LP<1P,((G89QP<$$V09X@:N$N &R1-Y)?P! +M]")X$P81S0T="D<':B'3%Z<7KP50#R@7\1A+",@-8P[K)FH"$2'V$\\2:272 +M&] %> 5I"]DDR!\7 .@;\@4($\023AF6):(3@0RL#(4*;!*@'C03ZP6M(Q0! +M&0"0%=T/XA9R"*P+%B9: XX.?!6](0\@40JV#VH!,!D&! 0C\PA<#FL)9@=: +M :H+:@>A#6L9L #U&-06\PEV)<(8O0.W )8(81TU%TX%@@K+ 3,D[!:J%F$% +M.PRZ" \F\A@@!MH2E0SA \8A7R*^ '4810CB$-DB(PU< K,761&9">@+M0\I +M#? %YA9@>CIAY7!CDC.1ZX![@.HAZV%)D4B0SE(6<*WPE;'=T!.QDO'04) +MB .O#>\'AQ(I(L\C-AP$!\H8#1 O(C4)]PY )=D6-QCS)(X/)@XP#Y <10GS +M)>0#X0CF%J<(- ;4'-DEQ1YO']88KPBQ)HXEV@-T"G4.W M7"'\53!R^(P$= +M%0(#)2,+(!%A)HD4CA;9(U$.>1A* +M#_P$YP?7)!40+ +M6AM/%08-A2&T&W0D;0X#'!01'R;N'G8 :0N+'7(+A@^4([8:B13<#>,$711B +M&,T;7@[))0@F;Q*['2@ETAM>#]H0#@_E!*80P E^(08,! 5S&<(CRQTW'X$2 +MDQ,* H<8. S&$ID%S2*<$OT)6P6H((<#"":K(%4D! TV"MX,,Q1*#H(3A08" +M"C,CQB1?(ID)LQ!V"_83$!ZF(D0?G YO'74CB0*;'GX67PC5$^(57R.##4X! +MI@^:&O84; 3 !ZT!=PK% ^00.P5;$]0=] .L"/R(D"2 32 BE!88><0OA("<9@!NF 2L'4($4!G5&GH(U@(%$;(1.Q]T"TL6E@W^ +M'G4*6AO()&P7O00, -D#U!9Y(WH$^QIN"ZT83PHS"/$G"P &U\.T@VS)+D< +M A^!'5$5-1^L #D2T!BD QL4-"9' @(@L1G-"$TA(A+W%C\;S JF&<0520/Z +M'!,AUQCO%3H58 !O!&T=.P(\"E(T".P0R#^,82Q?]#]L>;QA]$1(!^ @Z$&P # &, +M(&@:PQ2S![P(G1?3'68AJ03['(@0T@P''!47&RD- R7W!!\?-2*R'KP, +M7P>5%E,DBB'&&9DAPPH5#*D:"0]@%BT#"",!"B0%?"$ #8H@MAD')40.&"&F +M%X4"/0.U(. ;ZR&M"H,9'2'S'=(#! !9"N(< 1JG)0X>?P82!94@5@YH%.@2 +M,B*4(S4CRQ7X"3LC(!TX(XL5-1^/!-,$F2#Y).,BB07V X,24A\+)7X TA]] +M%/,AN"'4#L\;WQ9P#V,41A+3(&,%ZQ[.#"H;* G"%GX ]010%Y\(" TS'S<; +M41XH!M(16!YX#'H)T!#(# AU@>)'@ /\!.''%4:,@!!'] 5OPP[#:P?8 R* +M(A$F!0#V#0@[W)2D$O0&* P\3 +MYA]K$V8,.Q>"(\X;=QOC%8X3=10[(:X*Q20N#C,+4Q/E)!8C#PE&$)0B;@ ? +M&L,)E1W6 A 7G0W!$DX5)QHA$/82%0>("(8#R T0'>87R!2+)3L(2B":$$T" +MWR/'$;4=11I9"DL8OA[C'NP*# '>'W\*=Q*I!) 5%16*!G\*$QG7!ZPAD15Z +M%Y0=)R)O!+@3S11R F$C!A'(!(4(,P L ^DDL2 ^ ,0%[0!Q#>47!AH<%X0* +M4 WM J 6RB*,#*T/2!"2 > /9 YT)#H10 G^$NX2W!7?(XT9$P6?%"P48POP +M"CL5AAU9"2,+B!US"J@:X A< 98+V!3""B :Z1&*"KPBIP^<#((9=PF<'O<@ +MA C"',TE/AW*'=D390^$%/D/0 @%(B@AM@!\!9<&:Q3X'C(&W0HU'/8 X2/& +M'BX Q0I8)3L;E@D.(PP!L0'*'LLB@ IF#/(?FQI<%D<4!!T7'T@D%1HH'L@ +M'"'7 @T+6AUA"8H<31XZ(MX ! ;P$'$ :R++%L4@8P[0&^0A\A9A![P@C1C' +M$GD3&QG5!U0;T LI$5$1712;' , ,"1I'J0;TPLC' DB6R80):<)L0H!$2XB +MZA=U#A,E0Q+S&.P8Z!5F(V8(TA^=$)(.&ACC!& C60&P(80F= &[$?83;0-- +M%T83Q1\,)2@CN2#"'"P ?@:(!)@DA1(N$?H#+AP7!]@1:Q9Q'68"AA=O)NLA +M9B8_'FH!%1G&'; #A0T8'XH,50Y-&48#B0Y)$$T2Q!H;)H$1 01C(&4"G1K? +M E(!8064#3L6(Q^5!)<0DP&)&%X!P1*R.'!4\' +M8@;_(,(!O "B"!A4*GR0E%',DAP/U(;<=BAR>"@44WPU8#R0*O15()C -W DI'Y\5M1=J +M ^D R1>,$R<4F1,+#3LF?A= ("\"%!,<$;PF.P5-"W<==!Q6 2<+S! Q)=T, +MR!%'&8 >D".4(+\9X0Q4%30?FP=+&AH;>AV" W,0LP+[#_T"M!WA$:L*&R#[ +M"!$4J22I\@G"#+X3#0@H!5X/MA_7!J$)F!M5'ST<&1(V +M&YP9/PV.(=0,?QT+%4T$- &C"CL%?AF%)K<7;":5$W(=^ 48 S82RQTR)7<% +MDB.E)N,%]1;*%DH77@V^%2\8; 0H"N,"70/]$7 &J1+F)8X!/PD3(,P-VP U +M%ZDFA<2(@E!NH#1$ N0YW%\()OR*L%$ .[AUL(70* +M?098%8LF+P$T)*06>0YN%VD4;!5H"=,::R"/(X 3<."P@,$]X*<0W*!4\'11!\#G0#@P5(%:\#_!9_(2,#X" Z),,, +M;!GJ U@8;A@R#TTD4"-+"2PCUA[ #2XBC0]$#(H@#@\]!#L)BAGB'7(%[P?2 +M%/\$NQ'U! ,BT0N:%,0']P[T)3HAX 4*&&,@SAWV D@A:B8V$E$)$@\S%<() +MB0XD"[,='1U%'60CZ0_'F 67!^5'=H2?!% &'H42!E9$#<6 +M60;R"I08IB'Z(L '8!_K#VX2E!#$!]41AQL<"],AZ!"X'^D; ?U(ZL+ +M9"(4$I(@= E;&E,!Y1^)'K4$IP/5!\X0M0D"%84++0*D$Z\1HQKT""4<[PN$ +M$LH<2Q^K%^P/($,AG"-Y))@>]Q?E +M'54BQPRX&V ,&PVT#,DE[22=!5XB\ XW(3D/R@ , A(D.1+! OD3,1G.&E,5 +MY18% L\;2 1J!#8B7!$['"0AW!1I!CPB8!^3%?0#CA]6(C$5)@Q;)D4)O @] +M). F"0Y+"X@#D1#)#P\:ZQK3%1 F'221$-@5)PW-%VH" 0R8#9X!6A V"L 7 +M!PRO".,4$14P&L8FO@CA'0H9_PC=)?@/2R8Y(9P.UQ>Q#^8(G AA$G$:5R%5 +M$9@1H"%C( 0U@""H?)!&9!4T;Q"%?)1P-_ 1<%1@ [!U8$(4BU@2N B ;)P95 +M#-H@UA?W!7@ 3B.&!0DF>1">#>4"N 'C%1@)7PJ/ 9D%[@03(3D'51>L#9LD +M P.2$4 (B1DH'.4'XQ,9([<:L@OW(*0.[1M[![0@> 76$J8E02*%%@T(R".1 +M"0,AE2&,!*8>^B ](G8:Q0!%&T <;"*:!,4F&1/<$64&T@H$%+H&+"5A!9D9 +M*"2&!2 HPHO&[0C>Q(0( LBUQY%#7 :IQ@F!^\=?!6K$AP3NA9^'O,2+P/R +M)P,#!!T&'.4B;0E>(#L)N HK '8%#@#C)* FWP\4Q&A$TD/F 3!#AX;SA8E%0($\05C +M&[X>]04G!N@,HB(U"1\,*0:Z&O ",QTE$-DCC@1=(YXEPAH_!5D1W0W.#!(- +MJAZ:"W\A$B3#&64D(PHL WP!TA(R&9D/;0%Y"BH!' !C"G,DY0B/%9 5+PP^ +M&]LAS1," 1P78B1A#>4%!@9"!%P*)!2!&H\AUP8-'#(?;13X(:P 52!Q'] 9 +M_1,Q QP6) '7(I4=V!4T#0T2,AX@%JD-30YS ,\:I0P1#W<7'04J'"X!MAW! +M!@L1)P"W$V44-"+E$I !WR8% [8>@A8Q#?T00@_1#?0/+ 2[' +MO #E#7P&CQET PXC:!/I#]@4O &H T\@_P2^$=,"^QO^(3H'>!*\"M%>,2]!"L(+H%4!Y6#OH+$0N6 ?('%A3,(5%OX9;1%\"=8#K@&#'L@!-@B2 Q4E- ^:&6(21 B2&W4%OQX.(_X3?0,G +M)N8+BP6 )>$DF0_+ K(@^0S8(/4%8!-X!0LB:"&))D AEQ\Q"T,A9R6 (:0? +MT1^=%/0=G1JI WPCR1RY%*,;,A*?$CDAO2$_()\EBPS,(WD0Y0PX'$ C-B9D +M&ZL(F U.$W ./A* $^P$[Q[O!5@ 4QSE'U,"<@2=(6HF"B3!%H8F/!K*&PT9 +MX28W%NP9^P^/(88)X".] +H?* $G$#X0#@['!(,'OQ !"F<.41.Y('8).1:2 +M(R4%L@F%#UH%LPRZ(M,6<2,S!#@B3@M0$PT-PAS('WLDJQ,'#5DCGA@%%5@XC&LH:P0/Y)P4=&@9C%FT7GA_9!JDQT: H@!C0TT(#@% +MT""["+4C\P'A(\$@,0+!)3T=40O'(VX ?1'[(.D4"R*O"Q<0+!?P%C@&$PJ, +M%_@EZ" ^$D8#U0$()+D<5PW2'[0)% $8&VP0#Q2R)&,,4P^L(1P*; N/ A\? +M805M#@@6^0^"!S4$0P0(%8$DD!N4 IL98B<"%XP7JPFY&.@:?!57!_$,'A>O".@9[00;":H2M CO'P$F5@VK'(T&91P9&OP52PRY"W<. +MF0R&(5DF@0MK IL$P@Q&)'@72",C'6<( 1UB(!\6Y@3&)1@(A \:(0 : B3G +M S,EC17&)&4'"@P["]8B.P_H#^P=KB';#V$&?!.N +L5V -((/\F[Q(;)!4= +MKB9X"ET+Z0ZF%D,!]0X4"9@ASB3S#J8*K1PV%OL4NA0W(A<)@A(Z(LX>- FS +M!&@@X"!4$S@4;@+< 0@2#A*($?\&Y1PR&)T4I!;7)$XF8QOP%%P?*QV_ 5HD +MUR2N&KX1\ ^3(S(7V1MI"04&A"(<'O 3,P"]$&0*(!E=&/T=+B#W ?0<*!/B +M'HD-4@0?#-T@#QM8#T@"X#"@$L%OQIK)0T'&@:4(*@8G!')'HX* +M)0<^![<0CAR2(" :,2 '$G<>(PLG&@0&RPU.&8< *P3: 2@>20?9%*L#-0 2 +M!40:,!1J ;4,E0>J$; '0@$<&\(", D< : 9HADC"GL3OP7-#;HEFP2_&#T% +MQ1F;$D\,N@ZC)EHF(@?"'%L ' F])HXC7 :X(<4'"!3/'5<"D@H]&UH?]2*B +M!$ 5CP#1!LP><0O&!)<44P^W&9H(WA1/ UH$3P27)BD#00ME&U\*4PK/("(/ +MZ1A*%[H$MQLE#[$9[!87'Z C7PGH(^(BBP53%&0,ZPF(%WDEE!>B!%L21 [/ +M ]$FM1S#(M\8< ^ B\4T1AE%CP5CPEN%,PA3A@N)/H/'QD>%<(A1@P$$;0A +M9 2)#TPE)P%D!=,'510_%[43'B2]#GL9 R*7%\T9%B7H(?<-I@M9!\0.#P.Q +M GL24PQO"] EO@-#&PT+PP]$!^$4GR @$ F"@.%!2@(=@3O)BT&5A7J%R03 +M+QWO%>H"#!H"%4$ LP+M$&L/I18C)'D (2!Y 08)-R67(5P>U2'7&X 1^-!%P!#Q7'#R8!] FH&UD6ZAQ1!P4F,Q?#&QH89!>9%ET1\"90 5H= +M6B&'$.41!0C_'8$("1[! ML.,A-'&=0#X0%5#^B0@#I0>* MT$NXC,16) 8(6ZAHU!*,+_1<[ _$& +MB109 ^ (@ #X!? '8P$]$$L"]2$6 HP;JR"2&5T0TR"3!(96" E$P$:714K _P;7",,#*X<[ .G"QH' +M0"39"!,8SB10 >PD>!]D'2 3:@TJ&E@D2P4["\\E,!L: >L='""G)(4:]".E +M$(H0E1,6('<($2/E(O@!+Q=&'&H7R D)$:\>>PA]#+L@D!Z2"FT!;P0@$*X6 +M'"7;$R$/'1\H "D$5PK=&[$2 2', *0?""-'!A,5(BP1;0I:!TH!(!M6%8P/.02.)D4A4R Z'I<.< -F&V\!A1V&!\\@0@?^ +M'5D*^R N!)44" !Z$D,<11_V)-H,J" <'7H@IB8")?(B3@NP((0C,27^&V G +M#18=!_$$J +Y#[4>L2,$&)P,!A(7#RTB?14D(5433R;% ?<2)@$H(:<'%@LH +M'3,7UB+U :(E1 FP"%$<]B:K$3\)= E&(?DA "#%&\,$Y03<%S<>1QLA*!/4):LE'0=@$]D&8!/M(5('CQY !9 @'!_ $T,%2QZE&!HF +MBQFX&Q<:BQ0K'=T>NQ#Y 5@$ @HW"D$?U1.Z&IL<@R,;'-HA:1U]"V82C .V +M(.()51UB"-4 _R+N'E<7>P,T(O45C0'J%/T##2:M&"$-;Q)?!N$4 1UN')\2 +M'1*S$-D,&0R"!DH*S ZF$2H@#0>+!#44'P2;$<44GR%*$F<,\Q(B%TP;'!M' +M&P03S"27!(0EYAG0 IX PP3? 4@<% ^B%LH4NP*L(P(*RAZV$X\EUR;+'R08 +MP1"!%?,39"%5&&@<$1#8&'D6\AC$$YH9_"$*%O # @(J!18/VB X$082+!>( +M WH3"PJ1%= =<@/0%<,!: <<#507EABK)&,9H1!E$E(DSB88#I4")4AT2%1!@H0J",V +M&J@ :A3M(!4C PT, GX&>";@$;T$(B)A)A\(K@MH!L<6^@%!!D(*AR(\"4\D +MC1D0&<8+1A"!#P )J0A<"_8?(A^)).4(0"+5"B0 JQ73 @P@'A?[#S%PI (&LBZPX,&@ +>!*B ),*LP>4 +M(J,25B4N V,+_22[)(0)N@21(3P#51]R (,.V0O4&6H52 C4(LX7'P*>!+@$ +MP@#D%]H)]B6J&&T%$ALA)F\=Y0^-(T01]1)#$QXD+!HL(T$7.!&]%#(/, ?J +M!F\@Y!!W"EL%6A:M'?0EJ2!D$G$4;R" ,@_ @V!BT+]00*%5H#CB7U)GP: +M;P$]"PH3/B6C!78DR 1S&CD$2"2!&E$")!O4$3,)AR)F))43G24X)8T8)1(9 +M)8H*.29D#'L,ZB04!G($3Q9%"%,+?16%%;0'/03?"Z<4"2*%"C\F?1^W%I(F +M Q/R&KH?.P$M&J0(/AS-(5L.#QK %KT4P@O])AD4)R&8'C$7, .<#%@3;0\) +M$XX-KB5/%-T&001$ ;$&)!A4*(*H0 +M-!-S)+@@WB14(*(=:R;>% 4BD0M[!S*R$< +M%.(#T0X\(Z _<@>QOR#B(4<7'0DV!$4G!1]$#2P7^!#A$C$7A0-3%UL*6 Q" +M)PL1[P$'%'0B,1S$#Y\!S0H9&\0!,A0@"K4&VA&_)$@&B @*&$T2L0;% XT7 +MQ!PH'<$"H0OT(=4100BY()8E8QD\&ND*D@]9%"\#QQLV)KP9JQA&& $C\ /R +M")8C=PL%&XD:^2 K&3T362') XD!ER7O"1,*:@@K! $5#P39&E$D("12(0(D +M9P6V([X&1Q!*&8T>906[(.05 #"&?L<]P(!#?H+21JS$J@/]0(:']L,>B3[ +M"#DA.1S)$KD0>27V(KL.*@;K(A$ =!6D')X/3AKN'TP05!OB%'04MPHJ#>PC +M+Q8>$GD;.1&-$T$%WA;A(>\ 80]($:<@&!5Z$'8??P;2(9 EYB,Y!?L$QQ"7 +M S00>@2B#@,F]0;&!1$@4P?H)L 7MQ<4$,H#?P\^"CL']R%O"9X!3!_!"H@; +M]!.1%EX1#B),"EX*HQ,' /0#]R<#!O40* ! ! %8 _P'\ TX$] ;N +M"3T+X [7$B(5PAFV'?XBFP ! ! H 9 /H ! ( P $ +M ! 0 " 0 " 0 " 0 " 0 " 0 " 0 " &/ 0K0 +M , $ @ # 0 !0 & < " ) H "P , T #@ 0 !( !: $G +M$.$ !?40 -2E .AOP8;R "-C$%XM:\< !:$ S.T;SM/"$ "83XESEX@3^^! +MA:Q!6RUM!.Z?$+-+!Q5[R9?. ,!A +GUOZM[)U3$XC'M8X ^$ ]C3/9C'-1OY5Z;R).DKJ'0^^ +MD.00 '&5I?%W=2EYZ&6TJP=D%;41FR7-T>]P:]\^ +M'YWJ U]3$-',[B)AT_H(>>#&VB9GVWFK98X:QP@ @Z$ /6PP(V:&YVWD)K8X +M-<^+AN. !00 &-18(_9N"%T+[ .4,D^0O3NEW9H"<1WY1%T .. +M@>$7LCOD>- :'$8(#WGU]*=BYXI18LW5BW?9CQ"H+D,(JK(:?(XASD#SBLX+ +MA,0+)WSKE,.M)1))80":M((ITUJER^T:N:]>&++91["WLIUC%#^, UW[ LH0 +M "8->2O_?&GOX.QH':752NMF2J00!S?T]#A&,@T ]P!M7D$E?NX]+NL2Z@\B +MX#.4_;8.P)OM>'Q94\ D9K@3H?4 $,L0F$$TB. *V\@C LI__069F\)W/.-X +MS([YW2=KO8YFB;8 B$ B@P7NXZD5J^?J09'LC9=2U_@@-RJ"O#^V4"HCH#0 +M:QIC(Q >,5,!M:XNT>7AP\@/@$N +ME9D) ]\X_0\5Y"\C=/7LT\_<",0$L-J\S7\9IC,F ^D? DX'$*7&]JM.21MG +M+0)N/0816"GK=AC1_=-AB"+,W5\[E.Z,4+PJ<@!:X0"'A6%;;D\J:1A[XAP$4#0K +M+]TG[F-0<9FFR>D6CDHN*!<(;F\:21EN (MP?=8_,JV9$LH:7R7@-!8L,7( +M+6L7=[<+QIXR5#[ +M;,?#E':86LQ)3B@IUOEETUR)53P,@Z$ #NO3K:=!3^3WE3XA71S[W#*_7QXI +MR]79KU?2V(2ZS+]DL*+]MQF%WLHQ >@0 -1!F!9[7-/%.( .UQ\[3_5K7HN> +MF#-R\%<1,$'!S/DP.CW*+5EN2] N?95: $HM@?O#T/12(BA0MP_R\U<3%!/< +M0EU]UCD9F?A9.!P DA36AK-WN7JE_F$2MV%J M_$'@A8:IP L&(P!90'GM" +M,WG5, 1K(-0)0!AXZZ5/K^=VLUV_'=^4O\8S0#][O(T 6$ G',2]%T'X9=X +MY[$OSEFY7JK:M#=9[%D"T.GA"\?D?8B$(7@NHFE(?1%#O()-?T/5$ !:_7,? +MY%0HH>'<3F*/F0=<_^F^@:X_Z]B;)-V07):O %PWF0DWYJN85#^8PDVSO",* +M63U!^-(BT#/GI_/VEE2%CZE^K[8,<_" Y6"M,%5/&/BW*UC-28VK=U@K +ME?UMCGN1NN=?;3)62QNN6O9$=#F%GGQ':>L "1 %UD +MA -_X\,A7..I*=GX1)'"X,?R2JY43>_67J<5VMH8(WV$E9!*[?G:=H$;QN#R _J?/3.:BT %SK8SLUCABB,X'/<0?4"U0OA.SSLA>ODE<6O >3OT;.)DJZ^;-\%*0;6-U&8! "A +M)TDQ+X'P.]_^SB1!)!Y_(L\Q"(_A +FR=3R"B!:3S3\Z:XFTA]X(GD5&:$VF +M#/W;DY'?).P3,&A$)YFT0>ZV@%09'WT)[1#C?7L *4S7 +M'J;T"#, ,XS!EV%.7RE!,[^33:C9(Z8+P"B=W2DFU9 +M4_%=3#-E5!1F_-*V.X0*+;P38:G)< ',Q"&.JM;FCKR/[K=,D;;V)!*6.A) +M1L4HC,8?,%N:%PAE@'PIA+$&OW6/IXQ5%^"4]1;T9H;DI[WV0K7F,"P :$ +M06JG*Y/%U'A]QNKCK2ML*_R$2_!UKA1U6'LT8K9ZVX,1#%4"F2\B]]ZP[ "B +M.\VD]<5/BEMEB[B-\]*!+FD0 %4Q":M8TJ8,)LM688.':ASTP76'Z'8L1$?/ +M0: %GLD(!CZ@NLCHY\_ 5>'Z1++O 7ZP)" E<]%R^8'DN 6N!Q7,@;2OC)E" +M37,&,OO6GOG1PT .R)-/0[@,L83U=>/)6_2,8I/_!B27&Z]2^8N;(8O?>#54 +MX;-ZUE\%>9+_QJ4M 11O$!,D-"+U1"1]?CV#IY3/&AZ"2T Q6?K,9:0_!WF$ +MK;MYLX#I:G%9:84BR6-96OU$GD-9:%-IT,8.Y9\X[%37-G0 *F$ OS)S"[@T +M>#PT8;ZSZ@9*E)6LC?&_:S<*_"#_GZ;S.L[4F]@#R"WLF]NIR=Y)^&G"SP@T +M=ESKDP6Q**7)%Q\@,G#O 80 )_M^MR SCL0%]0.\6F$0\I*=\V?N;'$%* +M)VX7KE?L8HFJ[R+[W;:B[^07X;WR,V:(@#>T+#Z_N-Z1&:QD"-3T:DXU_VH. +M9U:Y%$#;.\IX*IMH:S+%V?6O:;PF9*L0E[]MP#<\SKJDL34AC4T^CM8>Z:K +MQ-U;#]?\%#Y?"D =4?"V?&J*@Z=>22C+'9^.K02&[8R%\;^@U6C6?.LB(&4] +MLF(%VR$ KPHS)ZA_2@UAFW(QE^N@;_UKH4L+Y] :X#;/JH5F;80MH,G9$5JP +M+-T"Q DG^;G>A)BD-A_F2F&E,S_JJZ\5#Z0%(Y+5Z #D$ ![J3XEZ+ZUA<'\ +MJ/1=' <>/"NH6P@,^7%=( +6 ! (FTJVLX;J;+EE.0'!28QY=?F-W)&;(6YQ +M[B.)O=5ML+0B!H:0)[OMZN, (GP!F"Z'6[[3GW+8V2^'$A50QFO>;G#/2M@/ +MU95Q;B:R9K"MQC8D'1736CQ"5 YC_W/ S%7O%V7Y*/)5O,?W@-SMW/1N[\Y? +MW%/W 7G$)?+:>@FUW(^M.2JAEN0.2*<,P=U2WKID2U'^7>:;D#G%@OXQ R2 +M\!#R7VP1)<.+0LGYD9US"WRO!?\MA;!#=6DM*X0LIE?O$- ?X0",\0VI/IF; +MS1NN+?K#!7:YTM%7+KPY%]"R&MQ^.CSR.A +M\^B%?4OV'#I (G!U<9K]I+J:>F'?:A_!$ "H9:\1.J4!752F^=GZ4Z=!7N+; +M;+ I4422SWPNG#*%SX>VJ&D4NP*189F;AXCD&%/D<-H.F^^(!TV^I3?Y.V^A=V(T4<:+6>C>*]Y8SSS_6")&?!6H5W59)N=G4Q=WMV/K +MY@I?X_TY:3/HH#6H!;F']C$/0R$?0]O86O66JQL9HF@_ 00 .8AZCS0>(UC +MYSFQ[Z<7=2BN1YVK%,M]:&]F.:U]'_56^8K97OX_L5<@'Z@TCL3D6T+NS&6X +M69]"'CM;PD,3]E].P,U$G[U%^E1C]"EB.R#9K"AK@>K=&WT[U?]T)N'J.'B3N#.&,\ >0?C]3KPD +M,.DL49<\1.8BC?]EW8YP1?$KC=^#&D1?$&DWHJ::A=C=1!#-@!L"N203V35) +M6SDA/ QR!]I>^YW8 AH T>C03 LM!]99\?A,';CJ@]S2]1]MM;Z? TQ%/@0L +MLYE2W T>>@:+*\P^?//5(EH$ F$ O&$;@0A4&32%V)B'7L27VC0=I=JL46K +M*C*UABWBT_XOM>1B/1^1-NT*^VX(-%&\0#W=]Y9NL@!2JX#K7Y.'XQFF&?+3 +M-9\SFE;1O])NN=@ U)-> )P0 /3="5)=14+AKK0T+J.SHV\_S7INM"AW]TO! +MR-!GTOC@KJ@[9ZW)5K-LR)T+E9W! %M(BCU*OC;T4MGH37';(<7Y'($)2D78 +M:M>J3'P(X:6<=9N( .0\ !?[03A\6+R#2V%T7XB()CCJ4,!RG&TN.^TU7DB/ +MF<2]UZAY@A:$H,JT4;J.25S&)M3)\_R]LO>FIT3R3'2>(C"OVN>5DCL M_6! +MI1)POCF4QATH#3[BXL8).CAW24%@$+=/UB[:#D EVZA25T%Q--_,5FH=( U9^ +MAVHC-JQ>/[MSSSAG/OI2KT05NA E)E?#_;GM]//,CLJP_-./I2>9OR*511( +ML=[^;N+]W0O=F%*4E $"3Z7VYQQR#"H2DO.5MSY1I7.NL3"WEJR21=@I;\MD +M!'GR"GZN\H5'2I&8&@5^,N%V U"; 5"F+[Y-U^$* +MJ^U/C&+L>\ZY0"'49H, H15UYLSC*?*$+P"!UQ#E9J)<'$JE/^D\/01R*#ZJ +M4:>.)=!3 _/:0^8(I8TB%N9@&F"<]OP4T%@4R)T:5]NZL9,DA<:Y[!C(C06Y +M*^(9V*#?D-A5FAL^I2B;VBE0:%A-@/1U+9QCEQ@U- S1#( *#IIMW[(DTS _Y\+_R4P42+E!?>T15SQ"(@/Z ,0 (55 +M,S[,%@!VKC"W0MOBV A+;38,-#Y+UW'A^0L)Z1W-CMZ%)7!K(__<6:$SO(7A +M<3UV:H81'\E^^6$>@U9.K"Y)],3(0U@PL)12HHX1?+[M]$?&*RWH<@Z[[%UO +M7[=URTK!NC@C,2"$,Q*\X#/4N(T@OEA<_(NX;E1LJ-X8$4C0Q[,I(4]E2] +M2>'$)]RE(Z.DOEN"S*)R+S401'^^ +MG1.XJ,(R3LE,,ZV\GOZZ=JPA,BY,S3(^$Y&TYO' @"OJ$ R6@& ,HIH;F;WETN&P^VQ"%Q0U"? +M0X86:RG2;*D(WT-@E1TB(* P;;2'X\)>9\6>PSM]T'@PY7^0N-@;WIW:Y-?F +M1%Y$Y83>LDT-7IY!MBFB=@X'U=BC/$9QA,+MS1SA(B< :Q AQ%^N^)Z:6BH +MC>RH""=,86GS:AHS==.M!@6K&NB;0OK>80[<;G*FRN#3Y:NZ,'I'3M>JRN8R +MPT8VA+3%]DNC +MB?X6"Y'9P1A^IQLO 8"B#%>A%R5)\=O%???*$\1-H==B?M'<39M\!H+U=\]7 +M_DG>8MMZ_"M);D"< WZ0 )/$&I:G'Y2PC=R3HG?M-W_U"9==$&:Q*L5SL ! +M$V6M;8WE3P9ZT0H?4V5]2+5YE2JFD8"\,YA;P 0 " 0 !P * +M X $@ 7 !P (@ I #$ . ! $D 4P!= &@ #X(T Z#);H@RAGP&K<890ZR&/D(]P\B$_$! +M+0]=#K$!FR0 ! $# FQ#]D0@1OH',,8HAMK!>0:#B9"$\<:#R;:"H"Q9Z#>$35@F1&DLFY"&Q'<\@FQ^X"Q,9*R&<)8(1;QSG +M %L/$!UO)B$#$R'*)-L:,A@(#44!K1''&](96 !J(J4"$0RT!M,C,!MS'F0; +M> ^""_< 90!W"-T"61J@(T88AP,F!APBD1AN!9(7XAPJ&^T<,1"5)'PE"AH+ +M&9 *D"8+ ?L7^@"/#ZH*YB/\).<'JP?6#V0-,!*-)?\,8PX&('H B130&342 +M%1 7 *@=Q@_@#>T"DP4#"+L+#0)##.$'4@$M!K@7'R,%(WT?EA-[%KX B5 +M"APF12#5$Z,F:0MH&CW(:L/ +M-2*8(T<,] XY! 8,T"0. ! %$"6_#%80OQ'1(/8E7 36%<\10"8B!CX)O C* +M"0@A)0C%(]\"J1GF$Z@@;1'>'\D)'@Y)&:<@>1<-[05@ ?L8+PD<#XL?L0]8!PX QQ_5 EHT&0T1 0'% +M(K .WQ-$(LD5Y@E](,,"UA7P(S$- Y$%%P)0B!$!CX%+@H> X<6C!HK @T+ +MUR6N(8,.LPVN$$D7O1C^ 9<(7 #P&,0*6PZD(3L!E QK#FD8TA &$IL L )U +M"R4D2!V/$7\+3P*6!+X;$Q=>)>\-HP$R"_4 >!FB( 4&R@GI)7PCQ!/=)>\* +M:"96'3T8H21D"/D&/0Q")L(!.Q+W!,$ Q#P#.$@BAN9!O<4W1>^#M\3M!\D +M!N\D6"9=&O0>%Q$<'U0&/!2L&%, 4P'Z CL-8P8-'ED$_@W4$ET<41>C"8,B +M-B*B)(8CJ1'J !00 )@&5H9(1M2)/D*^Q4,(5D7HB'((84 'PK1(TH?YAT% +M'U(;0!RZ 2P&Y!$4%>X>*R1Y%R,6O!\ !/H6UB9< /DE9B7M)-$>^0,, (85 +M4 JK"D,5]0.S#_ .DAC\& B+Q-V!$<>LB2P 7(8)P'2&,0&EQTK(R<=,A-8 +M'DT%*@#Y YP@EP#"H\3[Q:M'AH1WR-K%>HFE 7N 2D%$@,.(+0*1G.&H &^876!-]$- "9!D!&WQUS)MD@4"6K&&$FW16](B()CA_G%440$!$Z 6P"8 =Z&SH?GA", +M"9T.#@;: Z0071["),441@.( *(8$/+QTN%-,FY0=O$K05 +M)AUJ!C("M0#+$T(C#!ZY#3$A>POE "T@A2%C&X0E^0+'#Z@@5":@(0\/WPW9 +M!T82,PZ-!!D9#1[M![4-SB%S"L<$)@R0&P1U( NX&0P99)E +B0B;$' 75R M +M!M@$\Q%-"%8&CR0= AP101OW'ODFV!R6&S$.P!(T!X(+.A.0"ED1""3["=<0 +M7 BM#'T*929A$1L%7P'8&N< +M!A#C'L\'D<#/@#7 / BXP@')34 & 7> +M ,TB;!_[)@ #UAG<$BP4H0#V&=X311CP$PH;VB*\$%09G@(P#[ > +M;QL^&)4,JB51 ,,;D M7#"X7" JB&/T: Q]F(^H/_ M<%VL?Q1_X)KF')L$D!D3&48# +M, X)%8D3'0TR%O8.X #"&<@ @ 8N$)(BMP93#WH<912I!&,C?04>%\$.TPP3 +M"!HB&":0)I ,'11J%"0 !2(@!7XBI ,S!3$DS"' %"("E!2?)=H0[!WO ](C +M)0Q% *(,VQ3.)I<+D0_)#*LG!"8U&#<-NP[$"G8*O26,(N\BJ0=%(EL/[QA9 +M! 00F!ON'7@&.@>#!J0+OR,-&?H'@P<*(9$7S@NP7! "0)P -D":0( +M-@J='I8*UR/5'78BJ"#T%5,"_!%/#MX=L 9%(5H+'A/A$D\.A":_"D42V29T&*L4I1.B +M(U\#41VR$<4C]!^Q 9L<:Q%,#TH2SA$[%J@8&QR8!1X"N2)%)2 930LP#_@# +M;B&Y#K@*?A/G 00']@]!%]\:* :O(IP4B #_$A$E$!,A)(<"Q"0.%#P&$ ,P +M&FT:ZP6#!5$"20G %S0COR#S'T81!"/ (7\%C23" /$,#0Q9#S(A%QNZ!#T; +M$!=% T\>'P*=#WX B!P.!V@&9R,#'84FU1SH'VP841$K#<4*P _K!9P7R2.3 +M%UX L12B%_,6*A;V![0^X!)T+*PP&%M8 D24J%GT#MP N# L""PT<'V0.0A 7 *4BN &] +M#/P7+B:V$,0+6P82 %<0X@7Q#(0D+%L@%IQYU"$T> +MXR9['.\A7@L_!:,:& &#= :;A6<",4D2B-J&C4!M!.\!N@1Z@EH HL55@4&!\X' +M&AO[(80/4@T:'< 161W_!Y\+8P?-%.T$:2)N#EX3ZQNK&RPE]!N4$"$4B,2& ,?3 C:!+HF +M0!#3!0<8/1'C$#P!! &]'?8"W0+U)=8"YR7X!VL3Y"2/'788BQ; (.H-?! _ +M%*H -00H .<1D23A%(0&JB/4"'T3*Q+F#2<>GQ%"%^@2C0].#S(!'B'0!G,C +M(@<1%.,?X1"W&\L=NPH8#Q(9I24#$&4FW0P'(;L2!K$"HH?CP*.%IT: +M^A+O&R,BB1S/)FXDMA3/!8TB123/)#X"/@27 M B6 =4)9 :!P9)#? +)1#S +M!^\:( 1G$RP2VR.E&>(:(Q0W B0-V1V@$><'8 -!'I,+=B,E W40<0@-$20= +M?1M5#A E>R(^(_,4E NS"*83J!NR#NX31A49(?4$# O6#:0(DR53(#X!:21; +M%S@%X@'=\B"B! !*@'V \8%F0/3QGA((0:K1QP%64 %A,$ +M%50%[06T%(\/?A+R&+\&?PR3$\0ES CA)G<(W0-K!B(1-P-C&FT*(Q076%[<:=@SQ"9(91A'!#8\-F0)C @@D [7(Q$AA"+Y$IP;?":4 +M#X BAA@='5L@9!+"#\D$I ,U"1D+T! )$*@=_ Q/!I<3W":L&K<@PAX*)+,A +M#@\Y"UA96(JP<5QT1(9(:1 #_&E,C0A>V +M!/\%\@X<#+PBCP*+%"X3- ^*#<,4?@WN%+\@9@ T'Z 7!@8F'B( *PB("=LE +ML@8G#&L&@07>%049NA.6!ST#H!0B 886>")+"#0* +M=0%*$%(7=P0((*<'?0RP(H 13"2Y$U(6?A/- 8@(MP%:)/ (P0CX$Y\AFP.. +M!FDBZ F+)#@# @DV!?$3RPHJ -063P#P&&X@'Q ,$7@F$PC&(_X0D@T"';TE +M=1=7 TT(NP630-Q'L@"KQT_%[,.B VZ%I8/3R'^'C@-91 " +M"GX\?]P-B +M"0H3- GB"B 'VAF\& 8)H0HR'? A\@4.$=P>X@I^ $L=JPI](CH@=AU>#R8- +M-A]C)P8%=P5Y'1T "0Q '@P#/PY^!S<5JPS]$&$'TB'R .,%& TN(8X0\!%< +M'JP8\B2!&;D:>@_7%L$"Y2$!%=4'J0->!+<2^!SX$5(?V0EA%4H%M!5+#:D1 +M#2;S(9(&&@2<'G\78 "-(&L7!Q#\$/8E:!F4$_X3DA^$ ALC=AV;!><*^!D- +M#UX/P08P$!(>RQ_K#U8["JD3%QVR M8:D11L +M#^<4^AL<(%88HQ/\'8D?@ ;$#>@*HAQV(8PF11!?(Y0CSA:R!*H)N!@7(LD< +M=!I])($:M1';$X,# P*.":H5415O'%(8L![2(581PQI""%<3:!7, :(! H0 +M&6X!1!#/ LX:]QM;(_H2NB)'"Z8 X@)E''$ PQ[U!;<1CQ4@):P;0"5K(P\$ +MFQN7'8H)$!HM(O\3ZAI[!2H3BQ.K";TF3PVZ!,P'0P2U)2P)$PQ! Y<)KQ73 +M)) *;!",'X(%=!JB(3$*&QR^(*P#;R:-".@#XA7@ 5X8%@<$!ZL3K0'/%S ? +MO0KL#5@:O UO FP*MQPP"6T88ABY#<\+Z"7T#P<)FR;;)E\6Y@*L$[L&81Q% +M#_($40])'],2% DF$\P@O1:((30E, P*!YD#K03>!Z@+SA2<&900F![5'F $ +MVR4""_A0 +'P .0!O](;X0IP/J%KXBG@@N! \@#PK%"+8ER ;7&&T! +M!B%T(24A\P[B'U@8@AZ!#!D,+Q[3 .HA;B-^ Q0-M17U&U0-L('L:$ *[(B0)3 M""8 :"@=M!?0CZAEU&1P2I0R6"#< 30YP'*DDB!L. +M&;83EQOY'_L!T18! OH9B@T9(F@;"Q^9!80'Z2-](QPCHA;.%4P&TA@=&ZT3 +MFAOD(;(8)0=_ ^(#50SH#> <901<(TH%AQ>U'O\2PQ(3(48-JQIA&PD1@Q#Z +M%&(A&@NA'O 2-!IQ"4L*^Q3O)7@FK!I")ILBUQV@ JT-0R0)"XX!8PF)(M0= +MQR1N'R0@KA^[%5(@5 S^ #@!^@0@!SX"]@XN#108)!@6 *4>VQRL%.0DE1._ +M"_H-?A? )G@ENAZ7&\0@;2+[ AD&-A0V"\@7Q";* 4L1R! !%/0B$QF&%941 +MQ;7 +M&2(D,1[&&,L!90V:!TPC_@X@N 3/%E4$OP.< +M)$8%]!:%#F0!Y0,9"3(=20?_ S@'I18T)+(D"B+4&>H*1A2*%+P X":Q"*<3 +MF0)3$LHZ!/B(S<=YQJ]'3H+)0ZR%OP K1E/'E0&Q " ! , +M!@ * \ %@ > "< ,0 \ $D 5P!F '8 AP": *X PP#9 / !"0$C 3X!6@%W +M 98!M@'7 ?D"' )! F<"C@*V M\#"@,V V,#D0/ _$$(P16!(H$OP3V!2X% +M9P6A!=T&&@98!I<&UP<9!UP'H ?E""L(L*.@J*"ML++0N! +M Z( !5;FMN;W=N(&5RH J7W *F#0 "IAP J8H *F.P "IDP J9B +M *F? "IIH J:Y *FU@ "IN< J<& *G)P "ISX J=8 *G>@ "IY@ +M J?( *GWP "I_X J@. *H)0 "J$D JAJ *H@P "J)T JBY *HT0 " +MJ/( JD4 *I*0 "J3P JE> *I<0 "J7X JF2 *II@ "J;D JG( *I +MW "J?( JH4 *J* "JC8 JI. *J:0 "JGP JJ/ *JLP "JLT JKK +M *J_ "JQ( JLC *K,@ "JTX JM= *K< "JWP JN3 6T5R0!097)M:7-S:6]N +M(&1E;FEE9 !"860@861D&ES=', 0W)O2!O<&5N +M(&9I;&5S $EN87!P0!&:6QE('1O;R!L87)G90!.;R!S<&%C92!L969T(&]N(&1E=FEC +M90!);&QE9V%L('-E96L 4F5A9"UO;FQY(&9I;&4@2!P2!P965R $YO(&)U9F9E +M2!U2!L979E;',@;V8@'!I7!E $YO="!A(&1A=&$@;65S0 (J +M1 >0 (J0 1 >0 (JH ,D) (J 1 >@ (JX +M 1 >@ (K( 1 >@ (K@ ,S) (JX 1 >P +M(KP 1 >P (L 1 >P (L8 -*) (KP 1 +M?0 (LH 1 ?0 (LX 1 ?0 (M0 -C) (LH +M1 ?@ (M@ 1 ?@ (MP 1 ?@ (N( -S) (M@ +M 1 ?P (N8 1 ?P (NH 1 ?P (O .*) +M(N8 1 @0 (O0 1 @0 (O@ 1 @0 (OX .C) +M (O0 1 @@ (P( 1 @@ (P8 1 @@ (PP .Q +M) (P( 1 @P (Q 1 @P (Q0 1 @P (QH +M /&) (Q 1 A0 (QX 1 A0 (R( 1 A0 +M(R@ /=) (QX 1 A@ (RP 1 A@ (S 1 +MA@ (S8 /L) (RP 1 AP (SH 1 AP (SX +M1 AP (T0 0") (SH 1 B0 (T@ 1 B0 (TP +M 1 B0 (U( 0:) (T@ 1 B@ (U8 1 B@ +M(UH 1 B@ (V( 0K) (U8 0]@ 1W@ +M 2K@ 3;@ 3M@ 44 +M@ 4P@ 5.@ 5J@ +M 5W@ 1 L@ (V8 1 M0 (W 1 M@ +M(W8 1 MP (WX 1 N0 (X8 1 N@ (XX 1 +MNP (Y8 1 O0 (YX 1 O@ (Z8 1 OP (ZX +M1 P0 ([8 1 P@ ([X 1 PP (\8 1 Q0 (\X +M 1 Q@ (]@ 1 R0 (^@ 1 R@ (_( 1 RP +M(_P 1 S0 ) 8 1 S@ )! 1 SP )!H 1 +MT0 )"0 1 T@ )"X 1 TP )#@ 1 U0 )$( +M1 U@ )$P 1 UP )%8 1 V0 )& 1 V@ )&H +M 1 W )'X 1 W0 )(@ 1 W@ ))( 1 X +M))P 1 X0 )*8 1 X@ )+ 1 Y )+H 1 +MY0 ),0 1 Y@ ),X 1 Z )-@ 1 Z0 ).( +M1 Z@ ).P 1 [ )/8 1 [0 )0 1 [P )0H +M 1 \ )1( 1 \0 )1@ 1 \@ )2 1 ] +M)28 1 ]@ )3 1 ]P )3H 1 ]P )3H 6D) +M (V8 6L( 6V( 7(( 7< +M( 7G( 7Y( 8-( +M 86( 8F( 8X( 9"( +M 93( 9F( 9R( 9_( +M ::( :]( ;B( ;^ +M( <7( <\( =6( +M =M( >0( >K( ?#( +M ?G( @$( @B( @X( +M A6( AV( B-( BH +M( C(( C=( CV( +M D4( DJ( E$( EC( +M E[( F4( FB( G@( +M H-( I!( I-( J( +M( JS( KD( KO( +M KZ( L>( LM( M+( +M M9! )4 MB! )4 MQ9 )4 N:9 +M )4 NS@ O5@ OG@ P. +M@ PG@ Q%@ QC@ +M Q]@ R?@ S"@ S?@ +M S[@ T-@ T@@ TX@ +M U$@ V"@ W&@ X4 +M@ Y+@ Y8@ YB@ +M YM@ Z6@ Z\@ [1) +M)4 [G( [^) )8 \4!@ " #P \C) +M ):X \N! )<@ \V! )<@ ]%9 )<@ ]N +M9 )<@ ^'@ ^I@ ^[@ +M _B@ _[@ ! 9@ ! W@ +M !!1@ !!S@ !"6@ !"S@ +M !#/@ !#A@ !#T@ !$, +M@ !$8@ !%6@ !&:@ +M !'H@ !(?@ !(L@ !(V@ +M !)!@ !)J@ !*0@ !*E( +M !*Y( !+6( !+H! )<@ !+L +M9 )<@ 1 #__P )<@ !+S! )<@ !+]! )D +M !,$! )H@ !,.! )L@ !,6! )L@ !,:! +M)M@ !,B! )N !,K! )O !,S! )O !,\! +M *V@ !-+! *\@ !-3! *] !-@! *] !-J +M! +4@ !-S! -7 !-\! -:@ !.&! -Z +M !.,! -Z !.5! .' !.=! .' !.A! +M.( !.I! .( !.M! .) !.]! .) !/!! +M .* !//! .* !/3! .+ !/;! .+ !/? +M! ., !/J! ., !/N! .- !/[! .- +M !/_! .. !0&! .1@ !01! .6 !0;! +M.7 !0E! .A@ !0P! .C !0X! .G !1"! +M /0@ !1*! /9 !13! /> !1) !4*! >?@ !45! >J@ !4D! @+ +M !4S! B' !4_! BI !5&! BI !5*! +MBJ !53! BO !5=! BS !5D! BS !5H! +M BT !5Q! B] !5Z! B_@ !6#! C! !6+ +M! C' !64! C. !6=! C0@ !6G! C4 +M !6T! C4 !7#! C4 !7,! C4 !70! +MC5 !79! C>@ !7@! C>@ !7D! C?@ !7N! +M CJ !7W! CJ !8 ! CJ !8$! CK !8( +M9 CK 1 #__P CK !8/!0 #H )D !85 P +M !8?!0 %#@ (" !8E!0 (V8 !8K!0 #8@ (I@ !8W!0 &X@ +M)M@ !8^!P %<@ " !9'!0 $0 )<@ !9/!0 #I (I@ !9;!0 +M (J !9H!0 (JX !9\!0 (KP !:2!0 (LH !:@ +M!0 (M@ !:U!0 (N8 !;,!0 (O0 !;8!0 (P( +M !;K!0 (Q !< !0 (QX !<-!0 (RP !$"0 "L%8 !>- +M"0 "L%@ !>="0 "L%H !>O"0 "L%P !>V"0 "L& +M !?$"0 "L&0 !?4"0 "L&@ !?<"0 "L&P !?K"0 " +ML' !?\"0 "L'0 !@%"0 "L'@ !@/"0 "L( !@="0 +M "L(( !@R"0 "L(0 !A)"0 "L(@ !A8"0 "L(P !AN +M"0 "L) !B&"0 "L)@ !B3"0 "L* !BG"0 "L*@ +M !B]"0 "L+ !C+"0 "L+@ !C@"0 "L, !CW"0 " +ML,@ !D&"0 "L- !D6"0 "L. !DF"0 "L.0 !D]"0 +M "L.@ !E6"0 "L.P !EG"0 "L/ !E_"0 "L/0 !F9 +M"0 "L/@ !FH"0 "L/P !F^"0 "L0 !G6"0 "L00 +M !GF"0 "L0@ !G]"0 "L0P !H6"0 "L1 !HG"0 " +ML10 !HY"0 "L1@ !I""0 "L1P !I."0 "L2 !I9"0 +M "L20 !IB"0 "L2@ !IJ"0 "L3 !IR"0 "L< !I[ +M"0 "L<@ !J%"0 "L= !J0"0 "L? !J;!0 )4 +M !JN"0 "L@@ !J]!P " #@ !K.!P " $ !K@!0 +M)8 !KS"0 "LA !L"!0 &= )H@ !L+!0 )LX !L2!0 & +MY0 )<@ !L>!0 "> *\@ !LD!0 %&@ *V@ !LQ!0 #E@ )O !L[ +M"0 'B0 "LA@ !M+!0 &JP +P@ !M3!0 (' )N !M:!P 'EP " $0 +M !MA!0 $W0 *>8 !MJ!0 "9@ )_ !MS!0 #>0 ,!X !MY!P %^@ " +M I0 !N!!0 &3 )Y0 !N)!0 $9 *H( !N3!0 /@ *6( !N=!0 +M .(8 !ND!0 %)P *T !NN!0 .'8 !NU!0 ',P -7 !N] +M!0 & 0 )P8 !O%!0 %:0 -R !O-"0 #( "JZP !O3!P #<@ " $P +M !O>!0 $50 *^@ !OH!P &@P " %@ !OZ!P %50 " & !P!!P &J0 " +M &0 !P*!P #RP " %P !P;!P #?@ " %0 !PL!P &;P " % !P_!0 ' +MUP -Z !Q'!0 #. *] !Q3!0 %I .7 !Q!0 &\0 /0@ !RE!P #P@ " +M +@ !RN!P #30 " ' !RZ!P ',@ " + !S!!P "H@ " +0 !S*!0 +M .+8 !S1!0 $?@ -:@ !S;!0 .)8 !SJ!0 "HP -CP !SX +M!0 $5P -M( !T$!0 %:P /9 !T,"0 '?P "LB !T6!0 .-8 +M !TB!0 '> .1@ !TM!0 #HP .68 !TV!0 .,8 !U "0 " +MLTP !U%!P /0 "!1P !U,!0 *0 .G !U4!0 $U0 .K@ !U?!0 " +M?@ /> !UH"0 #^@ "LJ !UQ!P (>P "!=0 !U[!0 '>P 3_@ !V" +M!0 &^P /

) !W^!0 !F@ BCP !X)!0 :@ 9:X !X3 +M!0 F@ B' !X>!0 (" 8?@ !XH!0 "%0 3GX !XQ P $6^ +M !X[!0 &\ 4>@ !Y$!0 &(@ 4C( !Y-!0 %Q0 4F( !Y6!0 (!0 +M4G@ !Y?"0 $S@ "LJ0 !YL!0 %> 4;@ !YV!0 &M0 4= !Y_!0 % +MU0 4@ !Z(!0 '(@ 47 !Z1!0 &%@ 4DH !Z:!0 &V@ 4A@ !ZC +M!0 %MP 45@ !ZL!0 %P 4: !ZU!0 &I@ 48@ !Z^!0 BI8 +M ![$!P 'B@ ""$0 ![+!0 %P0 5Q ![<"0 !Y0 "LK ![G!0 "_ +M7D0 ![T!0 (G B] ![\"0 'OP "LL !\&!0 %QP 4K@ !\1!0 +M50 89 !\9!0 &>0 8)( !\G!0 6P 5W( !\Z!0 &YP BT !]" +M"0 %\0 "LM !],!0 $@ 82@ !]4!0 BS8 !]:!0 (10 6Y8 +M !]F!0 (0 B_@ !]N!P &Z "!N0 !]^!P #U "!P !^)!0 &8 +MC' !^1!P "7 "" ( !^:!0 SP C0@ !^C"0 H@ "LSP !^Q"0 ' +M= "LT !_("0 H0 "LT0 !_@"0 #D "LT@ !_W!0 $E@ ?@ "&:!0 "* +M>,X "&U!0 Y >4@ "'0!0 !A0 >D "'F!0 !8 >FP "'\!0 +M2 >@P "(.!0 7 >J@ "(=!0 #00 ?9@ "(Q!0 &*0 ?%H ")' +M!0 (+P ?@0 ")B!0 #' ?18 ")V!0 &! >]0 "*,!0 %+ >UH +M "*@!0 %E >MX "*N!0 !. >Z8 "+!!0 #!@ >VX "+5!0 &*@ +M>R "+E!0 $_ >NX "+S!0 %O ?U ",$!0 (& BJ ",,!P ' +MY@ ",+ ",K!P #J "BAH "-,!P '8 "=D0 "-L!P (<@ ",) ".# +M!P %X "B6( ".!P ($P "BM "3U!P %60 "=DX +M "4+!0 'H@ C. "43!0 C>X "49!0 'N C5 "4A!0 +MC48 "4I!0 #;@ C?@ "4R!P %P@ "HH0 "4_!0 CJ8 "5'!P " +MF@ "H_ "51!0 " "58!P "JZP "5?"0 "LTP "5E +M+VQI8B]C'0Z,3DL +M,"PS,CML:6YK9G5N8SHR,"PP+#,R.UP 65L;&]W.C L<'5R<&QE.C$L<&EN:SHR+#L 8V%R3I',S(] +M87(Q.S [,3LQ, !V7W5N3I',S0]87(Q.S [,3LV '9?3I' +M,S@ =E]U;G-I9VYE9%]L;VYG7V%R3I'-# ]87(Q.S [,3LQ,@!V7V1O=6)L95]A3I'-#$]87(Q +M.S [,3LQ,P!V7V-H87)?<&]I;G1E3HP+&9O +M&ET7V1U;6UY7W)E +M9CI',C$]*C$ 7U]D;U]G;&]B86Q?8W1OF5?=#IT,0!W8VAA5]D96-L.D2YO &9I;F1I;W N;P!I +M;V(N;P!S:6=V96,N;P!C;&]S92YO &5R<@!F7!E7RYO &UE +M;6-H2YO '-T0!?=E]S:6=N961?:6YT +M7V%R0!?=E]L;VYG7V%R5]R968 7U]E>&ET7V1U;6UY7V1E8VP 7U]?9&]?9VQO +M8F%L7V-T;W)S %]?7T-43U)?3$E35%]? %]O;E]E>&ET %]W0!?9F-L;W-E %]?9G=A +M;&L 5FQIF4 7U]F7VUOF5R;P!?8V9R964 7V%T +M;VD 7W-T7!E7P!?;65M8VAR %]M96US970 7W%F8V]N=F5R +M= !?9F-O;G9E5]T;U]D96-I;6%L7VEN=&5G +M97( 7U]R:6=H=%]S:&EF=%]B87-E7W1W;P!?9&5C:6UA;%]R;W5N9 !?7V)I +M9U]F;&]A=%]T:6UEF4 7W-P5]O=71?8C$P,# P %]?<')O9%\V-34S-E]B,3 P +M,# 7U]LF5R;W-?F5R +M;W-?=&EN>5]P;W=E5]P;W=E5]P +M;W=E5]P;W=E5]B:6=?9FQO +M871?9&EG:71S %]A8F]R= !?7W-T87)T7V)I9U]P;W=E%]B:6=?<&]W97)S7W1W;P!?7VUA>%]S;6%L;%]P;W=E +M #0 #"0 T " +M!0 H !4 $0 8 T@ - "@ H 4 P +M -0 !, ! ! -( #0 ) +MC "8P % @ $ G @ IP "4 "6 < " +M @ ">2 "GD ' !P O=7-R+VQI8B]L:6)C +M+G-O+C$ &$ , +M 4 P !P 0 +M + ! @ +M +M "@ +M ( ) +M +M +M +M +M!@ ! "02 "H +!@ +M$0#_\0 ^ "G$ !!$ H 8@ )P 1 /_Q 'P +M !:$@ ": "I4 !$ __$ M 2 ,H +M!-@ $$0 " #\ !( !)@ IR 1 /_Q +M7X *>0 $0#_\0!?8VQE86YU< !?96YD %]E;G9IB\\ )&#_____H"\\@ )O$ZY@ $*%A/(#R 0\9_\ . +M+P!.N8 !"A83Y_\ #"Z60>X !"]( 1*F&;\(\B "G$+T@ "$ZY@ $ +M$$ZY@ $4$ZY@ 'K"Z 3KF 1D3G5.<0 !(#O____Q([P 3R-_ +M 7 $< !@_P 3R-] 7 $3.\ $3EY.=4@._____$CO +M!/(W\ !< 1P &#_ !/(WT !< 1,[P 1.7DYU2 [____\ +M2.\ $\C?P %P !' 8/\ $\C?0 %P !$SO !$Y>3G5( +M#O____Q([P 3R-_ 7 $< !@_P 3R-] 7 $3.\ $ +M3EY.=4@._____$CO !/(W\ !< 1P &#_ !/(WT !< 1, +M[P 1.7DYU2 [____\2.\ $\C?P %P !' 8/\ $\C?0 %P +M !$SO !$Y>3G5(#O____Q([P 3R-_ 7 $< !@_P 3R +M-] 7 $3.\ $3EY.=4@._____$CO !/(W\ !< 1P &#_ +M !/(WT !< 1,[P 1.7DYU2 [____\2.\ $\C?P %P +M!' 8/\ $\C?0 %P !$SO !$Y>3G5(#O____Q([P 3R-_ +M 7 $< !@_P 3R-] 7 $3.\ $3EY.=4@._____$CO +M!/(W\ !< 1P &#_ !/(WT !< 1,[P 1.7DYU2 [____\ +M2.\ $\C?P %P !' 8/\ $\C?0 %P !$SO !$Y>3G5( +M#O____Q([P 3R-_ 7 $\CQ4 8/\ $\C?0 %P +M !$SO !$Y>3G5(#O____Q([P 3R-_ 7 $\CQ4 +M 8/\ $\C?0 %P !$SO !$Y>3G5(#O____Q([P 3R-_ +M 7 $0CF "MD$_P 8 *N 3_ "@ JI#/\ . "K8,_P !( *L@S +M_ %@ J;"/\ !H *G@C_ > "I8(_P (@ J7"/\ "8 +M*M0C_ J "ID(_P +@ JY"/\0L@ ( *J@C_$!I " "IP(_P +M @ J=!/Y@ K9( *T 3^8 *N" "J@$_F "JD@ J8#/Y@ JV( +M*N@S^8 *LB "JT,_F "IL@ J["/Y@ J>( *H0C^8 *EB "KX(_F +M "I<@ JO"/Y@ JU( *UPC^8 *F2 "JL(_F "KD@ JS"/Y@ JJ( +M*TPC^8 *G" "J0(_F "IT@ JE"/\@ K9( *O C_( *N" "M8(_R +M "JD@ J]"/\@ JV( *U0C_( *LB "L((_R "IL@ J:"/\@ J>( +M*K@C_( *EB "L (_R "I<@ JQ"/\@ JU( *MPC_( *F2 "M((_R +M "KD@ J@"/\@ JJ( *T0C_( *G" "L,(_P "@ JC"/\ H +M*GPC_ & "P (_P !@ K:"/Y@ K!( *W S^8 +!" "P(\C?0 +M %P !$SO !$Y>3G5.=4YQ " "GD " 0P +M@ $1( !%B 1L 0 &@ ,@ $$ V F\ !( .@ +M %@ #9 : *D "@ 'L + $ !4 X +M*<@ " , !0 ' %X ^ +M 0 ! #_\0 " #4 , $ +M@ Z # " ( J0 P P " -D , 0 +M @ #X # % ( !! P !@ " 04 , +M < @ $> # ( ( ";P P "0 " "G +M , H @ IR # + ( *>0 P # " "I8 +M , T # . P #P +M , ! # 1 P $@ +M , !, # 4 "@ ! #_ +M\0 !$ 0 __$ 8 $ /_Q ) +M! #_\0 "P 0 __$ V $ /_Q /8 !-P +M R$@ " $F "I8 !!$ T !6@ J7 01 - 98 +M";P $@ "0 &N "I@ A$ T "!@ 'K A 2 ( +MAH *F0 $$0 #0 )2 "IH !!$ T "M@ $/ "02 +M MH +!@ $0#_\0 +N "IL A$ T #,@ %U@ #(2 +M ( XH *G ($0 #0 .N "IX !!$ T #Q@ $> +M 2 ( ^( *GP $$0 #0 0. "G$ !!$ H $,@ J +M@ 01 - !)( *H0 ($0 #0 3" "J, !!$ T $X +M@ %#@ #(2 ( !2X *I 0$0 #0 5J G !$ __$ +M %A@ JH (1 - !=8 *J0 !$0 #0 86 "JH !!$ +M T &-@ JK @1 - !H8 !"@ !:$@ :B "G$ +M!"$ H &P@ &G@ #(2 ( !O( !P( R$@ " =& "JT +M !!$ T 'F@ JN 01 - !]( *E0 $0#_\0 ?N +M 5R ,A( @ ((@ JO @1 - "'8 *L0 $$0 #0 +M C2 8( ,A( @ (_@ JR (1 - "3H !S0 \$@ +M" EN 1D !( )@@ JS @1 - "=H *M0 $ +M$0 #0 GV "K8 A$ T *%@ JW 01 - "E( *N +M !$0 #0 J* "KD !!$ T *R@ JZ 01 - "P( +M*NP $$0 #0 M> 38 !!$ @ +D@ $U 2 ( " +M[( *O $$0 #0 ON "KT !!$ T ,3@ J^ @1 - +M #)H !% $@ S" "L !!$ T -%@ K! 01 +M - #3( *<@ $0#_\0 V* "L( !!$ T -Y@ K# +M 01 - #BH *< $$0 "@ YR "L0 &!$ T .F@ K +M* !@1 - #L( *T "$0 #0 [V "M$ !!$ T /- +M@ K2 01 - #XX !W \$@ " _& 8Z ,A( @ +M 0#@ IY 1 /_Q $#( *TP ($0 #0 !!J "M4 !!$ +M T 0J@ &T #(2 ( $/8 *U@ $$0 #0 !%. "M< +M"!$ T 1@@ $$ 2 & $9H *V0 !$0 #0 !&V "MH +M !!$ T 1U@ %0 #(2 ( $BH *W "0$0 #0 !)& +M 6D ,A( @ 2E@ L 01 - $KX + @ ($0 #0 +M!+B 9L ,A( @ 3,@ L$ @1 - &TV.&LN96QF &-R=#$N +M&ET &5N=FER;VX =E]L;VYG7V9U;F, =E]U;G-I9VYE9%]L;VYG7V9U;F, +M=E]S:6=N961?0!V7W5N0!?7V9P 2& ;0 ! #$ !@ 2 & +MV@ X=E]S:6=N961?;&]N9U]F=6YC !5 L!$8 !M !(8 !P( $ +M,P & !( <1 #AV7W5NN (, !0$ ?J %0 % !( >: +M (, !0$ ?J $ % !( >J %4 !P 0 \ $ $@ !^H E0 +M *, * " ( $ @ @@ <@ "X +M 9 !, $@ "'L .&QI;FL +8 "8 )@ - !( @I #AN97AT "# +M 4! 'Z@ C 8$ < J T $@ "%, .&QI;FMF=6YC "# 4! +M '< C 8$ ! < D T $@ "'< .'-T=69F !R 'K@ C 8$ +M " < $ %0 5 !( BY (, !0$ ?J %0 % !( BE (, +M!0$ ?J $ % !( BU %4 !P 0 \ $ $@ "/4 E0 *, +M* " ( $ @ @@ <@ "X < +M !< $@ "8D .'1U7VQI;FL +8 "0 )@ - !( DW #AN97AT "# +M 4! 'Z@ C 8$ < J T $@ "6$ .&QI;FMF=6YC "# 4! +M (>P C 8$ < D T $@ "84 .'-T=69F !R (N0 C 8$ +M < $ .@ $ !( G' #A^,F9A:V4 +8 $ /, &P )B +M;'5E %G65L;&]W +M 0 R 0 $@ "C\ .'XS9F%K90 M@ 0 \P 3 69O0 <@ "8D (P % X *HP +M D < $@ #$8 .'5?;&EN:P <@ "/4 (P % X *W G < $@ +M#&T .'-?;&EN:P @P % 0 !^H (P % X *P0 F < $@ #), .'9? +M=6YI;VXR !R #BP C 4#@ L" "4 !P 2 ,N X=E]U;FEO;@ +M<@ FP (P % X +! G < $@ #-\ .'9?0 +M<@ #[\ (P % X *I D $ $@ $#, E0 *, $ " ! +M" !5 X K < $@ $%X .'9?9FQO871?87)R87D '( ! / ", !0. +M "M, ) ! !( !"" )4 "C ! @ 0@ 50 , ,P ' +M !( !"U #AV7W5N ", !0. "K, +M ) ! !( !#9 )4 "C ! @ 0@ 50 + ,0 ' !( +M !$* #AV7W-I9VYE9%]L;VYG7V%R0 <@ $@( (P % +M X *H0 D $ $@ $G, E0 *, $ " !" !5 8 T +M < $@ $J< .'9?=6YS:6=N961?0 <@ $J< (P % X *K0 +M D $ $@ $R$ E0 *, $ " !" !5 0 K < $@ +M$TP .'9?O__ ,@ 'O__P &0 !]__\ "6 ?O__ R '__ +M_P /H "!__\ $L @O__ !7@ (/__P 9 "%__\ '" +M AO__ !] (?__P B8 ")__\ )8 BO__ "E ++_ +M_P M "U__\ +F MO__ "[ +?__P O0 "Y__\ +\ +M NO__ #! +O__P PP "]__\ ,4 OO__ #'@ +__ +M_P R@ #!__\ ,R PO__ #/ ,/__P T8 #%__\ -0 +M QO__ #6@ ,G__P VX #*__\ -X R___ #@@ ,W_ +M_P XP #.__\ .6 S___ #H -'__P ZH #2__\ .T +M T___ #O@ -7__P \@ #6__\ /2 U___ #W -G_ +M_P ^8 #:__\ /P W/__ $! -W__P ! X #>__\ 08 +M X/__ $(@ .'__P !"P #B__\ 0V Y/__ $0 .7_ +M_P !$H #F__\ 14 Z/__ $7@ .G__P !&@ #J__\ 1R +M [/__ $? .W__P !(8 #O__\ 20 \/__ $F@ /'_ +M_P !*0 #R__\ 2N ]/__ $N /;__P !,( #W__\ 3, +M /__ $X +M $ ! H -0 #4 $P 0 +M ) !0 * #H Z ;P # 0 $ +M#P L "@ "I J0 # ! $ $ $ !< # +M H V0 -D >P 0 ? ! * +M /@ #X # # !P 0 , *0 $ &@ $$ +M!! $ $ "\ ! !H !!0 04 +M9 ! !0 T 0 : 1X $> !40 +M 0 .@ $ &@ )O ";P $ +M $ $ ! X *< G " ! +M !& 0 . "G( )R !P 0 $ +M2P 8 #@ IY ">0 !P ! $ " %0 ( +M X *E@ I8 !P " !9 @ +M *6 !P / ' 0 0 80 , +M$5@ 34 ! &D # !8L +M ! !P P 6+ ) +M $ >@ $ %KP #/ +M $ (, ! !>, 6< ! +J "* 0 M_ I0 0 + +end diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp new file mode 100644 index 00000000000..ba59ed1db95 --- /dev/null +++ b/gdb/testsuite/gdb.base/maint.exp @@ -0,0 +1,578 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# this file tests maintenance commands and help on those. + +# source file used is break.c + + +#maintenance check-symtabs -- Check consistency of psymtabs and symtabs +#maintenance space -- Set the display of space usage +#maintenance time -- Set the display of time usage +#maintenance demangle -- Demangle a C++ mangled name +#maintenance dump-me -- Get fatal error; make debugger dump its core +#maintenance print -- Maintenance command for printing GDB internal state +#maintenance info -- Commands for showing internal info about the program being debugged +# +#maintenance print statistics -- Print statistics about internal gdb state +#maintenance print objfiles -- Print dump of current object file definitions +#maintenance print psymbols -- Print dump of current partial symbol definitions +#maintenance print msymbols -- Print dump of current minimal symbol definitions +#maintenance print symbols -- Print dump of current symbol definitions +#maintenance print type -- Print a type chain for a given symbol +#maintenance print unwind -- Print unwind table entry at given address +# +# +#maintenance info sections -- List the BFD sections of the exec and core files +#maintenance info breakpoints -- Status of all breakpoints +# + + + +if $tracelevel then { + strace $tracelevel + } + +global usestubs + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "break" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" + } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + perror "tests suppressed" +} + + +# The commands we test here produce many lines of output; disable "press +# to continue" prompts. +send_gdb "set height 0\n" +gdb_expect -re "$gdb_prompt $" + +# use a larger expect input buffer for long help outputs. +match_max 6000 + +# +# this command does not produce any output +# unless there is some problem with the symtabs and psymtabs +# so that branch will really never be covered in this tests here!! +# + +send_gdb "maint check-symtabs\n" +gdb_expect { + -re "^maint check-symtabs.*$gdb_prompt $"\ + { pass "maint check-symtabs" } + -re ".*$gdb_prompt $" { fail "maint check-symtabs" } + timeout { fail "(timeout) maint check-symtabs" } + } + +send_gdb "maint space\n" +gdb_expect { + -re "\"maintenance space\" takes a numeric argument\\..*$gdb_prompt $"\ + { pass "maint space" } + -re ".*$gdb_prompt $" { fail "maint space" } + timeout { fail "(timeout) maint space" } + } + +send_gdb "maint space 1\n" +gdb_expect { + -re "Space used: $decimal \\(\\+$decimal for this command\\).*$gdb_prompt $"\ + { pass "maint space 1" } + -re ".*$gdb_prompt $" { fail "maint space 1" } + timeout { fail "(timeout) maint space 1" } + } + + +send_gdb "maint time\n" +gdb_expect { + -re "\"maintenance time\" takes a numeric argument\\..*Space used: $decimal \\(\\+$decimal for this command\\).*$gdb_prompt $"\ + { pass "maint time" } + -re ".*$gdb_prompt $" { fail "maint time" } + timeout { fail "(timeout) maint time" } + } + +send_gdb "maint time 1\n" +gdb_expect { + -re "Command execution time: $decimal.*Space used: $decimal \\(\\+$decimal for this command\\).*$gdb_prompt $"\ + { pass "maint time 1" } + -re ".*$gdb_prompt $" { fail "maint time 1" } + timeout { fail "(timeout) maint time 1" } + } + +send_gdb "maint time 0\n" +gdb_expect { + -re "Space used: $decimal \\(\\+$decimal for this command\\).*$gdb_prompt $"\ + { pass "maint time 0" } + -re ".*$gdb_prompt $" { fail "maint time 0" } + timeout { fail "(timeout) maint time 0" } + } + + +send_gdb "maint space 0\n" +gdb_expect { + -re "maint space 0\r\n$gdb_prompt $"\ + { pass "maint space 0" } + -re ".*$gdb_prompt $" { fail "maint space 0" } + timeout { fail "(timeout) maint space 0" } + } + +send_gdb "maint demangle\n" +gdb_expect { + -re "\"maintenance demangle\" takes an argument to demangle\\..*$gdb_prompt $"\ + { pass "maint demangle" } + -re ".*$gdb_prompt $" { fail "maint demangle" } + timeout { fail "(timeout) maint demangle" } + } + +send_gdb "maint demangle main\n" +gdb_expect { + -re "Can't demangle \"main\".*$gdb_prompt $"\ + { pass "maint demangle" } + -re ".*$gdb_prompt $" { fail "maint demangle" } + timeout { fail "(timeout) maint demangle" } + } + + +send_gdb "maint print statistics\n" +gdb_expect { + -re "Statistics for.*break.*Number of \"minimal\" symbols read.*Number of \"partial\" symbols read.*Number of \"types\" defined.*Total memory used for psymbol obstack.*Total memory used for psymbol cache.*Total memory used for symbol obstack.*Total memory used for type obstack.*$gdb_prompt $"\ + { pass "maint print statistics" } + -re ".*$gdb_prompt $" { fail "maint print statistics" } + timeout { fail "(timeout) maint print statistics" } + } + +send_gdb "maint print objfiles\n" +# To avoid timeouts, we avoid expects with many .* patterns that match +# many lines. +gdb_expect { + -re ".*Object file.*break: Objfile at $hex, bfd at $hex, \[0-9\]* minsyms\[\r\t \]+\n" + { pass "maint print objfiles: header" } + -re ".*$gdb_prompt $" { fail "maint print objfiles: header" } + timeout { fail "(timeout) maint print objfiles: header" } +} +gdb_expect { + -re ".*Psymtabs:\[\r\t \]+\n" { pass "maint print objfiles: psymtabs" } + -re ".*$gdb_prompt $" { fail "maint print objfiles: psymtabs" } + timeout { fail "(timeout) maint print objfiles: psymtabs" } +} +gdb_expect { + -re ".*Symtabs:\[\r\t \]+\n" { pass "maint print objfiles: symtabs" } + -re ".*$gdb_prompt $" { fail "maint print objfiles: symtabs" } + timeout { fail "(timeout) maint print objfiles: symtabs" } +} +gdb_expect { + -re ".*$gdb_prompt $" { pass "maint print objfiles: prompt" } + timeout { fail "(timeout) maint print objfiles: prompt" } +} + +send_gdb "maint print psymbols\n" +gdb_expect { + -re "print-psymbols takes an output file name and optional symbol file name.*$gdb_prompt $"\ + { pass "maint print psymbols w/o args" } + -re ".*$gdb_prompt $" { fail "maint print psymbols w/o args" } + timeout { fail "(timeout) maint print psymbols w/o args" } + } + +send_gdb "maint print psymbols psymbols_output\n" +gdb_expect { + -re "^maint print psymbols psymbols_output\r\n$gdb_prompt $"\ + { + send_gdb "shell ls psymbols_output\n" + gdb_expect { + -re "psymbols_output\r\n$gdb_prompt $"\ + { + # We want this grep to be as specific as possible, + # so it's less likely to match symbol file names in + # psymbols_output. Yes, this actually happened; + # poor expect got tons of output, and timed out + # trying to match it. --- Jim Blandy + send_gdb "shell grep 'main.*function' psymbols_output\n" + gdb_expect { + -re ".main., function, $hex.*$gdb_prompt $"\ + { pass "maint print psymbols" } + -re ".*$gdb_prompt $" { fail "maint print psymbols" } + timeout { fail "(timeout) maint print psymbols" } + } + gdb_test "shell rm -f psymbols_output" "" + + } + -re ".*$gdb_prompt $" { fail "maint print psymbols" } + timeout { fail "(timeout) maint print psymbols" } + } + } + -re ".*$gdb_prompt $" { fail "maint print psymbols" } + timeout { fail "(timeout) maint print psymbols" } + } + + +send_gdb "maint print msymbols\n" +gdb_expect { + -re "print-msymbols takes an output file name and optional symbol file name.*$gdb_prompt $"\ + { pass "maint print msymbols w/o args" } + -re ".*$gdb_prompt $" { fail "maint print msymbols w/o args" } + timeout { fail "(timeout) maint print msymbols w/o args" } + } + +send_gdb "maint print msymbols msymbols_output\n" +gdb_expect { + -re "^maint print msymbols msymbols_output\r\n$gdb_prompt $"\ + { + send_gdb "shell ls msymbols_output\n" + gdb_expect { + -re "msymbols_output\r\n$gdb_prompt $"\ + { + send_gdb "shell grep factorial msymbols_output\n" + gdb_expect { + -re "\\\[ *$decimal\\\] T\[ \t\]+$hex factorial.*$gdb_prompt $"\ + { pass "maint print msymbols" } + -re ".*$gdb_prompt $" { fail "maint print msymbols" } + timeout { fail "(timeout) maint print msymbols" } + } + gdb_test "shell rm -f msymbols_output" "" + + } + -re ".*$gdb_prompt $" { fail "maint print msymbols" } + timeout { fail "(timeout) maint print msymbols" } + } + } + -re ".*$gdb_prompt $" { fail "maint print msymbols" } + timeout { fail "(timeout) maint print msymbols" } + } + + +send_gdb "maint print symbols\n" +gdb_expect { + -re "Arguments missing: an output file name and an optional symbol file name.*$gdb_prompt $"\ + { pass "maint print symbols w/o args" } + -re ".*$gdb_prompt $" { fail "maint print symbols w/o args" } + timeout { fail "(timeout) maint print symbols w/o args" } + } + +send_gdb "maint print symbols symbols_output\n" +gdb_expect { + -re "^maint print symbols symbols_output\r\n$gdb_prompt $"\ + { + send_gdb "shell ls symbols_output\n" + gdb_expect { + -re "symbols_output\r\n$gdb_prompt $"\ + { + # See comments for `maint print psymbols'. + send_gdb "shell grep 'main.*block' symbols_output\n" + gdb_expect { + -re "int main\\(int, char \\*\\*, char \\*\\*\\); block.*$gdb_prompt $"\ + { pass "maint print symbols" } + -re ".*$gdb_prompt $" { fail "maint print symbols" } + timeout { fail "(timeout) maint print symbols" } + } + gdb_test "shell rm -f symbols_output" "" + + } + -re ".*$gdb_prompt $" { fail "maint print symbols" } + timeout { fail "(timeout) maint print symbols" } + } + } + -re ".*$gdb_prompt $" { fail "maint print symbols" } + timeout { fail "(timeout) maint print symbols" } + } + + +send_gdb "maint print type argc\n" +gdb_expect { + -re "type node $hex\r\nname .int. \\($hex\\)\r\ncode $hex \\(TYPE_CODE_INT\\)\r\nlength 4\r\nobjfile $hex\r\ntarget_type $hex\r\npointer_type $hex\r\nreference_type $hex\r\nflags $hex\r\nnfields 0 $hex\r\nvptr_basetype $hex\r\nvptr_fieldno -1\r\ntype_specific $hex\r\n$gdb_prompt $"\ + { pass "maint print type" } + -re ".*$gdb_prompt $" { fail "maint print type" } + timeout { fail "(timeout) maint print type" } + } + +#send_gdb "maint print unwind &main\n" +#gdb_expect { +# -re ".*unwind_table_entry \\($hex\\):\r\n\tregion_start = $hex

\r\n\tregion_end = $hex \r\n\tflags = Args_stored Save_RP\r\n\tRegion_description = $hex\r\n\tEntry_FR = $hex\r\n\tEntry_GR = $hex\r\n\tTotal_frame_size = $hex\r\n$gdb_prompt $"\ +# { pass "maint print unwind" } +# -re ".*$gdb_prompt $" { fail "maint print unwind" } +# timeout { fail "(timeout) maint print unwind" } +# } + +set oldtimeout $timeout +set timeout [expr $timeout + 300] + +# It'd be nice to check for every possible section. However, that's +# problematic, since the relative ordering wanders from release to +# release of the compilers. Instead, we'll just check for two +# sections which appear to always come out in the same relative +# order. (If that changes, then we should just check for one +# section.) +# +# And by the way: This testpoint will break for PA64, where a.out's +# are ELF files. +# +send_gdb "maint info sections\n" +gdb_expect { + -re "Exec file:\r\n.*break., file type.*$gdb_prompt $"\ + { pass "maint info sections" } + -re ".*$gdb_prompt $" { fail "maint info sections" } + timeout { fail "(timeout) maint info sections" } + } + +send_gdb "maint info breakpoints\n" +gdb_expect { + -re "Num\[ \t\]+Type\[ \t\]+Disp\[ \t\]+Enb\[ \t\]+Address\[ \t\]+What\r\n1\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+$hex in main at.*break.c:60\r\n\[ \t\]+breakpoint already hit 1 time\r\n.*$gdb_prompt $"\ + { pass "maint info breakpoints" } + -re ".*$gdb_prompt $" { fail "maint info breakpoints" } + timeout { fail "(timeout) maint info breakpoints" } +} + +# Try it again, and check for shlib event info. Not supported everywhere. +if {! [istarget "hppa*-*-hpux*"]} then { + setup_xfail "*-*-*" +} +send_gdb "maint info breakpoints\n" +gdb_expect { + -re "Num\[ \t\]+Type\[ \t\]+Disp\[ \t\]+Enb\[ \t\]+Address\[ \t\]+What\r\n1\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+$hex in main at.*break.c:60\r\n\[ \t\]+breakpoint already hit 1 time\r\n-1\[ \t\]+shlib events\[ \t\]+keep\[ \t\]+y\[ \t\]+$hex.*breakpoint already hit.*$gdb_prompt $"\ + { pass "maint info breakpoints: shlib events" } + -re ".*$gdb_prompt $" { + fail "maint info breakpoints: shlib events" + } + timeout { + fail "(timeout) maint info breakpoints: shlib events" + } +} + + +send_gdb "maint print\n" +gdb_expect { + -re "\"maintenance print\" must be followed by the name of a print command\\.\r\nList.*unambiguous\\..*$gdb_prompt $"\ + { pass "maint print w/o args" } + -re ".*$gdb_prompt $" { fail "maint print w/o args" } + timeout { fail "(timeout) maint print w/o args" } + } + +send_gdb "maint info\n" +gdb_expect { + -re "\"maintenance info\" must be followed by the name of an info command\\.\r\nList.*unambiguous\\..*$gdb_prompt $"\ + { pass "maint info w/o args" } + -re ".*$gdb_prompt $" { fail "maint info w/o args" } + timeout { fail "(timeout) maint info w/o args" } + } + +send_gdb "maint\n" +gdb_expect { + -re "\"maintenance\" must be followed by the name of a maintenance command\\.\r\nList.*unambiguous\\..*$gdb_prompt $"\ + { pass "maint w/o args" } + -re ".*$gdb_prompt $" { fail "maint w/o args" } + timeout { fail "(timeout) maint w/o args" } + } + + +set timeout $oldtimeout + +#============test help on maint commands + +send_gdb "help maint\n" +gdb_expect { + -re "Commands for use by GDB maintainers\\..*Includes commands to dump specific internal GDB structures in.*a human readable form, to cause GDB to deliberately dump core,.*to test internal functions such as the C.. demangler, etc\\..*List of maintenance subcommands:.*maintenance check-symtabs.*maintenance demangle.*maintenance dump-me.*maintenance info.*maintenance print.*maintenance space.*maintenance time.*Type.*help maintenance.*followed by maintenance subcommand name for full documentation\\..*Command name abbreviations are allowed if unambiguous\\..*$gdb_prompt $"\ + { pass "help maint" } + -re ".*$gdb_prompt $" { fail "help maint" } + timeout { fail "(timeout) help maint" } + } + + +send_gdb "help maint check-symtabs\n" +gdb_expect { + -re "Check consistency of psymtabs and symtabs\\..*$gdb_prompt $"\ + { pass "help maint check-symtabs" } + -re ".*$gdb_prompt $" { fail "help maint check-symtabs" } + timeout { fail "(timeout) help maint check-symtabs" } + } + +send_gdb "help maint space\n" +gdb_expect { + -re "Set the display of space usage\\.\r\nIf nonzero, will cause the execution space for each command to be\r\ndisplayed, following the command's output\\..*$gdb_prompt $"\ + { pass "help maint space" } + -re ".*$gdb_prompt $" { fail "help maint space" } + timeout { fail "(timeout) help maint space" } + } + +send_gdb "help maint time\n" +gdb_expect { + -re "Set the display of time usage\\.\r\nIf nonzero, will cause the execution time for each command to be\r\ndisplayed, following the command's output\\..*$gdb_prompt $"\ + { pass "help maint time" } + -re ".*$gdb_prompt $" { fail "help maint time" } + timeout { fail "(timeout) help maint time" } + } + +send_gdb "help maint demangle\n" +gdb_expect { + -re "Demangle a C\\+\\+ mangled name\\.\r\nCall internal GDB demangler routine to demangle a C\\+\\+ link name\r\nand prints the result\\..*$gdb_prompt $"\ + { pass "help maint demangle" } + -re ".*$gdb_prompt $" { fail "help maint demangle" } + timeout { fail "(timeout) help maint demangle" } + } + +send_gdb "help maint dump-me\n" +gdb_expect { + -re "Get fatal error; make debugger dump its core\\.\r\nGDB sets it's handling of SIGQUIT back to SIG_DFL and then sends\r\nitself a SIGQUIT signal\\..*$gdb_prompt $"\ + { pass "help maint dump-me" } + -re ".*$gdb_prompt $" { fail "help maint dump-me" } + timeout { fail "(timeout) help maint dump-me" } + } + +send_gdb "help maint print statistics\n" +gdb_expect { + -re "Print statistics about internal gdb state\\..*$gdb_prompt $"\ + { pass "help maint print statistics" } + -re ".*$gdb_prompt $" { fail "help maint print statistics" } + timeout { fail "(timeout) help maint print statistics" } + } + +send_gdb "help maint print objfiles\n" +gdb_expect { + -re "Print dump of current object file definitions\\..*$gdb_prompt $"\ + { pass "help maint print objfiles" } + -re ".*$gdb_prompt $" { fail "help maint print objfiles" } + timeout { fail "(timeout) help maint print objfiles" } + } + +send_gdb "help maint print psymbols\n" +gdb_expect { + -re "Print dump of current partial symbol definitions\\.\r\nEntries in the partial symbol table are dumped to file OUTFILE\\.\r\nIf a SOURCE file is specified, dump only that file's partial symbols\\..*$gdb_prompt $"\ + { pass "help maint print psymbols" } + -re ".*$gdb_prompt $" { fail "help maint print psymbols" } + timeout { fail "(timeout) help maint print psymbols" } + } + +send_gdb "help maint print msymbols\n" +gdb_expect { + -re "Print dump of current minimal symbol definitions\\.\r\nEntries in the minimal symbol table are dumped to file OUTFILE\\.\r\nIf a SOURCE file is specified, dump only that file's minimal symbols\\..*$gdb_prompt $"\ + { pass "help maint print msymbols" } + -re ".*$gdb_prompt $" { fail "help maint print msymbols" } + timeout { fail "(timeout) help maint print msymbols" } + } + +send_gdb "help maint print symbols\n" +gdb_expect { + -re "Print dump of current symbol definitions\\.\r\nEntries in the full symbol table are dumped to file OUTFILE\\.\r\nIf a SOURCE file is specified, dump only that file's symbols\\..*$gdb_prompt $"\ + { pass "help maint print symbols" } + -re ".*$gdb_prompt $" { fail "help maint print symbols" } + timeout { fail "(timeout) help maint print symbols" } + } + + +send_gdb "help maint print type\n" +gdb_expect { + -re "Print a type chain for a given symbol\\.\r\nFor each node in a type chain, print the raw data for each member of\r\nthe type structure, and the interpretation of the data\\..*$gdb_prompt $"\ + { pass "help maint print type" } + -re ".*$gdb_prompt $" { fail "help maint print type" } + timeout { fail "(timeout) help maint print type" } + } + +#send_gdb "help maint print unwind\n" +#gdb_expect { +# -re "Print unwind table entry at given address\\..*$gdb_prompt $"\ +# { pass "help maint print unwind" } +# -re ".*$gdb_prompt $" { fail "help maint print unwind" } +# timeout { fail "(timeout) help maint print unwind" } +# } + +send_gdb "help maint info sections\n" +gdb_expect { + -re "List the BFD sections of the exec and core files\\..*$gdb_prompt $"\ + { pass "help maint info sections" } + -re ".*$gdb_prompt $" { fail "help maint info sections" } + timeout { fail "(timeout) help maint info sections" } + } + + +send_gdb "help maint info breakpoints\n" +gdb_expect { +-re "Status of all breakpoints, or breakpoint number NUMBER.*$gdb_prompt $" { pass "help maint info breakpoints" } + -re ".*$gdb_prompt $" { fail "help maint info breakpoints" } + timeout { fail "(timeout) help maint info breakpoints" } + } + +#send_gdb "help maint info breakpoints\n" +#expect { +# -re "Status of all breakpoints, or breakpoint number NUMBER\\.\[ \r\n\t\]+The \"Type\" column indicates one of:\[ \r\n\t\]+breakpoint\[ \t\]+- normal breakpoint\[ \r\n\t\]+watchpoint\[ \t\]+- watchpoint\[ \r\n\t\]+longjmp\[ \t\]+- internal breakpoint used to step through longjmp\\(\\)\[ \r\n\t\]+longjmp resume - internal breakpoint at the target of longjmp\\(\\)\[ \r\n\t\]+until\[ \t\]+- internal breakpoint used by the \"until\" command\[ \r\n\t\]+finish\[ \t\]+- internal breakpoint used by the \"finish\" command\[ \r\n\t\]+The \"Disp\" column contains one of \"keep\", \"del\", or \"dis\" to indicate\[ \r\n\t\]+the disposition of the breakpoint after it gets hit\\. \"dis\" means that the\[ \r\n\t\]+breakpoint will be disabled\\. The \"Address\" and \"What\" columns indicate the\[ \r\n\t\]+address and file.line number respectively\\.\[ \r\n\t\]+Convenience variable \".*\" and default examine address for \"x\"\[ \r\n\t\]+are set to the address of the last breakpoint listed\\.\[ \r\n\t\]+Convenience variable \".bpnum\" contains the number of the last\[ \r\n\t\]+breakpoint set\\..*$gdb_prompt $"\ +# { pass "help maint info breakpoints" } +# -re ".*$gdb_prompt $" { fail "help maint info breakpoints" } +# timeout { fail "(timeout) help maint info breakpoints" } +# } + +send_gdb "help maint info\n" +gdb_expect { + -re "Commands for showing internal info about the program being debugged.*unambiguous\\..*$gdb_prompt $"\ + { pass "help maint info" } + -re ".*$gdb_prompt $" { fail "help maint info" } + timeout { fail "(timeout) help maint info" } + } + +send_gdb "help maint print\n" +gdb_expect { + -re "Maintenance command for printing GDB internal state\\.\[\r\n\]+List of maintenance print subcommands:\[\r\n\]+maintenance print msymbols -- Print dump of current minimal symbol definitions.*maintenance print objfiles -- Print dump of current object file definitions.*maintenance print psymbols -- Print dump of current partial symbol definitions.*maintenance print statistics -- Print statistics about internal gdb state.*maintenance print symbols -- Print dump of current symbol definitions.*maintenance print type -- Print a type chain for a given symbol.*Type .help maintenance print. followed by maintenance print subcommand name for full documentation\\.\[\r\n\]+Command name abbreviations are allowed if unambiguous\\..*$gdb_prompt $"\ + { pass "help maint print" } + -re ".*$gdb_prompt $" { fail "help maint print" } + timeout { fail "(timeout) help maint print" } + } + +send_gdb "help maint\n" +gdb_expect { + -re "Commands for use by GDB maintainers\\.\[\r\n\]+Includes commands to dump specific internal GDB structures in\[\r\n\]+a human readable form, to cause GDB to deliberately dump core,\[\r\n\]+to test internal functions such as the C\\+\\+ demangler, etc\\..*Type.*help maintenance.*followed by maintenance subcommand name for full documentation\\.\[\r\n\]+Command name abbreviations are allowed if unambiguous\\..*$gdb_prompt $"\ + { pass "help maint" } + -re ".*$gdb_prompt $" { fail "help maint" } + timeout { fail "(timeout) help maint" } + } + +#set oldtimeout $timeout +#set timeout [expr $timeout + 300] + +send_gdb "maint dump-me\n" +gdb_expect { + -re "Should GDB dump core.*\\(y or n\\) $"\ + { send_gdb "n\n" + gdb_expect { + -re ".*$gdb_prompt $" { pass "maint dump-me" } + timeout { fail "(timeout) maint dump-me" } + } + } + -re ".*$gdb_prompt $" { fail "maint dump-me" } + timeout { fail "(timeout) maint dump-me" } + } + +#set timeout $oldtimeout + + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/mips-ecoff.u b/gdb/testsuite/gdb.base/mips-ecoff.u new file mode 100644 index 00000000000..69f656a1814 --- /dev/null +++ b/gdb/testsuite/gdb.base/mips-ecoff.u @@ -0,0 +1,671 @@ +begin 777 mips-ecoff +M 6 "2G<_%0 # 8 X OA(&0#! !9 ,$ %H @(8^$@9"/A8&4CX: , P0 .L +M#! !I ! ("$ - ^ " GO0 ( ^ " @^"$#X ( +M /@ @ ! A ^ " #X ( /@ @ ! A ^ " +M #X ( /@ @ ! A ^ " #X ( /@ @ ! A ^ +M" #X ( /@ @ ! A ^ " #X ( /@ @ ! A +M ^ " #X ( /@ @ ! A ^ " #X ( /@ @ +M ! A ^ " #X ( /@ @ ! A ^ " #X ( /@ +M @ ! A ^ " #X ( /@ @ ! A ^ " #X ( +M /@ @ ! A ^ " #X ( $2 #X ( /@ @ +M ^ " !$@ 1( ( /@ @ ^ " #X ( *. @) D +M#@ !HXZ D20/ *CCX"2)!@ Z>8@)0D&0 $IYF EB0( 6GB("8) D !J^) +M@)PD"@ 'KXJ H"0+ BOBX"D) P ":^,@*@D#0 *KXV K"0. NOCH"PQX2 +M( #GA("TQX> $,>&@!3GAX"XYX: O)./@) HX^ P).8@)$ +MHYB PI.9@)( HYF Q(>(@)0 IXB R(>)@)8 IXF S)>*@)@ +M IXJ T(^+@)P KXN V(^,@* KXR X(^-@*0 KXV Z(^. +M@*@ KXZ \(^/@*P KX^ ^(^8@+ KYB! ,>(@+0 YXB! +M",>+@+C'BH"\/ $0 .0K8_#D*F/T)YF D*^9@1 GB("1KXB!%">)@)*OB8$8 +M)XJ E*^*@1PGBX"6KXN!(">,@)BOC($D)XV G*^-@2@GCH"@KXZ!+">/@*2O +MCX$P)YB J*^8@30GF8"LKYF!.">(@+"OB($\)XF M*^)@4 GBH"XKXJ!1"0+ +M *OBX%<) P J^,@6 D#0 !KXV!:"0. &OCH%DCX^!6#P!$ "L+V,PAYB! +M2 "GF(%0 ^ " $"$#X ( #X ( +M)[W]4 " &"$D#O__K[\ '!1@ !&OK@ D/ 00 P0 ;0DA ($$$ !0! &"&0 +M3P !7@ @ DYB 0 3 # ! ", ! A)X. 1#P% +M$ "C@(! )*4"$">D C ,$ 'TKZ,"L(^C K GI (^#! !] !@*"$GI (P#! " +M( *"$$0 1 $ @(2>E "PD!@("#! "**^D "@D 0("%$$ "(^D "@\!! +M)(0 ">E "P,$ (P) 8" J^@ "2/I H#! "] "/H@ D (^_ !PG +MO0*P ^ " )[W_X*^_ !P,$ ,.KZ0 ( P0 R@ CZ0 ( P0 +M!4P C[\ '">] " #X ( ">]_^"/@H PK[$ +M&*^P !0 @(@AK[\ '!1 , 0( A$ %0 $"&/CH P (W/ +M$> #P $"&.!0 (@("$,$ '7)A !!! , 0!@A$ !@!@$"&. +M!0 !2@__<"(" A 0(8^_ !R/L 4C[$ & /@ @GO0 @D*( )"# +M DI0 !$$, !"0& #T0 ,) 8 /20& #T 8! A%$8 R2$ $#X ( * 0 +M(9"B "0@P )*4 1!#__@ 8! A%& " $"&0KO__ !3. 0 ! A +M ^ " "@$"$ ! A ^ " @! A@*@ #2- ,1 D :1P(H"I $ +MKG@@$2 'P " J@ " !% !J(K @*L YBL ,18 4J(P "&D +M__V!Z !(>\ !!$ !,@A $@>G__@ 1( . ('J__\ $4 +M"8GL__V!ZP F>P !5@__&LC ^ " #X (N(P Z"* *@B0 ! +M ^ "*"( "0" ^T ,$. P ($ 50 /@ @ +M ) (#ZP P0X # @0!5 ^ " 0P : ( X(1"D +M !@ A0@J%" ""C! ! IA @ (((*A @ 0HP0 0$ 6RC! ! HP0 0%" +M!0 PH@ #,(, Q!# L $, !P IA@A@*( "2E $DA ! +M%*/__*""__\#X ( . 0(1! !@D 0 !$$$ #R0! (000 ' ("B D +MI0 !)(0 23&__\0 .H(+__X2B DI0 ")(0 B3&__X0 (I(+__H"B +M "$HP !H(( "2E ,DA #),;__:2#__XHP0 @%" %BC! !",H@ C*, +M!(RH B,J0 ,C*H $(RK !2,K 8C*T '*R" "L@P $K(@ "*R) RLB@ 0 +MK(L %*R, !@DI0 @)(0 ("3&_^ 0 /_JK(W__"C! ! 4( .*,$ !(RB ", +MHP $C*@ "(RI RL@@ K(, !*R( @DI0 0)(0 $"3&__ 0 /_RK(G__"C! +M 04(/^U (RB DI0 $)(0 !"3&__P0 /_XK(+__"C! ! IB@@%" +M!0"&(" PH@ #,(, Q!# T $,#_K0 DI?__)(3__P"F&". H@ +M)*7__R2$__\4H__\H(( 0/@ @ X! A$$ &"0! ,000 /) $ A!! < +M @*+__R2E__\DA/__),;__Q Z@@@ A*+__B2E__XDA/_^),;__A +M BD@@ @*+__X2C__V@@O__)*7__22$__TDQO_]I(, "C! " 4( 6*,$ +M$(RB__R,H__XC*C_](RI__",JO_LC*O_Z(RL_^2,K?_@K(+__*R#__BLB/_T +MK(G_\*R*_^RLB__HK(S_Y"2E_^ DA/_@),;_X! _^JLC0 *,$ $!0@ XH +MP0 $C*+__(RC__B,J/_TC*G_\*R"__RL@__XK(C_]"2E__ DA/_P),;_\! +M__*LB0 *,$ !!0@_[, C*+__"2E__PDA/_\),;__! __BL@@ +M ) (#[@ P0X # @0!5 ^ " $"$0@ / +M) ( 8^#@& *&$ (! @ HD @ ! -P@#P!$ +@@A)&, :PD B"O +M@X!@ ^ " $"$D @ ! ^ " "/@X!@)[W_X*^_ !ROL0 8K[ %!A@ +M \D8O__/ \0 "7O B G" /!$0 "8Q B !SX ACA@ # /@) +M "80__P"$0@K$"#_^0 "/OP ]_]BOL 8 (" (:^_ !P6 #) /_ +M_Q "4D O__D@( # P3@"#$< %#!8 @P3P &) $ A7A 8 !@A +M#! #=@( ("$0 " $ 8(0 &"&2! -#! "]*^C "2/HP D!$$ @ D +M ___D@( # P6 ($P !@ ".! (#! &&J^C "2/HP DK@ "(X9 +M BB ,K@ !@$"&N&0 $C[\ '(^P !@#X ()[T *">]_^"OL 8 (" +M(18 !.OOP ] +M " GO?^PK[ '*^_ "ROLP H *" (:^R "2OL0 @KZ0 4)(# PD$0!")!( +M!B03 (P;@!2%BX )3!L !:2#P -/!D0 /P( #.,@ACSD"H(X" 0 +M %D(*Q @ $\ CZ@ 4"0! J@2 C@D ! E*@ !K@H !).K %, +M $6$ ! "/H@!0$ 8(^_ "P,$ 14 @ @(20!__\400 $CZ, 4! +M ,D ___CZ, 4 0 !4 & 0(3!L !863 4,'@ $H^M % GI0!,HZT +M3)($ VN #! &>"0& $D 0 !%$$ ! "/H@!0$ 18^_ "R2#@ , +M) +__S7/ " 0 _H@\ ##!X !(6> 0 (X" @ $$ # ". +M&0 $ !19 P C@@ 5 ( #!I $05( & 8(0P0 +M!)H" " A$ @! &"$ !@A$& P 0 D) +__Y(# P ,&H +M1!5 _Z]_^"OOP 4 ( X(8SC B0[P ,C.X +M! !@*"$Q^ !$K.4 !!, @!Q3 CD/D #3P)$ E*0*@ !E @ $)("$0 * +MK. )#J T\#! )8P"H *6( !;" AC(T !HQ CK.( (SB +M !$$ ! ! &"$0 " 8(0! &"&,C@ C.\ ! !S\ C P,(*A @ +M H KZ4 '*^F !@ X" A#! %-J^G ""/I0 ".LCP C(( $ +M00 $ $ 8(1 ( !@A $ 8(8RX ",F0 $ ,90",! P@J$" ! +M$"$,$ 4V $"&/OP 4)[T & /@ @ )[W_X*^_ !0 @"@AD*X +M#)"C TQSP $$> # !@,"$\&1 )SE@" &P, #&1 A -(@#P!$ *0@A +MK*( ""1( @0 TK"@"H"C! (0( 3 !3 8 / ,0 "1C$ "L +MHP ($ !0!@$"$\ Q )&- *RC @ 8! AD*L #3P!$ "V" "P((21* +M( 0 ?K"H"H*^E " D!" (#! %5*^F !R/I0 @CZ8 '!! RLH@ (D*T +M#)"Y V,KP (/ $0 #6N @ &4" H*X # H""$E^" $ #*PX J \"Q +MD*P #25K8 @ !DC 2L0(3P!$ #&B "T((:RB @D2@ (K"H"H(RN @ +MP" AK*X ! P0!HBOI0 @CZ4 (!! F/OP 4D*( # P3P $%> !(^_ +M !0T60! H+D #(^_ !0GO0 @ ^ " "0C@ -/ ,0 .>( ;Q@AC&," +MH(R8 0 '@0(P1! , ^ "*R# 2,F0 !9""H0( " +M *R" #X ( ) (#Z0 P#X ( #P!$ "L +M(@P8 ^ ""0"__\GO?^HK[8 +*^R !ROOP TK[< ,*^U "B/CH%PK[0 )*^S +M ""OL0 8 ("0(:^P !01P $ "P(8^%@800 +)Y6!<">"@70GE8%PKX*! +M?#1/ &OCX%P-K@ 0*@."&OF(%T $ H(:^'@7B/AX%X)!?__R04__X X(@A +M P(8XC & 0(3!9 $7( = B" (0!@@"&. @ )D0 !P $(((P +M2 !%0 #@ $(( "(#@AKX>!>!2P *N(@ B H(8XC &" (8X" +M ,$D 1$@__8 B00(0("""L4( # %$(*Q @ &H & 0 +M(0(@@"$ 5(@D A$(*Q0@_]L CXJ!? 2"@ # ! 2OA8&$ +M$C4 !23& &OA8&$$ :P $"$DQ@ !+,$ A0@_\P )D, !P #&(*O +MHP X *"((0 ("$,$ :@KX6!A(^+@7R/HP X)6P !!!, P 0( A)&8'_P & +M,L(P1 #$( $ &,T D#0 $ :08(P!@L"$ 0X A$ "@#6,"&/A8&$CXZ! +M? !Q7@C _ @P!X,",DQ@@ 8RP@ &,T "!L@A S (*Q @ 0\ 7__ +M$ 00 $"$\ 7__-"'@ 0#!""L4( - ,"8(3P$?_\TA. #! &H*^F $B/ +MI@!(%%< !#P!@ 0 S 0(3P!@ T(2 ,$P(0P0!J P" A%%< !0 +M ,$ :L @ @(1 "@ ! ACXB!? (32"$!-E C)4O__*T0 "N"P CXR! +M? ( *"$EC0 $$@T !3:B &-C@ #7/ &MCP CA@ "OF(%\ +MCYF!?! _W>O(@ $ X(0#P""L0( &-.D 8SH KXB!@*SC T +MZ0 !$+$ !*XI "OAX%X$ !*^%@80 X"@AKX6!A*^'@7@F(@ $C[\ -(^P +M !2/L0 8C[( '(^S ""/M DC[4 *(^V "R/MP P ^ "">] %@0@ - ( 0 +M(22"__RO@H%XC$X "0!__X!P7@DK$\ (Q9 "/F(%\ !<9 ( +MKX*!A /@ @ )[W_R*^P !@ @( A$@ .*^_ !R. O_\ #!. $1 +MP ( % 8(P( ("$,$ 8:KZ4 /(^E #R. O_\ !0&", QB#KZ, ) "@ +M("$,$ 54KZ4 /(^C "2/I0 \$$ !0! ("$04 # !2@ 0DIP #$ +M(0" $"$DIP # ] #@ "0" _L ,$. P ($ 50 +M /@ @ ) (#[ P0X # @0!5 ^ " "/@H&8 +M ^ " "OA(&8 ^ " " $"$ ">]_["OOP <#! &@*^D %"/ +MI !0KZ( )"0%5 @,$ :\)Z8 * 1! ] % #X ( #P#$ ",8PJ$) (# +M^0"#("$ ,%. !#P!$ 8! A ^ "*PD"H0($ 50 #P"$ ",0@J +M """"L0( " ! ("$D @/Y #!3@__0\ 1 K"0*A /@ @ +M ! A D @0> #!#@ , "! %4 #X ( +M #X ( +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M (" @(" @(" @*"@H*"@@(" @(" @(" @(" @(" @("!($! 0$! 0$! 0 +M$! 0$! 0A(2$A(2$A(2$A! 0$! 0$!"!@8&!@8$! 0$! 0$! 0$! 0$! 0$! +M 0$! 1 0$! 0$(*"@H*"@@(" @(" @(" @(" @(" @(" @("$! 0$" +M +M +M 0(#! 4&!P@) +M"@L,#0X/$!$2$Q05%A<8&1H;'!T>'R A(B,D)28G*"DJ*RPM+B\P,3(S-#4V +M-S@Y.CL\/3X_0&%B8V1E9F=H:6IK;&UN;W!Q'EZ6UQ=7E]@04)# +M1$5&1TA)2DM,34Y/4%%24U155E=865I[?'U^?P +M +M +M !#2%)#3$%34P O;&EB+V-H "$ #_____ +M !T 'P 'D !Y !@ E !@ +M _____P = !\ !Z >@ $ P *0 +M P /____\ '0 ? >P 'L " +M2 "T 2 #_____ !T 'P 'T !] +M P & Q & _____P = !\ +M !^ ?@ 0 !X -0 !X /____\ +M '0 ? ?P '\ % D #D D #_____ +M !T 'P ($ "! !@ *@ ] *@ +M_____P = !\ "" @@ < # 00 # +M /____\ '0 ? @P (, ( V +M $4 V #_____ !T 'P (4 "% +M"0 / !) / _____P = !\ "& +M A@ H $( 30 $( /____\ +M'0 ? AP (< + !( %$ !( #_____ +M !T 'P (D ") # 3P !5 3P ____ +M_P = !\ "* B@ T %< A0 %< +M /____\ '0 ? L@ /< . $ +M #_____ !T 'P ( " +M " ( #___UL_____P "L = !\ !? +M@P 0 " _____/____\ " '0 ? +M '0 "X $ @ , /____S_____ +M @ !T 'P !X F (P # (P _____P +M = !\ S .0 D 0 +M /____\ '0 ? 8@ )H $ +M #_____ !T 'P X 2 +M ! _____P = !\ . $@ +M 0 /____\ '0 ? +M* 2X $ #_____ +M !T 'P X 3 # _____P +M = !\ 7 ' !( !0 !* P _____/__ +M__\ " '0 ? (0 "4 $ $ @ $ +M /____S_____ @ !T 'P "H ] '@ # +M 'H ! #____T_____P * = !\ !. 90 X +M $X !0 $Z 0 _____/____\ " '0 ? <@ +M (D B "@ < "@@ \ /___]S_____ !0 !T +M'P )H "Z -0 !+ ) !+( #____T_____P +M ( = !\ #2 W@ %8 7( "P 7* _____/____\ +M !@ '0 ? Z@ /@ !K &U T &U@ /__ +M__3_____ @ !T 'P 0, $; > "#@ / " +M#@ _____P = !\ $I !, )4 +M 0 /____\ '0 ? #@ \ +M $ #_____ !T 'P +M !$ > & (#_ #____<_____P +M6 = !\ !D Q0 ,8 " ,< /____\ +M '0 ? S -L !. #6 H #7@ $ /___^3_ +M____ X !T 'P .8 $! 5 ! +M _____P = !\ . $@ +M 0 /____\ '0 ? #@ !( +M $ #_____ !T 'P !\ +M C P # P _____P = +M !\ J , $ 0 " ____S/____\ +M % '0 ? '@ "@ $ #_____ +M !T 'P !< ? # $ "P +M _____P = !\ E +P @ 0 +M /____\ '0 ? #@ !( +M 0 L( + # (K___ %0! < 8( " %0 &@@( " +M '0! B@8( & '0 @@( $ *0! C 8( * *0 P@ +M( & ,0! CP8( . ,0 @@( ( 0 @( 0 +M L( " 0 @( 0 L( " 0 @( +M 0 L( " 0 @( 0 L( "* 0@ !AI8 ) +M 2P E8 ( 60 ! E8 # : " E8 $ =0 $ E +M8 % @P & E8 & D@ ( E8 ' A8 ! H@ +M !AI8 1 IP E8 ( M0 ! E8 # Q " E8 $ +MT0 $ E8 % WP & E8 & [@ ( E8 ' A8 ) +M _@ AM8 9 !!@ E8 ( !% E8 # !(P E +M8 $ !, E8 % !/@ E8 & !30 E8 ' +M A8 1 !70 AM8 A !8@ E8 ( !< E8 # ! +M?P E8 $ !C E8 % !F@ E8 & !J0 E8 ' +M A8 9 !N0! E 8( "' <( D @@ +M( B !N0 !@@( A !Q0! F@8( ") <( H +M @@( F !Q0 !@@( E !V ! H 8( "+ <( L +M @@( J !V !@@( I ![0! I@8( "- <( P +M @@( N ![0 !@@( M !^@! K 8( "/ < +M( T @@( R !^@ !@@( Q "#@! L@8( "1 +M <( X @@( V "#@ !@@( U ") ! N 8( "3 +M <( \ @@( Z ") !@@( Y "+P! O@8( "5 +M <( ! @@( ^ "+P !@@( ] "00! Q 8 +M( "7 <( !$ @@( !" "00 !@@( !! "50! +M R@8( "9 <( !( @@( !& "50 !@@( !% " +M80! T 8( "; <( !, @@( !* "80 !@@( !) +M "= ! U@8( "= <( !0 @@( !. "= !@@ +M( !- "B0! W 8( "? <( !4 P@( !2 "B0 +M !P@( !1 "E@! XP8( "A <( !8 ! @( !6 " +ME@ " @( !5 "I )AI8 !> "J0 E8 "F "K@ " E8 "I +M "MP $ E8 "L A8 !9 "O0 )!M8 !C "Q0 E +M8 #$ "R@ E8 #' "TP E8 #* A8 !> "V0 +M 1Q8 !H "W@ E8 #B "X@ $E8 #C "Z (E8 #D +M A8 !C "[0 1Q8 !M "] E8 #K "^P $E8 #L +M # @ (E8 #M A8 !H #!P 1Q8 !Q ## E +M8 #T #$@ $E8 #U A8 !M #%P 1Q8 !U #' +M E8 #\ #( $E8 #] A8 !Q #* 1Q8 !Y # +M+0 E8 $$ #,P $E8 $% A8 !U #. I8 $& +M #0 1Q8 !^ #1@ E8 $, #3 $E8 $- A +M8 !Z #40 I8 $. #6@ 1Q8 "% #90 (E8 $4 #:0 +M $E8 $5 #;0 E8 $6 #<@ ,E8 $7 A8 !_ # +M> ! ZP8( $8 <( "( = @( "& #> > @( "% +M 0 @( 0 L( $ % ! !9 8( - % @@ +M( ! 0 @( 0 L( % "1 "L )K___ % ! +M!: 8( - % .P@( " 0 @( 0 L( $ +M#@! !I 8( - #@ #0@( ! 0 @( 0 L( & +M "@! !M 8( - "@ (P@( ! $0! !UPX( / $0 '0@ +M( # 0 @( 0 L( ) #@! !] 8( " %0! +M"!@4+___ (@! "& 4+___ *0! "&@4+___ , ! "&P4+___ +M-P! "' 4+___ #@ *@@( ! 0 @( 0 L( % +M #0! "( 8( " $P! ")@4+___ #0 " @( ! 0 @ +M( 0 L( " 0 @( 0 L( " 0 +M @( 0 L( % #0! "* 8( " $P! "+@4+___ +M#0 " @( ! 0 @( 0 L( 9 #0! ", 8( " +M % ! "/ 4+___ 'P! "0P4+___ ,0! "1@4+___ /P! "2P4 +M+___ 0P! "304+___ 40! "604+___ 7 ! "7P4+___ 9P! +M"9@4+___ < ! "9@4+___ ? ! "?04+___ B ! "C 4+___ +MDP! "E04+___ GP! "G04+___ L@! "H@4+___ P ! "J04+___ +M S@! "M04+___ V0! "NP4+___ Y ! "P@4+___ [@! "P@4 +M+___ ^P! "V04+___ !" ! "Z 4+___ #0 P0@( ! 0 +M @( 0 L( % #@! "] 8( " %0! "^@4+___ +M#@ " @( ! 0 @( 0 L( ( "A "N )K___ +M $Q B (3___ '@! "_ 8( - '@ $@@( # )0! ##@8 +M( / )0 &@@( % 0 @( 0 L( 2 "@! +M#* 8( - "@ '@@( ! $P! #1@8( / $P , @( # +M&@! #=@8( 1 &@ 4@@( % (0! #R 8( 3 (0 C @( ' +M *0! $5 8( 5 *0 1@@( ) ,@! $F@8( 7 ,@ 0P@ +M( + .@! $W08( 9 .@ 60@( - 0P! %-@8( ; 0P +M % @( / 0 @( 0 L( $ # ! %3 8( " +M# ! @( ! 0 @( 0 L( $ #@! %4 8( " +M #@ ! @( ! 0 @( 0 L( " 0 @ +M( 0 L( " 0 @( 0 L( - "A +M"_ )S___ $1 "_@)S___ &! "_P)S___ 'Q # )S___ +M)A # 0)S___ +P! %5 8( - +P Q@@( & -@! &&@8( / +M -@ $ @( ( .P! &*@8( 1 .P 1 @( * 0 @ +M( 0 L( % #@! &< 8( " %0! &=@4+___ #@ +M " @( ! 0 @( 0 L( % #@! &> 8( " +M%0! &?@4+___ #@ " @( ! 0 @( 0 L( & +M # ! &@ 8( - # P@( ! %0! &@P8( / %0 P@ +M( # 0 @( 0 L( $ "P! &B 8( - "P +M %0@( ! 0 @( 0 L( ( #0! &H 8( " +M#0 "@@( ! $P! &J@4+___ %P! &K 8( & ' ! &LP4+___ +M %P #@@( $ 0 @( 0 L( % #@! &O 8 +M( " %0! &P@4+___ #@ " @( ! 0 @( 0 +M L( " 0 @( _____P $ /____\ +M!@ #_____ @ _____P * & +M @ 0 & " H + P 4 ' "0 !H # +M # __ ! 0 @# # __ ! 0 +M @# # __ ! 0 @$ # __ ! +M 0 ! $ # __ ! 0 ! % # __ ! +M 0 ! & # __ ! 0 " & # __ ! +M 0 " ' # __ ! 0 " ( # __ ! +M 0 " ( # __ ! 0 " ) # __ +M! 0 " * # __ ! 0 " + # +M__ ! 0 $ # ! P 0 , $ $ ! ! 0 4 $ & +M ! !@ 0 < $ ( ! " 0 D $ * ! "P 0 P #__________PP +M #_\ ! P #__________PP #_\ ) T #_________ +M_PT #_\ 1 T #__________PT #_\ 9 "4# +M *0, M P #$$ -00 Y!0 #T& +M 008 !%!P $D( 30@ !1"0 +M %4* 60L , __________\, ! __ 60 , !(0__ +M60 , #,P__ 0 #_\ $ " P/_P 0 +M $ ) __ ! !( , ! __ 60 - +M __________\, ! __ 60 , !(0__ 60 , #,P__ 0 +M #_\ $ " P/_P 0 $ ) __ +M! !( - __ 7@ . __________\ +M . __ 8P . __________\ . +M __ : . __________\ X #_\ !M X +M #__________P #@ /_P '$ #@ /__________ +M . __ =0 . __________\ X #_\ !Z +M X #__________P ")!@ & +M @ 0 & " H + P 4 ' "0 !H +M #!@ & @ 0 & " H + P +M 4 ' "0 !H $!@ & @ 0 & +M" H + P 4 ' "0 !H #!@ & +M @ 0 & " H + P 4 ' "0 !H +M # P 0 4# ! _____P ( /____\ +M! #_____ 0 _____P 8 /____\ +M ! !@ ( $ !@ @ * "P , % +M !P D : !08 '&@ & @ 0 +M & " H + P 4 ' "0 !H #&@ +M 4& !P8 )!@ L& #08 / +M!@ !$& _____P # /____\ P +M !@ ( $ !@ @ * "P , % !P D +M : 8 " ! 8 ( "@ L # !0 +M < ) &@ & @ 0 & " H + +M P 4 ' "0 !H (&@ 0 H: #!H $ #_ +M____ 0 _____P $ & @ 0 +M & " H + P 4 ' "0 !H #!@ +M 4& 8 " ! 8 ( "@ L # +M!0 < ) &@ ,& _____P # /____\ +M !P #_____ 0 &-R=#%T97AT+G, 4U1!4E1& +M4DT 7U]S=&%R= !?;6]N8V]N=')O; !?;6-O=6YT %]S<')O8VUO;G-T87)T +M O8F%B82]C>7!R97-S+W5S7!R97-S+W5S6=I;G0O<&QA>2]F;F8O9V1B;64N8P W +M,#(S-#@S-CD -3,X-@!T7W-T0!F;W)D &-AF5R;P!T:')E90!M86EN !G96XO7,N +M

7,O7,O7W)E860N2YS &UE +M;6-P>0!G;V9O3, 8F%C:W=A'1F;@!? +M7V5X:71?9FYS &%T97AI= !?7V-A;&Q?97AI=&9N

&ET+G, 7V5X:70 &-R="]C97)R +M;W(N0!V7W-I9VYE9%]C:&%R +M7V%R0!V7W-H;W)T7V%R0!V7W-I9VYE9%]L;VYG7V%R0!V7V9L;V%T7V%R0!N;VYP@ "H +M 8 $ %H ! !4 %&8 )( J $ (@ $ 2_ +M ( +< % !I @ 9 $ %L ! !H +M %&8 +P % $ (@ $ 3? (0 +P " +M ! $ !\ %'8 $ ( +M@ $ 4 *0 +X " ! $ +M "0 %'8 $ (H $ 4I ( , +M % !K @ : $ %P ! "D %&8 +M ,$ % $ (P $ 5) !% ,4 9 !M ,8 +M ; $ %T ! "X %&8 ,8 "T $ +T $ 9= +M (@ -X % ">@ @ < $ %X ! #, +M %&8 7H % $ +\ $ 9_ - ., ( "@@ +M "P = ( %\ $0 #@ ! 8 7\ ( $ , +MH $ :S 3 .L 2 "K@ B( ? @ &- +M '0 #D ! 8 8< "; $ 5, $ ;_ $@ /T +M $ $T 0 G $ &J ! #H %&8 +M B( " $ 50 $ <1 %@ 0$ $ $U 0 +M H $ &N ! #\ #&8 B0 # $ 54 $ > (@ 1L % %^P @ +M M $ 'C ! $H %&8 IH % $ : $ ? +M (0 2 & & P 8 N ( 'G $0 $\ +M ! 8 I\ # $ :( $ ?A $P 28 $ &"0 +M !4 P $ 'X #P % ! 8 J( ) $ : +M@ $ ?T *0 2H ( &'@ !H Q ( (' +M " %$ %&8 JL 0 $ :\ $ @= (@ 3( +M % &. @ S $ (/ ! %8 %&8 +M KL %$$ ;$ $ @_ # 3< " +M %L !'8 $ ! +M @ ( 0 $ " @ ! 0 ( +M " P 0 % !@ < ( "0 ( " 0 +M $ * 0 ( + # H ! @ L , +M"@ $ " "P P - 0 ( + # X " +M @ $ ! #P $ " "P P 0 $0 !( +M ! @ L , $P $ " % !4 6 %P +M $ " "P P 8 0 ( + # !D : +M&P $ " "P P < 0 ( + # !T +M ! "K %K___ D0 JP!:___P 1$ ,$ 7/__\ +M &! #!0%S___ !\0 P8!<___P E $ !P!@@ +M ( +1 BH 4K___ P #$ 0!L<%L___P 4 Z $ % +MD!@@ $ & 2P! !: 8( " ! %@ 0 .L&" A0 < != +M $ &D!@@ $ 8@! B@8( $ &X 0 (P&" !@ +M !V $ "/!@@ @ $ A1 "Q %P ( ! (P0 L1!< " +M 0 ":$ +$@7 @ $ JA "Q0%P # ! +(0 L6!< +M P 0 #!$ +& 7 D $ TA "QP%P $ ! -@0 L@ +M!< ! 0 #E$ +) 7 H $ ]! "R@%P % ! /L0 +M LL!< !0 0 $)$ +, 7 L $ !&1 "S0%P & ! +M 2$0 LX!< !P 0 $J$ +0 7 T $ !-Q "T(%P 3 +M! 4L0 M$!< &0 0 %A$ +2 7 !\ $ !;Q "TP%P E +M ! 800 M0!< *P 0 &;$ +6 7 #$ $ !IQ "V % +MP W ! ;H0 MH!< /0 0 '/$ +< 7 $, $ !W! +M"W@%P !) ! ? 0 N !< 3P 0 (&$ +B 7 %4 $ " +M%! 8_ $8 !; ! B,0 N0!< 80 0 (R$ +E 7 &( $ +M "2! "Y@%P !C ! F 0 N 0 +M -,$ +R 7 'X $ #5! "] %P "$ ! UT 0 )0&" (0 +M 0 -I $ ":!@@ "4 $ #? ! H 8( I ! Y$ 0 *8&" +M+0 0 .> $ "L!@@ #$ $ #L@! L@8( U ! \@ 0 +@ +M&" .0 0 /3 $ "^!@@ #T $ #Y0! Q 8( !! ! _D +M0 ,H&" 10 0 0% $ #0!@@ $D $ $& ! U@8( !- ! +M!"T 0 -P&" 40 0 0Z $ #C!@@ %4 $ $2! "]@%P "^ +M! !$\0 &,P!& W 0 16$ +W 7 .4 $ $7A "^ %P #N +M ! !&D0 OD!< ]@ 0 1Q$ +Z 7 /X & $>Q $ +M3___ " !(( 0 ;0&" 0 D 2) $ 'T!@@ $ * $D ! +M"( 8( ! #0 !)8 0 B@&" 0 X 2< $ (P!@@ $ / $ +MHP! "] 8( ! !P !*H0 K0!:___P ! 2^ $ ,.!@@ 4 1 +M $S0! #* 8( ! $@ !-8 0!4P&" 0 !, 3< $ 50!@@ $ +M 0 $Y ! "_ 8( # % !.L0 *@!$___P !0 3V$ $- 1/ +M__\ 5 $^Q "P %K___ % !000 KP!:___P !0 4-$ 0 +M 1O__\ 4 %%! 0 $;___ % !1L0 & (!&___P !$ 4B +M $ -V!@@ 4 1 %*0! #1@8( # %@ !3 0!AH&" " !< +M 4U $ 9P!@@ $ 1 %/ ! $5 8( ) $0 !44 0 \@&" !P +M !@ 5- $ 9X!@@ $ 1 %5 ! $F@8( + $0 !5P 0!38&" +M#P !D 5E $ :#!@@ , 1 %<0! $W08( - %@ !7H 0!50 +M&" !@ !H 6! $ :(!@@ $ 5 %B1 #!P%S___ %0 !8\0 +M P@!<___P !4 66$ ,) 7/__\ 5 %G1 #"@%S___ %0 +M!:00 PL!<___P !4 6K$ ,, 7/__\ 5 %LA ##0%S___ +M%0 !;D0 PX!<___P !4 7 $ ,/ 7/__\ 5 %R! #$ %S___ +M %0 !<\0 Q$!<___P !4 74$ +! 6O__\ ; %YP! &H 8 +M( ! &P !>T 0!JP&" ! !8 7R $ 8J!@@ H 9 %^@! +M&@ 8( ! ' !@, 0!KP&" 0 !L 8*$ "G0!1O__\ ; & +I#A "H $3___ &P !A80 J$!$___P __\ 8>$ "G0!1O__\; + +end diff --git a/gdb/testsuite/gdb.base/mips_pro.c b/gdb/testsuite/gdb.base/mips_pro.c new file mode 100644 index 00000000000..d2d1884b9cd --- /dev/null +++ b/gdb/testsuite/gdb.base/mips_pro.c @@ -0,0 +1,35 @@ +/* Tests regarding examination of prologues. */ + +int +inner (z) + int z; +{ + return 2 * z; +} + +int +middle (x) + int x; +{ + if (x == 0) + return inner (5); + else + return inner (6); +} + +int +top (y) + int y; +{ + return middle (y + 1); +} + +int +main (argc, argv) +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + return top (-1) + top (1); +} diff --git a/gdb/testsuite/gdb.base/mips_pro.exp b/gdb/testsuite/gdb.base/mips_pro.exp new file mode 100644 index 00000000000..ea2461e5f04 --- /dev/null +++ b/gdb/testsuite/gdb.base/mips_pro.exp @@ -0,0 +1,62 @@ +# Copyright (C) 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile mips_pro +set srcfile ${srcdir}/$subdir/${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + + +# This test must be compiled with -O2 if using gcc. + +if {$gcc_compiled} then { + if { [gdb_compile "${srcfile}" "${binfile}" executable {debug additional_flags=-O2}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } +} else { + if { [gdb_compile "${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if [runto middle] then { + # PR 3016 + if {$gcc_compiled} then { + setup_xfail "hppa*-*-*" "mips*-sgi-irix4*" "mips64*-*-elf" + } + gdb_test "backtrace" "#0.*middle.*#1.*top.*#2.*main.*" +} +return 0 diff --git a/gdb/testsuite/gdb.base/miscexprs.c b/gdb/testsuite/gdb.base/miscexprs.c new file mode 100644 index 00000000000..cae23d8cf33 --- /dev/null +++ b/gdb/testsuite/gdb.base/miscexprs.c @@ -0,0 +1,165 @@ +void marker1 () +{ + +} +/* +static struct { + char c[100]; +} cbig; + + +static struct { + int i[800]; +} ibig; + + +static struct { + long l[900]; +} lbig; + +static struct { + float f[200]; +} fbig; + +static struct { + double d[300]; +} dbig; + +static struct { + short s[400]; +} sbig;*/ + +/*struct { + long l[900]; +} lbig;*/ + +int main() +{ + +struct { + char c[100]; +} cbig; + + +struct { + int i[800]; +} ibig; + + +struct { + long l[900]; +} lbig; + +struct { + float f[200]; +} fbig; + +struct { + double d[300]; +} dbig; + +struct { + short s[400]; +} sbig; + ibig.i[100] = 5; + cbig.c[100] = 'A'; + fbig.f[100] = 11.99999; + dbig.d[202] = 9.99999999; + sbig.s[90] = 255; + lbig.l[333] = 999999999; + + #ifdef usestubs + set_debug_traps(); + breakpoint(); + #endif + marker1(); + return 0; + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdb/testsuite/gdb.base/miscexprs.exp b/gdb/testsuite/gdb.base/miscexprs.exp new file mode 100644 index 00000000000..9ea278a570f --- /dev/null +++ b/gdb/testsuite/gdb.base/miscexprs.exp @@ -0,0 +1,283 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + + +# This file is part of the gdb testsuite +# file written by Elena Zannoni (ezannoni@cygnus.com) + +# +# tests for expressions with struct/array elements and mixed operator types +# with elementary types +# + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "miscexprs" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "break marker1\n" ; gdb_expect -re ".*$gdb_prompt $" + + send_gdb "cont\n" + gdb_expect { + -re "Break.* marker1 \\(\\) at .*:$decimal.*$gdb_prompt $" { + send_gdb "up\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "up from marker1" } + } + } + -re "$gdb_prompt $" { fail "continue to marker1" } + timeout { fail "(timeout) continue to marker1" } + } + +global hex + +send_gdb "print &ibig.i\[0\]\n" +gdb_expect { + -re ".\[0-9\]* = \\(int \\*\\) $hex.*$gdb_prompt $" { + pass "print value of &ibig.i\[0\]" + } + -re ".*$gdb_prompt $" { fail "print value of &ibig.i\[0\]" } + timeout { fail "(timeout) print value of &ibig.i\[0\]" } + } + +send_gdb "print &cbig.c\[0\]\n" +gdb_expect { + -re ".\[0-9\]* = $hex \"\".*$gdb_prompt $" { + pass "print value of &cbig.c\[0\]" + } + -re ".*$gdb_prompt $" { fail "print value of &cbig.c\[0\]" } + timeout { fail "(timeout) print value of &cbig.c\[0\]" } + } + +send_gdb "print &fbig.f\[0\]\n" +gdb_expect { + -re ".\[0-9\]* = \\(float \\*\\) $hex.*$gdb_prompt $" { + pass "print value of &fbig.f\[0\]" + } + -re ".*$gdb_prompt $" { fail "print value of &fbig.f\[0\]" } + timeout { fail "(timeout) print value of &fbig.f\[0\]" } + } + +send_gdb "print &dbig.d\[0\]\n" +gdb_expect { + -re ".\[0-9\]* = \\(double \\*\\) $hex.*$gdb_prompt $" { + pass "print value of &dbig.d\[0\]" + } + -re ".*$gdb_prompt $" { fail "print value of &dbig.d\[0\]" } + timeout { fail "(timeout) print value of &dbig.d\[0\]" } + } + +send_gdb "print &sbig.s\[0\]\n" +gdb_expect { + -re ".\[0-9\]* = \\(short int \\*\\) $hex.*$gdb_prompt $" { + pass "print value of &sbig.s\[0\]" + } + -re ".*$gdb_prompt $" { fail "print value of &sbig.s\[0\]" } + timeout { fail "(timeout) print value of &sbig.s\[0\]" } + } + +send_gdb "print &lbig.l\[0\]\n" +gdb_expect { + -re ".\[0-9\]* = \\(long int \\*\\) $hex.*$gdb_prompt $" { + pass "print value of &lbig.l\[0\]" + } + -re ".*$gdb_prompt $" { fail "print value of &lbig.l\[0\]" } + timeout { fail "(timeout) print value of &lbig.l\[0\]" } + } + + +send_gdb "print ibig.i\[100\] | 1\n" +gdb_expect { + -re ".\[0-9\]* = 5.*$gdb_prompt $" { + pass "print value of ibig.i\[100\] | 1" + } + -re ".*$gdb_prompt $" { fail "print value of ibig.i\[100\] | 1" } + timeout { fail "(timeout) print value of ibig.i\[100\] | 1" } + } + + +send_gdb "print sbig.s\[90\] & 127\n" +gdb_expect { + -re ".\[0-9\]* = 127.*$gdb_prompt $" { + pass "print value of sbig.s\[90\] & 127" + } + -re ".*$gdb_prompt $" { fail "print value of sbig.s\[90\] & 127" } + timeout { fail "(timeout) print value of sbig.s\[90\] & 127" } + } + +send_gdb "print !ibig.i\[100\]\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !ibig.i\[100\]" + } + -re ".*$gdb_prompt $" { fail "print value of !ibig.i\[100\]" } + timeout { fail "(timeout) print value of !ibig.i\[100\]" } + } + +send_gdb "print !sbig.s\[90\]\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !sbig.s\[90\]" + } + -re ".*$gdb_prompt $" { fail "print value of !sbig.s\[90\]" } + timeout { fail "(timeout) print value of !sbig.s\[90\]" } + } + + +send_gdb "print !fbig.f\[100\]\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !ibig.i\[100\]" + } + -re ".*$gdb_prompt $" { fail "print value of !ibig.i\[100\]" } + timeout { fail "(timeout) print value of !ibig.i\[100\]" } + } + +send_gdb "print !dbig.d\[202\]\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !ibig.i\[100\]" + } + -re ".*$gdb_prompt $" { fail "print value of !ibig.i\[100\]" } + timeout { fail "(timeout) print value of !ibig.i\[100\]" } + } + + + +send_gdb "print sbig.s\[90\] * 10\n" +gdb_expect { + -re ".\[0-9\]* = 2550.*$gdb_prompt $" { + pass "print value of !sbig.s\[90\] * 10" + } + -re ".*$gdb_prompt $" { fail "print value of !sbig.s\[90\] * 10" } + timeout { fail "(timeout) print value of !sbig.s\[90\] * 10" } + } + +send_gdb "print ibig.i\[100\] * sbig.s\[90\]\n" +gdb_expect { + -re ".\[0-9\]* = 1275.*$gdb_prompt $" { + pass "print value of ibig.i\[100\] * sbig.s\[90\]" + } + -re ".*$gdb_prompt $" { fail "print value of ibig.i\[100\] * sbig.s\[90\]" } + timeout { fail "(timeout) print value of ibig.i\[100\] * sbig.s\[90\]" } + } + +send_gdb "print fbig.f\[100\] * dbig.d\[202\]\n" +gdb_expect { + -re ".\[0-9\]* = 119.99\[0-9\]*.*$gdb_prompt $" { + pass "print value of fbig.f\[100\] * dbig.d\[202\]" + } + -re ".*$gdb_prompt $" { fail "print value of fbig.f\[100\] * dbig.d\[202\]" } + timeout { fail "(timeout) print value of fbig.f\[100\] * dbig.d\[202\]" } + } + +send_gdb "print !(sbig.s\[90\] * 2)\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of !(sbig.s\[90\] * 2)" + } + -re ".*$gdb_prompt $" { fail "print value of !(sbig.s\[90\] * 2)" } + timeout { fail "(timeout) print value of !(sbig.s\[90\] * 2)" } + } + + +send_gdb "print sizeof(sbig)\n" +gdb_expect { + -re ".\[0-9\]* = 800.*$gdb_prompt $" { + pass "print value of sizeof(sbig)" + } + -re ".*$gdb_prompt $" { fail "print value of sizeof(sbig)" } + timeout { fail "(timeout) print value of sizeof(sbig)" } + } + + +send_gdb "print sizeof(cbig)\n" +gdb_expect { + -re ".\[0-9\]* = 100.*$gdb_prompt $" { + pass "print value of sizeof(cbig)" + } + -re ".*$gdb_prompt $" { fail "print value of sizeof(cbig)" } + timeout { fail "(timeout) print value of sizeof(cbig)" } + } + + +send_gdb "print sizeof(lbig)\n" +gdb_expect { + -re ".\[0-9\]* = 3600.*$gdb_prompt $" { + pass "print value of sizeof(lbig)" + } + -re ".*$gdb_prompt $" { fail "print value of sizeof(lbig)" } + timeout { fail "(timeout) print value of sizeof(lbig)" } + } + +send_gdb "print ibig.i\[100\] << 2\n" +gdb_expect { + -re ".\[0-9\]* = 20.*$gdb_prompt $" { + pass "print value of ibig.i\[100\] << 2" + } + -re ".*$gdb_prompt $" { fail "print value of ibig.i\[100\] << 2" } + timeout { fail "(timeout) print value of ibig.i\[100\] << 2" } + } + +send_gdb "print sbig.s\[90\] >> 4\n" +gdb_expect { + -re ".\[0-9\]* = 15.*$gdb_prompt $" { + pass "print value of sbig.s\[90\] >> 4" + } + -re ".*$gdb_prompt $" { fail "print value of sbig.s\[90\] >> 4" } + timeout { fail "(timeout) print value of sbig.s\[90\] >> 4" } + } + +send_gdb "print lbig.l\[333\] >> 6\n" +gdb_expect { + -re ".\[0-9\]* = 15624999.*$gdb_prompt $" { + pass "print value of lbig.l\[333\] >> 6" + } + -re ".*$gdb_prompt $" { fail "print value of lbig.l\[333\] >> 6" } + timeout { fail "(timeout) print value of lbig.l\[333\] >> 6" } + } diff --git a/gdb/testsuite/gdb.base/nodebug.c b/gdb/testsuite/gdb.base/nodebug.c new file mode 100644 index 00000000000..4aad099e563 --- /dev/null +++ b/gdb/testsuite/gdb.base/nodebug.c @@ -0,0 +1,58 @@ +/* Test that things still (sort of) work when compiled without -g. */ + +int dataglobal = 3; /* Should go in global data */ +static int datalocal = 4; /* Should go in local data */ +int bssglobal; /* Should go in global bss */ +static int bsslocal; /* Should go in local bss */ + +int +inner (x) + int x; +{ + return x + dataglobal + datalocal + bssglobal + bsslocal; +} + +static short +middle (x) + int x; +{ + return 2 * inner (x); +} + +short +top (x) + int x; +{ + return 2 * middle (x); +} + +int +main (argc, argv) + int argc; + char **argv; +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + return top (argc); +} + +char *malloc (); + +int *x; + +int +array_index (arr, i) + char *arr; + int i; +{ + /* The basic concept is just "return arr[i];". But call malloc so that gdb + will be able to call functions. */ + char retval; + x = (int *) malloc (sizeof (int)); + *x = i; + retval = arr[*x]; + free (x); + return retval; +} diff --git a/gdb/testsuite/gdb.base/nodebug.exp b/gdb/testsuite/gdb.base/nodebug.exp new file mode 100644 index 00000000000..e4f8a355d21 --- /dev/null +++ b/gdb/testsuite/gdb.base/nodebug.exp @@ -0,0 +1,163 @@ +# Copyright (C) 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# Test that things still (sort of) work when compiled without -g. + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile nodebug +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ""] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +source ${binfile}.ci + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile + +if [runto inner] then { + + # Expect to find global/local symbols in each of text/data/bss. + + # The exact format for some of this output is not necessarily + # ideal, particularly interpreting "p top" requires a fair bit of + # savvy about gdb's workings and the meaning of the "{}" + # construct. So the details maybe could be tweaked. But the + # basic purpose should be maintained, which is (a) users should be + # able to interact with these variables with some care (they have + # to know how to interpret them according to their real type, + # since gdb doesn't know the type), but (b) users should be able + # to detect that gdb does not know the type, rather than just + # being told they are ints or functions returning int like old + # versions of gdb used to do. + + # On alpha (and other ecoff systems) the native compilers put + # out debugging info for non-aggregate return values of functions + # even without -g, which should be accepted. + # Irix5, even though it is ELF, counts as "ecoff" because it + # encapsulates ecoff debugging info in a .mdebug section. + # Irix6 gcc omits no debug info at all for static functions and + # variables, so all tests involving statics fail. + + if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix5*" "mips-sgi-irix6*" } + gdb_test "p top" \ + "{(<(text variable|function), no debug info>|short \\(\\))} \[0-9a-fx]* " + if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix5*" "mips-sgi-irix6*" } + gdb_test "whatis top" \ + "(<(text variable|function), no debug info>|short \\(\\))" + if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" } + gdb_test "ptype top" "(short|int) \\((||, )\\)" + + if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix5*" } + setup_xfail "mips-sgi-irix6*" + gdb_test "p middle" \ + "{(<(text variable|function), no debug info>|short \\(\\))} \[0-9a-fx]* " + if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix5*" } + setup_xfail "mips-sgi-irix6*" + gdb_test "whatis middle" \ + "(<(text variable|function), no debug info>|short \\(\\))" + setup_xfail "mips-sgi-irix6*" + gdb_test "ptype middle" "(short|int) \\((||, )\\)" + + gdb_test "p dataglobal" "= 3" + gdb_test "whatis dataglobal" \ + "<(data variable|variable), no debug info>" + gdb_test "ptype dataglobal" "<(data variable|variable), no debug info>" + + # The only symbol xcoff puts out for statics is for the TOC entry. + # Possible, but hairy, for gdb to deal. Right now it doesn't, it + # doesn't know the variables exist at all. + setup_xfail "rs6000*-*-aix*" + setup_xfail "powerpc*-*-aix*" + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" } + gdb_test "p datalocal" "= 4" + setup_xfail "rs6000*-*-aix*" + setup_xfail "powerpc*-*-aix*" + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" } + gdb_test "whatis datalocal" "<(data variable|variable), no debug info>" + setup_xfail "rs6000*-*-aix*" + setup_xfail "powerpc*-*-aix*" + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" } + gdb_test "ptype datalocal" "<(data variable|variable), no debug info>" + + gdb_test "p bssglobal" "= 0" + gdb_test "whatis bssglobal" "<(data variable|variable), no debug info>" + gdb_test "ptype bssglobal" "<(data variable|variable), no debug info>" + + setup_xfail "rs6000*-*-aix*" + setup_xfail "powerpc*-*-aix*" + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" } + gdb_test "p bsslocal" "= 0" + setup_xfail "rs6000*-*-aix*" + setup_xfail "powerpc*-*-aix*" + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" } + gdb_test "whatis bsslocal" "<(data variable|variable), no debug info>" + setup_xfail "rs6000*-*-aix*" + setup_xfail "powerpc*-*-aix*" + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" } + gdb_test "ptype bsslocal" "<(data variable|variable), no debug info>" + + if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" } + gdb_test "backtrace 10" "#0.*inner.*#1.*middle.*#2.*top.*#3.*main.*" \ + "backtrace from inner in nodebug.exp" + # Or if that doesn't work, at least hope for the external symbols + # Commented out because if we aren't going to xfail the above test + # ever, why bother with a weaker test? + #gdb_test "backtrace 10" "#0.*inner.*#1.*#2.*top.*#3.*main.*" \ + # "backtrace from inner in nodebug.exp for externals" + + # This test is not as obscure as it might look. `p getenv ("TERM")' + # is a real-world example, at least on many systems. + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" "mips-sgi-irix6*" } + if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "p/c array_index(\"abcdef\",2)" + } else { + gdb_test {p/c array_index("abcdef",2)} " = 99 'c'" + } + + # Now, try that we can give names of file-local symbols which happen + # to be unique, and have it still work + if {$gcc_compiled} then { setup_xfail "mips-sgi-irix6*" } + if [runto middle] then { + gdb_test "backtrace 10" "#0.*middle.*#1.*top.*#2.*main.*" \ + "backtrace from middle in nodebug.exp" + } +} diff --git a/gdb/testsuite/gdb.base/opaque.exp b/gdb/testsuite/gdb.base/opaque.exp new file mode 100644 index 00000000000..92e6459831f --- /dev/null +++ b/gdb/testsuite/gdb.base/opaque.exp @@ -0,0 +1,244 @@ +# Copyright (C) 1992, 1994, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "opaque" +set binfile ${objdir}/${subdir}/opaque + +#if { [gdb_compile "${srcdir}/${subdir}/opaque0.c ${srcdir}/${subdir}/opaque1.c" "${binfile}" executable {debug}] != "" } { +# gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +#} + +if { [gdb_compile "${srcdir}/${subdir}/opaque0.c" "${binfile}0.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${srcdir}/${subdir}/opaque1.c" "${binfile}1.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${binfile}0.o ${binfile}1.o" ${binfile} executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# +# Test basic opaque structure handling (statically). +# The ordering of the tests is significant. We first try the things that +# might fail if gdb fails to connect the uses of opaque structures to +# the actual opaque structure definition. + +# When we start up, gdb sets the file containing main() as the current +# source file. The actual structure foo is defined in a different file. +# A pointer (foop) to an instance of the opaque struct is defined in the same +# source file as main(). Ensure that gdb correctly "connected" the definition +# in the other file with the pointer to the opaque struct in the file containing +# "foop". + +# Define a procedure to set up an xfail for all targets that do not support +# this sort of cross reference. +# Any target gcc that has a DBX_NO_XREFS definition in its config file will +# not support it (FIXME: Is this still true; I suspect maybe not). + +# Native alpha ecoff doesn't support it either. +# I don't think this type of cross reference works for any COFF target +# either. + +proc setup_xfail_on_opaque_pointer {} { + global gcc_compiled + + setup_xfail "a29k-*-udi" "vax-*-*" "i*86-sequent-bsd*" + if {!$gcc_compiled} then { + setup_xfail "alpha-*-*" "mips-sgi-irix5*" + } +} + +# This seems easier than trying to track different versions of xlc; I'm +# not sure there is much rhyme or reason regarding which tests it fails +# and which ones it passes. +if {[istarget "rs6000-*-aix*"] && !$gcc_compiled} then { + warning "xfails in opaque.exp may not be set up correctly for xlc" +} + +setup_xfail_on_opaque_pointer +gdb_test "whatis foop" \ + "type = struct foo \[*\]+" \ + "whatis on opaque struct pointer (statically)" + + +# Ensure that we know the form of the structure that foop points to. + +setup_xfail_on_opaque_pointer +if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "hppa*-*-hpux*" } +gdb_test "ptype foop" \ + "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\} \[*\]+" \ + "ptype on opaque struct pointer (statically)" + + +# An instance of the opaque structure (afoo) is defined in a different file. +# Ensure that we can locate afoo and the structure definition. + +gdb_test "whatis afoo" \ + "type = struct foo" \ + "whatis on opaque struct instance (statically)" + + +# Ensure that we know the form of "afoo". + +gdb_test "ptype afoo" \ + "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ + "ptype on opaque struct instance (statically)" + + +# Ensure that we know what a struct foo looks like. + +gdb_test "ptype struct foo" \ + "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ + "ptype on opaque struct tagname (statically)" + + +# +# Done with static tests, now test dynamic opaque structure handling. +# We reload the symbol table so we forget about anything we might +# have learned during the static tests. +# + +if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start +} +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# Run to main, where struct foo is incomplete. +if ![runto_main] { + perror "cannot run to breakpoint at main" +} + + +# The current source file is now the one containing main(). The structure foo +# is defined in a different file, but we have a pointer to an instance of +# the opaque structure in the current file. Ensure we know it's type. + +setup_xfail_on_opaque_pointer +gdb_test "whatis foop" \ + "type = struct foo \[*\]+" \ + "whatis on opaque struct pointer (dynamically)" + + +# Ensure that we know the form of the thing foop points to. + +setup_xfail_on_opaque_pointer +if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "hppa*-*-hpux*" } +gdb_test "ptype foop" \ + "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\} \[*\]+" \ + "ptype on opaque struct pointer (dynamically) 1" + +gdb_test "whatis afoo" \ + "type = struct foo" \ + "whatis on opaque struct instance (dynamically) 1" + + +# Ensure that we know the form of afoo, an instance of a struct foo. + +gdb_test "ptype afoo" \ + "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ + "ptype on opaque struct instance (dynamically) 1" + + +# Ensure that we know the form of an explicit struct foo. + +if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } +gdb_test "ptype struct foo" \ + "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ + "ptype on opaque struct tagname (dynamically) 1" + + +# Now reload the symbols again so we forget about anything we might +# have learned reading the symbols during the previous tests. + +if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start +} +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# Run to getfoo, where struct foo is complete. +if ![runto getfoo] { + perror "cannot run to breakpoint at getfoo" +} + + +# Ensure that we know what foop is. + +setup_xfail_on_opaque_pointer +gdb_test "whatis foop" \ + "type = struct foo \[*\]+" \ + "whatis on opaque struct pointer (dynamically) 1" + + +# Ensure that we know the form of the thing foop points to. + +setup_xfail_on_opaque_pointer +if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "hppa*-*-hpux*" } +gdb_test "ptype foop" \ + "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\} \[*\]+" \ + "ptype on opaque struct pointer (dynamically) 2" + +gdb_test "whatis afoo" \ + "type = struct foo" \ + "whatis on opaque struct instance (dynamically) 2" + + +# Ensure that we know the form of afoo, an instance of a struct foo. + +gdb_test "ptype afoo" \ + "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ + "ptype on opaque struct instance (dynamically) 2" + + +# Ensure that we know the form of an explicit struct foo. + +gdb_test "ptype struct foo" \ + "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ + "ptype on opaque struct tagname (dynamically) 2" diff --git a/gdb/testsuite/gdb.base/opaque0.c b/gdb/testsuite/gdb.base/opaque0.c new file mode 100644 index 00000000000..c6e239e4ac7 --- /dev/null +++ b/gdb/testsuite/gdb.base/opaque0.c @@ -0,0 +1,20 @@ +/* Note that struct foo is opaque (never defined) in this file. This + is allowed by C since this file does not reference any members of + the structure. The debugger needs to be able to associate this + opaque structure definition with the full definition in another + file. +*/ + +struct foo *foop; +extern struct foo *getfoo (); + +int main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + foop = getfoo (); + putfoo (foop); + return 0; +} diff --git a/gdb/testsuite/gdb.base/opaque1.c b/gdb/testsuite/gdb.base/opaque1.c new file mode 100644 index 00000000000..4a3c8559b82 --- /dev/null +++ b/gdb/testsuite/gdb.base/opaque1.c @@ -0,0 +1,18 @@ +struct foo { + int a; + int b; +} afoo = { 1, 2}; + +struct foo *getfoo () +{ + return (&afoo); +} + +#ifdef __STDC__ +void putfoo (struct foo *foop) +#else +void putfoo (foop) + struct foo *foop; +#endif +{ +} diff --git a/gdb/testsuite/gdb.base/overlays.c b/gdb/testsuite/gdb.base/overlays.c new file mode 100644 index 00000000000..d02ed707cd1 --- /dev/null +++ b/gdb/testsuite/gdb.base/overlays.c @@ -0,0 +1,34 @@ +/* Support program for testing gdb's ability to debug overlays + in the inferior. */ + +#include "ovlymgr.h" + +extern int foo PARAMS((int)); +extern int bar PARAMS((int)); +extern int baz PARAMS((int)); +extern int grbx PARAMS((int)); + +int main () +{ + int a, b, c, d, e; + + OverlayLoad (0); + OverlayLoad (4); + a = foo (1); + OverlayLoad (1); + OverlayLoad (5); + b = bar (1); + OverlayLoad (2); + OverlayLoad (6); + c = baz (1); + OverlayLoad (3); + OverlayLoad (7); + d = grbx (1); + e = a + b + c + d; + return (e != ('f' + 'o' +'o' + + 'b' + 'a' + 'r' + + 'b' + 'a' + 'z' + + 'g' + 'r' + 'b' + 'x')); + +} + diff --git a/gdb/testsuite/gdb.base/overlays.exp b/gdb/testsuite/gdb.base/overlays.exp new file mode 100644 index 00000000000..512e73c2552 --- /dev/null +++ b/gdb/testsuite/gdb.base/overlays.exp @@ -0,0 +1,246 @@ +# Copyright (C) 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu +# +# This file was written by Michael Snyder (msnyder@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +# +# test running programs +# + +set prms_id 0 +set bug_id 0 + +if [istarget "d10v-*-*"] then { + set linker_script "${srcdir}/${subdir}/d10v.ld"; +} elseif [istarget "m32r-*-*"] then { + set linker_script "${srcdir}/${subdir}/m32r.ld"; +} else { + verbose "Skipping overlay test -- not implemented for this target." + return +} + +set testfile "overlays" +set binfile ${objdir}/${subdir}/${testfile} +set srcfile ${srcdir}/${subdir}/${testfile}.c +set foo ${srcdir}/${subdir}/foo.c +set bar ${srcdir}/${subdir}/bar.c +set baz ${srcdir}/${subdir}/baz.c +set grbx ${srcdir}/${subdir}/grbx.c + +if {[gdb_compile "${srcfile}" "${testfile}.o" object {debug}] != ""} then { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} +if {[gdb_compile "${srcdir}/${subdir}/ovlymgr.c" ovlymgr.o object {debug}] != ""} then { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} +if {[gdb_compile "${foo}" foo.o object {debug} ] != ""} then { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if {[gdb_compile "${bar}" bar.o object {debug}] != ""} then { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} +if {[gdb_compile "${baz}" baz.o object {debug}] != ""} then { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} +if {[gdb_compile "${grbx}" grbx.o object {debug}] != ""} then { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} +if {[gdb_compile "${testfile}.o ovlymgr.o foo.o bar.o baz.o grbx.o" ${binfile} executable "ldscript=-Wl,-T$linker_script"] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +remote_exec build "mv ${testfile}.o foo.o bar.o baz.o grbx.o ovlymgr.o ${objdir}/${subdir}" + + +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + gdb_suppress_tests; +} + +# couple of convenience variables +set fptrcast [string_to_regexp "(int (*)(int))"] +set iptrcast [string_to_regexp "(int *)"] + +gdb_test "overlay manual" "" +gdb_test "overlay list" "No sections are mapped." "List with none mapped" + +# capture the LMA addresses of [foo bar baz grbx foox barx bazx grbxx] + +gdb_test "print \$foo_lma = &foo" \ + ".* $fptrcast 0x.* <\\*foo\\*>" "foo load addr" +gdb_test "print \$bar_lma = &bar" \ + ".* $fptrcast 0x.* <\\*bar\\*>" "bar load addr" +gdb_test "print \$baz_lma = &baz" \ + ".* $fptrcast 0x.* <\\*baz\\*>" "baz load addr" +gdb_test "print \$grbx_lma = &grbx" \ + ".* $fptrcast 0x.* <\\*grbx\\*>" "grbx load addr" +gdb_test "print \$foox_lma = &foox" \ + ".* $iptrcast 0x.*" "foox load addr" +gdb_test "print \$barx_lma = &barx" \ + ".* $iptrcast 0x.*" "barx load addr" +gdb_test "print \$bazx_lma = &bazx" \ + ".* $iptrcast 0x.*" "bazx load addr" +gdb_test "print \$grbxx_lma = &grbxx" \ + ".* $iptrcast 0x.*" "grbxx load addr" + +# map each overlay successively, and +# capture the VMA addresses of [foo bar baz grbx foox barx bazx grbxx] + +gdb_test "overlay map .ovly0" "" +gdb_test "overlay list" "Section .ovly0, loaded at.*, mapped at.*" "List ovly0" +gdb_test "print \$foo_vma = &foo" \ + ".* $fptrcast 0x.* " "foo runtime addr" + +gdb_test "overlay map .ovly1" "" +gdb_test "overlay list" "Section .ovly1, loaded at.*, mapped at.*" "List ovly1" +gdb_test "print \$bar_vma = &bar" \ + ".* $fptrcast 0x.* " "bar runtime addr" + +gdb_test "overlay map .ovly2" "" +gdb_test "overlay list" "Section .ovly2, loaded at.*, mapped at.*" "List ovly2" +gdb_test "print \$baz_vma = &baz" \ + ".* $fptrcast 0x.* " "baz runtime addr" + +gdb_test "overlay map .ovly3" "" +gdb_test "overlay list" "Section .ovly3, loaded at.*, mapped at.*" "List ovly3" +gdb_test "print \$grbx_vma = &grbx" \ + ".* $fptrcast 0x.* " "grbx runtime addr" + +gdb_test "overlay map .data00" "" +gdb_test "overlay list" "Section .data00, loaded .*, mapped .*" "List data00" +gdb_test "print \$foox_vma = &foox" \ + ".* $iptrcast 0x.*" "foox runtime addr" + +gdb_test "overlay map .data01" "" +gdb_test "overlay list" "Section .data01, loaded .*, mapped .*" "List data01" +gdb_test "print \$barx_vma = &barx" \ + ".* $iptrcast 0x.*" "barx runtime addr" + +gdb_test "overlay map .data02" "" +gdb_test "overlay list" "Section .data02, loaded .*, mapped .*" "List data02" +gdb_test "print \$bazx_vma = &bazx" \ + ".* $iptrcast 0x.*" "bazx runtime addr" + +gdb_test "overlay map .data03" "" +gdb_test "overlay list" "Section .data03, loaded .*, mapped .*" "List data03" +gdb_test "print \$grbxx_vma = &grbxx" \ + ".* $iptrcast 0x.*" "grbxx runtime addr" + +# Verify that LMA != VMA + +gdb_test "print \$foo_lma != \$foo_vma" ".* = 1" "foo's LMA != VMA" +gdb_test "print \$bar_lma != \$bar_vma" ".* = 1" "bar's LMA != VMA" +gdb_test "print \$baz_lma != \$baz_vma" ".* = 1" "baz's LMA != VMA" +gdb_test "print \$grbx_lma != \$grbx_vma" ".* = 1" "grbx's LMA != VMA" +gdb_test "print \$foox_lma != \$foox_vma" ".* = 1" "foox's LMA != VMA" +gdb_test "print \$barx_lma != \$barx_vma" ".* = 1" "barx's LMA != VMA" +gdb_test "print \$bazx_lma != \$bazx_vma" ".* = 1" "bazx's LMA != VMA" +gdb_test "print \$grbxx_lma != \$grbxx_vma" ".* = 1" "grbxx's LMA != VMA" + +# Verify that early-mapped overlays have been bumped out +# by later-mapped overlays layed over in the same VMA range. + +send_gdb "overlay list\n" +gdb_expect { + -re ".*ovly0, " { fail ".ovly0 not unmapped by .ovly1" } + -re ".*ovly2, " { fail ".ovly2 not unmapped by .ovly3" } + -re ".*data00," { fail ".data00 not unmapped by .data01" } + -re ".*data02," { fail ".data02 not unmapped by .data03" } + -re ".*$gdb_prompt $" { pass "Automatic unmapping" } + timeout { fail "(timeout) Automatic unmapping" } +} + +# test automatic mode + +gdb_test "overlay auto" "" +gdb_test "overlay list" "No sections are mapped." "List none mapped (auto)" +gdb_test "break foo" "Breakpoint .*at .*file .*foo.c.*" "break foo" +gdb_test "break bar" "Breakpoint .*at .*file .*bar.c.*" "break bar" +gdb_test "break baz" "Breakpoint .*at .*file .*baz.c.*" "break baz" +gdb_test "break grbx" "Breakpoint .*at .*file .*grbx.c.*" "break grbx" + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint .* foo .x=1. at .*$gdb_prompt $" { pass "hit foo" } + -re ".*$gdb_prompt $" { fail "hit foo" } + timeout { fail "(timeout) hit foo" } +} + +send_gdb "backtrace\n" +gdb_expect { + -re "#0 .*foo .*#1 .*main .*$gdb_prompt $" { pass "BT foo" } + -re ".*$gdb_prompt $" { fail "BT foo" } + timeout { fail "(timeout) BT foo" } +} + + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint .* bar .x=1. at .*$gdb_prompt $" { pass "hit bar" } + -re ".*$gdb_prompt $" { fail "hit bar" } + timeout { fail "(timeout) hit bar" } +} + +send_gdb "backtrace\n" +gdb_expect { + -re "#0 .*bar .*#1 .*main .*$gdb_prompt $" { pass "BT bar" } + -re ".*$gdb_prompt $" { fail "BT bar" } + timeout { fail "(timeout) BT bar" } +} + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint .* baz .x=1. at .*$gdb_prompt $" { pass "hit baz" } + -re ".*$gdb_prompt $" { fail "hit baz" } + timeout { fail "(timeout) hit baz" } +} + +send_gdb "backtrace\n" +gdb_expect { + -re "#0 .*baz .*#1 .*main .*$gdb_prompt $" { pass "BT baz" } + -re ".*$gdb_prompt $" { fail "BT baz" } + timeout { fail "(timeout) BT baz" } +} + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint .* grbx .x=1. at .*$gdb_prompt $" { pass "hit grbx" } + -re ".*$gdb_prompt $" { fail "hit grbx" } + timeout { fail "(timeout) hit grbx" } +} + +send_gdb "backtrace\n" +gdb_expect { + -re "#0 .*grbx .*#1 .*main .*$gdb_prompt $" { pass "BT grbx" } + -re ".*$gdb_prompt $" { fail "BT grbx" } + timeout { fail "(timeout) BT grbx" } +} + diff --git a/gdb/testsuite/gdb.base/ovlymgr.c b/gdb/testsuite/gdb.base/ovlymgr.c new file mode 100644 index 00000000000..bdb90feae6b --- /dev/null +++ b/gdb/testsuite/gdb.base/ovlymgr.c @@ -0,0 +1,225 @@ + +/* + * Ovlymgr.c -- Runtime Overlay Manager for the GDB testsuite. + */ + +#include "ovlymgr.h" + +/* Local functions and data: */ + +extern unsigned long _ovly_table[][4]; +extern unsigned long _novlys __attribute__ ((section (".data"))); +enum ovly_index { VMA, SIZE, LMA, MAPPED}; + +static void ovly_copy (unsigned long dst, unsigned long src, long size); + +/* Flush the data and instruction caches at address START for SIZE bytes. + Support for each new port must be added here. */ +/* FIXME: Might be better to have a standard libgloss function that + ports provide that we can then use. Use libgloss instead of newlib + since libgloss is the one intended to handle low level system issues. + I would suggest something like _flush_cache to avoid the user's namespace + but not be completely obscure as other things may need this facility. */ + +static void +FlushCache (void) +{ +#ifdef __M32R__ + volatile char *mspr = (char *) 0xfffffff7; + *mspr = 1; +#endif +} + +/* OverlayLoad: + * Copy the overlay into its runtime region, + * and mark the overlay as "mapped". + */ + +bool +OverlayLoad (unsigned long ovlyno) +{ + unsigned long i; + + if (ovlyno < 0 || ovlyno >= _novlys) + exit (-1); /* fail, bad ovly number */ + + if (_ovly_table[ovlyno][MAPPED]) + return TRUE; /* this overlay already mapped -- nothing to do! */ + + for (i = 0; i < _novlys; i++) + if (i == ovlyno) + _ovly_table[i][MAPPED] = 1; /* this one now mapped */ + else if (_ovly_table[i][VMA] == _ovly_table[ovlyno][VMA]) + _ovly_table[i][MAPPED] = 0; /* this one now un-mapped */ + + ovly_copy (_ovly_table[ovlyno][VMA], + _ovly_table[ovlyno][LMA], + _ovly_table[ovlyno][SIZE]); + + FlushCache (); + + return TRUE; +} + +/* OverlayUnload: + * Copy the overlay back into its "load" region. + * Does NOT mark overlay as "unmapped", therefore may be called + * more than once for the same mapped overlay. + */ + +bool +OverlayUnload (unsigned long ovlyno) +{ + if (ovlyno < 0 || ovlyno >= _novlys) + exit (-1); /* fail, bad ovly number */ + + if (!_ovly_table[ovlyno][MAPPED]) + exit (-1); /* error, can't copy out a segment that's not "in" */ + + ovly_copy (_ovly_table[ovlyno][LMA], + _ovly_table[ovlyno][VMA], + _ovly_table[ovlyno][SIZE]); + + return TRUE; +} + +#ifdef __D10V__ +#define IMAP0 (*(short *)(0xff00)) +#define IMAP1 (*(short *)(0xff02)) +#define DMAP (*(short *)(0xff04)) + +static void +D10VTranslate (unsigned long logical, + short *dmap, + unsigned long **addr) +{ + unsigned long physical; + unsigned long seg; + unsigned long off; + + /* to access data, we use the following mapping + 0x00xxxxxx: Logical data address segment (DMAP translated memory) + 0x01xxxxxx: Logical instruction address segment (IMAP translated memory) + 0x10xxxxxx: Physical data memory segment (On-chip data memory) + 0x11xxxxxx: Physical instruction memory segment (On-chip insn memory) + 0x12xxxxxx: Phisical unified memory segment (Unified memory) + */ + + /* Addresses must be correctly aligned */ + if (logical & (sizeof (**addr) - 1)) + exit (-1); + + /* If the address is in one of the two logical address spaces, it is + first translated into a physical address */ + seg = (logical >> 24); + off = (logical & 0xffffffL); + switch (seg) + { + case 0x00: /* in logical data address segment */ + if (off <= 0x7fffL) + physical = (0x10L << 24) + off; + else + /* Logical address out side of on-chip segment, not + supported */ + exit (-1); + break; + case 0x01: /* in logical instruction address segment */ + { + short map; + if (off <= 0x1ffffL) + map = IMAP0; + else if (off <= 0x3ffffL) + map = IMAP1; + else + /* Logical address outside of IMAP[01] segment, not + supported */ + exit (-1); + if (map & 0x1000L) + { + /* Instruction memory */ + physical = (0x11L << 24) | off; + } + else + { + /* Unified memory */ + physical = ((map & 0x7fL) << 17) + (off & 0x1ffffL); + if (physical > 0xffffffL) + /* Address outside of unified address segment */ + exit (-1); + physical |= (0x12L << 24); + } + break; + } + case 0x10: + case 0x11: + case 0x12: + physical = logical; + break; + default: + exit (-1); /* error */ + } + + seg = (physical >> 24); + off = (physical & 0xffffffL); + switch (seg) + { + case 0x10: /* dst is a 15 bit offset into the on-chip memory */ + *dmap = 0; + *addr = (long *) (0x0000 + ((short)off & 0x7fff)); + break; + case 0x11: /* dst is an 18-bit offset into the on-chip + instruction memory */ + *dmap = 0x1000L | ((off & 0x3ffffL) >> 14); + *addr = (long *) (0x8000 + ((short)off & 0x3fff)); + break; + case 0x12: /* dst is a 24-bit offset into unified memory */ + *dmap = off >> 14; + *addr = (long *) (0x8000 + ((short)off & 0x3fff)); + break; + default: + exit (-1); /* error */ + } +} +#endif /* __D10V__ */ + +static void +ovly_copy (unsigned long dst, unsigned long src, long size) +{ +#ifdef __M32R__ + memcpy ((void *) dst, (void *) src, size); + return; +#endif /* M32R */ + +#ifdef __D10V__ + unsigned long *s, *d, tmp; + short dmap_src, dmap_dst; + short dmap_save; + + /* all section sizes should by multiples of 4 bytes */ + dmap_save = DMAP; + + D10VTranslate (src, &dmap_src, &s); + D10VTranslate (dst, &dmap_dst, &d); + + while (size > 0) + { + /* NB: Transfer 4 byte (long) quantites, problems occure + when only two bytes are transfered */ + DMAP = dmap_src; + tmp = *s; + DMAP = dmap_dst; + *d = tmp; + d++; + s++; + size -= sizeof (tmp); + src += sizeof (tmp); + dst += sizeof (tmp); + if ((src & 0x3fff) == 0) + D10VTranslate (src, &dmap_src, &s); + if ((dst & 0x3fff) == 0) + D10VTranslate (dst, &dmap_dst, &d); + } + DMAP = dmap_save; +#endif /* D10V */ +} + diff --git a/gdb/testsuite/gdb.base/ovlymgr.h b/gdb/testsuite/gdb.base/ovlymgr.h new file mode 100644 index 00000000000..bd0d40a2640 --- /dev/null +++ b/gdb/testsuite/gdb.base/ovlymgr.h @@ -0,0 +1,17 @@ +/* + * Sample runtime overlay manager. + */ + +#ifdef NO_PROTOTYPES +#define PARAMS(paramlist) () +#else +#define PARAMS(paramlist) paramlist +#endif + +typedef enum { FALSE, TRUE } bool; + +/* Entry Points: */ + +bool OverlayLoad PARAMS((unsigned long ovlyno)); +bool OverlayUnload PARAMS((unsigned long ovlyno)); + diff --git a/gdb/testsuite/gdb.base/pointers.c b/gdb/testsuite/gdb.base/pointers.c new file mode 100644 index 00000000000..8cac2c2b906 --- /dev/null +++ b/gdb/testsuite/gdb.base/pointers.c @@ -0,0 +1,176 @@ + +#if !defined (__STDC__) && !defined (_AIX) +#define signed /**/ +#endif + +char v_char; +signed char v_signed_char; +unsigned char v_unsigned_char; + +short v_short; +signed short v_signed_short; +unsigned short v_unsigned_short; + +int v_int; +signed int v_signed_int; +unsigned int v_unsigned_int; + +long v_long; +signed long v_signed_long; +unsigned long v_unsigned_long; + +float v_float; +double v_double; + + + +char *v_char_pointer; +signed char *v_signed_char_pointer; +unsigned char *v_unsigned_char_pointer; + +short *v_short_pointer; +signed short *v_signed_short_pointer; +unsigned short *v_unsigned_short_pointer; + +int *v_int_pointer; +int *v_int_pointer2; +signed int *v_signed_int_pointer; +unsigned int *v_unsigned_int_pointer; + +long *v_long_pointer; +signed long *v_signed_long_pointer; +unsigned long *v_unsigned_long_pointer; + +float *v_float_pointer; +double *v_double_pointer; + + +char v_char_array[2]; +signed char v_signed_char_array[2]; +unsigned char v_unsigned_char_array[2]; + +short v_short_array[2]; +signed short v_signed_short_array[2]; +unsigned short v_unsigned_short_array[2]; + +int v_int_array[2]; +signed int v_signed_int_array[2]; +unsigned int v_unsigned_int_array[2]; + +long v_long_array[2]; +signed long v_signed_long_array[2]; +unsigned long v_unsigned_long_array[2]; + +float v_float_array[2]; +double v_double_array[2]; + +int matrix[2][3] = { { 0, 1, 2}, {3, 4, 5}}; +int (*rptr)[3] = matrix; + +float ** ptr_to_ptr_to_float; + +int y; + +int main () +{ + void dummy(); + + /* Ensure that malloc is a pointer type; avoid use of "void" and any include files. */ + /* extern char *malloc();*/ + + /* void *malloc(size_t);*/ + + + +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + dummy(); +/* v_int_pointer2 = &v_int_pointer; + v_unsigned_int_pointer = &v_int; + + y = (v_unsigned_int_pointer == v_double_pointer); + + x = v_unsigned_int_pointer * v_double_pointer; + + v_unsigned_int_pointer = v_double_pointer; + + v_unsigned_int_pointer = v_unsigned_int;*/ + + return 0; + +} + +void dummy() +{ + + + v_char = 0; + v_signed_char = 1; + v_unsigned_char = 2; + + v_short = 3; + v_signed_short = 4; + v_unsigned_short = 5; + + v_int = 6; + v_signed_int = 7; + v_unsigned_int = 8; + + v_long = 9; + v_signed_long = 10; + v_unsigned_long = 11; + + v_float = 100.0; + v_double = 200.0; + + + + v_char_pointer = &v_char; + v_signed_char_pointer = &v_signed_char; + v_unsigned_char_pointer = &v_unsigned_char; + + v_short_pointer = &v_short; + v_signed_short_pointer = &v_signed_short; + v_unsigned_short_pointer = &v_unsigned_short; + + v_int_pointer = &v_int; + v_signed_int_pointer = &v_signed_int; + v_unsigned_int_pointer = &v_unsigned_int; + + v_long_pointer = &v_long; + v_signed_long_pointer = &v_signed_long; + v_unsigned_long_pointer = &v_unsigned_long; + + v_float_pointer = &v_float; + v_double_pointer = &v_double; + + ptr_to_ptr_to_float = &v_float_pointer; + + + v_char_array[0] = v_char; + v_signed_char_array[0] = v_signed_char; + v_unsigned_char_array[0] = v_unsigned_char; + + v_short_array[0] = v_short; + v_signed_short_array[0] = v_signed_short; + v_unsigned_short_array[0] = v_unsigned_short; + + v_int_array[0] = v_int; + v_int_array[1] = v_int * 3; + + v_signed_int_array[0] = v_signed_int; + v_unsigned_int_array[0] = v_unsigned_int; + + v_long_array[0] = v_long; + v_signed_long_array[0] = v_signed_long; + v_unsigned_long_array[0] = v_unsigned_long; + + v_float_array[0] = v_float; + v_double_array[0] = v_double; + +} + + + diff --git a/gdb/testsuite/gdb.base/pointers.exp b/gdb/testsuite/gdb.base/pointers.exp new file mode 100644 index 00000000000..7a0e44f3574 --- /dev/null +++ b/gdb/testsuite/gdb.base/pointers.exp @@ -0,0 +1,358 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite +# +# tests for pointer arithmetic and pointer dereferencing +# with integer type variables and pointers to integers +# + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "pointers" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +gdb_test "next" "return 0;" "continuing after dummy()" + + +# +# let's see if gdb catches some illegal operations on pointers +# +# I must comment these out because strict type checking is not +# supported in this version of GDB. I do not really know +# what the expected gdb reply is. +# + +#send_gdb "print v_int_pointer2 = &v_int_pointer\n" +#gdb_expect { +# -re ".*.*$gdb_prompt $" { +# pass "illegal pointer assignment rejected" +# } +# -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } +# timeout { fail "(timeout) illegal pointer assignment rejected" } +# } + + +#send_gdb "print v_unsigned_int_pointer = &v_int\n" +#gdb_expect { +# -re ".*.*$gdb_prompt $" { +# pass "illegal pointer assignment rejected" +# } +# -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } +# timeout { fail "(timeout) ilegal pointer assignment rejected" } +# } + +#send_gdb "print v_unsigned_int_pointer == v_double_pointer\n" +#gdb_expect { +# -re ".*.*$gdb_prompt $" { +# pass "illegal pointer operation (+) rejected" +# } +# -re ".*$gdb_prompt $" { fail "illegal pointer operation (+) rejected" } +# timeout { fail "(timeout) illegal pointer operation (+) rejected" } +# } + + +#send_gdb "print v_unsigned_int_pointer * v_double_pointer\n" +#gdb_expect { +# -re ".*Argument to arithmetic operation not a number or boolean.*$gdb_prompt $" { +# pass "illegal pointer operation (*) rejected" +# } +# -re ".*$gdb_prompt $" { fail "illegal pointer operation (*) rejected" } +# timeout { fail "(timeout) illegal pointer operation (*) rejected" } +# } + + +#send_gdb "print v_unsigned_int_pointer = v_double_pointer\n" +#gdb_expect { +# -re ".*.*$gdb_prompt $" { +# pass "ilegal pointer assignment rejected" +# } +# -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } +# timeout { fail "(timeout) illegal pointer assignment rejected" } +# } + + +#send_gdb "print v_unsigned_int_pointer = v_unsigned_int\n" +#gdb_expect { +# -re ".*.*$gdb_prompt $" { +# pass "illegal pointer assignment rejected" +# } +# -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } +# timeout { fail "(timeout) illegal pointer assignment rejected" } +# } + +gdb_test "set variable v_int_pointer=&v_int_array\[0\]" "" "set pointer to beginning of array" +gdb_test "set variable v_int_pointer2=&v_int_array\[1\]" "" "set pointer to end of array" + + +send_gdb "print *v_int_pointer\n" +gdb_expect { + -re ".*= 6.*$gdb_prompt $" { + pass "print object pointed to" + } + -re ".*$gdb_prompt $" { fail "print object pointed to" } + timeout { fail "(timeout) print object pointed to" } + } + +send_gdb "print *v_int_pointer2\n" +gdb_expect { + -re ".*= 18.*$gdb_prompt $" { + pass "print object pointed to" + } + -re ".*$gdb_prompt $" { fail "print object pointed to" } + timeout { fail "(timeout) print object pointed to" } + } + + +send_gdb "print v_int_pointer == v_int_pointer2\n" +gdb_expect { + -re ".*= 0.*$gdb_prompt $" { + pass "pointer1==pointer2" + } + -re ".*$gdb_prompt $" { fail "pointer1==pointer2" } + timeout { fail "(timeout) pointer1==pointer2" } + } + +send_gdb "print v_int_pointer != v_int_pointer2\n" +gdb_expect { + -re ".*= 1.*$gdb_prompt $" { + pass "pointer1!=pointer2" + } + -re ".*$gdb_prompt $" { fail "pointer1!=pointer2" } + timeout { fail "(timeout) pointer1!=pointer2" } + } + + +send_gdb "print v_int_pointer <= v_int_pointer2\n" +gdb_expect { + -re ".*= 1.*$gdb_prompt $" { + pass "pointer1<=pointer2" + } + -re ".*$gdb_prompt $" { fail "pointer1<=pointer2" } + timeout { fail "(timeout) pointer1<=pointer2" } + } + + +send_gdb "print v_int_pointer >= v_int_pointer2\n" +gdb_expect { + -re ".*= 0.*$gdb_prompt $" { + pass "pointer1>=pointer2" + } + -re ".*$gdb_prompt $" { fail "pointer1>=pointer2" } + timeout { fail "(timeout) pointer1>=pointer2" } + } + + +send_gdb "print v_int_pointer < v_int_pointer2\n" +gdb_expect { + -re ".*= 1.*$gdb_prompt $" { + pass "pointer1 v_int_pointer2\n" +gdb_expect { + -re ".*= 0.*$gdb_prompt $" { + pass "pointer1>pointer2" + } + -re ".*$gdb_prompt $" { fail "pointer1>pointer2" } + timeout { fail "(timeout) pointer1>pointer2" } + } + + +gdb_test "set variable y = *v_int_pointer++" "" "set y = *v_int_pointer++" +send_gdb "print y\n" +gdb_expect { + -re ".*= 6.*$gdb_prompt $" { + send_gdb "print *v_int_pointer\n" + gdb_expect { + -re ".*= 18.*$gdb_prompt $" { + pass "pointer assignment and increment" + } + -re ".*$gdb_prompt $" { fail "pointer assignment and increment" } + timeout { fail "(timeout) pointer assignment and increment" } + } + } + -re ".*$gdb_prompt $" { fail "pointer assignment and increment" } + timeout { fail "(timeout) pointer assignment and increment" } + } + + + + +gdb_test "set variable y = *--v_int_pointer2" "" "set y = *--v_int_pointer2" +send_gdb "print y\n" +gdb_expect { + -re ".*= 6.*$gdb_prompt $" { + send_gdb "print *v_int_pointer2\n" + gdb_expect { + -re ".*= 6.*$gdb_prompt $" { + pass "pointer decrement and assignment" + } + -re ".*$gdb_prompt $" { fail "pointer decrement and assignment" } + timeout { fail "(timeout) pointer decrement and assignment" } + } + } + -re ".*$gdb_prompt $" { fail "pointer decrement and assignment" } + timeout { fail "(timeout) pointer decrement and assignment" } + } + +gdb_test "set variable y =v_int_pointer-v_int_pointer2" "" "set y =v_int_pointer-v_int_pointer2" +send_gdb "print y\n" +gdb_expect { + -re ".*= 1.*$gdb_prompt $" { + pass "pointer1-pointer2" + } + -re ".*$gdb_prompt $" { fail "pointer1-pointer2" } + timeout { fail "(timeout) pointer1-pointer2" } + } + +gdb_test "set variable v_int_pointer=v_int_array" "" "set v_int_pointer=v_int_array" +send_gdb "print *v_int_pointer\n" +gdb_expect { + -re ".*= 6.*$gdb_prompt $" { + pass "print array element through pointer" + } + -re ".*$gdb_prompt $" { fail "print array element through pointer" } + timeout { fail "(timeout) print array element through pointer" } + } + + +send_gdb "print *(v_int_pointer+1)\n" +gdb_expect { + -re ".*= 18.*$gdb_prompt $" { + pass "print array element through pointer" + } + -re ".*$gdb_prompt $" { fail "print array element through pointer" } + timeout { fail "(timeout) print array element through pointer" } + } + +# test print elements of array through pointers + +send_gdb "print (*rptr)\[0\]\n" +gdb_expect { + -re ".*= 0.*$gdb_prompt $" { + pass "print array element through pointer" + } + -re ".*$gdb_prompt $" { fail "print array element through pointer" } + timeout { fail "(timeout) print array element through pointer" } + } + +send_gdb "print (*rptr)\[1\]\n" +gdb_expect { + -re ".*= 1.*$gdb_prompt $" { + pass "print array element through pointer" + } + -re ".*$gdb_prompt $" { fail "print array element through pointer" } + timeout { fail "(timeout) print array element through pointer" } + } + + +send_gdb "print (*rptr)\[2\]\n" +gdb_expect { + -re ".*= 2.*$gdb_prompt $" { + pass "print array element through pointer" + } + -re ".*$gdb_prompt $" { fail "print array element through pointer" } + timeout { fail "(timeout) print array element through pointer" } + } + +gdb_test "set variable rptr = rptr+1" "" "increment rptr" + +send_gdb "print (*rptr)\[0\]\n" +gdb_expect { + -re ".*= 3.*$gdb_prompt $" { + pass "print array element through pointer" + } + -re ".*$gdb_prompt $" { fail "print array element through pointer" } + timeout { fail "(timeout) print array element through pointer" } + } + + +send_gdb "print (*rptr)\[1\]\n" +gdb_expect { + -re ".*= 4.*$gdb_prompt $" { + pass "print array element through pointer" + } + -re ".*$gdb_prompt $" { fail "print array element through pointer" } + timeout { fail "(timeout) print array element through pointer" } + } + + +send_gdb "print (*rptr)\[2\]\n" +gdb_expect { + -re ".*= 5.*$gdb_prompt $" { + pass "print array element through pointer" + } + -re ".*$gdb_prompt $" { fail "print array element through pointer" } + timeout { fail "(timeout) print array element through pointer" } + } + + +send_gdb "print *( *(matrix+1) +2)\n" +gdb_expect { + -re ".*= 5.*$gdb_prompt $" { + pass "print array element w/ pointer arithmetic" + } + -re ".*$gdb_prompt $" { fail "print array element w/ pointer arithemtic" } + timeout { fail "(timeout) print array element w/ pointer arithmetic" } + } + + +send_gdb "print **ptr_to_ptr_to_float\n" +gdb_expect { + -re ".*= 100.*$gdb_prompt $" { + pass "print through ptr to ptr" + } + -re ".*$gdb_prompt $" { fail "print through ptr to ptr" } + timeout { fail "(timeout) print through ptr to ptr" } + } diff --git a/gdb/testsuite/gdb.base/pointers2.c b/gdb/testsuite/gdb.base/pointers2.c new file mode 100644 index 00000000000..6c30621a4e2 --- /dev/null +++ b/gdb/testsuite/gdb.base/pointers2.c @@ -0,0 +1,51 @@ +void marker1 () +{ + +} + + +int main() +{ + char C, *pC, **ppC, ***pppC, ****ppppC, *****pppppC, ******ppppppC; + unsigned char UC, *pUC; + short S, *pS; + unsigned short US, *pUS; + int I, *pI; + unsigned int UI, *pUI; + long L, *pL; + unsigned long UL, *pUL; + float F, *pF; + double D, *pD; + C = 'A'; + UC = 21; + S = -14; + US = 7; + I = 102; + UI = 1002; + L = -234; + UL = 234; + F = 1.25E10; + D = -1.375E-123; + pC = &C; + ppC = &pC; + pppC = &ppC; + ppppC = &pppC; + pppppC = &ppppC; + ppppppC = &pppppC; + pUC = &UC; + pS = &S; + pUS = &US; + pI = &I; + pUI = &UI; + pL = &L; + pUL = &UL; + pF = &F; + pD = &D; + + #ifdef usestubs + set_debug_traps(); + breakpoint(); + #endif + marker1(); + return 0; +} diff --git a/gdb/testsuite/gdb.base/pointers2.exp b/gdb/testsuite/gdb.base/pointers2.exp new file mode 100644 index 00000000000..e44e110e038 --- /dev/null +++ b/gdb/testsuite/gdb.base/pointers2.exp @@ -0,0 +1,288 @@ +# Copyright (C) 1997, 1998 +# 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni. (ezannoni@cygnus.com) + + +# This file is part of the gdb testsuite +# +# tests for pointers +# with elementary type variables and pointers. +# + + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "pointers2" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "break marker1\n" ; gdb_expect -re ".*$gdb_prompt $" + + send_gdb "cont\n" + gdb_expect { + -re "Break.* marker1 \\(\\) at .*:$decimal.*$gdb_prompt $" { + send_gdb "up\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "up from marker1" } + } + } + -re "$gdb_prompt $" { fail "continue to marker1" } + timeout { fail "(timeout) continue to marker1" } + } + + +send_gdb "print *pUC\n" +gdb_expect { + -re ".\[0-9\]* = 21 \'.025\'.*$gdb_prompt $" { + pass "print value of *pUC" + } + -re ".*$gdb_prompt $" { fail "print value of *pUC" } + timeout { fail "(timeout) print value of *pUC" } + } + + +send_gdb "ptype pUC\n" +gdb_expect { + -re "type = unsigned char \\*.*$gdb_prompt $" { pass "ptype pUC" } + -re ".*$gdb_prompt $" { fail "ptype pUC" } + timeout { fail "(timeout) ptype pUC" } +} + +send_gdb "print *pS\n" +gdb_expect { + -re ".\[0-9\]* = -14.*$gdb_prompt $" { + pass "print value of *pS" + } + -re ".*$gdb_prompt $" { fail "print value of *pS" } + timeout { fail "(timeout) print value of *pS" } + } + + +send_gdb "ptype pS\n" +gdb_expect { + -re "type = short \\*.*$gdb_prompt $" { pass "ptype pS" } + -re "type = short int \\*.*$gdb_prompt $" { pass "ptype pS" } + -re ".*$gdb_prompt $" { fail "ptype pS" } + timeout { fail "(timeout) ptype pS" } +} + +send_gdb "print *pUS\n" +gdb_expect { + -re ".\[0-9\]* = 7.*$gdb_prompt $" { + pass "print value of *pUS" + } + -re ".*$gdb_prompt $" { fail "print value of *pUS" } + timeout { fail "(timeout) print value of *pUS" } + } + + +send_gdb "ptype pUS\n" +gdb_expect { + -re "type = unsigned short \\*.*$gdb_prompt $" { pass "ptype pUS" } + -re "type = short unsigned int \\*.*$gdb_prompt $" { pass "ptype pUS" } + -re ".*$gdb_prompt $" { fail "ptype pUS" } + timeout { fail "(timeout) ptype pUS" } +} + +send_gdb "print *pI\n" +gdb_expect { + -re ".\[0-9\]* = 102.*$gdb_prompt $" { + pass "print value of *pI" + } + -re ".*$gdb_prompt $" { fail "print value of *pI" } + timeout { fail "(timeout) print value of *pI" } + } + + +send_gdb "ptype pI\n" +gdb_expect { + -re "type = int \\*.*$gdb_prompt $" { pass "ptype pI" } + -re ".*$gdb_prompt $" { fail "ptype pI" } + timeout { fail "(timeout) ptype pI" } +} + +send_gdb "print *pUI\n" +gdb_expect { + -re ".\[0-9\]* = 1002.*$gdb_prompt $" { + pass "print value of *pUI" + } + -re ".*$gdb_prompt $" { fail "print value of *pUI" } + timeout { fail "(timeout) print value of *pUI" } + } + + +send_gdb "ptype pUI\n" +gdb_expect { + -re "type = unsigned int \\*.*$gdb_prompt $" { pass "ptype pUI" } + -re ".*$gdb_prompt $" { fail "ptype pUI" } + timeout { fail "(timeout) ptype pUI" } +} + +send_gdb "print *pL\n" +gdb_expect { + -re ".\[0-9\]* = -234.*$gdb_prompt $" { + pass "print value of *pL" + } + -re ".*$gdb_prompt $" { fail "print value of *pL" } + timeout { fail "(timeout) print value of *pL" } + } + + +send_gdb "ptype pL\n" +gdb_expect { + -re "type = long \\*.*$gdb_prompt $" { pass "ptype pL" } + -re "type = long int \\*.*$gdb_prompt $" { pass "ptype pL" } + -re ".*$gdb_prompt $" { fail "ptype pL" } + timeout { fail "(timeout) ptype pL" } +} + +send_gdb "print *pUL\n" +gdb_expect { + -re ".\[0-9\]* = 234.*$gdb_prompt $" { + pass "print value of *pUL" + } + -re ".*$gdb_prompt $" { fail "print value of *pUL" } + timeout { fail "(timeout) print value of *pUL" } + } + + +send_gdb "ptype pUL\n" +gdb_expect { + -re "type = unsigned long \\*.*$gdb_prompt $" { pass "ptype pUL" } + -re "type = long unsigned int \\*.*$gdb_prompt $" { pass "ptype pUL" } + -re ".*$gdb_prompt $" { fail "ptype pUL" } + timeout { fail "(timeout) ptype pUL" } +} + +send_gdb "print *pF\n" +gdb_expect { + -re ".\[0-9\]* = 1.2\[0-9\]*e\\+10.*$gdb_prompt $" { + pass "print value of *pF" + } + -re ".*$gdb_prompt $" { fail "print value of *pF" } + timeout { fail "(timeout) print value of *pF" } + } + + +send_gdb "ptype pF\n" +gdb_expect { + -re "type = float \\*.*$gdb_prompt $" { pass "ptype pF" } + -re ".*$gdb_prompt $" { fail "ptype pF" } + timeout { fail "(timeout) ptype pF" } +} + +send_gdb "print *pD\n" +gdb_expect { + -re ".\[0-9\]* = -1.375e-123.*$gdb_prompt $" { + pass "print value of *pD" + } + -re ".*$gdb_prompt $" { fail "print value of *pD" } + timeout { fail "(timeout) print value of *pD" } + } + + +send_gdb "ptype pD\n" +gdb_expect { + -re "type = double \\*.*$gdb_prompt $" { pass "ptype pD" } + -re ".*$gdb_prompt $" { fail "ptype pD" } + timeout { fail "(timeout) ptype pD" } +} + +send_gdb "print ******ppppppC\n" +gdb_expect { + -re ".\[0-9\]* = 65 \'A\'.*$gdb_prompt $" { + pass "print value of ******ppppppC" + } + -re ".*$gdb_prompt $" { fail "print value of ******ppppppC" } + timeout { fail "(timeout) print value of ******ppppppC" } + } + + +send_gdb "ptype pC\n" +gdb_expect { + -re "type = char \\*.*$gdb_prompt $" { pass "ptype pC" } + -re ".*$gdb_prompt $" { fail "ptype pC" } + timeout { fail "(timeout) ptype pC" } +} + +send_gdb "ptype ppC\n" +gdb_expect { + -re "type = char \\*\\*.*$gdb_prompt $" { pass "ptype ppC" } + -re ".*$gdb_prompt $" { fail "ptype ppC" } + timeout { fail "(timeout) ptype ppC" } +} + +send_gdb "ptype pppC\n" +gdb_expect { + -re "type = char \\*\\*\\*.*$gdb_prompt $" { pass "ptype pppC" } + -re ".*$gdb_prompt $" { fail "ptype pppC" } + timeout { fail "(timeout) ptype pppC" } +} + +send_gdb "ptype ppppC\n" +gdb_expect { + -re "type = char \\*\\*\\*\\*.*$gdb_prompt $" { pass "ptype ppppC" } + -re ".*$gdb_prompt $" { fail "ptype ppppC" } + timeout { fail "(timeout) ptype ppppC" } +} + +send_gdb "ptype pppppC\n" +gdb_expect { + -re "type = char \\*\\*\\*\\*\\*.*$gdb_prompt $" { pass "ptype pppppC" } + -re ".*$gdb_prompt $" { fail "ptype pppppC" } + timeout { fail "(timeout) ptype pppppC" } +} + +send_gdb "ptype ppppppC\n" +gdb_expect { + -re "type = char \\*\\*\\*\\*\\*\\*.*$gdb_prompt $" { pass "ptype ppppppC" } + -re ".*$gdb_prompt $" { fail "ptype ppppppC" } + timeout { fail "(timeout) ptype ppppppC" } +} + diff --git a/gdb/testsuite/gdb.base/printcmds.c b/gdb/testsuite/gdb.base/printcmds.c new file mode 100644 index 00000000000..6f2238bd256 --- /dev/null +++ b/gdb/testsuite/gdb.base/printcmds.c @@ -0,0 +1,101 @@ +/* This table is used as a source for every ascii character. + It is explicitly unsigned to avoid differences due to native characters + being either signed or unsigned. */ + +unsigned char ctable1[256] = { + 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, + 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017, + 0020, 0021, 0022, 0023, 0024, 0025, 0026, 0027, + 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037, + 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047, + 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057, + 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, + 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077, + 0100, 0101, 0102, 0103, 0104, 0105, 0106, 0107, + 0110, 0111, 0112, 0113, 0114, 0115, 0116, 0117, + 0120, 0121, 0122, 0123, 0124, 0125, 0126, 0127, + 0130, 0131, 0132, 0133, 0134, 0135, 0136, 0137, + 0140, 0141, 0142, 0143, 0144, 0145, 0146, 0147, + 0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157, + 0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167, + 0170, 0171, 0172, 0173, 0174, 0175, 0176, 0177, + 0200, 0201, 0202, 0203, 0204, 0205, 0206, 0207, + 0210, 0211, 0212, 0213, 0214, 0215, 0216, 0217, + 0220, 0221, 0222, 0223, 0224, 0225, 0226, 0227, + 0230, 0231, 0232, 0233, 0234, 0235, 0236, 0237, + 0240, 0241, 0242, 0243, 0244, 0245, 0246, 0247, + 0250, 0251, 0252, 0253, 0254, 0255, 0256, 0257, + 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, + 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, + 0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307, + 0310, 0311, 0312, 0313, 0314, 0315, 0316, 0317, + 0320, 0321, 0322, 0323, 0324, 0325, 0326, 0327, + 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337, + 0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347, + 0350, 0351, 0352, 0353, 0354, 0355, 0356, 0357, + 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, + 0370, 0371, 0372, 0373, 0374, 0375, 0376, 0377 +}; + +unsigned char ctable2[] = { + 'a','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X', + 'a','a','X','X','X','X','X','X','X','X','X','X','X','X','X','X', + 'a','a','a','X','X','X','X','X','X','X','X','X','X','X','X','X', + 'a','a','a','a','X','X','X','X','X','X','X','X','X','X','X','X', + 'a','a','a','a','a','X','X','X','X','X','X','X','X','X','X','X', + 'a','a','a','a','a','a','X','X','X','X','X','X','X','X','X','X', + 'a','a','a','a','a','a','a','X','X','X','X','X','X','X','X','X', + 'a','a','a','a','a','a','a','a','X','X','X','X','X','X','X','X', + 'a','a','a','a','a','a','a','a','a','X','X','X','X','X','X','X', + 'a','a','a','a','a','a','a','a','a','a','X','X','X','X','X','X', + 'a','a','a','a','a','a','a','a','a','a','a','X','X','X','X','X', + 'a','a','a','a','a','a','a','a','a','a','a','a','X','X','X','X', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','X','X','X', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','X','X', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','X', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a' +}; + +/* Single and multidimensional arrays to test access and printing of array + members. */ + +int int1dim[12] = {0,1,2,3,4,5,6,7,8,9,10,11}; +int int2dim[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}}; +int int3dim[2][3][2] = {{{0,1},{2,3},{4,5}},{{6,7},{8,9},{10,11}}}; +int int4dim[1][2][3][2] = {{{{0,1},{2,3},{4,5}},{{6,7},{8,9},{10,11}}}}; + +char *teststring = "teststring contents"; + +/* Test printing of a struct containing character arrays. */ + +struct some_arrays { + unsigned char array1[4]; + unsigned char array2[1]; + unsigned char array3[1]; + unsigned char array4[2]; + unsigned char array5[4]; +} arrays = { + {'a', 'b', 'c', '\0'}, + {'d'}, + {'e'}, + {'f', 'g' }, + {'h', 'i', 'j', '\0'} +}; + +struct some_arrays *parrays = &arrays; + +/* -- */ + +main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + malloc(1); + + /* Prevent AIX linker from removing variables. */ + return ctable1[0] + ctable2[0] + int1dim[0] + int2dim[0][0] + + int3dim[0][0][0] + int4dim[0][0][0][0] + teststring[0] + + *parrays -> array1; +} diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp new file mode 100644 index 00000000000..4953ec5c4a8 --- /dev/null +++ b/gdb/testsuite/gdb.base/printcmds.exp @@ -0,0 +1,695 @@ +# Copyright (C) 1992, 1994, 1995, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "printcmds" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Set the current language to C. This counts as a test. If it +# fails, then we skip the other tests. + +proc set_lang_c {} { + global gdb_prompt + + if [gdb_test "set language c" "" "set language c"] { + return 0 + } + + if [gdb_test "show language" ".* source language is \"c\".*"] { + return 0 + } + return 1; +} + +proc test_integer_literals_accepted {} { + global gdb_prompt + + # Test various decimal values. + + gdb_test "p 123" " = 123" + gdb_test "p -123" " = -123" + gdb_test "p/d 123" " = 123" + + # Test various octal values. + + gdb_test "p 0123" " = 83" + gdb_test "p 00123" " = 83" + gdb_test "p -0123" " = -83" + gdb_test "p/o 0123" " = 0123" + + # Test various hexadecimal values. + + gdb_test "p 0x123" " = 291" + gdb_test "p -0x123" " = -291" + gdb_test "p 0x0123" " = 291" + gdb_test "p -0x0123" " = -291" + gdb_test "p 0xABCDEF" " = 11259375" + gdb_test "p 0xabcdef" " = 11259375" + gdb_test "p 0xAbCdEf" " = 11259375" + gdb_test "p/x 0x123" " = 0x123" +} + +proc test_character_literals_accepted {} { + global gdb_prompt + + gdb_test "p 'a'" " = 97 'a'" + gdb_test "p/c 'a'" " = 97 'a'" + gdb_test "p/x 'a'" " = 0x61" + gdb_test "p/d 'a'" " = 97" + gdb_test "p/t 'a'" " = 1100001" + gdb_test "p '\\141'" " = 97 'a'" + gdb_test "p/x '\\377'" " = 0xff" + # Note "p '\''" => "= 39 '\''" + gdb_test "p '\\''" " = 39 '\\\\''" + # Note "p '\\'" => "= 92 '\\'" + gdb_test "p '\\\\'" " = 92 '\\\\\\\\'" +} + +proc test_integer_literals_rejected {} { + global gdb_prompt + + test_print_reject "p 0x" + gdb_test "p ''" "Empty character constant\\." + gdb_test "p '''" "Empty character constant\\." + test_print_reject "p '\\'" + + # Note that this turns into "p '\\\'" at gdb's input. + test_print_reject "p '\\\\\\'" + + # Test various decimal values. + + test_print_reject "p DEADBEEF" + + # Gdb currently fails this test for all configurations. The C + # lexer thinks that 123DEADBEEF is a floating point number, but + # then fails to notice that atof() only eats the 123 part. + # FIXME: This should be put into PRMS. + # Fixed, 4/25/97, by Bob Manson. + + test_print_reject "p 123DEADBEEF" + test_print_reject "p 123foobar.bazfoo3" + test_print_reject "p 123EEEEEEEEEEEEEEEEE33333k333" + gdb_test "p 123.4+56.7" "180.(099\[0-9]*|100\[0-9\]*)" "check for floating addition" + + # Test various octal values. + + test_print_reject "p 09" + test_print_reject "p 079" + + # Test various hexadecimal values. + + test_print_reject "p 0xG" + test_print_reject "p 0xAG" +} + +proc test_print_all_chars {} { + global gdb_prompt + + gdb_test "p ctable1\[0\]" " = 0 '\\\\000'" + gdb_test "p ctable1\[1\]" " = 1 '\\\\001'" + gdb_test "p ctable1\[2\]" " = 2 '\\\\002'" + gdb_test "p ctable1\[3\]" " = 3 '\\\\003'" + gdb_test "p ctable1\[4\]" " = 4 '\\\\004'" + gdb_test "p ctable1\[5\]" " = 5 '\\\\005'" + gdb_test "p ctable1\[6\]" " = 6 '\\\\006'" + gdb_test "p ctable1\[7\]" " = 7 '\\\\a'" + gdb_test "p ctable1\[8\]" " = 8 '\\\\b'" + gdb_test "p ctable1\[9\]" " = 9 '\\\\t'" + gdb_test "p ctable1\[10\]" " = 10 '\\\\n'" + gdb_test "p ctable1\[11\]" " = 11 '\\\\013'" + gdb_test "p ctable1\[12\]" " = 12 '\\\\f'" + gdb_test "p ctable1\[13\]" " = 13 '\\\\r'" + gdb_test "p ctable1\[14\]" " = 14 '\\\\016'" + gdb_test "p ctable1\[15\]" " = 15 '\\\\017'" + gdb_test "p ctable1\[16\]" " = 16 '\\\\020'" + gdb_test "p ctable1\[17\]" " = 17 '\\\\021'" + gdb_test "p ctable1\[18\]" " = 18 '\\\\022'" + gdb_test "p ctable1\[19\]" " = 19 '\\\\023'" + gdb_test "p ctable1\[20\]" " = 20 '\\\\024'" + gdb_test "p ctable1\[21\]" " = 21 '\\\\025'" + gdb_test "p ctable1\[22\]" " = 22 '\\\\026'" + gdb_test "p ctable1\[23\]" " = 23 '\\\\027'" + gdb_test "p ctable1\[24\]" " = 24 '\\\\030'" + gdb_test "p ctable1\[25\]" " = 25 '\\\\031'" + gdb_test "p ctable1\[26\]" " = 26 '\\\\032'" + gdb_test "p ctable1\[27\]" " = 27 '\\\\e'" + gdb_test "p ctable1\[28\]" " = 28 '\\\\034'" + gdb_test "p ctable1\[29\]" " = 29 '\\\\035'" + gdb_test "p ctable1\[30\]" " = 30 '\\\\036'" + gdb_test "p ctable1\[31\]" " = 31 '\\\\037'" + gdb_test "p ctable1\[32\]" " = 32 ' '" + gdb_test "p ctable1\[33\]" " = 33 '!'" + gdb_test "p ctable1\[34\]" " = 34 '\"'" + gdb_test "p ctable1\[35\]" " = 35 '#'" + gdb_test "p ctable1\[36\]" " = 36 '\\\$'" + gdb_test "p ctable1\[37\]" " = 37 '%'" + gdb_test "p ctable1\[38\]" " = 38 '&'" + gdb_test "p ctable1\[39\]" " = 39 '\\\\''" + gdb_test "p ctable1\[40\]" " = 40 '\\('" + gdb_test "p ctable1\[41\]" " = 41 '\\)'" + gdb_test "p ctable1\[42\]" " = 42 '\\*'" + gdb_test "p ctable1\[43\]" " = 43 '\\+'" + gdb_test "p ctable1\[44\]" " = 44 ','" + gdb_test "p ctable1\[45\]" " = 45 '-'" + gdb_test "p ctable1\[46\]" " = 46 '.'" + gdb_test "p ctable1\[47\]" " = 47 '/'" + gdb_test "p ctable1\[48\]" " = 48 '0'" + gdb_test "p ctable1\[49\]" " = 49 '1'" + gdb_test "p ctable1\[50\]" " = 50 '2'" + gdb_test "p ctable1\[51\]" " = 51 '3'" + gdb_test "p ctable1\[52\]" " = 52 '4'" + gdb_test "p ctable1\[53\]" " = 53 '5'" + gdb_test "p ctable1\[54\]" " = 54 '6'" + gdb_test "p ctable1\[55\]" " = 55 '7'" + gdb_test "p ctable1\[56\]" " = 56 '8'" + gdb_test "p ctable1\[57\]" " = 57 '9'" + gdb_test "p ctable1\[58\]" " = 58 ':'" + gdb_test "p ctable1\[59\]" " = 59 ';'" + gdb_test "p ctable1\[60\]" " = 60 '<'" + gdb_test "p ctable1\[61\]" " = 61 '='" + gdb_test "p ctable1\[62\]" " = 62 '>'" + gdb_test "p ctable1\[63\]" " = 63 '\\?'" + gdb_test "p ctable1\[64\]" " = 64 '@'" + gdb_test "p ctable1\[65\]" " = 65 'A'" + gdb_test "p ctable1\[66\]" " = 66 'B'" + gdb_test "p ctable1\[67\]" " = 67 'C'" + gdb_test "p ctable1\[68\]" " = 68 'D'" + gdb_test "p ctable1\[69\]" " = 69 'E'" + gdb_test "p ctable1\[70\]" " = 70 'F'" + gdb_test "p ctable1\[71\]" " = 71 'G'" + gdb_test "p ctable1\[72\]" " = 72 'H'" + gdb_test "p ctable1\[73\]" " = 73 'I'" + gdb_test "p ctable1\[74\]" " = 74 'J'" + gdb_test "p ctable1\[75\]" " = 75 'K'" + gdb_test "p ctable1\[76\]" " = 76 'L'" + gdb_test "p ctable1\[77\]" " = 77 'M'" + gdb_test "p ctable1\[78\]" " = 78 'N'" + gdb_test "p ctable1\[79\]" " = 79 'O'" + gdb_test "p ctable1\[80\]" " = 80 'P'" + gdb_test "p ctable1\[81\]" " = 81 'Q'" + gdb_test "p ctable1\[82\]" " = 82 'R'" + gdb_test "p ctable1\[83\]" " = 83 'S'" + gdb_test "p ctable1\[84\]" " = 84 'T'" + gdb_test "p ctable1\[85\]" " = 85 'U'" + gdb_test "p ctable1\[86\]" " = 86 'V'" + gdb_test "p ctable1\[87\]" " = 87 'W'" + gdb_test "p ctable1\[88\]" " = 88 'X'" + gdb_test "p ctable1\[89\]" " = 89 'Y'" + gdb_test "p ctable1\[90\]" " = 90 'Z'" + gdb_test "p ctable1\[91\]" " = 91 '\\\['" + gdb_test "p ctable1\[92\]" " = 92 '\\\\\\\\'" + gdb_test "p ctable1\[93\]" " = 93 '\\\]'" + gdb_test "p ctable1\[94\]" " = 94 '\\^'" + gdb_test "p ctable1\[95\]" " = 95 '_'" + gdb_test "p ctable1\[96\]" " = 96 '`'" + gdb_test "p ctable1\[97\]" " = 97 'a'" + gdb_test "p ctable1\[98\]" " = 98 'b'" + gdb_test "p ctable1\[99\]" " = 99 'c'" + gdb_test "p ctable1\[100\]" " = 100 'd'" + gdb_test "p ctable1\[101\]" " = 101 'e'" + gdb_test "p ctable1\[102\]" " = 102 'f'" + gdb_test "p ctable1\[103\]" " = 103 'g'" + gdb_test "p ctable1\[104\]" " = 104 'h'" + gdb_test "p ctable1\[105\]" " = 105 'i'" + gdb_test "p ctable1\[106\]" " = 106 'j'" + gdb_test "p ctable1\[107\]" " = 107 'k'" + gdb_test "p ctable1\[108\]" " = 108 'l'" + gdb_test "p ctable1\[109\]" " = 109 'm'" + gdb_test "p ctable1\[110\]" " = 110 'n'" + gdb_test "p ctable1\[111\]" " = 111 'o'" + gdb_test "p ctable1\[112\]" " = 112 'p'" + gdb_test "p ctable1\[113\]" " = 113 'q'" + gdb_test "p ctable1\[114\]" " = 114 'r'" + gdb_test "p ctable1\[115\]" " = 115 's'" + gdb_test "p ctable1\[116\]" " = 116 't'" + gdb_test "p ctable1\[117\]" " = 117 'u'" + gdb_test "p ctable1\[118\]" " = 118 'v'" + gdb_test "p ctable1\[119\]" " = 119 'w'" + gdb_test "p ctable1\[120\]" " = 120 'x'" + gdb_test "p ctable1\[121\]" " = 121 'y'" + gdb_test "p ctable1\[122\]" " = 122 'z'" + gdb_test "p ctable1\[123\]" " = 123 '\[{\]+'" + gdb_test "p ctable1\[124\]" " = 124 '\[|\]+'" + gdb_test "p ctable1\[125\]" " = 125 '\[}\]+'" + gdb_test "p ctable1\[126\]" " = 126 '\[~\]'" + gdb_test "p ctable1\[127\]" " = 127 '\\\\177'" + gdb_test "p ctable1\[128\]" " = 128 '\\\\200'" + gdb_test "p ctable1\[129\]" " = 129 '\\\\201'" + gdb_test "p ctable1\[130\]" " = 130 '\\\\202'" + gdb_test "p ctable1\[131\]" " = 131 '\\\\203'" + gdb_test "p ctable1\[132\]" " = 132 '\\\\204'" + gdb_test "p ctable1\[133\]" " = 133 '\\\\205'" + gdb_test "p ctable1\[134\]" " = 134 '\\\\206'" + gdb_test "p ctable1\[135\]" " = 135 '\\\\207'" + gdb_test "p ctable1\[136\]" " = 136 '\\\\210'" + gdb_test "p ctable1\[137\]" " = 137 '\\\\211'" + gdb_test "p ctable1\[138\]" " = 138 '\\\\212'" + gdb_test "p ctable1\[139\]" " = 139 '\\\\213'" + gdb_test "p ctable1\[140\]" " = 140 '\\\\214'" + gdb_test "p ctable1\[141\]" " = 141 '\\\\215'" + gdb_test "p ctable1\[142\]" " = 142 '\\\\216'" + gdb_test "p ctable1\[143\]" " = 143 '\\\\217'" + gdb_test "p ctable1\[144\]" " = 144 '\\\\220'" + gdb_test "p ctable1\[145\]" " = 145 '\\\\221'" + gdb_test "p ctable1\[146\]" " = 146 '\\\\222'" + gdb_test "p ctable1\[147\]" " = 147 '\\\\223'" + gdb_test "p ctable1\[148\]" " = 148 '\\\\224'" + gdb_test "p ctable1\[149\]" " = 149 '\\\\225'" + gdb_test "p ctable1\[150\]" " = 150 '\\\\226'" + gdb_test "p ctable1\[151\]" " = 151 '\\\\227'" + gdb_test "p ctable1\[152\]" " = 152 '\\\\230'" + gdb_test "p ctable1\[153\]" " = 153 '\\\\231'" + gdb_test "p ctable1\[154\]" " = 154 '\\\\232'" + gdb_test "p ctable1\[155\]" " = 155 '\\\\233'" + gdb_test "p ctable1\[156\]" " = 156 '\\\\234'" + gdb_test "p ctable1\[157\]" " = 157 '\\\\235'" + gdb_test "p ctable1\[158\]" " = 158 '\\\\236'" + gdb_test "p ctable1\[159\]" " = 159 '\\\\237'" + gdb_test "p ctable1\[160\]" " = 160 '\\\\240'" + gdb_test "p ctable1\[161\]" " = 161 '\\\\241'" + gdb_test "p ctable1\[162\]" " = 162 '\\\\242'" + gdb_test "p ctable1\[163\]" " = 163 '\\\\243'" + gdb_test "p ctable1\[164\]" " = 164 '\\\\244'" + gdb_test "p ctable1\[165\]" " = 165 '\\\\245'" + gdb_test "p ctable1\[166\]" " = 166 '\\\\246'" + gdb_test "p ctable1\[167\]" " = 167 '\\\\247'" + gdb_test "p ctable1\[168\]" " = 168 '\\\\250'" + gdb_test "p ctable1\[169\]" " = 169 '\\\\251'" + gdb_test "p ctable1\[170\]" " = 170 '\\\\252'" + gdb_test "p ctable1\[171\]" " = 171 '\\\\253'" + gdb_test "p ctable1\[172\]" " = 172 '\\\\254'" + gdb_test "p ctable1\[173\]" " = 173 '\\\\255'" + gdb_test "p ctable1\[174\]" " = 174 '\\\\256'" + gdb_test "p ctable1\[175\]" " = 175 '\\\\257'" + gdb_test "p ctable1\[176\]" " = 176 '\\\\260'" + gdb_test "p ctable1\[177\]" " = 177 '\\\\261'" + gdb_test "p ctable1\[178\]" " = 178 '\\\\262'" + gdb_test "p ctable1\[179\]" " = 179 '\\\\263'" + gdb_test "p ctable1\[180\]" " = 180 '\\\\264'" + gdb_test "p ctable1\[181\]" " = 181 '\\\\265'" + gdb_test "p ctable1\[182\]" " = 182 '\\\\266'" + gdb_test "p ctable1\[183\]" " = 183 '\\\\267'" + gdb_test "p ctable1\[184\]" " = 184 '\\\\270'" + gdb_test "p ctable1\[185\]" " = 185 '\\\\271'" + gdb_test "p ctable1\[186\]" " = 186 '\\\\272'" + gdb_test "p ctable1\[187\]" " = 187 '\\\\273'" + gdb_test "p ctable1\[188\]" " = 188 '\\\\274'" + gdb_test "p ctable1\[189\]" " = 189 '\\\\275'" + gdb_test "p ctable1\[190\]" " = 190 '\\\\276'" + gdb_test "p ctable1\[191\]" " = 191 '\\\\277'" + gdb_test "p ctable1\[192\]" " = 192 '\\\\300'" + gdb_test "p ctable1\[193\]" " = 193 '\\\\301'" + gdb_test "p ctable1\[194\]" " = 194 '\\\\302'" + gdb_test "p ctable1\[195\]" " = 195 '\\\\303'" + gdb_test "p ctable1\[196\]" " = 196 '\\\\304'" + gdb_test "p ctable1\[197\]" " = 197 '\\\\305'" + gdb_test "p ctable1\[198\]" " = 198 '\\\\306'" + gdb_test "p ctable1\[199\]" " = 199 '\\\\307'" + gdb_test "p ctable1\[200\]" " = 200 '\\\\310'" + gdb_test "p ctable1\[201\]" " = 201 '\\\\311'" + gdb_test "p ctable1\[202\]" " = 202 '\\\\312'" + gdb_test "p ctable1\[203\]" " = 203 '\\\\313'" + gdb_test "p ctable1\[204\]" " = 204 '\\\\314'" + gdb_test "p ctable1\[205\]" " = 205 '\\\\315'" + gdb_test "p ctable1\[206\]" " = 206 '\\\\316'" + gdb_test "p ctable1\[207\]" " = 207 '\\\\317'" + gdb_test "p ctable1\[208\]" " = 208 '\\\\320'" + gdb_test "p ctable1\[209\]" " = 209 '\\\\321'" + gdb_test "p ctable1\[210\]" " = 210 '\\\\322'" + gdb_test "p ctable1\[211\]" " = 211 '\\\\323'" + gdb_test "p ctable1\[212\]" " = 212 '\\\\324'" + gdb_test "p ctable1\[213\]" " = 213 '\\\\325'" + gdb_test "p ctable1\[214\]" " = 214 '\\\\326'" + gdb_test "p ctable1\[215\]" " = 215 '\\\\327'" + gdb_test "p ctable1\[216\]" " = 216 '\\\\330'" + gdb_test "p ctable1\[217\]" " = 217 '\\\\331'" + gdb_test "p ctable1\[218\]" " = 218 '\\\\332'" + gdb_test "p ctable1\[219\]" " = 219 '\\\\333'" + gdb_test "p ctable1\[220\]" " = 220 '\\\\334'" + gdb_test "p ctable1\[221\]" " = 221 '\\\\335'" + gdb_test "p ctable1\[222\]" " = 222 '\\\\336'" + gdb_test "p ctable1\[223\]" " = 223 '\\\\337'" + gdb_test "p ctable1\[224\]" " = 224 '\\\\340'" + gdb_test "p ctable1\[225\]" " = 225 '\\\\341'" + gdb_test "p ctable1\[226\]" " = 226 '\\\\342'" + gdb_test "p ctable1\[227\]" " = 227 '\\\\343'" + gdb_test "p ctable1\[228\]" " = 228 '\\\\344'" + gdb_test "p ctable1\[229\]" " = 229 '\\\\345'" + gdb_test "p ctable1\[230\]" " = 230 '\\\\346'" + gdb_test "p ctable1\[231\]" " = 231 '\\\\347'" + gdb_test "p ctable1\[232\]" " = 232 '\\\\350'" + gdb_test "p ctable1\[233\]" " = 233 '\\\\351'" + gdb_test "p ctable1\[234\]" " = 234 '\\\\352'" + gdb_test "p ctable1\[235\]" " = 235 '\\\\353'" + gdb_test "p ctable1\[236\]" " = 236 '\\\\354'" + gdb_test "p ctable1\[237\]" " = 237 '\\\\355'" + gdb_test "p ctable1\[238\]" " = 238 '\\\\356'" + gdb_test "p ctable1\[239\]" " = 239 '\\\\357'" + gdb_test "p ctable1\[240\]" " = 240 '\\\\360'" + gdb_test "p ctable1\[241\]" " = 241 '\\\\361'" + gdb_test "p ctable1\[242\]" " = 242 '\\\\362'" + gdb_test "p ctable1\[243\]" " = 243 '\\\\363'" + gdb_test "p ctable1\[244\]" " = 244 '\\\\364'" + gdb_test "p ctable1\[245\]" " = 245 '\\\\365'" + gdb_test "p ctable1\[246\]" " = 246 '\\\\366'" + gdb_test "p ctable1\[247\]" " = 247 '\\\\367'" + gdb_test "p ctable1\[248\]" " = 248 '\\\\370'" + gdb_test "p ctable1\[249\]" " = 249 '\\\\371'" + gdb_test "p ctable1\[250\]" " = 250 '\\\\372'" + gdb_test "p ctable1\[251\]" " = 251 '\\\\373'" + gdb_test "p ctable1\[252\]" " = 252 '\\\\374'" + gdb_test "p ctable1\[253\]" " = 253 '\\\\375'" + gdb_test "p ctable1\[254\]" " = 254 '\\\\376'" + gdb_test "p ctable1\[255\]" " = 255 '\\\\377'" +} + +# Test interaction of the number of print elements to print and the +# repeat count, set to the default of 10. + +proc test_print_repeats_10 {} { + global gdb_prompt + + for { set x 1; } { $x <= 16 } { incr x; } { + gdb_test "set print elements $x" "" "" + for { set e 1; } { $e <= 16 } {incr e; } { + set v [expr $e - 1]; + set command "p &ctable2\[${v}*16\]" + if { $x < $e } { + set aval $x; + } else { + set aval $e; + } + set xval [expr $x - $e]; + if { $xval < 0 } { + set xval 0; + } + if { $aval > 10 } { + set a "'a' "; + if { $xval > 0 } { + set a "${a}, \\\""; + } + } else { + set a "\\\"[string range "aaaaaaaaaaaaaaaa" 1 $aval]"; + if { $xval > 10 } { + set a "$a\\\", "; + } + } + set xstr ""; + if { $xval > 10 } { + set xstr "'X' "; + } else { + if { $xval > 0 } { + set xstr "[string range "XXXXXXXXXXXXXXXX" 1 $xval]\\\""; + } else { + if { $aval <= 10 } { + set xstr "\\\""; + } + } + } + if { $aval < 16 } { + set xstr "${xstr}\[.\]\[.\]\[.\]" + } + set string " = \[(\]unsigned char \[*\]\[)\] ${a}${xstr}"; + gdb_test "$command" "$string" "$command with print elements set to $x"; + } + } +} + +proc test_print_strings {} { + global gdb_prompt + + # We accept "(unsigned char *) " before the string. char vs. unsigned char + # is already tested elsewhere. + + # Test that setting print elements unlimited doesn't completely suppress + # printing; this was a bug in older gdb's. + gdb_test "set print elements 0" "" "" + gdb_test "p teststring" \ + " = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 0" + gdb_test "set print elements 1" "" "" + gdb_test "p teststring" \ + " = (.unsigned char .. )?\"t\"\\.\\.\\." "p teststring with elements set to 1" + gdb_test "set print elements 5" "" "" + gdb_test "p teststring" \ + " = (.unsigned char .. )?\"tests\"\\.\\.\\." "p teststring with elements set to 5" + gdb_test "set print elements 19" "" "" + gdb_test "p teststring" \ + " = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 19" + gdb_test "set print elements 20" "" "" + gdb_test "p teststring" \ + " = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 20" + + gdb_test "set print elements 8" "" "" + + gdb_test "p &ctable1\[0\]" \ + " = \\(unsigned char \\*\\) \"\"" + gdb_test "p &ctable1\[1\]" \ + " = \\(unsigned char \\*\\) \"\\\\001\\\\002\\\\003\\\\004\\\\005\\\\006\\\\a\\\\b\"..." + gdb_test "p &ctable1\[1*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\b\\\\t\\\\n\\\\013\\\\f\\\\r\\\\016\\\\017\"..." + gdb_test "p &ctable1\[2*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\020\\\\021\\\\022\\\\023\\\\024\\\\025\\\\026\\\\027\"..." + gdb_test "p &ctable1\[3*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\030\\\\031\\\\032\\\\e\\\\034\\\\035\\\\036\\\\037\"..." + gdb_test "p &ctable1\[4*8\]" \ + " = \\(unsigned char \\*\\) \" !\\\\\"#\\\$%&'\"..." + gdb_test "p &ctable1\[5*8\]" \ + " = \\(unsigned char \\*\\) \"\\(\\)\\*\\+,-./\"..." + gdb_test "p &ctable1\[6*8\]" \ + " = \\(unsigned char \\*\\) \"01234567\"..." + gdb_test "p &ctable1\[7*8\]" \ + " = \\(unsigned char \\*\\) \"89:;<=>\\?\"..." + gdb_test "p &ctable1\[8*8\]" \ + " = \\(unsigned char \\*\\) \"@ABCDEFG\"..." + gdb_test "p &ctable1\[9*8\]" \ + " = \\(unsigned char \\*\\) \"HIJKLMNO\"..." + gdb_test "p &ctable1\[10*8\]" \ + " = \\(unsigned char \\*\\) \"PQRSTUVW\"..." + gdb_test "p &ctable1\[11*8\]" \ + " = \\(unsigned char \\*\\) \"XYZ\\\[\\\\\\\\\\\]\\^_\"..." + gdb_test "p &ctable1\[12*8\]" \ + " = \\(unsigned char \\*\\) \"`abcdefg\"..." + gdb_test "p &ctable1\[13*8\]" \ + " = \\(unsigned char \\*\\) \"hijklmno\"..." + gdb_test "p &ctable1\[14*8\]" \ + " = \\(unsigned char \\*\\) \"pqrstuvw\"..." + gdb_test "p &ctable1\[15*8\]" \ + " = \\(unsigned char \\*\\) \"xyz\[{|}\]+\\~\\\\177\"..." + gdb_test "p &ctable1\[16*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\200\\\\201\\\\202\\\\203\\\\204\\\\205\\\\206\\\\207\"..." + gdb_test "p &ctable1\[17*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\210\\\\211\\\\212\\\\213\\\\214\\\\215\\\\216\\\\217\"..." + gdb_test "p &ctable1\[18*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\220\\\\221\\\\222\\\\223\\\\224\\\\225\\\\226\\\\227\"..." + gdb_test "p &ctable1\[19*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\230\\\\231\\\\232\\\\233\\\\234\\\\235\\\\236\\\\237\"..." + gdb_test "p &ctable1\[20*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\240\\\\241\\\\242\\\\243\\\\244\\\\245\\\\246\\\\247\"..." + gdb_test "p &ctable1\[21*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\250\\\\251\\\\252\\\\253\\\\254\\\\255\\\\256\\\\257\"..." + gdb_test "p &ctable1\[22*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\260\\\\261\\\\262\\\\263\\\\264\\\\265\\\\266\\\\267\"..." + gdb_test "p &ctable1\[23*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\270\\\\271\\\\272\\\\273\\\\274\\\\275\\\\276\\\\277\"..." + gdb_test "p &ctable1\[24*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\300\\\\301\\\\302\\\\303\\\\304\\\\305\\\\306\\\\307\"..." + gdb_test "p &ctable1\[25*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\310\\\\311\\\\312\\\\313\\\\314\\\\315\\\\316\\\\317\"..." + gdb_test "p &ctable1\[26*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\320\\\\321\\\\322\\\\323\\\\324\\\\325\\\\326\\\\327\"..." + gdb_test "p &ctable1\[27*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\330\\\\331\\\\332\\\\333\\\\334\\\\335\\\\336\\\\337\"..." + gdb_test "p &ctable1\[28*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\340\\\\341\\\\342\\\\343\\\\344\\\\345\\\\346\\\\347\"..." + gdb_test "p &ctable1\[29*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\350\\\\351\\\\352\\\\353\\\\354\\\\355\\\\356\\\\357\"..." + gdb_test "p &ctable1\[30*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\360\\\\361\\\\362\\\\363\\\\364\\\\365\\\\366\\\\367\"..." + gdb_test "p &ctable1\[31*8\]" \ + " = \\(unsigned char \\*\\) \"\\\\370\\\\371\\\\372\\\\373\\\\374\\\\375\\\\376\\\\377\"..." +} + +proc test_print_int_arrays {} { + global gdb_prompt + + gdb_test "set print elements 24" "" "" + + gdb_test "p int1dim" \ + " = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}" + gdb_test "p int2dim" \ + " = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}" + gdb_test "p int3dim" \ + " = {{{0, 1}, {2, 3}, {4, 5}}, {{6, 7}, {8, 9}, {10, 11}}}" + gdb_test "p int4dim" \ + " = {{{{0, 1}, {2, 3}, {4, 5}}, {{6, 7}, {8, 9}, {10, 11}}}}" +} + +proc test_artificial_arrays {} { + # Send \026@ instead of just @ in case the kill character is @. + gdb_test "p int1dim\[0\]\026@2" " = {0, 1}" {p int1dim[0]@2} + gdb_test "p int1dim\[0\]\026@2\026@3" \ + "({{0, 1}, {2, 3}, {4, 5}}|\[Cc\]annot.*)" \ + {p int1dim[0]@2@3} + gdb_test {p/x (short [])0x12345678} \ + " = ({0x1234, 0x5678}|{0x5678, 0x1234})" +} + +proc test_print_char_arrays {} { + global gdb_prompt + global hex + + gdb_test "set print elements 24" "" "" + gdb_test "set print address on" "" "" + + gdb_test "p arrays" \ + " = {array1 = \"abc\", array2 = \"d\", array3 = \"e\", array4 = \"fg\", array5 = \"hij\"}" + + gdb_test "p parrays" " = \\(struct some_arrays \\*\\) $hex" + gdb_test "p parrays->array1" " = \"abc\"" + gdb_test "p &parrays->array1" " = \\(unsigned char \\(\\*\\)\\\[4\\\]\\) $hex" + gdb_test "p parrays->array2" " = \"d\"" + gdb_test "p &parrays->array2" " = \\(unsigned char \\(\\*\\)\\\[1\\\]\\) $hex" + gdb_test "p parrays->array3" " = \"e\"" + gdb_test "p &parrays->array3" " = \\(unsigned char \\(\\*\\)\\\[1\\\]\\) $hex" + gdb_test "p parrays->array4" " = \"fg\"" + gdb_test "p &parrays->array4" " = \\(unsigned char \\(\\*\\)\\\[2\\\]\\) $hex" + gdb_test "p parrays->array5" " = \"hij\"" + gdb_test "p &parrays->array5" " = \\(unsigned char \\(\\*\\)\\\[4\\\]\\) $hex" + + gdb_test "set print address off" "" "" +} + +proc test_print_string_constants {} { + global gdb_prompt + + gdb_test "set print elements 50" "" "" + + if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + return + } + + setup_xfail "a29k-*-udi" 2416 + gdb_test "p \"a string\"" " = \"a string\"" + setup_xfail "a29k-*-udi" 2416 + gdb_test "p \"embedded \\000 null\"" " = \"embedded \\\\000 null\"" + setup_xfail "a29k-*-udi" 2416 + gdb_test "p \"abcd\"\[2\]" " = 99 'c'" + setup_xfail "a29k-*-udi" 2416 + gdb_test "p sizeof (\"abcdef\")" " = 7" + setup_xfail "a29k-*-udi" 2416 + gdb_test "ptype \"foo\"" " = char \\\[4\\\]" + setup_xfail "a29k-*-udi" 2416 + gdb_test "p *\"foo\"" " = 102 'f'" + setup_xfail "a29k-*-udi" 2416 + gdb_test "ptype *\"foo\"" " = char" + setup_xfail "a29k-*-udi" 2416 + gdb_test "p &*\"foo\"" " = \"foo\"" + setup_xfail "*-*-*" + gdb_test "ptype &*\"foo\"" "type = char \\*" + setup_xfail "a29k-*-udi" 2416 + gdb_test "p (char *)\"foo\"" " = \"foo\"" +} + +proc test_print_array_constants {} { + + if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + return + } + + setup_xfail "a29k-*-udi" 2416 + gdb_test "print {'a','b','c'}" " = \"abc\"" + setup_xfail "a29k-*-udi" 2416 + gdb_test "print {0,1,2}" " = {0, 1, 2}" + setup_xfail "a29k-*-udi" 2416 + gdb_test "print {(long)0,(long)1,(long)2}" " = {0, 1, 2}" + setup_xfail "a29k-*-udi" 2416 + gdb_test "print {{0,1,2},{3,4,5}}" " = {{0, 1, 2}, {3, 4, 5}}" + setup_xfail "a29k-*-udi" 2416 + gdb_test "print {4,5,6}\[2\]" " = 6" + setup_xfail "a29k-*-udi" 2416 + gdb_test "print *&{4,5,6}\[1\]" " = 5" +} + +proc test_printf {} { + gdb_test "printf \"x=%d,y=%d,z=%d\\n\", 5, 6, 7" "x=5,y=6,z=7" + gdb_test "printf \"string=%.4sxx\\n\", teststring" "string=testxx" + gdb_test "printf \"string=%sxx\\n\", teststring" \ + "string=teststring contentsxx" + + gdb_test "printf \"%f is fun\\n\", 1.0" "1\.0+ is fun" + + # Test mixing args of different sizes. + gdb_test "printf \"x=%d,y=%f,z=%d\\n\", 5, 6.0, 7" "x=5,y=6\.0+,z=7" + gdb_test "printf \"%x %f, %c %x, %x, %f\\n\", 0xbad, -99.541, 'z',\ +0xfeedface, 0xdeadbeef, 5.0" "bad -99.54\[0-9\]+, z feedface, deadbeef, 5.0+" +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +gdb_test "print \$pc" "No registers\\." +# FIXME: should also test "print $pc" when there is an execfile but no +# remote debugging target, process or corefile. + +gdb_load ${binfile} + +gdb_test "set print sevenbit-strings" "" +gdb_test "set print address off" "" "" +gdb_test "set width 0" "" + +if [set_lang_c] then { + gdb_test "p ctable1\[120\]" "120 'x'" "p ctable1\[120\] #1" + + if [runto_main] then { + test_integer_literals_accepted + test_integer_literals_rejected + test_character_literals_accepted + test_print_all_chars + test_print_repeats_10 + test_print_strings + test_print_int_arrays + test_artificial_arrays + test_print_char_arrays +# We used to do the runto main here. + test_print_string_constants + test_print_array_constants + test_printf + } +} else { + fail "C print command tests suppressed" +} diff --git a/gdb/testsuite/gdb.base/ptype.c b/gdb/testsuite/gdb.base/ptype.c new file mode 100644 index 00000000000..801343530eb --- /dev/null +++ b/gdb/testsuite/gdb.base/ptype.c @@ -0,0 +1,313 @@ +/* + * Test file with lots of different types, for testing the + * "ptype" command. + */ + +/* + * First the basic C types. + */ + +#if !defined (__STDC__) && !defined (_AIX) +#define signed /**/ +#endif + +char v_char; +signed char v_signed_char; +unsigned char v_unsigned_char; + +short v_short; +signed short v_signed_short; +unsigned short v_unsigned_short; + +int v_int; +signed int v_signed_int; +unsigned int v_unsigned_int; + +long v_long; +signed long v_signed_long; +unsigned long v_unsigned_long; + +float v_float; +double v_double; + +/* + * Now some derived types, which are arrays, functions-returning, + * pointers, structures, unions, and enumerations. + */ + +/**** arrays *******/ + +char v_char_array[2]; +signed char v_signed_char_array[2]; +unsigned char v_unsigned_char_array[2]; + +short v_short_array[2]; +signed short v_signed_short_array[2]; +unsigned short v_unsigned_short_array[2]; + +int v_int_array[2]; +signed int v_signed_int_array[2]; +unsigned int v_unsigned_int_array[2]; + +long v_long_array[2]; +signed long v_signed_long_array[2]; +unsigned long v_unsigned_long_array[2]; + +float v_float_array[2]; +double v_double_array[2]; + +/* PR 3742 */ +typedef char t_char_array[]; + +/**** pointers *******/ + +char *v_char_pointer; +signed char *v_signed_char_pointer; +unsigned char *v_unsigned_char_pointer; + +short *v_short_pointer; +signed short *v_signed_short_pointer; +unsigned short *v_unsigned_short_pointer; + +int *v_int_pointer; +signed int *v_signed_int_pointer; +unsigned int *v_unsigned_int_pointer; + +long *v_long_pointer; +signed long *v_signed_long_pointer; +unsigned long *v_unsigned_long_pointer; + +float *v_float_pointer; +double *v_double_pointer; + +/**** structs *******/ + +struct t_struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_struct1; + +struct t_struct *v_t_struct_p; + +struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_struct2; + +/* typedef'd struct without a tag. */ +typedef struct { + double v_double_member; + int v_int_member; +} t_struct3; +/* GCC seems to want a variable of this type, or else it won't put out + a symbol. */ +t_struct3 v_struct3; + +/**** unions *******/ + +union t_union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_union; + +union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_union2; + +/* typedef'd union without a tag. */ +typedef union { + double v_double_member; + int v_int_member; +} t_union3; +/* GCC seems to want a variable of this type, or else it won't put out + a symbol. */ +t_union3 v_union3; + +/*** Functions returning type ********/ + +char v_char_func () { return(0); } +signed char v_signed_char_func () { return (0); } +unsigned char v_unsigned_char_func () { return (0); } + +short v_short_func () { return (0); } +signed short v_signed_short_func () { return (0); } +unsigned short v_unsigned_short_func () { return (0); } + +int v_int_func () { return (0); } +signed int v_signed_int_func () { return (0); } +unsigned int v_unsigned_int_func () { return (0); } + +long v_long_func () { return (0); } +signed long v_signed_long_func () { return (0); } +unsigned long v_unsigned_long_func () { return (0); } + +float v_float_func () { return (0.0); } +double v_double_func () { return (0.0); } + +/**** Some misc more complicated things *******/ + +struct link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *this, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} *s_link; + +union tu_link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *this, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} u_link; + +struct outer_struct { + int outer_int; + struct inner_struct { + int inner_int; + long inner_long; + }inner_struct_instance; + union inner_union { + int inner_union_int; + long inner_union_long; + }inner_union_instance; + long outer_long; +} nested_su; + +/**** Enumerations *******/ + +enum +/* Work around the bug for compilers which don't put out the right stabs. */ +#if __GNUC__ < 2 && !defined (_AIX) +primary1_tag +#endif +{red1, green1, blue1} primary1; + +enum {red, green, blue} primary; +enum colors {yellow, purple, pink} nonprimary; + +enum {chevy, ford} clunker; +enum cars {bmw, porsche} sportscar; + +typedef enum {FALSE, TRUE} boolean; +boolean v_boolean; +typedef enum bvals {false, true} boolean2; +boolean2 v_boolean2; + +enum misordered {two = 2, one = 1, zero = 0, three = 3}; + +/***********/ + +main () +{ + /* Ensure that malloc is a pointer type; avoid use of "void" and any include files. */ + extern char *malloc(); + + /* Seems like we need a variable of this type to get the type to be put + in the executable, at least for AIX xlc. */ + enum misordered v_misordered = three; + + /* Some of the tests in ptype.exp require invoking malloc, so make + sure it is linked in to this program. */ + v_char_pointer = (char *) malloc (1); + +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + /* Some linkers (e.g. on AIX) remove unreferenced variables, + so make sure to reference them. */ + primary = blue; + primary1 = blue1; + nonprimary = pink; + sportscar = porsche; + clunker = ford; + v_struct1.v_int_member = 5; + v_struct2.v_int_member = 6; + v_struct3.v_int_member = 7; + + v_char = 0; + v_signed_char = 0; + v_unsigned_char = 0; + + v_short = 0; + v_signed_short = 0; + v_unsigned_short = 0; + + v_int = 0; + v_signed_int = 0; + v_unsigned_int = 0; + + v_long = 0; + v_signed_long = 0; + v_unsigned_long = 0; + + v_float = 0; + v_double = 0; + + v_char_array[0] = 0; + v_signed_char_array[0] = 0; + v_unsigned_char_array[0] = 0; + + v_short_array[0] = 0; + v_signed_short_array[0] = 0; + v_unsigned_short_array[0] = 0; + + v_int_array[0] = 0; + v_signed_int_array[0] = 0; + v_unsigned_int_array[0] = 0; + + v_long_array[0] = 0; + v_signed_long_array[0] = 0; + v_unsigned_long_array[0] = 0; + + v_float_array[0] = 0; + v_double_array[0] = 0; + + v_char_pointer = 0; + v_signed_char_pointer = 0; + v_unsigned_char_pointer = 0; + + v_short_pointer = 0; + v_signed_short_pointer = 0; + v_unsigned_short_pointer = 0; + + v_int_pointer = 0; + v_signed_int_pointer = 0; + v_unsigned_int_pointer = 0; + + v_long_pointer = 0; + v_signed_long_pointer = 0; + v_unsigned_long_pointer = 0; + + v_float_pointer = 0; + v_double_pointer = 0; + + nested_su.outer_int = 0; + v_t_struct_p = 0; + + v_boolean = FALSE; + v_boolean2 = false; +} diff --git a/gdb/testsuite/gdb.base/ptype.exp b/gdb/testsuite/gdb.base/ptype.exp new file mode 100644 index 00000000000..1ef677150e8 --- /dev/null +++ b/gdb/testsuite/gdb.base/ptype.exp @@ -0,0 +1,532 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1994, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "ptype" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# Test ptype of unnamed enumeration members before any action causes +# the partial symbol table to be expanded to full symbols. This fails +# with stabs compilers which fail to use a nameless stab (such as +# pre-2.4.5 versions of gcc and most non-gcc compilers). + +send_gdb "ptype red1\n" +gdb_expect { + -re "type = enum primary1_tag \{red1, green1, blue1\}.*$gdb_prompt $"\ + { + # The workaround is in effect. As this is a compiler, not GDB, + # bug, we'll make it a PASS but perhaps it should be an XFAIL. + pass "ptype unnamed enumeration member (worked around)" + } + -re "type = enum \{red1, green1, blue1\}.*$gdb_prompt $"\ + { pass "ptype unnamed enumeration member" } + -re ".*$gdb_prompt $" { fail "ptype unnamed enumeration member" } + timeout { fail "(timeout) ptype unnamed enumeration member" } +} + +# +# test ptype command with structures +# +# Here and elsewhere, we accept +# "long", "long int", or "int" for long variables (whatis.exp already +# has an XFAIL for "int" (Sun cc bug), so no need to fail it here). +gdb_test "ptype struct t_struct" "type = struct t_struct \{.*\[\r\n\] (unsigned |)char v_char_member;.*\[\r\n\] (short|short int) v_short_member;.*\[\r\n\] int v_int_member;.*\[\r\n\] (long|long int|int) v_long_member;.*\[\r\n\] float v_float_member;.*\[\r\n\] double v_double_member;.*\[\r\n\]\}.*" "ptype structure" + + +# Test the equivalence between '.' and '->' for struct member references. + +if [gdb_test "ptype v_struct1.v_float_member" "type = float"]<0 then { + return -1 +} +if [gdb_test "ptype v_struct1->v_float_member" "type = float"]<0 then { + return -1 +} +if [gdb_test "ptype v_t_struct_p.v_float_member" "type = float"]<0 then { + return -1 +} +if [gdb_test "ptype v_t_struct_p->v_float_member" "type = float"]<0 then { + return -1 +} + + +# IBM's xlc puts out bogus stabs--the stuff field is type 42, +# which isn't defined. + +gdb_test "ptype struct link" "type = struct link \{.*\[\r\n\] struct link \[*\]next;.*\[\r\n\] struct link \[*(\]+linkfunc\[)(\]+(struct link \[*\], int\[)\]|);.*\[\r\n\] struct t_struct stuff.1..2..3.;.*\[\r\n\]\}.*" "ptype linked list structure" + +# +# test ptype command with unions +# +gdb_test "ptype union t_union" "type = union t_union \{.*\[\r\n\] (unsigned |)char v_char_member;.*\[\r\n\] (short|short int) v_short_member;.*\[\r\n\] int v_int_member;.*\[\r\n\] (long|long int|int) v_long_member;.*\[\r\n\] float v_float_member;.*\[\r\n\] double v_double_member;.*\[\r\n\]\}.*" "ptype union" + +# IBM's xlc puts out bogus stabs--the stuff field is type 42, +# which isn't defined. +gdb_test "ptype union tu_link" "type = union tu_link .*\[\r\n\] struct link \[*\]next;.*\[\r\n\] struct link \[(\*\]+linkfunc\[)(\]+(struct link \[*\], int\[)\]|);.*\[\r\n\] struct t_struct stuff.1..2..3.;.*\[\r\n\]\}.*" "ptype linked list union" + +# +# test ptype command with enums +# + +gdb_test "ptype primary" "type = enum .red, green, blue.*" "ptype unnamed enumeration" + +gdb_test "ptype enum colors" "type = enum colors \{yellow, purple, pink\}.*" "ptype named enumeration" + + +# +# test ptype command with enums as typedef +# +gdb_test "ptype boolean" "type = enum \{FALSE, TRUE\}.*" "ptype unnamed typedef'd enumeration" + +# And check that whatis shows the name, not "enum {...}". +# This probably fails for all DWARF 1 cases, so assume so for now. -fnf +# The problem with xlc is that the stabs look like +# :t51=eFALSE:0,TRUE:1,; +# boolean:t55=51 +# v_boolean:G51 +# GDB's behavior is correct; the type which the variable is defined +# as (51) doesn't have a name. Only 55 has a name. + +if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "i*86-*-sysv4*" } +setup_xfail_format "DWARF 1" +gdb_test "whatis v_boolean" "type = boolean" \ + "whatis unnamed typedef'd enum (compiler bug in IBM's xlc)" + +# Same thing with struct and union. +gdb_test "ptype t_struct3" "type = struct \{.* + *double v_double_member;.* + *int v_int_member;.*\}" "printing typedef'd struct" + +gdb_test "ptype t_union3" "type = union \{.* + *double v_double_member;.* + *int v_int_member;.*\}" "printing typedef'd union" + +gdb_test "ptype enum bvals" "type = enum bvals \{false, true\}.*" "ptype named typedef'd enumf'd enum" + +# +# test ptype command with out-of-order enum values +# +gdb_test "ptype enum misordered" "type = enum misordered \{two = 2, one = 1, zero = 0, three = 3\}.*" "ptype misordered enumeration" + +# +# test ptype command with a named enum's value +# +gdb_test "ptype three" "type = enum misordered \{two = 2, one = 1, zero = 0, three = 3\}.*" "ptype named enumeration member" + +gdb_test "ptype red" "type = enum \{red, green, blue\}.*" "ptype unnamed enumeration member #2" + +# +# test ptype command with basic C types +# +# I've commented most of this out because it duplicates tests in whatis.exp. +# I've just left in a token test or 2 which is designed to test that ptype +# acts like whatis for basic types. If it is thought to be necessary to +# test both whatis and ptype for all the types, the tests should be +# merged into whatis.exp, or else maintenance will be a royal pain -kingdon +#setup_xfail "i960-*-*" 1821 +#setup_xfail "mips-idt-*" "mips-sgi-*" "a29k-*-*" +#send "ptype v_char\n" +#gdb_expect { +# -re "type = char.*$gdb_prompt $" { pass "ptype char" } +# -re ".*$gdb_prompt $" { fail "ptype char" } +# timeout { fail "(timeout) ptype char" } +#} +# +# +#setup_xfail "mips-*-*" "a29k-*-*" +#send "ptype v_signed_char\n" +#gdb_expect { +# -re "type = signed char.*$gdb_prompt $" { pass "ptype signed char" } +# -re ".*$gdb_prompt $" { fail "ptype signed char" } +# timeout { fail "(timeout) ptype signed char" } +#} +# +# +#send "ptype v_unsigned_char\n" +#gdb_expect { +# -re "type = unsigned char.*$gdb_prompt $" { pass "ptype unsigned char" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned char" } +# timeout { fail "(timeout) ptype unsigned char" } +#} + +gdb_test "ptype v_short" "type = short(| int).*" "ptype short" + +#send "ptype v_signed_short\n" +#gdb_expect { +# -re "type = short.*$gdb_prompt $" { pass "ptype signed short" } +# -re ".*$gdb_prompt $" { fail "ptype signed short" } +# timeout { fail "(timeout) ptype signed short" } +#} +# +# +#send "ptype v_unsigned_short\n" +#gdb_expect { +# -re "type = unsigned short.*$gdb_prompt $" { pass "ptype unsigned short" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned short" } +# timeout { fail "(timeout) ptype unsigned short" } +#} + + +gdb_test "ptype v_int" "type = int.*" "ptype int" + +#send "ptype v_signed_int\n" +#gdb_expect { +# -re "type = int.*$gdb_prompt $" { pass "ptype signed int" } +# -re ".*$gdb_prompt $" { fail "ptype signed int" } +# timeout { fail "(timeout) ptype signed int" } +#} +# +# +#send "ptype v_unsigned_int\n" +#gdb_expect { +# -re "type = unsigned int.*$gdb_prompt $" { pass "ptype unsigned int" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned int" } +# timeout { fail "(timeout) ptype unsigned int" } +#} +# +# +#send "ptype v_long\n" +#gdb_expect { +# -re "type = long.*$gdb_prompt $" { pass "ptype long" } +# -re ".*$gdb_prompt $" { fail "ptype long" } +# timeout { fail "(timeout) ptype long" } +#} +# +# +#send "ptype v_signed_long\n" +#gdb_expect { +# -re "type = long.*$gdb_prompt $" { pass "ptype signed long" } +# -re ".*$gdb_prompt $" { fail "ptype signed long" } +# timeout { fail "(timeout) ptype signed long" } +#} +# +# +#send "ptype v_unsigned_long\n" +#gdb_expect { +# -re "type = unsigned long.*$gdb_prompt $" { pass "ptype unsigned long" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned long" } +# timeout { fail "(timeout) ptype unsigned long" } +#} +# +# +#send "ptype v_float\n" +#gdb_expect { +# -re "type = float.*$gdb_prompt $" { pass "ptype float" } +# -re ".*$gdb_prompt $" { fail "ptype float" } +# timeout { fail "(timeout) ptype float" } +#} +# +# +#send "ptype v_double\n" +#gdb_expect { +# -re "type = double.*$gdb_prompt $" { pass "ptype double" } +# -re ".*$gdb_prompt $" { fail "ptype double" } +# timeout { fail "(timeout) ptype double" } +#} + + +# +# test ptype command with arrays +# +#setup_xfail "i960-*-*" 1821 +#setup_xfail "mips-idt-*" "mips-sgi-*" "a29k-*-*" +#send "ptype v_char_array\n" +#gdb_expect { +# -re "type = char .2..*$gdb_prompt $" { pass "ptype char array" } +# -re ".*$gdb_prompt $" { fail "ptype char array" } +# timeout { fail "(timeout) ptype char array" } +#} +# +# +#setup_xfail "mips-*-*" "a29k-*-*" +#send "ptype v_signed_char_array\n" +#gdb_expect { +# -re "type = (|signed )char .2..*$gdb_prompt $" { pass "ptype signed char array" } +# -re ".*$gdb_prompt $" { fail "ptype signed char array" } +# timeout { fail "(timeout) ptype signed char array" } +#} +# +# +#send "ptype v_unsigned_char_array\n" +#gdb_expect { +# -re "type = unsigned char .2..*$gdb_prompt $" { pass "ptype unsigned char array" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned char array" } +# timeout { fail "(timeout) ptype unsigned char array" } +#} +# +# +# +#send "ptype v_int_array\n" +#gdb_expect { +# -re "type = int .2..*$gdb_prompt $" { pass "ptype int array" } +# -re ".*$gdb_prompt $" { fail "ptype int array" } +# timeout { fail "(timeout) ptype int array" } +#} +# +# +#send "ptype v_signed_int_array\n" +#gdb_expect { +# -re "type = int .2..*$gdb_prompt $" { pass "ptype signed int array" } +# -re ".*$gdb_prompt $" { fail "ptype signed int array" } +# timeout { fail "(timeout) ptype signed int array" } +#} +# +# +#send "ptype v_unsigned_int_array\n" +#gdb_expect { +# -re "type = unsigned int .2..*$gdb_prompt $" { pass "ptype unsigned int array" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned int array" } +# timeout { fail "(timeout) ptype unsigned int array" } +#} +# +# +#send "ptype v_long_array\n" +#gdb_expect { +# -re "type = (long|int|long int) .2..*$gdb_prompt $" { +# pass "ptype long array" } +# -re ".*$gdb_prompt $" { fail "ptype long array" } +# timeout { fail "(timeout) ptype long array" } +#} +# +# +#send "ptype v_signed_long_array\n" +#gdb_expect { +# -re "type = (long|int|long int) .2..*$gdb_prompt $" { +# pass "ptype signed long array" } +# -re ".*$gdb_prompt $" { fail "ptype signed long array" } +# timeout { fail "(timeout) ptype signed long array" } +#} +# +# +#send "ptype v_unsigned_long_array\n" +#gdb_expect { +# -re "type = unsigned long .2..*$gdb_prompt $" { pass "ptype unsigned long array" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned long array" } +# timeout { fail "(timeout) ptype unsigned long array" } +#} +# +# +#send "ptype v_float_array\n" +#gdb_expect { +# -re "type = float .2..*$gdb_prompt $" { pass "ptype float array" } +# -re ".*$gdb_prompt $" { fail "ptype float array" } +# timeout { fail "(timeout) ptype float array" } +#} +# +# +#send "ptype v_double_array\n" +#gdb_expect { +# -re "type = double .2..*$gdb_prompt $" { pass "ptype double array" } +# -re ".*$gdb_prompt $" { fail "ptype double array" } +# timeout { fail "(timeout) ptype double array" } +#} +# + +if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "i*86-*-sysv4*" } +setup_xfail_format "DWARF 1" +gdb_test "ptype t_char_array" "type = (|unsigned )char \\\[0?\\\]" + +# +## +## test ptype command with pointers +## +#setup_xfail "i960-*-*" 1821 +#setup_xfail "mips-idt-*" "mips-sgi-*" "a29k-*-*" +#send "ptype v_char_pointer\n" +#gdb_expect { +# -re "type = char \*.*$gdb_prompt $" { pass "ptype char pointer" } +# -re ".*$gdb_prompt $" { fail "ptype char pointer" } +# timeout { fail "(timeout) ptype char pointer" } +#} +# +# +#setup_xfail "mips-*-*" "a29k-*-*" +#send "ptype v_signed_char_pointer\n" +#gdb_expect { +# -re "type = (|signed )char \*.*$gdb_prompt $" +# { pass "ptype signed char pointer" } +# -re ".*$gdb_prompt $" { fail "ptype signed char pointer" } +# timeout { fail "(timeout) ptype signed char pointer" } +#} +# +# +#send "ptype v_unsigned_char_pointer\n" +#gdb_expect { +# -re "type = unsigned char \*.*$gdb_prompt $" { pass "ptype unsigned char pointer" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned char pointer" } +# timeout { fail "(timeout) ptype unsigned char pointer" } +#} +# +# +#send "ptype v_short_pointer\n" +#gdb_expect { +# -re "type = (short|short int) \*.*$gdb_prompt $" { pass "ptype short pointer" } +# -re ".*$gdb_prompt $" { fail "ptype short pointer" } +# timeout { fail "(timeout) ptype short pointer" } +#} +# +# +#send "ptype v_signed_short_pointer\n" +#gdb_expect { +# -re "type = short \*.*$gdb_prompt $" { pass "ptype signed short pointer" } +# -re ".*$gdb_prompt $" { fail "ptype signed short pointer" } +# timeout { fail "(timeout) ptype signed short pointer" } +#} +# +# +#send "ptype v_unsigned_short_pointer\n" +#gdb_expect { +# -re "type = unsigned short \*.*$gdb_prompt $" { pass "ptype unsigned short pointer" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned short pointer" } +# timeout { fail "(timeout) ptype unsigned short pointer" } +#} +# +# +#send "ptype v_int_pointer\n" +#gdb_expect { +# -re "type = int \*.*$gdb_prompt $" { pass "ptype int pointer" } +# -re ".*$gdb_prompt $" { fail "ptype int pointer" } +# timeout { fail "(timeout) ptype int pointer" } +#} +# +# +#send "ptype v_signed_int_pointer\n" +#gdb_expect { +# -re "type = int \*.*$gdb_prompt $" { pass "ptype signed int pointer" } +# -re ".*$gdb_prompt $" { fail "ptype signed int pointer" } +# timeout { fail "(timeout) ptype signed int pointer" } +#} +# +# +#send "ptype v_unsigned_int_pointer\n" +#gdb_expect { +# -re "type = unsigned int \*.*$gdb_prompt $" { pass "ptype unsigned int pointer" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned int pointer" } +# timeout { fail "(timeout) ptype unsigned int pointer" } +#} +# +# +#send "ptype v_long_pointer\n" +#gdb_expect { +# -re "type = long \*.*$gdb_prompt $" { pass "ptype long pointer" } +# -re ".*$gdb_prompt $" { fail "ptype long pointer" } +# timeout { fail "(timeout) ptype long pointer" } +#} +# +# +#send "ptype v_signed_long_pointer\n" +#gdb_expect { +# -re "type = long \*.*$gdb_prompt $" { pass "ptype signed long pointer" } +# -re ".*$gdb_prompt $" { fail "ptype signed long pointer" } +# timeout { fail "(timeout) ptype signed long pointer" } +#} +# +# +#send "ptype v_unsigned_long_pointer\n" +#gdb_expect { +# -re "type = unsigned long \*.*$gdb_prompt $" { pass "ptype unsigned long pointer" } +# -re ".*$gdb_prompt $" { fail "ptype unsigned long pointer" } +# timeout { fail "(timeout) ptype unsigned long pointer" } +#} +# +# +#send "ptype v_float_pointer\n" +#gdb_expect { +# -re "type = float \*.*$gdb_prompt $" { pass "ptype float pointer" } +# -re ".*$gdb_prompt $" { fail "ptype float pointer" } +# timeout { fail "(timeout) ptype float pointer" } +#} +# +# +#send "ptype v_double_pointer\n" +#gdb_expect { +# -re "type = double \*.*$gdb_prompt $" { pass "ptype double pointer" } +# -re ".*$gdb_prompt $" { fail "ptype double pointer" } +# timeout { fail "(timeout) ptype double pointer" } +#} + +# +# test ptype command with nested structure and union +# +gdb_test "ptype struct outer_struct" "type = struct outer_struct \{.*\[\r\n\] int outer_int;.*\[\r\n\] struct inner_struct inner_struct_instance;.*\[\r\n\] union inner_union inner_union_instance;.*\[\r\n\] (long|long int|int) outer_long;.*\[\r\n\]\}.*" "ptype outer structure" + +gdb_test "ptype struct inner_struct" "type = struct inner_struct \{.*\[\r\n\] int inner_int;.*\[\r\n\] (long|long int|int) inner_long;.*\[\r\n\]\}.*" "ptype inner structure" + +gdb_test "ptype union inner_union" "type = union inner_union \{.*\[\r\n\] int inner_union_int;.*\[\r\n\] (long|long int|int) inner_union_long;.*\[\r\n\]\}.*" "ptype inner union" + +gdb_test "ptype nested_su" "type = struct outer_struct \{.*\[\r\n\] int outer_int;.*\[\r\n\] struct inner_struct inner_struct_instance;.*\[\r\n\] union inner_union inner_union_instance;.*\[\r\n\] (long|long int|int) outer_long;.*\[\r\n\]\}.*" "ptype nested structure" + +gdb_test "ptype nested_su.outer_int" "type = int.*" "ptype outer int" + +gdb_test "ptype nested_su.inner_struct_instance" "type = struct inner_struct \{.*\[\r\n\] int inner_int;.*\[\r\n\] (long|long int|int) inner_long;.*\[\r\n\]\}.*" "ptype nested structure #2" + +gdb_test "ptype nested_su.inner_struct_instance.inner_int" "type = int.*" "ptype inner int" + +gdb_test "ptype nested_su.inner_union_instance" "type = union inner_union \{.*\[\r\n\] int inner_union_int;.*\[\r\n\] (long|long int|int) inner_union_long;.*\[\r\n\]\}.*" "ptype nested union" + +# Test printing type of string constants and array constants, but +# requires a running process. These call malloc, and can take a long +# time to execute over a slow serial link, so increase the timeout. + +# UDI can't do this (PR 2416). XFAIL is not suitable, because attempting +# the operation causes a slow painful death rather than a nice simple failure. + +if [runto_main] then { + + get_debug_format + if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + continue + } + + gdb_test "ptype \"abc\"" "type = char \\\[4\\\]" + gdb_test "ptype {'a','b','c'}" "type = char \\\[3\\\]" + gdb_test "ptype {0,1,2}" "type = int \\\[3\\\]" + gdb_test "ptype {(long)0,(long)1,(long)2}" "type = long \\\[3\\\]" + gdb_test "ptype {(float)0,(float)1,(float)2}" "type = float \\\[3\\\]" + gdb_test "ptype {{0,1,2},{3,4,5}}" "type = int \\\[2\\\]\\\[3\\\]" + gdb_test "ptype {4,5,6}\[2\]" "type = int" + gdb_test "ptype *&{4,5,6}\[1\]" "type = int" +} diff --git a/gdb/testsuite/gdb.base/radix.exp b/gdb/testsuite/gdb.base/radix.exp new file mode 100644 index 00000000000..f81bde2b728 --- /dev/null +++ b/gdb/testsuite/gdb.base/radix.exp @@ -0,0 +1,201 @@ +# Copyright (C) 1993, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +proc test_input_radix_2 {} { + gdb_test "set radix" \ + "Input and output radices now set to decimal 10, hex a, octal 12." \ + "set radix #1" + gdb_test "set input-radix 2" \ + "Input radix now set to decimal 2, hex 2, octal 2." + gdb_test "show radix" \ + "Input radix set to decimal 2, hex 2, octal 2.\r\nOutput radix set to decimal 10, hex a, octal 12." \ + "show radix #1" + gdb_test "p 010" "8" + gdb_test "p 20." "20" + gdb_test "p (int) 20." "20" + gdb_test "p 0xf" "15" + gdb_test "p 10" "2" + gdb_test "p -101" "-5" + gdb_test "p 101" "5" + gdb_test "p 10101" "21" + gdb_test "p 4" "Invalid number \"4\"\\." + gdb_test "p -2" "Invalid number \"2\"\\." +} + +# Test input radix 3 (an non-typical radix) + +proc test_input_radix_3 {} { + gdb_test "set radix" \ + "Input and output radices now set to decimal 10, hex a, octal 12." \ + "set radix #2" + gdb_test "set input-radix 3" \ + "Input radix now set to decimal 3, hex 3, octal 3." + gdb_test "show radix" \ + "Input radix set to decimal 3, hex 3, octal 3.\r\nOutput radix set to decimal 10, hex a, octal 12." \ + "show radix #2" + gdb_test "p 010" "8" + gdb_test "p 20." "20" + gdb_test "p (int) 20." "20" + gdb_test "p 0xf" "15" + gdb_test "p 10" "3" + gdb_test "p 0" "0" + gdb_test "p 1" "1" + gdb_test "p 2" "2" + gdb_test "p 10" "3" + gdb_test "p 20" "6" + gdb_test "p 100" "9" + gdb_test "p -100" "-9" + gdb_test "p 3" "Invalid number \"3\"." + gdb_test "p 30" "Invalid number \"30\"." +} + +proc test_input_radix_8 {} { + gdb_test "set radix" \ + "Input and output radices now set to decimal 10, hex a, octal 12." \ + "set radix #3" + gdb_test "set input-radix 8" \ + "Input radix now set to decimal 8, hex 8, octal 10." + gdb_test "show radix" \ + "Input radix set to decimal 8, hex 8, octal 10.\r\nOutput radix set to decimal 10, hex a, octal 12." \ + "set radix #3" + gdb_test "p 010" "8" + gdb_test "p 20." "20" + gdb_test "p (int) 20." "20" + gdb_test "p 0xf" "15" + gdb_test "p 10" "8" + gdb_test "p 20" "16" + gdb_test "p -20" "-16" + gdb_test "p 100" "64" + gdb_test "p 8" "Invalid number \"8\"." + gdb_test "p -9" "Invalid number \"9\"." +} + +proc test_input_radix_10 {} { + gdb_test "set radix" \ + "Input and output radices now set to decimal 10, hex a, octal 12." \ + "set radix #4" + gdb_test "set input-radix 10" \ + "Input radix now set to decimal 10, hex a, octal 12." + gdb_test "show radix" \ + "Input and output radices set to decimal 10, hex a, octal 12." \ + "show radix #4" + gdb_test "p 010" "8" + gdb_test "p 20." "20" + gdb_test "p (int) 20." "20" + gdb_test "p 0xf" "15" + gdb_test "p 10" "10" + gdb_test "p -12" "-12" +} + +proc test_input_radix_16 {} { + gdb_test "set radix" \ + "Input and output radices now set to decimal 10, hex a, octal 12." \ + "set radix #5" + gdb_test "set input-radix 16" \ + "Input radix now set to decimal 16, hex 10, octal 20." + gdb_test "show radix" \ + "Input radix set to decimal 16, hex 10, octal 20.\r\nOutput radix set to decimal 10, hex a, octal 12." \ + "show radix #5" + gdb_test "p 010" "8" + gdb_test "p 20." "20" + gdb_test "p (int) 20." "20" + gdb_test "p 0xf" "15" + gdb_test "p 10" "16" + gdb_test "p 100" "256" +} + +proc test_output_radix_8 {} { + gdb_test "set radix" \ + "Input and output radices now set to decimal 10, hex a, octal 12." \ + "set radix #6" + gdb_test "set output-radix 8" \ + "Output radix now set to decimal 8, hex 8, octal 10." + gdb_test "show radix" \ + "Input radix set to decimal 10, hex a, octal 12.\r\nOutput radix set to decimal 8, hex 8, octal 10." \ + "show radix #6" + gdb_test "p 010" "010" + # FIXME: If gdb can't handle float printing in different radices, it + # should at least warn once the first time that is attempted. + setup_xfail "*-*-*" + gdb_test "p 20." "24" "Float printing when output radix is 8" + gdb_test "p (int) 20." "24" + gdb_test "p 0xf" "17" + gdb_test "p 10" "12" + gdb_test "p 100" "144" +} + +proc test_output_radix_10 {} { + gdb_test "set radix" \ + "Input and output radices now set to decimal 10, hex a, octal 12." \ + "set radix #7" + gdb_test "set output-radix 10" \ + "Output radix now set to decimal 10, hex a, octal 12." + gdb_test "show radix" \ + "Input and output radices set to decimal 10, hex a, octal 12." \ + "show radix #7" + gdb_test "p 010" "8" + gdb_test "p 20." "20" + gdb_test "p (int) 20." "20" + gdb_test "p 0xf" "15" + gdb_test "p 10" "10" + gdb_test "p 100" "100" +} + +proc test_output_radix_16 {} { + gdb_test "set radix" \ + "Input and output radices now set to decimal 10, hex a, octal 12." \ + "set radix #8" + gdb_test "set output-radix 16" \ + "Output radix now set to decimal 16, hex 10, octal 20." + gdb_test "show radix" \ + "Input radix set to decimal 10, hex a, octal 12.\r\nOutput radix set to decimal 16, hex 10, octal 20." \ + "show radix #8" + gdb_test "p 010" "8" + # FIXME: If gdb can't handle float printing in different radices, it + # should at least warn once the first time that is attempted. + setup_xfail "*-*-*" + gdb_test "p 20." "14" "Float printing when output radix is 16" + gdb_test "p (int) 20." "14" + gdb_test "p 0xf" "f" + gdb_test "p 10" "a" + gdb_test "p 100" "64" +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start + +test_input_radix_2 +test_input_radix_3 +test_input_radix_8 +test_input_radix_10 +test_input_radix_16 +test_output_radix_8 +test_output_radix_10 +test_output_radix_16 diff --git a/gdb/testsuite/gdb.base/recurse.c b/gdb/testsuite/gdb.base/recurse.c new file mode 100644 index 00000000000..1d6892d0f69 --- /dev/null +++ b/gdb/testsuite/gdb.base/recurse.c @@ -0,0 +1,25 @@ +/* Trivial code used to test watchpoints in recursive code and + auto-deletion of watchpoints as they go out of scope. */ + +static int +recurse (a) + int a; +{ + int b = 0; + + if (a == 1) + return 1; + + b = a; + b *= recurse (a - 1); + return b; +} + +main() +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + recurse (10); +} diff --git a/gdb/testsuite/gdb.base/recurse.exp b/gdb/testsuite/gdb.base/recurse.exp new file mode 100644 index 00000000000..88e1b30ee96 --- /dev/null +++ b/gdb/testsuite/gdb.base/recurse.exp @@ -0,0 +1,145 @@ +# Copyright (C) 1992, 1996, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Jeff Law. (law@cs.utah.edu) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "recurse" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +proc recurse_tests {} { + + if [runto recurse] then { + # First we need to step over the assignment of b, so it has a known + # value. + gdb_test "next" "if \\(a == 1\\)" "next over b = 0 in first instance" + gdb_test "watch b" ".*\[Ww\]atchpoint \[0-9]*: b" \ + "set first instance watchpoint" + + # Continue until initial set of b. + if [gdb_test "continue" \ + "Continuing.*\[Ww\]atchpoint.*: b.*Old value = 0.*New value = 10.*" \ + "continue to first instance watchpoint, first time"] then { + gdb_suppress_tests; + } + + # Continue inward for a few iterations + gdb_test "continue" "Breakpoint.* recurse \\(a=9\\).*" \ + "continue to recurse (a = 9)" + gdb_test "continue" "Breakpoint.* recurse \\(a=8\\).*" \ + "continue to recurse (a = 8)" + gdb_test "continue" "Breakpoint.* recurse \\(a=7\\).*" \ + "continue to recurse (a = 7)" + gdb_test "continue" "Breakpoint.* recurse \\(a=6\\).*" \ + "continue to recurse (a = 6)" + gdb_test "continue" "Breakpoint.* recurse \\(a=5\\).*" \ + "continue to recurse (a = 5)" + + # Put a watchpoint on another instance of b + # First we need to step over the assignment of b, so it has a known + # value. + gdb_test "next" "if \\(a == 1\\)" "next over b = 0 in second instance" + gdb_test "watch b" ".*\[Ww\]atchpoint \[0-9]*: b" \ + "set second instance watchpoint" + + # Continue until initial set of b (second instance). + if [gdb_test "continue" \ + "Continuing.*\[Ww\]atchpoint.*: b.*Old value = 0.*New value = 5.*"\ + "continue to second instance watchpoint, first time"] then { + gdb_suppress_tests; + } + + # Continue inward for a few iterations + gdb_test "continue" "Breakpoint.* recurse \\(a=4\\).*" \ + "continue to recurse (a = 4)" + gdb_test "continue" "Breakpoint.* recurse \\(a=3\\).*" \ + "continue to recurse (a = 3)" + gdb_test "continue" "Breakpoint.* recurse \\(a=2\\).*" \ + "continue to recurse (a = 2)" + gdb_test "continue" "Breakpoint.* recurse \\(a=1\\).*" \ + "continue to recurse (a = 1)" + + # Continue until second set of b (second instance). + if [gdb_test "continue" \ + "Continuing.*\[Ww\]atchpoint.*: b.*Old value = 5.*New value = 120.*return.*" \ + "continue to second instance watchpoint, second time"] then { + gdb_suppress_tests; + } + + # Continue again. We should have a watchpoint go out of scope now + if [gdb_test "continue" \ + "Continuing.*\[Ww\]atchpoint.*deleted.*recurse \\(a=6\\) .*" \ + "second instance watchpoint deleted when leaving scope"] then { + gdb_suppress_tests; + } + + # Continue until second set of b (first instance). + # 24320 is allowed as the final value for b as that's the value + # b would have on systems with 16bit integers. + # + # We could fix the test program to deal with this too. + if [gdb_test "continue" \ + "Continuing.*\[Ww\]atchpoint.*b.*Old value = 10.*New value = \(3628800|24320\).*return.*" \ + "continue to first instance watchpoint, second time"] then { + gdb_suppress_tests + } + + # Continue again. We should have a watchpoint go out of scope now + if [gdb_test "continue" \ + "Continuing.*\[Ww\]atchpoint.*deleted.*main \\(\\) .*" \ + "first instance watchpoint deleted when leaving scope"] then { + gdb_suppress_tests; + } + } + gdb_stop_suppressing_tests; +} + +# Only enabled for some targets merely because it has not been tested +# elsewhere. +if {[istarget "sparc*-*-sunos4*"] || [istarget "hppa*-*-bsd*"] || [istarget "hppa*-*-hpux*"] || [istarget "sparclet-*-*"] || [istarget "m32r-*-elf"] || [istarget "mn10200-*-*"] || [istarget "mn10300-*-*"]} then { + + # Preserve the old timeout, and set a new one that should be + # sufficient to avoid timing out during this test. + set oldtimeout $timeout + set timeout [expr "$timeout + 60"] + verbose "Timeout is now $timeout seconds" 2 + + recurse_tests + + # Restore the preserved old timeout value. + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 +} diff --git a/gdb/testsuite/gdb.base/regs.exp b/gdb/testsuite/gdb.base/regs.exp new file mode 100644 index 00000000000..548b9354715 --- /dev/null +++ b/gdb/testsuite/gdb.base/regs.exp @@ -0,0 +1,86 @@ +# Tests of register displays for GDB. +# Copyright 1994, 1995, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Stan Shebs. (shebs@cygnus.com) + +# This does not (yet) have an associated executable, since the IDT board +# will display registers even without a program being loaded. +# A more comprehensive register test would actually test reading +# and writing of registers in a real program, although some care +# would be required in the writing of the tests. + +if $tracelevel then { + strace $tracelevel + } + +# These tests exercise IDT-specific MIPS registers for several +# different processor models. + +# This should detect the actual processor in use and change +# the expected results appropriately. FIXME + +proc idt_register_tests { } { + # Test the generic IDT chip. + gdb_test "info registers" ".*" + gdb_test "info register zero" "zero(r0): 0x0;" + # FIXME access each generic register individually + # Test the 3041. + gdb_test "set processor r3041" ".*" + gdb_test "info registers" ".*" + gdb_test "info register bus" "bus.*0x.*" + gdb_test "info register ccfg" "ccfg.*0x.*" + gdb_test "info register port" "port.*0x.*" + gdb_test "info register cmp" "cmp.*0x.*" + gdb_test "info register elo" "elo: invalid register" + gdb_test "info register ehi" "ehi: invalid register" + gdb_test "info register cfg" "cfg: invalid register" + gdb_test "info register ctxt" "ctxt: invalid register" + # Test the 3051. + gdb_test "set processor r3051" ".*" + gdb_test "info registers" ".*" + gdb_test "info register bus" "bus: invalid register" + gdb_test "info register ccfg" "ccfg: invalid register" + gdb_test "info register port" "port: invalid register" + gdb_test "info register cmp" "cmp: invalid register" + gdb_test "info register elo" "elo.*0x.*" + gdb_test "info register ehi" "ehi.*0x.*" + gdb_test "info register cfg" "cfg: invalid register" + gdb_test "info register ctxt" "ctxt: invalid register" + # Test the 3071. + gdb_test "set processor r3071" ".*" + gdb_test "info registers" ".*" + gdb_test "info register bus" "bus: invalid register" + gdb_test "info register ccfg" "ccfg: invalid register" + gdb_test "info register port" "port: invalid register" + gdb_test "info register cmp" "cmp: invalid register" + gdb_test "info register elo" "elo.*0x.*" + gdb_test "info register ehi" "ehi.*0x.*" + gdb_test "info register cfg" "cfg.*0x.*" + gdb_test "info register ctxt" "ctxt.*0x.*" +} + +if [istarget "mips*-idt-*"] then { + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + idt_register_tests +} else { + verbose "regs.exp tests ignored for this target" +} diff --git a/gdb/testsuite/gdb.base/relational.exp b/gdb/testsuite/gdb.base/relational.exp new file mode 100644 index 00000000000..6a0b38acad0 --- /dev/null +++ b/gdb/testsuite/gdb.base/relational.exp @@ -0,0 +1,481 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite +# +# tests for correctenss of relational operators, associativity and precedence +# with integer type variables +# + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "int-type" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# +# test expressions with "int" types +# + +gdb_test "set variable x=14" "" "set variable x=14" +gdb_test "set variable y=2" "" "set variable y=2" +gdb_test "set variable z=2" "" "set variable z=2" +gdb_test "set variable w=3" "" "set variable w=3" + +send_gdb "print x\n" +gdb_expect { + -re ".*14.*$gdb_prompt $" { + pass "print value of x" + } + -re ".*$gdb_prompt $" { fail "print value of x" } + timeout { fail "(timeout) print value of x" } + } + + +send_gdb "print y\n" +gdb_expect { + -re ".*2.*$gdb_prompt $" { + pass "print value of y" + } + -re ".*$gdb_prompt $" { fail "print value of y" } + timeout { fail "(timeout) print value of y" } + } + +send_gdb "print z\n" +gdb_expect { + -re ".*2.*$gdb_prompt $" { + pass "print value of z" + } + -re ".*$gdb_prompt $" { fail "print value of z" } + timeout { fail "(timeout) print value of z" } + } + +send_gdb "print w\n" +gdb_expect { + -re ".*3.*$gdb_prompt $" { + pass "print value of w" + } + -re ".*$gdb_prompt $" { fail "print value of w" } + timeout { fail "(timeout) print value of w" } + } + + + +send_gdb "print x < y\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x y\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of x>y" + } + -re ".*$gdb_prompt $" { fail "print value of x>y" } + timeout { fail "(timeout) print value of x>y" } + } + +send_gdb "print x >= y\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of x>=y" + } + -re ".*$gdb_prompt $" { fail "print value of x>=y" } + timeout { fail "(timeout) print value of x>=y" } + } + +send_gdb "print x == y\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x==y" + } + -re ".*$gdb_prompt $" { fail "print value of x==y" } + timeout { fail "(timeout) print value of x==y" } + } + +send_gdb "print x != y\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of x!=y" + } + -re ".*$gdb_prompt $" { fail "print value of x!=y" } + timeout { fail "(timeout) print value of x!=y" } + } + + + +# Test associativity of <, >, <=, >=, ==, != + +gdb_test "set variable x=3" "" "set variable x" +gdb_test "set variable y=5" "" "set variable y" +gdb_test "set variable z=2" "" "set variable z" + + + +send_gdb "print x < y < z\n" +gdb_expect { + -re ".*1\r\n$gdb_prompt $" { + pass "print value of x y > z\n" +gdb_expect { + -re ".*0\r\n$gdb_prompt $" { + pass "print value of x>y>z" + } + -re 8".*$gdb_prompt $" { fail "print value of x>y>z" } + timeout { fail "(timeout) print value of x>y>z" } + } + +send_gdb "print x >= y >= z\n" +gdb_expect { + -re ".*0\r\n$gdb_prompt $" { + pass "print value of x>=y>=z" + } + -re ".*$gdb_prompt $" { fail "print value of x>=y>=z" } + timeout { fail "(timeout) print value of x>=y>=z" } + } + +gdb_test "set variable x=2" "" "set variable x" +gdb_test "set variable y=2" "" "set variable y" +gdb_test "set variable z=1" "" "set variable z" + + +send_gdb "print x == y == z\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of x==y==z" + } + -re ".*$gdb_prompt $" { fail "print value of x==y==z" } + timeout { fail "(timeout) print value of x==y==z" } + } + +gdb_test "set variable z=0" "" "set variable z" + + +send_gdb "print x != y != z\n" +gdb_expect { + -re ".*0\r\n$gdb_prompt $" { + pass "print value of x!=y!=z" + } + -re ".*$gdb_prompt $" { fail "print value of x!=y!=z" } + timeout { fail "(timeout) print value of x!=y!=z" } + } + + +# test precedence rules on pairs of relational operators + +gdb_test "set variable x=0" "" "set variable x" +gdb_test "set variable y=2" "" "set variable y" +gdb_test "set variable z=2" "" "set variable z" + + +send_gdb "print x < y == z\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x= z\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of x=z" + } + -re ".*$gdb_prompt $" { fail "print value of x=z" } + timeout { fail "(timeout) print value of x=z" } + } + + +gdb_test "set variable z=0" "" " set variable z" + + +# 2 3 0 +send_gdb "print x < y > z\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of xz" + } + -re ".*$gdb_prompt $" { fail "print value of xz" } + timeout { fail "(timeout) print value of xz" } + } + + +gdb_test "set variable x=1" "" " set variable x" + +# 1 3 0 +send_gdb "print x > y >= z\n" +gdb_expect { + -re ".*1.*$gdb_prompt $" { + pass "print value of x>y>=z" + } + -re ".*$gdb_prompt $" { fail "print value of x>y>=z" } + timeout { fail "(timeout) print value of x>y>=z" } + } + + +gdb_test "set variable z=2" "" " set variable z" + +# 1 3 2 +send_gdb "print x > y == z\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x>y==z" + } + -re ".*$gdb_prompt $" { fail "print value of x>y==z" } + timeout { fail "(timeout) print value of x>y==z" } + } + + +gdb_test "set variable x=2" "" " set variable x" +gdb_test "set variable z=0" "" " set variable z" + +# 2 3 0 +send_gdb "print x > y != z\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x>y!=z" + } + -re ".*$gdb_prompt $" { fail "print value of x>y!=z" } + timeout { fail "(timeout) print value of x>y!=z" } + } + + +gdb_test "set variable x=4" "" "set x to 4" + +# 4 3 0 +send_gdb "print x > y <= z\n" +gdb_expect { + -re ".*0.*$gdb_prompt $" { + pass "print value of x>y<=z" + } + -re ".*$gdb_prompt $" { fail "print value of x>y<=z" } + timeout { fail "(timeout) print value of x>y<=z" } + } + +# 4 3 0 +send_gdb "print x >= y == z\n" +gdb_expect { + -re ".*0\r\n$gdb_prompt $" { + pass "print value of x>=y==z" + } + -re ".*$gdb_prompt $" { fail "print value of x>=y==z" } + timeout { fail "(timeout) print value of x>=y==z" } + } + + +gdb_test "set variable x=2" "" " set variable x" + +# 2 3 0 +send_gdb "print x >= y != z\n" +gdb_expect { + -re ".*0\r\n$gdb_prompt $" { + pass "print value of x>=y!=z" + } + -re ".*$gdb_prompt $" { fail "print value of x>=y!=z" } + timeout { fail "(timeout) print value of x>=y!=z" } + } + + +gdb_test "set variable x=0" "" " set variable x" +gdb_test "set variable z=4" "" " set variable z" + +# 0 3 4 +send_gdb "print x >= y <= z\n" +gdb_expect { + -re ".*1\r\n$gdb_prompt $" { + pass "print value of x>=y<=z" + } + -re ".*$gdb_prompt $" { fail "print value of x>=y<=z" } + timeout { fail "(timeout) print value of x>=y<=z" } + } + +# 0 3 4 +send_gdb "print x <= y == z\n" +gdb_expect { + -re ".*0\r\n$gdb_prompt $" { + pass "print value of x<=y==z" + } + -re ".*$gdb_prompt $" { fail "print value of x<=y==z" } + timeout { fail "(timeout) print value of x<=y==z" } + } + +gdb_test "set variable x=2" "" " set variable x" + +# 2 3 4 +send_gdb "print x <= y != z\n" +gdb_expect { + -re ".*1\r\n$gdb_prompt $" { + pass "print value of x<=y!=z" + } + -re ".*$gdb_prompt $" { fail "print value of x<=y!=z" } + timeout { fail "(timeout) print value of x<=y!=z" } + } + + +# 2 3 4 +send_gdb "print x == y != z\n" +gdb_expect { + -re ".*1\r\n$gdb_prompt $" { + pass "print value of x==y!=z" + } + -re ".*$gdb_prompt $" { fail "print value of x==y!=z" } + timeout { fail "(timeout) print value of x==y!=z" } + } + + + +# test use of parenthesis to enforce different order of evaluation + + +gdb_test "set variable z=0" "" " set variable z" + +# 2 3 0 +send_gdb "print x >= (y < z)\n" +gdb_expect { + -re ".*1\r\n$gdb_prompt $" { + pass "print value of x>=(y=(y=(y= (y != z)\n" +gdb_expect { + -re ".*1\r\n$gdb_prompt $" { + pass "print value of x>=(y!=z)" + } + -re ".*$gdb_prompt $" { fail "print value of x>=(y*!=z)" } + timeout { fail "(timeout) print value of x>=(y!=z)" } + } + +# 2 3 0 +send_gdb "print x == (y == z)\n" +gdb_expect { + -re ".*0\r\n$gdb_prompt $" { + pass "print value of x==(y==z)" + } + -re ".*$gdb_prompt $" { fail "print value of x==(y==z)" } + timeout { fail "(timeout) print value of x==(y==z)" } + } + + +gdb_test "set variable x=1" "" " set variable x" +gdb_test "set variable z=4" "" " set variable z" + +# 1 3 4 +send_gdb "print (x == y) < z\n" +gdb_expect { + -re ".*1\r\n$gdb_prompt $" { + pass "print value of (x==y) + +int x; + +void bar() +{ + x--; +} + +void foo() +{ + x++; +} + +int main() +{ +#ifdef usestubs + set_debug_traps (); + breakpoint (); +#endif + foo(); + bar(); + return 0; +} diff --git a/gdb/testsuite/gdb.base/reread2.c b/gdb/testsuite/gdb.base/reread2.c new file mode 100644 index 00000000000..fd9f7b7ad64 --- /dev/null +++ b/gdb/testsuite/gdb.base/reread2.c @@ -0,0 +1,21 @@ +/* pr 13484 */ + +#include + +int x; + +void foo() +{ + x++; + printf("This is foo\n"); +} + +int main() +{ +#ifdef usestubs + set_debug_traps (); + breakpoint (); +#endif + foo(); + return 0; +} diff --git a/gdb/testsuite/gdb.base/restore.c b/gdb/testsuite/gdb.base/restore.c new file mode 100644 index 00000000000..a65d648b9d0 --- /dev/null +++ b/gdb/testsuite/gdb.base/restore.c @@ -0,0 +1,260 @@ +/* Test GDB's ability to restore saved registers from stack frames + when using the `return' command. + Jim Blandy --- December 1998 */ + +#include + +/* This is the Emacs Lisp expression I used to generate the functions + in this file. If people modify the functions manually, instead of + changing this expression and re-running it, then evaluating this + expression could wipe out their work, so you probably shouldn't + re-run it. But I leave it here for reference. + + (defun callee (n) (format "callee%d" n)) + (defun caller (n) (format "caller%d" n)) + (defun local (n) (format "l%d" n)) + (defun local-sum (n) + (let ((j 1)) + (while (<= j n) + (insert (local j)) + (if (< j n) (insert "+")) + (setq j (1+ j))))) + (defun local-chain (n previous first-end) + (let ((j 1)) + (while (<= j n) + (insert " register int " (local j) + " = increment (" previous ");") + (if first-end + (progn + (insert " /" "* " first-end " *" "/") + (setq first-end nil))) + (insert "\n") + (setq previous (local j)) + (setq j (1+ j)))) + previous) + + (save-excursion + (let ((limit 5)) + (goto-char (point-max)) + (search-backward "generated code starts here") + (forward-line 1) + (let ((start (point))) + (search-forward "generated code ends here") + (forward-line 0) + (delete-region start (point))) + + ;; Generate callee functions. + (let ((i 0)) + (while (<= i limit) + (insert (format "/%s Returns n * %d + %d %s/\n" + "*" i (/ (+ i (* i i)) 2) "*")) + (insert "int\n") + (insert (callee i) " (int n)\n") + (insert "{\n") + (local-chain i "n" (callee i)) + (insert " return ") + (if (<= i 0) (insert "n") + (local-sum i)) + (insert ";\n") + (insert "}\n\n") + (setq i (1+ i)))) + + ;; Generate caller functions. + (let ((i 1)) + (while (<= i limit) + (insert "int\n") + (insert (caller i) " (void)\n") + (insert "{\n") + (let ((last (local-chain i "0xfeeb" (caller i)))) + (insert " register int n;\n") + (let ((j 0)) + (while (<= j limit) + (insert " n = " (callee j) " (" + (if (> j 0) "n + " "") + last ");\n") + (setq j (1+ j))))) + (insert " return n+") + (local-sum i) + (insert ";\n") + (insert "}\n\n") + (setq i (1+ i)))) + + ;; Generate driver function. + (insert "void\n") + (insert "driver (void)\n") + (insert "{\n") + (let ((i 1)) + (while (<= i limit) + (insert " printf (\"" (caller i) " () => %d\\n\", " + (caller i) " ());\n") + (setq i (1+ i)))) + (insert "}\n\n"))) + + */ + +int +increment (int n) +{ + return n + 1; +} + +/* generated code starts here */ +/* Returns n * 0 + 0 */ +int +callee0 (int n) +{ + return n; +} + +/* Returns n * 1 + 1 */ +int +callee1 (int n) +{ + register int l1 = increment (n); /* callee1 */ + return l1; +} + +/* Returns n * 2 + 3 */ +int +callee2 (int n) +{ + register int l1 = increment (n); /* callee2 */ + register int l2 = increment (l1); + return l1+l2; +} + +/* Returns n * 3 + 6 */ +int +callee3 (int n) +{ + register int l1 = increment (n); /* callee3 */ + register int l2 = increment (l1); + register int l3 = increment (l2); + return l1+l2+l3; +} + +/* Returns n * 4 + 10 */ +int +callee4 (int n) +{ + register int l1 = increment (n); /* callee4 */ + register int l2 = increment (l1); + register int l3 = increment (l2); + register int l4 = increment (l3); + return l1+l2+l3+l4; +} + +/* Returns n * 5 + 15 */ +int +callee5 (int n) +{ + register int l1 = increment (n); /* callee5 */ + register int l2 = increment (l1); + register int l3 = increment (l2); + register int l4 = increment (l3); + register int l5 = increment (l4); + return l1+l2+l3+l4+l5; +} + +int +caller1 (void) +{ + register int l1 = increment (0xfeeb); /* caller1 */ + register int n; + n = callee0 (l1); + n = callee1 (n + l1); + n = callee2 (n + l1); + n = callee3 (n + l1); + n = callee4 (n + l1); + n = callee5 (n + l1); + return n+l1; +} + +int +caller2 (void) +{ + register int l1 = increment (0xfeeb); /* caller2 */ + register int l2 = increment (l1); + register int n; + n = callee0 (l2); + n = callee1 (n + l2); + n = callee2 (n + l2); + n = callee3 (n + l2); + n = callee4 (n + l2); + n = callee5 (n + l2); + return n+l1+l2; +} + +int +caller3 (void) +{ + register int l1 = increment (0xfeeb); /* caller3 */ + register int l2 = increment (l1); + register int l3 = increment (l2); + register int n; + n = callee0 (l3); + n = callee1 (n + l3); + n = callee2 (n + l3); + n = callee3 (n + l3); + n = callee4 (n + l3); + n = callee5 (n + l3); + return n+l1+l2+l3; +} + +int +caller4 (void) +{ + register int l1 = increment (0xfeeb); /* caller4 */ + register int l2 = increment (l1); + register int l3 = increment (l2); + register int l4 = increment (l3); + register int n; + n = callee0 (l4); + n = callee1 (n + l4); + n = callee2 (n + l4); + n = callee3 (n + l4); + n = callee4 (n + l4); + n = callee5 (n + l4); + return n+l1+l2+l3+l4; +} + +int +caller5 (void) +{ + register int l1 = increment (0xfeeb); /* caller5 */ + register int l2 = increment (l1); + register int l3 = increment (l2); + register int l4 = increment (l3); + register int l5 = increment (l4); + register int n; + n = callee0 (l5); + n = callee1 (n + l5); + n = callee2 (n + l5); + n = callee3 (n + l5); + n = callee4 (n + l5); + n = callee5 (n + l5); + return n+l1+l2+l3+l4+l5; +} + +void +driver (void) +{ + printf ("caller1 () => %d\n", caller1 ()); + printf ("caller2 () => %d\n", caller2 ()); + printf ("caller3 () => %d\n", caller3 ()); + printf ("caller4 () => %d\n", caller4 ()); + printf ("caller5 () => %d\n", caller5 ()); +} + +/* generated code ends here */ + +main () +{ + register int local; +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + driver (); + printf("exiting\n"); +} diff --git a/gdb/testsuite/gdb.base/restore.exp b/gdb/testsuite/gdb.base/restore.exp new file mode 100644 index 00000000000..64b714bd1b6 --- /dev/null +++ b/gdb/testsuite/gdb.base/restore.exp @@ -0,0 +1,111 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# Test GDB's ability to restore saved registers from stack frames +# when using the `return' command. +# +# This file was written by Jim Blandy , with +# fragments borrowed from return.exp. + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "restore" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +proc restore_tests { } { + global gdb_prompt + + if { ! [ runto driver ] } then { return 0 } + + set limit 5 + + # Set breakpoints at each of the `caller' functions. + for {set c 1} {$c <= $limit} {incr c} { + gdb_test "break caller$c" "Breakpoint.*\[0-9\]*\\." "break caller$c" + } + + # Set breakpoints at each of the `callee' functions. + for {set c 1} {$c <= $limit} {incr c} { + gdb_test "break callee$c" "Breakpoint.*\[0-9\]*\\." "break caller$c" + } + + # For each caller function, + # call each of the callee functions, + # force a return from the callee, and + # make sure that the local variables still have the right values. + for {set c 1} {$c <= $limit} {incr c} { + + # Continue to the next caller function. + gdb_test "continue" ".*/\\* caller$c \\*/" "run to caller$c" + + # Do each callee function. + for {set e 1} {$e <= $limit} {incr e} { + gdb_test " continue" ".*/\\* callee$e \\*/" "run to callee$e" + + # Do a forced return from the callee. + send_gdb "return 0\n" + gdb_expect { + -re "Make .* return now.*y or n. $" { + send_gdb "y\n" + exp_continue + } + -re "$gdb_prompt $" { } + } + + # Check that the values of the local variables are what + # they should be. + for {set var 1} {$var <= $c} {incr var} { + set expected [expr 0xfeeb + $var] + gdb_test "print l$var" " = $expected" \ + "caller$c called callee$e; variable l$var restored" + } + } + } + + send_gdb "continue\n" + + gdb_expect { + -re "exiting" { + pass "run to completion" + } + timeout { + fail "(timeout) run to completion" + } + } +} + + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +set timeout 30 +restore_tests diff --git a/gdb/testsuite/gdb.base/return.c b/gdb/testsuite/gdb.base/return.c new file mode 100644 index 00000000000..e19d1a0b1f2 --- /dev/null +++ b/gdb/testsuite/gdb.base/return.c @@ -0,0 +1,35 @@ +#include +/* Test "return" command. */ + +func1 () +{ + printf("in func1\n"); +} + +int +func2 () +{ + return -5; +} + +double +func3 () +{ + return -5.0; +} + +int tmp2; +double tmp3; + +main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + func1 (); + printf("in main after func1\n"); + tmp2 = func2 (); + tmp3 = func3 (); + printf("exiting\n"); +} diff --git a/gdb/testsuite/gdb.base/return.exp b/gdb/testsuite/gdb.base/return.exp new file mode 100644 index 00000000000..c3a85e8923c --- /dev/null +++ b/gdb/testsuite/gdb.base/return.exp @@ -0,0 +1,124 @@ +# Copyright (C) 1992, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Jeff Law. (law@cs.utah.edu) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "return" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +proc return_tests { } { + global gdb_prompt + + + if { ! [ runto func1 ] } then { return 0 } + send_gdb "return\n" + gdb_expect { + -re "Make .* return now.*y or n. $" { + send_gdb "y\n" + exp_continue + } + -re "func1 ..;.*$gdb_prompt $" { + send_gdb "step\n" + exp_continue + } + -re ".*in main after func1.*$gdb_prompt $" { pass "simple return" } + -re "$gdb_prompt $" { fail "simple return" } + timeout { fail "(timeout) simple return" } + } + + # Set breakpoints in other interesting functions. + gdb_test "break func2" "" "break func2" + gdb_test "break func3" "" "break func3" + + gdb_test "continue" "return -5;" "continue to return of -5" + send_gdb "return 5\n" + gdb_expect { + -re "Make .* return now.*y or n. $" { + send_gdb "y\n" + exp_continue + } + -re ".*tmp2 = func2.*$gdb_prompt $" { } + -re "$gdb_prompt $" { fail "did not return (integer test)" } + timeout { fail "(timeout) did not return (integer test)" } + } + gdb_test "next" "tmp3 = func3.*" "next over call to func2" + + gdb_test "p tmp2" ".* = 5" "correct value returned (integer test)" + + gdb_test "continue" "return -5.0;" "continue to return of -5.0" + send_gdb "return 5.0\n" + gdb_expect { + -re "Make .* return now.*y or n. $" { + send_gdb "y\n" + exp_continue + } + -re ".*tmp3 = func3.*$gdb_prompt $" { } + -re "$gdb_prompt $" { fail "did not return (double test)" } + timeout { fail "(timeout) did not return (double test)" } + } + + gdb_test "next" "printf.*" "next over call to func3" + + # This test is going to fail on all i*86 systems using an i*87. + # When returning a floating point value from a function, all known + # compilers do this via a `fldl' instruction, which pushes the floating + # value on the i387 stack. This causes two problems: + # a) Most i*86 targets do not store (or cannot store, see comment in + # in i386v-nat.c:i386_register_u_addr) the floating point registers + # to the target. + # b) gdb would have to figure out if the `fldl' instruction (or variants + # of it) has already been executed. If not, it would have to simulate + # a push instruction, as it is not enough to write the register, + # the floating point `stack pointer' has to be updated too. + # Do not expect this to get fixed anytime soon. + + # This test also fails for sparc Solaris 2.3 & 2.4, but passes under 2.5 + # At the time the `next' is issued, the floating point unit for the + # process is not yet initialized, and the storing of the floating + # point value to the floating point return register is ignored. + # Xfail it for current versions that are known to fail. Presumably + # if some future version does initialize the floating point unit at + # process start, making this test pass, it will be for a version that + # is not xfailed. + + setup_xfail "i*86-*-*" "sparc-*-solaris2.3*" "sparc-*-solaris2.4*" + gdb_test "p tmp3" ".* = 5.*" "correct value returned double test (known problem with i*86 and sparc solaris" +} + + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +set timeout 30 +return_tests diff --git a/gdb/testsuite/gdb.base/run.c b/gdb/testsuite/gdb.base/run.c new file mode 100644 index 00000000000..40ec72020e6 --- /dev/null +++ b/gdb/testsuite/gdb.base/run.c @@ -0,0 +1,67 @@ +/* + * This simple classical example of recursion is useful for + * testing stack backtraces and such. + */ + +#ifdef vxworks + +# include + +/* VxWorks does not supply atoi. */ +static int +atoi (z) + char *z; +{ + int i = 0; + + while (*z >= '0' && *z <= '9') + i = i * 10 + (*z++ - '0'); + return i; +} + +/* I don't know of any way to pass an array to VxWorks. This function + can be called directly from gdb. */ + +vxmain (arg) +char *arg; +{ + char *argv[2]; + + argv[0] = ""; + argv[1] = arg; + main (2, argv, (char **) 0); +} + +#else /* ! vxworks */ +# include +#endif /* ! vxworks */ + +main (argc, argv, envp) +int argc; +char *argv[], **envp; +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif +#ifdef FAKEARGV + printf ("%d\n", factorial (1)); +#else + if (argc != 2) { + printf ("usage: factorial \n"); + return 1; + } else { + printf ("%d\n", factorial (atoi (argv[1]))); + } +#endif + return 0; +} + +int factorial (value) +int value; +{ + if (value > 1) { + value *= factorial (value - 1); + } + return (value); +} diff --git a/gdb/testsuite/gdb.base/scope.exp b/gdb/testsuite/gdb.base/scope.exp new file mode 100644 index 00000000000..6a92ca75119 --- /dev/null +++ b/gdb/testsuite/gdb.base/scope.exp @@ -0,0 +1,610 @@ +# Copyright (C) 1992, 1994, 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "scope" +set binfile ${objdir}/${subdir}/${testfile} + + +if { [gdb_compile "${srcdir}/${subdir}/scope0.c" "${binfile}0.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${srcdir}/${subdir}/scope1.c" "${binfile}1.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${binfile}0.o ${binfile}1.o" ${binfile} executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +# Test locating various things when stopped just inside main, after +# running init0(). To prevent cascading of errors, we report the +# first one and quit. If all pass, then we print the pass results. + +proc test_at_main {} { + global gdb_prompt + global decimal + global det_file + global srcdir + global subdir + global gcc_compiled + + # skip past init. There may be a call to __main at the start of + # main, so the first next may only get us to the init0 call. + if [gdb_test "next" "$decimal.*foo \\(\\);" "next over init0() in main" "$decimal.*init0 \\(\\);" "next"] { + gdb_suppress_tests ; + } + + + # Print scope0.c::filelocal, which is 1 + + if [gdb_test "print filelocal" "\\\$$decimal = 1" "print filelocal" ] { + gdb_suppress_tests ; + } + + + if [gdb_test "print 'scope0.c'::filelocal" "\\\$$decimal = 1" "print 'scope0.c'::filelocal at main" "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal"] { + gdb_suppress_tests ; + } + + + # Print scope0.c::filelocal_bss, which is 101 + + if [gdb_test "print filelocal_bss" "\\\$$decimal = 101" "print filelocal_bss" ] { + gdb_suppress_tests ; + } + + + if [gdb_test "print 'scope0.c'::filelocal_bss" "\\\$$decimal = 101" "print 'scope0.c'::filelocal_bss in test_at_main" "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_bss"] { + gdb_suppress_tests ; + } + + + # Print scope0.c::filelocal_ro, which is 201 + + # No clue why the powerpc fails this test. + setup_xfail "powerpc-*-*" + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print filelocal_ro" "\\\$$decimal = 201" "print filelocal_ro in test_at_main" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + setup_xfail "powerpc-*-*" + if [gdb_test "print 'scope0.c'::filelocal_ro" "\\\$$decimal = 201" "print 'scope0.c'::filelocal_ro" "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_ro"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::filelocal, which is 2 + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::filelocal" "\\\$$decimal = 2" "print 'scope1.c'::filelocal" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::filelocal_bss, which is 102 + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::filelocal_bss" "\\\$$decimal = 102" "print 'scope1.c'::filelocal_bss" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_bss"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::filelocal_ro, which is 202 + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::filelocal_ro" "\\\$$decimal = 202" "print 'scope1.c'::filelocal_ro" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_ro"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::foo::funclocal, which is 3 + + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + if [gdb_test "print foo::funclocal" "\\\$$decimal = 3" "print foo::funclocal" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::foo::funclocal" "\\\$$decimal = 3" "print 'scope1.c'::foo::funclocal" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::foo::funclocal_ro, which is 203 + + if [gdb_test "print foo::funclocal_ro" "\\\$$decimal = 203" "print foo::funclocal_ro" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::foo::funclocal_ro" "\\\$$decimal = 203" "print 'scope1.c'::foo::funclocal_ro" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_ro"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::bar::funclocal, which is 4 + + if [gdb_test "print bar::funclocal" "\\\$$decimal = 4" "print bar::funclocal" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::bar::funclocal" "\\\$$decimal = 4" "print 'scope1.c'::bar::funclocal" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::bar::funclocal"] { + gdb_suppress_tests ; + } + gdb_stop_suppressing_tests; + +} + +proc test_at_foo {} { + global gdb_prompt + global decimal + global det_file + global srcdir + global subdir + global gcc_compiled + + if [gdb_test "next" ".*bar \\(\\);" "" ] { + gdb_suppress_tests ; + } + + + # Print scope0.c::filelocal, which is 1 + + if [gdb_test "print 'scope0.c'::filelocal" "\\\$$decimal = 1" "print 'scope0.c'::filelocal at foo" "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal"] { + gdb_suppress_tests ; + } + + + # Print scope0.c::filelocal_bss, which is 101 + + if [gdb_test "print 'scope0.c'::filelocal_bss" "\\\$$decimal = 101" "print 'scope0.c'::filelocal_bss in test_at_foo" "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_bss"] { + gdb_suppress_tests ; + } + + + # Print scope0.c::filelocal_ro, which is 201 + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + setup_xfail "powerpc-*-*" + if [gdb_test "print 'scope0.c'::filelocal_ro" "\\\$$decimal = 201" "print 'scope0.c'::filelocal_ro" "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_ro"] { + gdb_suppress_tests ; + } + + + gdb_test "print filelocal" "\\\$$decimal = 2" "print filelocal at foo" + + # Print scope1.c::filelocal, which is 2 + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::filelocal" "\\\$$decimal = 2" "print 'scope1.c'::filelocal at foo" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal"] { + gdb_suppress_tests ; + } + + + gdb_test "print filelocal_bss" "\\\$$decimal = 102" \ + "print filelocal_bss at foo" + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "print 'scope1.c'::filelocal_bss" "\\\$$decimal = 102" "print 'scope1.c'::filelocal_bss at foo" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_bss" + + + gdb_test "print filelocal_ro" "\\\$$decimal = 202" \ + "print filelocal_ro at foo" + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + gdb_test "print 'scope1.c'::filelocal_ro" "\\\$$decimal = 202" "print 'scope1.c'::filelocal_ro at foo" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_ro" + + + # Print scope1.c::foo::funclocal, which is 3 + + gdb_test "print funclocal" "\\\$$decimal = 3" "print funclocal at foo" + + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "print foo::funclocal" "\\\$$decimal = 3" \ + "print foo::funclocal at foo" + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "print 'scope1.c'::foo::funclocal" "\\\$$decimal = 3" "print 'scope1.c'::foo::funclocal at foo" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal" + + + # Print scope1.c::foo::funclocal_bss, which is 103 + + gdb_test "print funclocal_bss" "\\\$$decimal = 103" \ + "print funclocal_bss at foo" + + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "print foo::funclocal_bss" "\\\$$decimal = 103" \ + "print foo::funclocal_bss at foo" + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "print 'scope1.c'::foo::funclocal_bss" "\\\$$decimal = 103" "print 'scope1.c'::foo::funclocal_bss at foo" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_bss" + + + # Print scope1.c::foo::funclocal_ro, which is 203 + + gdb_test "print funclocal_ro" "\\\$$decimal = 203" \ + "print funclocal_ro at foo" + + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "print foo::funclocal_ro" "\\\$$decimal = 203" \ + "print foo::funclocal_ro at foo" + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "print 'scope1.c'::foo::funclocal_ro" "\\\$$decimal = 203" "print 'scope1.c'::foo::funclocal_ro at foo" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_ro" + + + # Print scope1.c::bar::funclocal, which is 4 + + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "print bar::funclocal" "\\\$$decimal = 4" \ + "print bar::funclocal at foo" + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + gdb_test "print 'scope1.c'::bar::funclocal" "\\\$$decimal = 4" "print 'scope1.c'::bar::funclocal at foo" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::bar::funclocal" + gdb_stop_suppressing_tests; + +} + +proc test_at_bar {} { + global gdb_prompt + global decimal + global det_file + global srcdir + global subdir + global gcc_compiled + + if [gdb_test "next" ".*" "" ] { + gdb_suppress_tests ; + } + + + # Print scope0.c::filelocal, which is 1 + + if [gdb_test "print 'scope0.c'::filelocal" "\\\$$decimal = 1" "print 'scope0.c'::filelocal at bar" "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal"] { + gdb_suppress_tests ; + } + + + # Print scope0.c::filelocal_bss, which is 101 + + if [gdb_test "print 'scope0.c'::filelocal_bss" "\\\$$decimal = 101" "print 'scope0.c'::filelocal_bss in test_at_bar" "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_bss"] { + gdb_suppress_tests ; + } + + + # Print scope0.c::filelocal_ro, which is 201 + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + setup_xfail "powerpc-*-*" + if [gdb_test "print 'scope0.c'::filelocal_ro" "\\\$$decimal = 201" "print 'scope0.c'::filelocal_ro at bar" "No symbol \"scope0.c\" in current context.*" "print '$srcdir/$subdir/scope0.c'::filelocal_ro"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::filelocal, which is 2 + + if [gdb_test "print filelocal" "\\\$$decimal = 2" "print filelocal at bar" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::filelocal" "\\\$$decimal = 2" "print 'scope1.c'::filelocal at bar" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::filelocal_bss, which is 102 + + if [gdb_test "print filelocal_bss" "\\\$$decimal = 102" "print filelocal_bss at bar" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::filelocal_bss" "\\\$$decimal = 102" "print 'scope1.c'::filelocal_bss at bar" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_bss"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::filelocal_ro, which is 202 + + if [gdb_test "print filelocal_ro" "\\\$$decimal = 202" "print filelocal_ro in test_at_bar" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::filelocal_ro" "\\\$$decimal = 202" "print 'scope1.c'::filelocal_ro at bar" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::filelocal_ro"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::foo::funclocal, which is 3 + + if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" } + if [gdb_test "print foo::funclocal" "\\\$$decimal = 3" "print foo::funclocal at bar" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::foo::funclocal" "\\\$$decimal = 3" "print 'scope1.c'::foo::funclocal at bar" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::foo::funclocal_bss, which is 103 + + if [gdb_test "print foo::funclocal_bss" "\\\$$decimal = 103" "print foo::funclocal_bss at bar" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::foo::funclocal_bss" "\\\$$decimal = 103" "print 'scope1.c'::foo::funclocal_bss at bar" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_bss"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::foo::funclocal_ro, which is 203 + + if [gdb_test "print foo::funclocal_ro" "\\\$$decimal = 203" "print foo::funclocal_ro at bar" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::foo::funclocal_ro" "\\\$$decimal = 203" "print 'scope1.c'::foo::funclocal_ro at bar" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::foo::funclocal_ro"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::bar::funclocal, which is 4 + + if [gdb_test "print funclocal" "\\\$$decimal = 4" "print funclocal at bar" ] { + gdb_suppress_tests ; + } + + + if [gdb_test "print bar::funclocal" "\\\$$decimal = 4" "print bar::funclocal at bar" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::bar::funclocal" "\\\$$decimal = 4" "print 'scope1.c'::bar::funclocal at bar" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::bar::funclocal"] { + gdb_suppress_tests ; + } + + + # Print scope1.c::bar::funclocal_bss, which is 104 + + if [gdb_test "print funclocal_bss" "\\\$$decimal = 104" "print funclocal_bss at bar" ] { + gdb_suppress_tests ; + } + + + if [gdb_test "print bar::funclocal_bss" "\\\$$decimal = 104" "print bar::funclocal_bss at bar" ] { + gdb_suppress_tests ; + } + + + if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } + if [gdb_test "print 'scope1.c'::bar::funclocal_bss" "\\\$$decimal = 104" "print 'scope1.c'::bar::funclocal_bss at bar" "No symbol \"scope1.c\" in current context.*" "print '$srcdir/$subdir/scope1.c'::bar::funclocal_bss"] { + gdb_suppress_tests ; + } + gdb_stop_suppressing_tests; + +} + +# This test has little to do with local scopes, but it is in scope.exp anyway. +# That's life. + +proc test_at_autovars {} { + global gdb_prompt + global decimal + global hex + global srcfile + + # Test symbol table lookup with 100 local (auto) variables. + + gdb_breakpoint marker1 + + if [gdb_test "cont" "Break.* marker1 \\(\\) at .*:$decimal.*" "continue to marker1"] { + gdb_suppress_tests; + } + + if [gdb_test "up" ".*" "" ] { + gdb_suppress_tests ; + } + + set count 0 + while {$count < 100} { + if [gdb_test "print i$count" ".* = $count" "" ] { + gdb_suppress_tests ; + } + + set count [expr $count+1] + } + clear_xfail "*-*-*" + pass "$count auto variables correctly initialized" + + # Test that block variable sorting is not screwing us. + gdb_test "frame" "#.*autovars \\(bcd=5, abc=6\\).*" "args in correct order" +} + +proc test_at_localscopes {} { + global gdb_prompt + global decimal + global hex + global srcfile + + gdb_breakpoint marker2 + gdb_breakpoint marker3 + gdb_breakpoint marker4 + + if [gdb_test "cont" "Break.* marker2 \\(\\) at .*:$decimal.*" "continue to marker2"] { + gdb_suppress_tests; + } + if [gdb_test "up" ".*" "" ] { + gdb_suppress_tests ; + } + + # Should be at first (outermost) scope. Check values. + + gdb_test "print localval" " = 10" "print localval, outer scope" + gdb_test "print localval1" " = 11" "print localval1, outer scope" + gdb_test "print localval2" "No symbol \"localval2\" in current context." \ + "print localval2, outer scope" + gdb_test "print localval3" "No symbol \"localval3\" in current context." \ + "print localval3, outer scope" + + if [gdb_test "cont" "Break.* marker3 \\(\\) at .*:$decimal.*" \ + "continue to marker3 in scope.exp"] then { gdb_suppress_tests } + if [gdb_test "up" "" "up from marker3 in scope.exp"] then { gdb_suppress_tests } + + # Should be at next (first nested) scope. Check values. + + gdb_test "print localval" " = 20" \ + "print localval, first nested scope" + gdb_test "print localval1" " = 11" "print localval1, first nested scope" + gdb_test "print localval2" " = 12" "print localval2, first nested scope" + gdb_test "print localval3" "No symbol \"localval3\" in current context." \ + "print localval3, first nested scope" + + # This test will only fail if the file was compiled by gcc, but + # there's no way to check that. + setup_xfail "a29k-*-udi" 2423 + if [gdb_test "cont" "Break.* marker4.*at .*:$decimal.*" \ + "continue to marker4 in scope.exp"] then { gdb_suppress_tests } + if [gdb_test "up" "" "up from marker4 in scope.exp"] then { gdb_suppress_tests } + + gdb_test "print localval" " = 30" "print localval, innermost scope" + gdb_test "print localval1" " = 11" "print localval1, innermost scope" + gdb_test "print localval2" " = 12" "print localval2, innermost scope" + gdb_test "print localval3" " = 13" "print localval3, innermost scope" + gdb_stop_suppressing_tests; +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if [istarget "*-*-vxworks*"] { + set timeout 120 + verbose "Timeout is now $timeout seconds" 2 +} + +# Test that variables in various segments print out correctly before +# the program is run. + +# AIX--sections get mapped to the same address so we can't get the right one. +setup_xfail "rs6000-*-*" +setup_xfail "powerpc-*-*" + +gdb_test "print 'scope0.c'::filelocal_ro" "= 201" + +# gdb currently cannot access bss memory on some targets if the inferior +# is not running. +# +# For PA boards using monitor/remote-pa.c, the bss test is going to +# randomly fail. We've already put remote-pa on the target stack, +# so we actually read memory from the board. Problem is crt0.o +# is responsible for clearing bss and that hasnt' happened yet. +# +# This is a problem for all non-native targets. -- manson +if ![isnative] { + unsupported "print 'scope0.c'::filelocal_bss before run" +} else { + gdb_test "print 'scope0.c'::filelocal_bss" "= 0" \ + "print 'scope0.c'::filelocal_bss before run" +} + +gdb_test "print 'scope0.c'::filelocal" "= 1" \ + "print 'scope0.c'::filelocal before run" + +if [runto_main] then { test_at_main } +if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} +} +if [runto foo] then { test_at_foo } +if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} +} +if [runto bar] then { test_at_bar } +if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} +} +if [runto localscopes] then { test_at_localscopes } +if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} +} +if [runto autovars] then { test_at_autovars } + +if [istarget "*-*-vxworks*"] { + set timeout 120 + verbose "Timeout is now $timeout seconds" 2 +} diff --git a/gdb/testsuite/gdb.base/scope0.c b/gdb/testsuite/gdb.base/scope0.c new file mode 100644 index 00000000000..3a1b89e2500 --- /dev/null +++ b/gdb/testsuite/gdb.base/scope0.c @@ -0,0 +1,176 @@ +static int filelocal = 1; /* In Data section */ +static int filelocal_bss; /* In BSS section */ +#ifndef __STDC__ +#define const /**/ +#endif +static const int filelocal_ro = 201; /* In Read-Only Data section */ + +main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + init0 (); + foo (); + autovars (5, 6); + localscopes (0); +} + +/* On some systems, such as AIX, unreferenced variables are deleted + from the executable. */ +usestatics () +{ + useit (filelocal); + useit (filelocal_bss); + useit (filelocal_ro); +} + +init0 () +{ + filelocal_bss = 101; + init1 (); +} + +/* This is to derail optimizer in localscopes. + Return 1 + 2 + . . . + N. */ +int +sum_upto (n) + int n; +{ + int i; + int retval = 0; + + for (i = 1; i <= n; ++i) + retval += i; + return retval; +} + +int +useit (val) +{ + static int usedval; + + usedval = val; + return val + sum_upto (0); +} + +int +autovars (bcd, abc) + int bcd; + int abc; +{ + int i0 = useit (0), i1 = useit (1), i2 = useit (2); + int i3 = useit (3), i4 = useit (4), i5 = useit (5); + int i6 = useit (6), i7 = useit (7), i8 = useit (8); + int i9 = useit (9), i10 = useit (10), i11 = useit (11); + int i12 = useit (12), i13 = useit (13), i14 = useit (14); + int i15 = useit (15), i16 = useit (16), i17 = useit (17); + int i18 = useit (18), i19 = useit (19), i20 = useit (20); + int i21 = useit (21), i22 = useit (22), i23 = useit (23); + int i24 = useit (24), i25 = useit (25), i26 = useit (26); + int i27 = useit (27), i28 = useit (28), i29 = useit (29); + int i30 = useit (30), i31 = useit (31), i32 = useit (32); + int i33 = useit (33), i34 = useit (34), i35 = useit (35); + int i36 = useit (36), i37 = useit (37), i38 = useit (38); + int i39 = useit (39), i40 = useit (40), i41 = useit (41); + int i42 = useit (42), i43 = useit (43), i44 = useit (44); + int i45 = useit (45), i46 = useit (46), i47 = useit (47); + int i48 = useit (48), i49 = useit (49), i50 = useit (50); + int i51 = useit (51), i52 = useit (52), i53 = useit (53); + int i54 = useit (54), i55 = useit (55), i56 = useit (56); + int i57 = useit (57), i58 = useit (58), i59 = useit (59); + int i60 = useit (60), i61 = useit (61), i62 = useit (62); + int i63 = useit (63), i64 = useit (64), i65 = useit (65); + int i66 = useit (66), i67 = useit (67), i68 = useit (68); + int i69 = useit (69), i70 = useit (70), i71 = useit (71); + int i72 = useit (72), i73 = useit (73), i74 = useit (74); + int i75 = useit (75), i76 = useit (76), i77 = useit (77); + int i78 = useit (78), i79 = useit (79), i80 = useit (80); + int i81 = useit (81), i82 = useit (82), i83 = useit (83); + int i84 = useit (84), i85 = useit (85), i86 = useit (86); + int i87 = useit (87), i88 = useit (88), i89 = useit (89); + int i90 = useit (90), i91 = useit (91), i92 = useit (92); + int i93 = useit (93), i94 = useit (94), i95 = useit (95); + int i96 = useit (96), i97 = useit (97), i98 = useit (98); + int i99 = useit (99); + + /* Use all 100 of the local variables to derail agressive optimizers. */ + + useit ( i0); useit ( i1); useit ( i2); useit ( i3); useit ( i4); + useit ( i5); useit ( i6); useit ( i7); useit ( i8); useit ( i9); + useit (i10); useit (i11); useit (i12); useit (i13); useit (i14); + useit (i15); useit (i16); useit (i17); useit (i18); useit (i19); + useit (i20); useit (i21); useit (i22); useit (i23); useit (i24); + useit (i25); useit (i26); useit (i27); useit (i28); useit (i29); + useit (i30); useit (i31); useit (i32); useit (i33); useit (i34); + useit (i35); useit (i36); useit (i37); useit (i38); useit (i39); + useit (i40); useit (i41); useit (i42); useit (i43); useit (i44); + useit (i45); useit (i46); useit (i47); useit (i48); useit (i49); + useit (i50); useit (i51); useit (i52); useit (i53); useit (i54); + useit (i55); useit (i56); useit (i57); useit (i58); useit (i59); + useit (i60); useit (i61); useit (i62); useit (i63); useit (i64); + useit (i65); useit (i66); useit (i67); useit (i68); useit (i69); + useit (i70); useit (i71); useit (i72); useit (i73); useit (i74); + useit (i75); useit (i76); useit (i77); useit (i78); useit (i79); + useit (i80); useit (i81); useit (i82); useit (i83); useit (i84); + useit (i85); useit (i86); useit (i87); useit (i88); useit (i89); + useit (i90); useit (i91); useit (i92); useit (i93); useit (i94); + useit (i95); useit (i96); useit (i97); useit (i98); useit (i99); + + useit (abc); useit (bcd); + + marker1 (); + return i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + + i11 + i12 + i13 + i14 + i15 + i16 + i17 + i18 + i19 + i20 + + i21 + i22 + i23 + i24 + i25 + i26 + i27 + i28 + i29 + i30 + + i31 + i32 + i33 + i34 + i35 + i36 + i37 + i38 + i39 + i40 + + i41 + i42 + i43 + i44 + i45 + i46 + i47 + i48 + i49 + i50 + + i51 + i52 + i53 + i54 + i55 + i56 + i57 + i58 + i59 + i60 + + i61 + i62 + i63 + i64 + i65 + i66 + i67 + i68 + i69 + i70 + + i71 + i72 + i73 + i74 + i75 + i76 + i77 + i78 + i79 + i80 + + i81 + i82 + i83 + i84 + i85 + i86 + i87 + i88 + i89 + i90 + + i91 + i92 + i93 + i94 + i95 + i96 + i97 + i98 + i99 + abc + bcd; +} + +int +localscopes (x) + int x; +{ + int localval; + int retval; + int i; + + localval = 0; + useit (localval); + + { + int localval = x + 4 + sum_upto (3); /* 10 */ + int localval1 = x + 5 + sum_upto (3); /* 11 */ + + useit (localval); + useit (localval1); + marker2 (); + { + int localval = localval1 + 3 + sum_upto (3); /* 20 */ + int localval2 = localval1 + sum_upto (1); /* 12 */ + useit (localval); + useit (localval2); + marker3 (); + { + int localval = localval2 + 3 + sum_upto (5); /* 30 */ + int localval3 = localval2 + sum_upto (1); /* 13 */ + useit (localval); + useit (localval3); + marker4 (); + retval = x + localval1 + localval2 + localval3; + } + } + } + return retval; +} + +marker1 () {} +marker2 () {} +marker3 () {} +marker4 () {} diff --git a/gdb/testsuite/gdb.base/scope1.c b/gdb/testsuite/gdb.base/scope1.c new file mode 100644 index 00000000000..cccad6f321e --- /dev/null +++ b/gdb/testsuite/gdb.base/scope1.c @@ -0,0 +1,45 @@ +static int filelocal = 2; /* In Data section */ +static int filelocal_bss; /* In BSS section */ +#ifndef __STDC__ +#define const /**/ +#endif +static const int filelocal_ro = 202; /* In Read-Only Data section */ + +foo () +{ + static int funclocal = 3; /* In Data section */ + static int funclocal_bss; /* In BSS section */ + static const int funclocal_ro = 203; /* RO Data */ + static const int funclocal_ro_bss; /* RO Data */ + + funclocal_bss = 103; + bar (); +} + +bar () +{ + static int funclocal = 4; /* In data section */ + static int funclocal_bss; /* In BSS section */ + funclocal_bss = 104; +} + +init1 () +{ + filelocal_bss = 102; +} + +/* On some systems, such as AIX, unreferenced variables are deleted + from the executable. */ +usestatics1 () +{ + useit1 (filelocal); + useit1 (filelocal_bss); + useit1 (filelocal_ro); +} + +useit1 (val) +{ + static int usedval; + + usedval = val; +} diff --git a/gdb/testsuite/gdb.base/sect-cmd.exp b/gdb/testsuite/gdb.base/sect-cmd.exp new file mode 100644 index 00000000000..27bde04452a --- /dev/null +++ b/gdb/testsuite/gdb.base/sect-cmd.exp @@ -0,0 +1,109 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel + } + +global usestubs + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +# This test exists solely to exercise the "section" command for +# code-coverage on HP-UX. (So far as I can tell, the "section" +# command isn't needed on HP-UX, but probably is for embedded +# apps.) +# +if ![istarget "hppa*-*-hpux*"] then { + return +} + +set testfile "break" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { fail "section command tests suppressed" } + +# Get the $CODE$ section's starting address. +# +# (Note that this works for PA32 programs, which use the SOM file +# format. PA64 uses ELF, and when support for that is added, it's +# not clear that there'll be a section named "$CODE$" in such +# programs.) +# +send_gdb "info files\n" +gdb_expect { + -re ".*(0x\[0-9a-fA-F\]*) - (0x\[0-9a-fA-F\]*) is .CODE..*$gdb_prompt $"\ + {pass "info files"} + -re "$gdb_prompt $"\ + {fail "info files"} + timeout {fail "(timeout) info files"} +} + +# Reset the section to that same starting address, which should be +# harmless (i.e., we just want to exercise the section command). +# +send_gdb "section \$CODE\$ $expect_out(1,string)\n" +gdb_expect { + -re ".*$expect_out(1,string) \- $expect_out(2,string) is .CODE..*$gdb_prompt $"\ + {pass "set section command"} + -re "$gdb_prompt $"\ + {fail "set section command"} + timeout {fail "(timeout) set section command"} +} + +# Verify that GDB responds gracefully to a non-existent section name. +# +send_gdb "section FOOBARBAZ 0x1234\n" +gdb_expect { + -re "Section FOOBARBAZ not found\r\n$gdb_prompt $"\ + {pass "non-existent section disallowed"} + -re "$gdb_prompt $"\ + {fail "non-existent section disallowed"} + timeout {fail "(timeout) non-existent section disallowed"} +} + +# We "happen to know" that GDB uses a fixed size character buffer to +# parse the section name into, and the buffer is declared to be 100 +# characters in length. Verify that GDB gracefully handles section +# names longer than that. (The section is also non-existent.) +# +send_gdb "section A234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 0x1234\n" +gdb_expect { + -re "Section A23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 not found\r\n$gdb_prompt $"\ + {pass "non-existent too-long section disallowed"} + -re "$gdb_prompt $"\ + {fail "non-existent too-long section disallowed"} + timeout {fail "(timeout) non-existent too-long section disallowed"} +} + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/setshow.c b/gdb/testsuite/gdb.base/setshow.c new file mode 100644 index 00000000000..ed4e7a9a420 --- /dev/null +++ b/gdb/testsuite/gdb.base/setshow.c @@ -0,0 +1,22 @@ +/* IMPORTANT: leave this comment in the first line of this source file. */ +/* this will guarantee that line 1 contains no code. */ + +#include + +int +main(argc, argv) + int argc; + char **argv; +{ + int i = 1; +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + + if (argc <= 0 || argc > 8) + return -1; + while (i < argc) + printf ("%s ", argv[i++]); + return 0; +} diff --git a/gdb/testsuite/gdb.base/setshow.exp b/gdb/testsuite/gdb.base/setshow.exp new file mode 100644 index 00000000000..37c2f84034c --- /dev/null +++ b/gdb/testsuite/gdb.base/setshow.exp @@ -0,0 +1,243 @@ +# Copyright (C) 1992, 1994, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "setshow" +set srcfile ${srcdir}/${subdir}/${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile ${srcfile} ${binfile} executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Start with a fresh gdb + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# make sure $pc is sane, in case we're talking to a board. +if { ![runto_main] } { + gdb_suppress_tests; +} + +# +# Test gdb set and show commands. +# Add tests here for show and set that don't fit neatly elsewhere. +# FIXME: many rudimentary tests for set and show commands have been +# added below, but most do nothing more than check that a +# variable has been set successfully, ie. they do not test +# whether setting the variable has had the desired effect. +# + +#test default annotation_level is 0 +gdb_test "show annotate" "Annotation_level is 0..*" "default annotation_level is zero" + +#test set annotate 2 +send_gdb "set annotate 2\n" +gdb_expect { + -re ".*\032\032pre-prompt.*$gdb_prompt .*\032\032prompt.*$" \ + { pass "set annotate 2" } + -re ".*$gdb_prompt $" { fail "set annotate 2" } + timeout { fail "(timeout) set annotate 2" } + } + +send_gdb "show annotate\n" +gdb_expect { + -re ".*\032\032post-prompt.*Annotation_level is 2..*\032\032pre-prompt.*$gdb_prompt .*\032\032prompt.*$" \ + { pass "show annotate (2)" } + -re ".*$gdb_prompt $" { fail "show annotate (2)" } + timeout { fail "(timeout) show annotate (2)" } + } + +#test annotation_level 2 +send_gdb "info line 1\n" +gdb_expect { + -re ".*\032\032post-prompt.*Line 1 of .* is at address .* but contains no code.*:1:0:beg:0x.*\032\032pre-prompt.*$gdb_prompt .*\032\032prompt.*$" \ + { pass "annotation_level 2" } + -re ".*$gdb_prompt $" { fail "annotation_level 2" } + timeout { fail "(timeout) annotation_level 2" } + } + +#test set annotate 1 +gdb_test "set annotate 1" ".*post-prompt.*" "set annotate 1" +gdb_test "show annotate" "Annotation_level is 1..*" "show annotate (1)" +#test annotation_level 1 +gdb_test "info line 1" "Line 1 of .* is at address .* but contains no code.*:1:0:beg:0x.*" "annotation_level 1" +#test set annotate 0 +gdb_test "set annotate 0" "" "set annotate 0" +gdb_test "show annotate" "Annotation_level is 0..*" "show annotate (0)" +#test annotation_level 0 +gdb_test "info line 1" "Line 1 of .* is at address .* but contains no code.*" "annotation_level 0" +#test set args +gdb_test "set args foo bar blup baz bubble" "" "set args" +#test show args +gdb_test "show args" "Argument list to give program being debugged when it is started is \"foo bar blup baz bubble\"..*" "show args" + +# Don't test if we can't pass args or if we're using a stub. +if { ![target_info exists use_gdb_stub] && ![target_info exists noargs] } { + #test passing args + gdb_test "cont" "Continuing.*" "continuing" + delete_breakpoints + gdb_test "run" "Starting program:.*foo bar blup baz bubble.*" "passing args" +} +#test set check range on +gdb_test "set check range on" "" "set check range on" +#test show check range on +gdb_test "show check range" "Range checking is \"on\"\..*" "show check range (on)" +#test set check range auto +gdb_test "set check range auto" "" "set check range auto" +#test show check range auto +gdb_test "show check range" "Range checking is \"auto; currently .*" "show check range (auto)" +#test set check type on +gdb_test "set check type on" "" "set check type on" +#test show check type on +gdb_test "show check type" "Type checking is \"on\"..*" "show check type (on)" +#test set check type auto +gdb_test "set check type auto" "" "set check type auto" +#test show check type +gdb_test "show check type" "Type checking is \"auto; currently .*" "show check type (auto)" +#test set complaints 100 +gdb_test "set complaints 100" "" "set complaints 100" +#test show complaints 100 +gdb_test "show complaints" "Max number of complaints about incorrect symbols is 100..*" "show complaints (100)" +#test set complaints 0 +gdb_test "set complaints 0" "" "set complaints 0" +#test show complaints 0 +gdb_test "show complaints" "Max number of complaints about incorrect symbols is 0..*" "show complaints (0)" +#test set confirm off +gdb_test "set confirm off" "" "set confirm off" +#test show confirm off +gdb_test "show confirm" "Whether to confirm potentially dangerous operations is off..*" "show confirm (off)" +#test set confirm on +gdb_test "set confirm on" "" "set confirm on" +#test show confirm on +gdb_test "show confirm" "Whether to confirm potentially dangerous operations is on..*" "show confirm (on)" +#test set editing off +gdb_test "set editing off" "" "set editing off" +#test show editing off +gdb_test "show editing" "Editing of command lines as they are typed is off..*" "show editing (off)" +#test set editing on +#gdb_test "set editing on" "" "set editing on" +#test show editing on +#gdb_test "show editing" "Editing of command lines as they are typed is on..*" "show editing (on)" +#test set environment FOOBARBAZ +gdb_test "set environment FOOBARBAZ = grbxgrbxgrbx" "" "set environment FOOBARBAZ" +#test show environment FOOBARBAZ +gdb_test "show environment FOOBARBAZ" "FOOBARBAZ = grbxgrbxgrbx.*" "show environment FOOBARBAZ" +#test set height 100 +gdb_test "set height 100" "" "set height 100" +#test show height 100 +gdb_test "show height" "Number of lines gdb thinks are in a page is 100..*" "show height" +#test set history expansion on +gdb_test "set history expansion on" "" "set history expansion on" +#test show history expansion on +gdb_test "show history expansion on" "History expansion on command input is on.*" "show history expansion" +#test set history filename foobar.baz +gdb_test "set history filename foobar.baz" "" "set history filename foobar.baz" +#test show history filename foobar.baz +gdb_test "show history filename" "The filename in which to record the command history is \"foobar.baz\"..*" "show history filename (foobar.baz)" +#test set history save on +gdb_test "set history save on" "" "set history save on" +#test show history save on +gdb_test "show history save" "Saving of the history record on exit is on..*" "show history save (on)" +#test set history size 100 +gdb_test "set history size 100" "" "set history size 100" +#test show history size 100 +gdb_test "show history size" "The size of the command history is 100..*" "show history size (100)" +#test set language asm +gdb_test "set language asm" "" "set language asm" +#test show language asm +gdb_test "show language" "The current source language is \"asm\"..*" "show language (asm)" +#test set language auto +gdb_test "set language auto" "" "set language auto" +#test show language +gdb_test "show language" "The current source language is \"auto.*\"..*" "show language (auto)" +#test set listsize 100 +gdb_test "set listsize 100" "" "set listsize 100" +#test show listsize 100 +gdb_test "show listsize" "Number of source lines gdb will list by default is 100..*" "show listsize (100)" + +if ![board_info target exists gdb_prompt] { + #test set prompt (FooBarBaz) + set newprompt "\\(FooBarBaz\\)" + send_gdb "set prompt (FooBarBaz) \n" + gdb_expect { + -re "$newprompt $" { pass "set prompt (FooBarBaz) " } + timeout { fail "(timeout) set prompt (FooBarBaz) " } + } + + #test show prompt (FooBarBaz) + send_gdb "show prompt\n" + gdb_expect { + -re "Gdb's prompt is \"$newprompt \"..* $" \ + { pass "show prompt (FooBarBaz) " } + timeout { fail "(timeout) show prompt (FooBarBaz) " } + } + + #test set prompt (gdb) + send_gdb "set prompt (gdb) \n" + gdb_expect { + -re "$gdb_prompt $" { pass "set prompt (gdb) " } + timeout { fail "(timeout) set prompt (gdb) " } + } +} + +#test set radix 11 +gdb_test "set radix 11" "Unsupported output radix ``decimal 11''; output radix unchanged..*" "set radix 11" +#test set radix 16 +gdb_test "set radix 16" "Input and output radices now set to decimal 16, hex 10, octal 20..*" "set radix 16" +#test show radix 16 +gdb_test "show radix" "Input and output radices set to decimal 16, hex 10, octal 20..*" "show radix (16)" +#test set radix 10 +gdb_test "set radix" "Input and output radices now set to decimal 10, hex a, octal 12..*" "set radix 10" +#test show radix 10 +gdb_test "show radix" "Input and output radices set to decimal 10, hex a, octal 12..*" "show radix (10)" +#test set width 90 +gdb_test "set width 90" "" "set width 90" +#test show width 90 +gdb_test "show width" "Number of characters gdb thinks are in a line is 90..*" "show width (90)" +#test set write on +# This is only supported on targets which use exec.o. +gdb_test "set write on" "" "set write on" +#test show write on +# This is only supported on targets which use exec.o. +gdb_test "show write" "Writing into executable and core files is on..*" "show write (on)" +#test set symbol-reloading on +gdb_test "set symbol-reloading on" "" "set symbol-reloading on" +#test show symbol-reloading on +gdb_test "show symbol-reloading" "Dynamic symbol table reloading multiple times in one run is on..*" "show symbol-reloading (on)" +#test show user +gdb_test "show user" "" "show user" +#test set verbose on +gdb_test "set verbose on" "" "set verbose on" +#test show verbose on +gdb_test "show verbose" "Verbose printing of informational messages is on..*" "show verbose (on)" +#test set verbose off +gdb_test "set verbose off" "" "set verbose off" +#test show verbose off +gdb_test "show verbose" "Verbosity is off..*" "show verbose (off)" diff --git a/gdb/testsuite/gdb.base/setvar.c b/gdb/testsuite/gdb.base/setvar.c new file mode 100644 index 00000000000..7162155e79f --- /dev/null +++ b/gdb/testsuite/gdb.base/setvar.c @@ -0,0 +1,271 @@ +main (argc, argv, envp) + int argc; + char **argv; + char **envp; +{ + extern void dummy(); +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + dummy(); +} + +/* We put main() right up front so its line number doesn't keep changing. */ + +/* + * Test file with lots of different types, for testing the + * "whatis" command. + */ + +/* + * First the basic C types. + */ + +#if !defined (__STDC__) && !defined (_AIX) +#define signed /**/ +#endif + +char v_char; +signed char v_signed_char; +unsigned char v_unsigned_char; + +short v_short; +signed short v_signed_short; +unsigned short v_unsigned_short; + +int v_int; +signed int v_signed_int; +unsigned int v_unsigned_int; + +long v_long; +signed long v_signed_long; +unsigned long v_unsigned_long; + +float v_float; +double v_double; + +/* + * Now some derived types, which are arrays, functions-returning, + * pointers, structures, unions, and enumerations. + */ + +/**** arrays *******/ + +char v_char_array[2]; +signed char v_signed_char_array[2]; +unsigned char v_unsigned_char_array[2]; + +short v_short_array[2]; +signed short v_signed_short_array[2]; +unsigned short v_unsigned_short_array[2]; + +int v_int_array[2]; +signed int v_signed_int_array[2]; +unsigned int v_unsigned_int_array[2]; + +long v_long_array[2]; +signed long v_signed_long_array[2]; +unsigned long v_unsigned_long_array[2]; + +float v_float_array[2]; +double v_double_array[2]; + +/**** pointers *******/ + +char *v_char_pointer; +signed char *v_signed_char_pointer; +unsigned char *v_unsigned_char_pointer; + +short *v_short_pointer; +signed short *v_signed_short_pointer; +unsigned short *v_unsigned_short_pointer; + +int *v_int_pointer; +signed int *v_signed_int_pointer; +unsigned int *v_unsigned_int_pointer; + +long *v_long_pointer; +signed long *v_signed_long_pointer; +unsigned long *v_unsigned_long_pointer; + +float *v_float_pointer; +double *v_double_pointer; + +/**** structs *******/ + +struct t_struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_struct1; + +struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_struct2; + +/**** unions *******/ + +union t_union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_union; + +union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_union2; + +/*** Functions returning type ********/ + +char v_char_func () { return(0); } +signed char v_signed_char_func () { return (0); } +unsigned char v_unsigned_char_func () { return (0); } + +short v_short_func () { return (0); } +signed short v_signed_short_func () { return (0); } +unsigned short v_unsigned_short_func () { return (0); } + +int v_int_func () { return (0); } +signed int v_signed_int_func () { return (0); } +unsigned int v_unsigned_int_func () { return (0); } + +long v_long_func () { return (0); } +signed long v_signed_long_func () { return (0); } +unsigned long v_unsigned_long_func () { return (0); } + +float v_float_func () { return (0.0); } +double v_double_func () { return (0.0); } + +/**** Some misc more complicated things *******/ + +struct link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *this, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} *s_link; + +union tu_link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *this, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} u_link; + +/**** Enumerations *******/ + +enum colors {red, green, blue} color; +enum cars {chevy, ford, porsche} clunker; + +/**** Enumeration bitfields, supported by GNU C *******/ + +#ifdef __GNUC__ +enum senum {sm1 = -1, s1 = 1}; +struct senum_field {enum senum field:2; } sef; +enum uenum {u1 = 1, u2 = 2}; +struct uenum_field {enum uenum field:2; } uef; +#endif + +void +dummy () +{ + /* setvar.exp wants to allocate memory for constants. So make sure malloc + gets linked into the program. */ + malloc (1); + + /* Some linkers (e.g. on AIX) remove unreferenced variables, + so make sure to reference them. */ + v_char = 0; + v_signed_char = 1; + v_unsigned_char = 2; + + v_short = 3; + v_signed_short = 4; + v_unsigned_short = 5; + + v_int = 6; + v_signed_int = 7; + v_unsigned_int = 8; + + v_long = 9; + v_signed_long = 10; + v_unsigned_long = 11; + + v_float = 100.0; + v_double = 200.0; + + + v_char_array[0] = v_char; + v_signed_char_array[0] = v_signed_char; + v_unsigned_char_array[0] = v_unsigned_char; + + v_short_array[0] = v_short; + v_signed_short_array[0] = v_signed_short; + v_unsigned_short_array[0] = v_unsigned_short; + + v_int_array[0] = v_int; + v_signed_int_array[0] = v_signed_int; + v_unsigned_int_array[0] = v_unsigned_int; + + v_long_array[0] = v_long; + v_signed_long_array[0] = v_signed_long; + v_unsigned_long_array[0] = v_unsigned_long; + + v_float_array[0] = v_float; + v_double_array[0] = v_double; + + v_char_pointer = &v_char; + v_signed_char_pointer = &v_signed_char; + v_unsigned_char_pointer = &v_unsigned_char; + + v_short_pointer = &v_short; + v_signed_short_pointer = &v_signed_short; + v_unsigned_short_pointer = &v_unsigned_short; + + v_int_pointer = &v_int; + v_signed_int_pointer = &v_signed_int; + v_unsigned_int_pointer = &v_unsigned_int; + + v_long_pointer = &v_long; + v_signed_long_pointer = &v_signed_long; + v_unsigned_long_pointer = &v_unsigned_long; + + v_float_pointer = &v_float; + v_double_pointer = &v_double; + + color = red; + clunker = porsche; + + u_link.next = s_link; + + v_struct2.v_int_member = v_struct1.v_int_member; + v_union2.v_short_member = v_union.v_short_member; + +#ifdef __GNUC__ + sef.field = s1; + uef.field = u1; +#endif +} diff --git a/gdb/testsuite/gdb.base/setvar.exp b/gdb/testsuite/gdb.base/setvar.exp new file mode 100644 index 00000000000..96d3eb45f53 --- /dev/null +++ b/gdb/testsuite/gdb.base/setvar.exp @@ -0,0 +1,420 @@ +# Copyright (C) 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# Copyright (C) 1988, 1990, 1991, 1992, 1994, 1995 +# 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "setvar" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile + +# +# set it up at a breakpoint so we canplay with the variable values +# +send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# Determine expected output for unsigned long variables, +# the output varies with sizeof (unsigned long). + +set ulong_minus_1 4294967295 +set ulong_minus_456 4294966840 +send_gdb "print sizeof (unsigned long)\n" +gdb_expect { + -re ".\[0-9\]* = 4.*$gdb_prompt $" {} + -re ".\[0-9\]* = 8.*$gdb_prompt $" { + set ulong_minus_1 18446744073709551615 + set ulong_minus_456 18446744073709551160 + } + -re ".*$gdb_prompt $" { + fail "getting sizeof unsigned long" + } + default { fail "(timeout) getting sizeof unsigned long" } +} + +proc test_set { args } { + global gdb_prompt + + set length [expr [llength $args] - 1]; + set message "[lindex $args $length]"; + set final [expr $length - 2]; + set count 1; + + # Set up the variables. + for {set x 0;} {$x < $length} {incr x;} { + if { "[lindex $args $x]" != "" } { + set arg [lindex $args $x]; + if { ($x == $final) || ([string first ".*" [lindex $args [expr $x + 1]]] >= 0) } { + set match [lindex $args [expr $x + 1]]; + if { $count == 1 } { + set mess "$message" + } else { + set mess "$message (#$count)"; + } + incr count; + incr x; + } else { + set mess ""; + set match "" + } + verbose "doing $arg $match" + if [gdb_test "$arg" "$match" "$mess"] { + fail "$message -- $match"; + return 1; + } + } + } + return 0; +} + +# +# test "set variable" for type "char" +# +# Because bare char types can be either signed or unsigned, we just test the +# range of values that are common to both (0-127). +# + +test_set "set variable v_char=0" "print v_char" ".\[0-9\]* = 0 \'.000\'" "set variable char=0" +test_set "set variable v_char=1" "print v_char" ".\[0-9\]* = 1 \'.001\'" "set variable char=1" +test_set "set variable v_char=27" "print v_char" ".\[0-9\]* = 27 \'.e\'" "set variable char=27 (Esc)" +test_set "set variable v_char=32" "print v_char" ".\[0-9\]* = 32 \' \'" "set variable char=32 (SPC)" +test_set "set variable v_char=65" "print v_char" ".\[0-9\]* = 65 \'A\'" "set variable char=65 ('A')" +test_set "set variable v_char=97" "print v_char" ".\[0-9\]* = 97 \'a\'" "set variable char=97 ('a')" +test_set "set variable v_char=126" "print v_char" ".\[0-9\]* = 126 \'~\'" "set variable char=126 ('~')" +test_set "set variable v_char=127" "print v_char" ".\[0-9\]* = 127 \'.177\'" "set variable char=127 (8-bit)" +# +# test "set variable" for type "signed char" +# +test_set "set variable v_char=0" "print v_signed_char" ".\[0-9\]* = 0 \'.000\'" "set variable signed char=0" +test_set "set variable v_signed_char=1" "print v_signed_char" ".\[0-9\]* = 1 \'.001\'" "set variable signed char=1" +test_set "set variable v_signed_char=27" "print v_signed_char" ".\[0-9\]* = 27 \'.e\'" "set variable signed char=27 (Esc)" +test_set "set variable v_signed_char=32" "print v_signed_char" ".\[0-9\]* = 32 \' \'" "set variable signed char=32 (SPC)" +test_set "set variable v_signed_char=65" "print v_signed_char" ".\[0-9\]* = 65 \'A\'" "set variable signed char=65 ('A')" +test_set "set variable v_signed_char=97" "print v_signed_char" ".\[0-9\]* = 97 \'a\'" "set variable signed char=97 ('a')" +test_set "set variable v_signed_char=126" "print v_signed_char" ".\[0-9\]* = 126 \'~\'" "set variable signed char=126 ('~')" +test_set "set variable v_signed_char=127" "print v_signed_char" ".\[0-9\]* = 127 \'.177\'" "set variable signed char=127 (8-bit)" +gdb_test "set variable v_signed_char=-1" "" +if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix4*" } +gdb_test "print v_signed_char" ".\[0-9\]* = -1 \'.377\'" \ + "set variable signed char=-1 (-1)" +gdb_test "set variable v_signed_char=0xFF" "" +if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix4*" } +gdb_test "print v_signed_char" ".\[0-9\]* = -1 \'.377\'" \ + "set variable signed char=0xFF (0xFF)" +# +# test "set variable" for type "unsigned char" +# +test_set "set variable v_unsigned_char=0" "print v_unsigned_char" ".\[0-9\]* = 0 \'.000\'" "set variable unsigned char=0" +test_set "set variable v_unsigned_char=1" "print v_unsigned_char" ".\[0-9\]* = 1 \'.001\'" "set variable unsigned char=1" +test_set "set variable v_unsigned_char=27" "print v_unsigned_char" ".\[0-9\]* = 27 \'.e\'" "set variable unsigned char=27 (Esc)" +test_set "set variable v_unsigned_char=32" "print v_unsigned_char" ".\[0-9\]* = 32 \' \'" "set variable unsigned char=32 (SPC)" +test_set "set variable v_unsigned_char=65" "print v_unsigned_char" ".\[0-9\]* = 65 \'A\'" "set variable unsigned char=65 ('A')" +test_set "set variable v_unsigned_char=97" "print v_unsigned_char" ".\[0-9\]* = 97 \'a\'" "set variable unsigned char=97 ('a')" +test_set "set variable v_unsigned_char=126" "print v_unsigned_char" ".\[0-9\]* = 126 \'~\'" "set variable unsigned char=126 ('~')" +test_set "set variable v_unsigned_char=~0" "print v_unsigned_char" ".\[0-9\]* = 255 \'.377\'" "set variable unsigned char=255 (8-bit)" +# +# test "set variable" for type "short" +# +test_set "set variable v_short=0" "print v_short" ".\[0-9\]* = 0" "set variable short=0" +test_set "set variable v_short=1" "print v_short" ".\[0-9\]* = 1" "set variable short=1" +test_set "set variable v_short=-1" "print v_short" ".\[0-9\]* = -1" "set variable short=-1 (minus)" +# +# test "set variable" for type "signed short" +# +test_set "set variable v_signed_short=0" "print v_signed_short" ".\[0-9\]* = 0" "set variable signed short=0" +test_set "set variable v_signed_short=1" "print v_signed_short" ".\[0-9\]* = 1" "set variable signed short=1" +test_set "set variable v_signed_short=-1" "print v_signed_short" ".\[0-9\]* = -1" "set variable signed short=-1 (minus)" +# +# test "set variable" for type "unsigned short" +# +test_set "set variable v_unsigned_short=0" "print v_unsigned_short" ".\[0-9\]* = 0" "set variable unsigned short=0" +test_set "set variable v_unsigned_short=1" "print v_unsigned_short" ".\[0-9\]* = 1" "set variable unsigned short=1" +test_set "set variable v_unsigned_short=~0" "print v_unsigned_short" ".\[0-9\]* = 65535" "set variable unsigned short=~0 (minus)" +# +# test "set variable" for type "int" +# +test_set "set variable v_int=0" "print v_int" ".\[0-9\]* = 0" "set variable int=0" +test_set "set variable v_int=1" "print v_int" ".\[0-9\]* = 1" "set variable int=1" +test_set "set variable v_int=-1" "print v_int" ".\[0-9\]* = -1" "set variable int=-1 (minus)" +# +# test "set variable" for type "signed int" +# +test_set "set variable v_signed_int=0" "print v_signed_int" ".\[0-9\]* = 0" "set variable signed int=0" +test_set "set variable v_signed_int=1" "print v_signed_int" ".\[0-9\]* = 1" "set variable signed int=1" +test_set "set variable v_signed_int=-1" "print v_signed_int" ".\[0-9\]* = -1" "set variable signed int=-1 (minus)" +# +# test "set variable" for type "unsigned int" +# +test_set "set variable v_unsigned_int=0" "print v_unsigned_int" ".\[0-9\]* = 0" "set variable unsigned int=0" +test_set "set variable v_unsigned_int=1" "print v_unsigned_int" ".\[0-9\]* = 1" "set variable unsigned int=1" +test_set "set variable v_unsigned_int=~0" "print v_unsigned_int" ".\[0-9\]* = (4294967295|65535)" "set variable unsigned int=~0 (minus)" +#test_set ".\[0-9\]* = 65535" "set variable unsigned int=~0 (minus)" +# +# test "set variable" for type "long" +# +test_set "set variable v_long=0" "print v_long" ".\[0-9\]* = 0" "set variable long=0" +test_set "set variable v_long=1" "print v_long" ".\[0-9\]* = 1" "set variable long=1" +test_set "set variable v_long=-1" "print v_long" ".\[0-9\]* = -1" "set variable long=-1 (minus)" +# +# test "set variable" for type "signed long" +# +test_set "set variable v_signed_long=0" "print v_signed_long" ".\[0-9\]* = 0" "set variable signed long=0" +test_set "set variable v_signed_long=1" "print v_signed_long" ".\[0-9\]* = 1" "set variable signed long=1" +test_set "set variable v_signed_long=-1" "print v_signed_long" ".\[0-9\]* = -1" "set variable signed long=-1 (minus)" +# +# test "set variable" for type "unsigned long" +# +test_set "set variable v_unsigned_long=0" "print v_unsigned_long" ".\[0-9\]* = 0" "set variable unsigned long=0" +test_set "set variable v_unsigned_long=1" "print v_unsigned_long" ".\[0-9\]* = 1" "set variable unsigned long=1" +test_set "set variable v_unsigned_long=~0" "print v_unsigned_long" ".\[0-9\]* = $ulong_minus_1" "set variable unsigned long=~0 (minus)" +# +# test "set variable" for type "float" +# +test_set "set variable v_float=0.0" "print v_float" ".\[0-9\]* = 0" "set variable float=0" +test_set "set variable v_float=1.0" "print v_float" ".\[0-9\]* = 1" "set variable float=1" +test_set "set variable v_float=-1.0" "print v_float" ".\[0-9\]* = -1" "set variable float=-1 (minus)" +# +# test "set variable" for type "double" +# +test_set "set variable v_double=0.0" "print v_double" ".\[0-9\]* = 0" "set variable double=0" +test_set "set variable v_double=1.0" "print v_double" ".\[0-9\]* = 1" "set variable double=1" +test_set "set variable v_double=-1.0" "print v_double" ".*.\[0-9\]* = -1" "set variable double=-1 (minus)" +# +# test "set variable" for "char array[2]" +# +test_set "set variable v_char_array\[0\]='h'" "set variable v_char_array\[1\]='i'" "print v_char_array" ".*.\[0-9\]* =.*\"hi\"" "set variable char array=\"hi\" (string)" +# +# test "set variable" for "signed char array[2]" +# +test_set "set variable v_signed_char_array\[0\]='h'" "set variable v_signed_char_array\[1\]='i'" "print v_signed_char_array" ".*.\[0-9\]* =.*\"hi\"" "set variable signed char array=\"hi\" (string)" +# +# test "set variable" for "unsigned char array[2]" +# +test_set "set variable v_unsigned_char_array\[0\]='h'" "set variable v_unsigned_char_array\[1\]='i'" "print v_unsigned_char_array" ".*.\[0-9\]* =.*\"hi\"" "set variable unsigned char array=\"hi\" (string)" +# +# test "set variable" for "short array[2]" +# +test_set "set variable v_short_array\[0\]=123" "set variable v_short_array\[1\]=-456" "print v_short_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "set variable short array" +# +# test "set variable" for "signed short array[2]" +# +test_set "set variable v_signed_short_array\[0\]=123" "set variable v_signed_short_array\[1\]=-456" "print v_signed_short_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "set variable signed short array" +# +# test "set variable" for "unsigned short array[2]" +# +test_set "set variable v_unsigned_short_array\[0\]=123" "set variable v_unsigned_short_array\[1\]=-456" "print v_unsigned_short_array" ".*.\[0-9\]* =.*\{123,.*65080\}" "set variable unsigned short array" +# +# test "set variable" for "int array[2]" +# +test_set "set variable v_int_array\[0\]=123" "set variable v_int_array\[1\]=-456" "print v_int_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "set variable int array" +# +# test "set variable" for "signed int array[2]" +# +test_set "set variable v_signed_int_array\[0\]=123" "set variable v_signed_int_array\[1\]=-456" "print v_signed_int_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "set variable signed int array" +# +# test "set variable" for "unsigned int array[2]" +# +test_set "set variable v_unsigned_int_array\[0\]=123" "set variable v_unsigned_int_array\[1\]=-456" "print v_unsigned_int_array" ".*.\[0-9\]* =.*\{123,.*(4294966840|65080)\}" "set variable unsigned int array" +# +# test "set variable" for "long array[2]" +# +test_set "set variable v_long_array\[0\]=123" "set variable v_long_array\[1\]=-456" "print v_long_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "set variable long array" +# +# test "set variable" for "signed long array[2]" +# +test_set "set variable v_signed_long_array\[0\]=123" "set variable v_signed_long_array\[1\]=-456" "print v_signed_long_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "set variable signed long array" +# +# test "set variable" for "unsigned long array[2]" +# +test_set "set variable v_unsigned_long_array\[0\]=123" "set variable v_unsigned_long_array\[1\]=-456" "print v_unsigned_long_array" ".*.\[0-9\]* =.*\{123,.*$ulong_minus_456\}" "set variable unsigned long array" +# +# test "set variable" for "float array[2]" +# +test_set "set variable v_float_array\[0\]=123.0" "set variable v_float_array\[1\]=-456.0" "print v_float_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "set variable float array" +# +# test "set variable" for "double array[2]" +# +test_set "set variable v_double_array\[0\]=123.0" "set variable v_double_array\[1\]=-456.0" "print v_double_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "set variable double array" +# +# test "set variable" for type "char *" +# +test_set "set v_char_pointer=v_char_array" "set variable *(v_char_pointer)='h'" "set variable *(v_char_pointer+1)='i'" "print v_char_array" ".*.\[0-9\]* =.*\"hi\"" "print *(v_char_pointer+1)" ".*.\[0-9\]* = 105 \'i\'" "set variable char pointer=\"hi\" (string)" +# +# test "set variable" for type "signed char *" +# +test_set "set v_signed_char_pointer=v_signed_char_array" "set variable *(v_signed_char_pointer)='h'" "set variable *(v_signed_char_pointer+1)='i'" "print v_signed_char_array" ".*.\[0-9\]* =.*\"hi\"" "print *(v_signed_char_pointer+1)" ".*.\[0-9\]* = 105 \'i\'" "set variable signed char pointer=\"hi\" (string)" +# +# test "set variable" for type "unsigned char *" +# +test_set "set v_unsigned_char_pointer=v_unsigned_char_array" "set variable *(v_unsigned_char_pointer)='h'" "set variable *(v_unsigned_char_pointer+1)='i'" "print v_unsigned_char_array" ".*.\[0-9\]* =.*\"hi\"" "print *(v_unsigned_char_pointer+1)" ".*.\[0-9\]* = 105 \'i\'" "set variable unsigned char pointer=\"hi\" (string)" +# +# test "set variable" for type "short *" +# +test_set "set v_short_pointer=v_short_array" "set variable *(v_short_pointer)=123" "set variable *(v_short_pointer+1)=-456" "print v_short_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "print *(v_short_pointer+1)" ".*.\[0-9\]* = -456" "set variable short pointer" +# +# test "set variable" for type "signed short *" +# +gdb_test "set v_signed_short_pointer=v_signed_short_array" "" +gdb_test "set variable *(v_signed_short_pointer)=123" "" +gdb_test "set variable *(v_signed_short_pointer+1)=-456" "" +gdb_test "print v_signed_short_array" ".\[0-9\]* =.*\{123,.*-456\}" \ + "set variable signed short pointer" +gdb_test "print *(v_signed_short_pointer+1)" ".\[0-9\]*.*=.*-456" +# +# test "set variable" for type "unsigned short *" +# +gdb_test "set v_unsigned_short_pointer=v_unsigned_short_array" "" +gdb_test "set variable *(v_unsigned_short_pointer)=123" "" +gdb_test "set variable *(v_unsigned_short_pointer+1)=-456" "" +gdb_test "print v_unsigned_short_array" ".\[0-9\]* =.*\{123,.*65080\}" \ + "set variable unsigned short pointer" +gdb_test "print *(v_unsigned_short_pointer+1)" ".\[0-9\]* = 65080" +# +# test "set variable" for type "int *" +# +test_set "set v_int_pointer=v_int_array" "set variable *(v_int_pointer)=123" "set variable *(v_int_pointer+1)=-456" "print v_int_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "print *(v_int_pointer+1)" ".*.\[0-9\]* = -456" "set variable int pointer" +# +# test "set variable" for type "signed int *" +# +test_set "set v_signed_int_pointer=v_signed_int_array" "set variable *(v_signed_int_pointer)=123" "set variable *(v_signed_int_pointer+1)=-456" "print v_signed_int_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "print *(v_signed_int_pointer+1)" ".*.\[0-9\]* = -456" "set variable signed int pointer" +# +# test "set variable" for type "unsigned int *" +# +test_set "set v_unsigned_int_pointer=v_unsigned_int_array" "set variable *(v_unsigned_int_pointer)=123" "set variable *(v_unsigned_int_pointer+1)=-456" "print v_unsigned_int_array" ".*.\[0-9\]* =.*\{123,.*(4294966840|65080)\}" "set variable unsigned int pointer" +test_set "" "print *(v_unsigned_int_pointer+1)" ".*.\[0-9\]* = (4294966840|65080)" "print variable unsigned int pointer+1" +# +# test "set variable" for type "long *" +# +test_set "set v_long_pointer=v_long_array" "set variable *(v_long_pointer)=123" "set variable *(v_long_pointer+1)=-456" "print v_long_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "print *(v_long_pointer+1)" ".*.\[0-9\]* = -456" "set variable long pointer" +# +# test "set variable" for type "signed long *" +# +test_set "set v_signed_long_pointer=v_signed_long_array" "set variable *(v_signed_long_pointer)=123" "set variable *(v_signed_long_pointer+1)=-456" "print v_signed_long_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "print *(v_signed_long_pointer+1)" ".*.\[0-9\]* = -456" "set variable signed long pointer" +# +# test "set variable" for type "unsigned long *" +# +test_set "set v_unsigned_long_pointer=v_unsigned_long_array" "set variable *(v_unsigned_long_pointer)=123" "set variable *(v_unsigned_long_pointer+1)=-456" "print v_unsigned_long_array" ".*.\[0-9\]* =.*\{123,.*$ulong_minus_456\}" "print *(v_unsigned_long_pointer+1)" ".*.\[0-9\]* = $ulong_minus_456" "set variable unsigned long pointer" +# +# test "set variable" for type "float *" +# +test_set "set v_float_pointer=v_float_array" "set variable *(v_float_pointer)=123.0" "set variable *(v_float_pointer+1)=-456.0" "print v_float_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "print *(v_float_pointer+1)" ".*.\[0-9\]* = -456" "set variable float pointer" +# +# test "set variable" for type "double *" +# +test_set "set v_double_pointer=v_double_array" "set variable *(v_double_pointer)=123.0" "set variable *(v_double_pointer+1)=-456.0" "print v_double_array" ".*.\[0-9\]* =.*\{123,.*-456\}" "print *(v_double_pointer+1)" ".*.\[0-9\]* = -456" "set variable double pointer" +# +# test "set variable" for struct members +# +test_set "set variable v_struct1.v_char_member='h'" "print v_struct1.v_char_member" ".*.\[0-9\]* = 104 \'h\'" "set variable structure char member" +test_set "set variable v_struct1.v_short_member=1" "print v_struct1.v_short_member" ".*.\[0-9\]* = 1" "set variable structure short member" +test_set "set variable v_struct1.v_int_member=2" "print v_struct1.v_int_member" ".*.\[0-9\]* = 2" "set variable structure int member" +test_set "set variable v_struct1.v_long_member=3" "print v_struct1.v_long_member" ".*.\[0-9\]* = 3" "set variable structure long member" +test_set "set variable v_struct1.v_float_member=4.0" "print v_struct1.v_float_member" ".*.\[0-9\]* = 4" "set variable structure float member" +test_set "set variable v_struct1.v_double_member=5.0" "print v_struct1.v_double_member" ".*.\[0-9\]* = 5" "set variable structure double member" + +gdb_test "print v_struct1" \ + ".*.\[0-9\]* = \{.*v_char_member = 104 \'h\',.*v_short_member = 1,\ +.*v_int_member = 2,.*\ +v_long_member = 3,.*v_float_member = 4,.*v_double_member = 5.*\}" \ + "set print structure #1" + +# This should be an error. GCC extensions for structure constants require +# the type of the structure to be specified, as in +# v_struct1 = (struct t_struct) {32, 33, 34, 35, 36, 37} +# GDB should do the same if it wants to provide this feature. +if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "set variable v_struct1 = {32, 33, 34, 35, 36, 37}" + continue +} +gdb_test "set variable v_struct1 = {32, 33, 34, 35, 36, 37}" "Invalid.*" + +# And after the error the structure should be unchanged. +gdb_test "print v_struct1" \ + ".*.\[0-9\]* = \{.*v_char_member = 104 \'h\',.*v_short_member = 1,\ +.*v_int_member = 2,.*\ +v_long_member = 3,.*v_float_member = 4,.*v_double_member = 5.*\}" \ + "set print structure #2" + +# Test printing of enumeration bitfields. +# GNU C supports them, some other compilers don't. + +if {$gcc_compiled} then { + gdb_test "print sef.field=sm1" ".*.\[0-9\]* = sm1" + gdb_test "print sef.field" ".*.\[0-9\]* = sm1" "print sef.field (sm1)" + gdb_test "print sef.field=s1" ".*.\[0-9\]* = s1" + gdb_test "print sef.field" ".*.\[0-9\]* = s1" "print sef.field (s1)" + gdb_test "print uef.field=u2" ".*.\[0-9\]* = u2" + gdb_test "print uef.field" ".*.\[0-9\]* = u2" "print uef.field (u2)" + gdb_test "print uef.field=u1" ".*.\[0-9\]* = u1" + gdb_test "print uef.field" ".*.\[0-9\]* = u1" "print uef.field (u1)" + + # Test for truncation when assigning invalid values to bitfields. + gdb_test "print sef.field=7" \ + ".*warning: Value does not fit in 2 bits.*\[0-9\]* = sm1" + gdb_test "print uef.field=6" \ + ".*warning: Value does not fit in 2 bits.*\[0-9\]* = u2" +} diff --git a/gdb/testsuite/gdb.base/shlib-call.exp b/gdb/testsuite/gdb.base/shlib-call.exp new file mode 100644 index 00000000000..414d7427f01 --- /dev/null +++ b/gdb/testsuite/gdb.base/shlib-call.exp @@ -0,0 +1,258 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# file to test calls into shared libraries +# the source files for this test are: +# +# shmain.c +# shr1.c (shared lib) +# shr2.c (shared lib) +# ss.h (header for shr2.c) +# +# file written by Elena Zannoni: elz@ch.apollo.com +# + +#debug shmain +#prop lib shr1.sl +#prop lib shr2.sl + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +# are we on a target board? +if ![isnative] then { + return 0 +} + +set testfile "shmain" +set libfile "shr" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +# build the first test case +if [get_compiler_info ${binfile}] { + return -1 +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}.o" object {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +# Build the shared libraries this test case needs. +# + +if {$gcc_compiled == 0} { + if [istarget "hppa*-hp-hpux*"] then { + set additional_flags "additional_flags=+z" + } else { + # don't know what the compiler is... + set additional_flags "" + } +} else { + set additional_flags "additional_flags=-fpic" +} + +if {[gdb_compile "${srcdir}/${subdir}/${libfile}1.c" "${objdir}/${subdir}/${libfile}1.o" object [list debug $additional_flags]] != ""} { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if {[gdb_compile "${srcdir}/${subdir}/${libfile}2.c" "${objdir}/${subdir}/${libfile}2.o" object [list debug $additional_flags]] != ""} { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [istarget "hppa*-*-hpux*"] { + remote_exec build "ld -b ${objdir}/${subdir}/${libfile}1.o -o ${objdir}/${subdir}/${libfile}1.sl" + remote_exec build "ld -b ${objdir}/${subdir}/${libfile}2.o -o ${objdir}/${subdir}/${libfile}2.sl" +} else { + set additional_flags "additional_flags=-shared" + if {[gdb_compile "${objdir}/${subdir}/${libfile}1.o" "${objdir}/${subdir}/${libfile}1.sl" executable [list debug $additional_flags]] != ""} { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + if {[gdb_compile "${objdir}/${subdir}/${libfile}2.o" "${objdir}/${subdir}/${libfile}2.sl" executable [list debug $additional_flags]] != ""} { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } +} +if {[gdb_compile "${objdir}/${subdir}/${testfile}.o ${objdir}/${subdir}/${libfile}1.sl ${objdir}/${subdir}/${libfile}2.sl" "${binfile}" executable {debug}] != ""} { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $" + + +if ![runto_main] then { + perror "C function calling tests suppressed" +} + + +#step -over + + send_gdb "next\n" + gdb_expect { + -re ".*g = shr1\\(g\\).*$gdb_prompt $" {pass "next to shr2"} + -re ".*$gdb_prompt $" { fail "next to shr2" } + timeout { fail "next to shr2 (timeout)" } + } + + + +#print g + +send_gdb "print g\n" +gdb_expect { + -re ".*\[0-9\]* = 1.*$gdb_prompt $" { + pass "print g" + } + -re ".*$gdb_prompt $" { fail "print g" } + timeout { fail "(timeout) print g" } + } + + +#step -over + send_gdb "next\n" + gdb_expect { + -re ".*address of sgs is $hex.*g = shr2\\(g\\).*$gdb_prompt $" { + pass "next over shr1" } + -re ".*$gdb_prompt $" { fail "next over shr1" } + timeout { fail "next over shr1 (timeout)" } + } + +#print g +send_gdb "print g\n" +gdb_expect { + -re ".*\[0-9\]* = 2.*$gdb_prompt $" { + pass "print g" } + -re ".*$gdb_prompt $" { fail "print g" } + timeout { fail "(timeout) print g" } + } + +#print shr1(1) +send_gdb "print shr1(1)\n" +gdb_expect { + -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" { + pass "print shr1(1)" } + -re ".*$gdb_prompt $" { fail "print shr1(1)" } + timeout { fail "(timeout) print shr1(1)" } + } + +#print shr1(g) +send_gdb "print shr1(g)\n" +gdb_expect { + -re ".*address of sgs is $hex.*\[0-9\]* = 4.*$gdb_prompt $" { + pass "print shr1(g)" } + -re ".*$gdb_prompt $" { fail "print shr1(g)" } + timeout { fail "(timeout) print shr1(g)" } + } + +#break shr2 +#go +gdb_test "break shr2" \ + "Breakpoint.*file.*shr2.c, line.*" \ + "breakpoint function shr2" + +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, shr2 \\(.*\\) at.*shr2\\.c:3.*3.*return 2.x;" \ +"run until breakpoint set at a function" + + +#print shr1(1) +send_gdb "print shr1(1)\n" +gdb_expect { + -re ".*address of sgs is $hex.*\[0-9\]* = 2.*$gdb_prompt $" { + pass "print shr1(1)" + } + -re ".*$gdb_prompt $" { fail "print shr1(1)" } + timeout { fail "(timeout) print shr1(1)" } + } + +#print mainshr1(1) +send_gdb "print mainshr1(1)\n" +gdb_expect { + -re ".*\[0-9\]* = 2.*$gdb_prompt $" { + pass "print mainshr1(1) from shlib func" + } + -re ".*$gdb_prompt $" { fail "print mainshr1(1) from shlib func" } + timeout { fail "(timeout) print mainshr1(1) from shlib func" } + } + +#step -return + send_gdb "step\n" + gdb_expect { + -re ".*\\\}.*$gdb_prompt $" { pass "step inside shr2 (shlib func)"} + -re ".*$gdb_prompt $" { fail "step inside shr2 (shlib func)" } + timeout { fail "step inside shr2 (shlib func) (timeout)" } + } + + send_gdb "step\n" + gdb_expect { + -re "main \\(\\) at.*g = mainshr1\\(g\\);.*$gdb_prompt $" { pass "step out of shr2 to main"} + -re ".*$gdb_prompt $" { fail "step out of shr2 to main" } + timeout { fail "step out of shr2 to main (timeout)" } + } + +#print mainshr1(1) +send_gdb "print mainshr1(1)\n" +gdb_expect { + -re ".*\[0-9\]* = 2.*$gdb_prompt $" { + pass "print mainshr1(1)" + } + -re ".*$gdb_prompt $" { fail "print mainshr1(1) from main" } + timeout { fail "(timeout) print mainshr1(1) from main" } + } + +#step + send_gdb "step\n" + gdb_expect { + -re ".*mainshr1 \\(g=4\\) at.*return 2.g;.*$gdb_prompt $" { pass "step into mainshr1"} + -re ".*$gdb_prompt $" { fail "step into mainshr1" } + timeout { fail "step into mainshr1 (timeout)" } + } + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $" + +# PR's 16495, 18213 +# test that we can re-set breakpoints in shared libraries +gdb_test "break shr1" "Breakpoint 1 at .*" "set bp in shared library" +gdb_test "run" "Starting program:.*Breakpoint 1,.*" "run to bp in shared library" +gdb_test "cont" "Program exited normally." +gdb_test "run" "Starting program:.*Breakpoint 1,.*" "re-run to bp in shared library (PR's 16495, 18213)" +gdb_test "cont" "Program exited normally." + +return 0 diff --git a/gdb/testsuite/gdb.base/shmain.c b/gdb/testsuite/gdb.base/shmain.c new file mode 100644 index 00000000000..dda5091cdc1 --- /dev/null +++ b/gdb/testsuite/gdb.base/shmain.c @@ -0,0 +1,47 @@ +/* A test */ + +#include "ss.h" +#include + +extern int shr1(); +extern int shr2(); +extern float sg; + +int eglob; + +struct { + int a; + int b; +} s; + +int g; + +int local_structarg(x) +struct s x; +{ + return x.b; +} + +main() +{ + struct s y; + g = 1; + g = shr1(g); + g = shr2(g); + g = mainshr1(g); + sg = 1.1; + printf("address of sg is 0x%x\n", &sg); + y.a = 3; + y.b = 4; + g = local_structarg(y); + g = structarg(y); + g = pstructarg(&y); + + return (0); +} + +int mainshr1(g) +int g; +{ + return 2*g; +} diff --git a/gdb/testsuite/gdb.base/shr1.c b/gdb/testsuite/gdb.base/shr1.c new file mode 100644 index 00000000000..0efaff5ec14 --- /dev/null +++ b/gdb/testsuite/gdb.base/shr1.c @@ -0,0 +1,47 @@ +#include "ss.h" +#include + +typedef float f; + +float sg = 5.5; +int sgi = 2; +static int sgs = 7; + +int shr1(x) +int x; +{ + f mumble; + int l; + l = 1; + { + int l; + l = 2; + } + mumble = 7.7; + sg = 6.6; + sgi++; + sgs = 8; + printf("address of sgs is 0x%x\n", &sgs); + return 2*x; +} + +static int shr1_local(x) +int x; +{ + return 2*x; +} + +int structarg(x) +struct s x; +{ + return x.a; +} + +int pstructarg(x) +struct s *x; +{ + return x->a; +} + + + diff --git a/gdb/testsuite/gdb.base/shr2.c b/gdb/testsuite/gdb.base/shr2.c new file mode 100644 index 00000000000..94d5df962a5 --- /dev/null +++ b/gdb/testsuite/gdb.base/shr2.c @@ -0,0 +1,11 @@ +int shr2(x) +{ + return 2*x; +} + +int shr2_local(x) +{ + return 2*x; +} + + diff --git a/gdb/testsuite/gdb.base/sigall.c b/gdb/testsuite/gdb.base/sigall.c new file mode 100644 index 00000000000..1ab08e732ea --- /dev/null +++ b/gdb/testsuite/gdb.base/sigall.c @@ -0,0 +1,1383 @@ +#include + +#ifdef __sh__ +#define signal(a,b) /* Signals not supported on this target - make them go away */ +#endif + +/* Signal handlers, we set breakpoints in them to make sure that the + signals really get delivered. */ + +void +handle_ABRT (sig) + int sig; +{ +} + +void +handle_HUP (sig) + int sig; +{ +} + +void +handle_QUIT (sig) + int sig; +{ +} + +void +handle_ILL (sig) + int sig; +{ +} + +void +handle_EMT (sig) + int sig; +{ +} + +void +handle_FPE (sig) + int sig; +{ +} + +void +handle_BUS (sig) + int sig; +{ +} + +void +handle_SEGV (sig) + int sig; +{ +} + +void +handle_SYS (sig) + int sig; +{ +} + +void +handle_PIPE (sig) + int sig; +{ +} + +void +handle_ALRM (sig) + int sig; +{ +} + +void +handle_URG (sig) + int sig; +{ +} + +void +handle_TSTP (sig) + int sig; +{ +} + +void +handle_CONT (sig) + int sig; +{ +} + +void +handle_CHLD (sig) + int sig; +{ +} + +void +handle_TTIN (sig) + int sig; +{ +} + +void +handle_TTOU (sig) + int sig; +{ +} + +void +handle_IO (sig) + int sig; +{ +} + +void +handle_XCPU (sig) + int sig; +{ +} + +void +handle_XFSZ (sig) + int sig; +{ +} + +void +handle_VTALRM (sig) + int sig; +{ +} + +void +handle_PROF (sig) + int sig; +{ +} + +void +handle_WINCH (sig) + int sig; +{ +} + +void +handle_LOST (sig) + int sig; +{ +} + +void +handle_USR1 (sig) + int sig; +{ +} + +void +handle_USR2 (sig) + int sig; +{ +} + +void +handle_PWR (sig) + int sig; +{ +} + +void +handle_POLL (sig) + int sig; +{ +} + +void +handle_WIND (sig) + int sig; +{ +} + +void +handle_PHONE (sig) + int sig; +{ +} + +void +handle_WAITING (sig) + int sig; +{ +} + +void +handle_LWP (sig) + int sig; +{ +} + +void +handle_DANGER (sig) + int sig; +{ +} + +void +handle_GRANT (sig) + int sig; +{ +} + +void +handle_RETRACT (sig) + int sig; +{ +} + +void +handle_MSG (sig) + int sig; +{ +} + +void +handle_SOUND (sig) + int sig; +{ +} + +void +handle_SAK (sig) + int sig; +{ +} + +void +handle_PRIO (sig) + int sig; +{ +} + +void +handle_33 (sig) + int sig; +{ +} + +void +handle_34 (sig) + int sig; +{ +} + +void +handle_35 (sig) + int sig; +{ +} + +void +handle_36 (sig) + int sig; +{ +} + +void +handle_37 (sig) + int sig; +{ +} + +void +handle_38 (sig) + int sig; +{ +} + +void +handle_39 (sig) + int sig; +{ +} + +void +handle_40 (sig) + int sig; +{ +} + +void +handle_41 (sig) + int sig; +{ +} + +void +handle_42 (sig) + int sig; +{ +} + +void +handle_43 (sig) + int sig; +{ +} + +void +handle_44 (sig) + int sig; +{ +} + +void +handle_45 (sig) + int sig; +{ +} + +void +handle_46 (sig) + int sig; +{ +} + +void +handle_47 (sig) + int sig; +{ +} + +void +handle_48 (sig) + int sig; +{ +} + +void +handle_49 (sig) + int sig; +{ +} + +void +handle_50 (sig) + int sig; +{ +} + +void +handle_51 (sig) + int sig; +{ +} + +void +handle_52 (sig) + int sig; +{ +} + +void +handle_53 (sig) + int sig; +{ +} + +void +handle_54 (sig) + int sig; +{ +} + +void +handle_55 (sig) + int sig; +{ +} + +void +handle_56 (sig) + int sig; +{ +} + +void +handle_57 (sig) + int sig; +{ +} + +void +handle_58 (sig) + int sig; +{ +} + +void +handle_59 (sig) + int sig; +{ +} + +void +handle_60 (sig) + int sig; +{ +} + +void +handle_61 (sig) + int sig; +{ +} + +void +handle_62 (sig) + int sig; +{ +} + +void +handle_63 (sig) + int sig; +{ +} + +void +handle_TERM (sig) + int sig; +{ +} + +/* Functions to send signals. These also serve as markers. */ +int +gen_ABRT () +{ + kill (getpid (), SIGABRT); +} + +int +gen_HUP () +{ +#ifdef SIGHUP + kill (getpid (), SIGHUP); +#else + handle_HUP (0); +#endif +} + +int +gen_QUIT () +{ +#ifdef SIGQUIT + kill (getpid (), SIGQUIT); +#else + handle_QUIT (0); +#endif +} + +int +gen_ILL () +{ +#ifdef SIGILL + kill (getpid (), SIGILL); +#else + handle_ILL (0); +#endif +} + +int +gen_EMT () +{ +#ifdef SIGEMT + kill (getpid (), SIGEMT); +#else + handle_EMT (0); +#endif +} + +int x; + +int +gen_FPE () +{ + /* The intent behind generating SIGFPE this way is to check the mapping + from the CPU exception itself to the signals. It would be nice to + do the same for SIGBUS, SIGSEGV, etc., but I suspect that even this + test might turn out to be insufficiently portable. */ + +#if 0 + /* Loses on the PA because after the signal handler executes we try to + re-execute the failing instruction again. Perhaps we could siglongjmp + out of the signal handler? */ + /* The expect script looks for the word "kill"; don't delete it. */ + return 5 / x; /* and we both started jumping up and down yelling kill */ +#else + kill (getpid (), SIGFPE); +#endif +} + +int +gen_BUS () +{ +#ifdef SIGBUS + kill (getpid (), SIGBUS); +#else + handle_BUS (0); +#endif +} + +int +gen_SEGV () +{ +#ifdef SIGSEGV + kill (getpid (), SIGSEGV); +#else + handle_SEGV (0); +#endif +} + +int +gen_SYS () +{ +#ifdef SIGSYS + kill (getpid (), SIGSYS); +#else + handle_SYS (0); +#endif +} + +int +gen_PIPE () +{ +#ifdef SIGPIPE + kill (getpid (), SIGPIPE); +#else + handle_PIPE (0); +#endif +} + +int +gen_ALRM () +{ +#ifdef SIGALRM + kill (getpid (), SIGALRM); +#else + handle_ALRM (0); +#endif +} + +int +gen_URG () +{ +#ifdef SIGURG + kill (getpid (), SIGURG); +#else + handle_URG (0); +#endif +} + +int +gen_TSTP () +{ +#ifdef SIGTSTP + kill (getpid (), SIGTSTP); +#else + handle_TSTP (0); +#endif +} + +int +gen_CONT () +{ +#ifdef SIGCONT + kill (getpid (), SIGCONT); +#else + handle_CONT (0); +#endif +} + +int +gen_CHLD () +{ +#ifdef SIGCHLD + kill (getpid (), SIGCHLD); +#else + handle_CHLD (0); +#endif +} + +int +gen_TTIN () +{ +#ifdef SIGTTIN + kill (getpid (), SIGTTIN); +#else + handle_TTIN (0); +#endif +} + +int +gen_TTOU () +{ +#ifdef SIGTTOU + kill (getpid (), SIGTTOU); +#else + handle_TTOU (0); +#endif +} + +int +gen_IO () +{ +#ifdef SIGIO + kill (getpid (), SIGIO); +#else + handle_IO (0); +#endif +} + +int +gen_XCPU () +{ +#ifdef SIGXCPU + kill (getpid (), SIGXCPU); +#else + handle_XCPU (0); +#endif +} + +int +gen_XFSZ () +{ +#ifdef SIGXFSZ + kill (getpid (), SIGXFSZ); +#else + handle_XFSZ (0); +#endif +} + +int +gen_VTALRM () +{ +#ifdef SIGVTALRM + kill (getpid (), SIGVTALRM); +#else + handle_VTALRM (0); +#endif +} + +int +gen_PROF () +{ +#ifdef SIGPROF + kill (getpid (), SIGPROF); +#else + handle_PROF (0); +#endif +} + +int +gen_WINCH () +{ +#ifdef SIGWINCH + kill (getpid (), SIGWINCH); +#else + handle_WINCH (0); +#endif +} + +int +gen_LOST () +{ +#if defined(SIGLOST) && (!defined(SIGABRT) || SIGLOST != SIGABRT) + kill (getpid (), SIGLOST); +#else + handle_LOST (0); +#endif +} + +int +gen_USR1 () +{ +#ifdef SIGUSR1 + kill (getpid (), SIGUSR1); +#else + handle_USR1 (0); +#endif +} + +int +gen_USR2 () +{ +#ifdef SIGUSR2 + kill (getpid (), SIGUSR2); +#else + handle_USR2 (0); +#endif +} + +int +gen_PWR () +{ +#ifdef SIGPWR + kill (getpid (), SIGPWR); +#else + handle_PWR (0); +#endif +} + +int +gen_POLL () +{ +#if defined (SIGPOLL) && (!defined (SIGIO) || SIGPOLL != SIGIO) + kill (getpid (), SIGPOLL); +#else + handle_POLL (0); +#endif +} + +int +gen_WIND () +{ +#ifdef SIGWIND + kill (getpid (), SIGWIND); +#else + handle_WIND (0); +#endif +} + +int +gen_PHONE () +{ +#ifdef SIGPHONE + kill (getpid (), SIGPHONE); +#else + handle_PHONE (0); +#endif +} + +int +gen_WAITING () +{ +#ifdef SIGWAITING + kill (getpid (), SIGWAITING); +#else + handle_WAITING (0); +#endif +} + +int +gen_LWP () +{ +#ifdef SIGLWP + kill (getpid (), SIGLWP); +#else + handle_LWP (0); +#endif +} + +int +gen_DANGER () +{ +#ifdef SIGDANGER + kill (getpid (), SIGDANGER); +#else + handle_DANGER (0); +#endif +} + +int +gen_GRANT () +{ +#ifdef SIGGRANT + kill (getpid (), SIGGRANT); +#else + handle_GRANT (0); +#endif +} + +int +gen_RETRACT () +{ +#ifdef SIGRETRACT + kill (getpid (), SIGRETRACT); +#else + handle_RETRACT (0); +#endif +} + +int +gen_MSG () +{ +#ifdef SIGMSG + kill (getpid (), SIGMSG); +#else + handle_MSG (0); +#endif +} + +int +gen_SOUND () +{ +#ifdef SIGSOUND + kill (getpid (), SIGSOUND); +#else + handle_SOUND (0); +#endif +} + +int +gen_SAK () +{ +#ifdef SIGSAK + kill (getpid (), SIGSAK); +#else + handle_SAK (0); +#endif +} + +int +gen_PRIO () +{ +#ifdef SIGPRIO + kill (getpid (), SIGPRIO); +#else + handle_PRIO (0); +#endif +} + +int +gen_33 () +{ +#ifdef SIG33 + kill (getpid (), 33); +#else + handle_33 (0); +#endif +} + +int +gen_34 () +{ +#ifdef SIG34 + kill (getpid (), 34); +#else + handle_34 (0); +#endif +} + +int +gen_35 () +{ +#ifdef SIG35 + kill (getpid (), 35); +#else + handle_35 (0); +#endif +} + +int +gen_36 () +{ +#ifdef SIG36 + kill (getpid (), 36); +#else + handle_36 (0); +#endif +} + +int +gen_37 () +{ +#ifdef SIG37 + kill (getpid (), 37); +#else + handle_37 (0); +#endif +} + +int +gen_38 () +{ +#ifdef SIG38 + kill (getpid (), 38); +#else + handle_38 (0); +#endif +} + +int +gen_39 () +{ +#ifdef SIG39 + kill (getpid (), 39); +#else + handle_39 (0); +#endif +} + +int +gen_40 () +{ +#ifdef SIG40 + kill (getpid (), 40); +#else + handle_40 (0); +#endif +} + +int +gen_41 () +{ +#ifdef SIG41 + kill (getpid (), 41); +#else + handle_41 (0); +#endif +} + +int +gen_42 () +{ +#ifdef SIG42 + kill (getpid (), 42); +#else + handle_42 (0); +#endif +} + +int +gen_43 () +{ +#ifdef SIG43 + kill (getpid (), 43); +#else + handle_43 (0); +#endif +} + +int +gen_44 () +{ +#ifdef SIG44 + kill (getpid (), 44); +#else + handle_44 (0); +#endif +} + +int +gen_45 () +{ +#ifdef SIG45 + kill (getpid (), 45); +#else + handle_45 (0); +#endif +} + +int +gen_46 () +{ +#ifdef SIG46 + kill (getpid (), 46); +#else + handle_46 (0); +#endif +} + +int +gen_47 () +{ +#ifdef SIG47 + kill (getpid (), 47); +#else + handle_47 (0); +#endif +} + +int +gen_48 () +{ +#ifdef SIG48 + kill (getpid (), 48); +#else + handle_48 (0); +#endif +} + +int +gen_49 () +{ +#ifdef SIG49 + kill (getpid (), 49); +#else + handle_49 (0); +#endif +} + +int +gen_50 () +{ +#ifdef SIG50 + kill (getpid (), 50); +#else + handle_50 (0); +#endif +} + +int +gen_51 () +{ +#ifdef SIG51 + kill (getpid (), 51); +#else + handle_51 (0); +#endif +} + +int +gen_52 () +{ +#ifdef SIG52 + kill (getpid (), 52); +#else + handle_52 (0); +#endif +} + +int +gen_53 () +{ +#ifdef SIG53 + kill (getpid (), 53); +#else + handle_53 (0); +#endif +} + +int +gen_54 () +{ +#ifdef SIG54 + kill (getpid (), 54); +#else + handle_54 (0); +#endif +} + +int +gen_55 () +{ +#ifdef SIG55 + kill (getpid (), 55); +#else + handle_55 (0); +#endif +} + +int +gen_56 () +{ +#ifdef SIG56 + kill (getpid (), 56); +#else + handle_56 (0); +#endif +} + +int +gen_57 () +{ +#ifdef SIG57 + kill (getpid (), 57); +#else + handle_57 (0); +#endif +} + +int +gen_58 () +{ +#ifdef SIG58 + kill (getpid (), 58); +#else + handle_58 (0); +#endif +} + +int +gen_59 () +{ +#ifdef SIG59 + kill (getpid (), 59); +#else + handle_59 (0); +#endif +} + +int +gen_60 () +{ +#ifdef SIG60 + kill (getpid (), 60); +#else + handle_60 (0); +#endif +} + +int +gen_61 () +{ +#ifdef SIG61 + kill (getpid (), 61); +#else + handle_61 (0); +#endif +} + +int +gen_62 () +{ +#ifdef SIG62 + kill (getpid (), 62); +#else + handle_62 (0); +#endif +} + +int +gen_63 () +{ +#ifdef SIG63 + kill (getpid (), 63); +#else + handle_63 (0); +#endif +} + +int +gen_TERM () +{ + kill (getpid (), SIGTERM); +} + +int +main () +{ +#ifdef usestubs + set_debug_traps (); + breakpoint (); +#endif + signal (SIGABRT, handle_ABRT); +#ifdef SIGHUP + signal (SIGHUP, handle_HUP); +#endif +#ifdef SIGQUIT + signal (SIGQUIT, handle_QUIT); +#endif +#ifdef SIGILL + signal (SIGILL, handle_ILL); +#endif +#ifdef SIGEMT + signal (SIGEMT, handle_EMT); +#endif +#ifdef SIGFPE + signal (SIGFPE, handle_FPE); +#endif +#ifdef SIGBUS + signal (SIGBUS, handle_BUS); +#endif +#ifdef SIGSEGV + signal (SIGSEGV, handle_SEGV); +#endif +#ifdef SIGSYS + signal (SIGSYS, handle_SYS); +#endif +#ifdef SIGPIPE + signal (SIGPIPE, handle_PIPE); +#endif +#ifdef SIGALRM + signal (SIGALRM, handle_ALRM); +#endif +#ifdef SIGURG + signal (SIGURG, handle_URG); +#endif +#ifdef SIGTSTP + signal (SIGTSTP, handle_TSTP); +#endif +#ifdef SIGCONT + signal (SIGCONT, handle_CONT); +#endif +#ifdef SIGCHLD + signal (SIGCHLD, handle_CHLD); +#endif +#ifdef SIGTTIN + signal (SIGTTIN, handle_TTIN); +#endif +#ifdef SIGTTOU + signal (SIGTTOU, handle_TTOU); +#endif +#ifdef SIGIO + signal (SIGIO, handle_IO); +#endif +#ifdef SIGXCPU + signal (SIGXCPU, handle_XCPU); +#endif +#ifdef SIGXFSZ + signal (SIGXFSZ, handle_XFSZ); +#endif +#ifdef SIGVTALRM + signal (SIGVTALRM, handle_VTALRM); +#endif +#ifdef SIGPROF + signal (SIGPROF, handle_PROF); +#endif +#ifdef SIGWINCH + signal (SIGWINCH, handle_WINCH); +#endif +#if defined(SIGLOST) && (!defined(SIGABRT) || SIGLOST != SIGABRT) + signal (SIGLOST, handle_LOST); +#endif +#ifdef SIGUSR1 + signal (SIGUSR1, handle_USR1); +#endif +#ifdef SIGUSR2 + signal (SIGUSR2, handle_USR2); +#endif +#ifdef SIGPWR + signal (SIGPWR, handle_PWR); +#endif +#if defined (SIGPOLL) && (!defined (SIGIO) || SIGPOLL != SIGIO) + signal (SIGPOLL, handle_POLL); +#endif +#ifdef SIGWIND + signal (SIGWIND, handle_WIND); +#endif +#ifdef SIGPHONE + signal (SIGPHONE, handle_PHONE); +#endif +#ifdef SIGWAITING + signal (SIGWAITING, handle_WAITING); +#endif +#ifdef SIGLWP + signal (SIGLWP, handle_LWP); +#endif +#ifdef SIGDANGER + signal (SIGDANGER, handle_DANGER); +#endif +#ifdef SIGGRANT + signal (SIGGRANT, handle_GRANT); +#endif +#ifdef SIGRETRACT + signal (SIGRETRACT, handle_RETRACT); +#endif +#ifdef SIGMSG + signal (SIGMSG, handle_MSG); +#endif +#ifdef SIGSOUND + signal (SIGSOUND, handle_SOUND); +#endif +#ifdef SIGSAK + signal (SIGSAK, handle_SAK); +#endif +#ifdef SIGPRIO + signal (SIGPRIO, handle_PRIO); +#endif +#ifdef __Lynx__ + /* Lynx doesn't seem to have anything in signal.h for this. */ + signal (33, handle_33); + signal (34, handle_34); + signal (35, handle_35); + signal (36, handle_36); + signal (37, handle_37); + signal (38, handle_38); + signal (39, handle_39); + signal (40, handle_40); + signal (41, handle_41); + signal (42, handle_42); + signal (43, handle_43); + signal (44, handle_44); + signal (45, handle_45); + signal (46, handle_46); + signal (47, handle_47); + signal (48, handle_48); + signal (49, handle_49); + signal (50, handle_50); + signal (51, handle_51); + signal (52, handle_52); + signal (53, handle_53); + signal (54, handle_54); + signal (55, handle_55); + signal (56, handle_56); + signal (57, handle_57); + signal (58, handle_58); + signal (59, handle_59); + signal (60, handle_60); + signal (61, handle_61); + signal (62, handle_62); + signal (63, handle_63); +#endif /* lynx */ + signal (SIGTERM, handle_TERM); + + x = 0; + + gen_ABRT (); + gen_HUP (); + gen_QUIT (); + gen_ILL (); + gen_EMT (); + gen_FPE (); + gen_BUS (); + gen_SEGV (); + gen_SYS (); + gen_PIPE (); + gen_ALRM (); + gen_URG (); + gen_TSTP (); + gen_CONT (); + gen_CHLD (); + gen_TTIN (); + gen_TTOU (); + gen_IO (); + gen_XCPU (); + gen_XFSZ (); + gen_VTALRM (); + gen_PROF (); + gen_WINCH (); + gen_LOST (); + gen_USR1 (); + gen_USR2 (); + gen_PWR (); + gen_POLL (); + gen_WIND (); + gen_PHONE (); + gen_WAITING (); + gen_LWP (); + gen_DANGER (); + gen_GRANT (); + gen_RETRACT (); + gen_MSG (); + gen_SOUND (); + gen_SAK (); + gen_PRIO (); + gen_33 (); + gen_34 (); + gen_35 (); + gen_36 (); + gen_37 (); + gen_38 (); + gen_39 (); + gen_40 (); + gen_41 (); + gen_42 (); + gen_43 (); + gen_44 (); + gen_45 (); + gen_46 (); + gen_47 (); + gen_48 (); + gen_49 (); + gen_50 (); + gen_51 (); + gen_52 (); + gen_53 (); + gen_54 (); + gen_55 (); + gen_56 (); + gen_57 (); + gen_58 (); + gen_59 (); + gen_60 (); + gen_61 (); + gen_62 (); + gen_63 (); + gen_TERM (); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/sigall.exp b/gdb/testsuite/gdb.base/sigall.exp new file mode 100644 index 00000000000..765e0ee5df9 --- /dev/null +++ b/gdb/testsuite/gdb.base/sigall.exp @@ -0,0 +1,210 @@ +# Copyright (C) 1995, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +if [target_info exists gdb,nosignals] { + verbose "Skipping sigall.exp because of nosignals." + continue +} + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +set testfile sigall +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Make the first signal SIGABRT because it is always supported. +set sig_supported 1 +set thissig "ABRT" + +proc test_one_sig {nextsig} { + global sig_supported + global gdb_prompt + global thissig + + set this_sig_supported $sig_supported + gdb_test "handle SIG$thissig stop print" \ + "SIG$thissig\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes.*" + gdb_test "b handle_$thissig" "Breakpoint \[0-9\]+ .*" + gdb_test "b gen_$nextsig" "Breakpoint \[0-9\]+ .*" + + set need_another_continue 1 + set missed_handler 0 + if $this_sig_supported then { + send_gdb "continue\n" + if { $thissig == "IO" } { + setup_xfail "i*86-pc-linuxoldld-gnu" "i*86-pc-linuxaout-gnu" + } + gdb_expect { + -re "Continuing.*Program received signal SIG$thissig.*$gdb_prompt $" { + pass "get signal $thissig" + } + -re ".*$gdb_prompt $" { + fail "get signal $thissig" + set need_another_continue 0 + } + default { + fail "get signal $thissig (eof or timeout)" + } + } + } + if [ istarget "alpha-dec-osf3*" ] then { + # OSF/1-3.x is unable to continue with a job control stop signal. + # The inferior remains stopped without an event of interest + # and GDB waits forever for the inferior to stop on an event + # of interest. Work around the kernel bug. + if { $thissig == "TSTP" || $thissig == "TTIN" || $thissig == "TTOU" } { + setup_xfail "alpha-dec-osf3*" + fail "cannot continue from signal $thissig" + set need_another_continue 0 + } + } + + if $need_another_continue then { + send_gdb "continue\n" + if { $thissig == "URG" } { + setup_xfail "i*86-pc-linuxoldld-gnu" "i*86-pc-linuxaout-gnu" + } + # Either Lynx or GDB screws up on SIGPRIO + if { $thissig == "PRIO" } { + setup_xfail "*-*-*lynx*" + } + gdb_expect { + -re "Breakpoint.*handle_$thissig.*$gdb_prompt $" { + pass "send signal $thissig" + } + -re "Breakpoint.*gen_$nextsig.*kill.*$gdb_prompt $" { + fail "missed breakpoint at handle_$thissig" + set missed_handler 1 + } + } + } + + if { $missed_handler == "0" } then { + send_gdb "signal 0\n" + gdb_expect { + -re "Breakpoint.*gen_$nextsig.*kill.*$gdb_prompt $" { + pass "advance to $nextsig" + set sig_supported 1 + } + -re "Breakpoint.*gen_$nextsig.*handle.*$gdb_prompt $" { + pass "advance to $nextsig" + set sig_supported 0 + } + -re ".*$gdb_prompt $" { fail "advance to $nextsig" } + default { fail "advance to $nextsig (eof or timeout)" } + } + } + set thissig $nextsig +} + +gdb_load $binfile + +runto gen_ABRT +test_one_sig HUP +test_one_sig QUIT +test_one_sig ILL +test_one_sig EMT +test_one_sig FPE +test_one_sig BUS +test_one_sig SEGV +test_one_sig SYS +test_one_sig PIPE +test_one_sig ALRM +test_one_sig URG +test_one_sig TSTP +test_one_sig CONT +test_one_sig CHLD +test_one_sig TTIN +test_one_sig TTOU +test_one_sig IO +test_one_sig XCPU +test_one_sig XFSZ +test_one_sig VTALRM +test_one_sig PROF +test_one_sig WINCH +test_one_sig LOST +test_one_sig USR1 +test_one_sig USR2 +test_one_sig PWR +test_one_sig POLL +test_one_sig WIND +test_one_sig PHONE +test_one_sig WAITING +test_one_sig LWP +test_one_sig DANGER +test_one_sig GRANT +test_one_sig RETRACT +test_one_sig MSG +test_one_sig SOUND +test_one_sig SAK +test_one_sig PRIO +test_one_sig 33 +test_one_sig 34 +test_one_sig 35 +test_one_sig 36 +test_one_sig 37 +test_one_sig 38 +test_one_sig 39 +test_one_sig 40 +test_one_sig 41 +test_one_sig 42 +test_one_sig 43 +test_one_sig 44 +test_one_sig 45 +test_one_sig 46 +test_one_sig 47 +test_one_sig 48 +test_one_sig 49 +test_one_sig 50 +test_one_sig 51 +test_one_sig 52 +test_one_sig 53 +test_one_sig 54 +test_one_sig 55 +test_one_sig 56 +test_one_sig 57 +test_one_sig 58 +test_one_sig 59 +test_one_sig 60 +test_one_sig 61 +test_one_sig 62 +test_one_sig 63 +test_one_sig TERM + +# The last signal (SIGTERM) gets handled slightly differently because +# we are not setting up for another test. +gdb_test "handle SIGTERM stop print" \ + "SIGTERM\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes.*" +gdb_test "b handle_TERM" "Breakpoint \[0-9\]+ .*" +gdb_test "continue" \ + "Continuing.*Program received signal SIGTERM.*" \ + "get signal TERM" +gdb_test "continue" "Breakpoint.*handle_TERM.*" "send signal TERM" +gdb_test "continue" "Program exited normally\\." "continue to sigall exit" + +return 0 diff --git a/gdb/testsuite/gdb.base/signals.c b/gdb/testsuite/gdb.base/signals.c new file mode 100644 index 00000000000..280e6e7c5d8 --- /dev/null +++ b/gdb/testsuite/gdb.base/signals.c @@ -0,0 +1,53 @@ +/* Test GDB dealing with stuff like stepping into sigtramp. */ + +#include + +#ifdef __sh__ +#define signal(a,b) /* Signals not supported on this target - make them go away */ +#define alarm(a) /* Ditto for alarm() */ +#endif + +static int count = 0; + +static void +handler (sig) + int sig; +{ + signal (sig, handler); + ++count; +} + +static void +func1 () +{ + ++count; +} + +static void +func2 () +{ + ++count; +} + +int +main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif +#ifdef SIGALRM + signal (SIGALRM, handler); +#endif +#ifdef SIGUSR1 + signal (SIGUSR1, handler); +#endif + alarm (1); + ++count; /* first */ + alarm (1); + ++count; /* second */ + func1 (); + alarm (1); + func2 (); + return count; +} diff --git a/gdb/testsuite/gdb.base/signals.exp b/gdb/testsuite/gdb.base/signals.exp new file mode 100644 index 00000000000..49bf49081b0 --- /dev/null +++ b/gdb/testsuite/gdb.base/signals.exp @@ -0,0 +1,628 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if [target_info exists gdb,nosignals] { + verbose "Skipping signals.exp because of nosignals." + continue +} + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile signals +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +proc signal_tests_1 {} { + global gdb_prompt + if [runto_main] then { + gdb_test "next" "signal \\(SIGUSR1.*" \ + "next over signal (SIGALRM, handler)" + gdb_test "next" "alarm \\(.*" \ + "next over signal (SIGUSR1, handler)" + gdb_test "next" "\\+\\+count; /\\* first \\*/" \ + "next over alarm (1)" + # An alarm has been signaled, give the signal time to get delivered. + sleep 2 + + # i386 BSD currently fails the next test with a SIGTRAP. + setup_xfail "i*86-*-bsd*" + # But Dynix has a DECR_PC_AFTER_BREAK of zero, so the failure + # is shadowed by hitting the through_sigtramp_breakpoint. + clear_xfail "i*86-sequent-bsd*" + # Univel SVR4 i386 continues instead of stepping. + setup_xfail "i*86-univel-sysv4*" + # lynx fails with "next" acting like "continue" + setup_xfail "*-*-*lynx*" + # linux (aout versions) also fails with "next" acting like "continue" + # this is probably more dependant on the kernel version than on the + # object file format or utils. (sigh) + setup_xfail "i*86-pc-linuxaout-gnu" "i*86-pc-linuxoldld-gnu" + send_gdb "next\n" + gdb_expect { + -re "alarm .*$gdb_prompt $" { pass "next to 2nd alarm (1)" } + -re "Program received signal SIGTRAP.*first.*$gdb_prompt $" { + + # This can happen on machines that have a trace flag + # in their PS register. + # The trace flag in the PS register will be set due to + # the `next' command. + # Before calling the signal handler, the PS register + # is pushed along with the context on the user stack. + # When the signal handler has finished, it reenters the + # the kernel via a sigreturn syscall, which restores the + # PS register along with the context. + # If the kernel erroneously does not clear the trace flag + # in the pushed context, gdb will receive a SIGTRAP from + # the set trace flag in the restored context after the + # signal handler has finished. + + # I do not yet understand why the SIGTRAP does not occur + # after stepping the instruction at the restored PC on + # i386 BSDI 1.0 systems. + + # Note that the vax under Ultrix also exhibits + # this behaviour (it is uncovered by the `continue from + # a break in a signal handler' test below). + # With this test the failure is shadowed by hitting the + # through_sigtramp_breakpoint upon return from the signal + # handler. + + # SVR4 and Linux based i*86 systems exhibit this behaviour + # as well (it is uncovered by the `continue from a break + # in a signal handler' test below). + # As these systems use procfs, where we tell the kernel not + # to tell gdb about `pass' signals, and the trace flag is + # cleared by the kernel before entering the sigtramp + # routine, GDB will not notice the execution of the signal + # handler. + # Upon return from the signal handler, GDB will receive + # a SIGTRAP from the set trace flag in the restored context. + # The SIGTRAP marks the end of a (albeit long winded) + # single step for GDB, causing this test to pass. + + fail "next to 2nd alarm (1) (probably kernel bug)" + gdb_test "next" "alarm.*" "next to 2nd alarm (1)" + } + -re "Program exited with code.*$gdb_prompt $" { + + # This is apparently a bug in the UnixWare kernel (but + # has not been investigated beyond the + # resume/target_wait level, and has not been reported + # to Univel). If it steps when a signal is pending, + # it does a continue instead. I don't know whether + # there is a workaround. + + # Perhaps this problem exists on other SVR4 systems; + # but (a) we have no reason to think so, and (b) if we + # put a wrong xfail here, we never get an XPASS to let + # us know that it was incorrect (and then if such a + # configuration regresses we have no way of knowing). + # Solaris is not a relevant data point either way + # because it lacks single stepping. + + # fnf: I don't agree with the above philosophy. We + # can never be sure that any particular XFAIL is + # specified 100% correctly in that no systems with + # the bug are missed and all systems without the bug + # are excluded. If we include an XFAIL that isn't + # appropriate for a particular system, then when that + # system gets tested it will XPASS, and someone should + # investigate and fix the setup_xfail as appropriate, + # or more preferably, the actual bug. Each such case + # adds more data to narrowing down the scope of the + # problem and ultimately fixing it. + + setup_xfail "i*86-*-sysv4*" + fail "'next' behaved as 'continue (known SVR4 bug)'" + return 0 + } + -re ".*$gdb_prompt $" { fail "next to 2nd alarm (1)" } + timeout { fail "next to 2nd alarm (1); (timeout)" } + eof { fail "next to 2nd alarm (1); (eof)" } + } + + gdb_test "break handler" "Breakpoint \[0-9\]+ .*" + gdb_test "next" "\\+\\+count; /\\* second \\*/" \ + "next to 2nd ++count in signals_tests_1" + # An alarm has been signaled, give the signal time to get delivered. + sleep 2 + + set bash_bug 0 + send_gdb "next\n" + gdb_expect { + -re "Breakpoint.*handler.*$gdb_prompt $" { + pass "next to handler in signals_tests_1" + } + -re "Program received signal SIGEMT.*$gdb_prompt $" { + # Bash versions before 1.13.5 cause this behaviour + # by blocking SIGTRAP. + fail "next to handler in signals_tests_1 (known problem with bash versions before 1.13.5)" + set bash_bug 1 + gdb_test "signal 0" "Breakpoint.*handler.*" + } + -re ".*$gdb_prompt $" { fail "next to handler in signals_tests_1" } + timeout { fail "next to handler in signals_tests_1 (timeout)" } + eof { fail "next to handler in signals_tests_1 (eof)" } + } + + # This doesn't test that main is frame #2, just that main is frame + # #2, #3, or higher. At some point this should be fixed (but + # it quite possibly would introduce new FAILs on some systems). + setup_xfail "i*86-pc-linux-gnu*" "i*86-*-bsdi2.0" + gdb_test "backtrace 10" "#0.*handler.*#1.*#2.*main.*" \ + "backtrace in signals_tests_1" + + gdb_test "break func1" "Breakpoint \[0-9\]+ .*" + gdb_test "break func2" "Breakpoint \[0-9\]+ .*" + + # Vax Ultrix and i386 BSD currently fail the next test with + # a SIGTRAP, but with different symptoms. + setup_xfail "vax-*-ultrix*" + setup_xfail "i*86-*-bsd*" + setup_xfail "i*86-pc-linux-gnu*" + setup_xfail "i*86-*-solaris2*" + send_gdb "continue\n" + gdb_expect { + -re "Breakpoint.*func1.*$gdb_prompt $" { pass "continue to func1" } + -re "Program received signal SIGTRAP.*second.*$gdb_prompt $" { + + # See explanation for `next to 2nd alarm (1)' fail above. + # We did step into the signal handler, hit a breakpoint + # in the handler and continued from the breakpoint. + # The set trace flag in the restored context is causing + # the SIGTRAP, without stepping an instruction. + + fail "continue to func1 (probably kernel bug)" + gdb_test "continue" "Breakpoint.*func1.*" \ + "extra continue to func1" + } + -re "Program received signal SIGTRAP.*func1 ..;.*$gdb_prompt $" { + + # On the vax under Ultrix the set trace flag in the restored + # context is causing the SIGTRAP, but after stepping one + # instruction, as expected. + + fail "continue to func1 (probably kernel bug)" + gdb_test "continue" "Breakpoint.*func1.*" \ + "extra continue to func1" + } + -re ".*$gdb_prompt $" { fail "continue to func1" } + default { fail "continue to func1" } + } + + setup_xfail "*-*-irix*" + send_gdb "signal SIGUSR1\n" + gdb_expect { + -re "Breakpoint.*handler.*$gdb_prompt $" { pass "signal SIGUSR1" } + -re "Program received signal SIGUSR1.*$gdb_prompt $" { + # This is what irix4 and irix5 do. + # It would appear to be a kernel bug. + fail "signal SIGUSR1" + gdb_test "continue" "Breakpoint.*handler.*" "pass it SIGUSR1" + } + -re ".*$gdb_prompt $" { fail "signal SIGUSR1" } + default { fail "signal SIGUSR1" } + } + + # Will tend to wrongly require an extra continue. + + # The problem here is that the breakpoint at func1 will be + # inserted, and when the system finishes with the signal + # handler it will try to execute there. For GDB to try to + # remember that it was going to step over a breakpoint when a + # signal happened, distinguish this case from the case where + # func1 is called from the signal handler, etc., seems + # exceedingly difficult. So don't expect this to get fixed + # anytime soon. + + setup_xfail "*-*-*" + send_gdb "continue\n" + gdb_expect { + -re "Breakpoint.*func2.*$gdb_prompt $" { pass "continue to func2" } + -re "Breakpoint.*func1.*$gdb_prompt $" { + fail "continue to func2" + gdb_test "continue" "Breakpoint.*func2.*" \ + "extra continue to func2" + } + -re ".*$gdb_prompt $" { fail "continue to func2" } + default { fail "continue to func2" } + } + + sleep 2 + + # GDB yanks out the breakpoints to step over the breakpoint it + # stopped at, which means the breakpoint at handler is yanked. + # But if SOFTWARE_SINGLE_STEP_P, we won't get another chance to + # reinsert them (at least not with procfs, where we tell the kernel + # not to tell gdb about `pass' signals). So the fix would appear to + # be to just yank that one breakpoint when we step over it. + + setup_xfail "sparc*-*-*" + setup_xfail "rs6000-*-*" + setup_xfail "powerpc-*-*" + + # A faulty bash will not step the inferior into sigtramp on sun3. + if {$bash_bug} then { + setup_xfail "m68*-*-sunos4*" + } + + setup_xfail "i*86-pc-linux-gnu*" + setup_xfail "i*86-*-solaris2*" + gdb_test "continue" "Breakpoint.*handler.*" "continue to handler" + + # If the SOFTWARE_SINGLE_STEP_P failure happened, we have already + # exited. + # If we succeeded a continue will return from the handler to func2. + # GDB now has `forgotten' that it intended to step over the + # breakpoint at func2 and will stop at func2. + setup_xfail "*-*-*" + # The sun3 with a faulty bash will also be `forgetful' but it + # already got the spurious stop at func2 and this continue will work. + if {$bash_bug} then { + clear_xfail "m68*-*-sunos4*" + } + gdb_test "continue" "Program exited with code 010\\." \ + "continue to exit in signals_tests_1 " + } +} + +# On a few losing systems, ptrace (PT_CONTINUE) or ptrace (PT_STEP) +# causes pending signals to be cleared, which causes these tests to +# get nowhere fast. This is totally losing behavior (perhaps there +# are cases in which is it useful but the user needs more control, +# which they mostly have in GDB), but some people apparently think it +# is a feature. It is documented in the ptrace manpage on Motorola +# Delta Series sysV68 R3V7.1 and on HPUX 9.0. Even the non-HPUX PA +# OSes (BSD and OSF/1) seem to have figured they had to copy this +# braindamage. + +if {[ istarget "m68*-motorola-*" ] || [ istarget "hppa*-*-bsd*" ] || + [ istarget "hppa*-*-osf*" ]} then { + setup_xfail "*-*-*" + fail "ptrace loses on signals on this target" + return 0 +} + +# lynx2.2.2 doesn't lose signals, instead it screws up the stack pointer +# in some of these tests leading to massive problems. I've +# reported this to lynx, hopefully it'll be fixed in lynx2.3. +# Severe braindamage. +if [ istarget "*-*-*lynx*" ] then { + setup_xfail "*-*-*" + fail "kernel scroggs stack pointer in signal tests on this target" + return 0 +} + +gdb_exit +gdb_start + +# This will need to be updated as the exact list of signals changes, +# but I want to test that TARGET_SIGNAL_0, TARGET_SIGNAL_DEFAULT, and +# TARGET_SIGNAL_UNKNOWN are skipped. +proc test_handle_all_print {} { + global timeout + # Increase timeout and expect input buffer for large output from gdb. + # Allow blank or TAB as whitespace characters. + set oldtimeout $timeout + set timeout [expr "$timeout + 360"] + verbose "Timeout is now $timeout seconds" 2 + if { [istarget "*-*-gnu*"] || [istarget "*-*-mach*"] } { + gdb_test "handle all print" "Signal\[ \]+Stop\[ \]+Print\[ \]+Pass to program\[ \]+Description\r\nSIGHUP\[ \]+Yes\[ \]+Yes\[ \]+Yes\[ \]+Hangup.*SIG63\[ \]+Yes\[ \]+Yes\[ \]+Yes\[ \]+Real-time event 63.*EXC_BREAKPOINT\[ \]+Yes\[ \]+Yes\[ \]+Yes\[ \]+Breakpoint" + } else { + gdb_test "handle all print" "Signal\[ \]+Stop\[ \]+Print\[ \]+Pass to program\[ \]+Description\r\nSIGHUP\[ \]+Yes\[ \]+Yes\[ \]+Yes\[ \]+Hangup.*SIG63\[ \]+Yes\[ \]+Yes\[ \]+Yes\[ \]+Real-time event 63" + } + set timeout $oldtimeout + verbose "Timeout restored to $timeout seconds" 2 +} +test_handle_all_print + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile +signal_tests_1 + +# Force a resync, so we're looking at the right prompt. On SCO we +# were getting out of sync (I don't understand why). +send_gdb "p 1+1\n" +gdb_expect { + -re "= 2.*$gdb_prompt $" {} + -re ".*$gdb_prompt $" { perror "sync trouble in signals.exp" } + default { perror "sync trouble in signals.exp" } +} + +if [runto_main] then { + gdb_test "break handler if 0" "Breakpoint \[0-9\]+ .*" + gdb_test "set \$handler_breakpoint_number = \$bpnum" "" + + # Get to the point where a signal is waiting to be delivered + gdb_test "next" "signal \\(SIGUSR1.*" "next to signal in signals.exp" + gdb_test "next" "alarm \\(.*" "next to alarm #1 in signals.exp" + gdb_test "next" "\\+\\+count; /\\* first \\*/" \ + "next to ++count #1 in signals.exp" + # Give the signal time to get delivered + sleep 2 + + # Now call a function. When GDB tries to run the stack dummy, + # it will hit the breakpoint at handler. Provided it doesn't + # lose its cool, this is not a problem, it just has to note + # that the breakpoint condition is false and keep going. + + gdb_test "p func1 ()" "^p func1 \\(\\)\r\n.\[0-9\]* = void" \ + "p func1 () #1 in signals.exp" + + # Make sure the count got incremented. + + # Haven't investigated this xfail + setup_xfail "rs6000-*-*" + setup_xfail "powerpc-*-*" + gdb_test "p count" "= 2" "p count #1 in signals.exp" + if { [istarget "rs6000-*-*"] || [istarget "powerpc-*-*"] } { return 0 } + + gdb_test "condition \$handler_breakpoint_number" "now unconditional\\." + gdb_test "next" "alarm \\(.*" "next to alarm #2 in signals.exp" + gdb_test "next" "\\+\\+count; /\\* second \\*/" \ + "next to ++count #2 in signals.exp" + sleep 2 + + # This time we stop when GDB tries to run the stack dummy. + # So it is OK that we do not print the return value from the function. + gdb_test "p func1 ()" \ +"Breakpoint \[0-9\]*, handler.* +The program being debugged stopped while in a function called from GDB.*" \ + "p func1 () #2 in signals.exp" + # But we should be able to backtrace... + # On alpha-*-osf2.0 this test works when run manually but sometime fails when + # run under dejagnu, making it very hard to debug the problem. Weird... + gdb_test "bt 10" "#0.*handler.*#1.*#2.*main.*" "bt in signals.exp" + # ...and continue... + gdb_test "continue" "Continuing\\." "continue in signals.exp" + # ...and then count should have been incremented + gdb_test "p count" "= 5" "p count #2 in signals.exp" + + +# Verify that "info signals" produces reasonable output. +# + send_gdb "info signals\n" + gdb_expect { + -re "SIGHUP.*SIGINT.*SIGQUIT.*SIGILL.*SIGTRAP.*SIGABRT.*SIGEMT.*SIGFPE.*SIGKILL.*SIGBUS.*SIGSEGV.*SIGSYS.*SIGPIPE.*SIGALRM.*SIGTERM.*SIGURG.*SIGSTOP.*SIGTSTP.*SIGCONT.*SIGCHLD.*SIGTTIN.*SIGTTOU.*SIGIO.*SIGXCPU.*SIGXFSZ.*SIGVTALRM.*SIGPROF.*SIGWINCH.*SIGLOST.*SIGUSR1.*SIGUSR2.*SIGPWR.*SIGPOLL.*SIGWIND.*SIGPHONE.*SIGWAITING.*SIGLWP.*SIGDANGER.*SIGGRANT.*SIGRETRACT.*SIGMSG.*SIGSOUND.*SIGSAK.*SIGPRIO.*SIG33.*SIG34.*SIG35.*SIG36.*SIG37.*SIG38.*SIG39.*SIG40.*SIG41.*SIG42.*SIG43.*SIG44.*SIG45.*SIG46.*SIG47.*SIG48.*SIG49.*SIG50.*SIG51.*SIG52.*SIG53.*SIG54.*SIG55.*SIG56.*SIG57.*SIG58.*SIG59.*SIG60.*SIG61.*SIG62.*SIG63.*Use the \"handle\" command to change these tables.*$gdb_prompt $"\ + {pass "info signals"} + -re "$gdb_prompt $"\ + {fail "info signals"} + timeout {fail "(timeout) info signals"} + } + +# Verify that "info signal" correctly handles an argument, be it a +# symbolic signal name, or an integer ID. +# + send_gdb "info signal SIGTRAP\n" + gdb_expect { + -re ".*SIGTRAP\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*No\[ \t\]*Trace/breakpoint trap.*$gdb_prompt $"\ + {pass "info signal SIGTRAP"} + -re "$gdb_prompt $"\ + {fail "info signal SIGTRAP"} + timeout {fail "(timeout) info signal SIGTRAP"} + } + + send_gdb "info signal 5\n" + gdb_expect { + -re ".*SIGTRAP\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*No\[ \t\]*Trace/breakpoint trap.*$gdb_prompt $"\ + {pass "info signal 5"} + -re "$gdb_prompt $"\ + {fail "info signal 5"} + timeout {fail "(timeout) info signal 5"} + } + +# Verify that "handle" with illegal arguments is gracefully, um, handled. +# + send_gdb "handle\n" + gdb_expect { + -re "Argument required .signal to handle.*$gdb_prompt $"\ + {pass "handle without arguments"} + -re "$gdb_prompt $"\ + {fail "handle without arguments"} + timeout {fail "(timeout) handle without arguments"} + } + + send_gdb "handle SIGFOO\n" + gdb_expect { + -re "Unrecognized or ambiguous flag word: \"SIGFOO\".*$gdb_prompt $"\ + {pass "handle with bogus SIG"} + -re "$gdb_prompt $"\ + {fail "handle with bogus SIG"} + timeout {fail "(timeout) handle with bogus SIG"} + } + + send_gdb "handle SIGHUP frump\n" + gdb_expect { + -re "Unrecognized or ambiguous flag word: \"frump\".*$gdb_prompt $"\ + {pass "handle SIG with bogus action"} + -re "$gdb_prompt $"\ + {fail "handle SIG with bogus action"} + timeout {fail "(timeout) handle SIG with bogus action"} + } + +# Verify that "handle" can take multiple actions per SIG, and that in +# the case of conflicting actions, that the rightmost action "wins". +# + send_gdb "handle SIGHUP print noprint\n" + gdb_expect { + -re ".*SIGHUP\[ \t\]*No\[ \t\]*No\[ \t\]*Yes\[ \t\]*Hangup.*$gdb_prompt $"\ + {pass "handle SIG with multiple conflicting actions"} + -re "$gdb_prompt $"\ + {fail "handle SIG with multiple conflicting actions"} + timeout {fail "(timeout) handle SIG with multiple conflicting actions"} + } + +# Exercise all the various actions. (We don't care what the outcome +# is, this is just to ensure that they all can be parsed.) +# + send_gdb "handle SIGHUP print noprint stop nostop ignore noignore pass nopass\n" + gdb_expect { + -re ".*Signal.*$gdb_prompt $"\ + {pass "handle SIG parses all legal actions"} + -re "$gdb_prompt $"\ + {fail "handle SIG parses all legal actions"} + timeout {fail "(timeout) handle SIG parses all legal actions"} + } + +# Verify that we can "handle" multiple signals at once, interspersed +# with actions. +# + send_gdb "handle SIG63 print SIGILL\n" + gdb_expect { + -re ".*SIGILL\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Illegal instruction.*SIG63\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Real-time event 63.*$gdb_prompt $"\ + {pass "handle multiple SIGs"} + -re "$gdb_prompt $"\ + {fail "handle multiple SIGs"} + timeout {fail "(timeout) handle multiple SIGs"} + } + +# Verify that "handle" can take a numeric argument for the signal ID, +# rather than a symbolic name. (This may not be portable; works for +# HP-UX.) +# +# Also note that this testpoint overrides SIGTRAP, which on HP-UX at +# least, is used to implement single-steps and breakpoints. Don't +# expect to run the inferior after this! +# + send_gdb "handle 5 nopass\n" + gdb_expect { + -re ".*SIGTRAP is used by the debugger.*Are you sure you want to change it.*y or n.*"\ + {send_gdb "y\n" + gdb_expect { + -re ".*SIGTRAP\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*No\[ \t\]*Trace/breakpoint trap.*$gdb_prompt $"\ + {pass "override SIGTRAP (#5)"} + -re "$gdb_prompt $"\ + {fail "override SIGTRAP (#5)"} + timeout {fail "(timeout) override SIGTRAP (#5)"} + } + } + -re "$gdb_prompt $"\ + {fail "override SIGTRAP (#5)"} + timeout {fail "(timeout) override SIGTRAP (#5)"} + } + +# GDB doesn't seem to allow numeric signal IDs larger than 15. Verify +# that restriction. ??rehrauer: Not sure if this is a feature or a +# bug, actually. Why is the range 1-15? +# + send_gdb "handle 58\n" + gdb_expect { + -re "Only signals 1-15 are valid as numeric signals.*Use \"info signals\" for a list of symbolic signals.*$gdb_prompt $"\ + {pass "invalid signal number rejected"} + -re "$gdb_prompt $"\ + {fail "invalid signal number rejected"} + timeout {fail "(timeout) invalid signal number rejected"} + } + +# Verify that we can accept a signal ID range (number-number). +# ??rehrauer: This feature isn't documented on the quick-reference +# card. +# + send_gdb "handle 13-15\n" + gdb_expect { + -re ".*SIGPIPE.*SIGALRM.*SIGTERM.*$gdb_prompt $"\ + {pass "handle multiple SIGs via integer range"} + -re "$gdb_prompt $"\ + {fail "handle multiple SIGs via integer range"} + timeout {fail "(timeout) handle multiple SIGs via integer range"} + + } + +# Bizarrely enough, GDB also allows you to reverse the range +# stat, stop IDs. E.g., "3-1" and "1-3" mean the same thing. +# Probably this isn't documented, but the code anticipates it, +# so we'd best test it... +# + send_gdb "handle 15-13\n" + gdb_expect { + -re ".*SIGPIPE.*SIGALRM.*SIGTERM.*$gdb_prompt $"\ + {pass "handle multiple SIGs via integer range"} + -re "$gdb_prompt $"\ + {fail "handle multiple SIGs via integer range"} + timeout {fail "(timeout) handle multiple SIGs via integer range"} + + } + +# SIGINT is used by the debugger as well. Verify that we can change +# our minds about changing it. +# + send_gdb "handle SIGINT nopass\n" + gdb_expect { + -re ".*SIGINT is used by the debugger.*Are you sure you want to change it.*y or n.*"\ + {send_gdb "n\n" +# ??rehrauer: When you answer "n", the header for the signal info is +# printed, but not the actual handler settings. Probably a bug. +# + gdb_expect { + -re "Not confirmed, unchanged.*Signal.*$gdb_prompt $"\ + {pass "override SIGINT"} + -re "$gdb_prompt $"\ + {fail "override SIGINT"} + timeout {fail "(timeout) override SIGINT"} + } + } + -re "$gdb_prompt $"\ + {fail "override SIGINT"} + timeout {fail "(timeout) override SIGINT"} + } + +# Verify that GDB responds gracefully to the "signal" command with +# a missing argument. +# + send_gdb "signal\n" + gdb_expect { + -re "Argument required .signal number..*$gdb_prompt $"\ + {pass "signal without arguments disallowed"} + -re "$gdb_prompt $"\ + {fail "signal without arguments disallowed"} + timeout {fail "(timeout) signal without arguments disallowed"} + } + +# Verify that we can successfully send a signal other than 0 to +# the inferior. (This probably causes the inferior to run away. +# Be prepared to rerun to main for further testing.) +# + send_gdb "signal 5\n" + gdb_expect { + -re "Continuing with signal SIGTRAP.*$gdb_prompt $"\ + {pass "sent signal 5"} + -re "$gdb_prompt $"\ + {fail "sent signal 5"} + timeout {fail "(timeout) sent signal 5"} + } + +} + +return 0 diff --git a/gdb/testsuite/gdb.base/smoke.c b/gdb/testsuite/gdb.base/smoke.c new file mode 100644 index 00000000000..69d34c9790f --- /dev/null +++ b/gdb/testsuite/gdb.base/smoke.c @@ -0,0 +1,40 @@ +/* Test various kinds of stepping. +*/ +int glob = 0; + +int callee() { + glob++; + return (0); +} + +int main () { + int w,x,y,z; + int a[10], b[10]; + + /* Test "next" and "step" */ + w = 0; + x = 1; + y = 2; + z = 3; + w = w + 2; + x = x + 3; + y = y + 4; + z = z + 5; + + /* Test that "next" goes over a call */ + callee(); /* OVER */ + + /* Test that "step" doesn't */ + callee(); /* INTO */ + + /* Test "stepi" */ + a[5] = a[3] - a[4]; + callee(); /* STEPI */ + + /* Test "nexti" */ + callee(); /* NEXTI */ + + y = w + z; + + return (0); +} diff --git a/gdb/testsuite/gdb.base/smoke.cc b/gdb/testsuite/gdb.base/smoke.cc new file mode 100644 index 00000000000..931fdaf061b --- /dev/null +++ b/gdb/testsuite/gdb.base/smoke.cc @@ -0,0 +1,480 @@ +// Test various -*- C++ -*- things. + +typedef struct fleep fleep; +struct fleep { int a; } s; + +// ====================== simple class structures ======================= + +struct default_public_struct { + // defaults to public: + int a; + int b; +}; + +struct explicit_public_struct { + public: + int a; + int b; +}; + +struct protected_struct { + protected: + int a; + int b; +}; + +struct private_struct { + private: + int a; + int b; +}; + +struct mixed_protection_struct { + public: + int a; + int b; + private: + int c; + int d; + protected: + int e; + int f; + public: + int g; + private: + int h; + protected: + int i; +}; + +class public_class { + public: + int a; + int b; +}; + +class protected_class { + protected: + int a; + int b; +}; + +class default_private_class { + // defaults to private: + int a; + int b; +}; + +class explicit_private_class { + private: + int a; + int b; +}; + +class mixed_protection_class { + public: + int a; + int b; + private: + int c; + int d; + protected: + int e; + int f; + public: + int g; + private: + int h; + protected: + int i; +}; + +// ========================= simple inheritance ========================== + +class A { + public: + int a; + int x; +}; + +A g_A; + +class B : public A { + public: + int b; + int x; +}; + +B g_B; + +class C : public A { + public: + int c; + int x; +}; + +C g_C; + +class D : public B, public C { + public: + int d; + int x; +}; + +D g_D; + +class E : public D { + public: + int e; + int x; +}; + +E g_E; + +class class_with_anon_union +{ + public: + int one; + union + { + int a; + long b; + }; +}; + +class_with_anon_union g_anon_union; + +void inheritance2 (void) +{ +} + +void inheritance1 (void) +{ + int ival; + int *intp; + + // {A::a, A::x} + + g_A.A::a = 1; + g_A.A::x = 2; + + // {{A::a,A::x},B::b,B::x} + + g_B.A::a = 3; + g_B.A::x = 4; + g_B.B::b = 5; + g_B.B::x = 6; + + // {{A::a,A::x},C::c,C::x} + + g_C.A::a = 7; + g_C.A::x = 8; + g_C.C::c = 9; + g_C.C::x = 10; + + // {{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x} + + // The following initialization code is non-portable, but allows us + // to initialize all members of g_D until we can fill in the missing + // initialization code with legal C++ code. + + for (intp = (int *) &g_D, ival = 11; + intp < ((int *) &g_D + sizeof (g_D) / sizeof (int)); + intp++, ival++) + { + *intp = ival; + } + + // Overlay the nonportable initialization with legal initialization. + + // ????? = 11; (g_D.A::a = 11; is ambiguous) + // ????? = 12; (g_D.A::x = 12; is ambiguous) + g_D.B::b = 13; + g_D.B::x = 14; + // ????? = 15; + // ????? = 16; + g_D.C::c = 17; + g_D.C::x = 18; + g_D.D::d = 19; + g_D.D::x = 20; + + + // {{{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}},E::e,E::x} + + // The following initialization code is non-portable, but allows us + // to initialize all members of g_D until we can fill in the missing + // initialization code with legal C++ code. + + for (intp = (int *) &g_E, ival = 21; + intp < ((int *) &g_E + sizeof (g_E) / sizeof (int)); + intp++, ival++) + { + *intp = ival; + } + + // Overlay the nonportable initialization with legal initialization. + + // ????? = 21; (g_E.A::a = 21; is ambiguous) + // ????? = 22; (g_E.A::x = 22; is ambiguous) + g_E.B::b = 23; + g_E.B::x = 24; + // ????? = 25; + // ????? = 26; + g_E.C::c = 27; + g_E.C::x = 28; + g_E.D::d = 29; + g_E.D::x = 30; + g_E.E::e = 31; + g_E.E::x = 32; + + g_anon_union.one = 1; + g_anon_union.a = 2; + + inheritance2 (); +} + +// ======================== virtual base classes========================= + +class vA { + public: + int va; + int vx; +}; + +vA g_vA; + +class vB : public virtual vA { + public: + int vb; + int vx; +}; + +vB g_vB; + +class vC : public virtual vA { + public: + int vc; + int vx; +}; + +vC g_vC; + +class vD : public virtual vB, public virtual vC { + public: + int vd; + int vx; +}; + +vD g_vD; + +class vE : public virtual vD { + public: + int ve; + int vx; +}; + +vE g_vE; + +void inheritance4 (void) +{ +} + +void inheritance3 (void) +{ + int ival; + int *intp; + + // {vA::va, vA::vx} + + g_vA.vA::va = 1; + g_vA.vA::vx = 2; + + // {{vA::va, vA::vx}, vB::vb, vB::vx} + + g_vB.vA::va = 3; + g_vB.vA::vx = 4; + g_vB.vB::vb = 5; + g_vB.vB::vx = 6; + + // {{vA::va, vA::vx}, vC::vc, vC::vx} + + g_vC.vA::va = 7; + g_vC.vA::vx = 8; + g_vC.vC::vc = 9; + g_vC.vC::vx = 10; + + // {{{{vA::va, vA::vx}, vB::vb, vB::vx}, vC::vc, vC::vx}, vD::vd,vD::vx} + + g_vD.vA::va = 11; + g_vD.vA::vx = 12; + g_vD.vB::vb = 13; + g_vD.vB::vx = 14; + g_vD.vC::vc = 15; + g_vD.vC::vx = 16; + g_vD.vD::vd = 17; + g_vD.vD::vx = 18; + + + // {{{{{vA::va,vA::vx},vB::vb,vB::vx},vC::vc,vC::vx},vD::vd,vD::vx},vE::ve,vE::vx} + + g_vD.vA::va = 19; + g_vD.vA::vx = 20; + g_vD.vB::vb = 21; + g_vD.vB::vx = 22; + g_vD.vC::vc = 23; + g_vD.vC::vx = 24; + g_vD.vD::vd = 25; + g_vD.vD::vx = 26; + g_vE.vE::ve = 27; + g_vE.vE::vx = 28; + + inheritance4 (); +} + +// ====================================================================== + +class Base1 { + public: + int x; + Base1(int i) { x = i; } +}; + +class Foo +{ + public: + int x; + int y; + static int st; + Foo (int i, int j) { x = i; y = j; } + int operator! (); + operator int (); + int times (int y); +}; + +class Bar : public Base1, public Foo { + public: + int z; + Bar (int i, int j, int k) : Base1 (10*k), Foo (i, j) { z = k; } +}; + +int Foo::operator! () { return !x; } + +int Foo::times (int y) { return x * y; } + +int Foo::st = 100; + +Foo::operator int() { return x; } + +Foo foo(10, 11); +Bar bar(20, 21, 22); + +class Contains_static_instance +{ + public: + int x; + int y; + Contains_static_instance (int i, int j) { x = i; y = j; } + static Contains_static_instance null; +}; + +Contains_static_instance Contains_static_instance::null(0,0); +Contains_static_instance csi(10,20); + +class Contains_nested_static_instance +{ + public: + class Nested + { + public: + Nested(int i) : z(i) {} + int z; + static Contains_nested_static_instance xx; + }; + + Contains_nested_static_instance(int i, int j) : x(i), y(j) {} + + int x; + int y; + + static Contains_nested_static_instance null; + static Nested yy; +}; + +Contains_nested_static_instance Contains_nested_static_instance::null(0, 0); +Contains_nested_static_instance::Nested Contains_nested_static_instance::yy(5); +Contains_nested_static_instance + Contains_nested_static_instance::Nested::xx(1,2); +Contains_nested_static_instance cnsi(30,40); + +typedef struct { + int one; + int two; +} tagless_struct; +tagless_struct v_tagless; + +/* Try to get the compiler to allocate a class in a register. */ +class small { + public: + int x; + int method (); +}; +int small::method () +{ + return x + 5; +} +void marker_reg1 () {} + +int +register_class () +{ + /* We don't call any methods for v, so gcc version cygnus-2.3.3-930220 + might put this variable in a register. This is a lose, though, because + it means that GDB can't call any methods for that variable. */ + register small v; + + int i; + + /* Perform a computation sufficiently complicated that optimizing compilers + won't optimized out the variable. If some compiler constant-folds this + whole loop, maybe using a parameter to this function here would help. */ + v.x = 0; + for (i = 0; i < 13; ++i) + v.x += i; + --v.x; /* v.x is now 77 */ + marker_reg1 (); + return v.x + 5; +} + +int +main() +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + inheritance1 (); + inheritance3 (); + register_class (); + + /* FIXME: pmi gets optimized out. Need to do some more computation with + it or something. (No one notices, because the test is xfail'd anyway, + but that probably won't always be true...). */ + int Foo::* pmi = &Foo::y; + + /* Make sure the AIX linker doesn't remove the variable. */ + v_tagless.one = 5; + + return foo.*pmi; +} + +/* Create an instance for some classes, otherwise they get optimized away. */ +default_public_struct default_public_s; +explicit_public_struct explicit_public_s; +protected_struct protected_s; +private_struct private_s; +mixed_protection_struct mixed_protection_s; +public_class public_c; +protected_class protected_c; +default_private_class default_private_c; +explicit_private_class explicit_private_c; +mixed_protection_class mixed_protection_c; diff --git a/gdb/testsuite/gdb.base/smoke.exp b/gdb/testsuite/gdb.base/smoke.exp new file mode 100644 index 00000000000..42de7c891f1 --- /dev/null +++ b/gdb/testsuite/gdb.base/smoke.exp @@ -0,0 +1,181 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# smoke.exp -- Expect script to test gdb before checkins + +# use this to debug: +# +#log_user 1 + +if $tracelevel then { + strace $tracelevel +} + +set testfile smoke +set testfile1 smoke1 +set c_srcfile ${srcdir}/${subdir}/${testfile}.c +set cpp_srcfile ${srcdir}/${subdir}/${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} +set binfile1 ${objdir}/${subdir}/${testfile1} + +#remote_exec build "rm -f ${binfile}" +remote_exec build "rm -f core" + +# "C" section, using source copied from "step-test.c" from "gdb.base" +# +if { [gdb_compile "${c_srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# Some basic tests +# +gdb_test "tb main" ".*Breakpoint 1 at.*line 15.*" "temp breakpoint" +gdb_test "b callee" ".*Breakpoint 2 at.*line 6.*" "breakpoint" +gdb_test "l 10" ".*10.*int main.*11.*int w,x,y,z;.*12.*int a.*" "list" +gdb_test "c" ".*The program is not being run.*" "catch error" +gdb_test "r" ".*Starting program.*main.*15.*" "hit bp" +gdb_test "hel r" ".*Start debugged program.*without arguments.*" "help" +gdb_test "n" ".*x = 1;.*" "next" +gdb_test "s" ".*y = 2;.*" "step" +gdb_test "p/t y" ".* = 1.*" "print y in binary" +gdb_test "p 1+2*3+4" ".* = 11.*" "calculate" +gdb_test "p/t 1+2*3+4" ".* = 1011.*" "binary" + +# Note: accept either "Watchpoint" or "Hardware watchpoint"; +# 10.20 can't do the hardware watch. The hardware kind +# triggers one line earlier than the regular kind. +# +gdb_test "wat y" ".*atchpoint.*y.*" "set watch" +gdb_test "c" ".*atchpoint.*Old.*= .*New.*= 2.*1\[78\].*" "continue, hit watch" + +gdb_test "set glob=999" ".*.*" "set" +gdb_test "p glob" ".*= 999.*.*" "print glob" +gdb_test "p/x glob" ".*= 0x3e7.*" "hex" +gdb_test "c" ".*atchpoint.*Old.*= 2.*New.*= 6.*2\[12\].*" "continue, 2nd hit watch" +gdb_test "d 5" "No breakpoint number 5." "del non existing watch" +gdb_test "c" ".*Breakpoint.*callee.*6.*" "hit bp" +gdb_test "bt" ".*callee.*6.*main.*25.*" "bt" +gdb_test "fin" ".*Run till exit.*callee.*Value returned.*0.*" "finish" +gdb_test "c" ".*Breakpoint.*callee.*6.*" "hit bp again" +gdb_test "cle" ".*Deleted breakpoint.*" "clear" +gdb_test "wat glob" ".*atchpoint.*glob.*" "set 2nd watch" +gdb_test "i wat" ".*" "" +gdb_test "whe" ".*" "" + +# ??rehrauer: We're now disabling watchpoints while an interactive +# call is "in flight". When/if we can teach gdb how to unwind through +# the call dummy frame, we can then allow watches during calls, and +# also then restore this testpoint to the original, commented-out form. +# +gdb_test "call callee()" ".*\[0-9\]* = 0.*" "call, didn't hit watch" +#gdb_test "call callee()" ".*atchpoint.*Old.*= 1000.*New.*= 1001.*\[67\].*being debug.*is done.*" "call, hit watch" + +gdb_test "d 4" ".*" "del watch 2" +gdb_test "d 3" ".*" "del watch 1" +gdb_test "info break" "No breakpoints or watchpoints." +# since we have deleted all the watchpoints this test is useless +#gdb_test "c" ".*Continuing.*" "end call" +gdb_test "c" ".*Program exited normally.*" "pgm exit" + +# Check for production of a core file +# +#set exec_output [execute_anywhere "ls core"] +set exec_output [remote_exec build "ls core"] + +if [ regexp "core not found" $exec_output] { + pass "No core dumped on quit" +} else { + if [ regexp "No such file or directory" $exec_output] { + pass "ls: core: No core dumped on quit" + } else { + remote_exec build "rm -f core" + fail "Core dumped on quit" + } +} + + +#======================================== +# +# "C++" section, using source copied from "misc.cc" from "gdb.c++" +# + +# +#remote_exec build "rm -f ${binfile}" +#remote_exec build "CC -g -o ${binfile} ${cpp_srcfile}" +if {[gdb_compile "${cpp_srcfile}" "${binfile1}" executable {c++ debug}] != ""} { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile1} + +# Tests, some copied from misc.exp. +# + + # See what language gdb thinks main() is, prior to reading full symbols. + # I think this fails for COFF targets. + setup_xfail "a29k-*-udi" + send_gdb "show language\n" + gdb_expect { + -re ".* source language is \"auto; currently c\\+\\+\".*$gdb_prompt $" { + pass "deduced language is C++, before full symbols" + } + -re ".*$gdb_prompt $" { fail "source language not correct for C++ (psymtabs only)"} + return + + timeout { fail "can't show language (timeout)"} + return + } + +gdb_test "b main" ".*Breakpoint 1 at.*" "" +gdb_test "r" ".*Starting program.*Breakpoint 1.*" "run to main" +gdb_test "ptype Foo" ".*type = class Foo.*static int st;.*int operator.*" "ptype" +gdb_test "step" ".*inheritance1.*" "step" +gdb_test "ptype g_anon_union" ".*anon_union.*union.*int a;.*" "anon" +gdb_test "p g_E" ".*class D.*class B.*class A.*class C.*class A.*x = 0.*" "print inherited class " +gdb_test "p g_E.x = 99" ".*warn.*x ambiguous; using E::x. Use a cast to disambig.*99.*" "set via print" +gdb_test "c" ".*Program exited.*" "run to end" + +gdb_exit + +# Check for production of a core file +# +#set exec_output [execute_anywhere "ls core"] +set exec_output [remote_exec build "ls core"] +if [ regexp "core not found" $exec_output] { + pass "No core dumped on quit" +} else { + if [ regexp "No such file or directory" $exec_output] { + pass "ls: core: No core dumped on quit" + } else { + remote_exec build "rm -f core" + fail "Core dumped on quit" + } +} + +# execute_anywhere "rm -f ${binfile1}" +# +return 0 diff --git a/gdb/testsuite/gdb.base/so-impl-ld.c b/gdb/testsuite/gdb.base/so-impl-ld.c new file mode 100644 index 00000000000..a8fa18949b2 --- /dev/null +++ b/gdb/testsuite/gdb.base/so-impl-ld.c @@ -0,0 +1,18 @@ +/* This program is linked against SOM shared libraries, which the loader + automatically loads along with the program itself). + */ + +#include + +extern int solib_main (int); + +main () +{ + int result; + + /* Call a shlib function. */ + result = solib_main (100); + + /* Call it again. */ + result = solib_main (result); +} diff --git a/gdb/testsuite/gdb.base/so-impl-ld.exp b/gdb/testsuite/gdb.base/so-impl-ld.exp new file mode 100644 index 00000000000..a52aa1fdfb3 --- /dev/null +++ b/gdb/testsuite/gdb.base/so-impl-ld.exp @@ -0,0 +1,167 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel + } + +set prms_id 0 +set bug_id 0 + +# are we on a target board +if ![isnative] then { + return +} + +# This test is presently only valid on HP-UX, since it requires +# that we use HP-UX-specific compiler & linker options to build +# the testcase. +# +setup_xfail "*-*-*" +clear_xfail "hppa*-*-*hpux*" + +set libfile "solib" +set testfile "so-impl-ld" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile}] { + return -1 +} + +# Build the shared libraries this test case needs. +# +#cd ${subdir} +#remote_exec build "$CC -g +z -c ${libfile}1.c -o ${libfile}1.o" + + +if {$gcc_compiled == 0} { + if [istarget "hppa*-hp-hpux*"] then { + set additional_flags "additional_flags=+z" + } else { + # don't know that the compiler is, hope for the best... + set additional_flags "" + } +} else { + set additional_flags "additional_flags=-fpic" +} + +if {[gdb_compile "${srcdir}/${subdir}/${libfile}1.c" "${libfile}1.o" object [list debug $additional_flags]] != ""} { + perror "Couldn't compile ${libfile}1.c" + return -1 +} + +if [istarget "hppa*-hp-hpux*"] then { + remote_exec build "ld -b ${libfile}1.o -o ${libfile}1.sl" +} else { + set additional_flags "additional_flags=-shared" + gdb_compile "${libfile}1.o" "${libfile}1.sl" executable [list debug $additional_flags] +} + +# Build the test case +#remote_exec build "$CC -Aa -g ${srcfile} ${libfile}1.sl -o ${binfile}" + + +if {$gcc_compiled == 0} { + if [istarget "hppa*-hp-hpux*"] then { + set additional_flags "additional_flags=-Ae" + } else { + # don't know what the compiler is, hope for the best, maybe it's ANSI... + set additional_flags "" + } +} else { + set additional_flags "" +} + +if {[gdb_compile "${srcdir}/${subdir}/${srcfile} ${libfile}1.sl" "${binfile}" executable [list debug $additional_flags]] != ""} { + perror "Couldn't build ${binfile}" + return -1 +} +#cd .. + +# Start with a fresh gdb + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# This program implicitly loads SOM shared libraries. +# +if ![runto_main] then { fail "implicit solibs tests suppressed" } + +# Verify that we can step over the first shlib call. +# +send_gdb "next\n" +gdb_expect { + -re "17\[ \t\]*result = solib_main .result.*$gdb_prompt $"\ + {pass "step over solib call"} + -re "$gdb_prompt $"\ + {fail "step over solib call"} + timeout {fail "(timeout) step over solib call"} +} + +# Verify that we can step into the second shlib call. +# +send_gdb "step\n" +gdb_expect { + -re "solib_main .arg=10000. at.*${libfile}1.c:8.*$gdb_prompt $"\ + {pass "step into solib call"} + -re "$gdb_prompt $"\ + {fail "step into solib call"} + timeout {fail "(timeout) step into solib call"} +} + +# Verify that we can step within the shlib call. +# +send_gdb "next\n" +gdb_expect { + -re "9\[ \t\]*\}.*$gdb_prompt $"\ + {pass "step in solib call"} + -re "$gdb_prompt $"\ + {fail "step in solib call"} + timeout {fail "(timeout) step in solib call"} +} + +# Verify that we can step out of the shlib call, and back out into +# the caller. +# +send_gdb "next\n" +gdb_expect { + -re "0x\[0-9a-f\]*\[ \t\]*9\[ \t\]*.*$gdb_prompt $" { + # we haven't left the callee yet, so do another next + send_gdb "next\n" + gdb_expect { + -re "main .. at.*so-impl-ld.c:18.*$gdb_prompt $"\ + {pass "step out of solib call"} + -re "$gdb_prompt $"\ + {fail "step out of solib call"} + timeout {fail "(timeout) step out of solib call"} + } + } + + -re "main .. at.*so-impl-ld.c:18.*$gdb_prompt $"\ + {pass "step out of solib call"} + -re "$gdb_prompt $"\ + {fail "step out of solib call"} + timeout {fail "(timeout) step out of solib call"} +} + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/so-indr-cl.c b/gdb/testsuite/gdb.base/so-indr-cl.c new file mode 100644 index 00000000000..dc29badcbd7 --- /dev/null +++ b/gdb/testsuite/gdb.base/so-indr-cl.c @@ -0,0 +1,23 @@ +/* This program is linked against SOM shared libraries, which the loader + automatically loads along with the program itself). + */ + +#include + +extern int solib_main (int); + +static int +solib_wrapper (function) + int (*function)(int); +{ + return (*function)(100); +} + + +main () +{ + int result; + + /* This is an indirect call to solib_main. */ + result = solib_wrapper (solib_main); +} diff --git a/gdb/testsuite/gdb.base/so-indr-cl.exp b/gdb/testsuite/gdb.base/so-indr-cl.exp new file mode 100644 index 00000000000..e37878e4a6b --- /dev/null +++ b/gdb/testsuite/gdb.base/so-indr-cl.exp @@ -0,0 +1,146 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel + } + +set prms_id 0 +set bug_id 0 + +# are we on a target board +if ![isnative] then { + return +} + +# This test is presently only valid on HP-UX, since it requires +# that we use HP-UX-specific compiler & linker options to build +# the testcase. +# +setup_xfail "*-*-*" +clear_xfail "hppa*-*-*hpux*" + +set libfile "solib" +set testfile "so-indr-cl" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile}] { + return -1 +} + +# Build the shared libraries this test case needs. +# +#cd ${subdir} +#remote_exec build "$CC -g +z -c ${libfile}1.c -o ${libfile}1.o" + + +if {$gcc_compiled == 0} { + if [istarget "hppa*-hp-hpux*"] then { + set additional_flags "additional_flags=+z" + } else { + # don't know what the compiler is... + set additional_flags "" + } +} else { + set additional_flags "additional_flags=-fpic" +} +if {[gdb_compile "${srcdir}/${subdir}/${libfile}1.c" "${objdir}/${subdir}/${libfile}1.o" object [list debug $additional_flags]] != ""} { + perror "Couldn't compile ${libfile}1.c" + return -1 +} + +if [istarget "hppa*-hp-hpux*"] then { + remote_exec build "ld -b ${objdir}/${subdir}/${libfile}1.o -o ${objdir}/${subdir}/${libfile}1.sl" +} else { + set additional_flags "additional_flags=-shared" + gdb_compile "${objdir}/${subdir}/${libfile}1.o" "${objdir}/${subdir}/${libfile}1.sl" executable [list debug $additional_flags] +} + +# Build the test case +#remote_exec build "$CC -Aa -g ${srcfile} ${libfile}1.sl -o ${binfile}" + + +if {$gcc_compiled == 0} { + if [istarget "hppa*-hp-hpux*"] then { + set additional_flags "additional_flags=-Ae" + } else { + # don't know what the compiler is, hope for the best, maybe it's ANSI... + set additional_flags "" + } +} else { + set additional_flags "" +} +if {[gdb_compile "${srcdir}/${subdir}/${srcfile} ${objdir}/${subdir}/${libfile}1.sl" "${binfile}" executable [list debug $additional_flags]] != ""} { + perror "Couldn't build ${binfile}" + return -1 +} + +#cd .. + +# Start with a fresh gdb + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# This program implicitly loads SOM shared libraries. We wish to test +# whether a user can set breakpoints in a shlib before running the +# program, where the program doesn't directly call the shlib, but +# indirectly does via passing its address to another function. +# +# ??rehrauer: Currently, this doesn't work, but we do catch the case +# and explicitly disallow it. The reason it fails appears to be that +# +# [1] gdb consults only the linker symbol table in this scenario, and +# [2] For a shlib function that is only indirectly called from the +# main a.out, there is in the linker symbol table a stub whose +# address is negative. Possibly this is to be interpreted as +# an index into the DLT?? +# +send_gdb "break solib_main\n" +gdb_expect { + -re "Cannot break on solib_main without a running program.*$gdb_prompt $"\ + {pass "break on indirect solib call before running"} + -re "$gdb_prompt $"\ + {fail "break on indirect solib call before running"} + timeout {fail "(timeout) break on indirect solib call before running"} +} + +# However, if we do run to the program's main, we then ought to be +# able to set a breakpoint on the indirectly called function. (Apparently, +# once the inferior is running, gdb consults the debug info rather than +# the linker symbol table, and is able to find the correct address.) +# +if ![runto_main] then { fail "indirect solib call tests suppressed" } + +# Verify that we can step over the first shlib call. +# +send_gdb "break solib_main\n" +gdb_expect { + -re ".*\[Bb\]reakpoint \[0-9\]* at 0x\[0-9a-fA-F\]*: file.*${libfile}1.c.*$gdb_prompt $"\ + {pass "break on indirect solib call after running"} + -re "$gdb_prompt $"\ + {fail "break on indirect solib call after running"} + timeout {fail "(timeout) break on indirect solib call after running"} +} + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/solib.c b/gdb/testsuite/gdb.base/solib.c new file mode 100644 index 00000000000..ff9d359218e --- /dev/null +++ b/gdb/testsuite/gdb.base/solib.c @@ -0,0 +1,59 @@ +/* This program uses HP-UX-specific features to load and unload SOM + shared libraries that it wasn't linked against (i.e., libraries + that the loader doesn't automatically load along with the program + itself). + */ + +#include +#include + +main () +{ + shl_t solib_handle; + int dummy; + int status; + int (*solib_main) (); + + /* Load a shlib, with immediate binding of all symbols. + + Note that the pathname of the loaded shlib is assumed to be relative + to the testsuite directory (from whence the tested GDB is run), not + from dot/. + */ + dummy = 1; /* Put some code between shl_ calls... */ + solib_handle = shl_load ("gdb.base/solib1.sl", BIND_IMMEDIATE, 0); + + /* Find a function within the shlib, and call it. */ + status = shl_findsym (&solib_handle, + "solib_main", + TYPE_PROCEDURE, + (long *) &solib_main); + status = (*solib_main) (dummy); + + /* Unload the shlib. */ + status = shl_unload (solib_handle); + + /* Load a different shlib, with deferred binding of all symbols. */ + dummy = 2; + solib_handle = shl_load ("gdb.base/solib2.sl", BIND_DEFERRED, 0); + + /* Find a function within the shlib, and call it. */ + status = shl_findsym (&solib_handle, + "solib_main", + TYPE_PROCEDURE, + (long *) &solib_main); + status = (*solib_main) (dummy); + + /* Unload the shlib. */ + status = shl_unload (solib_handle); + + /* Reload the first shlib again, with deferred symbol binding this time. */ + dummy = 3; + solib_handle = shl_load ("gdb.base/solib1.sl", BIND_IMMEDIATE, 0); + + /* Unload it without trying to find any symbols in it. */ + status = shl_unload (solib_handle); + + /* All done. */ + dummy = -1; +} diff --git a/gdb/testsuite/gdb.base/solib.exp b/gdb/testsuite/gdb.base/solib.exp new file mode 100644 index 00000000000..f452194d8a7 --- /dev/null +++ b/gdb/testsuite/gdb.base/solib.exp @@ -0,0 +1,319 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel + } + +set prms_id 0 +set bug_id 0 + +# are we on a target board +if ![isnative] then { + return +} + +# This test is presently only valid on HP-UX. It verifies GDB's +# ability to catch loads and unloads of shared libraries. +# + +#setup_xfail "*-*-*" +#clear_xfail "hppa*-*-*hpux*" +if {![istarget "hppa*-*-hpux*"]} { + return 0 +} + +set testfile "solib" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +# build the first test case +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile}] { + return -1 +} + +# Build the shared libraries this test case needs. +# +#cd ${subdir} +#remote_exec build "$CC -g +z -c ${testfile}1.c -o ${testfile}1.o" +#remote_exec build "$CC -g +z -c ${testfile}2.c -o ${testfile}2.o" + +if {$gcc_compiled == 0} { + if [istarget "hppa*-hp-hpux*"] then { + set additional_flags "additional_flags=+z" + } else { + # don't know what the compiler is... + set additional_flags "" + } +} else { + set additional_flags "additional_flags=-fpic" +} + +if {[gdb_compile "${srcdir}/${subdir}/${testfile}1.c" "${binfile}1.o" object [list debug $additional_flags]] != ""} { + perror "Couldn't compile ${testfile}1.c" + #return -1 +} +if {[gdb_compile "${srcdir}/${subdir}/${testfile}2.c" "${binfile}2.o" object [list debug, $additional_flags]] != ""} { + perror "Couldn't compile ${testfile}2.c" + #return -1 +} + +if [istarget "hppa*-*-hpux*"] { + remote_exec build "ld -b ${binfile}1.o -o ${binfile}1.sl" + remote_exec build "ld -b ${binfile}2.o -o ${binfile}2.sl" +} else { + set additional_flags "additional_flags=-shared" + gdb_compile "${binfile}1.o" "${binfile}1.sl" executable [list debug $additional_flags] + gdb_compile "${binfile}2.o" "${binfile}2.sl" executable [list debug $additional_flags] +} +#cd .. + +# Start with a fresh gdb + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# This program manually loads and unloads SOM shared libraries, via calls +# to shl_load and shl_unload. +# +if ![runto_main] then { fail "catch load/unload tests suppressed" } + +# Verify that we complain if the user tells us to catch something we +# don't understand. +# +send_gdb "catch a_cold\n" +gdb_expect { + -re "Unknown event kind specified for catch.*$gdb_prompt $"\ + {pass "bogus catch kind is disallowed"} + -re "$gdb_prompt $"\ + {fail "bogus catch kind is disallowed"} + timeout {fail "(timeout) bogus catch kind is disallowed"} +} + +# Verify that we can set a generic catchpoint on shlib loads. I.e., that +# we can catch any shlib load, without specifying the name. +# +send_gdb "catch load\n" +gdb_expect { + -re "Catchpoint \[0-9\]* .load .*$gdb_prompt $"\ + {pass "set generic catch load"} + -re "$gdb_prompt $"\ + {fail "set generic catch load"} + timeout {fail "(timeout) set generic catch load"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Catchpoint \[0-9\] .loaded gdb.base/solib1.sl.*$gdb_prompt $"\ + {pass "caught generic solib load"} + -re "$gdb_prompt $"\ + {fail "caught generic solib load"} + timeout {fail "(timeout) caught generic solib load"} +} + +# Set a breakpoint on the line following the shl_load call, and +# continue. +# +# ??rehrauer: It appears that we can't just say "finish" from here; +# GDB is getting confused by the dld's presense on the stack. +# +send_gdb "break 27\n" +gdb_expect { + -re "Breakpoint \[0-9\]* at.*$gdb_prompt $"\ + {pass "set break after shl_load"} + -re "$gdb_prompt $"\ + {fail "set break after shl_load"} + timeout {fail "(timeout) set break after shl_load"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint \[0-9\]*, main .. at .*solib.c:27.*$gdb_prompt $"\ + {pass "continue after generic catch load"} + -re "$gdb_prompt $"\ + {fail "continue after generic catch load"} + timeout {fail "(timeout) continue after generic catch load"} +} + +# Step over the call to shl_findsym. +# +# ??rehrauer: In theory, since the call to shl_load asked for +# immediate binding of the shlib's symbols, and since the +# shlib's symbols should have been auto-loaded, we ought to +# be able to set a breakpoint on solib_main now. However, +# that seems not to be the case. Dunno why for sure; perhaps +# the breakpoint wants to be set on an import stub in the +# main program for solib_main? There wouldn't be one, in +# this case... +# +send_gdb "next\n" +gdb_expect { + -re "$gdb_prompt $"\ + {pass "step over shl_findsym"} + timeout {fail "(timeout) step over shl_findsym"} +} + +# Verify that we can catch an unload of any library. +# +send_gdb "catch unload\n" +gdb_expect { + -re "Catchpoint \[0-9\]* .unload .*$gdb_prompt $"\ + {pass "set generic catch unload"} + -re "$gdb_prompt $"\ + {fail "set generic catch unload"} + timeout {fail "(timeout) set generic catch load"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Catchpoint \[0-9\] .unloaded gdb.base/solib1.sl.*$gdb_prompt $"\ + {pass "caught generic solib unload"} + -re "$gdb_prompt $"\ + {fail "caught generic solib unload"} + timeout {fail "(timeout) caught generic solib unload"} +} + +# Verify that we can catch a load of a specific library. (Delete +# all the other catchpoints first, so that the generic catchpoints +# we've previously set don't trigger.) +# +send_gdb "delete\n" +gdb_expect { + -re "Delete all breakpoints.*y or n.*"\ + {send_gdb "y\n" + gdb_expect { + -re "$gdb_prompt $"\ + {pass "delete all catchpoints"} + timeout {fail "(timeout) delete all catchpoints"} + } + } + -re "$gdb_prompt $"\ + {fail "delete all catchpoints"} + timeout {fail "(timeout) delete all catchpoints"} +} + +send_gdb "catch load gdb.base/solib2.sl\n" +gdb_expect { + -re "Catchpoint \[0-9\]* .load gdb.base/solib2.sl.*$gdb_prompt $"\ + {pass "set specific catch load"} + -re "$gdb_prompt $"\ + {fail "set specific catch load"} + timeout {fail "(timeout) set specific catch load"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Catchpoint \[0-9\] .loaded gdb.base/solib2.sl.*$gdb_prompt $"\ + {pass "caught specific solib load"} + -re "$gdb_prompt $"\ + {fail "caught specific solib load"} + timeout {fail "(timeout) caught specific solib load"} +} + +# Verify that we can catch an unload of a specific library. +# +send_gdb "catch unload gdb.base/solib2.sl\n" +gdb_expect { + -re "Catchpoint \[0-9\]* .unload gdb.base/solib2.sl.*$gdb_prompt $"\ + {pass "set specific catch unload"} + -re "$gdb_prompt $"\ + {fail "set specific catch unload"} + timeout {fail "(timeout) set specific catch unload"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Catchpoint \[0-9\] .unloaded gdb.base/solib2.sl.*$gdb_prompt $"\ + {pass "caught specific solib unload"} + -re "$gdb_prompt $"\ + {fail "caught specific solib unload"} + timeout {fail "(timeout) caught specific solib unload"} +} + +# Verify that we can set a catchpoint on a specific library that +# happens not to be loaded by the program. And, that this catchpoint +# won't trigger inappropriately when other shlibs are loaded. +# +send_gdb "break 55\n" +gdb_expect { + -re "Breakpoint \[0-9\]* at.*$gdb_prompt $"\ + {pass "set break on shl_unload"} + -re "$gdb_prompt $"\ + {fail "set break on shl_unload"} + timeout {fail "(timeout) set break on shl_unload"} +} + +send_gdb "break 58\n" +gdb_expect { + -re "Breakpoint \[0-9\]* at.*$gdb_prompt $"\ + {pass "set break after shl_unload"} + -re "$gdb_prompt $"\ + {fail "set break after shl_unload"} + timeout {fail "(timeout) set break after shl_unload"} +} + +send_gdb "catch load foobar.sl\n" +gdb_expect { + -re "Catchpoint \[0-9\]* .load foobar.sl.*$gdb_prompt $"\ + {pass "set specific catch load for nonloaded shlib"} + -re "$gdb_prompt $"\ + {fail "set specific catch load for nonloaded shlib"} + timeout {fail "(timeout) set specific catch load for nonloaded shlib"} +} + +send_gdb "catch unload foobar.sl\n" +gdb_expect { + -re "Catchpoint \[0-9\]* .unload foobar.sl.*$gdb_prompt $"\ + {pass "set specific catch unload for nonloaded shlib"} + -re "$gdb_prompt $"\ + {fail "set specific catch unload for nonloaded shlib"} + timeout {fail "(timeout) set specific catch unload for nonloaded shlib"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint \[0-9\]*.*$gdb_prompt $"\ + {pass "specific catch load doesn't trigger inappropriately"} + -re "$gdb_prompt $"\ + {fail "specific catch load doesn't trigger inappropriately"} + timeout {fail "(timeout) specific catch load doesn't trigger inappropriately"} +} + +send_gdb "continue\n" +gdb_expect { + -re "Breakpoint \[0-9\]*.*$gdb_prompt $"\ + {pass "specific catch unload doesn't trigger inappropriately"} + -re "$gdb_prompt $"\ + {fail "specific catch unload doesn't trigger inappropriately"} + timeout {fail "(timeout) specific catch unload doesn't trigger inappropriately"} +} + +# ??rehrauer: There ought to be testpoints here that verify that +# load/unload catchpoints can use conditionals, can be temporary, +# self-disabling, etc etc. +# + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/solib1.c b/gdb/testsuite/gdb.base/solib1.c new file mode 100644 index 00000000000..eecf02438b4 --- /dev/null +++ b/gdb/testsuite/gdb.base/solib1.c @@ -0,0 +1,9 @@ +/* This program is intended to be built as an HP-UX SOM shared + library, for use by the solib.exp testcase. It simply returns + the square of its integer argument. + */ +int solib_main (arg) + int arg; +{ + return arg*arg; +} diff --git a/gdb/testsuite/gdb.base/solib2.c b/gdb/testsuite/gdb.base/solib2.c new file mode 100644 index 00000000000..2cd451321bd --- /dev/null +++ b/gdb/testsuite/gdb.base/solib2.c @@ -0,0 +1,9 @@ +/* This program is intended to be built as an HP-UX SOM shared + library, for use by the solib.exp testcase. It simply returns + the cube of its integer argument. + */ +int solib_main (arg) + int arg; +{ + return arg*arg*arg; +} diff --git a/gdb/testsuite/gdb.base/sparc-aout.u b/gdb/testsuite/gdb.base/sparc-aout.u new file mode 100644 index 00000000000..8b4eef915c3 --- /dev/null +++ b/gdb/testsuite/gdb.base/sparc-aout.u @@ -0,0 +1,732 @@ +begin 777 sparc-aout +M@0,!"P ( " #YP " @ "\$" T .@0)(#H$25 +M*B "E *@!)0"0 H7 0U"+@H , C" &((@) 0* 0! 0 "@$ +M ! @$ 0 $ -6<(Z @0 ( P$ ! @$ 0 )WCOV@O (KA7B +M*!$ B0$B(,0 2Y(0( "L$ (D@.@7$ $N4$" @@*(@(!* $\! +MPA.@7H"@80L2@ !+ 0 .@#H&#" Z!DX@.@:*0% &2!( 1+P "*X5XDB0 +M$" E! @!1<@ "6$N "F! %D #2:$" IA ") " !32 Z!DE! @!Q<@ +M "6$N 2F! %D "N:$ 4+P "*X5XG01 (D!(B&T ".2$" JA +M",(#H&B D ! H "R\ BN%>)(D 3 $I(0 !&4$" '%R )82X!*8$ 5 +M0 %YH0( #" Z!PH 3 >8CH'SJ(Z" [".@A , C" &((PB.@B , !#" +M &"@PB.@C , B"$&!DPB.@D) 0( &?Q DA @?(''X B!Z $( !H(0 +M( 40@ $@A @1Q" *"$" #D= @ J 0! @@ +M )WCOY"P$" ,( 8''X B!Z G>._D+ 0( P@ !@@ )WCOY"P$" ,( 8''X B!Z G>._D+ 0( P +M@ !@@ )WCOY"P$" ,( 8'' +MX B!Z G>._D+ 0( P@ !@@ +M )WCOY"P$" ,( 8''X B!Z G>._D+ 0( P@ !@._D!$ C! B. ,( 8''X B!Z G>._D!$ !#!&B"H,( 8''X B! +MZ 0L@ )WCOWA #D 0 !$ !# *B,0$0 $)(0( '2*B)8$0 $)(0 +M( +2*B%X$0 $)(0( /2,B$P$0 $)(0( 32,B$($0 $)(0( 72,B'@$0 +M$)(0( ;2(B'($0 $)(0( ?2(B&@$0 $)(0( C2(B$ $0 $)(0( G2(B,( +M$0 $)(0( K2(B)($0 $)(0( O2(B%@$0 $!, C4 F.TU"(A*!$ ! 3 +M 0U!I@L-0Z(8@1 0$P $-0*8Q#4*B&P$0 $!, !#4"F)8U"HAF!$ +M ! 3 0U IA>-0J(.@1 0$P $-0283#4,B)H$0 $!, !#4$F$(U#(B +M,!$ ! 3 0U!)AX-0R(5@1 0$P $-0"8@ )WCOY 1 0U (C(("BO_\2@ -DA(C(- "8 2 HB H "900 +M( "6 F $DA @ )("8 30 D +@*(@ !*___V4 J !DI* 2 H1 0HA(C +M(*$J8 +0! 1G\( * $/_R I" -+___= $ !&!Q^ (@>@ )WCOY 1 0 +MT@(C'("B8 "@ )H!(C'- $ "?P@ H 0@!- $ " HB $K__^P$ 1 +M )D!(BB$ !E62$" @!0 'KP +M(P@ !J"0 'SP 0,@ !S!0 "@P (O0 "*"0 &] 0- "A"0 # +M^@ 0-@ "X"0 '3P 0. #/"0 $:0 0.@ #F"0 "K@ 0/ #V +M"0 (4@ 0/@ $&"0 &@ 00 $6"0 3 00@ $F"0 N0 01 +M $V"0 'Q@ 02 $_"0 &R 02@ %("0 'F@ 03 %1!0 $DP +M(U@ %E!0 ';P (J0 %Y"0 " P 03@ &-!0 SP (T0 &:!0 # +MJP (I &G"0 &W0 04 &T!0 $I@ )TP &\"0 (A 04@ '4 +M"0 &% 05 'L"0 %(P 05@ ($"0 $V0 06 (5"0 "]@ 06@ +M (F"0 &)@ 07 (W"0 $9@ 07@ )("0 '( 08 )2"0 %:P +M08@ ) ->"0 $G@ 0>@ -G"0 '*P 0? -R"0 '+ 0@@ -]!0 # +MF0 (VP .3!0 &=0 (K@ .I"0 #S@ 0B ._"0 !"0 0B@ /5 +M"0 ;0 0C /K"0 "=P 0C@ /W"0 '10 0D /_!0 $G0 (YP +M 0."0 (80 0D@ 0="0 %^@ 0E 0L"0 '[@ 0E@ 0["0 !S0 +M0F 1*"0 "F0 0F@ 19"0 'A0 0G 1A"0 'K 0P 1["0 ' +MN0 0P@ 2#"0 '1@ 0Q 2+ 0 &= 24!P "F 0, 2F +M"0 '<0 0Q@ 2U"0 "TP 0R 3$!0 &>0 )P 37!0 &B0 )H@ +M 3J!P %H 0+A?971E>'0 7V5D871A %]E;F0 &ET %]M86EN %]E;G9I0!?=E]U;G-I +M9VYE9%]C:&%R7V%R0!?=E]U;G-I9VYE9%]L +M;VYG %]V7V9L;V%T7W!O:6YT97( 7W9?0!?=E]C:&%R7V%R +M0!?=E]S:6=N961?0!?=E]S:&]R=%]A0!? +M=5]L:6YK %]V7W5N&ET %]?97AI=%]D=6UM>5]D96-L %]?7T-43U)?3$E35%]? +M %]?7T143U)?3$E35%]? %]?7V1O7V=L;V)A;%]C=&]R&ET7V1U;6UY7W)E9@ "]UH *6 5 .2 !0 " +M / 0 # @ 4F +M 6R 8F :6 ;> +M * >Z +M HB !$ !Y BD !$ !Y BE !$ !Y B +MG QHD BD !$ !Z BI !$ !Z BJ !$ !Z +M BL RDD BI !$ ![ BN !$ ![ BO !$ +M ![ BQ T D BN !$ !] BS !$ !] BT +M !$ !] BV UDD BS !$ !^ BX !$ !^ B +MY !$ !^ B[ VDD BX !$ !_ B] !$ !_ +M B^ !$ !_ C X D B] !$ "! C" !$ +M "! C# !$ "! C% YDD C" !$ "" C' +M !$ "" C( !$ "" C* Z _@D C +M; !$ ") CA !$ ") CB !$ ") CE !! D +M CA !$ "* CG !$ "* CH !$ "* CK !"$D +M CG !#. !)^ !-^ +M!0: !2* !4" !5R +M !6F !$ "R CN !$ "U CQ !$ "V +M CS !$ "W CV !$ "Y CY !$ "Z C\ !$ +M "[ C_ !$ "] D" !$ "^ D% !$ "_ D( +M !$ #! D+ !$ #" D. !$ ## D1 !$ #% D +M4 !$ #& D8 !$ #) D< !$ #* D@ !$ #+ +M DD !$ #- DH !$ #. DL !$ #/ DP !$ +M #1 DT !$ #2 DX !$ #3 D\ !$ #5 E +M !$ #6 E$ !$ #7 E( !$ #9 E, !$ #: E +M0 !$ #< E4 !$ #= E8 !$ #> E< !$ #@ +M E@ !$ #A ED !$ #B EH !$ #D EL !$ +M #E EP !$ #F ET !$ #H EX !$ #I E\ +M !$ #J F !$ #L F$ !$ #M F( !$ #O F +M, !$ #P F/ !$ #Q F2 !$ #R F5 !$ #T +M F8 !$ #V F< !$ #W F@ !$ #W F@ !98D +M CN !9X@ !:@@ !;H@ +M!L@ !?\@ +M !@@@ !A@@ !BH@ !C0@ +M !D4@ !E@@ !F0@ !G$@ +M !HP@ !J\@ !M0@ +M!O @ !PD@ !RX@ !T@@ +M !U\@ !X(@ !YT@ ![4@ +M !]D@ !_8@ "!0@ ""H@ +M "$@@ "&@@ "'\@ +M")H@ "+H@ ",\@ ".@@ +M "08@ "1P@ "38@ "54@ +M "6T@ "88@ "90@ "B\@ +M "CL@ "LX@ "MD@ +M"N0@ "P@@ "Q<@ "S4@ +M "T,$ FB "TP$ FB "UL& ! O "VID +M FB "WUD FB "XF "ZN "[V +M "^2 "_V #!N +M##F #%. #'6 #)B +M #+6 #-& #.. #/: +M #0Z #1J #6N #7B +M #8* #8V #;: +M#=R #?$D FB #@<@ #AXD G +M #C0D G3 #C\$ G> #D<$ G> #E9D +M G> #FED G> #G6 #I> #JF +M #M" #NF #P> +M#R6 #S^ #V& #X2 +M #Z& #[V #\^ #^* +M #_J $ : $%> $&2 +M $&Z $'F $** +M$,B $-T@ $/$@ $0X@ +M $2 $ G> $21D G> !$ /__ G> $2L% >, +M SN $3(' ;A ! R $3D) 7, !#* $3X% 4. @( $40% +M -^ CN $4H' 5R ! H $5,% #S C' $68% >O C" +M$7() ?/ ! R $7L% *# B] $9() ;T ! T $:D) /Z ! +MV $< ) =/ ! X $=<) 1I ! Z $>X) *N ! \ $?X) A2 +M ! ^ $@X) : !! $AX) !, !!" $BX) "Y !!$ $CX) +M ?& !!( $D<) ;( !!* $E ) >: !!, $ED% 23 C6 +M$FT% =O BI $H$) (# !!. $I4% #/ C1 $J(% .K B +MD $J\) ;= !!0 $KP% 2F G3 $L0) B$ !!2 $MP) 84 +M !!4 $O0) 4C !!6 $PP) 39 !!8 $QT) +V !!: $RX) +M 8F !!< $S\) 1F !!> $U ) <@ !!@ $UH) 5K !!B +M$V0% 3% C, $WD% 1W BX $XX) "E !!D $Z,) 9= !! +MF $[@% 4G CA $\8% 6- BS $]0) A$ !!H $^() &[ +M !!J $_ ) =S !!L $_X) ?" !!N %!<) 3( !!P %# ) +M ?P !!R %#<) +X !!T %$() =$ !!V %%0) ': !!X +M%&8) 2> !!Z %&\) % !"< %6D) >L !# %8,) >Y !# +M" %8L) =& !#$ %9,' *8 ! P %:4) =Q !#& %;0) +3 +M !#( %<,% 9Y G %=8% :) FB %>D' 6@ ! N %?I? +M7T193D%-24, 8W)T,"YO &=D8FUE+F\ 9V-C,E]C;VUP:6QE9"X +VAO;64O +M9VYU+V=D8B]W;W)K+VYE=R]D979O+V=D8G1E65L;&]W +M.C L<'5R<&QE.C$L<&EN:SHR+#L 8V%R3I',S(]87(Q.S [,3LQ, !V7W5N +M3I',S0]87(Q.S [,3LV '9?3I',S@ =E]U;G-I9VYE9%]L +M;VYG7V%R3I'-# ]87(Q +M.S [,3LQ,@!V7V1O=6)L95]A3I'-#$]87(Q.S [,3LQ,P!V7V-H87)? +M<&]I;G1E&ET7V1U;6UY7W)E +M9CI',C$]*C$ 7U]D;U]G;&]B86Q?8W1O&ET7V1U +M;6UY7V1E8VPZ1S$ 7U]#5$]27TQ)4U1?7SI',C$]87(Q.S [,3LQ.0!?7T14 +M3U)?3$E35%]?.D0!?=E]U;G-I9VYE9%]C:&%R7V%R0!?=E]U;G-I9VYE9%]L;VYG %]V7V9L;V%T7W!O:6YT97( +M7W9?0!?=E]C:&%R7V%R0!?=E]S:6=N961?0!?=E]S:&]R=%]A0!?=5]L:6YK %]V7W5N5]D96-L +M %]?7T-43U)?3$E35%]? %]?7T143U)?3$E35%]? %]?7V1O7V=L;V)A;%]C +M=&]R&ET7V1U;6UY7W)E9@ +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +( + +end diff --git a/gdb/testsuite/gdb.base/sparc-elf.u b/gdb/testsuite/gdb.base/sparc-elf.u new file mode 100644 index 00000000000..9320c0f0f3d --- /dev/null +++ b/gdb/testsuite/gdb.base/sparc-elf.u @@ -0,0 +1,336 @@ +begin 777 sparc-elf +M?T5,1@$" 0 " ( ! $/% #0 #;0 T " +M!0 H !< $P 8 T $ - "@ H 4 P +M -0 !$ ! ! - ! #0 3 +M= $W0 % $ $ !.H (3J #L "M < 0 +M @ % P A0, (@ !P O=7-R+VQI8B]L9"YS +M;RXQ %, !H 2P .@ &( W 5 +M 4P %\ !D 4 $ !* 5P #8 +M20 #, M /P %X "4 < 0P !1 +M * !" "0 !; , #$ R 1P $4 +M !. 8 C +@ %@ /0 ( +M $0 !< 2 + !/ !6 +M &< !: 60 &8 .P %T +M +P !E !A +M +M +M (0 +M *@ "D +M 9 'P +M "8 ; !T !H ^ 00 "L U +M 7 "( $P +M $8 X 4@ #0 !- #P +M G %4 !@ > Y 8P +M $ U # ! ! .@ P +M @ 0/< , , $*7 # $ !#M@ +M P !0 0[D , 8 $/" # ' !#Q0 +M P " 1-P , D $3@ # * " +M$Z@ P "P A0 , P (4# # - +M "%)@ P #@ , \ # 0 +M P $0 , !( # +M 3 P % , !4 +M # 6 0 "%)@ ($0 #@ D 1-P !( D / (4 +MH 01 . %@ "%*@ "0$0 #@ !T A4X !!$ X T +M (5/ 01 . .@ "%4 !$0 #@ $@ A5$ !!$ X +M !6 (52 @1 . 7P "%5 ($0 #@ '4 A58 "!$ +M X "* (58 01 . GP "%60 $$0 #@ *< A5H +M!!$ X "T $09 !02 ( R0 !#X@ 4$@ " -4 A5P +M "!$ X #> (5> 01 . Z "%7P "$0 #@ /X +M A5^ A$ X $/ (5@ @1 . !(P !#P@ $@ !P +M 2D A6( A$ X $X $/Q !02 ( !10 "%8P $$0 +M#@ 4T A60 A$ X %: (5F !@1 . !9 "%; 8 +M$0 #@ 6X A7( !!$ X %U (5S 01 . !A "%= +M $$0 #@ 9P 1!0 %!( @ &O (5U 01 . !Q@ " +M%=@ "$0 #@ $$0 #@ E( A7H $!$ X )A $/% +M '02 ( ": "%)0 $0#_\0 F\ 1 H %!( @ *# (5 +M^ @1 . "CP "%@ $$0 #@ I< 1!X &!( @ *D +M $0/ !02 ( "L "%@0 ($0 #@ L, A90 !"$ X +M ++ (6# 01 . "W "%A $$0 #@ O( 0_8 %!( +M @ ,& (6% 01 . #%0 "%A@ $$0 #@ RT 0^P +M%!( @ -" (67 1 /_Q #1P "%AP $$0 #@ UX A8@ +M !!$ X -L (6) $1 . #? "%B@ $$0 #@ XP +M A8L !!$ X .< $3J 1 /_Q #HP "%C ($0 #@ +M [$ A8X !!$ X /& (4 1 /_Q #W !$ 4$@ +M" ^< 0^< %!( @ /Z (6/ 01 . $" "%D ! +M$0 #@ ! \ A9$ !!$ X 0: (62 @1 . $)P "$^0 +M 0$@ !"P A/8 6!( 0S (3\ @2 $.0 " +M%E $$0 #@ !$( A94 !!$ X 1; (66 01 . '9? +M=6YI;VX 7V9I;FD 0!V7W5N0!V7W-I9VYE9%]I;G1?9G5N8P!V7W5N0!E;G9I&ET %]E>&ET %]E +M;G9I._D+ 0( P +M@ !@@ )WCOY"P$" ,( 8'' +MX B!Z G>._D+ 0( P@ !@@ +M )WCOY"P$" ,( 8''X B!Z G>._D+ 0( P@ !@@ )WCOY"P$" ,( 8''X B!Z G>._D+ 0( P +M@ !@@ )WCOY 1 !$P0(CB#" +M &!Q^ (@>@ )WCOY 1 !$P1HCD#" &!Q^ (@>@ )WCOY 1 "%P"HB +M0!$ (62$" !TBHA0!$ (62$" "TBHB)!$ (62$" #TC(AV!$ (62$" $ +MTC(AB!$ (62$" %TC(A?A$ (62$" &TB(A/!$ (62$" 'TB(A:!$ (62 +M$" (TB(AX!$ (62$" )TB(AR!$ (62$" *TB(B(!$ (62$" +TB(AW!$ +M (43 !$U )CF-0B(8P1 "%$P 1-0:8Z#4.B%($0 A1, (74"F) U"HA +MD!$ (43 "%U IA0-0J(=H1 "%$P A=0*8B34*B%\$0 A1, (74$F'8 +MU#(B/!$ (43 "%U!)AB-0R(C@1 "%$P A=0287[4,B(<$0 A1, (74 +M F$\U"(A^!$ (43 "%U )A:-0B(@01 "%$P A=0"8>#4(B%8$0 A1, +M (74 F'(U"(B2!$ (43 "%U )B(-0B(8 1 "%$P A=0"8=S4(B%0$0 +MA1, (74 F&,U"(B,!$ (43 "%U!IA2-0Z(>@1 "%%0 A9(2HD#2(B(4 +M$0 A14 (62$J% TB(B$!$ (45 "%DA*B)-(B(A@1 "%%0 A9(2H=C2 +M(B(H$0 A14 (62$J&(TB(A.!$ (45 "%DA*A?M(B(E01 "%%0 A9(2 +MH3S2(B%$$0 A14 (62$J%HTB(A8!$ (45 "%DA*AX-(B(=01 "%%0 +MA9(2H!$ (62$" !TB(A9!$ (43 "%U )@H-0B +M(*@1 "%$P A=028)C4,B%P@P L 0 %0 # (3J ( D +M % < 7 $.Y < 0[8 " # ) # +M ! $ /_Q ! +M -0 P 0 0#H , ( $#W # # +M !"EP P ! 0[8 , 4 $.Y # & +M !#P@ P !P 0\4 , @ $3< # +M ) !$X P "@ A.H , L (4 +M # , "% P P #0 A28 , X +M # / P $ , !$ +M # 2 P $P , !0 +M # 5 P %@ < 0 +M__$ . $ /_Q &@ ! #_\0 "( +M 0 __$ I (4F @1 . ,0 !$W $@ "0 #< A2@ +M !!$ X ^ (4J ) 1 . 10 "%3@ $$0 #@ %P +M A4\ !!$ X !B (50 $1 . < "%40 $$0 #@ +M 'X A5( "!$ X "' (54 @1 . G0 "%5@ ($0 +M#@ +( A5@ !!$ X #' (59 01 . SP "%6@ $ +M$0 #@ -P 1!D %!( @ #Q $/B !02 ( _0 "%7 +M ($0 #@ 08 A5X !!$ X $0 (5? (1 . !)@ " +M%7X "$0 #@ 3< A6 "!$ X %+ $/" 2 ' ! +M40 "%8@ "$0 #@ 6 0_$ %!( @ %M (5C 01 . +M !=0 "%9 "$0 #@ 8( A68 &!$ X &, (5L !@1 +M . !E@ "%<@ $$0 #@ 9T A7, !!$ X &L (5T +M 01 . !Q !$% 4$@ " =< A74 !!$ X 'N (5 +MV (1 . !]@ !#^P 4$@ " @P A0, !$ __$ (5 +M $0J L@2 ( "&@ !$X $$0 "@ B< 1"0 &!( @ +M (U (5V@ (1 . "20 !$!0 4$@ " EL A7< !!$ +M X )K (5X 01 . ">@ "%>@ 0$0 #@ HD 0\4 +M=!( @ *0 (4E 1 /_Q "EP !$"@ 4$@ " JL A7X +M "!$ X *W (6 01 . "OP !$'@ 8$@ " LP +M 1 \ %!( @ +8 (6! @1 . "ZP "%E $(0 #@ +M O, A8, !!$ X ,$ (6$ 01 . #&@ !#]@ 4$@ +M" RX A84 !!$ X ,] (6& 01 . #50 !#[ 4 +M$@ " VH A9< !$ __$ -O (6' 01 . #A@ "%B +M $$0 #@ Y0 A8D 1$ X .D (6* 01 . #M " +M%BP $$0 #@ \0 1.H !$ __$ /+ (6, @1 . # +MV0 "%C@ $$0 #@ ^X A0 !$ __$ 0$ $0 !02 ( +M $#P !#YP 4$@ " !"( A8\ !!$ X 0P (60 $1 +M . $-P "%D0 $$0 #@ !$( A9( "!$ X 1/ (3Y +M ! 2 $5 "$]@ !8$@ !%L A/P "!( 1A (6 +M4 01 . $:@ "%E0 $$0 #@ !(, A98 !!$ X 9V1B +M;64 8W)T:2YS '9A;'5E0!V7W5N0!V7W-I +M9VYE9%]I;G1?9G5N8P!V7W5N0!E;G9I&ET %]E>&ET %]E;G9I7-I9FEX+W5S65L;&]W +M.C L<'5R<&QE.C$L<&EN:SHR+#L 8V%R3I',S(]87(Q.S [,3LQ, !V7W5N +M3I',S0]87(Q.S [,3LV '9?3I',S@ =E]U;G-I9VYE9%]L +M;VYG7V%R3I'-# ]87(Q +M.S [,3LQ,@!V7V1O=6)L95]A3I'-#$]87(Q.S [,3LQ,P!V7V-H87)? +M<&]I;G1E6YS>6T +F1Y;G-T<@ N6YA +M;6EC "YB N6=N +M=7,M,BXP+C( &%S.B!#($1E=F5L;W!M96YT(%-E=" @*$-$4RD@4U!!4D-O +M;7!I;&5R E& +M N,D $/B !$ !Y !$ !Y ! !$ !Y +M # O(D $/G !$ !Z !$ !Z ! !$ +M !Z # PDD $/L !$ ![ !$ ![ ! +M !$ ![ # R(D $/Q !$ !] !$ !] +M! !$ !] # S(D $/V !$ !^ !$ !^ +M ! !$ !^ # TDD $/[ !$ !_ !$ +M !_ ! !$ !_ # V(D $0 !$ "! +M !$ "! ! !$ "! # W D $0% !$ "" +M !$ "" ! !$ "" # X4D $0* !$ "# +M !$ "# ! !$ "# # YPD $0/ !$ +M "% !$ "% ! !$ "% # ZLD $04 +M !$ "& !$ "& ! !$ "& # \$D $0 +M9 !$ "' !$ "' ! !$ "' # ]DD +M $0> !$ ") !$ ") ! !$ ") $ ^HD +M $0D !$ "* !$ "* ! !$ "* $ +M _R !&B !*B !,^ +M !.N !0F !26 !3* +M !5\D $0J !$ "R !$ "U ! !$ +M "V # !$ "W & !$ "Y ) !$ "Z , +M !$ "[ / !$ "] 2 !$ "^ 5 !$ "_ +M8 !$ #! ; !$ #" > !$ ## A !$ #% +M D !$ #& H !$ #) L !$ #* P !$ +M #+ T !$ #- X !$ #. \ !$ #/ ! +M !$ #1 !$ !$ #2 !( !$ #3 !, !$ #5 ! +M0 !$ #6 !4 !$ #7 !8 !$ #9 !< !$ #: +M !@ !$ #< !D !$ #= !H !$ #> !L !$ +M #@ !P !$ #A !T !$ #B !X !$ #D !\ +M !$ #E " !$ #F "$ !$ #H "( !$ #I " +M, !$ #J "0 !$ #L "4 !$ #M "8 !$ #O +M "< !$ #P "? !$ #Q "B !$ #R "E !$ +M #T "H !$ #V "L !$ #W "P !$ #W "P +M!6<@ !7$@ !8,@ !9<@ +M !:(@ !;0@ !<@@ !=$@ +M !>$@ !?,@ !?T@ !@X@ +M !B$@ !BT@ !CH@ +M!E4@ !G@@ !IT@ !KD@ +M !M(@ !O<@ !Q$@ !R@@ +M !TL@ !V8@ !WX@ !Z(@ +M ![\@ !]T@ !_,@ +M"!$@ "#$@ "$@@ "&,@ +M "(,@ ")@@ "+$@ ",\@ +M ".4@ "/\@ "1X@ "38@ +M "4\@ "5T@ "?@@ +M"@0@ "I<@ "J(@ "JT@ +M "M$@ "N @ "OX@ +M ! 0 ( +M 0#4 U !$ $ "0 4 " $ Z +M .@ +T P $ ! \ + @ ! ]P /< & +M@ 0 7 ! ! 7 P ( 0I< *7 !'L +M $ 'P 0 " $.V #M@ , P X +M $ # "D $ @ !#N0 [D ) , + ! +M P S 0 8 0\( /" P 0 +M.0 $ & $/% #Q0 1< $ #\ ! +M !@ !$W !-P # ! !% 0 ( +M 1. 3@ "@ @ 30 $ ' (3J +M$Z@ !8 $ ! %( ! P "% !0 +M# ! 0 !7 !@ , A0, 4# (@ $ +M 0 ( 8 @ # (4F %)@ '$ +M ( &4 " !28 &T ! < ! +M ! !M P ;: !)D $ +M=0 , ( $ ") ! (0 # +M ""* +# 0 "- P +M KE@ +( $ EP $ +M+$@ %) ! * ! "V4 +M8 ! P "L 0 M] "-P +, 0 , + +end diff --git a/gdb/testsuite/gdb.base/ss.h b/gdb/testsuite/gdb.base/ss.h new file mode 100644 index 00000000000..2a4c162dcd6 --- /dev/null +++ b/gdb/testsuite/gdb.base/ss.h @@ -0,0 +1,4 @@ +struct s { + int a; + int b; +}; diff --git a/gdb/testsuite/gdb.base/step-test.c b/gdb/testsuite/gdb.base/step-test.c new file mode 100644 index 00000000000..7130725400e --- /dev/null +++ b/gdb/testsuite/gdb.base/step-test.c @@ -0,0 +1,58 @@ +/* Test various kinds of stepping. +*/ +int glob = 0; + +int callee() { + glob++; +} + +/* A structure which, we hope, will need to be passed using memcpy. */ +struct rhomboidal { + int rather_large[100]; +}; + +void +large_struct_by_value (struct rhomboidal r) +{ + glob += r.rather_large[42]; /* step-test.exp: arrive here 1 */ +} + +int main () { + int w,x,y,z; + int a[10], b[10]; + + /* Test "next" and "step" */ + w = 0; + x = 1; + y = 2; + z = 3; + w = w + 2; + x = x + 3; + y = y + 4; + z = z + 5; + + /* Test that "next" goes over a call */ + callee(); /* OVER */ + + /* Test that "step" doesn't */ + callee(); /* INTO */ + + /* Test "stepi" */ + a[5] = a[3] - a[4]; + callee(); /* STEPI */ + + /* Test "nexti" */ + callee(); /* NEXTI */ + + y = w + z; + + { + struct rhomboidal r; + memset (r.rather_large, 0, sizeof (r.rather_large)); + r.rather_large[42] = 10; + large_struct_by_value (r); /* step-test.exp: large struct by value */ + } + + exit (0); +} + diff --git a/gdb/testsuite/gdb.base/step-test.exp b/gdb/testsuite/gdb.base/step-test.exp new file mode 100644 index 00000000000..415714d81e4 --- /dev/null +++ b/gdb/testsuite/gdb.base/step-test.exp @@ -0,0 +1,153 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# use this to debug: +# +#log_user 1 + +# step-test.exp -- Expect script to test stepping in gdb + +if $tracelevel then { + strace $tracelevel +} + +set testfile step-test +set srcfile ${srcdir}/${subdir}/${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +remote_exec build "rm -f ${binfile}" +if { [gdb_compile "${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + fail "Can't run to main" + return 0 +} + +# Vanilla step/next +# +gdb_test "next" ".*${decimal}.*x = 1;.*" "next 1" +gdb_test "step" ".*${decimal}.*y = 2;.*" "step 1" + +# With count +# +gdb_test "next 2" ".*${decimal}.*w = w.*2;.*" "next 2" +gdb_test "step 3" ".*${decimal}.*z = z.*5;.*" "step 3" +gdb_test "next" ".*${decimal}.*callee.*OVER.*" "next 3" + +# Step over call +# +gdb_test "next" ".*${decimal}.*callee.*INTO.*" "next over" + +# Step into call +# +gdb_test "step" ".*${decimal}.*glob.*" "step into" + +# Step out of call +# +# I wonder if this is really portable. Are there any caller-saves +# platforms, on which `finish' will return you to some kind of pop +# instruction, which is attributed to the line containing the function +# call? +gdb_test "finish" ".*${decimal}.*a.*5.*= a.*3.*" "step out" + +### Testing nexti and stepi. +### +### test_i NAME COMMAND HERE THERE +### +### Send COMMAND to gdb over and over, while the output matches the +### regexp HERE, followed by the gdb prompt. Pass if the output +### eventually matches the regexp THERE, followed by the gdb prompt; +### fail if we have to iterate more than a hundred times, we time out +### talking to gdb, or we get output which is neither HERE nor THERE. :) +### +### Use NAME as the name of the test. +### +### The exact regexps used are "$HERE.*$gdb_prompt $" +### and "$THERE.*$gdb_prompt $" +### +proc test_i {name command here there} { + global gdb_prompt + + set i 0 + while 1 { + send_gdb "${command}\n" + gdb_expect { + -re "$here.*$gdb_prompt $" { + # Okay, we're still on the same line. Just step again. + } + -re "$there.*$gdb_prompt $" { + # We've reached the next line. Rah. + pass "$name" + return + } + -re "$gdb_prompt $" { + # We got something else. Fail. + fail "$name" + return + } + timeout { + fail "$name (timeout)" + return + } + } + + # Have we gone for too many steps without seeing any progress? + if {[incr i] >= 100} { + fail "$name (no progress after 100 steps)" + return + } + } +} + +test_i "stepi to next line" "stepi" \ + ".*${decimal}.*a.*5.* = a.*3" \ + ".*${decimal}.*callee.*STEPI" +test_i "stepi into function" "stepi" \ + ".*${decimal}.*callee.*STEPI" \ + ".*callee \\(\\) at .*step-test\\.c" +gdb_test "finish" ".*${decimal}.*callee.*NEXTI.*" "stepi: finish call" +test_i "nexti over function" "nexti" \ + ".*${decimal}.*callee.*NEXTI" \ + ".*${decimal}.*y = w \\+ z;" + +# On some platforms, if we try to step into a function call that +# passes a large structure by value, then we actually end up stepping +# into memcpy, bcopy, or some such --- GCC emits the call to pass the +# argument. Opinion is bitterly divided about whether this is the +# right behavior for GDB or not, but we'll catch it here, so folks +# won't forget about it. + +send_gdb "break [gdb_get_line_number "step-test.exp: large struct by value"]\n" +gdb_test "continue" \ + ".*Breakpoint ${decimal},.*large_struct_by_value.*" \ + "run to pass large struct" +gdb_test "step" \ + ".*step-test.exp: arrive here 1.*" \ + "large struct by value" + +gdb_test "continue" ".*Program exited normally.*" "run to finish" + +return 0 diff --git a/gdb/testsuite/gdb.base/structs2.c b/gdb/testsuite/gdb.base/structs2.c new file mode 100644 index 00000000000..f9f59e91421 --- /dev/null +++ b/gdb/testsuite/gdb.base/structs2.c @@ -0,0 +1,38 @@ +/* pr 13536 */ + +static void param_reg (register char pr_char, + register unsigned char pr_uchar, + register short pr_short, + register unsigned short pr_ushort); + +int bkpt; + +int +main () +{ +#ifdef usestubs + set_debug_traps (); + breakpoint (); +#endif + + bkpt = 0; + param_reg (120, 130, 32000, 33000); + param_reg (130, 120, 33000, 32000); + + return 0; +} + +static void dummy () {} + +static void +param_reg(register char pr_char, + register unsigned char pr_uchar, + register short pr_short, + register unsigned short pr_ushort) +{ + bkpt = 1; + dummy (); + pr_char = 1; + pr_uchar = pr_short = pr_ushort = 1; + dummy (); +} diff --git a/gdb/testsuite/gdb.base/structs2.exp b/gdb/testsuite/gdb.base/structs2.exp new file mode 100644 index 00000000000..14652bef06c --- /dev/null +++ b/gdb/testsuite/gdb.base/structs2.exp @@ -0,0 +1,79 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set prototypes 1 +set testfile "structs2" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +# build the first test case +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + # built the second test case since we can't use prototypes + warning "Prototypes not supported, rebuilding with -DNO_PROTOTYPES" + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DNO_PROTOTYPES}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + set prototypes 0 +} + +# Start with a fresh gdb. + +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +gdb_test "set width 0" "" "" + +if { ![runto_main] } then { + gdb_suppress_tests +} + +# Ok, we're finally ready to actually do our tests. + +set prms_id 13536 +set bug_id 0 + +gdb_test "f" \ + ".*bkpt = 0.*" \ + "structs2 sanity check" + +gdb_test "break param_reg" \ + "Breakpoint .* at .*" \ + "structs2 breakpoint set" + +gdb_test "continue" \ + ".*pr_char=120.*pr_uchar=130.*pr_short=32000.*pr_ushort=33000.*bkpt = 1.*" \ + "structs2 continue1" + +gdb_test "continue" \ + ".*pr_char=-126.*pr_uchar=120.*pr_short=-32536.*pr_ushort=32000.*bkpt = 1.*" \ + "structs2 continue2" + +# End of tests. + +gdb_stop_suppressing_tests + +return 0 diff --git a/gdb/testsuite/gdb.base/term.exp b/gdb/testsuite/gdb.base/term.exp new file mode 100644 index 00000000000..211a94c1120 --- /dev/null +++ b/gdb/testsuite/gdb.base/term.exp @@ -0,0 +1,73 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +# This only works for native, I think. +if ![isnative] then { + continue +} + +gdb_start + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "run" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +delete_breakpoints +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +gdb_test "set print sevenbit-strings" "" "test set print sevenbit-strings" +gdb_test "set print address off" "" "test set print address off" +gdb_test "set width 0" "" "test set width 0" +gdb_test "info terminal" "No saved terminal information.*" "test info terminal" +gdb_run_cmd 5 +gdb_expect { + -re ".*120.*Program exited normally.*$gdb_prompt $" { + gdb_test "info terminal" "No saved terminal information.*" "test info terminal #2" + } + default { + fail "term.exp, factorial didn't run to completion for info terminal" + } +} + +# In mid-execution +gdb_breakpoint main +gdb_run_cmd 5 +gdb_expect { + -re ".*Breakpoint \[0-9\]+,.*main.*if .argc != 2.*$gdb_prompt $" { + gdb_test "info terminal" "Inferior's terminal status .currently saved by GDB.:.*" "info terminal at breakpoint" + } + -re ".*$gdb_prompt $" { fail "info terminal at breakpoint" } + timeout { fail "(timeout) info terminal at breakpoint" } +} diff --git a/gdb/testsuite/gdb.base/twice.c b/gdb/testsuite/gdb.base/twice.c new file mode 100644 index 00000000000..c50a2b362d7 --- /dev/null +++ b/gdb/testsuite/gdb.base/twice.c @@ -0,0 +1,19 @@ +int nothing () + +{ + int x = 3 ; + return x ; +} + + +main () + +{ + int y ; +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + y = nothing () ; + printf ("hello\n") ; +} diff --git a/gdb/testsuite/gdb.base/twice.exp b/gdb/testsuite/gdb.base/twice.exp new file mode 100644 index 00000000000..8d8c403a7ca --- /dev/null +++ b/gdb/testsuite/gdb.base/twice.exp @@ -0,0 +1,63 @@ +# Copyright (C) 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile twice-tmp +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +set options debug +lappend options "additional_flags=-I." + +set fileid [open ${objdir}/${subdir}/${srcfile} w]; +puts $fileid "#include \"twice.c\""; +close $fileid; + +remote_download host ${srcdir}/${subdir}/twice.c twice.c + +if { [gdb_compile "${objdir}/${subdir}/${srcfile}" "${binfile}" executable $options] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile + +if [runto_main] then { + # Test that GDB can still detect whether we have line numbers + # even if we're executing code in an include file. + + # The bug was fixed by + #Tue Jun 29 11:02:58 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + # + # * infrun.c (wait_for_inferior): Use find_pc_line not + # find_pc_symtab to check whether there is line number + # information. + + gdb_test "step" "nothing \\(\\) at.*" +} +return 0 diff --git a/gdb/testsuite/gdb.base/varargs.c b/gdb/testsuite/gdb.base/varargs.c new file mode 100644 index 00000000000..729d7df5bea --- /dev/null +++ b/gdb/testsuite/gdb.base/varargs.c @@ -0,0 +1,108 @@ +/* varargs.c - + * (Added as part of fix for bug 15306 - "call" to varargs functions fails) + * This program is intended to let me try out "call" to varargs functions + * with varying numbers of declared args and various argument types. + * - RT 9/27/95 + */ + +#include +#include + +int find_max1(int, ...); +int find_max2(int, int, ...); +double find_max_double(int, double, ...); + +char ch; +unsigned char uc; +short s; +unsigned short us; +int a,b,c,d; +int max_val; +float fa,fb,fc,fd; +double da,db,dc,dd; +double dmax_val; + +main() { + c = -1; + uc = 1; + s = -2; + us = 2; + a = 1; + b = 60; + max_val = find_max1(1, 60); + max_val = find_max1(a, b); + a = 3; + b = 1; + c = 4; + d = 2; + max_val = find_max1(3, 1, 4, 2); + max_val = find_max2(a, b, c, d); + da = 3.0; + db = 1.0; + dc = 4.0; + dd = 2.0; + dmax_val = find_max_double(3, 1.0, 4.0, 2.0); + dmax_val = find_max_double(a, db, dc, dd); +} + +/* Integer varargs, 1 declared arg */ + +int find_max1(int num_vals, ...) { + int max_val = 0; + int x; + int i; + va_list argp; + va_start(argp, num_vals); + printf("find_max(%d,", num_vals); + for (i = 0; i < num_vals; i++) { + x = va_arg(argp, int); + if (max_val < x) max_val = x; + if (i < num_vals - 1) + printf(" %d,", x); + else + printf(" %d)", x); + } + printf(" returns %d\n", max_val); + return max_val; +} + +/* Integer varargs, 2 declared args */ + +int find_max2(int num_vals, int first_val, ...) { + int max_val = 0; + int x; + int i; + va_list argp; + va_start(argp, first_val); + x = first_val; + if (max_val < x) max_val = x; + printf("find_max(%d, %d", num_vals, first_val); + for (i = 1; i < num_vals; i++) { + x = va_arg(argp, int); + if (max_val < x) max_val = x; + printf(", %d", x); + } + printf(") returns %d\n", max_val); + return max_val; +} + +/* Double-float varargs, 2 declared args */ + +double find_max_double(int num_vals, double first_val, ...) { + double max_val = 0; + double x; + int i; + va_list argp; + va_start(argp, first_val); + x = first_val; + if (max_val < x) max_val = x; + printf("find_max(%f, %f", num_vals, first_val); + for (i = 1; i < num_vals; i++) { + x = va_arg(argp, double); + if (max_val < x) max_val = x; + printf(", %f", x); + } + printf(") returns %f\n", max_val); + return max_val; +} + diff --git a/gdb/testsuite/gdb.base/varargs.exp b/gdb/testsuite/gdb.base/varargs.exp new file mode 100644 index 00000000000..e6548b288f5 --- /dev/null +++ b/gdb/testsuite/gdb.base/varargs.exp @@ -0,0 +1,139 @@ +# Copyright (C) 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + + +# this file tests command line calls with functions having variable +# args list +# corresponding source file: varargs.c + +#print find_max1(5,1,2,3,4,5) +#print find_max1(1,3) +#call find_max1(10,1,2,3,4,5,6,7,8,29,0) +#print find_max2(3,1,2,3) +#print find_max_double(5,1.0,17.0,2.0,3.0,4.0) +#quit + + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set prototypes 0 +set testfile "varargs" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile}] { + return -1 +} + +if {$gcc_compiled == 0} { + if [istarget "hppa*-hp-hpux*"] then { + set additional_flags "additional_flags=-Ae" + } else { + # don't know what the compiler is, hope for the best, maybe it's ANSI... + set additional_flags "" + } +} else { + set additional_flags "" +} + +# build the first test case +#if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } { +# gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +#} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $" +send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $" + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + + +send_gdb "print find_max1(5,1,2,3,4,5)\n" +gdb_expect { + -re ".*find_max\\(5, 1, 2, 3, 4, 5\\) returns 5\[ \r\n\]+.\[0-9\]+ = 5.*$gdb_prompt $" { + pass "print find_max1(5,1,2,3,4,5)" + } + -re ".*$gdb_prompt $" { fail "print find_max1(5,1,2,3,4,5)" } + timeout { fail "(timeout) print find_max1(5,1,2,3,4,5)" } + } + + + + +send_gdb "print find_max1(1,3)\n" +gdb_expect { + -re ".*find_max\\(1, 3\\) returns 3\[ \r\n\]+.\[0-9\]+ = 3.*$gdb_prompt $" { + pass "print find_max1(1,3)" + } + -re ".*$gdb_prompt $" { fail "print find_max1(1,3)" } + timeout { fail "(timeout) print find_max1(1,3)" } + } + + +send_gdb "print find_max1(10,1,2,3,4,5,6,7,8,29,0)\n" +gdb_expect { + -re ".*find_max\\(10, 1, 2, 3, 4, 5, 6, 7, 8, 29, 0\\) returns 29\[ \r\n\]+.\[0-9\]+ = 29.*$gdb_prompt $" { + pass "print find_max1(10,1,2,3,4,5,6,7,8,29,0)" + } + -re ".*$gdb_prompt $" { fail "print find_max1(10,1,2,3,4,5,6,7,8,29,0)" } + timeout { fail "(timeout) print find_max1(10,1,2,3,4,5,6,7,8,29,0)" } + } + + + +send_gdb "print find_max2(3,1,2,3)\n" +gdb_expect { + -re ".*find_max\\(3, 1, 2, 3\\) returns 3\[ \r\n\]+.\[0-9\]+ = 3.*$gdb_prompt $" { + pass "print find_max2(3,1,2,3)" + } + -re ".*$gdb_prompt $" { fail "print find_max2(3,1,2,3)" } + timeout { fail "(timeout) print find_max2(3,1,2,3)" } + } + + +send_gdb "print find_max_double(5,1.0,17.0,2.0,3.0,4.0)\n" +gdb_expect { + -re ".*find_max\\(.*\\) returns 17\\.000000\[ \r\n\]+.\[0-9\]+ = 17.*$gdb_prompt $" { + pass "print find_max_double(5,1.0,17.0,2.0,3.0,4.0)" + } + -re ".*$gdb_prompt $" { fail "print find_max_double(5,1.0,17.0,2.0,3.0,4.0)" } + timeout { fail "(timeout) print find_max_double(5,1.0,17.0,2.0,3.0,4.0)" } + } + diff --git a/gdb/testsuite/gdb.base/volatile.exp b/gdb/testsuite/gdb.base/volatile.exp new file mode 100644 index 00000000000..a2a2b59f5f6 --- /dev/null +++ b/gdb/testsuite/gdb.base/volatile.exp @@ -0,0 +1,243 @@ +# Copyright (C) 1997, 1998, 1999 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# Written by Satish Pai 1997-07-07 +# In the spirit of constvars.exp: added volatile, const-volatile stuff. + +# This file is part of the gdb testsuite +# Tests for: +# volatile vars +# pointers to volatile vars +# const volatile vars +# pointers to const volatile vars +# const pointers to volatile vars +# volatile pointers to const vars +# const volatile pointers to const vars +# const volatile pointers to volatile vars +# ... etc. (you get the idea) +# Mostly with char and unsigned char. + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +# Use the same test program constvars.c. + +set testfile "constvars" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +remote_exec build "rm -f ${binfile}.ci" +if [get_compiler_info ${binfile}] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +source ${binfile}.ci + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "break marker1\n" ; gdb_expect -re ".*$gdb_prompt $" + + send_gdb "cont\n" + gdb_expect { + -re "Break.* marker1 \\(\\) at .*:$decimal.*$gdb_prompt $" { + send_gdb "up\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "up from marker1" } + } + } + -re "Break.* marker1__.* \\(\\) at .*:$decimal.*$gdb_prompt $" { + fail "continue to marker1 (demangling)" + send_gdb "up\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "up from marker1" } + } + } + -re "$gdb_prompt $" { fail "continue to marker1" } + timeout { fail "(timeout) continue to marker1" } + } + +# As of Feb 1999, GCC does not issue info about volatility of vars, so +# these tests are all expected to fail if GCC is the compiler. -sts + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vox" "type = volatile char" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype victuals" "type = volatile unsigned char" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vixen" "type = volatile short" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vitriol" "type = volatile unsigned short" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vellum" "type = volatile long" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype valve" "type = volatile unsigned long" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vacuity" "type = volatile float" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vertigo" "type = volatile double" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vampire" "type = volatile char *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype viper" "type = volatile unsigned char *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vigour" "type = volatile short *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vapour" "type = volatile unsigned short *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype ventricle" "type = volatile long *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vigintillion" "type = volatile unsigned long *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vocation" "type = volatile float *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype veracity" "type = volatile double *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vapidity" "type = volatile char * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype velocity" "type = volatile unsigned char * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype veneer" "type = volatile short * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype video" "type = volatile unsigned short * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vacuum" "type = volatile long * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype veniality" "type = volatile unsigned long * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vitality" "type = volatile float * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype voracity" "type = volatile double * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype victor" "type = const volatile char" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vicar" "type = const volatile unsigned char" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype victory" "type = const volatile char *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vicarage" "type = const volatile unsigned char *" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vein" "type = volatile char * const" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vogue" "type = volatile unsigned char * const" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype cavern" "type = const volatile char * const" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype coverlet" "type = const volatile unsigned char * const" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype caveat" "type = const char * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype covenant" "type = const unsigned char * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vizier" "type = const volatile char * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vanadium" "type = const volatile unsigned char * volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vane" "type = char * const volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype veldt" "type = unsigned char * const volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype cove" "type = const char * const volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype cavity" "type = const unsigned char * const volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vagus" "type = volatile char * const volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vagrancy" "type = volatile unsigned char * const volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vagary" "type = const volatile char * const volatile" + +if {$gcc_compiled} then { setup_xfail "*-*-*" } +gdb_test "ptype vendor" "type = const volatile unsigned char * const volatile" + +# test function parameters +if {$gcc_compiled} then { setup_xfail "*-*-*" } +send_gdb "ptype qux2\n" +gdb_expect { + -re "type = int \\(volatile unsigned char, const volatile int, volatile short &, volatile long \\*, float \\* volatile, const volatile signed char \\* const volatile\\)" { + pass "ptype qux2" + } + -re ".*$gdb_prompt $" { fail "ptype qux2" } + timeout { fail "(timeout) ptype qux2" } + } diff --git a/gdb/testsuite/gdb.base/watchpoint.c b/gdb/testsuite/gdb.base/watchpoint.c new file mode 100644 index 00000000000..bd54f3e9621 --- /dev/null +++ b/gdb/testsuite/gdb.base/watchpoint.c @@ -0,0 +1,124 @@ +#include +/* + * Since using watchpoints can be very slow, we have to take some pains to + * ensure that we don't run too long with them enabled or we run the risk + * of having the test timeout. To help avoid this, we insert some marker + * functions in the execution stream so we can set breakpoints at known + * locations, without worrying about invalidating line numbers by changing + * this file. We use null bodied functions are markers since gdb does + * not support breakpoints at labeled text points at this time. + * + * One place we need is a marker for when we start executing our tests + * instructions rather than any process startup code, so we insert one + * right after entering main(). Another is right before we finish, before + * we start executing any process termination code. + * + * Another problem we have to guard against, at least for the test + * suite, is that we need to ensure that the line that causes the + * watchpoint to be hit is still the current line when gdb notices + * the hit. Depending upon the specific code generated by the compiler, + * the instruction after the one that triggers the hit may be part of + * the same line or part of the next line. Thus we ensure that there + * are always some instructions to execute on the same line after the + * code that should trigger the hit. + */ + +int count = -1; +int ival1 = -1; +int ival2 = -1; +int ival3 = -1; +int ival4 = -1; +char buf[10]; +struct foo +{ + int val; +}; +struct foo struct1, struct2, *ptr1, *ptr2; + +int doread = 0; + +void marker1 () +{ +} + +void marker2 () +{ +} + +void marker4 () +{ +} + +void marker5 () +{ +} + +void +func2 () +{ +} + +int +func1 () +{ + /* The point of this is that we will set a breakpoint at this call. + + Then, if DECR_PC_AFTER_BREAK equals the size of a function call + instruction (true on a sun3 if this is gcc-compiled--FIXME we + should use asm() to make it work for any compiler, present or + future), then we will end up branching to the location just after + the breakpoint. And we better not confuse that with hitting the + breakpoint. */ + func2 (); + return 73; +} + +int main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + struct1.val = 1; + struct2.val = 2; + ptr1 = &struct1; + ptr2 = &struct2; + marker1 (); + func1 (); + for (count = 0; count < 4; count++) { + ival1 = count; + ival3 = count; ival4 = count; + } + ival1 = count; /* Outside loop */ + ival2 = count; + ival3 = count; ival4 = count; + marker2 (); + if (doread) + { + static char msg[] = "type stuff for buf now:"; + write (1, msg, sizeof (msg) - 1); + read (0, &buf[0], 5); + } + marker4 (); + + /* We have a watchpoint on ptr1->val. It should be triggered if + ptr1's value changes. */ + ptr1 = ptr2; + + /* This should not trigger the watchpoint. If it does, then we + used the wrong value chain to re-insert the watchpoints or we + are not evaluating the watchpoint expression correctly. */ + struct1.val = 5; + marker5 (); + + /* We have a watchpoint on ptr1->val. It should be triggered if + ptr1's value changes. */ + ptr1 = ptr2; + + /* This should not trigger the watchpoint. If it does, then we + used the wrong value chain to re-insert the watchpoints or we + are not evaluating the watchpoint expression correctly. */ + struct1.val = 5; + marker5 (); + return 0; +} diff --git a/gdb/testsuite/gdb.base/watchpoint.exp b/gdb/testsuite/gdb.base/watchpoint.exp new file mode 100644 index 00000000000..a2954452cd1 --- /dev/null +++ b/gdb/testsuite/gdb.base/watchpoint.exp @@ -0,0 +1,583 @@ +# Copyright (C) 1992, 1994, 1997, 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "watchpoint" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + + +if [get_compiler_info ${binfile}] { + return -1 +} + +# if we are on HPUX and we are not compiled with gcc, then skip these tests. + +if [istarget hppa*-*-hpux*] { + if {!$gcc_compiled} { + continue + } +} + + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Prepare for watchpoint tests by setting up two breakpoints and one +# watchpoint. +# +# We use breakpoints at marker functions to get past all the startup code, +# so we can get to the watchpoints in a reasonable amount of time from a +# known starting point. +# +# For simplicity, so we always know how to reference specific breakpoints or +# watchpoints by number, we expect a particular ordering and numbering of +# each in the combined breakpoint/watchpoint table, as follows: +# +# Number What Where +# 1 Breakpoint marker1() +# 2 Breakpoint marker2() +# 3 Watchpoint ival3 + +proc initialize {} { + global gdb_prompt + global hex + global decimal + global srcfile + + if [gdb_test "break marker1" "Breakpoint 1 at $hex: file .*$srcfile, line $decimal.*" "set breakpoint at marker1" ] { + return 0; + } + + + if [gdb_test "break marker2" "Breakpoint 2 at $hex: file .*$srcfile, line $decimal.*" "set breakpoint at marker2" ] { + return 0; + } + + + if [gdb_test "info break" "1\[ \]*breakpoint.*marker1.*\r\n2\[ \]*breakpoint.*marker2.*" "info break in watchpoint.exp" ] { + return 0; + } + + + if [gdb_test "watch ival3" ".*\[Ww\]atchpoint 3: ival3" "set watchpoint on ival3" ] { + return 0; + } + + + # "info watch" is the same as "info break" + + if [gdb_test "info watch" "1\[ \]*breakpoint.*marker1.*\r\n2\[ \]*breakpoint.*marker2.*\r\n3\[ \]*.*watchpoint.*ival3" "watchpoint found in watchpoint/breakpoint table" ] { + return 0; + } + + + # After installing the watchpoint, we disable it until we are ready + # to use it. This allows the test program to run at full speed until + # we get to the first marker function. + + if [gdb_test "disable 3" "disable 3\[\r\n\]+" "disable watchpoint" ] { + return 0; + } + + + return 1 +} + +# +# Test simple watchpoint. +# + +proc test_simple_watchpoint {} { + global gdb_prompt + global hex + global decimal + + # Ensure that the watchpoint is disabled when we startup. + + if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "disable watchpoint in test_simple_watchpoint" ] { + return 0; + } + + + # Run until we get to the first marker function. + + gdb_run_cmd + set timeout 600 + gdb_expect { + -re "Breakpoint 1, marker1 .*$gdb_prompt $" { + pass "run to marker1 in test_simple_watchpoint" + } + -re ".*$gdb_prompt $" { + fail "run to marker1 in test_simple_watchpoint" + return + } + timeout { + fail "run to marker1 in test_simple_watchpoint (timeout)" + return + } + } + + # After reaching the marker function, enable the watchpoint. + + if [gdb_test "enable 3" "^enable 3\[\r\n\]+" "enable watchpoint" ] { + return ; + } + + + gdb_test "break func1" "Breakpoint.*at.*" + gdb_test "set \$func1_breakpoint_number = \$bpnum" "" + + gdb_test "continue" "Continuing.*Breakpoint \[0-9\]*, func1.*" \ + "continue to breakpoint at func1" + + # Continue until the first change, from -1 to 0 + + send_gdb "cont\n" + gdb_expect { + -re "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = -1.*New value = 0.*ival3 = count; ival4 = count;.*$gdb_prompt $" { + pass "watchpoint hit, first time" + } + -re "Continuing.*Breakpoint.*func1.*$gdb_prompt $" { + setup_xfail "m68*-*-*" 2597 + fail "thought it hit breakpoint at func1 twice" + gdb_test "delete \$func1_breakpoint_number" "" + gdb_test "continue" "\ +Continuing.*\[Ww\]atchpoint.*ival3.*Old value = -1.*New value = 0.*ival3 = count;" \ + "watchpoint hit, first time" + } + -re ".*$gdb_prompt $" { fail "watchpoint hit, first time" ; return } + timeout { fail "watchpoint hit, first time (timeout)" ; return } + eof { fail "watchpoint hit, first time (eof)" ; return } + } + + gdb_test "delete \$func1_breakpoint_number" "" + + # Continue until the next change, from 0 to 1. + gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 0.*New value = 1.*ival3 = count; ival4 = count;.*" "watchpoint hit, second time" + + # Continue until the next change, from 1 to 2. + gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 1.*New value = 2.*ival3 = count; ival4 = count;.*" "watchpoint hit, third time" + + # Continue until the next change, from 2 to 3. + gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 2.*New value = 3.*ival3 = count; ival4 = count;.*" "watchpoint hit, fourth time" + + # Continue until the next change, from 3 to 4. + # Note that this one is outside the loop. + + gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 3.*New value = 4.*ival3 = count; ival4 = count;.*" "watchpoint hit, fifth time" + + # Continue until we hit the finishing marker function. + # Make sure we hit no more watchpoints. + + gdb_test "cont" "Continuing.*Breakpoint.*marker2 \(\).*" \ + "continue to marker2" + + # Disable the watchpoint so we run at full speed until we exit. + + if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "watchpoint disabled" ] { + return ; + } + + + # Run until process exits. + + if [target_info exists gdb,noresults] { return } + + gdb_test "cont" "Continuing.*Program exited normally.*" \ + "continue to exit in test_simple_watchpoint" +} + +# Test disabling watchpoints. + +proc test_disabling_watchpoints {} { + global gdb_prompt + global binfile + global srcfile + global decimal + global hex + + # Ensure that the watchpoint is disabled when we startup. + + if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "disable watchpoint in test_disabling_watchpoints" ] { + return 0; + } + + + # Run until we get to the first marker function. + + gdb_run_cmd + set timeout 600 + gdb_expect { + -re "Breakpoint 1, marker1 .*$gdb_prompt $" { + pass "run to marker1 in test_disabling_watchpoints" + } + -re ".*$gdb_prompt $" { + fail "run to marker1 in test_disabling_watchpoints" + return + } + timeout { + fail "run to marker1 in test_disabling_watchpoints (timeout)" + return + } + } + + # After reaching the marker function, enable the watchpoint. + + if [gdb_test "enable 3" "^enable 3\[\r\n\]+" "watchpoint enabled" ] { + return ; + } + + + # Continue until the first change, from -1 to 0 + # Don't check the old value, because on VxWorks the variable value + # will not have been reinitialized. + gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = .*New value = 0.*ival3 = count; ival4 = count;.*" "watchpoint hit in test_disabling_watchpoints, first time" + + # Continue until the next change, from 0 to 1. + gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 0.*New value = 1.*ival3 = count; ival4 = count;.*" "watchpoint hit in test_disabling_watchpoints, second time" + + # Disable the watchpoint but leave breakpoints + + if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "disable watchpoint #2 in test_disabling_watchpoints" ] { + return 0; + } + + + # Check watchpoint list, looking for the entry that confirms the + # watchpoint is disabled. + gdb_test "info watchpoints" "3\[ \]*.*watchpoint\[ \]*keep\[ \]*n\[ \]*ival3\r\n.*" "watchpoint disabled in table" + + # Continue until we hit the finishing marker function. + # Make sure we hit no more watchpoints. + gdb_test "cont" "Continuing.*Breakpoint.*marker2 \\(\\).*" \ + "disabled watchpoint skipped" + + if [target_info exists gdb,noresults] { return } + + gdb_test "cont" "Continuing.*Program exited normally.*" \ + "continue to exit in test_disabling_watchpoints" +} + +# Test stepping and other mundane operations with watchpoints enabled +proc test_stepping {} { + global gdb_prompt + + if [runto marker1] then { + gdb_test "watch ival2" ".*\[Ww\]atchpoint \[0-9\]*: ival2" + + # Well, let's not be too mundane. It should be a *bit* of a challenge + gdb_test "break func2 if 0" "Breakpoint.*at.*" + gdb_test "p \$func2_breakpoint_number = \$bpnum" " = .*" + + # The HPPA has a problem here if it's not using hardware watchpoints + if {[ istarget "hppa*-*-*" ] && ![ istarget "hppa*-*-*bsd*" ]} then { + # Don't actually try doing the call, if we do we can't continue. + setup_xfail "*-*-*" + fail "calling function with watchpoint enabled" + } else { + # The problem is that GDB confuses stepping through the call + # dummy with hitting the breakpoint at the end of the call dummy. + # Will be fixed once all architectures define + # CALL_DUMMY_BREAKPOINT_OFFSET. + setup_xfail "*-*-*" + # This doesn't occur if the call dummy starts with a call, + # because we are out of the dummy by the first time the inferior + # stops. + clear_xfail "d10v*-*-*" + clear_xfail "m68*-*-*" + clear_xfail "i*86*-*-*" + clear_xfail "vax-*-*" + # The following architectures define CALL_DUMMY_BREAKPOINT_OFFSET. + clear_xfail "alpha-*-*" + clear_xfail "mips*-*-*" + clear_xfail "sparc-*-*" + clear_xfail "hppa*-*-*bsd*" + # It works with the generic inferior function calling code too. + clear_xfail "mn10200*-*-*" + clear_xfail "mn10300*-*-*" + gdb_test "p func1 ()" "= 73" \ + "calling function with watchpoint enabled" + } + + # + # "finish" brings us back to main. + # On some targets (e.g. alpha) gdb will stop from the finish in midline + # of the marker1 call. This is due to register restoring code on + # the alpha and might be caused by stack adjustment instructions + # on other targets. In this case we will step once more. + # + + send_gdb "finish\n" + gdb_expect { + -re "Run.*exit from.*marker1.* at" { } + default { fail "finish from marker1" ; return } + } + + gdb_expect { + -re "marker1 \\(\\);.*$gdb_prompt $" { + send_gdb "step\n" + exp_continue + } + -re "func1 \\(\\);.*$gdb_prompt $" { + pass "finish from marker1" + } + -re ".*$gdb_prompt $" { + fail "finish from marker1" + } + default { fail "finish from marker1" ; return } + } + + gdb_test "next" "for \\(count = 0.*" "next to `for' in watchpoint.exp" + + # Now test that "until" works. It's a bit tricky to test + # "until", because compilers don't always arrange the code + # exactly the same way, and we might get slightly different + # sequences of statements. But the following should be true + # (if not it is a compiler or a debugger bug): The user who + # does "until" at every statement of a loop should end up + # stepping through the loop once, and the debugger should not + # stop for any of the remaining iterations. + + gdb_test "until" "ival1 = count.*" "until to ival1 assignment" + gdb_test "until" "ival3 = count.*" "until to ival3 assignment" + send_gdb "until\n" + gdb_expect { + -re "(for \\(count = 0|\}).*$gdb_prompt $" { + gdb_test "until" "ival1 = count; /. Outside loop ./" \ + "until out of loop" + } + -re "ival1 = count; /. Outside loop ./.*$gdb_prompt $" { + pass "until out of loop" + } + -re ".*$gdb_prompt $" { + fail "until out of loop" + } + default { fail "until out of loop" ; return } + } + + gdb_test "step" "ival2 = count.*" "step to ival2 assignment" + } +} + +# Test stepping and other mundane operations with watchpoints enabled +proc test_watchpoint_triggered_in_syscall {} { + global gdb_prompt + + if [target_info exists gdb,noinferiorio] { + verbose "Skipping test_watchpoint_triggered_in_syscall due to noinferiorio" + return + } + # Run until we get to the first marker function. + set x 0 + set y 0 + set testname "Watch buffer passed to read syscall" + if [runto marker2] then { + gdb_test "watch buf\[0\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[0\\\]" + gdb_test "watch buf\[1\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[1\\\]" + gdb_test "watch buf\[2\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[2\\\]" + gdb_test "watch buf\[3\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[3\\\]" + gdb_test "watch buf\[4\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[4\\\]" + gdb_test "break marker4" ".*Breakpoint.*" + + gdb_test "set doread = 1" "" + + # If we send_gdb "123\n" before gdb has switched the tty, then it goes + # to gdb, not the inferior, and we lose. So that is why we have + # watchpoint.c prompt us, so we can wait for that prompt. + send_gdb "continue\n"; + gdb_expect { + -re "Continuing\\.\r\ntype stuff for buf now:" { + pass "continue to read" + } + default { + fail "continue to read"; + return ; + } + } + + send_gdb "123\n" + gdb_expect { + -re ".*\[Ww\]atchpoint.*buf\\\[0\\\].*Old value = 0.*New value = 49\[^\n\]*\n" { set x [expr $x+1] ; exp_continue } + -re ".*\[Ww\]atchpoint.*buf\\\[1\\\].*Old value = 0.*New value = 50\[^\n\]*\n" { set x [expr $x+1] ; exp_continue } + -re ".*\[Ww\]atchpoint.*buf\\\[2\\\].*Old value = 0.*New value = 51\[^\n\]*\n" { set x [expr $x+1] ; exp_continue } + -re ".*\[Ww\]atchpoint.*buf\\\[3\\\].*Old value = 0.*New value = 10\[^\n\]*\n" { set x [expr $x+1] ; exp_continue } + -re ".*$gdb_prompt $" { pass "sent 123" } + timeout { fail "sent 123 (timeout)" } + } + + # Examine the values in buf to see how many watchpoints we + # should have printed. + send_gdb "print buf\[0\]\n" + gdb_expect { + -re ".*= 49.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[0\]"} + -re ".*= 0.*$gdb_prompt $" { pass "print buf\[0\]"} + -re ".*$gdb_prompt $" { fail "print buf\[0\]"} + default { fail "print buf\[0\]"} + } + send_gdb "print buf\[1\]\n" + gdb_expect { + -re ".*= 50.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[1\]"} + -re ".*= 0.*$gdb_prompt $" { pass "print buf\[1\]"} + -re ".*$gdb_prompt $" { fail "print buf\[1\]"} + default { fail "print buf\[1\]"} + } + send_gdb "print buf\[2\]\n" + gdb_expect { + -re ".*= 51.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[2\]"} + -re ".*= 0.*$gdb_prompt $" { pass "print buf\[2\]"} + -re ".*$gdb_prompt $" { fail "print buf\[2\]"} + default { fail "print buf\[2\]"} + } + send_gdb "print buf\[3\]\n" + gdb_expect { + -re ".*= 10.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[3\]"} + -re ".*= 0.*$gdb_prompt $" { pass "print buf\[3\]"} + -re ".*$gdb_prompt $" { fail "print buf\[3\]" } + default { fail "print buf\[3\]" } + } + + # Did we find what we were looking for? If not, flunk it. + if [expr $x==$y] then { pass $testname } else { fail "$testname (only triggered $x watchpoints, expected $y)"} + + # Continue until we hit the finishing marker function. + # Make sure we hit no more watchpoints. + gdb_test "cont" "Continuing.*Breakpoint.*marker4 \\(\\).*" \ + "continue to marker4" + + # Disable everything so we can finish the program at full speed + gdb_test "disable" "" "disable in test_watchpoint_triggered_in_syscall" + + if [target_info exists gdb,noresults] { return } + + gdb_test "cont" "Continuing.*Program exited normally.*" \ + "continue to exit in test_watchpoint_triggered_in_syscall" + } +} + +# Do a simple test of of watching through a pointer when the pointer +# itself changes. Should add some more complicated stuff here. + +proc test_complex_watchpoint {} { + global gdb_prompt + + if [runto marker4] then { + gdb_test "watch ptr1->val" ".*\[Ww\]atchpoint \[0-9\]*: ptr1->val" + gdb_test "break marker5" ".*Breakpoint.*" + + gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ptr1->val.*Old value = 1.*New value = 2.*" "Test complex watchpoint" + + # Continue until we hit the marker5 function. + # Make sure we hit no more watchpoints. + + gdb_test "cont" "Continuing.*Breakpoint.*marker5 \\(\\).*" \ + "did not trigger wrong watchpoint" + + # Disable everything so we can finish the program at full speed + gdb_test "disable" "" "disable in test_complex_watchpoint" + + if [target_info exists gdb,noresults] { return } + + + gdb_test "cont" "Continuing.*Program exited normally.*" \ + "continue to exit in test_complex_watchpoint" + } +} + +# Start with a fresh gdb. + +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile +set timeout 600 +verbose "Timeout now 600 sec.\n" + +if [initialize] then { + + test_simple_watchpoint + + # The IDT/sim monitor only has 8 (!) open files, of which it uses + # 4 (!). So we have to make sure one program exits before + # starting another one. + if [istarget "mips-idt-*"] then { + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + initialize + } + + test_disabling_watchpoints + + # See above. + if [istarget "mips-idt-*"] then { + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + initialize + } + + if ![target_info exists gdb,cannot_call_functions] { + test_stepping + + # See above. + if [istarget "mips-idt-*"] then { + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + initialize + } + } + + # Only enabled for some targets merely because it has not been tested + # elsewhere. + # On sparc-sun-sunos4.1.3, GDB was running all the way to the marker4 + # breakpoint before stopping for the watchpoint. I don't know why. + if {[istarget "hppa*-*-*"]} then { + test_watchpoint_triggered_in_syscall + } + + # See above. + if [istarget "mips-idt-*"] then { + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + initialize + } + + # Only enabled for some targets merely because it has not been tested + # elsewhere. + if {[istarget "hppa*-*-*"] || \ + [istarget "sparc*-*-sunos*"] || \ + [istarget "m32r-*-*"]} then { + test_complex_watchpoint + } +} diff --git a/gdb/testsuite/gdb.base/whatis-exp.exp b/gdb/testsuite/gdb.base/whatis-exp.exp new file mode 100644 index 00000000000..c5b97eed357 --- /dev/null +++ b/gdb/testsuite/gdb.base/whatis-exp.exp @@ -0,0 +1,217 @@ +# Copyright (C) 1998 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite +# +# tests for whatis command on expressions. +# used in file eval.c. This flavor of whatis +# command performs evaluation of expressions w/o actually +# computing the value, but just the type +# of the result. It goes through the evaluate_subexp_standard +# with the EVAL_AVOID_SIDE_EFFECTS flag rather than EVAL_NORMAL +# + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "int-type" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# +# test expressions with "int" types +# + +gdb_test "set variable x=14" "" "set variable x=14" +gdb_test "set variable y=2" "" "set variable y=2" +gdb_test "set variable z=2" "" "set variable z=2" +gdb_test "set variable w=3" "" "set variable w=3" + +send_gdb "print x\n" +gdb_expect { + -re ".*14.*$gdb_prompt $" { + pass "print value of x" + } + -re ".*$gdb_prompt $" { fail "print value of x" } + timeout { fail "(timeout) print value of x" } + } + + +send_gdb "print y\n" +gdb_expect { + -re ".*2.*$gdb_prompt $" { + pass "print value of y" + } + -re ".*$gdb_prompt $" { fail "print value of y" } + timeout { fail "(timeout) print value of y" } + } + +send_gdb "print z\n" +gdb_expect { + -re ".*2.*$gdb_prompt $" { + pass "print value of z" + } + -re ".*$gdb_prompt $" { fail "print value of z" } + timeout { fail "(timeout) print value of z" } + } + +send_gdb "print w\n" +gdb_expect { + -re ".*3.*$gdb_prompt $" { + pass "print value of w" + } + -re ".*$gdb_prompt $" { fail "print value of w" } + timeout { fail "(timeout) print value of w" } + } + + + +send_gdb "whatis x+y\n" +gdb_expect { + -re ".*type = long.*$gdb_prompt $" { + pass "whatis value of x+y" + } + -re ".*$gdb_prompt $" { fail "whatis value of x+y" } + timeout { fail "(timeout) whatis value of x+y" } + } + +send_gdb "whatis x-y\n" +gdb_expect { + -re ".*type = long.*$gdb_prompt $" { + pass "whatis value of x-y" + } + -re ".*$gdb_prompt $" { fail "whatis value of x-y" } + timeout { fail "(timeout) whatis value of x-y" } + } + +send_gdb "whatis x*y\n" +gdb_expect { + -re ".*type = long.*$gdb_prompt $" { + pass "whatis value of x*y" + } + -re ".*$gdb_prompt $" { fail "whatis value of x*y" } + timeout { fail "(timeout) whatis value of x*y" } + } + +send_gdb "whatis x/y\n" +gdb_expect { + -re ".*type = int.*$gdb_prompt $" { + pass "whatis value of x/y" + } + -re ".*$gdb_prompt $" { fail "whatis value of x/y" } + timeout { fail "(timeout) whatis value of x/y" } + } + +send_gdb "whatis x%y\n" +gdb_expect { + -re ".*type = int.*$gdb_prompt $" { + pass "whatis value of x%y" + } + -re ".*$gdb_prompt $" { fail "whatis value of x%y" } + timeout { fail "(timeout) whatis value of x%y" } + } + + + +send_gdb "whatis x=y\n" +gdb_expect { + -re ".*type = int.*$gdb_prompt $" { + pass "whatis value of x=y" + } + -re ".*$gdb_prompt $" { fail "whatis value of x=y" } + timeout { fail "(timeout) whatis value of x=y" } + } + + +send_gdb "whatis x+=2\n" +gdb_expect { + -re ".*type = int.*$gdb_prompt $" { + pass "whatis value of x+=2" + } + -re ".*$gdb_prompt $" { fail "whatis value of x+=2" } + timeout { fail "(timeout) whatis value of x+=2" } + } + + +send_gdb "whatis ++x\n" +gdb_expect { + -re ".*type = int.*$gdb_prompt $" { + pass "whatis value of ++x" + } + -re ".*$gdb_prompt $" { fail "whatis value of ++x" } + timeout { fail "(timeout) whatis value of ++x" } + } + +send_gdb "whatis --x\n" +gdb_expect { + -re ".*type = int.*$gdb_prompt $" { + pass "whatis value of --x" + } + -re ".*$gdb_prompt $" { fail "whatis value of --x" } + timeout { fail "(timeout) whatis value of --x" } + } + +send_gdb "whatis x++\n" +gdb_expect { + -re ".*type = int.*$gdb_prompt $" { + pass "whatis value of x++" + } + -re ".*$gdb_prompt $" { fail "whatis value of x++" } + timeout { fail "(timeout) whatis value of x++" } + } + +send_gdb "whatis x--\n" +gdb_expect { + -re ".*type = int.*$gdb_prompt $" { + pass "whatis value of x--" + } + -re ".*$gdb_prompt $" { fail "whatis value of x--" } + timeout { fail "(timeout) whatis value of x--" } + } + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.base/whatis.c b/gdb/testsuite/gdb.base/whatis.c new file mode 100644 index 00000000000..6d8d1e64bb5 --- /dev/null +++ b/gdb/testsuite/gdb.base/whatis.c @@ -0,0 +1,269 @@ +/* + * Test file with lots of different types, for testing the + * "whatis" command. + */ + +/* + * First the basic C types. + */ + +#if !(defined (__STDC__) || defined (_AIX)) +#define signed /**/ +#endif + +char v_char; +signed char v_signed_char; +unsigned char v_unsigned_char; + +short v_short; +signed short v_signed_short; +unsigned short v_unsigned_short; + +int v_int; +signed int v_signed_int; +unsigned int v_unsigned_int; + +long v_long; +signed long v_signed_long; +unsigned long v_unsigned_long; + +float v_float; +double v_double; + +/* + * Now some derived types, which are arrays, functions-returning, + * pointers, structures, unions, and enumerations. + */ + +/**** arrays *******/ + +char v_char_array[2]; +signed char v_signed_char_array[2]; +unsigned char v_unsigned_char_array[2]; + +short v_short_array[2]; +signed short v_signed_short_array[2]; +unsigned short v_unsigned_short_array[2]; + +int v_int_array[2]; +signed int v_signed_int_array[2]; +unsigned int v_unsigned_int_array[2]; + +long v_long_array[2]; +signed long v_signed_long_array[2]; +unsigned long v_unsigned_long_array[2]; + +float v_float_array[2]; +double v_double_array[2]; + +/**** pointers *******/ + +/* Make sure they still print as pointer to foo even there is a typedef + for that type. Test this not just for char *, which might be + a special case kludge in GDB (Unix system include files like to define + caddr_t), but for a variety of types. */ +typedef char *char_addr; +typedef unsigned short *ushort_addr; +typedef signed long *slong_addr; + +char *v_char_pointer; +signed char *v_signed_char_pointer; +unsigned char *v_unsigned_char_pointer; + +short *v_short_pointer; +signed short *v_signed_short_pointer; +unsigned short *v_unsigned_short_pointer; + +int *v_int_pointer; +signed int *v_signed_int_pointer; +unsigned int *v_unsigned_int_pointer; + +long *v_long_pointer; +signed long *v_signed_long_pointer; +unsigned long *v_unsigned_long_pointer; + +float *v_float_pointer; +double *v_double_pointer; + +/**** structs *******/ + +struct t_struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_struct1; + +struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_struct2; + +/**** unions *******/ + +union t_union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_union; + +union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; + float v_float_member; + double v_double_member; +} v_union2; + +/*** Functions returning type ********/ + +char v_char_func () { return(0); } +signed char v_signed_char_func () { return (0); } +unsigned char v_unsigned_char_func () { return (0); } + +short v_short_func () { return (0); } +signed short v_signed_short_func () { return (0); } +unsigned short v_unsigned_short_func () { return (0); } + +int v_int_func () { return (0); } +signed int v_signed_int_func () { return (0); } +unsigned int v_unsigned_int_func () { return (0); } + +long v_long_func () { return (0); } +signed long v_signed_long_func () { return (0); } +unsigned long v_unsigned_long_func () { return (0); } + +float v_float_func () { return (0.0); } +double v_double_func () { return (0.0); } + +/**** Some misc more complicated things *******/ + +struct link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *this, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} *s_link; + +union tu_link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *this, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} u_link; + +struct outer_struct { + int outer_int; + struct inner_struct { + int inner_int; + long inner_long; + }inner_struct_instance; + union inner_union { + int inner_union_int; + long inner_union_long; + }inner_union_instance; + long outer_long; +} nested_su; + +/**** Enumerations *******/ + +enum colors {red, green, blue} color; +enum cars {chevy, ford, porsche} clunker; + +/***********/ + +main () +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + /* Some linkers (e.g. on AIX) remove unreferenced variables, + so make sure to reference them. */ + v_char = 0; + v_signed_char = 1; + v_unsigned_char = 2; + + v_short = 3; + v_signed_short = 4; + v_unsigned_short = 5; + + v_int = 6; + v_signed_int = 7; + v_unsigned_int = 8; + + v_long = 9; + v_signed_long = 10; + v_unsigned_long = 11; + + v_float = 100.0; + v_double = 200.0; + + + v_char_array[0] = v_char; + v_signed_char_array[0] = v_signed_char; + v_unsigned_char_array[0] = v_unsigned_char; + + v_short_array[0] = v_short; + v_signed_short_array[0] = v_signed_short; + v_unsigned_short_array[0] = v_unsigned_short; + + v_int_array[0] = v_int; + v_signed_int_array[0] = v_signed_int; + v_unsigned_int_array[0] = v_unsigned_int; + + v_long_array[0] = v_long; + v_signed_long_array[0] = v_signed_long; + v_unsigned_long_array[0] = v_unsigned_long; + + v_float_array[0] = v_float; + v_double_array[0] = v_double; + + v_char_pointer = &v_char; + v_signed_char_pointer = &v_signed_char; + v_unsigned_char_pointer = &v_unsigned_char; + + v_short_pointer = &v_short; + v_signed_short_pointer = &v_signed_short; + v_unsigned_short_pointer = &v_unsigned_short; + + v_int_pointer = &v_int; + v_signed_int_pointer = &v_signed_int; + v_unsigned_int_pointer = &v_unsigned_int; + + v_long_pointer = &v_long; + v_signed_long_pointer = &v_signed_long; + v_unsigned_long_pointer = &v_unsigned_long; + + v_float_pointer = &v_float; + v_double_pointer = &v_double; + + color = red; + clunker = porsche; + + u_link.next = s_link; + + v_union2.v_short_member = v_union.v_short_member; + + v_struct1.v_char_member = 0; + v_struct2.v_char_member = 0; + + nested_su.outer_int = 0; + return 0; +} diff --git a/gdb/testsuite/gdb.base/whatis.exp b/gdb/testsuite/gdb.base/whatis.exp new file mode 100644 index 00000000000..1f4e8b35de8 --- /dev/null +++ b/gdb/testsuite/gdb.base/whatis.exp @@ -0,0 +1,393 @@ +# Copyright (C) 1988, 1990, 1991, 1992, 1995, 1997 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +if $tracelevel { + strace $tracelevel +} + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile whatis +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile}] { + return -1; +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile + +# If we did not use the signed keyword when compiling the file, don't +# expect GDB to know that char is signed. +if $signed_keyword_not_used then { + set signed_char "char" +} else { + set signed_char "signed char" +} + +# Define a procedure to set up an xfail for all targets that put out a +# `long' type as an `int' type. +# Sun/Ultrix cc have this problem. +# It was said that COFF targets can not distinguish int from long either. + +proc setup_xfail_on_long_vs_int {} { + global gcc_compiled + + if {!$gcc_compiled} { + setup_xfail "*-sun-sunos4*" "*-*-ultrix*" "i*86-sequent-bsd*" + } +} + +# +# Test whatis command with basic C types +# +# The name printed now (as of 23 May 1993) is whatever name the compiler +# uses in the stabs. So we need to deal with names both from gcc and +# native compilers. +# +gdb_test "whatis v_char" \ + "type = (unsigned char|char)" \ + "whatis char" + +setup_xfail "a29k-*-*" +if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" } +gdb_test "whatis v_signed_char" \ + "type = $signed_char" \ + "whatis signed char" + +gdb_test "whatis v_unsigned_char" \ + "type = unsigned char" \ + "whatis unsigned char" + +gdb_test "whatis v_short" \ + "type = (short|short int)" \ + "whatis short" + +gdb_test "whatis v_signed_short" \ + "type = (short|short int|signed short|signed short int)" \ + "whatis signed short" + +gdb_test "whatis v_unsigned_short" \ + "type = (unsigned short|short unsigned int)" \ + "whatis unsigned short" + +gdb_test "whatis v_int" \ + "type = int" \ + "whatis int" + +gdb_test "whatis v_signed_int" \ + "type = (signed |)int" \ + "whatis signed int" + +gdb_test "whatis v_unsigned_int" \ + "type = unsigned int" \ + "whatis unsigned int" + +setup_xfail_on_long_vs_int +# AIX xlc gets this wrong and unsigned long right. Go figure. +if {!$gcc_compiled} then {setup_xfail "rs6000-*-aix*"} +gdb_test "whatis v_long" \ + "type = (long|long int)" \ + "whatis long" + +setup_xfail_on_long_vs_int +# AIX xlc gets this wrong and unsigned long right. Go figure. +if {!$gcc_compiled} then {setup_xfail "rs6000-*-aix*"} +gdb_test "whatis v_signed_long" \ + "type = (signed |)(long|long int)" \ + "whatis signed long" + +setup_xfail_on_long_vs_int +gdb_test "whatis v_unsigned_long" \ + "type = (unsigned long|long unsigned int)" \ + "whatis unsigned long" + +gdb_test "whatis v_float" \ + "type = float" \ + "whatis float" + +gdb_test "whatis v_double" \ + "type = double" \ + "whatis double" + + +# test whatis command with arrays +# +# We already tested whether char prints as "char", so here we accept +# "unsigned char", "signed char", and other perversions. No need for more +# than one xfail for the same thing. +gdb_test "whatis v_char_array" \ + "type = (signed |unsigned |)char \\\[2\\\]" \ + "whatis char array" + +gdb_test "whatis v_signed_char_array" \ + "type = (signed |unsigned |)char \\\[2\\\]" \ + "whatis signed char array" + +gdb_test "whatis v_unsigned_char_array" \ + "type = unsigned char \\\[2\\\]" \ + "whatis unsigned char array" + +gdb_test "whatis v_short_array" \ + "type = (short|short int) \\\[2\\\]" \ + "whatis short array" + +gdb_test "whatis v_signed_short_array" \ + "type = (signed |)(short|short int) \\\[2\\\]" \ + "whatis signed short array" + +gdb_test "whatis v_unsigned_short_array" \ + "type = (unsigned short|short unsigned int) \\\[2\\\]" \ + "whatis unsigned short array" + +gdb_test "whatis v_int_array" \ + "type = int \\\[2\\\]" \ + "whatis int array" + +gdb_test "whatis v_signed_int_array" \ + "type = (signed |)int \\\[2\\\]" \ + "whatis signed int array" + +gdb_test "whatis v_unsigned_int_array" \ + "type = unsigned int \\\[2\\\]" \ + "whatis unsigned int array" + +# We already tested whether long prints as long, so here we accept int +# No need for more than one xfail for the same thing. +gdb_test "whatis v_long_array" \ + "type = (int|long|long int) \\\[2\\\]" \ + "whatis long array" + +gdb_test "whatis v_signed_long_array" \ + "type = (signed |)(int|long|long int) \\\[2\\\]" \ + "whatis signed long array" + +gdb_test "whatis v_unsigned_long_array" \ + "type = (unsigned (int|long|long int)|long unsigned int) \\\[2\\\]" \ + "whatis unsigned long array" + +gdb_test "whatis v_float_array" \ + "type = float \\\[2\\\]" \ + "whatis float array" + +gdb_test "whatis v_double_array" \ + "type = double \\\[2\\\]" \ + "whatis double array" + + +# test whatis command with pointers +# +# We already tested whether char prints as char, so accept various perversions +# here. We especially want to make sure we test that it doesn't print as +# caddr_t. +gdb_test "whatis v_char_pointer" \ + "type = (unsigned |signed |)char \\*" \ + "whatis char pointer" + +gdb_test "whatis v_signed_char_pointer" \ + "type = (unsigned |signed |)char \\*" \ + "whatis signed char pointer" + +gdb_test "whatis v_unsigned_char_pointer" \ + "type = unsigned char \\*" \ + "whatis unsigned char pointer" + +gdb_test "whatis v_short_pointer" \ + "type = (short|short int) \\*" \ + "whatis short pointer" + +gdb_test "whatis v_signed_short_pointer" \ + "type = (signed |)(short|short int) \\*" \ + "whatis signed short pointer" + +gdb_test "whatis v_unsigned_short_pointer" \ + "type = (unsigned short|short unsigned int) \\*" \ + "whatis unsigned short pointer" + +gdb_test "whatis v_int_pointer" \ + "type = int \\*" \ + "whatis int pointer" + +gdb_test "whatis v_signed_int_pointer" \ + "type = (signed |)int \\*" \ + "whatis signed int pointer" + +gdb_test "whatis v_unsigned_int_pointer" \ + "type = unsigned int \\*" \ + "whatis unsigned int pointer" + +# We already tested whether long prints as long, so here we accept int +gdb_test "whatis v_long_pointer" \ + "type = (long|int|long int) \\*" \ + "whatis long pointer" + +gdb_test "whatis v_signed_long_pointer" \ + "type = (signed |)(long|int|long int) \\*" \ + "whatis signed long pointer" + +gdb_test "whatis v_unsigned_long_pointer" \ + "type = (unsigned (int|long|long int)|long unsigned int) \\*" \ + "whatis unsigned long pointer" + +gdb_test "whatis v_float_pointer" \ + "type = float \\*" \ + "whatis float pointer" + +gdb_test "whatis v_double_pointer" \ + "type = double \\*" \ + "whatis double pointer" + + +# test whatis command with structure types +gdb_test "whatis v_struct1" \ + "type = struct t_struct" \ + "whatis named structure" + +gdb_test "whatis v_struct2" \ + "type = struct \{...\}" \ + "whatis unnamed structure" + + +# test whatis command with union types +gdb_test "whatis v_union" \ + "type = union t_union" \ + "whatis named union" + +gdb_test "whatis v_union2" \ + "type = union \{...\}" \ + "whatis unnamed union" + + + +# test whatis command with functions return type +gdb_test "whatis v_char_func" \ + "type = (signed |unsigned |)char \\(\\)" \ + "whatis char function" + +gdb_test "whatis v_signed_char_func" \ + "type = (signed |unsigned |)char \\(\\)" \ + "whatis signed char function" + +gdb_test "whatis v_unsigned_char_func" \ + "type = unsigned char \\(\\)" \ + "whatis unsigned char function" + +gdb_test "whatis v_short_func" \ + "type = short (int |)\\(\\)" \ + "whatis short function" + +gdb_test "whatis v_signed_short_func" \ + "type = (signed |)short (int |)\\(\\)" \ + "whatis signed short function" + +gdb_test "whatis v_unsigned_short_func" \ + "type = (unsigned short|short unsigned int) \\(\\)" \ + "whatis unsigned short function" + +gdb_test "whatis v_int_func" \ + "type = int \\(\\)" \ + "whatis int function" + +gdb_test "whatis v_signed_int_func" \ + "type = (signed |)int \\(\\)" \ + "whatis signed int function" + +gdb_test "whatis v_unsigned_int_func" \ + "type = unsigned int \\(\\)" \ + "whatis unsigned int function" + +gdb_test "whatis v_long_func" \ + "type = (long|int|long int) \\(\\)" \ + "whatis long function" + +gdb_test "whatis v_signed_long_func" \ + "type = (signed |)(int|long|long int) \\(\\)" \ + "whatis signed long function" + +gdb_test "whatis v_unsigned_long_func" \ + "type = (unsigned (int|long|long int)|long unsigned int) \\(\\)" \ + "whatis unsigned long function" + +# Sun /bin/cc calls this a function returning double. +if {!$gcc_compiled} then {setup_xfail "*-sun-sunos4*"} +gdb_test "whatis v_float_func" \ + "type = float \\(\\)" \ + "whatis float function" + +gdb_test "whatis v_double_func" \ + "type = double \\(\\)" \ + "whatis double function" \ + + +# test whatis command with some misc complicated types +gdb_test "whatis s_link" \ + "type = struct link \\*" \ + "whatis complicated structure" + +gdb_test "whatis u_link" \ + "type = union tu_link" \ + "whatis complicated union" + + +# test whatis command with enumerations +gdb_test "whatis clunker" \ + "type = enum cars" \ + "whatis enumeration" + + +# test whatis command with nested struct and union +gdb_test "whatis nested_su" \ + "type = struct outer_struct" \ + "whatis outer structure" + +gdb_test "whatis nested_su.outer_int" \ + "type = int" \ + "whatis outer structure member" + +gdb_test "whatis nested_su.inner_struct_instance" \ + "type = struct inner_struct" \ + "whatis inner structure" + +gdb_test "whatis nested_su.inner_struct_instance.inner_int" \ + "type = int" \ + "whatis inner structure member" + +gdb_test "whatis nested_su.inner_union_instance" \ + "type = union inner_union" \ + "whatis inner union" + +gdb_test "whatis nested_su.inner_union_instance.inner_union_int" \ + "type = int" \ + "whatis inner union member" -- cgit v1.2.1