diff mbox

[testsuite,AVR] : target-supports.exp: AVR does not support TLS

Message ID 4E92CA15.5070503@gjlay.de
State New
Headers show

Commit Message

Georg-Johann Lay Oct. 10, 2011, 10:33 a.m. UTC
The auto-detect machinery fails to correctly detect that TLS is not supported
on AVR.  This leads to gross noise of several hundreds of FAILs in testsuite.

This patch explicitly tells that AVR doesn't support TLS.

Lightly tested with testsuite run on avr-unknown-none where tests like
gcc.dg/debug/tls-1.c ran into ICE are UNSUPPORTED now.

Okay for trunk?

testsuite/
	* lib/target-supports.exp (check_effective_target_tls): AVR has no
	support for TLS.
	(check_effective_target_tls_native): Ditto.
	(check_effective_target_tls_emulated): Ditto.
	(check_effective_target_tls_runtime): Ditto.

Comments

Rainer Orth Oct. 10, 2011, 10:38 a.m. UTC | #1
Georg-Johann Lay <avr@gjlay.de> writes:

> The auto-detect machinery fails to correctly detect that TLS is not supported
> on AVR.  This leads to gross noise of several hundreds of FAILs in testsuite.
>
> This patch explicitly tells that AVR doesn't support TLS.
>
> Lightly tested with testsuite run on avr-unknown-none where tests like
> gcc.dg/debug/tls-1.c ran into ICE are UNSUPPORTED now.

This seems wrong: all targets not supporting native TLS fall back to
emutls and pass the tests just fine.  You should investigate what's
happening on AVR instead of papering over the problem.

	Rainer
Georg-Johann Lay Oct. 10, 2011, 10:42 a.m. UTC | #2
Rainer Orth schrieb:
> Georg-Johann Lay <avr@gjlay.de> writes:
> 
>> The auto-detect machinery fails to correctly detect that TLS is not supported
>> on AVR.  This leads to gross noise of several hundreds of FAILs in testsuite.
>>
>> This patch explicitly tells that AVR doesn't support TLS.
>>
>> Lightly tested with testsuite run on avr-unknown-none where tests like
>> gcc.dg/debug/tls-1.c ran into ICE are UNSUPPORTED now.
> 
> This seems wrong: all targets not supporting native TLS fall back to
> emutls and pass the tests just fine.  You should investigate what's
> happening on AVR instead of papering over the problem.
> 
> 	Rainer

For example, after updating trunk to 179738,




(gdb) set args  -fpreprocessed tls-1.i -quiet -dumpbase tls-1.c -mmcu=atmega128
-auxbase tls-1 -gdwarf-2 -O3 -O2 -version -o tls-1.s
(gdb) cd ~/test
(gdb) r
GNU C (GCC) version 4.7.0 20111010 (experimental) (avr)
        compiled by GNU C version 4.3.2 [gcc-4_3-branch revision 141291], GMP
version 5.0.1, MPFR version 3.0.0-p8, MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
GNU C (GCC) version 4.7.0 20111010 (experimental) (avr)
	compiled by GNU C version 4.3.2 [gcc-4_3-branch revision 141291], GMP version
5.0.1, MPFR version 3.0.0-p8, MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
Compiler executable checksum: 4e4900df2fe6cd3a5bd440dbb3a30bf2

Program received signal SIGSEGV, Segmentation fault.
0x0864e398 in set_is_used (var=0xb7dd3600) at
../../../gcc.gnu.org/trunk/gcc/tree-flow-inline.h:562
(gdb) bt
#0  0x0864e398 in set_is_used (var=0xb7dd3600) at
../../../gcc.gnu.org/trunk/gcc/tree-flow-inline.h:562
#1  0x0864e256 in mark_all_vars_used_1 (tp=0xb7dc97c4,
walk_subtrees=0xbfffe004, data=0x0) at
../../../gcc.gnu.org/trunk/gcc/tree-ssa-live.c:379
#2  0x087c69b6 in walk_tree_1 ()
#3  0x0864f37c in mark_all_vars_used (expr_p=0xb7dd24e0, data=0x0) at
../../../gcc.gnu.org/trunk/gcc/tree-ssa-live.c:595
#4  0x0864fd71 in remove_unused_locals () at
../../../gcc.gnu.org/trunk/gcc/tree-ssa-live.c:727
#5  0x08492d5d in execute_function_todo (data=0x8000) at
../../../gcc.gnu.org/trunk/gcc/passes.c:1695
#6  0x08492e6c in do_per_function (callback=0x8492bf0 <execute_function_todo>,
data=0x8000) at ../../../gcc.gnu.org/trunk/gcc/passes.c:1548
#7  0x08492fad in execute_todo (flags=32768) at
../../../gcc.gnu.org/trunk/gcc/passes.c:1741
#8  0x08493e9a in execute_one_pass (pass=0x8b98560) at
../../../gcc.gnu.org/trunk/gcc/passes.c:2087
#9  0x0849419d in execute_pass_list (pass=0x8b98560) at
../../../gcc.gnu.org/trunk/gcc/passes.c:2119
#10 0x085d3461 in tree_rest_of_compilation (fndecl=0xb7dca500) at
../../../gcc.gnu.org/trunk/gcc/tree-optimize.c:420
#11 0x08202f4a in cgraph_expand_function (node=0xb7dcb09c) at
../../../gcc.gnu.org/trunk/gcc/cgraphunit.c:1805
#12 0x08203f61 in cgraph_optimize () at
../../../gcc.gnu.org/trunk/gcc/cgraphunit.c:1864
#13 0x08205325 in cgraph_finalize_compilation_unit () at
../../../gcc.gnu.org/trunk/gcc/cgraphunit.c:1312
#14 0x080bb5b8 in c_write_global_declarations () at
../../../gcc.gnu.org/trunk/gcc/c-decl.c:9936
#15 0x08565cce in toplev_main (argc=15, argv=0xbfffe5d4) at
../../../gcc.gnu.org/trunk/gcc/toplev.c:581
#16 0x0816cc02 in main (argc=-1210281312, argv=0xb7dd1070) at
../../../gcc.gnu.org/trunk/gcc/main.c:36
(gdb) frame 1
#1  0x0864e256 in mark_all_vars_used_1 (tp=0xb7dc97c4,
walk_subtrees=0xbfffe004, data=0x0) at
../../../gcc.gnu.org/trunk/gcc/tree-ssa-live.c:379
(gdb) p t
$1 = (tree) 0xb7dd3600
(gdb) pt
 <var_decl 0xb7dd3600 __emutls_v.vara
    type <record_type 0xb7dd35a0 __emutls_object BLK
        size <integer_cst 0xb7d95f28 constant 48>
        unit size <integer_cst 0xb7d95f00 constant 6>
        align 8 symtab 0 alias set -1 canonical type 0xb7dd35a0
        fields <field_decl 0xb7d597e8 __size type <integer_type 0xb7d5d1e0
unsigned char>
            unsigned QI file (null) line 0 col 0
            size <integer_cst 0xb7d4e1cc constant 8>
            unit size <integer_cst 0xb7d4e1e0 constant 1>
            align 8 offset_align 8
            offset <integer_cst 0xb7d4e0b4 constant 0>
            bit offset <integer_cst 0xb7d4e118 constant 0> context <record_type
0xb7dd35a0 __emutls_object> chain <field_decl 0xb7d5978c __align>>
        pointer_to_this <pointer_type 0xb7dd36c0>>
    addressable used static ignored BLK file
/mnt/nfs/home/georg/gnu/gcc.gnu.org/trunk/gcc/testsuite/gcc.dg/debug/tls-1.c
line 7 col 21 size <integer_cst 0xb7d95f28 48> unit size <integer_cst 0xb7d95f00 6>
    align 8 context <translation_unit_decl 0xb7d65d80 D.1228> initial
<constructor 0xb7d8bd10>>
(gdb) frame 0
#0  0x0864e398 in set_is_used (var=0xb7dd3600) at
../../../gcc.gnu.org/trunk/gcc/tree-flow-inline.h:562
(gdb) p ann
$2 = (var_ann_t) 0x0
(gdb)

So there is a NULL pointer dereference.
Rainer Orth Oct. 10, 2011, 10:48 a.m. UTC | #3
Georg-Johann Lay <avr@gjlay.de> writes:

> For example, after updating trunk to 179738,
>
>
>
>
> (gdb) set args  -fpreprocessed tls-1.i -quiet -dumpbase tls-1.c -mmcu=atmega128
> -auxbase tls-1 -gdwarf-2 -O3 -O2 -version -o tls-1.s
> (gdb) cd ~/test
> (gdb) r
> GNU C (GCC) version 4.7.0 20111010 (experimental) (avr)
>         compiled by GNU C version 4.3.2 [gcc-4_3-branch revision 141291], GMP
> version 5.0.1, MPFR version 3.0.0-p8, MPC version 0.8.2
> GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
> GNU C (GCC) version 4.7.0 20111010 (experimental) (avr)
> 	compiled by GNU C version 4.3.2 [gcc-4_3-branch revision 141291], GMP version
> 5.0.1, MPFR version 3.0.0-p8, MPC version 0.8.2
> GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
> Compiler executable checksum: 4e4900df2fe6cd3a5bd440dbb3a30bf2
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x0864e398 in set_is_used (var=0xb7dd3600) at
> ../../../gcc.gnu.org/trunk/gcc/tree-flow-inline.h:562
> (gdb) bt
> #0  0x0864e398 in set_is_used (var=0xb7dd3600) at
> ../../../gcc.gnu.org/trunk/gcc/tree-flow-inline.h:562
> #1  0x0864e256 in mark_all_vars_used_1 (tp=0xb7dc97c4,
> walk_subtrees=0xbfffe004, data=0x0) at
> ../../../gcc.gnu.org/trunk/gcc/tree-ssa-live.c:379

This has nothing to do with AVR, but is PR middle-end/50638.  It breaks
TLS on all emutls targets.  A patch has been posted and approved, but
apparently not yet installed.

So please be more careful investigating testsuite failures before
XFAILing or skipping them.

	Rainer
Georg-Johann Lay Oct. 10, 2011, 3:13 p.m. UTC | #4
Rainer Orth schrieb:
> Georg-Johann Lay <avr@gjlay.de> writes:
> 
>> For example, after updating trunk to 179738,
>>
>> (gdb) set args  -fpreprocessed tls-1.i -quiet -dumpbase tls-1.c -mmcu=atmega128
>> -auxbase tls-1 -gdwarf-2 -O3 -O2 -version -o tls-1.s
>> (gdb) cd ~/test
>> (gdb) r
>> GNU C (GCC) version 4.7.0 20111010 (experimental) (avr)
>>         compiled by GNU C version 4.3.2 [gcc-4_3-branch revision 141291], GMP
>> version 5.0.1, MPFR version 3.0.0-p8, MPC version 0.8.2
>> GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
>> GNU C (GCC) version 4.7.0 20111010 (experimental) (avr)
>> 	compiled by GNU C version 4.3.2 [gcc-4_3-branch revision 141291], GMP version
>> 5.0.1, MPFR version 3.0.0-p8, MPC version 0.8.2
>> GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
>> Compiler executable checksum: 4e4900df2fe6cd3a5bd440dbb3a30bf2
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0x0864e398 in set_is_used (var=0xb7dd3600) at
>> ../../../gcc.gnu.org/trunk/gcc/tree-flow-inline.h:562
>> (gdb) bt
>> #0  0x0864e398 in set_is_used (var=0xb7dd3600) at
>> ../../../gcc.gnu.org/trunk/gcc/tree-flow-inline.h:562
>> #1  0x0864e256 in mark_all_vars_used_1 (tp=0xb7dc97c4,
>> walk_subtrees=0xbfffe004, data=0x0) at
>> ../../../gcc.gnu.org/trunk/gcc/tree-ssa-live.c:379
> 
> This has nothing to do with AVR, but is PR middle-end/50638.  It breaks
> TLS on all emutls targets.  A patch has been posted and approved, but
> apparently not yet installed.

Thanks for the notice.
The GCC documentation says that TLS need support of a dynamic linker. It's
unlikely there will ever be a dynamic linker on a device with some tens k for
code and some k of RAM?

> So please be more careful investigating testsuite failures before
> XFAILing or skipping them.

Sorry, experience is that many test cases are not well written to parametrize
for small targets and it's merely impossible to catch up with hundreds of test
case fall out from them and to see the real problems.

Johann

> 
> 	Rainer
>
Rainer Orth Oct. 10, 2011, 3:17 p.m. UTC | #5
Georg-Johann Lay <avr@gjlay.de> writes:

>> This has nothing to do with AVR, but is PR middle-end/50638.  It breaks
>> TLS on all emutls targets.  A patch has been posted and approved, but
>> apparently not yet installed.
>
> Thanks for the notice.
> The GCC documentation says that TLS need support of a dynamic linker. It's
> unlikely there will ever be a dynamic linker on a device with some tens k for
> code and some k of RAM?

I suppose this applies to native TLS, not emutls.

>> So please be more careful investigating testsuite failures before
>> XFAILing or skipping them.
>
> Sorry, experience is that many test cases are not well written to parametrize
> for small targets and it's merely impossible to catch up with hundreds of test

Not only small, but unusual targets in general ;-)

> case fall out from them and to see the real problems.

But it's still important to either do the analysis (or have someone who
knows that area in depth do the analysis :-) to avoid papering over the
real problem.

I like to keep the number of testsuite failure manageable myself, so I
know how your feeling ;-)

	Rainer
diff mbox

Patch

Index: testsuite/lib/target-supports.exp
===================================================================
--- testsuite/lib/target-supports.exp	(revision 179738)
+++ testsuite/lib/target-supports.exp	(working copy)
@@ -607,6 +607,11 @@  proc add_options_for_tls { flags } {
 # Return 1 if thread local storage (TLS) is supported, 0 otherwise.
 
 proc check_effective_target_tls {} {
+    # AVR has no support for TLS.  Auto-detect fails here.    
+    if { [istarget avr-*-*] } {
+	return 0
+    }
+
     return [check_no_compiler_messages tls assembly {
 	__thread int i;
 	int f (void) { return i; }
@@ -623,6 +628,11 @@  proc check_effective_target_tls_native {
 	return 0
     }
     
+    # AVR has no support for TLS.  Auto-detect fails here.    
+    if { [istarget avr-*-*] } {
+	return 0
+    }
+
     return [check_no_messages_and_pattern tls_native "!emutls" assembly {
 	__thread int i;
 	int f (void) { return i; }
@@ -639,6 +649,11 @@  proc check_effective_target_tls_emulated
 	return 1
     }
     
+    # AVR has no support for TLS.  Auto-detect fails here.    
+    if { [istarget avr-*-*] } {
+	return 0
+    }
+
     return [check_no_messages_and_pattern tls_emulated "emutls" assembly {
 	__thread int i;
 	int f (void) { return i; }
@@ -649,6 +664,11 @@  proc check_effective_target_tls_emulated
 # Return 1 if TLS executables can run correctly, 0 otherwise.
 
 proc check_effective_target_tls_runtime {} {
+    # AVR has no support for TLS.  Auto-detect fails here.    
+    if { [istarget avr-*-*] } {
+	return 0
+    }
+
     return [check_runtime tls_runtime {
 	__thread int thr = 0;
 	int main (void) { return thr; }