From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25359 invoked by alias); 24 Aug 2011 15:11:53 -0000 Received: (qmail 25308 invoked by uid 22791); 24 Aug 2011 15:11:47 -0000 X-SWARE-Spam-Status: No, hits=-2.6 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_BJ,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-gx0-f169.google.com (HELO mail-gx0-f169.google.com) (209.85.161.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 24 Aug 2011 15:11:16 +0000 Received: by gxk23 with SMTP id 23so1006236gxk.0 for ; Wed, 24 Aug 2011 08:11:15 -0700 (PDT) Received: by 10.101.47.1 with SMTP id z1mr4804614anj.135.1314198675636; Wed, 24 Aug 2011 08:11:15 -0700 (PDT) Received: from localhost.localdomain (c-98-232-221-4.hsd1.or.comcast.net [98.232.221.4]) by mx.google.com with ESMTPS id d7sm968071anb.40.2011.08.24.08.11.13 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 24 Aug 2011 08:11:14 -0700 (PDT) From: matt rice To: gdb-patches@sourceware.org Cc: matt rice Subject: [PATCH 2/7] [python] API for macros: memory management quirks. Date: Wed, 24 Aug 2011 15:11:00 -0000 Message-Id: <1314198654-9008-3-git-send-email-ratmice@gmail.com> In-Reply-To: <1314198654-9008-1-git-send-email-ratmice@gmail.com> References: <1314198654-9008-1-git-send-email-ratmice@gmail.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-08/txt/msg00444.txt.bz2 2011-08-23 Matt Rice objfile_obstack, - objfile->macro_cache); + pending_macros = new_macro_table (objfile, macro_table_type_from_objfile); if (! current_file) /* If we have no current file, then this must be the start_file diff --git a/gdb/macroscope.c b/gdb/macroscope.c index b529e68..2447670 100644 --- a/gdb/macroscope.c +++ b/gdb/macroscope.c @@ -160,7 +160,7 @@ extern initialize_file_ftype _initialize_macroscope; void _initialize_macroscope (void) { - macro_user_macros = new_macro_table (0, 0); + macro_user_macros = new_macro_table (NULL, macro_table_type_user_defined); macro_set_main (macro_user_macros, ""); macro_allow_redefinitions (macro_user_macros); } diff --git a/gdb/macrotab.c b/gdb/macrotab.c index efcf835..b2825d2 100644 --- a/gdb/macrotab.c +++ b/gdb/macrotab.c @@ -35,13 +35,10 @@ struct macro_table { - /* The obstack this table's data should be allocated in, or zero if - we should use xmalloc. */ - struct obstack *obstack; - - /* The bcache we should use to hold macro names, argument names, and - definitions, or zero if we should use xmalloc. */ - struct bcache *bcache; + /* The objfile who's obstack this table's data should be allocated in, + and bcache we should use to hold macro names, argument + names, and definitions, or zero if we should use xmalloc. */ + struct objfile *objfile; /* The main source file for this compilation unit --- the one whose name was given to the compiler. This is the root of the @@ -83,8 +80,8 @@ struct macro_table static void * macro_alloc (int size, struct macro_table *t) { - if (t->obstack) - return obstack_alloc (t->obstack, size); + if (t->objfile) + return obstack_alloc (&t->objfile->objfile_obstack, size); else return xmalloc (size); } @@ -93,7 +90,7 @@ macro_alloc (int size, struct macro_table *t) static void macro_free (void *object, struct macro_table *t) { - if (t->obstack) + if (t->objfile) /* There are cases where we need to remove entries from a macro table, even when reading debugging information. This should be rare, and there's no easy way to free arbitrary data from an @@ -110,8 +107,10 @@ macro_free (void *object, struct macro_table *t) static const void * macro_bcache (struct macro_table *t, const void *addr, int len) { - if (t->bcache) - return bcache (addr, len, t->bcache); + gdb_assert (t->objfile == NULL || (t->objfile && t->objfile->macro_cache)); + + if (t->objfile && t->objfile->macro_cache) + return bcache (addr, len, t->objfile->macro_cache); else { void *copy = xmalloc (len); @@ -137,7 +136,7 @@ macro_bcache_str (struct macro_table *t, const char *s) static void macro_bcache_free (struct macro_table *t, void *obj) { - if (t->bcache) + if (t->objfile) /* There are cases where we need to remove entries from a macro table, even when reading debugging information. This should be rare, and there's no easy way to free data from a bcache, so we @@ -147,6 +146,12 @@ macro_bcache_free (struct macro_table *t, void *obj) xfree (obj); } +/* Return the objfile of the macro table, NULL if it is user defined. */ +struct objfile * +macro_table_objfile (struct macro_table *table) +{ + return table->objfile; +} /* Macro tree keys, w/their comparison, allocation, and freeing functions. */ @@ -438,7 +443,7 @@ macro_main (struct macro_table *t) void macro_allow_redefinitions (struct macro_table *t) { - gdb_assert (! t->obstack); + gdb_assert (! t->objfile); t->redef_ok = 1; } @@ -972,20 +977,26 @@ macro_for_each_in_scope (struct macro_source_file *file, int line, struct macro_table * -new_macro_table (struct obstack *obstack, - struct bcache *b) +new_macro_table (struct objfile *objfile, enum macro_table_type table_type) { struct macro_table *t; + if (table_type == macro_table_type_user_defined) + gdb_assert (objfile == NULL); + else if (table_type == macro_table_type_from_objfile) + { + gdb_assert (objfile != NULL); + gdb_assert (objfile->macro_cache != NULL); + } + /* First, get storage for the `struct macro_table' itself. */ - if (obstack) - t = obstack_alloc (obstack, sizeof (*t)); - else + if (table_type == macro_table_type_from_objfile) + t = obstack_alloc (&objfile->objfile_obstack, sizeof (*t)); + else if (table_type == macro_table_type_user_defined) t = xmalloc (sizeof (*t)); memset (t, 0, sizeof (*t)); - t->obstack = obstack; - t->bcache = b; + t->objfile = objfile; t->main_source = NULL; t->redef_ok = 0; t->definitions = (splay_tree_new_with_allocator diff --git a/gdb/macrotab.h b/gdb/macrotab.h index a10351a..a773c49 100644 --- a/gdb/macrotab.h +++ b/gdb/macrotab.h @@ -21,8 +21,7 @@ #ifndef MACROTAB_H #define MACROTAB_H -struct obstack; -struct bcache; +struct objfile; /* How do we represent a source location? I mean, how should we represent them within GDB; the user wants to use all sorts of @@ -149,23 +148,28 @@ struct macro_source_file }; -/* Create a new, empty macro table. Allocate it in OBSTACK, or use - xmalloc if OBSTACK is zero. Use BCACHE to store all macro names, - arguments, definitions, and anything else that might be the same - amongst compilation units in an executable file; if BCACHE is zero, - don't cache these things. +enum macro_table_type { + macro_table_type_user_defined, + macro_table_type_from_objfile +}; - Note that, if either OBSTACK or BCACHE are non-zero, then removing - information from the table may leak memory. Neither obstacks nor - bcaches really allow you to remove information, so although we can - update the data structure to record the change, we can't free the - old data. At the moment, since we only provide obstacks and - bcaches for macro tables for symtabs, this isn't a problem; only - odd debugging information makes a definition and then deletes it at - the same source location (although 'gcc -DFOO -UFOO -DFOO=2' does - do that in GCC 4.1.2.). */ -struct macro_table *new_macro_table (struct obstack *obstack, - struct bcache *bcache); +/* Create a new, empty macro table. Allocate it in OBJFILE's obstack, + or use xmalloc if OBJFILE is zero. Use OBJFILE's bcache to store + all macro names, arguments, definitions, and anything else that + might be the same amongst compilation units in an executable file; + if OBJFILE is zero, don't cache these things. + + Note that, if OBJFILE is non-zero, then removing information from the + table may leak memory. Neither obstacks nor bcaches really allow + you to remove information, so although we can update the data + structure to record the change, we can't free the old data. + At the moment, since we only provide obstacks and bcaches for macro + tables for symtabs, this isn't a problem; only odd debugging + information makes a definition and then deletes it at the same + source location (although 'gcc -DFOO -UFOO -DFOO=2' does do that + in GCC 4.1.2.). */ +struct macro_table *new_macro_table (struct objfile *objfile, + enum macro_table_type table_type); /* Free TABLE, and any macro definitions, source file structures, @@ -173,6 +177,10 @@ struct macro_table *new_macro_table (struct obstack *obstack, allocated on an obstack, or if it uses a bcache. */ void free_macro_table (struct macro_table *table); +/* Returns the OBJFILE for the given table, if the table + is for user-defined macros this function will return NULL. */ +struct objfile * macro_table_objfile (struct macro_table *table); + /* Set FILENAME as the main source file of TABLE. Return a source file structure describing that file; if we record the #definition -- 1.7.4.4