static tree declare_nothrow_library_fn (tree name, tree return_type, tree parm_type) { return push_library_fn (name, build_function_type_list (return_type, parm_type, NULL_TREE), empty_except_spec); }
static tree declare_library_fn (tree name, tree return_type, tree parm_type, int ecf_flags) { return push_library_fn (name, build_function_type_list (return_type, parm_type, NULL_TREE), empty_except_spec, ecf_flags); }
static tree declare_library_fn (const char *name, tree rtype, tree ptype, int ecf, int tm_ecf) { tree ident = get_identifier (name); tree res = get_global_binding (ident); if (!res) { tree type = build_function_type_list (rtype, ptype, NULL_TREE); tree except = ecf & ECF_NOTHROW ? empty_except_spec : NULL_TREE; res = push_library_fn (ident, type, except, ecf); if (tm_ecf && flag_tm) { char *tm_name = concat ("_ITM_", name + 2, NULL_TREE); tree tm_ident = get_identifier (tm_name); free (tm_name); tree tm_fn = get_global_binding (tm_ident); if (!tm_fn) tm_fn = push_library_fn (tm_ident, type, except, ecf | tm_ecf); record_tm_replacement (res, tm_fn); } } return res; }
static tree do_allocate_exception (tree type) { tree fn; fn = get_identifier ("__cxa_allocate_exception"); if (!get_global_value_if_present (fn, &fn)) { /* Declare void *__cxa_allocate_exception(size_t). */ tree tmp = tree_cons (NULL_TREE, size_type_node, void_list_node); fn = push_library_fn (fn, build_function_type (ptr_type_node, tmp)); } return build_function_call (fn, tree_cons (NULL_TREE, size_in_bytes (type), NULL_TREE)); }
static tree do_begin_catch (void) { tree fn; fn = get_identifier ("__cxa_begin_catch"); if (!get_global_value_if_present (fn, &fn)) { /* Declare void* __cxa_begin_catch (void *). */ tree tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node); fn = push_library_fn (fn, build_function_type (ptr_type_node, tmp)); } return build_function_call (fn, tree_cons (NULL_TREE, build_exc_ptr (), NULL_TREE)); }
static tree /* APPLE LOCAL radar 2848255 */ do_begin_catch (tree type) { tree fn; /* APPLE LOCAL begin radar 2848255 */ if (c_dialect_objc () && objc2_valid_objc_catch_type (type)) fn = get_identifier ("objc_begin_catch"); else fn = get_identifier ("__cxa_begin_catch"); /* APPLE LOCAL end radar 2848255 */ if (!get_global_value_if_present (fn, &fn)) { /* Declare void* __cxa_begin_catch (void *). */ tree tmp = tree_cons (NULL_TREE, ptr_type_node, void_list_node); fn = push_library_fn (fn, build_function_type (ptr_type_node, tmp)); } return build_function_call (fn, tree_cons (NULL_TREE, build_exc_ptr (), NULL_TREE)); }
static tree call_eh_info () { tree fn; fn = get_identifier ("__start_cp_handler"); if (IDENTIFIER_GLOBAL_VALUE (fn)) fn = IDENTIFIER_GLOBAL_VALUE (fn); else { tree t1, t, fields[7]; /* Declare cp_eh_info * __start_cp_handler (void), as defined in exception.cc. */ /* struct cp_eh_info. This must match exception.cc. Note that this type is not pushed anywhere. */ t1= make_aggr_type (RECORD_TYPE); fields[0] = build_decl (FIELD_DECL, get_identifier ("handler_label"), ptr_type_node); fields[1] = build_decl (FIELD_DECL, get_identifier ("dynamic_handler_chain"), ptr_type_node); fields[2] = build_decl (FIELD_DECL, get_identifier ("info"), ptr_type_node); fields[3] = build_decl (FIELD_DECL, get_identifier ("table_index"), ptr_type_node); /* N.B.: The fourth field LEN is expected to be the number of fields - 1, not the total number of fields. */ finish_builtin_type (t1, "eh_context", fields, 3, ptr_type_node); t1 = build_pointer_type (t1); t1= make_aggr_type (RECORD_TYPE); #ifdef TARG_XTENSA fields[0] = build_decl (FIELD_DECL, get_identifier ("version"), integer_type_node); /* N.B.: The fourth field LEN is expected to be the number of fields - 1, not the total number of fields. */ finish_builtin_type (t1, "__eh_info", fields, 0, ptr_type_node); #else fields[0] = build_decl (FIELD_DECL, get_identifier ("match_function"), ptr_type_node); fields[1] = build_decl (FIELD_DECL, get_identifier ("language"), short_integer_type_node); fields[2] = build_decl (FIELD_DECL, get_identifier ("version"), short_integer_type_node); /* N.B.: The fourth field LEN is expected to be the number of fields - 1, not the total number of fields. */ finish_builtin_type (t1, "__eh_info", fields, 2, ptr_type_node); #endif t = make_aggr_type (RECORD_TYPE); fields[0] = build_decl (FIELD_DECL, get_identifier ("eh_info"), t1); fields[1] = build_decl (FIELD_DECL, get_identifier ("value"), ptr_type_node); fields[2] = build_decl (FIELD_DECL, get_identifier ("type"), ptr_type_node); fields[3] = build_decl (FIELD_DECL, get_identifier ("cleanup"), build_pointer_type (build_function_type (ptr_type_node, tree_cons (NULL_TREE, ptr_type_node, void_list_node)))); fields[4] = build_decl (FIELD_DECL, get_identifier ("caught"), boolean_type_node); fields[5] = build_decl (FIELD_DECL, get_identifier ("next"), build_pointer_type (t)); fields[6] = build_decl (FIELD_DECL, get_identifier ("handlers"), long_integer_type_node); /* N.B.: The fourth field LEN is expected to be the number of fields - 1, not the total number of fields. */ finish_builtin_type (t, "cp_eh_info", fields, 6, ptr_type_node); t = build_pointer_type (t); /* And now the function. */ fn = push_library_fn (fn, build_function_type (t, void_list_node)); } return build_function_call (fn, NULL_TREE); }