Use gdbarch obstack to allocate types in alloc_type_arch
authorPatrick Palka <patrick@parcs.ath.cx>
Mon, 29 Jun 2015 14:39:26 +0000 (10:39 -0400)
committerPatrick Palka <patrick@parcs.ath.cx>
Sat, 29 Aug 2015 12:52:50 +0000 (08:52 -0400)
For the command "gdb gdb" valgrind currently reports 100s of individual
memory leaks, 500 of which originate solely out of the function
alloc_type_arch.  This function allocates a "struct type" associated
with the given gdbarch using malloc but apparently the types allocated
by this function are never freed.

This patch fixes these leaks by making the function alloc_type_arch
allocate these gdbarch-associated types on the gdbarch obstack instead
of on the general heap.  Since, from what I can tell, the types
allocated by this function are all fundamental "wired-in" types, such
types would not benefit from more granular memory management anyway.
They would likely live as long as the gdbarch is alive so allocating
them on the gdbarch obstack makes sense.

With this patch, the number of individual vargrind warnings emitted for
the command "gdb gdb" drops from ~800 to ~300.

Tested on x86_64-unknown-linux-gnu.

gdb/ChangeLog:

* gdbtypes.c (alloc_type_arch): Allocate the type on the given
gdbarch obstack instead of on the heap.  Update commentary
accordingly.

gdb/ChangeLog
gdb/gdbtypes.c

index 04749eccd188d63c1e872d477159ddbe69fe9316..e727bfb7b757e6ca73612c78f857143848e9b33c 100644 (file)
@@ -1,3 +1,9 @@
+2015-08-29  Patrick Palka  <patrick@parcs.ath.cx>
+
+       * gdbtypes.c (alloc_type_arch): Allocate the type on the given
+       gdbarch obstack instead of on the heap.  Update commentary
+       accordingly.
+
 2015-08-28  Joel Brobecker  <brobecker@adacore.com>
 
        GDB 7.10 released.
index 5c8e49c5d33c9c41bfbffe38db8ea275dc9d312a..8204d39d18504a0a81c0349509ea7836605295b4 100644 (file)
@@ -187,7 +187,7 @@ alloc_type (struct objfile *objfile)
 
 /* Allocate a new GDBARCH-associated type structure and fill it
    with some defaults.  Space for the type structure is allocated
-   on the heap.  */
+   on the obstack associated with GDBARCH.  */
 
 struct type *
 alloc_type_arch (struct gdbarch *gdbarch)
@@ -198,8 +198,8 @@ alloc_type_arch (struct gdbarch *gdbarch)
 
   /* Alloc the structure and start off with all fields zeroed.  */
 
-  type = XCNEW (struct type);
-  TYPE_MAIN_TYPE (type) = XCNEW (struct main_type);
+  type = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct type);
+  TYPE_MAIN_TYPE (type) = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct main_type);
 
   TYPE_OBJFILE_OWNED (type) = 0;
   TYPE_OWNER (type).gdbarch = gdbarch;