diff options
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/lib/ada.exp | 412 |
2 files changed, 416 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 2b2d4b4..25798b6 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-03-31 Joel Brobecker <brobecker@gnat.com> + + * lib/ada.exp: New file. + 2004-03-24 Daniel Jacobowitz <drow@mvista.com> * gdb.base/gdb1250.exp: Use runto {allow-pending}. diff --git a/gdb/testsuite/lib/ada.exp b/gdb/testsuite/lib/ada.exp new file mode 100644 index 0000000..67a507b --- /dev/null +++ b/gdb/testsuite/lib/ada.exp @@ -0,0 +1,412 @@ +load_lib libgloss.exp + +# FIXME:brobecker/2004-03-31: +# The following function should eventually be part of dejagnu. Even after +# this function becomes available in dejagnu, we will keep for a while +# a copy of this function here in order to avoid increasing the dejagnu +# version requirement. + +proc gdb_find_gnatmake {} { + global tool_root_dir + + set root "$tool_root_dir/gcc" + set GM "" + + if ![is_remote host] { + set file [lookfor_file $root gnatmake] + if { $file != "" } { + set GM "$file -I$root/ada/rts --GCC=$root/xgcc --GNATBIND=$root/gnatbind --GNATLINK=$root/gnatlink -cargs -B$root -largs --GCC=$root/xgcc -margs"; + } + } + + if {$GM == ""} { + set GM [transform gnatmake] + } + + return $GM +} + +# FIXME:brobecker/2004-03-31: +# The following function is a copy of the function of the same name provided +# by dejagnu, except that it has been modified to add support for building +# Ada programs. This copy is temporarily placed here until the changes +# are merged into the dejagnu official release. Once the changes are merged, +# we will likely keep this local copy for a while to avoid increasing the +# dejagnu version requirement. + +proc gdb_default_target_compile {source destfile type options} { + global target_triplet + global tool_root_dir + global CFLAGS_FOR_TARGET + global compiler_flags + + if { $destfile == "" && $type != "preprocess" && $type != "none" } { + error "Must supply an output filename for the compile to default_target_compile" + } + + set add_flags "" + set libs "" + set compiler_type "c" + set compiler "" + set ldflags "" + set dest [target_info name] + + if [info exists CFLAGS_FOR_TARGET] { + append add_flags " $CFLAGS_FOR_TARGET" + } + + if [info exists target_info(host,name)] { + set host [host_info name]; + } else { + set host "unix"; + } + + foreach i $options { + if { $i == "ada" } { + set compiler_type "ada" + if [board_info $dest exists adaflags] { + append add_flags " [target_info adaflags]" + } + # append add_flags " [gnatmake_include_flags]"; + if [board_info $dest exists gnatmake] { + set compiler [target_info gnatmake]; + } else { + set compiler [find_gnatmake]; + } + } + + if { $i == "c++" } { + set compiler_type "c++" + if [board_info $dest exists cxxflags] { + append add_flags " [target_info cxxflags]" + } + append add_flags " [g++_include_flags]"; + if [board_info $dest exists c++compiler] { + set compiler [target_info c++compiler]; + } else { + set compiler [find_g++]; + } + } + + if { $i == "f77" } { + set compiler_type "f77" + if [board_info $dest exists f77flags] { + append add_flags " [target_info f77flags]" + } +# append add_flags " [f77_include_flags]" + if [board_info $dest exists f77compiler] { + set compiler [target_info f77compiler] + } else { + set compiler [find_g77] + } + } + + if [regexp "^dest=" $i] { + regsub "^dest=" $i "" tmp + if [board_info $tmp exists name] { + set dest [board_info $tmp name]; + } else { + set dest $tmp; + } + } + if [regexp "^compiler=" $i] { + regsub "^compiler=" $i "" tmp + set compiler $tmp + } + if [regexp "^additional_flags=" $i] { + regsub "^additional_flags=" $i "" tmp + append add_flags " $tmp" + } + if [regexp "^ldflags=" $i] { + regsub "^ldflags=" $i "" tmp + append ldflags " $tmp" + } + if [regexp "^libs=" $i] { + regsub "^libs=" $i "" tmp + append libs " $tmp" + } + if [regexp "^incdir=" $i] { + regsub "^incdir=" $i "-I" tmp + append add_flags " $tmp" + } + if [regexp "^libdir=" $i] { + regsub "^libdir=" $i "-L" tmp + append add_flags " $tmp" + } + if [regexp "^ldscript=" $i] { + regsub "^ldscript=" $i "" ldscript + } + if [regexp "^redirect=" $i] { + regsub "^redirect=" $i "" redirect + } + if [regexp "^optimize=" $i] { + regsub "^optimize=" $i "" optimize + } + if [regexp "^timeout=" $i] { + regsub "^timeout=" $i "" timeout + } + } + + if [board_info $host exists cflags_for_target] { + append add_flags " [board_info $host cflags_for_target]"; + } + + global CC_FOR_TARGET + global CXX_FOR_TARGET + global F77_FOR_TARGET + global GNATMAKE_FOR_TARGET + + if [info exists CC_FOR_TARGET] { + if { $compiler == "" } { + set compiler $CC_FOR_TARGET + } + } + + if [info exists CXX_FOR_TARGET] { + if { $compiler_type == "c++" } { + set compiler $CXX_FOR_TARGET + } + } + + if [info exists F77_FOR_TARGET] { + if { $compiler_type == "f77" } { + set compiler $F77_FOR_TARGET + } + } + + if [info exists GNATMAKE_FOR_TARGET] { + if { $compiler_type == "ada" } { + set compiler $GNATMAKE_FOR_TARGET + } + } + + if { $compiler == "" } { + set compiler [board_info $dest compiler]; + if { $compiler == "" } { + return "default_target_compile: No compiler to compile with"; + } + } + + if ![is_remote host] { + if { [which $compiler] == 0 } { + return "default_target_compile: Can't find $compiler." + } + } + + if {$type == "object"} { + append add_flags " -c" + } + + if { $type == "preprocess" } { + append add_flags " -E" + } + + if { $type == "assembly" } { + append add_flags " -S" + } + + if [board_info $dest exists cflags] { + append add_flags " [board_info $dest cflags]" + } + + if { $type == "executable" } { + # This must be added here. + # if [board_info $dest exists ldscript] { + # append add_flags " [board_info $dest ldscript]" + # } + + if [board_info $dest exists ldflags] { + append add_flags " [board_info $dest ldflags]" + } + if { $compiler_type == "c++" } { + append add_flags " [g++_link_flags]"; + } + if [isnative] { + # This is a lose. + catch "glob -nocomplain $tool_root_dir/libstdc++/libstdc++.so* $tool_root_dir/libstdc++/libstdc++.sl" tmp + if { ${tmp} != "" } { + if [regexp ".*solaris2.*" $target_triplet] { + # Solaris 2 + append add_flags " -R$tool_root_dir/libstdc++" + } elseif [regexp ".*(osf|irix5|linux).*" $target_triplet] { + # OSF/1 or Irix5 + append add_flags " -Wl,-rpath,$tool_root_dir/libstdc++" + } elseif [regexp ".*hppa.*" $target_triplet] { + # HP/UX + append add_flags " -Wl,-a,shared_archive" + } + } + } + } + + if ![info exists ldscript] { + set ldscript [board_info $dest ldscript] + } + + 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" + } + } + } + + if [info exists optimize] { + append add_flags " $optimize"; + } + + if { $type == "executable" } { + append add_flags " $ldflags" + foreach x $libs { + if [file exists $x] { + append source " $x" + } else { + append add_flags " $x"; + } + } + + if [board_info $dest exists libs] { + append add_flags " [board_info $dest libs]" + } + + # This probably isn't such a good idea, but it avoids nasty + # hackiness in the testsuites. + # The math library must be linked in before the C library. The C + # library is linked in by the linker script, so this must be before + # the linker script. + if [board_info $dest exists mathlib] { + append add_flags " [board_info $dest mathlib]" + } else { + append add_flags " -lm" + } + + # This must be added here. + append add_flags " $ldscript"; + + if [board_info $dest exists remote_link] { + # Relink option. + append add_flags " -Wl,-r" + } + if [board_info $dest exists output_format] { + append add_flags " -Wl,-oformat,[board_info $dest output_format]"; + } + } + + if [board_info $dest exists multilib_flags] { + append add_flags " [board_info $dest multilib_flags]"; + } + + verbose "doing compile" + + set sources "" + if [is_remote host] { + foreach x $source { + set file [remote_download host $x]; + if { $file == "" } { + warning "Unable to download $x to host." + return "Unable to download $x to host." + } else { + append sources " $file"; + } + } + } else { + set sources $source + } + + if [is_remote host] { + append add_flags " -o a.out" + remote_file host delete a.out; + } else { + if { $destfile != "" } { + append add_flags " -o $destfile"; + } + } + + # This is obscure: we put SOURCES at the end when building an + # object, because otherwise, in some situations, libtool will + # become confused about the name of the actual source file. + if {$type == "object"} { + set opts "$add_flags $sources" + } else { + set opts "$sources $add_flags" + } + + if [is_remote host] { + if [host_info exists use_at] { + set fid [open "atfile" "w"]; + puts $fid "$opts"; + close $fid; + set opts "@[remote_download host atfile]" + remote_file build delete atfile + } + } + + verbose "Invoking the compiler as $compiler $opts" 2 + + if [info exists redirect] { + verbose "Redirecting output to $redirect" 2 + set status [remote_exec host "$compiler $opts" "" "" $redirect]; + } else { + if [info exists timeout] { + verbose "Setting timeout to $timeout" 2 + set status [remote_exec host "$compiler $opts" "" "" "" $timeout]; + } else { + set status [remote_exec host "$compiler $opts"]; + } + } + + set compiler_flags $opts + if [is_remote host] { + remote_upload host a.out $destfile; + remote_file host delete a.out; + } + set comp_output [prune_warnings [lindex $status 1]]; + regsub "^\[\r\n\]+" $comp_output "" comp_output; + if { [lindex $status 0] != 0 } { + verbose -log "compiler exited with status [lindex $status 0]"; + } + if { [lindex $status 1] != "" } { + verbose -log "output is:\n[lindex $status 1]" 2; + } + if { [lindex $status 0] != 0 && "${comp_output}" == "" } { + set comp_output "exit status is [lindex $status 0]"; + } + return ${comp_output}; +} + +# See if the version of dejaGNU being used to run the testsuite is +# recent enough to contain support for building Ada programs or not. +# If not, then use the functions above in place of the ones provided +# by dejaGNU. This is only temporary (brobecker/2004-03-31). + +if {[info procs find_gnatmake] == ""} { + proc find_gnatmake { } { return [gdb_find_gnatmake] } + proc default_target_compile { source destfile type options } { + return [gdb_default_target_compile $source $destfile $type $options] + } +} + +# Compile some Ada code. + +proc gdb_compile_ada {source dest type options} { + + set objdir [file dirname $dest] + + append options " ada" + append options " additional_flags=-P$objdir/gnat_ada" + + set result [target_compile $source $dest $type $options] + + # The Ada build always produces some output, even when the build + # succeeds. Thus, we can not use the output the same way we do in + # gdb_compile to determine whether the build has succeeded or not. + # We therefore simply check whether the dest file has been created + # or not. Unless not present, the build has succeeded. + if ![file exists $dest] { + verbose "Ada compilation failed: $result" + return "Ada compilation failed." + } +} + |