Files
gcc-reflection/gcc/testsuite/lib/gm2.exp
2026-01-02 09:56:11 +01:00

648 lines
17 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Copyright (C) 2003-2026 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
# <http://www.gnu.org/licenses/>.
# 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"
}
# We need to add options to locate gm2 libs and libstdc++
# Usually '-L' options are added to point to the relevant directories for
# the uninstalled libraries.
# In cases where libraries are available as both shared and convenience
# some additional checks are made.
# For some targets -static-xxxx options are handled by specs substitution
# and need a '-B' option rather than '-L'. For Darwin, when embedded
# runpaths are in use (the default for all versions after macOS 10.11),
# '-B' is also needed to provide the runpath.
# When '-B' is used, this results in a '-L' for each path that exists (so
# that appending a '-L' as well is a needless duplicate). There are also
# cases where tools warn for duplicates, leading to spurious fails.
# Therefore the objective of the code below is to add just one '-L' or
# '-B' for each of the libraries.
set target_wants_B_option 0
if { [istarget *-*-darwin9* ] || [istarget *-*-darwin\[12\]* ] } {
set target_wants_B_option 1
}
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++"
}
# Look for libstdc++.<a,${shlib_ext}>.
if { [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"] \
|| [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.${shlib_ext}"] } {
if { $target_wants_B_option } {
append flags " -B${gccpath}/libstdc++-v3/src/.libs "
} else {
append flags " -L${gccpath}/libstdc++-v3/src/.libs "
}
append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
}
# Here we are forcing the static libraries, with complete paths so
# there's no -L/-B logic needed
# 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=-
lappend args -fno-wideset
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}
}