On 25 August 2015 at 17:31, Mike Stump <mikest...@comcast.net> wrote:
> On Aug 25, 2015, at 1:14 AM, Christophe Lyon <christophe.l...@linaro.org> 
> wrote:
>> Some subsets of the tests override ALWAYS_CXXFLAGS or
>> TEST_ALWAYS_FLAGS and perform effective_target support tests using
>> these modified flags.
>
>> This patch adds a new function 'clear_effective_target_cache', which
>> is called at the end of every .exp file which overrides
>> ALWAYS_CXXFLAGS or TEST_ALWAYS_FLAGS.
>
> So, a simple English directive somewhere that says, if one changes 
> ALWAYS_CXXFLAGS or TEST_ALWAYS_FLAGS then they should do a 
> clear_effective_target_cache at the end as the target cache can make 
> decisions based upon the flags, and those decisions need to be redone when 
> the flags change would be nice.
>
> I do wonder, do we need to reexamine when setting the flags?  I’m thinking of 
> a sequence like: non-thumb default, is_thumb, set flags (thumb), is_thumb.  
> Anyway, safe to punt this until someone discovers it or is reasonable sure it 
> happens.
>
> Anyway, all looks good.  Ok.
>
Here is what I have committed (r227372).

I updated the comment before clear_effective_target_cache, and copied
the directive you suggested above.
I also added a test to check if $et_prop_list exists before clearing
(there were error messages otherwise).

Christophe.

>> However, I noticed that lib/g++.exp changes ALWAYS_CXXFLAGS, but does
>> not appear to restore it. In doubt, I didn't change it.
>
> Yeah, I examined it.  It seems like it might not matter, as anyone setting 
> and unsetting would come in cleared, and if they didn’t, it should be roughly 
> the same exact state, meaning, no clearing necessary.  I think it is safe to 
> punt this until someone finds a bug or can see a way that it would matter.  I 
> also don’t think it would hurt to clear, if someone wanted to refactor the 
> code a bit and make the clearing and the cleanup a little more automatic.  
> I’m thinking of a RAII style code in which the dtor runs the clear.  Not sure 
> if that is even possible in tcl.  [ checking ] Nope, maybe not.  Oh well.
2015-09-01  Christophe Lyon  <christophe.l...@linaro.org>

	* lib/target-supports.exp (clear_effective_target_cache): New.
	(check_cached_effective_target): Update et_prop_list.
	* lib/asan-dg.exp (asan_finish): Call clear_effective_target_cache.
	* g++.dg/compat/compat.exp: Likewise.
	* g++.dg/compat/struct-layout-1.exp: Likewise.
	* lib/asan-dg.exp: Likewise.
	* lib/atomic-dg.exp: Likewise.
	* lib/cilk-plus-dg.exp: Likewise.
	* lib/clearcap.exp: Likewise.
	* lib/mpx-dg.exp: Likewise.
	* lib/tsan-dg.exp: Likewise.
	* lib/ubsan-dg.exp: Likewise.

Index: gcc/testsuite/g++.dg/compat/compat.exp
===================================================================
--- gcc/testsuite/g++.dg/compat/compat.exp	(revision 227370)
+++ gcc/testsuite/g++.dg/compat/compat.exp	(working copy)
@@ -78,6 +78,7 @@ proc compat-use-tst-compiler { } {
 	set ALWAYS_CXXFLAGS $save_always_cxxflags
 	set ld_library_path $save_ld_library_path
 	set_ld_library_path_env_vars
+	clear_effective_target_cache
     }
 }
 
Index: gcc/testsuite/g++.dg/compat/struct-layout-1.exp
===================================================================
--- gcc/testsuite/g++.dg/compat/struct-layout-1.exp	(revision 227370)
+++ gcc/testsuite/g++.dg/compat/struct-layout-1.exp	(working copy)
@@ -61,6 +61,7 @@ proc compat-use-alt-compiler { } {
 	set ld_library_path $alt_ld_library_path
 	set_ld_library_path_env_vars
 	restore_gcc_exec_prefix_env_var
+	clear_effective_target_cache
     }
 }
 
Index: gcc/testsuite/lib/asan-dg.exp
===================================================================
--- gcc/testsuite/lib/asan-dg.exp	(revision 227370)
+++ gcc/testsuite/lib/asan-dg.exp	(working copy)
@@ -138,6 +138,7 @@ proc asan_finish { args } {
     }
     set ld_library_path $asan_saved_library_path
     set_ld_library_path_env_vars
+    clear_effective_target_cache
 }
 
 # Symbolize lines like
Index: gcc/testsuite/lib/atomic-dg.exp
===================================================================
--- gcc/testsuite/lib/atomic-dg.exp	(revision 227370)
+++ gcc/testsuite/lib/atomic-dg.exp	(working copy)
@@ -101,4 +101,5 @@ proc atomic_finish { args } {
     } else {
 	unset TEST_ALWAYS_FLAGS
     }
+    clear_effective_target_cache
 }
Index: gcc/testsuite/lib/cilk-plus-dg.exp
===================================================================
--- gcc/testsuite/lib/cilk-plus-dg.exp	(revision 227370)
+++ gcc/testsuite/lib/cilk-plus-dg.exp	(working copy)
@@ -101,4 +101,5 @@ proc cilkplus_finish { args } {
     } else {
 	unset TEST_ALWAYS_FLAGS
     }
+    clear_effective_target_cache
 }
Index: gcc/testsuite/lib/clearcap.exp
===================================================================
--- gcc/testsuite/lib/clearcap.exp	(revision 227370)
+++ gcc/testsuite/lib/clearcap.exp	(working copy)
@@ -55,4 +55,5 @@ proc clearcap-finish { args } {
     } else {
 	unset TEST_ALWAYS_FLAGS
     }
+    clear_effective_target_cache
 }
Index: gcc/testsuite/lib/mpx-dg.exp
===================================================================
--- gcc/testsuite/lib/mpx-dg.exp	(revision 227370)
+++ gcc/testsuite/lib/mpx-dg.exp	(working copy)
@@ -142,4 +142,5 @@ proc mpx_finish { args } {
     }
     set ld_library_path $mpx_saved_library_path
     set_ld_library_path_env_vars
+    clear_effective_target_cache
 }
Index: gcc/testsuite/lib/target-supports.exp
===================================================================
--- gcc/testsuite/lib/target-supports.exp	(revision 227370)
+++ gcc/testsuite/lib/target-supports.exp	(working copy)
@@ -117,6 +117,7 @@ proc current_target_name { } {
 
 proc check_cached_effective_target { prop args } {
     global et_cache
+    global et_prop_list
 
     set target [current_target_name]
     if {![info exists et_cache($prop,target)]
@@ -124,12 +125,37 @@ proc check_cached_effective_target { pro
 	verbose "check_cached_effective_target $prop: checking $target" 2
 	set et_cache($prop,target) $target
 	set et_cache($prop,value) [uplevel eval $args]
+	lappend et_prop_list $prop
+	verbose "check_cached_effective_target cached list is now: $et_prop_list" 2
     }
     set value $et_cache($prop,value)
     verbose "check_cached_effective_target $prop: returning $value for $target" 2
     return $value
 }
 
+# Clear effective-target cache. This is useful after testing
+# effective-target features and overriding TEST_ALWAYS_FLAGS and/or
+# ALWAYS_CXXFLAGS.
+# If one changes ALWAYS_CXXFLAGS or TEST_ALWAYS_FLAGS then they should
+# do a clear_effective_target_cache at the end as the target cache can
+# make decisions based upon the flags, and those decisions need to be
+# redone when the flags change. An example of this is the
+# asan_init/asan_finish pair.
+
+proc clear_effective_target_cache { } {
+    global et_cache
+    global et_prop_list
+
+    if {[info exists et_prop_list]} {
+	verbose "clear_effective_target_cache: $et_prop_list" 2
+	foreach prop $et_prop_list {
+	    unset et_cache($prop,value)
+	    unset et_cache($prop,target)
+	}
+	unset et_prop_list
+    }
+}
+
 # Like check_compile, but delete the output file and return true if the
 # compiler printed no messages.
 proc check_no_compiler_messages_nocache {args} {
Index: gcc/testsuite/lib/tsan-dg.exp
===================================================================
--- gcc/testsuite/lib/tsan-dg.exp	(revision 227370)
+++ gcc/testsuite/lib/tsan-dg.exp	(working copy)
@@ -149,4 +149,5 @@ proc tsan_finish { args } {
     }
     set ld_library_path $tsan_saved_library_path
     set_ld_library_path_env_vars
+    clear_effective_target_cache
 }
Index: gcc/testsuite/lib/ubsan-dg.exp
===================================================================
--- gcc/testsuite/lib/ubsan-dg.exp	(revision 227370)
+++ gcc/testsuite/lib/ubsan-dg.exp	(working copy)
@@ -121,4 +121,5 @@ proc ubsan_finish { args } {
     }
     set ld_library_path $ubsan_saved_library_path
     set_ld_library_path_env_vars
+    clear_effective_target_cache
 }

Reply via email to