From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20077 invoked by alias); 18 Nov 2004 01:23:39 -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 20010 invoked from network); 18 Nov 2004 01:23:25 -0000 Received: from unknown (HELO pippin.tausq.org) (64.81.244.94) by sourceware.org with SMTP; 18 Nov 2004 01:23:25 -0000 Received: by pippin.tausq.org (Postfix, from userid 1000) id 54BDDCDA8D; Wed, 17 Nov 2004 17:23:27 -0800 (PST) Date: Thu, 18 Nov 2004 01:23:00 -0000 From: Randolph Chung To: gdb-patches@sources.redhat.com Subject: [patch/RFA/hppa] Make the stub identification code smarter Message-ID: <20041118012327.GH15714@tausq.org> Reply-To: Randolph Chung Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-GPG: for GPG key, see http://www.tausq.org/gpg.txt User-Agent: Mutt/1.5.5.1+cvs20040105i X-SW-Source: 2004-11/txt/msg00367.txt.bz2 The old stub identification code only identified a stub if we are at the first insn of the stub. If we are single stepping through the stub, it will fail when the pc points to the middle of the stub. This is probably one of the reasons why the watchpoint tests are failing... Tested on hppa-linux. ok to apply? (Mark: for hppabsd, i don't see any stub handling code. if it uses gcc/binutils then i think the same logic for hppa-linux-tdep applies to hppabsd-tdep) randolph 2004-11-19 Randolph Chung * hppa-linux-tdep.c (insns_match_pattern_relaxed): New function. (hppa_linux_in_dyncall): Check that we are inside the range of $$dyncall, not necessarily at the first insn. (hppa_linux_in_solib_call_trampoline): Identify a trampoline even if the pc does not point to the first insn of the trampoline. Index: hppa-linux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-linux-tdep.c,v retrieving revision 1.11 diff -u -p -r1.11 hppa-linux-tdep.c --- hppa-linux-tdep.c 31 Oct 2004 21:09:28 -0000 1.11 +++ hppa-linux-tdep.c 18 Nov 2004 01:08:18 -0000 @@ -161,10 +162,39 @@ insns_match_pattern (CORE_ADDR pc, return 1; } +/* The relaxed version of the insn matcher allows us to match from somewhere + inside the pattern, by looking backwards in the instruction scheme. */ +static int +insns_match_pattern_relaxed (CORE_ADDR pc, + struct insn_pattern *pattern, + unsigned int *insn) +{ + int pat_len = 0; + int offset; + + while (pattern[pat_len].mask) + pat_len++; + + for (offset = 0; offset < pat_len; offset++) + { + if (insns_match_pattern (pc - offset * 4, + pattern, insn)) + return 1; + } + + return 0; +} + static int hppa_linux_in_dyncall (CORE_ADDR pc) { - return pc == hppa_symbol_address("$$dyncall"); + struct unwind_table_entry *u; + u = find_unwind_entry (hppa_symbol_address ("$$dyncall")); + + if (!u) + return 0; + + return pc >= u->region_start && pc <= u->region_end; } /* There are several kinds of "trampolines" that we need to deal with: @@ -182,13 +212,20 @@ hppa_linux_in_solib_call_trampoline (COR { unsigned int insn[HPPA_MAX_INSN_PATTERN_LEN]; int r; + struct unwind_table_entry *u; + + /* on hppa-linux, linker stubs have no unwind information. Since the pattern + matching for linker stubs can be quite slow, we try to avoid it if + we can. */ + u = find_unwind_entry (pc); r = in_plt_section (pc, name) || hppa_linux_in_dyncall (pc) - || insns_match_pattern (pc, hppa_import_stub, insn) - || insns_match_pattern (pc, hppa_import_pic_stub, insn) - || insns_match_pattern (pc, hppa_long_branch_stub, insn) - || insns_match_pattern (pc, hppa_long_branch_pic_stub, insn); + || (u == NULL + && (insns_match_pattern_relaxed (pc, hppa_import_stub, insn) + || insns_match_pattern_relaxed (pc, hppa_import_pic_stub, insn) + || insns_match_pattern_relaxed (pc, hppa_long_branch_stub, insn) + || insns_match_pattern_relaxed (pc, hppa_long_branch_pic_stub, insn))); return r; } -- Randolph Chung Debian GNU/Linux Developer, hppa/ia64 ports http://www.tausq.org/