diff options
author | Marc Glisse <glisse@gcc.gnu.org> | 2016-11-20 13:35:27 +0000 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2016-11-20 13:35:27 +0000 |
commit | 62a7df9f59c014c272f4216aac02a301a0778fdf (patch) | |
tree | d8b6bcad314cbf811ad02d941e25efedb7a79b5f | |
parent | 0021284370b5d62bf8bc3f09435d5a176c18a033 (diff) | |
download | gcc-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
-rw-r--r-- | libgcc/ChangeLog | 8 | ||||
-rw-r--r-- | libgcc/crtstuff.c | 10 |
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; |