From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6755 invoked by alias); 3 Jun 2004 17:41:03 -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 6739 invoked from network); 3 Jun 2004 17:41:00 -0000 Received: from unknown (HELO pippin.tausq.org) (64.81.244.94) by sourceware.org with SMTP; 3 Jun 2004 17:41:00 -0000 Received: by pippin.tausq.org (Postfix, from userid 1000) id 2CB92CD2AE; Thu, 3 Jun 2004 10:41:02 -0700 (PDT) Date: Thu, 03 Jun 2004 17:41:00 -0000 From: Randolph Chung To: Andrew Cagney Cc: Daniel Jacobowitz , gdb-patches@sources.redhat.com Subject: Re: [patch/rfc] New program_changed event, cleanup some HPUXHPPA mess Message-ID: <20040603174102.GP601@tausq.org> Reply-To: Randolph Chung References: <20040521190242.GB7207@tausq.org> <40AE6260.2090205@gnu.org> <20040526052753.GU7207@tausq.org> <20040526132546.GB7594@nevyn.them.org> <20040526153530.GZ7207@tausq.org> <40B4D9D6.7040302@gnu.org> <20040528234344.GA11062@nevyn.them.org> <40BB8AD5.3020504@gnu.org> <20040531204318.GA29687@nevyn.them.org> <40BBDC52.7060106@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40BBDC52.7060106@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-06/txt/msg00054.txt.bz2 > In that case, since the cache was originally added to work around what > was a >>O(1) lookup, it should no longer be needed. There were two parts to this actually, the first part was the symbol caching, but there is also some stuff related to how the hp cxx abi support worked that required some cleaning up when a new symbol table gets loaded. Here's a new patch for getting rid of the symbol caching. I'll see how best to handle the hp c++ abi support... ok to apply? randolph 2004-06-03 Randolph Chung * hppa-hpux-tdep.c (hppa32_hpux_in_solib_call_trampoline) (hppa_hpux_skip_trampoline_code): Don't cache symbol values. * hppa-linux-tdep.c (hppa_linux_in_dyncall): Likewise. * hppa-tdep.c (hppa_symbol_address): New function definition. * hppa-tdep.h (hppa_symbol_address): New function declaration. Index: hppa-hpux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-hpux-tdep.c,v retrieving revision 1.19 diff -u -p -r1.19 hppa-hpux-tdep.c --- hppa-hpux-tdep.c 26 May 2004 05:31:39 -0000 1.19 +++ hppa-hpux-tdep.c 3 Jun 2004 17:32:47 -0000 @@ -61,32 +61,10 @@ hppa32_hpux_in_solib_call_trampoline (CO { struct minimal_symbol *minsym; struct unwind_table_entry *u; - static CORE_ADDR dyncall = 0; - static CORE_ADDR sr4export = 0; - - /* FIXME XXX - dyncall and sr4export must be initialized whenever we get a - new exec file */ /* First see if PC is in one of the two C-library trampolines. */ - if (!dyncall) - { - minsym = lookup_minimal_symbol ("$$dyncall", NULL, NULL); - if (minsym) - dyncall = SYMBOL_VALUE_ADDRESS (minsym); - else - dyncall = -1; - } - - if (!sr4export) - { - minsym = lookup_minimal_symbol ("_sr4export", NULL, NULL); - if (minsym) - sr4export = SYMBOL_VALUE_ADDRESS (minsym); - else - sr4export = -1; - } - - if (pc == dyncall || pc == sr4export) + if (pc == hppa_symbol_address("$$dyncall") + || pc == hppa_symbol_address("_sr4export")) return 1; minsym = lookup_minimal_symbol_by_pc (pc); @@ -295,45 +273,12 @@ hppa_hpux_skip_trampoline_code (CORE_ADD { long orig_pc = pc; long prev_inst, curr_inst, loc; - static CORE_ADDR dyncall = 0; - static CORE_ADDR dyncall_external = 0; - static CORE_ADDR sr4export = 0; struct minimal_symbol *msym; struct unwind_table_entry *u; - /* FIXME XXX - dyncall and sr4export must be initialized whenever we get a - new exec file */ - - if (!dyncall) - { - msym = lookup_minimal_symbol ("$$dyncall", NULL, NULL); - if (msym) - dyncall = SYMBOL_VALUE_ADDRESS (msym); - else - dyncall = -1; - } - - if (!dyncall_external) - { - msym = lookup_minimal_symbol ("$$dyncall_external", NULL, NULL); - if (msym) - dyncall_external = SYMBOL_VALUE_ADDRESS (msym); - else - dyncall_external = -1; - } - - if (!sr4export) - { - msym = lookup_minimal_symbol ("_sr4export", NULL, NULL); - if (msym) - sr4export = SYMBOL_VALUE_ADDRESS (msym); - else - sr4export = -1; - } - /* Addresses passed to dyncall may *NOT* be the actual address of the function. So we may have to do something special. */ - if (pc == dyncall) + if (pc == hppa_symbol_address("$$dyncall")) { pc = (CORE_ADDR) read_register (22); @@ -343,12 +288,12 @@ hppa_hpux_skip_trampoline_code (CORE_ADD if (pc & 0x2) pc = (CORE_ADDR) read_memory_integer (pc & ~0x3, TARGET_PTR_BIT / 8); } - if (pc == dyncall_external) + if (pc == hppa_symbol_address("$$dyncall_external")) { pc = (CORE_ADDR) read_register (22); pc = (CORE_ADDR) read_memory_integer (pc & ~0x3, TARGET_PTR_BIT / 8); } - else if (pc == sr4export) + else if (pc == hppa_symbol_address("_sr4export")) pc = (CORE_ADDR) (read_register (22)); /* Get the unwind descriptor corresponding to PC, return zero Index: hppa-linux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-linux-tdep.c,v retrieving revision 1.6 diff -u -p -r1.6 hppa-linux-tdep.c --- hppa-linux-tdep.c 26 May 2004 05:51:39 -0000 1.6 +++ hppa-linux-tdep.c 3 Jun 2004 17:32:47 -0000 @@ -161,21 +164,7 @@ insns_match_pattern (CORE_ADDR pc, static int hppa_linux_in_dyncall (CORE_ADDR pc) { - static CORE_ADDR dyncall = 0; - - /* FIXME: if we switch exec files, dyncall should be reinitialized */ - if (!dyncall) - { - struct minimal_symbol *minsym; - - minsym = lookup_minimal_symbol ("$$dyncall", NULL, NULL); - if (minsym) - dyncall = SYMBOL_VALUE_ADDRESS (minsym); - else - dyncall = -1; - } - - return pc == dyncall; + return pc == hppa_symbol_address("$$dyncall"); } /* There are several kinds of "trampolines" that we need to deal with: Index: hppa-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-tdep.c,v retrieving revision 1.166 diff -u -p -r1.166 hppa-tdep.c --- hppa-tdep.c 30 May 2004 14:11:00 -0000 1.166 +++ hppa-tdep.c 3 Jun 2004 17:32:48 -0000 @@ -262,6 +262,18 @@ hppa_extract_17 (unsigned word) hppa_get_field (word, 11, 15) << 11 | (word & 0x1) << 16, 17) << 2; } + +CORE_ADDR +hppa_symbol_address(const char *sym) +{ + struct minimal_symbol *minsym; + + minsym = lookup_minimal_symbol (sym, NULL, NULL); + if (minsym) + return SYMBOL_VALUE_ADDRESS (minsym); + else + return (CORE_ADDR)-1; +} /* Compare the start address for two unwind entries returning 1 if Index: hppa-tdep.h =================================================================== RCS file: /cvs/src/src/gdb/hppa-tdep.h,v retrieving revision 1.11 diff -u -p -r1.11 hppa-tdep.h --- hppa-tdep.h 30 May 2004 14:31:29 -0000 1.11 +++ hppa-tdep.h 3 Jun 2004 17:32:48 -0000 @@ -190,6 +195,7 @@ int hppa_extract_21 (unsigned); int hppa_extract_14 (unsigned); int hppa_low_sign_extend (unsigned int, unsigned int); int hppa_sign_extend (unsigned int, unsigned int); +CORE_ADDR hppa_symbol_address(const char *sym); void hppa_frame_prev_register_helper (struct frame_info *next_frame,