From 452904f8057b7de43767e2ad9a8e42f8af992c36 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Mon, 8 Oct 2007 12:41:25 +0000 Subject: [PATCH] 2007-10-08 Pierre Muller Daniel Jacobowitz * Makefile.in (ALL_SUBDIRS): Add gdb.pascal. * configure.ac (AC_OUTPUT): Add gdb.pascal/Makefile. * configure: Regenerated. * gdb.pascal/Makefile.in, gdb.pascal/hello.exp, gdb.pascal/hello.pas, gdb.pascal/types.exp, lib/pascal.exp: New files. --- gdb/testsuite/ChangeLog | 9 +++ gdb/testsuite/Makefile.in | 2 +- gdb/testsuite/configure | 2 +- gdb/testsuite/configure.ac | 4 +- gdb/testsuite/gdb.pascal/Makefile.in | 24 ++++++ gdb/testsuite/gdb.pascal/hello.exp | 75 +++++++++++++++++ gdb/testsuite/gdb.pascal/hello.pas | 15 ++++ gdb/testsuite/gdb.pascal/types.exp | 110 +++++++++++++++++++++++++ gdb/testsuite/lib/pascal.exp | 152 +++++++++++++++++++++++++++++++++++ 9 files changed, 389 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.pascal/Makefile.in create mode 100644 gdb/testsuite/gdb.pascal/hello.exp create mode 100644 gdb/testsuite/gdb.pascal/hello.pas create mode 100644 gdb/testsuite/gdb.pascal/types.exp create mode 100644 gdb/testsuite/lib/pascal.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 4e31965815..0cf23a608d 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2007-10-08 Pierre Muller + Daniel Jacobowitz + + * Makefile.in (ALL_SUBDIRS): Add gdb.pascal. + * configure.ac (AC_OUTPUT): Add gdb.pascal/Makefile. + * configure: Regenerated. + * gdb.pascal/Makefile.in, gdb.pascal/hello.exp, gdb.pascal/hello.pas, + gdb.pascal/types.exp, lib/pascal.exp: New files. + 2007-10-02 Daniel Jacobowitz * gdb.cp/classes.exp (do_tests): Always step to the line after the diff --git a/gdb/testsuite/Makefile.in b/gdb/testsuite/Makefile.in index edcd35cfb4..95f4f08819 100644 --- a/gdb/testsuite/Makefile.in +++ b/gdb/testsuite/Makefile.in @@ -37,7 +37,7 @@ RPATH_ENVVAR = @RPATH_ENVVAR@ ALL_SUBDIRS = gdb.ada gdb.arch gdb.asm gdb.base gdb.cp gdb.disasm \ gdb.dwarf2 \ gdb.fortran gdb.server gdb.java gdb.mi \ - gdb.objc gdb.threads gdb.trace gdb.xml \ + gdb.objc gdb.pascal gdb.threads gdb.trace gdb.xml \ $(SUBDIRS) EXPECT = `if [ -f $${rootme}/../../expect/expect ] ; then \ diff --git a/gdb/testsuite/configure b/gdb/testsuite/configure index fc6c49099e..3d33008649 100755 --- a/gdb/testsuite/configure +++ b/gdb/testsuite/configure @@ -3104,7 +3104,7 @@ done - ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.objc/Makefile gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile" + ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.objc/Makefile gdb.pascal/Makefile gdb.threads/Makefile gdb.trace/Makefile gdb.xml/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure diff --git a/gdb/testsuite/configure.ac b/gdb/testsuite/configure.ac index 92f5f30673..b93b9230ce 100644 --- a/gdb/testsuite/configure.ac +++ b/gdb/testsuite/configure.ac @@ -115,6 +115,6 @@ AC_OUTPUT([Makefile \ gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile \ gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile \ gdb.fortran/Makefile gdb.server/Makefile \ - gdb.java/Makefile gdb.mi/Makefile \ - gdb.objc/Makefile gdb.threads/Makefile gdb.trace/Makefile \ + gdb.java/Makefile gdb.mi/Makefile gdb.objc/Makefile \ + gdb.pascal/Makefile gdb.threads/Makefile gdb.trace/Makefile \ gdb.xml/Makefile]) diff --git a/gdb/testsuite/gdb.pascal/Makefile.in b/gdb/testsuite/gdb.pascal/Makefile.in new file mode 100644 index 0000000000..431a4c7ead --- /dev/null +++ b/gdb/testsuite/gdb.pascal/Makefile.in @@ -0,0 +1,24 @@ +VPATH = @srcdir@ +srcdir = @srcdir@ + +EXECUTABLES = hello/hello + +MISCELLANEOUS = + +all info install-info dvi install uninstall installcheck check: + @echo "Nothing to be done for $@..." + +clean mostlyclean: + -find . -name '*.o' -print | xargs rm -f + -find . -name '*.ali' -print | xargs rm -f + -find . -name 'b~*.ad[sb]' -print | xargs rm -f + -rm -f *~ a.out xgdb *.x *.ci *.tmp + -rm -f *~ *.o a.out xgdb *.x *.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.* diff --git a/gdb/testsuite/gdb.pascal/hello.exp b/gdb/testsuite/gdb.pascal/hello.exp new file mode 100644 index 0000000000..3d0a9861ec --- /dev/null +++ b/gdb/testsuite/gdb.pascal/hello.exp @@ -0,0 +1,75 @@ +# Copyright 2007 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +if $tracelevel then { + strace $tracelevel +} + +load_lib "pascal.exp" + +set testfile "hello" +set srcfile ${testfile}.pas +set binfile ${objdir}/${subdir}/${testfile} + +if {[gdb_compile_pascal "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug ]] != "" } { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +set bp_location1 [gdb_get_line_number "set breakpoint 1 here"] +set bp_location2 [gdb_get_line_number "set breakpoint 2 here"] + +if { [gdb_breakpoint ${srcfile}:${bp_location1}] } { + pass "setting breakpoint 1" +} +if { [gdb_breakpoint ${srcfile}:${bp_location2}] } { + pass "setting breakpoint 2" +} + +# Verify that "start" lands inside the right procedure. +if { [gdb_start_cmd] < 0 } { + untested start + return -1 +} + +# This test fails for gpc +# because debug information for 'main' +# is in some +gdb_test "" \ + ".* at .*hello.pas.*" \ + "start" + +gdb_test "cont" \ + "Breakpoint .*:${bp_location1}.*" \ + "Going to first breakpoint" +gdb_test "print st" \ + ".* = ''.*" \ + "Empty string check" + +# This test also fails for gpc because the program +# stops after the string has been written +# while it should stop before writing it +if { $pascal_compiler_is_gpc } { + setup_xfail *-*-* +} +gdb_test "cont" \ + "Breakpoint .*:${bp_location2}.*" \ + "Going to second breakpoint" +gdb_test "print st" \ + ".* = 'Hello, world!'.*" \ + "String after assignment check" diff --git a/gdb/testsuite/gdb.pascal/hello.pas b/gdb/testsuite/gdb.pascal/hello.pas new file mode 100644 index 0000000000..e43a1a408c --- /dev/null +++ b/gdb/testsuite/gdb.pascal/hello.pas @@ -0,0 +1,15 @@ +program hello; + +var + st : string; + +procedure print_hello; +begin + Writeln('Before assignment'); { set breakpoint 1 here } + st:='Hello, world!'; + writeln(st); {set breakpoint 2 here } +end; + +begin + print_hello; +end. diff --git a/gdb/testsuite/gdb.pascal/types.exp b/gdb/testsuite/gdb.pascal/types.exp new file mode 100644 index 0000000000..abf2aa1c75 --- /dev/null +++ b/gdb/testsuite/gdb.pascal/types.exp @@ -0,0 +1,110 @@ +# Copyright 1994, 1995, 1997, 1998, 2007 Free Software Foundation, Inc. +# Copyright 2007 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was adapted from old Chill tests by Stan Shebs +# (shebs@cygnus.com). +# Adapted to pascal by Pierre Muller + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +# Set the current language to pascal. This counts as a test. If it +# fails, then we skip the other tests. + +proc set_lang_pascal {} { + global gdb_prompt + + if [gdb_test "set language pascal" ""] { + return 0; + } + + if ![gdb_test "show language" ".* source language is \"pascal\".*"] { + return 1; + } else { + return 0; + } +} + +proc test_integer_literal_types_accepted {} { + global gdb_prompt + + # Test various decimal values. + # Should be integer*4 probably. + gdb_test "pt 123" "type = int" +} +proc test_character_literal_types_accepted {} { + global gdb_prompt + + # Test various character values. + + gdb_test "pt 'a'" "type = char" +} + +proc test_string_literal_types_accepted {} { + global gdb_prompt + + # Test various character values. + + setup_kfail *-*-* gdb/2326 + gdb_test "pt 'a simple string'" "type = string" +} + +proc test_logical_literal_types_accepted {} { + global gdb_prompt + + # Test the only possible values for a logical, TRUE and FALSE. + + gdb_test "pt TRUE" "type = bool" + gdb_test "pt FALSE" "type = bool" +} + +proc test_float_literal_types_accepted {} { + global gdb_prompt + + # Test various floating point formats + + # this used to guess whether to look for "real*4" or + # "real*8" based on a target config variable, but noone + # maintained it properly. + + gdb_test "pt .44" "type = double" + gdb_test "pt 44.0" "type = double" + gdb_test "pt 10e20" "type = double" + gdb_test "pt 10E20" "type = double" +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +if [set_lang_pascal] then { + test_integer_literal_types_accepted + test_logical_literal_types_accepted + test_character_literal_types_accepted + test_string_literal_types_accepted + test_float_literal_types_accepted +} else { + warning "$test_name tests suppressed." 0 +} diff --git a/gdb/testsuite/lib/pascal.exp b/gdb/testsuite/lib/pascal.exp new file mode 100644 index 0000000000..49f80770fc --- /dev/null +++ b/gdb/testsuite/lib/pascal.exp @@ -0,0 +1,152 @@ +# Copyright 2007 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib libgloss.exp + +set pascal_init_done 0 + +# This procedure looks for a suitable pascal compiler +# For now only GNU pascal compiler and Free Pascal compiler +# are searched. +# First, environment variable GPC is checked +# if present, GPC compiler is assumed to be the value of +# that environment variable. +# Second, environment variable FPC is checked +# if present, Free Pascal compiler is assumed to be the value of +# that environment variable. +# Third, gpc executable is searched using `which gpc` +# Lastly, fpc executable is searched using `which fpc` +# Using environment variable allows to force +# which compiler is used in testsuite + +proc pascal_init {} { + global pascal_init_done + global pascal_compiler_is_gpc + global pascal_compiler_is_fpc + global gpc_compiler + global fpc_compiler + global env + + if { $pascal_init_done == 1 } { + return + } + + set pascal_compiler_is_gpc 0 + set pascal_compiler_is_fpc 0 + set gpc_compiler [transform gpc] + set fpc_compiler [transform fpc] + + if ![is_remote host] { + if { [info exists env(GPC)] } { + set pascal_compiler_is_gpc 1 + set gpc_compiler $env(GPC) + verbose -log "Assuming GNU Pascal ($gpc_compiler)" + } elseif { [info exists env(FPC)] } { + set pascal_compiler_is_fpc 1 + set fpc_compiler $env(FPC) + verbose -log "Assuming Free Pascal ($fpc_compiler)" + } elseif { [which $gpc_compiler] != 0 } { + set pascal_compiler_is_gpc 1 + verbose -log "GNU Pascal compiler found" + } elseif { [which $fpc_compiler] != 0 } { + set pascal_compiler_is_fpc 1 + verbose -log "Free Pascal compiler found" + } + } + set pascal_init_done 1 +} + +proc gpc_compile {source dest type options} { + global gpc_compiler + set add_flags "" + if {$type == "object"} { + append add_flags " -c" + } + + if { $type == "preprocess" } { + append add_flags " -E" + } + + if { $type == "assembly" } { + append add_flags " -S" + } + + foreach i $options { + if { $i == "debug" } { + if [board_info $dest exists debug_flags] { + append add_flags " [board_info $dest debug_flags]"; + } else { + append add_flags " -g" + } + } + } + + set result [remote_exec host $gpc_compiler "-o $dest --automake $add_flags $source"] + return $result +} + +proc fpc_compile {source dest type options} { + global fpc_compiler + set add_flags "" + if {$type == "object"} { + append add_flags " -Cn" + } + + if { $type == "preprocess" } { + return "Free Pascal can not preprocess" + } + + if { $type == "assembly" } { + append add_flags " -al" + } + + foreach i $options { + if { $i == "debug" } { + if [board_info $dest exists debug_flags] { + append add_flags " [board_info $dest debug_flags]"; + } else { + append add_flags " -g" + } + } + } + + set result [remote_exec host $fpc_compiler "-o$dest $add_flags $source"] + return $result +} + +proc gdb_compile_pascal {source dest type options} { + global pascal_init_done + global pascal_compiler_is_gpc + global pascal_compiler_is_fpc + + if { $pascal_init_done == 0 } { + pascal_init + } + + if { $pascal_compiler_is_fpc == 1 } { + set result [fpc_compile $source $dest $type $options] + } elseif { $pascal_compiler_is_gpc == 1 } { + set result [gpc_compile $source $dest $type $options] + } else { + unsupported "No pascal compiler found" + return "No pascal compiler. Compilation failed." + } + + if ![file exists $dest] { + unsupported "Pascal compilation failed: $result" + return "Pascal compilation failed." + } +} + -- 2.11.0