Commit 1018b4c3 by Richard Sandiford Committed by Richard Sandiford

target-supports.exp (check_cached_effective_target): New procedure.

gcc/testsuite/
	* lib/target-supports.exp (check_cached_effective_target): New
	procedure.
	(check_no_compiler_messages, check_no_messages_and_pattern): Use it.
	(check_effective_target_c99_runtime): New procedure.
	* gcc.dg/builtins-20.c (test3f): Wrap cargf check in HAVE_C99_RUNTIME.
	(test3l): Likewise cargl.
	* gcc.dg/builtins-59.c: Require c99_runtime.
	* gcc.dg/builtins-61.c: Likewise.
	* gcc.dg/builtins-62.c: Likewise.

From-SVN: r128664
parent db9a0df0
2007-09-22 Richard Sandiford <rsandifo@nildram.co.uk> 2007-09-22 Richard Sandiford <rsandifo@nildram.co.uk>
* lib/target-supports.exp (check_cached_effective_target): New
procedure.
(check_no_compiler_messages, check_no_messages_and_pattern): Use it.
(check_effective_target_c99_runtime): New procedure.
* gcc.dg/builtins-20.c (test3f): Wrap cargf check in HAVE_C99_RUNTIME.
(test3l): Likewise cargl.
* gcc.dg/builtins-59.c: Require c99_runtime.
* gcc.dg/builtins-61.c: Likewise.
* gcc.dg/builtins-62.c: Likewise.
2007-09-22 Richard Sandiford <rsandifo@nildram.co.uk>
* lib/target-supports.exp (add_options_for_c99_runtime): New procedure. * lib/target-supports.exp (add_options_for_c99_runtime): New procedure.
* lib/target-supports-dg.exp (dg-add-options): Likewise. * lib/target-supports-dg.exp (dg-add-options): Likewise.
* gcc.dg/builtins-18.c: Use { dg-add-options c99_runtime } instead of * gcc.dg/builtins-18.c: Use { dg-add-options c99_runtime } instead of
...@@ -449,9 +449,6 @@ void test2f(float x, float y) ...@@ -449,9 +449,6 @@ void test2f(float x, float y)
void test3f(__complex__ float x, __complex__ float y, int i) void test3f(__complex__ float x, __complex__ float y, int i)
{ {
if (cargf(x) != atan2f(__imag__ x, __real__ x))
link_error ();
if (ccosf(x) != ccosf(-x)) if (ccosf(x) != ccosf(-x))
link_error(); link_error();
...@@ -502,6 +499,11 @@ void test3f(__complex__ float x, __complex__ float y, int i) ...@@ -502,6 +499,11 @@ void test3f(__complex__ float x, __complex__ float y, int i)
if (ctanf(~(x/y)) != -ctanf(~(x/-y))) if (ctanf(~(x/y)) != -ctanf(~(x/-y)))
link_error(); link_error();
#ifdef HAVE_C99_RUNTIME
if (cargf(x) != atan2f(__imag__ x, __real__ x))
link_error ();
#endif
} }
void test1l(long double x) void test1l(long double x)
...@@ -674,9 +676,6 @@ void test2l(long double x, long double y) ...@@ -674,9 +676,6 @@ void test2l(long double x, long double y)
void test3l(__complex__ long double x, __complex__ long double y, int i) void test3l(__complex__ long double x, __complex__ long double y, int i)
{ {
if (cargl(x) != atan2l(__imag__ x, __real__ x))
link_error ();
if (ccosl(x) != ccosl(-x)) if (ccosl(x) != ccosl(-x))
link_error(); link_error();
...@@ -727,6 +726,11 @@ void test3l(__complex__ long double x, __complex__ long double y, int i) ...@@ -727,6 +726,11 @@ void test3l(__complex__ long double x, __complex__ long double y, int i)
if (ctanl(~(x/y)) != -ctanl(~(x/-y))) if (ctanl(~(x/y)) != -ctanl(~(x/-y)))
link_error(); link_error();
#ifdef HAVE_C99_RUNTIME
if (cargl(x) != atan2l(__imag__ x, __real__ x))
link_error ();
#endif
} }
int main() int main()
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-fdump-tree-gimple" } */ /* { dg-options "-fdump-tree-gimple" } */
/* { dg-require-effective-target c99_runtime } */
double test (double x) double test (double x)
{ {
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O -ffast-math -fdump-tree-optimized" } */ /* { dg-options "-O -ffast-math -fdump-tree-optimized" } */
/* { dg-require-effective-target c99_runtime } */
double test1 (double x) double test1 (double x)
{ {
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O -ffinite-math-only -fdump-tree-optimized" } */ /* { dg-options "-O -ffinite-math-only -fdump-tree-optimized" } */
/* { dg-require-effective-target c99_runtime } */
double test1 (double x) double test1 (double x)
{ {
......
...@@ -87,43 +87,41 @@ proc current_target_name { } { ...@@ -87,43 +87,41 @@ proc current_target_name { } {
} }
# Implement an effective-target check for property PROP by invoking # Implement an effective-target check for property PROP by invoking
# the compiler and seeing if it prints any messages. Assume that the # the Tcl command ARGS and seeing if it returns true.
# property holds if the compiler doesn't print anything. The other
# arguments are as for get_compiler_messages, starting with TYPE. proc check_cached_effective_target { prop args } {
proc check_no_compiler_messages {prop args} {
global et_cache global et_cache
set target [current_target_name] set target [current_target_name]
if {![info exists et_cache($prop,target)] if {![info exists et_cache($prop,target)]
|| $et_cache($prop,target) != $target} { || $et_cache($prop,target) != $target} {
verbose "check_no_compiler_messages $prop: compiling source for $target" 2 verbose "check_cached_effective_target $prop: checking $target" 2
set et_cache($prop,target) $target set et_cache($prop,target) $target
set et_cache($prop,value) \ set et_cache($prop,value) [uplevel eval $args]
[string match "" [eval get_compiler_messages $prop 0 $args]]
} }
set value $et_cache($prop,value) set value $et_cache($prop,value)
verbose "check_no_compiler_messages $prop: returning $value for $target" 2 verbose "check_cached_effective_target $prop: returning $value for $target" 2
return $value return $value
} }
# Implement an effective-target check for property PROP by invoking
# the compiler and seeing if it prints any messages. Assume that the
# property holds if the compiler doesn't print anything. The other
# arguments are as for get_compiler_messages, starting with TYPE.
proc check_no_compiler_messages {prop args} {
return [check_cached_effective_target $prop {
string match "" [eval get_compiler_messages $prop 0 $args]
}]
}
# Similar to check_no_compiler_messages, but also verify that the regular # Similar to check_no_compiler_messages, but also verify that the regular
# expression PATTERN matches the compiler's output. # expression PATTERN matches the compiler's output.
proc check_no_messages_and_pattern {prop pattern args} { proc check_no_messages_and_pattern {prop pattern args} {
global et_cache return [check_cached_effective_target $prop {
set target [current_target_name]
if {![info exists et_cache($prop,target)]
|| $et_cache($prop,target) != $target} {
verbose "check_no_messages_and_pattern $prop: compiling source for $target" 2
set et_cache($prop,target) $target
set results [eval get_compiler_messages $prop 1 $args] set results [eval get_compiler_messages $prop 1 $args]
set et_cache($prop,value) \ expr { [string match "" [lindex $results 0]]
[expr [string match "" [lindex $results 0]] \ && [regexp $pattern [lindex $results 1]] }
&& [regexp $pattern [lindex $results 1]]] }]
}
set value $et_cache($prop,value)
verbose "check_no_messages_and_pattern $prop: returning $value for $target" 2
return $value
} }
############################### ###############################
...@@ -2574,3 +2572,22 @@ proc add_options_for_c99_runtime { flags } { ...@@ -2574,3 +2572,22 @@ proc add_options_for_c99_runtime { flags } {
} }
return $flags return $flags
} }
# Return 1 if the target provides a full C99 runtime.
proc check_effective_target_c99_runtime { } {
return [check_cached_effective_target c99_runtime {
global srcdir
set file [open "$srcdir/gcc.dg/builtins-config.h"]
set contents [read $file]
close $file
append contents {
#ifndef HAVE_C99_RUNTIME
#error FOO
#endif
}
string match "" [get_compiler_messages c99_runtime 0 assembly \
$contents [add_options_for_c99_runtime ""]]
}]
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment