123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 |
- # Copyright (C) 1992-2015 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)
- # Currently maintained by Doug Evans (dje@cygnus.com)
- # This file is loaded by the tool init file (eg: unix.exp). It provides
- # default definitions for objc_start, etc. and other supporting cast members.
- # These globals are used by objc_start if no compiler arguments are provided.
- # They are also used by the various testsuites to define the environment:
- # where to find stdio.h, libc.a, etc.
- load_lib libgloss.exp
- load_lib prune.exp
- load_lib gcc-defs.exp
- load_lib timeout.exp
- load_lib target-libpath.exp
- load_lib target-utils.exp
- #
- # OBJC_UNDER_TEST is the compiler under test.
- #
- #
- # default_objc_version -- extract and print the version number of the compiler
- #
- proc default_objc_version { } {
- global OBJC_UNDER_TEST
- objc_init
- # Ignore any arguments after the command.
- set compiler [lindex $OBJC_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 -v"]
- set status [lindex $tmp 0]
- set output [lindex $tmp 1]
- regexp " version \[^\n\r\]*" $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"
- }
- }
- #
- # Call objc_version. We do it this way so we can override it if needed.
- #
- proc objc_version { } {
- default_objc_version
- }
- #
- # objc_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 objc_initialized 0
- proc objc_init { args } {
- global rootme
- global tmpdir
- global libdir
- global gluefile wrap_flags
- global objc_initialized
- global OBJC_UNDER_TEST
- global TOOL_EXECUTABLE
- global objc_libgcc_s_path
- global gcc_warning_prefix
- global gcc_error_prefix
- # We set LC_ALL and LANG to C so that we get the same error messages as
- # expected.
- setenv LC_ALL C
- setenv LANG C
- # Many hosts now default to a non-ASCII C locale, however, so
- # they can set a charset encoding here if they need.
- if { [ishost "*-*-cygwin*"] } {
- setenv LC_ALL C.ASCII
- setenv LANG C.ASCII
- }
- if { $objc_initialized == 1 } { return; }
- if ![info exists OBJC_UNDER_TEST] then {
- if [info exists TOOL_EXECUTABLE] {
- set OBJC_UNDER_TEST $TOOL_EXECUTABLE
- } else {
- set OBJC_UNDER_TEST [find_gcc]
- }
- }
- if ![info exists tmpdir] then {
- set tmpdir /tmp
- }
- set gcc_warning_prefix "warning:"
- set gcc_error_prefix "(fatal )?error:"
- objc_maybe_build_wrapper "${tmpdir}/objc-testglue.o"
- set objc_libgcc_s_path [gcc-set-multilib-library-path $OBJC_UNDER_TEST]
- }
- proc objc_target_compile { source dest type options } {
- global rootme
- global tmpdir
- global gluefile wrap_flags
- global srcdir
- global OBJC_UNDER_TEST
- global TOOL_OPTIONS
- global ld_library_path
- global objc_libgcc_s_path
- global shlib_ext
- global TEST_ALWAYS_FLAGS
-
- set shlib_ext [get_shlib_extension]
- set ld_library_path ".:${objc_libgcc_s_path}"
-
- # 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"
- verbose "shared lib extension: $shlib_ext" 3
- if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } {
- lappend options "libs=${gluefile}"
- lappend options "ldflags=$wrap_flags"
- }
- if [target_info exists objc,stack_size] {
- lappend options "additional_flags=-DSTACK_SIZE=[target_info objc,stack_size]"
- }
- if [target_info exists objc,no_trampolines] {
- lappend options "additional_flags=-DNO_TRAMPOLINES"
- }
- if [target_info exists objc,no_label_values] {
- lappend options "additional_flags=-DNO_LABEL_VALUES"
- }
- # 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]
- }
- # TOOL_OPTIONS must come first, so that it doesn't override testcase
- # specific options.
- if [info exists TOOL_OPTIONS] {
- set options [concat "{additional_flags=$TOOL_OPTIONS}" $options]
- }
- # 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 == "" } {
- # On darwin there is, potentially, a gnu runtime too.
- set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
- }
- # Perhaps we didn't build static libs.
- if { $libobjc_dir == "" } {
- set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.${shlib_ext}]
- # On darwin there is, potentially, a gnu runtime too.
- 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}"
- verbose "adding gnu runtime include dir: $objc_include_dir "
- }
- set libobjc_dir [file dirname ${libobjc_dir}]
- # Allow for %s spec substitutions..
- set objc_link_flags " -B${libobjc_dir} "
- lappend options "additional_flags=${objc_link_flags}"
- set objc_link_flags " -L${libobjc_dir} "
- lappend options "additional_flags=${objc_link_flags}"
- append ld_library_path ":${libobjc_dir}"
- }
- if { $type == "precompiled_header" } {
- # If we generating a precompiled header, we have say this is an
- # objective-C header.
- set source [concat "-x objective-c-header" $source]
- }
- lappend options "compiler=$OBJC_UNDER_TEST"
- lappend options "timeout=[timeout_value]"
- set_ld_library_path_env_vars
- set options [dg-additional-files-options $options $source]
- return [target_compile $source $dest $type $options]
- }
- #
- # objc_pass -- utility to record a testcase passed.
- #
- proc objc_pass { testcase cflags } {
- if { "$cflags" == "" } {
- pass "$testcase"
- } else {
- pass "$testcase, $cflags"
- }
- }
- #
- # objc_fail -- utility to record a testcase failed
- #
- proc objc_fail { testcase cflags } {
- if { "$cflags" == "" } {
- fail "$testcase"
- } else {
- fail "$testcase, $cflags"
- }
- }
- #
- # objc_finish -- called at the end of every .exp script that calls objc_init
- #
- # The purpose of this proc is to hide all quirks of the testing environment
- # from the testsuites. It also exists to undo anything that objc_init did
- # (that needs undoing).
- #
- proc objc_finish { } {
- # The testing harness apparently requires this.
- global errorInfo
- if [info exists errorInfo] then {
- unset errorInfo
- }
- # Might as well reset these (keeps our caller from wondering whether
- # s/he has to or not).
- global prms_id bug_id
- set prms_id 0
- set bug_id 0
- }
- proc objc_exit { } {
- global gluefile
- if [info exists gluefile] {
- file_on_build delete $gluefile
- unset gluefile
- }
- }
-
- # If this is an older version of dejagnu (without runtest_file_p),
- # provide one and assume the old syntax: foo1.exp bar1.c foo2.exp bar2.c.
- # This can be deleted after next dejagnu release.
- if { [info procs runtest_file_p] == "" } then {
- proc runtest_file_p { runtests testcase } {
- if { $runtests != "" && [regexp "\[.\]\[cC\]" $runtests] } then {
- if { [lsearch $runtests [file tail $testcase]] >= 0 } then {
- return 1
- } else {
- return 0
- }
- }
- return 1
- }
- }
- # Provide a definition of this if missing (delete after next dejagnu release).
- if { [info procs prune_warnings] == "" } then {
- proc prune_warnings { text } {
- return $text
- }
- }
- # Prune messages from objc that aren't useful.
- proc prune_objc_output { text } {
- #send_user "Before:$text\n"
- regsub -all "(^|\n)\[^\n\]*: In (function|method) \[^\n\]*" $text "" text
- regsub -all "(^|\n)\[^\n\]*: At top level:\[^\n\]*" $text "" text
- # It would be nice to avoid passing anything to objc that would cause it to
- # issue these messages (since ignoring them seems like a hack on our part),
- # but that's too difficult in the general case. For example, sometimes
- # you need to use -B to point objc at crt0.o, but there are some targets
- # that don't have crt0.o.
- regsub -all "(^|\n)\[^\n\]*file path prefix \[^\n\]* never used" $text "" text
- regsub -all "(^|\n)\[^\n\]*linker input file unused since linking not done" $text "" text
- #send_user "After:$text\n"
- return $text
- }
|