2008-12-04 16:15:40 +00:00
|
|
|
Novell #74176
|
|
|
|
|
|
|
|
This is for PR 20286, which is an IA-64 abort with a testcase that
|
|
|
|
redefines an external __thread variable as static __thread.
|
|
|
|
|
|
|
|
This testcase hits the abort in ia64_encode_section_info which aborts if
|
|
|
|
a thread variable changes state. This is intended to catch accidental
|
|
|
|
transitions between thread data and small data. In this case, it is
|
|
|
|
accidentally catching an internal TLS transition from INITIAL_EXEC to
|
|
|
|
LOCAL_EXEC, which is an allowable transition. This patch fixes the
|
|
|
|
problem by only calling the abort if either state involves small data.
|
|
|
|
|
|
|
|
This patch applies only to gcc-3.3. This was fixed in gcc-3.4 by using
|
|
|
|
default_encode_section_info, which is not present in gcc-3.3. Since
|
|
|
|
pulling all of this into gcc-3.3 is a rather large patch, including
|
|
|
|
non-IA-64 changes, I believe it is better to just add a gcc-3.3 specific
|
|
|
|
fix to the ia64.c file.
|
|
|
|
|
|
|
|
This was tested with a bootstrap and make check with and without the
|
|
|
|
patch on ia64-linux using the top of the gcc-3.3 branch. There were no
|
|
|
|
regressions.
|
|
|
|
|
|
|
|
2005-03-23 James E Wilson <wilson@specifixinc.com>
|
|
|
|
|
|
|
|
PR target/20286.
|
|
|
|
* config/ia64/ia64.c (ia64_encode_section_info): Only abort if encoding
|
|
|
|
or symbol_str[1] is 's'.
|
|
|
|
|
2009-11-20 12:08:01 +00:00
|
|
|
Index: gcc/config/ia64/ia64.c
|
2008-12-04 16:15:40 +00:00
|
|
|
===================================================================
|
2009-11-20 12:08:01 +00:00
|
|
|
--- gcc/config/ia64/ia64.c.orig 2009-11-20 13:06:08.000000000 +0100
|
|
|
|
+++ gcc/config/ia64/ia64.c 2009-11-20 13:06:32.000000000 +0100
|
|
|
|
@@ -7364,7 +7364,8 @@ ia64_encode_section_info (decl, first)
|
|
|
|
if (encoding == symbol_str[1])
|
|
|
|
return;
|
|
|
|
/* ??? Sdata became thread or thread becaome not thread. Lose. */
|
|
|
|
- abort ();
|
|
|
|
+ if (encoding == 's' || symbol_str[1] == 's')
|
|
|
|
+ abort ();
|
|
|
|
}
|
|
|
|
|
|
|
|
len = strlen (symbol_str);
|