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

422 lines
12 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) 2004-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 Rob Savoye (rob@cygnus.com)
# Many modifications by Jeffrey Wheat (cassidy@cygnus.com)
# With modifications by Mike Stump <mrs@cygnus.com>.
#
# obj-c++ support library routines
#
load_lib prune.exp
load_lib gcc-defs.exp
load_lib timeout.exp
load_lib target-libpath.exp
#
# OBJCXX_UNDER_TEST is the compiler under test.
#
set gpp_compile_options ""
#
# obj-c++_version -- extract and print the version number of the compiler
#
proc obj-c++_version { } {
global OBJCXX_UNDER_TEST
obj-c++_init
# Ignore any arguments after the command.
set compiler [lindex $OBJCXX_UNDER_TEST 0]
# Verify that the compiler exists.
if { [is_remote host] || [which $compiler] != 0 } then {
set tmp [remote_exec host "$compiler -v"]
set status [lindex $tmp 0];
set output [lindex $tmp 1];
regexp " version \[^\n\r\]*" $output version
if { $status == 0 && [info exists version] } then {
if [is_remote host] {
clone_output "$compiler $version\n"
} else {
clone_output "[which $compiler] $version\n"
}
} else {
clone_output "Couldn't determine version of [which $compiler]\n"
}
} else {
# Compiler does not exist (this should have already been detected)
warning "$compiler does not exist"
}
}
#
# obj-c++_include_flags -- provide new version of obj-c++_include_flags
# (originally from libgloss.exp) which knows about the gcc tree structure
#
proc obj-c++_include_flags { paths } {
global srcdir
global HAVE_LIBSTDCXX_V3
global TESTING_IN_BUILD_TREE
set flags ""
if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
return "${flags}"
}
set gccpath ${paths}
set odir [lookfor_file ${gccpath} libstdc++-v3]
if { ${odir} != "" } {
append flags [exec sh ${odir}/scripts/testsuite_flags --build-includes]
}
return "$flags"
}
#
# obj-c++_link_flags -- provide new version of obj-c++_link_flags
# (originally from libgloss.exp) which knows about the gcc tree structure.
#
proc obj-c++_link_flags { paths } {
global rootme
global srcdir
global ld_library_path
global OBJCXX_UNDER_TEST
global shlib_ext
set gccpath ${paths}
set libio_dir ""
set flags ""
set ld_library_path "."
set shlib_ext [get_shlib_extension]
verbose "shared lib extension: $shlib_ext"
# We need to add options to locate libobjc/libobjc-gnu 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 != "" } {
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"
}
if [file exists "${gccpath}/libiberty/libiberty.a"] {
append flags " -L${gccpath}/libiberty "
}
if [file exists "${gccpath}/librx/librx.a"] {
append flags " -L${gccpath}/librx "
}
set objcpath "[get_multilibs]"
set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.a]
if { $libobjc_dir == ""} {
set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
}
# Now check if we have a shared only build.
if { $libobjc_dir == ""} {
set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.${shlib_ext}]
if { $libobjc_dir == ""} {
set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.${shlib_ext}]
}
}
verbose "libobjc_dir: $libobjc_dir"
if { $libobjc_dir != "" } {
set libobjc_dir [file dirname ${libobjc_dir}]
if { $target_wants_B_option } {
append flags "-B${libobjc_dir} "
} else {
append flags "-L${libobjc_dir} "
}
append ld_library_path ":${libobjc_dir}"
}
append ld_library_path \
[gcc-set-multilib-library-path $OBJCXX_UNDER_TEST]
} else {
global tool_root_dir;
set libgpp [lookfor_file ${tool_root_dir} libg++];
if { $libgpp != "" } {
append flags "-L${libgpp} ";
append ld_library_path ":${libgpp}"
}
set libstdcpp [lookfor_file ${tool_root_dir} libstdc++];
if { $libstdcpp != "" } {
if { $target_wants_B_option } {
append flags "-B${libstdcpp} "
} else {
append flags "-L${libstdcpp} "
}
append ld_library_path ":${libstdcpp}"
}
set libiberty [lookfor_file ${tool_root_dir} libiberty];
if { $libiberty != "" } {
append flags "-L${libiberty} ";
}
set librx [lookfor_file ${tool_root_dir} librx];
if { $librx != "" } {
append flags "-L${librx} ";
}
}
set_ld_library_path_env_vars
return "$flags"
}
#
# obj-c++_init -- called at the start of each subdir of tests
#
proc obj-c++_init { args } {
global subdir
global gpp_initialized
global base_dir
global tmpdir
global libdir
global gluefile wrap_flags;
global objdir srcdir
global ALWAYS_OBJCXXFLAGS
global TOOL_EXECUTABLE TOOL_OPTIONS
global OBJCXX_UNDER_TEST
global TESTING_IN_BUILD_TREE
global gcc_warning_prefix
global gcc_error_prefix
global TEST_ALWAYS_FLAGS
if ![info exists OBJCXX_UNDER_TEST] then {
if [info exists TOOL_EXECUTABLE] {
set OBJCXX_UNDER_TEST $TOOL_EXECUTABLE;
} else {
if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
set OBJCXX_UNDER_TEST [transform c++]
} else {
set OBJCXX_UNDER_TEST [findfile $base_dir/../../xg++ "$base_dir/../../xg++ -B$base_dir/../../" [findfile $base_dir/xg++ "$base_dir/xg++ -B$base_dir/" [transform c++]]]
}
}
}
# Bleah, nasty. Bad taste.
if [ishost "*-dos-*" ] {
regsub "c\\+\\+" "$OBJCXX_UNDER_TEST" "gcc" OBJCXX_UNDER_TEST
}
if ![is_remote host] {
if { [which $OBJCXX_UNDER_TEST] == 0 } then {
perror "OBJCXX_UNDER_TEST ($OBJCXX_UNDER_TEST) does not exist"
exit 1
}
}
if ![info exists tmpdir] {
set tmpdir "/tmp"
}
if [info exists gluefile] {
unset gluefile
}
obj-c++_maybe_build_wrapper "${tmpdir}/obj-c++-testglue.o" "-fexceptions"
set ALWAYS_OBJCXXFLAGS ""
# 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] {
lappend ALWAYS_OBJCXXFLAGS "additional_flags=$TEST_ALWAYS_FLAGS"
}
if ![is_remote host] {
if [info exists TOOL_OPTIONS] {
lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs ${TOOL_OPTIONS}] ]";
lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs ${TOOL_OPTIONS}] ]";
} else {
lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs] ]";
lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs] ]";
}
}
if [info exists TOOL_OPTIONS] {
lappend ALWAYS_OBJCXXFLAGS "additional_flags=$TOOL_OPTIONS";
}
# Make sure that lines are not wrapped. That can confuse the
# error-message parsing machinery.
lappend ALWAYS_OBJCXXFLAGS "additional_flags=-fmessage-length=0"
set gcc_warning_prefix "warning:"
set gcc_error_prefix "(fatal )?error:"
verbose -log "ALWAYS_OBJCXXFLAGS set to $ALWAYS_OBJCXXFLAGS"
verbose "obj-c++ is initialized" 3
}
#
# obj-c++_target_compile -- compile a source file
#
proc obj-c++_target_compile { source dest type options } {
global tmpdir
global srcdir
global gpp_compile_options
global gluefile wrap_flags
global ALWAYS_OBJCXXFLAGS
global OBJCXX_UNDER_TEST
global shlib_ext
set shlib_ext [get_shlib_extension]
verbose "input-options: $options" 4
# We have to figure out which runtime will be used on darwin because
# we need to add the include path for the gnu runtime if that is in
# use.
# First, set the default...
if { [istarget *-*-darwin*] } {
set nextruntime 1
} else {
set nextruntime 0
}
verbose "initial next runtime state : $nextruntime" 2
# Next, see if we define the option in dg-options...
foreach opt $options {
if [regexp ".*-fnext-runtime.*" $opt] {
set nextruntime 1
}
if [regexp ".*-fgnu-runtime.*" $opt] {
set nextruntime 0
}
}
verbose "next runtime state after dg opts: $nextruntime" 2
set tgt [target_info name]
if [board_info $tgt exists multilib_flags] {
set lb [board_info $tgt multilib_flags]
verbose "board multilib_flags $lb" 2
foreach opt $lb {
if [regexp ".*-fnext-runtime.*" $opt] {
set nextruntime 1
}
if [regexp ".*-fgnu-runtime.*" $opt] {
set nextruntime 0
}
}
}
verbose "next runtime state after any multilib opts: $nextruntime" 2
lappend options "libs=-lobjc"
if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
lappend options "libs=${gluefile}"
lappend options "ldflags=${wrap_flags}"
}
# If we have built libobjc along with the compiler, point the test harness
# at it (and associated headers).
set objcpath "[get_multilibs]"
set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.a]
if { $libobjc_dir == ""} {
set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
}
if { $libobjc_dir == ""} {
set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.${shlib_ext}]
if { $libobjc_dir == ""} {
set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.${shlib_ext}]
}
}
if { $libobjc_dir != "" } {
# If we are using the gnu runtime, add its includes.
if { $nextruntime == 0 } {
set objc_include_dir "${srcdir}/../../libobjc"
lappend options "additional_flags=-I${objc_include_dir}"
}
}
lappend options "additional_flags=[libio_include_flags]"
lappend options "compiler=$OBJCXX_UNDER_TEST";
lappend options "timeout=[timeout_value]"
set options [concat $gpp_compile_options $options]
set options [concat "$ALWAYS_OBJCXXFLAGS" $options];
set options [dg-additional-files-options $options $source $dest $type]
set result [target_compile $source $dest $type $options]
return $result
}
#
# ${tool}_option_help
#
proc ${tool}_option_help { } {
send_user " --additional_options,OPTIONS\t\tUse OPTIONS to compile the testcase files. OPTIONS should be comma-separated.\n"
}
#
# ${tool}_option_proc
#
proc ${tool}_option_proc { option } {
if [regexp "^--additional_options," $option] {
global gpp_compile_options
regsub "--additional_options," $option "" option
foreach x [split $option ","] {
lappend gpp_compile_options "additional_flags=$x"
}
return 1;
} else {
return 0
}
}