mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
422 lines
12 KiB
Plaintext
422 lines
12 KiB
Plaintext
# 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
|
||
}
|
||
}
|