From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24074 invoked by alias); 5 Sep 2012 14:44:39 -0000 Received: (qmail 24037 invoked by uid 22791); 5 Sep 2012 14:44:35 -0000 X-SWARE-Spam-Status: No, hits=-1.2 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_HOSTKARMA_NO,TW_BJ X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 05 Sep 2012 14:44:14 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 363A81C6A09; Wed, 5 Sep 2012 10:44:13 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 9VRqP0UI0iJC; Wed, 5 Sep 2012 10:44:13 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id D97D01C69E8; Wed, 5 Sep 2012 10:44:12 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id 9678814561A; Wed, 5 Sep 2012 10:44:06 -0400 (EDT) Date: Wed, 05 Sep 2012 14:44:00 -0000 From: Joel Brobecker To: Tom Tromey Cc: gdb-patches@sourceware.org Subject: Re: RFC: printing pointers to global (data) variable on Windows... Message-ID: <20120905144406.GC2853@adacore.com> References: <20120816152255.GA2836@adacore.com> <87zk5umwj3.fsf@fleche.redhat.com> <20120816224524.GC2798@adacore.com> <87628hmwbr.fsf@fleche.redhat.com> <20120817231554.GF2798@adacore.com> <87r4r1h2u4.fsf@fleche.redhat.com> <20120821153627.GS2798@adacore.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0F1p//8PRICkK4MW" Content-Disposition: inline In-Reply-To: <20120821153627.GS2798@adacore.com> User-Agent: Mutt/1.5.20 (2009-06-14) 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: 2012-09/txt/msg00040.txt.bz2 --0F1p//8PRICkK4MW Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 1170 Hello, Here is a new version of the patch implementing Tom's idea of flagging size-less minimal symbols... On platforms where he size isn't set, i's a bit of a give-and-take, fixing the problem reported, at the cost of finding some symbols that we were previously fitering out (by luck or accident). I think it's for the best. gdb/ChangeLog: * symtab.h (struct minimal_symbol) [has_size]: New field. (MSYMBOL_SIZE): Adjust to forbid macro from being used as lvalue. (SET_MSYMBOL_SIZE, MSYMBOL_HAS_SIZE): New macros. * printcmd.c (build_address_symbolic): Only filter out zero-sized minimal symbols if the symbol's size is actually known. * minsyms.c (prim_record_minimal_symbol_full): Adjust setting of msymbol's size field. Add comment. (install_minimal_symbols): Use SET_MSYMBOL_SIZE to set the minimal symbol size. * elfread.c (elf_symtab_read, elf_rel_plt_read): Use SET_MSYMBOL_SIZE to set the minimal symbol size. Tested on all of AdaCore's supported platforms via our testsuite. Also tested on x86_64-linux using the official testsuite. OK to commit? Thanks, -- Joel --0F1p//8PRICkK4MW Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-Name-of-symbol-missing-when-printing-global-variable.patch" Content-length: 5296 >From b70bf2abc01142b7d93c6fd834d9926bdc9eea9c Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Wed, 22 Aug 2012 20:29:13 +0200 Subject: [PATCH] Name of symbol missing when printing global variable's address The build_address_symbolic funnction filters out data symbols if their size is set to zero. But the problem is that the COFF symbol table (for instance) does not provide any size information, leaving the size to its default value of zero, thus always triggering the filter. This shows up when trying to print the address of a global variable when debugging a Windows executable, for instance. gdb/ChangeLog: * symtab.h (struct minimal_symbol) [has_size]: New field. (MSYMBOL_SIZE): Adjust to forbid macro from being used as lvalue. (SET_MSYMBOL_SIZE, MSYMBOL_HAS_SIZE): New macros. * printcmd.c (build_address_symbolic): Only filter out zero-sized minimal symbols if the symbol's size is actually known. * minsyms.c (prim_record_minimal_symbol_full): Adjust setting of msymbol's size field. Add comment. (install_minimal_symbols): Use SET_MSYMBOL_SIZE to set the minimal symbol size. * elfread.c (elf_symtab_read, elf_rel_plt_read): Use SET_MSYMBOL_SIZE to set the minimal symbol size. --- gdb/elfread.c | 6 +++--- gdb/minsyms.c | 6 ++++-- gdb/printcmd.c | 1 + gdb/symtab.h | 14 +++++++++++++- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/gdb/symtab.h b/gdb/symtab.h index 76120a3..041d8cf 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -348,6 +348,11 @@ struct minimal_symbol unsigned int target_flag_1 : 1; unsigned int target_flag_2 : 1; + /* Nonzero iff the size of the minimal symbol has been set. + Symbol size information can sometimes not be determined, because + the object file format may not carry that piece of information. */ + unsigned int has_size : 1; + /* Minimal symbols with the same hash key are kept on a linked list. This is the link. */ @@ -361,7 +366,14 @@ struct minimal_symbol #define MSYMBOL_TARGET_FLAG_1(msymbol) (msymbol)->target_flag_1 #define MSYMBOL_TARGET_FLAG_2(msymbol) (msymbol)->target_flag_2 -#define MSYMBOL_SIZE(msymbol) (msymbol)->size +#define MSYMBOL_SIZE(msymbol) ((msymbol)->size + 0) +#define SET_MSYMBOL_SIZE(msymbol, sz) \ + do \ + { \ + (msymbol)->size = sz; \ + (msymbol)->has_size = 1; \ + } while (0) +#define MSYMBOL_HAS_SIZE(msymbol) ((msymbol)->has_size + 0) #define MSYMBOL_TYPE(msymbol) (msymbol)->type #include "minsyms.h" diff --git a/gdb/printcmd.c b/gdb/printcmd.c index d5b5b63..9e8cd65 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -680,6 +680,7 @@ build_address_symbolic (struct gdbarch *gdbarch, } if (msymbol != NULL + && MSYMBOL_HAS_SIZE (msymbol) && MSYMBOL_SIZE (msymbol) == 0 && MSYMBOL_TYPE (msymbol) != mst_text && MSYMBOL_TYPE (msymbol) != mst_text_gnu_ifunc diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 1070fff..2bad947 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -937,7 +937,9 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name, MSYMBOL_TYPE (msymbol) = ms_type; MSYMBOL_TARGET_FLAG_1 (msymbol) = 0; MSYMBOL_TARGET_FLAG_2 (msymbol) = 0; - MSYMBOL_SIZE (msymbol) = 0; + /* Do not use the SET_MSYMBOL_SIZE macro to initialize the size, + as it would also set the has_size flag. */ + msymbol->size = 0; /* The hash pointers must be cleared! If they're not, add_minsym_to_hash_table will NOT add this msymbol to the hash table. */ @@ -1233,7 +1235,7 @@ install_minimal_symbols (struct objfile *objfile) SYMBOL_VALUE_ADDRESS (&msymbols[mcount]) = 0; MSYMBOL_TARGET_FLAG_1 (&msymbols[mcount]) = 0; MSYMBOL_TARGET_FLAG_2 (&msymbols[mcount]) = 0; - MSYMBOL_SIZE (&msymbols[mcount]) = 0; + SET_MSYMBOL_SIZE (&msymbols[mcount], 0); MSYMBOL_TYPE (&msymbols[mcount]) = mst_unknown; SYMBOL_SET_LANGUAGE (&msymbols[mcount], language_unknown); diff --git a/gdb/elfread.c b/gdb/elfread.c index f3967d7..516cbd0 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -570,7 +570,7 @@ elf_symtab_read (struct objfile *objfile, int type, elf_sym = (elf_symbol_type *) sym->udata.p; if (elf_sym) - MSYMBOL_SIZE(msym) = elf_sym->internal_elf_sym.st_size; + SET_MSYMBOL_SIZE (msym, elf_sym->internal_elf_sym.st_size); msym->filename = filesymname; gdbarch_elf_make_msymbol_special (gdbarch, sym, msym); @@ -594,7 +594,7 @@ elf_symtab_read (struct objfile *objfile, int type, sym->section, objfile); if (mtramp) { - MSYMBOL_SIZE (mtramp) = MSYMBOL_SIZE (msym); + SET_MSYMBOL_SIZE (mtramp, MSYMBOL_SIZE (msym)); mtramp->created_by_gdb = 1; mtramp->filename = filesymname; gdbarch_elf_make_msymbol_special (gdbarch, sym, mtramp); @@ -689,7 +689,7 @@ elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table) 1, address, mst_slot_got_plt, got_plt, objfile); if (msym) - MSYMBOL_SIZE (msym) = ptr_size; + SET_MSYMBOL_SIZE (msym, ptr_size); } do_cleanups (back_to); -- 1.7.1 --0F1p//8PRICkK4MW--