Bug 34478 - Memory leak in genconditions
Summary: Memory leak in genconditions
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: driver (show other bugs)
Version: 3.4.6
: P3 enhancement
Target Milestone: 4.2.0
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-12-15 11:47 UTC by huiwu
Modified: 2007-12-15 12:04 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description huiwu 2007-12-15 11:47:34 UTC
in genconditions source, can see following code:

183    int main(int argc, char **argv)
184    {
         ...
194      if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
195	    return (FATAL_EXIT_CODE);
196	
197	  condition_table = htab_create (1000, hash_c_test, cmp_c_test, NULL);
          ...
       }

While in function init_md_reader, condition_table has been allocated as following:

907  int
908  init_md_reader (const char *filename)
909  {
        ...
928     condition_table = htab_create (n_insn_conditions,
929			 hash_c_test, cmp_c_test, NULL);
        ...
}

condition_table is allocated by xalloc, which seems not control by GC, so it seems some memory leak here.
Suggest to add
if (condition_table)
   delete condition_table;

just before line 197 above.
Comment 1 Andrew Pinski 2007-12-15 12:04:25 UTC
Fixed by:
r110119 | zack | 2006-01-23 07:15:05 -0800 (Mon, 23 Jan 2006) | 37 lines

 r110123@banpei:  zack | 2006-01-22 14:44:34 -0800
        * genconditions.c (condition_table, add_condition): Delete.
        (write_conditions): Don't emit n_insn_conditions nor
        insn_elision_unavailable.  Issue the gcc version #ifdef here,
        inside the table, with no #else clause ...
        (write_header): ...not here.
        (write_writer): New function.
        (main): Don't initialize condition_table.  Use add_c_test.
        Call write_writer.
        * gensupport.c (init_md_reader_args_cb): Handle multiple input
        files on the command line.
        (maybe_eval_c_test): Don't check insn_elision_unavailable.
        Return -1 if there is no entry in the table, don't abort.
        (add_c_test, traverse_c_tests): New functions.
        * gensupport.h (insn_elision_unavailable, insn_conditions)
        (n_insn_conditions): Delete declarations.
        (add_c_test, traverse_c_tests): Declare.
        * read-rtl.c: Include gensupport.h.
        (read_conditions): New function.
        (read_rtx): If read_rtx_1 returns 0, treat as EOF.
        (read_rtx_1): If we get EOF when we were looking for an initial
        open paren, return 0.  Call read_conditions when appropriate.
        * Makefile.in: Kill BUILD_EARLY_SUPPORT and all references to
        dummy-conditions.o.  Eliminate references to insn-conditions.o,
        or change them to build/gencondmd.o, as appropriate.  Remove
        insn-constants.h from $(simple_generated_h) and insn-conditions.c
        from $(simple_generated_c).  For all files remaining in those
        two lists, add insn-conditions.md to the generator command line.
        Give insn-constants.h/s-constants their own rules.  Add rules
        for build/gencondmd.c, s-conditions, insn-conditions.md, s-condmd.
        (build/read-rtl.o): Depend on gensupport.h.
        (genprognormal): Include preds.
        (genprogearly): Rename genprognoprint; only difference is now that
        they don't link with $(BUILD_PRINT).
        * dummy-conditions.c: Delete.