https://gcc.gnu.org/g:5a924600ea2f5fc3aee95385117ffaf492fa9203
commit 5a924600ea2f5fc3aee95385117ffaf492fa9203 Author: Pranil Dey <mkd...@gmail.com> Date: Tue Oct 1 10:10:17 2024 +0530 removed conflicts Diff: --- gcc/tree-eh.cc | 99 ---------------------------------------------------------- 1 file changed, 99 deletions(-) diff --git a/gcc/tree-eh.cc b/gcc/tree-eh.cc index 6ed705d6ebe9..37eb6081eca9 100644 --- a/gcc/tree-eh.cc +++ b/gcc/tree-eh.cc @@ -2275,106 +2275,7 @@ make_eh_dispatch_edges (geh_dispatch *stmt) return true; } -bool -same_or_derived_type (tree t1, tree t2) -{ - t1 = TYPE_MAIN_VARIANT (t1); - t2 = TYPE_MAIN_VARIANT (t2); - if (t1 == t2) - return true; - while ((TREE_CODE (t1) == POINTER_TYPE || TREE_CODE (t1) == REFERENCE_TYPE) - && TREE_CODE (t1) == TREE_CODE (t2)) - { - t1 = TYPE_MAIN_VARIANT (TREE_TYPE (t1)); - t2 = TYPE_MAIN_VARIANT (TREE_TYPE (t2)); - } - if (t1 == t2) - return true; - if (!AGGREGATE_TYPE_P (t1) || !AGGREGATE_TYPE_P (t2)) - return false; - return odr_equivalent_or_derived_p (t1, t2); -} - -// Check if a landing pad can handle any of the given exception types -bool match_lp(eh_landing_pad lp, vec<tree> *exception_types) { - eh_region region = lp->region; - - // Ensure the region is of type ERT_TRY - if (region && region->type == ERT_TRY) { - eh_catch_d *catch_handler = region->u.eh_try.first_catch; - - while (catch_handler) { - tree type_list = catch_handler->type_list; - - if (!type_list) - return true; - - for (tree t = type_list; t; t = TREE_CHAIN(t)) { - tree type = TREE_VALUE(t); - for (unsigned i = 0; i < exception_types->length(); ++i) { - // match found or a catch-all handler (NULL) - if (!type || same_or_derived_type ((*exception_types)[i], type)) { - return true; - } - } - } - catch_handler = catch_handler->next_catch; - } - } - return false; -} - -// Function to update landing pad in throw_stmt_table for a given statement -void update_stmt_eh_region(gimple *stmt) { - auto_vec<tree> exception_types; - if (!stmt_throw_types (cfun, stmt, &exception_types)) { - return; - } - - int lp_nr = lookup_stmt_eh_lp_fn(cfun, stmt); - if (lp_nr <= 0) { - return; - } - - eh_landing_pad lp = get_eh_landing_pad_from_number(lp_nr); - if (!lp) { - return; - } - - eh_region region = lp->region; - - // Walk up the region tree - while (region) { - switch (region->type) { - case ERT_CLEANUP: - *cfun->eh->throw_stmt_table->get(const_cast<gimple *>(stmt)) = lp->index; - return; - case ERT_TRY: - if (match_lp(lp, &exception_types)) { - *cfun->eh->throw_stmt_table->get(const_cast<gimple *>(stmt)) = lp->index; - return; - } - break; - - case ERT_MUST_NOT_THROW: - // Undefined behavior, leave edge unchanged - return; - - case ERT_ALLOWED_EXCEPTIONS: - if (!match_lp(lp, &exception_types)) { - return; - } - break; - - default: - break; - } - region = region->outer; - } - - remove_stmt_from_eh_lp_fn(cfun, stmt); -} bool same_or_derived_type (tree t1, tree t2) {