Hi, Some testcases need explicit GCC options to properly run, like gcc.target/i386/sse2-init-v2di-2.c has
/* { dg-options "-O2 -msse4 -march=core2 -dp" } */ -march=core2 is specified explicitly. But with multlib, like make check-gcc RUNTESTFLAGS="--target_board='unix{-march=k8}' -march=k8 is appended to the command line options, which overrides the the command line options specified by dg-options. multlib flags should be placed at the beginning of the command line options, not at the end. This patch adds gcc_default_target_compile, which is almost identical to default_target_compile in dejagnu, except that it has if {[board_info $dest exists multilib_flags]} { set add_flags "[board_info $dest multilib_flags] $add_flags" } instead of if {[board_info $dest exists multilib_flags]} { append add_flags " [board_info $dest multilib_flags]" } It replaces default_target_compile with gcc_default_target_compile. Tested on Linux/x86-64 with RUNTESTFLAGS="--target_board='unix{-m32,}'". OK for trunk? Thanks. H.J. --- 2014-01-29 H.J. Lu <hongjiu...@intel.com> PR testsuite/59971 * lib/gcc-defs.exp (gcc_default_target_compile): New. Replace default_target_compile with gcc_default_target_compile. diff --git a/gcc/testsuite/lib/gcc-defs.exp b/gcc/testsuite/lib/gcc-defs.exp index 69a5971..a3fb3d4 100644 --- a/gcc/testsuite/lib/gcc-defs.exp +++ b/gcc/testsuite/lib/gcc-defs.exp @@ -290,3 +290,365 @@ proc gcc-set-multilib-library-path { compiler } { return $libpath } + +# This is almost identical to default_target_compile, except that +# multilib_flags is prepended to add_flags instead of append so that +# testcase can provide compiler options to override multilib_flags. + +proc gcc_default_target_compile {source destfile type options} { + global target_triplet + global tool_root_dir + global CFLAGS_FOR_TARGET + global compiler_flags + + if { $destfile == "" && $type != "preprocess" && $type != "none" } { + error "Must supply an output filename for the compile to default_target_compile" + } + + set add_flags "" + set libs "" + set compiler_type "c" + set compiler "" + set ldflags "" + set dest [target_info name] + + if {[info exists CFLAGS_FOR_TARGET]} { + append add_flags " $CFLAGS_FOR_TARGET" + } + + if {[info exists target_info(host,name)]} { + set host [host_info name] + } else { + set host "unix" + } + + foreach i $options { + + if { $i == "ada" } { + set compiler_type "ada" + if {[board_info $dest exists adaflags]} { + append add_flags " [target_info adaflags]" + } + if {[board_info $dest exists gnatmake]} { + set compiler [target_info gnatmake]; + } else { + set compiler [find_gnatmake]; + } + } + + if { $i == "c++" } { + set compiler_type "c++" + if {[board_info $dest exists cxxflags]} { + append add_flags " [target_info cxxflags]" + } + append add_flags " [g++_include_flags]" + if {[board_info $dest exists c++compiler]} { + set compiler [target_info c++compiler] + } else { + set compiler [find_g++] + } + } + + if { $i == "f77" } { + set compiler_type "f77" + if {[board_info $dest exists f77flags]} { + append add_flags " [target_info f77flags]" + } + if {[board_info $dest exists f77compiler]} { + set compiler [target_info f77compiler] + } else { + set compiler [find_g77] + } + } + + if { $i == "f90" } { + set compiler_type "f90" + if {[board_info $dest exists f90flags]} { + append add_flags " [target_info f90flags]" + } + if {[board_info $dest exists f90compiler]} { + set compiler [target_info f90compiler] + } else { + set compiler [find_gfortran] + } + } + + if {[regexp "^dest=" $i]} { + regsub "^dest=" $i "" tmp + if {[board_info $tmp exists name]} { + set dest [board_info $tmp name] + } else { + set dest $tmp + } + } + if {[regexp "^compiler=" $i]} { + regsub "^compiler=" $i "" tmp + set compiler $tmp + } + if {[regexp "^additional_flags=" $i]} { + regsub "^additional_flags=" $i "" tmp + append add_flags " $tmp" + } + if {[regexp "^ldflags=" $i]} { + regsub "^ldflags=" $i "" tmp + append ldflags " $tmp" + } + if {[regexp "^libs=" $i]} { + regsub "^libs=" $i "" tmp + append libs " $tmp" + } + if {[regexp "^incdir=" $i]} { + regsub "^incdir=" $i "-I" tmp + append add_flags " $tmp" + } + if {[regexp "^libdir=" $i]} { + regsub "^libdir=" $i "-L" tmp + append add_flags " $tmp" + } + if {[regexp "^ldscript=" $i]} { + regsub "^ldscript=" $i "" ldscript + } + if {[regexp "^redirect=" $i]} { + regsub "^redirect=" $i "" redirect + } + if {[regexp "^optimize=" $i]} { + regsub "^optimize=" $i "" optimize + } + if {[regexp "^timeout=" $i]} { + regsub "^timeout=" $i "" timeout + } + } + + if {[board_info $host exists cflags_for_target]} { + append add_flags " [board_info $host cflags_for_target]" + } + + global CC_FOR_TARGET + global CXX_FOR_TARGET + global F77_FOR_TARGET + global F90_FOR_TARGET + global GNATMAKE_FOR_TARGET + + if {[info exists GNATMAKE_FOR_TARGET]} { + if { $compiler_type == "ada" } { + set compiler $GNATMAKE_FOR_TARGET + } + } + + if {[info exists CC_FOR_TARGET]} { + if { $compiler == "" } { + set compiler $CC_FOR_TARGET + } + } + + if {[info exists CXX_FOR_TARGET]} { + if { $compiler_type == "c++" } { + set compiler $CXX_FOR_TARGET + } + } + + if {[info exists F77_FOR_TARGET]} { + if { $compiler_type == "f77" } { + set compiler $F77_FOR_TARGET + } + } + + if {[info exists F90_FOR_TARGET]} { + if { $compiler_type == "f90" } { + set compiler $F90_FOR_TARGET + } + } + + if { $compiler == "" } { + set compiler [board_info $dest compiler] + if { $compiler == "" } { + return "default_target_compile: No compiler to compile with" + } + } + + if {![is_remote host]} { + if { [which $compiler] == 0 } { + return "default_target_compile: Can't find $compiler." + } + } + + if {$type == "object"} { + append add_flags " -c" + } + + if { $type == "preprocess" } { + append add_flags " -E" + } + + if { $type == "assembly" } { + append add_flags " -S" + } + + if {[board_info $dest exists cflags]} { + append add_flags " [board_info $dest cflags]" + } + + if { $type == "executable" } { + if {[board_info $dest exists ldflags]} { + append add_flags " [board_info $dest ldflags]" + } + if { $compiler_type == "c++" } { + append add_flags " [g++_link_flags]" + } + if {[isnative]} { + # This is a lose. + catch "glob -nocomplain $tool_root_dir/libstdc++/libstdc++.so* $tool_root_dir/libstdc++/libstdc++.sl" tmp + if { ${tmp} != "" } { + if {[regexp ".*solaris2.*" $target_triplet]} { + # Solaris 2 + append add_flags " -R$tool_root_dir/libstdc++" + } elseif {[regexp ".*(osf|irix5|linux).*" $target_triplet]} { + # OSF/1 or IRIX 5 + append add_flags " -Wl,-rpath,$tool_root_dir/libstdc++" + } elseif {[regexp ".*hppa.*" $target_triplet]} { + # HP-UX + append add_flags " -Wl,-a,shared_archive" + } + } + } + } + + if {![info exists ldscript]} { + set ldscript [board_info $dest ldscript] + } + + foreach i $options { + if { $i == "debug" } { + if {[board_info $dest exists debug_flags]} { + append add_flags " [board_info $dest debug_flags]" + } else { + append add_flags " -g" + } + } + } + + if {[info exists optimize]} { + append add_flags " $optimize" + } + + if { $type == "executable" } { + append add_flags " $ldflags" + foreach x $libs { + if {[file exists $x]} { + append source " $x" + } else { + append add_flags " $x" + } + } + + if {[board_info $dest exists libs]} { + append add_flags " [board_info $dest libs]" + } + + # This probably isn't such a good idea, but it avoids nasty + # hackiness in the testsuites. + # The math library must be linked in before the C library. The C + # library is linked in by the linker script, so this must be before + # the linker script. + if {[board_info $dest exists mathlib]} { + append add_flags " [board_info $dest mathlib]" + } else { + append add_flags " -lm" + } + + # This must be added here. + append add_flags " $ldscript" + + if {[board_info $dest exists remote_link]} { + # Relink option. + append add_flags " -Wl,-r" + } + if {[board_info $dest exists output_format]} { + append add_flags " -Wl,-oformat,[board_info $dest output_format]" + } + } + + if {[board_info $dest exists multilib_flags]} { + set add_flags "[board_info $dest multilib_flags] $add_flags" + } + + verbose "doing compile" + + set sources "" + if {[is_remote host]} { + foreach x $source { + set file [remote_download host $x] + if { $file == "" } { + warning "Unable to download $x to host." + return "Unable to download $x to host." + } else { + append sources " $file" + } + } + } else { + set sources $source + } + + if {[is_remote host]} { + append add_flags " -o a.out" + remote_file host delete a.out + } else { + if { $destfile != "" } { + append add_flags " -o $destfile" + } + } + + # This is obscure: we put SOURCES at the end when building an + # object, because otherwise, in some situations, libtool will + # become confused about the name of the actual source file. + if {$type == "object"} { + set opts "$add_flags $sources" + } else { + set opts "$sources $add_flags" + } + + if {[is_remote host]} { + if {[host_info exists use_at]} { + set fid [open "atfile" "w"] + puts $fid "$opts" + close $fid + set opts "@[remote_download host atfile]" + remote_file build delete atfile + } + } + + verbose "Invoking the compiler as $compiler $opts" 2 + + if {[info exists redirect]} { + verbose "Redirecting output to $redirect" 2 + set status [remote_exec host "$compiler $opts" "" "" $redirect] + } else { + if {[info exists timeout]} { + verbose "Setting timeout to $timeout" 2 + set status [remote_exec host "$compiler $opts" "" "" "" $timeout] + } else { + set status [remote_exec host "$compiler $opts"] + } + } + + set compiler_flags $opts + if {[is_remote host]} { + remote_upload host a.out $destfile + remote_file host delete a.out + } + set comp_output [prune_warnings [lindex $status 1]] + regsub "^\[\r\n\]+" $comp_output "" comp_output + if { [lindex $status 0] != 0 } { + verbose -log "compiler exited with status [lindex $status 0]" + } + if { [lindex $status 1] != "" } { + verbose -log "output is:\n[lindex $status 1]" 2 + } + if { [lindex $status 0] != 0 && "${comp_output}" == "" } { + set comp_output "exit status is [lindex $status 0]" + } + return ${comp_output} +} + +catch {rename default_target_compile {}} +rename gcc_default_target_compile default_target_compile