Patchwork [testsuite] Require TLS support with tree profiling (PR gcov-profile/48845)

login
register
mail settings
Submitter Rainer Orth
Date May 26, 2011, 10:30 a.m.
Message ID <yddboypoit2.fsf@manam.CeBiTec.Uni-Bielefeld.DE>
Download mbox | patch
Permalink /patch/97520/
State New
Headers show

Comments

Rainer Orth - May 26, 2011, 10:30 a.m.
Prompted by the recent tree profiling testsuite failures on platforms
that require special handling for TLS runtime support, I looked at the
testsuite side of things.

While Solaris now works again thanks to Eric's patch

	http://gcc.gnu.org/ml/gcc-patches/2011-05/msg01719.html

there should be some testsuite handling/cleanup as well:

* check_profiling_available and thus dg-require-profiling needs to check
  that TLS runtime support is available if tree profiling is required.

* To trigger this, the various callers need to pass an
  -fprofile-generate option to check_profiling_available.  These are
  mostly the individual testsuite drivers, but also the new
  gcc.dg/pr47793.c test.

* Initially, this didn't work: dg-require-profiling passed its arguments
  to check_profiling_available unchanged, but the first arg to the dg-*
  procs is the line number in the testcase.  Instead of artificially
  passing a bogus line number from the direct callers of
  check_profiling_available, I drop that arg instead, resulting in a
  couple of simplifications.

* profopt-execute eventually adds necessary TLS options.

Tested without regressions on i386-pc-solaris2.8 and i386-pc-solaris2.10
(among others) without Eric's patch included.

Installed on mainline.

	Rainer


2011-05-21  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	PR gcov-profile/48845
	* g++.dg/tree-prof/tree-prof.exp: Check for -fprofile-generate
	support.
	* gcc.dg/matrix/matrix.exp: Likewise.
	* gcc.dg/tree-prof/tree-prof.exp: Likewise.
	* lib/target-supports-dg.exp (dg-require-profiling): Don't pass
	line number to check_profiling_available.
	* lib/target-supports.exp (check_profiling_available): Account for
	this.
	Require TLS runtime support with -fprofile-generate.
	* lib/profopt.exp (profopt-execute): Add TLS options for
	-fprofile-generate.
	* gcc.dg/pr47793.c: Add dg-require-profiling "-fprofile-generate".

Patch

diff --git a/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp b/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp
--- a/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp
+++ b/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp
@@ -1,4 +1,4 @@ 
-# Copyright (C) 2001, 2002, 2004, 2005, 2007, 2008
+# Copyright (C) 2001, 2002, 2004, 2005, 2007, 2008, 2011
 # Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
@@ -21,7 +21,7 @@ 
 load_lib target-supports.exp
 
 # Some targets don't support tree profiling.
-if { ![check_profiling_available ""] } {
+if { ![check_profiling_available "-fprofile-generate"] } {
     return
 }
 
diff --git a/gcc/testsuite/gcc.dg/matrix/matrix.exp b/gcc/testsuite/gcc.dg/matrix/matrix.exp
--- a/gcc/testsuite/gcc.dg/matrix/matrix.exp
+++ b/gcc/testsuite/gcc.dg/matrix/matrix.exp
@@ -1,4 +1,4 @@ 
-#   Copyright (C) 2001, 2002, 2004, 2005, 2007, 2010
+#   Copyright (C) 2001, 2002, 2004, 2005, 2007, 2010, 2011
 #   Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
@@ -31,7 +31,7 @@  dg-runtest [lsort [glob -nocomplain $src
 dg-final
 
 # Some targets don't support tree profiling.
-if { ![check_profiling_available ""] } {
+if { ![check_profiling_available "-fprofile-generate"] } {
     return
 }
 
diff --git a/gcc/testsuite/gcc.dg/pr47793.c b/gcc/testsuite/gcc.dg/pr47793.c
--- a/gcc/testsuite/gcc.dg/pr47793.c
+++ b/gcc/testsuite/gcc.dg/pr47793.c
@@ -1,6 +1,7 @@ 
 /* Bug pr47793: Allow relative paths in profile-generate.  */
 /* { dg-do run } */
 /* { dg-options "-O -fprofile-generate=./" } */
+/* { dg-require-profiling "-fprofile-generate" } */
 /* { dg-final { scan-file pr47793.gcda "."} } */
 
 int
diff --git a/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp b/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp
--- a/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp
+++ b/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp
@@ -1,4 +1,4 @@ 
-# Copyright (C) 2001, 2002, 2004, 2005, 2007, 2008
+# Copyright (C) 2001, 2002, 2004, 2005, 2007, 2008, 2011
 # Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
@@ -21,7 +21,7 @@ 
 load_lib target-supports.exp
 
 # Some targets don't support tree profiling.
-if { ![check_profiling_available ""] } {
+if { ![check_profiling_available "-fprofile-generate"] } {
     return
 }
 
diff --git a/gcc/testsuite/lib/profopt.exp b/gcc/testsuite/lib/profopt.exp
--- a/gcc/testsuite/lib/profopt.exp
+++ b/gcc/testsuite/lib/profopt.exp
@@ -1,4 +1,4 @@ 
-# Copyright (C) 2001, 2004, 2005, 2007, 2008, 2010
+# Copyright (C) 2001, 2004, 2005, 2007, 2008, 2010, 2011
 # Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
@@ -274,6 +274,12 @@  proc profopt-execute { src } {
 
         set extra_options [dg-additional-files-options "" "$src"]
 
+	# Tree profiling requires TLS runtime support, which may need
+	# additional flags.
+	if { [string first "-fprofile-generate" $profile_option] >= 0 } {
+	    set extra_flags [add_options_for_tls $extra_flags]
+	}
+
 	# Compile for profiling.
 
 	set options "$extra_options"
diff --git a/gcc/testsuite/lib/target-supports-dg.exp b/gcc/testsuite/lib/target-supports-dg.exp
--- a/gcc/testsuite/lib/target-supports-dg.exp
+++ b/gcc/testsuite/lib/target-supports-dg.exp
@@ -113,7 +113,7 @@  proc dg-require-gc-sections { args } {
 # If this target does not support profiling, skip this test.
 
 proc dg-require-profiling { args } {
-    if { ![ check_profiling_available ${args} ] } {
+    if { ![ check_profiling_available [lindex $args 1] ] } {
 	upvar dg-do-what dg-do-what
 	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
     }
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -495,11 +495,16 @@  proc check_profiling_available { test_wh
     # These conditions depend on the argument so examine them before
     # looking at the cache variable.
 
+    # Tree profiling requires TLS runtime support.
+    if { $test_what == "-fprofile-generate" } {
+	return [check_effective_target_tls_runtime]
+    }
+
     # Support for -p on solaris2 relies on mcrt1.o which comes with the
     # vendor compiler.  We cannot reliably predict the directory where the
     # vendor compiler (and thus mcrt1.o) is installed so we can't
     # necessarily find mcrt1.o even if we have it.
-    if { [istarget *-*-solaris2*] && [lindex $test_what 1] == "-p" } {
+    if { [istarget *-*-solaris2*] && $test_what == "-p" } {
 	return 0
     }
 
@@ -508,32 +513,30 @@  proc check_profiling_available { test_wh
     # Support for -pg on irix relies on gcrt1.o which doesn't exist yet.
     # See: http://gcc.gnu.org/ml/gcc/2002-10/msg00169.html
     if { [istarget mips*-*-irix*]
-    && ([lindex $test_what 1] == "-p" || [lindex $test_what 1] == "-pg") } {
+         && ($test_what == "-p" || $test_what == "-pg") } {
 	return 0
     }
 
     # We don't yet support profiling for MIPS16.
     if { [istarget mips*-*-*]
 	 && ![check_effective_target_nomips16]
-	 && ([lindex $test_what 1] == "-p"
-	     || [lindex $test_what 1] == "-pg") } {
+	 && ($test_what == "-p" || $test_what == "-pg") } {
 	return 0
     }
 
     # MinGW does not support -p.
-    if { [istarget *-*-mingw*] && [lindex $test_what 1] == "-p" } {
+    if { [istarget *-*-mingw*] && $test_what == "-p" } {
 	return 0
     }
 
     # cygwin does not support -p.
-    if { [istarget *-*-cygwin*] && [lindex $test_what 1] == "-p" } {
+    if { [istarget *-*-cygwin*] && $test_what == "-p" } {
 	return 0
     }
 
     # uClibc does not have gcrt1.o.
     if { [check_effective_target_uclibc]
-	 && ([lindex $test_what 1] == "-p"
-	     || [lindex $test_what 1] == "-pg") } {
+	 && ($test_what == "-p" || $test_what == "-pg") } {
 	return 0
     }