[PATCH] Put cleanups of cleanups after cleanups (PR gcov-profile/64634)

Jeff Law law@redhat.com
Wed Feb 18 22:03:00 GMT 2015


On 02/18/15 11:40, Jakub Jelinek wrote:
> Hi!
>
> Richard's GIMPLE EH rewrite in r151696 regressed following testcase.
> The problem is that when lowering:
>    [gcov-15.C:14:5] try
>      {
>        [gcov-15.C:18:12] D.2335 = __cxa_allocate_exception (4);
>        [gcov-15.C:18:12] try
>          {
>            [gcov-15.C:18:12] [gcov-15.C:18:12] MEM[(int *)D.2335] = 5;
>          }
>        catch
>          {
>            [gcov-15.C:18:11] __cxa_free_exception (D.2335);
>          }
>        [gcov-15.C:18:11] __cxa_throw (D.2335, &_ZTIi, 0B);
>      }
>    catch
>      {
>        [gcov-15.C:20:3] catch (NULL)
>          {
>            [gcov-15.C:20:3] try
>              {
>                [gcov-15.C:20:10] D.2340 = __builtin_eh_pointer (0);
>                [gcov-15.C:20:10] __cxa_begin_catch (D.2340);
>                [gcov-15.C:22:15] catchEx ();
>              }
>            finally
>              {
>                [gcov-15.C:20:10] __cxa_end_catch ();
>              }
>          }
>      }
> we put the cleanup of the catch cleanup in front of the catch cleanup
> in the EH sequence:
>    [gcov-15.C:18:12] D.2335 = __cxa_allocate_exception (4);
>    [gcov-15.C:18:12] [gcov-15.C:18:12] MEM[(int *)D.2335] = 5;
>    [gcov-15.C:18:11] __cxa_throw (D.2335, &_ZTIi, 0B);
>    <D.2345>:
>    [gcov-15.C:24:1] D.2341 = 0;
>    [gcov-15.C:24:1] goto <D.2342>;
>    <D.2342>:
>    [gcov-15.C:24:1] return D.2341;
>    <D.2343>:
>    [gcov-15.C:20:10] __cxa_end_catch ();
>    resx 3
>    <D.2346>:
>    eh_dispatch 1
>    resx 1
>    <D.2344>:
>    [gcov-15.C:20:10] D.2340 = __builtin_eh_pointer (1);
>    [gcov-15.C:20:10] __cxa_begin_catch (D.2340);
>    [gcov-15.C:22:15] catchEx ();
>    [gcov-15.C:20:10] __cxa_end_catch ();
>    goto <D.2345>;
> and as the __cxa_end_catch () is the first bb for line 20,
> gcov without -a considers that bb count as the one to be shown.
> Before the gimple EH rewrite and also with this patch we instead
> order the cleanup (__cxa_end_catch ()) after the __cxa_begin_catch ():
>    [gcov-15.C:18:12] D.2335 = __cxa_allocate_exception (4);
>    [gcov-15.C:18:12] [gcov-15.C:18:12] MEM[(int *)D.2335] = 5;
>    [gcov-15.C:18:11] __cxa_throw (D.2335, &_ZTIi, 0B);
>    <D.2345>:
>    [gcov-15.C:24:1] D.2341 = 0;
>    [gcov-15.C:24:1] goto <D.2342>;
>    <D.2342>:
>    [gcov-15.C:24:1] return D.2341;
>    <D.2346>:
>    eh_dispatch 1
>    resx 1
>    <D.2344>:
>    [gcov-15.C:20:10] D.2340 = __builtin_eh_pointer (1);
>    [gcov-15.C:20:10] __cxa_begin_catch (D.2340);
>    [gcov-15.C:22:15] catchEx ();
>    [gcov-15.C:20:10] __cxa_end_catch ();
>    goto <D.2345>;
>    <D.2343>:
>    [gcov-15.C:20:10] __cxa_end_catch ();
>    resx 3
>
> Bootstrapped/regtested on x86_64-linux and i686-linux,
> libstdc++.so.6 compiled without and with the patch is identical on
> x86_64-linux.  The testcase also has identical generated code both at -O0
> and -O2 when compiled without coverage.  Ok for trunk?
>
> 2015-02-18  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR gcov-profile/64634
> 	* tree-eh.c (frob_into_branch_around): Fix up typos
> 	in function comment.
> 	(lower_catch): Put eh_seq resulting from EH lowering of
> 	the cleanup sequence after the cleanup rather than before
> 	it.
>
> 	* g++.dg/gcov/gcov-15.C: New test.
OK.
jeff



More information about the Gcc-patches mailing list