From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29214 invoked by alias); 8 Apr 2003 07:35:53 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 29207 invoked from network); 8 Apr 2003 07:35:51 -0000 Received: from unknown (HELO localhost.redhat.com) (24.157.166.107) by sources.redhat.com with SMTP; 8 Apr 2003 07:35:51 -0000 Received: from redhat.com (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 483682B23; Tue, 8 Apr 2003 03:35:38 -0400 (EDT) Message-ID: <3E927BCA.1080702@redhat.com> Date: Tue, 08 Apr 2003 07:35:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.2) Gecko/20030223 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Alexandre Oliva Cc: gdb-patches@sources.redhat.com Subject: Re: use MIPS NewABI register names when disassembling NewABI code References: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2003-04/txt/msg00127.txt.bz2 > mips-opc.c:_print_insn_mips decides which register naming convention > to use obtaining a pointer to the bfd from the first symbol in the > symbols field from the disassemble_info argument, and then looking for > ABI information in the ELF headers. Unfortunately, gdb doesn't set up > symbols, so we end up always using the o32 register naming > convention. This patch arranges for the information the disassembler > uses to be passed to it, in an admittedly ugly, but effective way. Ugly? This bit: > + static asymbol *symbols = NULL; is wrong. There is more than one instance of an architecture. The symbols lifetime is different to that of the architecture (assuming that the symbol's lifetime is tied to the corresponding bfd). How does objdump manage to correctly disassemble something like an srecord? GDB should be using that same mechanism. Andrew > Index: gdb/ChangeLog > from Alexandre Oliva > > * mips-tdep.c (mips_gdbarch_init): Set tm_print_insn_info.symbols > to at least an empty symbol. > > Index: gdb/mips-tdep.c > =================================================================== > RCS file: /cvs/src/src/gdb/mips-tdep.c,v > retrieving revision 1.185 > diff -u -p -r1.185 mips-tdep.c > --- gdb/mips-tdep.c 7 Apr 2003 18:38:04 -0000 1.185 > +++ gdb/mips-tdep.c 8 Apr 2003 02:26:04 -0000 > @@ -5656,6 +5656,24 @@ mips_gdbarch_init (struct gdbarch_info i > > if (info.abfd) > { > + static asymbol *symbols = NULL; > + > + /* The disassembler uses *info.symbols to get to the bfd elf > + flags, which it uses to tell the executable ABI, so we have > + to give it at least one symbol. */ > + if (tm_print_insn_info.symbols == NULL > + || tm_print_insn_info.symbols == &symbols) > + { > + /* It would be nice if we could bfd_release the previous > + symbol, but we'd need a pointer to its bfd then. */ > + symbols = bfd_make_empty_symbol (info.abfd); > + if (symbols != NULL) > + { > + tm_print_insn_info.symbols = &symbols; > + tm_print_insn_info.num_symbols = 0; > + } > + } > + > /* First of all, extract the elf_flags, if available. */ > if (bfd_get_flavour (info.abfd) == bfd_target_elf_flavour) > elf_flags = elf_elfheader (info.abfd)->e_flags; > >