aboutsummaryrefslogtreecommitdiff
path: root/libitm
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-12-16 00:51:31 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-12-16 00:51:31 +0100
commit784417d1f808ea70f013a90aeede3b20e6013e39 (patch)
treed5fb499587fc8a484ff6fc7e4c0565251f7971fb /libitm
parente310b38153d15c6d3ae9686eb38b6629f0f93393 (diff)
downloadgcc-784417d1f808ea70f013a90aeede3b20e6013e39.zip
gcc-784417d1f808ea70f013a90aeede3b20e6013e39.tar.gz
gcc-784417d1f808ea70f013a90aeede3b20e6013e39.tar.bz2
re PR c++/88482 (ICE when wrongly declaring __cxa_allocate_exception)
PR c++/88482 * except.c (verify_library_fn): New function. (declare_library_fn): Use it. Initialize TM even if the non-TM library function has been user declared. (do_end_catch): Don't set TREE_NOTHROW on error_mark_node. (expand_start_catch_block): Don't call initialize_handler_parm for error_mark_node. (build_throw): Use verify_library_fn. Initialize TM even if the non-TM library function has been user declared. Don't crash if any library fn is error_mark_node. * g++.dg/eh/builtin5.C: New test. * g++.dg/eh/builtin6.C: New test. * g++.dg/eh/builtin7.C: New test. * g++.dg/eh/builtin8.C: New test. * g++.dg/eh/builtin9.C: New test. * g++.dg/eh/builtin10.C: New test. * g++.dg/eh/builtin11.C: New test. * g++.dg/parse/crash55.C: Adjust expected diagnostics. * eh_cpp.cc (__cxa_throw): Change DEST argument type from void * to void (*) (void *). (_ITM_cxa_throw): Likewise. * libitm.h (_ITM_cxa_throw): Likewise. * libitm.texi (_ITM_cxa_throw): Likewise. From-SVN: r267179
Diffstat (limited to 'libitm')
-rw-r--r--libitm/ChangeLog9
-rw-r--r--libitm/eh_cpp.cc6
-rw-r--r--libitm/libitm.h2
-rw-r--r--libitm/libitm.texi2
4 files changed, 14 insertions, 5 deletions
diff --git a/libitm/ChangeLog b/libitm/ChangeLog
index bda0985..5ca36bb 100644
--- a/libitm/ChangeLog
+++ b/libitm/ChangeLog
@@ -1,3 +1,12 @@
+2018-12-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/88482
+ * eh_cpp.cc (__cxa_throw): Change DEST argument type from
+ void * to void (*) (void *).
+ (_ITM_cxa_throw): Likewise.
+ * libitm.h (_ITM_cxa_throw): Likewise.
+ * libitm.texi (_ITM_cxa_throw): Likewise.
+
2018-12-13 Peter Bergner <bergner@linux.ibm.com>
* config/powerpc/target.h (htm_available): Add support for
diff --git a/libitm/eh_cpp.cc b/libitm/eh_cpp.cc
index 7a6c376..55b0c4e 100644
--- a/libitm/eh_cpp.cc
+++ b/libitm/eh_cpp.cc
@@ -89,7 +89,7 @@ struct __cxa_eh_globals
extern void *__cxa_allocate_exception (size_t) WEAK;
extern void __cxa_free_exception (void *) WEAK;
-extern void __cxa_throw (void *, void *, void *) WEAK;
+extern void __cxa_throw (void *, void *, void (*) (void *)) WEAK;
extern void *__cxa_begin_catch (void *) WEAK;
extern void __cxa_end_catch (void) WEAK;
extern void __cxa_tm_cleanup (void *, void *, unsigned int) WEAK;
@@ -98,7 +98,7 @@ extern __cxa_eh_globals *__cxa_get_globals (void) WEAK;
#if !defined (HAVE_ELF_STYLE_WEAKREF)
void *__cxa_allocate_exception (size_t) { return NULL; }
void __cxa_free_exception (void *) { return; }
-void __cxa_throw (void *, void *, void *) { return; }
+void __cxa_throw (void *, void *, void (*) (void *)) { return; }
void *__cxa_begin_catch (void *) { return NULL; }
void __cxa_end_catch (void) { return; }
void __cxa_tm_cleanup (void *, void *, unsigned int) { return; }
@@ -136,7 +136,7 @@ _ITM_cxa_free_exception (void *exc_ptr)
}
void
-_ITM_cxa_throw (void *obj, void *tinfo, void *dest)
+_ITM_cxa_throw (void *obj, void *tinfo, void (*dest) (void *))
{
// This used to be instrumented, but does not need to be anymore.
__cxa_throw (obj, tinfo, dest);
diff --git a/libitm/libitm.h b/libitm/libitm.h
index daf342e..dd9b5de 100644
--- a/libitm/libitm.h
+++ b/libitm/libitm.h
@@ -284,7 +284,7 @@ extern void _ITM_deregisterTMCloneTable (void *);
extern void *_ITM_cxa_allocate_exception (size_t);
extern void _ITM_cxa_free_exception (void *exc_ptr);
-extern void _ITM_cxa_throw (void *obj, void *tinfo, void *dest);
+extern void _ITM_cxa_throw (void *obj, void *tinfo, void (*dest) (void *));
extern void *_ITM_cxa_begin_catch (void *exc_ptr);
extern void _ITM_cxa_end_catch (void);
extern void _ITM_commitTransactionEH(void *exc_ptr) ITM_REGPARM;
diff --git a/libitm/libitm.texi b/libitm/libitm.texi
index 7a91348..d0b7b07 100644
--- a/libitm/libitm.texi
+++ b/libitm/libitm.texi
@@ -269,7 +269,7 @@ transactions.
void _ITM_commitTransactionEH(void *exc_ptr) ITM_REGPARM;
void *_ITM_cxa_allocate_exception (size_t);
void _ITM_cxa_free_exception (void *exc_ptr);
-void _ITM_cxa_throw (void *obj, void *tinfo, void *dest);
+void _ITM_cxa_throw (void *obj, void *tinfo, void (*dest) (void *));
void *_ITM_cxa_begin_catch (void *exc_ptr);
void _ITM_cxa_end_catch (void);
@end example