2007-09-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. Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/testsuite/Makefile.in,v retrieving revision 1.18 diff -u -p -r1.18 Makefile.in --- Makefile.in 27 Mar 2007 18:09:35 -0000 1.18 +++ Makefile.in 7 Sep 2007 21:46:12 -0000 @@ -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 \ Index: configure =================================================================== RCS file: /cvs/src/src/gdb/testsuite/configure,v retrieving revision 1.23 diff -u -p -r1.23 configure --- configure 23 Jan 2007 17:11:54 -0000 1.23 +++ configure 7 Sep 2007 21:46:24 -0000 @@ -3102,7 +3102,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 Index: configure.ac =================================================================== RCS file: /cvs/src/src/gdb/testsuite/configure.ac,v retrieving revision 1.7 diff -u -p -r1.7 configure.ac --- configure.ac 23 Aug 2007 17:58:44 -0000 1.7 +++ configure.ac 7 Sep 2007 21:46:24 -0000 @@ -113,6 +113,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]) Index: gdb.pascal/Makefile.in =================================================================== RCS file: gdb.pascal/Makefile.in diff -N gdb.pascal/Makefile.in --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb.pascal/Makefile.in 7 Sep 2007 21:46:31 -0000 @@ -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.* Index: gdb.pascal/hello.exp =================================================================== RCS file: gdb.pascal/hello.exp diff -N gdb.pascal/hello.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb.pascal/hello.exp 7 Sep 2007 21:46:31 -0000 @@ -0,0 +1,72 @@ +# 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 +gdb_test "cont" \ + "Breakpoint .*:${bp_location2}.*" \ + "Going to second breakpoint" +gdb_test "print st" \ + ".* = 'Hello, world!'.*" \ + "String after assignment check" Index: gdb.pascal/hello.pas =================================================================== RCS file: gdb.pascal/hello.pas diff -N gdb.pascal/hello.pas --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb.pascal/hello.pas 7 Sep 2007 21:46:31 -0000 @@ -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. Index: gdb.pascal/types.exp =================================================================== RCS file: gdb.pascal/types.exp diff -N gdb.pascal/types.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb.pascal/types.exp 7 Sep 2007 21:46:31 -0000 @@ -0,0 +1,109 @@ +# 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. + + 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 +} Index: lib/pascal.exp =================================================================== RCS file: lib/pascal.exp diff -N lib/pascal.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lib/pascal.exp 7 Sep 2007 21:46:32 -0000 @@ -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." + } +} +