RE: [RFC] adding gdb.pascal subdir: updated version

Pierre Muller
2007-10-08T13:42:37Z

Thanks for checking this in...

Running
"make RUNTESTFLAGS=--dir=gdb.pascal"
I got the following result with GPC:

=== gdb Summary ===

# of expected passes 15
# of unexpected failures 1
# of expected failures 1
# of known failures 1
/usr/local/src/cvs/build/gdb/testsuite/../../gdb/gdb version
6.7.50-20071008-cvs -nx

The problem with fpc is that it does not work with cygwin,
because cygwin type directories are used, that fpc does not handle.
And I have no access to a linux machine here...

The gpc specific failure should disappear as soon as
I get the pascal_main_name patch in.
The known failure is about the string problem,
for which I have a fix (only partial) pending.
The expected failure is gpc specific too, and
comes from the wrong debug information generated.

By the way, is this dependent on the type of debug info generated?
Does stabs and dwarf both generate the wrong line number information?

Pierre Muller
GDB pascal language maintainer

> -----Original Message-----
> From: gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] On Behalf Of 'Daniel Jacobowitz'
> Sent: Monday, October 08, 2007 2:42 PM
> To: Pierre Muller
> Cc: gdb-patches@sourceware.org
> Subject: Re: [RFC] adding gdb.pascal subdir: updated version
>
> On Mon, Oct 08, 2007 at 02:17:54PM +0200, Pierre Muller wrote:
> > I am a bit lost in the numerous
> > changes that we introduced and I am
> > unsure that I have a current complete and up-to-date
> > patch, could you commit this change?
>
> Here's what I checked in. It has a KFAIL for the string type problem,
> an XFAIL for gpc's missing line number, and a failure for the GPC
> name-of-main issue (could have been a KFAIL but I was tired of waiting
> for gnats, and it looks like it will be fixed soon).
>
>
> --
> Daniel Jacobowitz
> CodeSourcery
>
> 2007-10-08 Pierre Muller <muller@ics.u-strasbg.fr>
> Daniel Jacobowitz <dan@codesourcery.com>
>
> * 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 8 Oct 2007 12:40: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.24
> diff -u -p -r1.24 configure
> --- configure 23 Sep 2007 13:56:56 -0000 1.24
> +++ configure 8 Oct 2007 12:40:12 -0000
> @@ -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
> Index: configure.ac
> ===================================================================
> RCS file: /cvs/src/src/gdb/testsuite/configure.ac,v
> retrieving revision 1.8
> diff -u -p -r1.8 configure.ac
> --- configure.ac 23 Sep 2007 13:56:56 -0000 1.8
> +++ configure.ac 8 Oct 2007 12:40:12 -0000
> @@ -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])
> 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 8 Oct 2007 12:40:12 -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 8 Oct 2007 12:40:12 -0000
> @@ -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
> <http://www.gnu.org/licenses/>.
> +
> +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 <implicit code>
> +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"
> 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 8 Oct 2007 12:40:12 -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 8 Oct 2007 12:40:12 -0000
> @@ -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
> <http://www.gnu.org/licenses/>.
> +
> +# 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
> +}
> 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 8 Oct 2007 12:40:12 -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
> <http://www.gnu.org/licenses/>.
> +
> +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."
> + }
> +}
> +