static tree do_end_catch (tree type) { tree fn, cleanup; fn = get_identifier ("__cxa_end_catch"); if (!get_global_value_if_present (fn, &fn)) { /* Declare void __cxa_end_catch (). This can throw if the destructor for the exception throws. */ fn = push_void_library_fn (fn, void_list_node, 0); /* Create its transactional-memory equivalent. */ if (flag_tm) { tree fn2 = get_identifier ("_ITM_cxa_end_catch"); if (!get_global_value_if_present (fn2, &fn2)) fn2 = push_void_library_fn (fn2, void_list_node, ECF_TM_PURE); record_tm_replacement (fn, fn2); } } cleanup = cp_build_function_call_vec (fn, NULL, tf_warning_or_error); TREE_NOTHROW (cleanup) = dtor_nothrow (type); return cleanup; }
static tree do_free_exception (tree ptr) { tree fn; fn = get_identifier ("__cxa_free_exception"); if (!get_global_value_if_present (fn, &fn)) { /* Declare void __cxa_free_exception (void *). */ fn = push_void_library_fn (fn, tree_cons (NULL_TREE, ptr_type_node, void_list_node)); } return build_function_call (fn, tree_cons (NULL_TREE, ptr, NULL_TREE)); }
static tree do_end_catch (tree type) { tree fn, cleanup; fn = get_identifier ("__cxa_end_catch"); if (!get_global_value_if_present (fn, &fn)) { /* Declare void __cxa_end_catch (). */ fn = push_void_library_fn (fn, void_list_node); /* This can throw if the destructor for the exception throws. */ TREE_NOTHROW (fn) = 0; } cleanup = build_function_call (fn, NULL_TREE); TREE_NOTHROW (cleanup) = dtor_nothrow (type); return cleanup; }
static tree do_end_catch (tree type) { tree fn, cleanup; /* APPLE LOCAL begin radar 2848255 */ if (c_dialect_objc () && objc2_valid_objc_catch_type (type)) fn = get_identifier ("objc_end_catch"); else fn = get_identifier ("__cxa_end_catch"); /* APPLE LOCAL end radar 2848255 */ if (!get_global_value_if_present (fn, &fn)) { /* Declare void __cxa_end_catch (). */ fn = push_void_library_fn (fn, void_list_node); /* This can throw if the destructor for the exception throws. */ TREE_NOTHROW (fn) = 0; } cleanup = build_function_call (fn, NULL_TREE); TREE_NOTHROW (cleanup) = dtor_nothrow (type); return cleanup; }