Ping^2.

> -----Original Message-----
> From: Gcc-patches <gcc-patches-boun...@gcc.gnu.org> On Behalf Of Alex
> Coplan
> Sent: 03 August 2020 16:02
> To: gcc-patches@gcc.gnu.org
> Subject: RE: [PATCH] driver: Fix several memory leaks
> 
> Ping.
> 
> > -----Original Message-----
> > From: Jit <jit-boun...@gcc.gnu.org> On Behalf Of Alex Coplan
> > Sent: 14 July 2020 10:08
> > To: gcc-patches@gcc.gnu.org; j...@gcc.gnu.org
> > Subject: [PATCH] driver: Fix several memory leaks
> >
> > Updating the subject since this is really just a driver change (and
> > therefore needs a review from those who can approve patches there).
> >
> > Thanks,
> > Alex
> >
> > -----Original Message-----
> > From: Jit <jit-boun...@gcc.gnu.org> On Behalf Of Alex Coplan
> > Sent: 09 July 2020 21:13
> > To: gcc-patches@gcc.gnu.org; j...@gcc.gnu.org
> > Cc: nd <n...@arm.com>
> > Subject: [PATCH] libgccjit: Fix several memory leaks in the driver
> >
> > Hello,
> >
> > This patch fixes several memory leaks in the driver, all of which
> relate
> > to the handling of static specs. We introduce functions
> > set_static_spec_{shared,owned}() which are used to enforce proper
> memory
> > management when updating the strings in the static_specs table.
> >
> > This is achieved by making use of the alloc_p field in the table
> > entries. Similarly to set_spec(), each time we update an entry, we
> check
> > whether alloc_p is set, and free the old value if so. We then set
> > alloc_p correctly based on whether we "own" this memory or whether
> we're
> > just taking a pointer to a shared string which we shouldn't free.
> >
> > The following table shows the number of leaks found by AddressSanitizer
> > when running a minimal libgccjit program on AArch64. The test program
> > does the whole libgccjit compilation cycle in a loop (including
> acquiring
> > and releasing the context), and the table below shows the number of
> leaks
> > for different iterations of that loop.
> >
> > +--------------+-----+-----+------+---------------+
> > | # of runs >  | 1   | 2   | 3    | Leaks per run |
> > +--------------+-----+-----+------+---------------+
> > | Before patch | 463 | 940 | 1417 | 477           |
> > +--------------+-----+-----+------+---------------+
> > | After patch  | 416 | 846 | 1276 | 430           |
> > +--------------+-----+-----+------+---------------+
> >
> > Ensuring that we minimize "leaks per run" (ultimately eliminating all
> of
> > them) is important in order for long-running applications to be able to
> > make use of in-process libgccjit.
> >
> > Testing:
> >  * Bootstrap and regtest on aarch64-linxu-gnu, x86_64-linux-gnu.
> >  * Bootstrap and regtest on aarch64-linux-gnu with bootstrap-asan
> config.
> >  * Smoke test of libgccjit, ran regressions on a --disable-bootstrap
> > build on
> >    aarch64-linux-gnu.
> >
> > OK for master?
> >
> > Thanks,
> > Alex
> >
> > ---
> >
> > gcc/ChangeLog:
> >
> > 2020-07-09  Alex Coplan  <alex.cop...@arm.com>
> >
> >     * gcc.c (set_static_spec): New.
> >     (set_static_spec_owned): New.
> >     (set_static_spec_shared): New.
> >     (driver::maybe_putenv_COLLECT_LTO_WRAPPER): Use
> >     set_static_spec_owned() to take ownership of lto_wrapper_file
> >     such that it gets freed in driver::finalize.
> >     (driver::maybe_run_linker): Use set_static_spec_shared() to
> >     ensure that we don't try and free() the static string "ld",
> >     also ensuring that any previously-allocated string in
> >     linker_name_spec is freed. Likewise with argv0.
> >     (driver::finalize): Use set_static_spec_shared() when resetting
> >     specs that previously had allocated strings; remove if(0)
> >     around call to free().

Reply via email to