# Copyright (C) 2003-2024 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 GCC; see the file COPYING3. If not see # . # This file was written by Gaius Mulley (gaius.mulley@southwales.ac.uk) # for GNU Modula-2. # we want to use libgloss so we can get find_gcc. load_lib libgloss.exp load_lib prune.exp load_lib gcc-defs.exp load_lib target-libpath.exp load_lib timeout.exp # # GCC_UNDER_TEST is the compiler under test. # # # default_gcc_version -- extract and print the version number of the compiler # proc default_gcc_version { } { global GCC_UNDER_TEST gm2_init # ignore any arguments after the command set compiler [lindex $GCC_UNDER_TEST 0] if ![is_remote host] { set compiler_name [which $compiler] } else { set compiler_name $compiler } # verify that the compiler exists if { $compiler_name != 0 } then { set tmp [remote_exec host "$compiler --version"] set status [lindex $tmp 0] set output [lindex $tmp 1] regexp "version.*$" $output version if { $status == 0 && [info exists version] } then { clone_output "$compiler_name $version\n" } else { clone_output "Couldn't determine version of $compiler_name: $output\n" } } else { # compiler does not exist (this should have already been detected) warning "$compiler does not exist" } } # # gcc_version -- Call default_gcc_version, so we can override it if needed. # proc gcc_version { } { default_gcc_version } # # gm2_init -- called at the start of each .exp script. # # There currently isn't much to do, but always using it allows us to # make some enhancements without having to go back and rewrite the scripts. # set gm2_initialized 0 set gm2_compile_method "default" set gm2_link_path "" set gm2_link_libraries "m2pim m2iso" set gm2_link_objects "" proc gm2_set_compile_method { arg } { global gm2_compile_method send_log "********************************************\n" send_log "**** setting gm2_compile_method to $arg ****\n" send_log "********************************************\n" set gm2_compile_method $arg } proc gm2_init { args } { global tmpdir global objdir global rootme global base_dir global tool_root_dir global gluefile wrap_flags global gm2_initialized global GCC_UNDER_TEST global TOOL_EXECUTABLE global gm2_link_libraries global gm2_link_objects global gm2_link_path global HAVE_LIBSTDCXX_V3 if { $gm2_initialized == 1 } { return } set gm2_link_objects "" set GCC_UNDER_TEST [lookfor_file $rootme gm2] append GCC_UNDER_TEST " " -B[file dirname $rootme]/gcc " " ${args} append GCC_UNDER_TEST " " -fno-diagnostics-show-caret append GCC_UNDER_TEST " " -fno-diagnostics-show-line-numbers append GCC_UNDER_TEST " " -fdiagnostics-color=never send_log "GCC_UNDER_TEST is ${GCC_UNDER_TEST}\n" if ![info exists tmpdir] then { set tmpdir /tmp } if {[target_info needs_status_wrapper] != "" && \ [target_info needs_status_wrapper] != "0" && \ ![info exists gluefile]} { set gluefile ${tmpdir}/gcc-testglue.o set result [build_wrapper $gluefile] if { $result != "" } { set gluefile [lindex $result 0] set wrap_flags [lindex $result 1] } else { unset gluefile } } set gm2_link_path "[gm2_link_flags [get_multilibs]]" verbose $gm2_link_path 1 } # # gm2_target_compile_default -- compile a source file # proc gm2_target_compile_default { source dest type options } { global gluefile wrap_flags global GCC_UNDER_TEST global TOOL_OPTIONS global TEST_ALWAYS_FLAGS global gm2_link_objects global gm2_link_libraries global gm2_link_path if {[target_info needs_status_wrapper] != "" && \ [target_info needs_status_wrapper] != "0" && \ [info exists gluefile] } { lappend options "libs=${gluefile}" lappend options "ldflags=$wrap_flags" } # TEST_ALWAYS_FLAGS are flags that should be passed to every # compilation. They are passed first to allow individual # tests to override them. if [info exists TEST_ALWAYS_FLAGS] { set options [concat "{additional_flags=$TEST_ALWAYS_FLAGS}" $options] } global TEST_EXTRA_LIBS if [info exists TEST_EXTRA_LIBS] { lappend options "ldflags=$TEST_EXTRA_LIBS" } if [target_info exists gcc,stack_size] { lappend options "additional_flags=-DSTACK_SIZE=[target_info gcc,stack_size]" } if [target_info exists gcc,no_trampolines] { lappend options "additional_flags=-DNO_TRAMPOLINES" } if [target_info exists gcc,no_label_values] { lappend options "additional_flags=-DNO_LABEL_VALUES" } if [info exists TOOL_OPTIONS] { lappend options "additional_flags=$TOOL_OPTIONS" } if [istarget *-*-solaris2*] { lappend options "ldflags=-lnsl -lsocket" } if [istarget "powerpc-*-*"] { lappend options "-mabi=ieeelongdouble" } lappend options "timeout=[timeout_value]" lappend options "compiler=$GCC_UNDER_TEST" # puts stderr "options = $options\n" # puts stderr "***** target_compile: $source $dest $type $options\n" return [target_compile $source $dest $type $options] } # # gm2_target_compile -- compile a source file # proc gm2_target_compile { source dest type options } { global gm2_compile_method return [gm2_target_compile_${gm2_compile_method} $source $dest $type $options] } # # gm2_link_lib - allows tests to specify link libraries. # This _must_ be called before gm2_init. # proc gm2_link_lib { libraries } { global gm2_link_libraries set gm2_link_libraries $libraries } # # gm2_link_obj - allows tests to specify link with objects. # proc gm2_link_obj { objects } { global gm2_link_objects set gm2_link_objects $objects } # # gm2_link_flags - detects the whereabouts of libraries (-lstdc++). # proc gm2_link_flags { paths } { global srcdir global ld_library_path global gccpath global gm2_link_libraries set gccpath ${paths} set libio_dir "" set flags "" set ld_library_path "." set shlib_ext [get_shlib_extension] verbose "shared lib extension: $shlib_ext" if [istarget "powerpc-*-*"] { lappend flags "-mabi=ieeelongdouble" } if { $gccpath == "" } { global tool_root_dir set libstdcpp [lookfor_file ${tool_root_dir} libstdc++] if { $libstdcpp != "" } { append flags "-L${libstdcpp} " append ld_library_path ":${libstdcpp}" } } else { if [file exists "${gccpath}/lib/libstdc++.a"] { append ld_library_path ":${gccpath}/lib" } if [file exists "${gccpath}/libstdc++/libstdc++.a"] { append flags "-L${gccpath}/libstdc++ " append ld_library_path ":${gccpath}/libstdc++" } if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"] { append flags " -L${gccpath}/libstdc++-v3/src/.libs " append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs" } # Look for libstdc++.${shlib_ext}. if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.${shlib_ext}"] { append flags " -L${gccpath}/libstdc++-v3/src/.libs " append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs" } # puts stderr "${gm2_link_libraries} before foreach" foreach d [list {*}${gm2_link_libraries}] { # puts stderr "${d} XXXX" send_log "ld_library_path was ${ld_library_path}\n" send_log "looking for ${gccpath}/lib${d}/.libs/lib${d}.a\n" if [file exists "${gccpath}/libgm2/lib${d}/.libs/lib${d}.a"] { send_log "good found ${gccpath}/libgm2/lib${d}/.libs/lib${d}.a\n" # append flags " -L${gccpath}/libgm2/lib${d}/.libs -l${d}" append flags " ${gccpath}/libgm2/lib${d}/.libs/lib${d}.a" append ld_library_path ":${gccpath}/libgm2/lib${d}/.libs" } send_log "ld_library_path is ${ld_library_path}\n" } global GCC_UNDER_TEST append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST] } set_ld_library_path_env_vars return "$flags" } # # gm2_init_pimx - set the default libraries to choose PIM and then ISO. # choose Modula-2, dialect. # # proc gm2_init_pimx { dialect paths args } { global srcdir global gccpath set gm2src ${srcdir}/../m2 send_log "srcdir is $srcdir\n" send_log "gccpath is $gccpath\n" send_log "gm2src is $gm2src\n" set theIpath -fm2-pathname=m2pim lappend theIpath -I${gccpath}/libgm2/libm2pim lappend theIpath -fm2-pathname=m2log lappend theIpath -I${gm2src}/gm2-libs-log # NOTE: lappend theIpath -fm2-pathname=m2pim lappend theIpath -I${gm2src}/gm2-libs set theLpath -L${gccpath}/libgm2/libm2pim/.libs lappend theIpath -fm2-pathname=m2iso lappend theIpath -I${gccpath}/libgm2/libm2iso lappend theIpath -I${gm2src}/gm2-libs-iso lappend theLpath -L${gccpath}/libgm2/libm2iso/.libs lappend theIpath -fm2-pathname=- foreach p $paths { lappend theIpath -I$p } lappend theIpath -fm2-pathname=- gm2_link_lib "m2pim m2iso" lappend args -fno-libs=- gm2_init {*}${theIpath} {*}${dialect} {*}${theLpath} {*}${args} } # # gm2_init_pim - set the default libraries to choose PIM and then ISO. # # proc gm2_init_pim { paths args } { gm2_init_pimx -fpim $paths {*}${args} } # # gm2_init_pim2 - set the default libraries to choose PIM and then ISO. # It uses the PIM2 dialect. # proc gm2_init_pim2 { paths args } { gm2_init_pimx -fpim2 $paths {*}${args} } # # gm2_init_pim3 - set the default libraries to choose PIM and then ISO. # It uses the PIM3 dialect. # proc gm2_init_pim3 { paths args } { gm2_init_pimx -fpim3 $paths {*}${args} } # # gm2_init_pim4 - set the default libraries to choose PIM and then ISO. # It uses the PIM4 dialect. # proc gm2_init_pim4 { paths args } { gm2_init_pimx -fpim4 $paths {*}${args} } # # gm2_init_iso - set the default libraries to choose ISO and then PIM. # proc gm2_init_iso { paths args } { global srcdir global gccpath set gm2src ${srcdir}/../m2 set theIpath -fm2-pathname=m2iso lappend theIpath -I${gccpath}/libgm2/libm2iso lappend theIpath -I${gm2src}/gm2-libs-iso set theLpath -L${gccpath}/libgm2/libm2iso/.libs lappend theIpath -fm2-pathname=m2pim lappend theIpath -I${gccpath}/libgm2/libm2pim lappend theIpath -fm2-pathname=m2log lappend theIpath -I${gm2src}/gm2-libs-log # NOTE: lappend theIpath -fm2-pathname=m2pim lappend theIpath -I${gm2src}/gm2-libs lappend theLpath -L${gccpath}/libgm2/libm2pim/.libs lappend theIpath -fm2-pathname=m2cor lappend theIpath -I${gccpath}/libgm2/libm2cor lappend theIpath -I${gm2src}/gm2-libs-coroutines lappend theLpath -L${gccpath}/libgm2/libm2cor/.libs lappend theIpath -fm2-pathname=- foreach p $paths { lappend theIpath -I$p } lappend theIpath -fm2-pathname=- gm2_link_lib "m2iso m2pim m2cor" lappend args -fno-libs=- gm2_init {*}${theIpath} -fiso {*}${theLpath} {*}${args} } # # gm2_init_ulm - set the default libraries to choose the ULM and PIM libraries. # proc gm2_init_ulm { paths args } { global srcdir global gccpath set gm2src ${srcdir}/../m2 set theIpath -fm2-pathname=m2ulm lappend theIpath -I${gccpath}/libgm2/libm2ulm lappend theIpath -I${gm2src}/ulm-lib-gm2/std lappend theIpath -I${gm2src}/ulm-lib-gm2/sys set theLpath -L${gccpath}/libgm2/libm2ulm/.libs lappend theIpath -fm2-pathname=m2pim lappend theIpath -I${gccpath}/libgm2/libm2pim lappend theIpath -fm2-pathname=m2log lappend theIpath -I${gm2src}/gm2-libs-log # NOTE: lappend theIpath -fm2-pathname=m2pim lappend theIpath -I${gm2src}/gm2-libs lappend theLpath -L${gccpath}/libgm2/libm2pim/.libs lappend theIpath -fm2-pathname=- foreach p $paths { lappend theIpath -I$p } lappend theIpath -fm2-pathname=- gm2_link_lib "m2ulm m2pim" lappend args -fno-libs=- gm2_init {*}${theIpath} -fpim {*}${theLpath} {*}${args} } # # gm2_init_log - set the default libraries to choose LOG and then PIM. # # proc gm2_init_log { paths args } { global srcdir global gccpath set gm2src ${srcdir}/../m2 send_log "srcdir is $srcdir\n" send_log "gccpath is $gccpath\n" send_log "gm2src is $gm2src\n" # FIXME: this seems to interleave the library defs. set theIpath -fm2-pathname=m2log lappend theIpath -I${gccpath}/libgm2/libm2log lappend theIpath -I${gm2src}/gm2-libs-log set theLpath -L${gccpath}/libgm2/libm2log/.libs lappend theIpath -fm2-pathname=m2pim lappend theIpath -I${gccpath}/libgm2/libm2pim lappend theIpath -I${gm2src}/gm2-libs lappend theLpath -L${gccpath}/libgm2/libm2pim/.libs lappend theIpath -fm2-pathname=m2iso lappend theIpath -I${gccpath}/libgm2/libm2iso lappend theIpath -I${gm2src}/gm2-libs-iso # ??? lappend theIpath -I${gm2src}/gm2-libs lappend theLpath -L${gccpath}/libgm2/libm2iso/.libs lappend theIpath -fm2-pathname=- foreach p $paths { lappend theIpath -I$p } lappend theIpath -fm2-pathname=- gm2_link_lib "m2log m2pim m2iso" lappend args -fno-libs=- gm2_init {*}${theIpath} -fpim {*}${theLpath} {*}${args} } # # gm2_init_cor - set the default libraries to choose COR and then PIM. # # proc gm2_init_cor { paths args } { global srcdir global gccpath global gm2_link_libraries set gm2src ${srcdir}/../m2 send_log "srcdir is $srcdir\n" send_log "gccpath is $gccpath\n" send_log "gm2src is $gm2src\n" set theIpath -fm2-pathname=m2cor lappend theIpath -I${gccpath}/libgm2/libm2cor lappend theIpath -I${gm2src}/gm2-libs-coroutines set theLpath -L${gccpath}/libgm2/libm2cor/.libs lappend theIpath -fm2-pathname=m2pim lappend theIpath -I${gccpath}/libgm2/libm2pim lappend theIpath -fm2-pathname=m2log lappend theIpath -I${gm2src}/gm2-libs-log lappend theIpath -fm2-pathname=m2pim lappend theLpath -L${gccpath}/libgm2/libm2pim/.libs lappend theIpath -fm2-pathname=m2log lappend theIpath -I${gccpath}/libgm2/libm2log lappend theIpath -fm2-pathname=m2pim lappend theIpath -I${gm2src}/gm2-libs lappend theIpath -fm2-pathname=m2log lappend theLpath -L${gccpath}/libgm2/libm2log/.libs lappend theIpath -fm2-pathname=m2iso lappend theIpath -I${gccpath}/libgm2/libm2iso lappend theIpath -I${gm2src}/gm2-libs-iso lappend theLpath -L${gccpath}/libgm2/libm2iso/.libs lappend theIpath -fm2-pathname=- foreach p $paths { lappend theIpath -I$p } lappend theIpath -fm2-pathname=- gm2_link_lib "m2cor m2pim m2log m2iso" append args " -fno-libs=- " gm2_init {*}${theIpath} -fpim {*}${theLpath} {*}${args} } # # gm2_init_minx - set the default libraries to choose MIN library and # choose Modula-2, dialect. # # proc gm2_init_minx { dialect paths args } { global srcdir global gccpath set gm2src ${srcdir}/../m2 send_log "srcdir is $srcdir\n" send_log "gccpath is $gccpath\n" send_log "gm2src is $gm2src\n" set theIpath -fm2-pathname=m2min lappend theIpath -I${gccpath}/libgm2/libm2min lappend theIpath -I${gm2src}/gm2-libs-min set theLpath -L${gccpath}/libgm2/libm2min/.libs lappend theIpath -fm2-pathname=- foreach p $paths { lappend theIpath -I$p } lappend theIpath -fm2-pathname=- gm2_link_lib "m2min" lappend args -fno-exceptions lappend args -fno-libs=- gm2_init {*}${theIpath} {*}${dialect} {*}${theLpath} {*}${args} } # # gm2_init_min - set the default libraries to choose MIN libraries # and pim dialect. # proc gm2_init_min { paths args } { gm2_init_minx -fpim $paths {*}${args} }