aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorMarc Glisse <glisse@gcc.gnu.org>2016-11-20 13:35:27 +0000
committerMarc Glisse <glisse@gcc.gnu.org>2016-11-20 13:35:27 +0000
commit62a7df9f59c014c272f4216aac02a301a0778fdf (patch)
treed8b6bcad314cbf811ad02d941e25efedb7a79b5f /libgcc
parent0021284370b5d62bf8bc3f09435d5a176c18a033 (diff)
downloadgcc-62a7df9f59c014c272f4216aac02a301a0778fdf.zip
gcc-62a7df9f59c014c272f4216aac02a301a0778fdf.tar.gz
gcc-62a7df9f59c014c272f4216aac02a301a0778fdf.tar.bz2
Protect __TMC_END__ - __TMC_LIST__ == 0
2016-11-20 Marc Glisse <marc.glisse@inria.fr> PR libgcc/77813 * crtstuff.c (deregister_tm_clones, register_tm_clones): Hide __TMC_END__ behind a passthrough asm. From-SVN: r242635
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog8
-rw-r--r--libgcc/crtstuff.c10
2 files changed, 15 insertions, 3 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 6f98523..90d7ee8 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,6 +1,12 @@
+2016-11-20 Marc Glisse <marc.glisse@inria.fr>
+
+ PR libgcc/77813
+ * crtstuff.c (deregister_tm_clones, register_tm_clones): Hide
+ __TMC_END__ behind a passthrough asm.
+
2016-11-18 Walter Lee <walt@tilera.com>
- * config.host (tilepro*-*-linux*): Add t-slibgcc-libgcc to tmake_file.
+ * config.host (tilepro*-*-linux*): Add t-slibgcc-libgcc to tmake_file.
2016-11-17 Andrew Senkevich <andrew.senkevich@intel.com>
diff --git a/libgcc/crtstuff.c b/libgcc/crtstuff.c
index 5449c4d..5644181 100644
--- a/libgcc/crtstuff.c
+++ b/libgcc/crtstuff.c
@@ -280,7 +280,10 @@ deregister_tm_clones (void)
void (*fn) (void *);
#ifdef HAVE_GAS_HIDDEN
- if (__TMC_END__ - __TMC_LIST__ == 0)
+ func_ptr *end = __TMC_END__;
+ // Do not optimize the comparison to false.
+ __asm ("" : "+g" (end));
+ if (__TMC_LIST__ == end)
return;
#else
if (__TMC_LIST__[0] == NULL)
@@ -300,7 +303,10 @@ register_tm_clones (void)
size_t size;
#ifdef HAVE_GAS_HIDDEN
- size = (__TMC_END__ - __TMC_LIST__) / 2;
+ func_ptr *end = __TMC_END__;
+ // Do not optimize the comparison to false.
+ __asm ("" : "+g" (end));
+ size = (end - __TMC_LIST__) / 2;
#else
for (size = 0; __TMC_LIST__[size * 2] != NULL; size++)
continue;