From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28389 invoked by alias); 17 Apr 2004 17:42:20 -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 28381 invoked from network); 17 Apr 2004 17:42:18 -0000 Received: from unknown (HELO pippin.tausq.org) (64.81.244.94) by sources.redhat.com with SMTP; 17 Apr 2004 17:42:18 -0000 Received: by pippin.tausq.org (Postfix, from userid 1000) id DC301CD29F; Sat, 17 Apr 2004 11:20:08 -0700 (PDT) Date: Sat, 17 Apr 2004 17:42:00 -0000 From: Randolph Chung To: gdb-patches@sources.redhat.com Subject: Re: [patch/resend/rfa] (4/4) Make frame-rewind code dependent on ELF attribute of target Message-ID: <20040417182008.GG17842@tausq.org> Reply-To: Randolph Chung References: <20040414062454.GM31873@tausq.org> <407EC6FE.3080908@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <407EC6FE.3080908@gnu.org> X-GPG: for GPG key, see http://www.tausq.org/gpg.txt User-Agent: Mutt/1.5.5.1+cvs20040105i X-SW-Source: 2004-04/txt/msg00396.txt.bz2 commited. -randolph Index: ChangeLog =================================================================== RCS file: /cvs/src/src/gdb/ChangeLog,v retrieving revision 1.5706 diff -u -p -r1.5706 ChangeLog --- ChangeLog 17 Apr 2004 17:31:40 -0000 1.5706 +++ ChangeLog 17 Apr 2004 17:39:35 -0000 @@ -1,5 +1,20 @@ 2004-04-17 Randolph Chung + * Makefile.in (hppa-hpux-tdep.o): Add $(hppa_tdep_h). + * hppa-hpux-tdep.c (hppa-tdep.h): Include. + (hppa_hpux_som_init_abi): Set is_elf to 0. + (hppa_hpux_elf_init_abi): Set is_elf to 1. + * hppa-tdep.c (low_text_segment_address): Remove global. + (record_text_segment_lowaddr): Pass in low address as parameter. Use + section offset to calculate segment address. + (internalize_unwinds): Define low_text_segment_address as local and + pass to record_text_segment_lowaddr for ELF targets. + (hppa_gdbarch_init): Zero fill tdep structure. + (hppa_dump_tdep): Print tdep structure. + * hppa-tdep.h (gdbarch_tdep): Add is_elf member to tdep structure. + +2004-04-17 Randolph Chung + * hppa-tdep.c (hppa_pseudo_register_read): Define. (hppa_gdbarch_init): Set pseudo_register_read. * config/pa/tm-hppa.h (DEPRECATED_CLEAN_UP_REGISTER_VALUE): Remove. Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.544 diff -u -p -r1.544 Makefile.in --- Makefile.in 17 Apr 2004 17:19:27 -0000 1.544 +++ Makefile.in 17 Apr 2004 17:39:36 -0000 @@ -1826,7 +1826,7 @@ hpacc-abi.o: hpacc-abi.c $(defs_h) $(val hppah-nat.o: hppah-nat.c $(defs_h) $(inferior_h) $(target_h) $(gdbcore_h) \ $(gdb_wait_h) $(regcache_h) $(gdb_string_h) $(infttrace_h) hppa-hpux-tdep.o: hppa-hpux-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \ - $(osabi_h) $(gdb_string_h) $(frame_h) + $(osabi_h) $(gdb_string_h) $(frame_h) $(hppa_tdep_h) hppa-tdep.o: hppa-tdep.c $(defs_h) $(frame_h) $(bfd_h) $(inferior_h) \ $(value_h) $(regcache_h) $(completer_h) $(language_h) $(osabi_h) \ $(gdb_assert_h) $(infttrace_h) $(arch_utils_h) $(symtab_h) \ Index: hppa-hpux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-hpux-tdep.c,v retrieving revision 1.14 diff -u -p -r1.14 hppa-hpux-tdep.c --- hppa-hpux-tdep.c 8 Apr 2004 21:18:12 -0000 1.14 +++ hppa-hpux-tdep.c 17 Apr 2004 17:39:36 -0000 @@ -28,6 +28,7 @@ Foundation, Inc., 59 Temple Place - Suit #include "objfiles.h" #include "inferior.h" #include "infcall.h" +#include "hppa-tdep.h" #include #include @@ -721,12 +722,18 @@ hppa_hpux_init_abi (struct gdbarch_info static void hppa_hpux_som_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + tdep->is_elf = 0; hppa_hpux_init_abi (info, gdbarch); } static void hppa_hpux_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + tdep->is_elf = 1; hppa_hpux_init_abi (info, gdbarch); } Index: hppa-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-tdep.c,v retrieving revision 1.146 diff -u -p -r1.146 hppa-tdep.c --- hppa-tdep.c 17 Apr 2004 17:31:40 -0000 1.146 +++ hppa-tdep.c 17 Apr 2004 17:39:37 -0000 @@ -351,15 +351,18 @@ compare_unwind_entries (const void *arg1 return 0; } -static CORE_ADDR low_text_segment_address; - static void -record_text_segment_lowaddr (bfd *abfd, asection *section, void *ignored) +record_text_segment_lowaddr (bfd *abfd, asection *section, void *data) { - if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) + if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) == (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) - && section->vma < low_text_segment_address) - low_text_segment_address = section->vma; + { + bfd_vma value = section->vma - section->filepos; + CORE_ADDR *low_text_segment_address = (CORE_ADDR *)data; + + if (value < *low_text_segment_address) + *low_text_segment_address = value; + } } static void @@ -369,30 +372,29 @@ internalize_unwinds (struct objfile *obj { /* We will read the unwind entries into temporary memory, then fill in the actual unwind table. */ + if (size > 0) { unsigned long tmp; unsigned i; char *buf = alloca (size); + CORE_ADDR low_text_segment_address; - low_text_segment_address = -1; - - /* If addresses are 64 bits wide, then unwinds are supposed to + /* For ELF targets, then unwinds are supposed to be segment relative offsets instead of absolute addresses. Note that when loading a shared library (text_offset != 0) the unwinds are already relative to the text_offset that will be passed in. */ - if (TARGET_PTR_BIT == 64 && text_offset == 0) + if (gdbarch_tdep (current_gdbarch)->is_elf && text_offset == 0) { + low_text_segment_address = -1; + bfd_map_over_sections (objfile->obfd, - record_text_segment_lowaddr, NULL); + record_text_segment_lowaddr, + &low_text_segment_address); - /* ?!? Mask off some low bits. Should this instead subtract - out the lowest section's filepos or something like that? - This looks very hokey to me. */ - low_text_segment_address &= ~0xfff; - text_offset += low_text_segment_address; + text_offset = low_text_segment_address; } bfd_get_section_contents (objfile->obfd, section, buf, 0, size); @@ -2607,7 +2609,7 @@ hppa_gdbarch_init (struct gdbarch_info i return (arches->gdbarch); /* If none found, then allocate and initialize one. */ - tdep = XMALLOC (struct gdbarch_tdep); + tdep = XZALLOC (struct gdbarch_tdep); gdbarch = gdbarch_alloc (&info, tdep); /* Determine from the bfd_arch_info structure if we are dealing with @@ -2722,7 +2724,11 @@ hppa_gdbarch_init (struct gdbarch_info i static void hppa_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file) { - /* Nothing to print for the moment. */ + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + + fprintf_unfiltered (file, "bytes_per_address = %d\n", + tdep->bytes_per_address); + fprintf_unfiltered (file, "elf = %s\n", tdep->is_elf ? "yes" : "no"); } void Index: hppa-tdep.h =================================================================== RCS file: /cvs/src/src/gdb/hppa-tdep.h,v retrieving revision 1.2 diff -u -p -r1.2 hppa-tdep.h --- hppa-tdep.h 17 Apr 2004 17:19:28 -0000 1.2 +++ hppa-tdep.h 17 Apr 2004 17:39:37 -0000 @@ -29,6 +29,10 @@ struct gdbarch_tdep /* The number of bytes in an address. For now, this field is designed to allow us to differentiate hppa32 from hppa64 targets. */ int bytes_per_address; + + /* Is this an ELF target? This can be 64-bit HP-UX, or a 32/64-bit GNU/Linux + system. */ + int is_elf; }; /* -- Randolph Chung Debian GNU/Linux Developer, hppa/ia64 ports http://www.tausq.org/