From d97c6a13f0662e4cc6dfecfa26896ae6fc4d7075 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pawe=C5=82=20Sikora?= Date: Mon, 3 Oct 2005 09:28:46 +0000 Subject: [PATCH] - fix java ICE during .class -> native compilation. Changed files: gcc4-pr19505.patch -> 1.1 --- gcc4-pr19505.patch | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 gcc4-pr19505.patch diff --git a/gcc4-pr19505.patch b/gcc4-pr19505.patch new file mode 100644 index 0000000..3d6194a --- /dev/null +++ b/gcc4-pr19505.patch @@ -0,0 +1,32 @@ +The problem here is that have two basic block forwarders which go to the +same basic block but destination of two different eh regions. We cannot +forward both of these basic blocks to that other basic block. + +The way I fixed the issue is to make sure that if we removing +a forwarder block which is coming in from a EH edge, make sure +that the destination basic block have only one single predecessor. +Yes this is too strong but there is no simple way to check if a basic +block is the destination of a different eh region. + +--- gcc/gcc/tree-cfgcleanup.c 19 Aug 2005 18:52:55 -0000 2.7 ++++ gcc/gcc/tree-cfgcleanup.c 24 Sep 2005 23:30:54 -0000 +@@ -392,7 +392,18 @@ remove_forwarder_block (basic_block bb, + return false; + } + } +- ++ /* Check to make sure that we can remove a forwarder block for eh edges. */ ++ FOR_EACH_EDGE (e, ei, bb->preds) ++ { ++ /* This check is too strong, we should also be checking eh regions ++ but this is much harder. */ ++ if (e->flags & EDGE_EH) ++ { ++ if (!single_pred_p (dest)) ++ return false; ++ } ++ } ++ + /* Redirect the edges. */ + for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); ) + { -- 2.44.0