From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26272 invoked by alias); 3 Mar 2005 14:46:08 -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 25800 invoked from network); 3 Mar 2005 14:45:38 -0000 Received: from unknown (HELO nevyn.them.org) (66.93.172.17) by sourceware.org with SMTP; 3 Mar 2005 14:45:38 -0000 Received: from drow by nevyn.them.org with local (Exim 4.44 #1 (Debian)) id 1D6ra6-0006pH-2m; Thu, 03 Mar 2005 09:45:38 -0500 Date: Thu, 03 Mar 2005 14:46:00 -0000 From: Daniel Jacobowitz To: rearnsha@buzzard.freeserve.co.uk, gdb-patches@sources.redhat.com Subject: RFA: ARM stub unwinder Message-ID: <20050303144538.GA26195@nevyn.them.org> Mail-Followup-To: rearnsha@buzzard.freeserve.co.uk, gdb-patches@sources.redhat.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6+20040907i X-SW-Source: 2005-03/txt/msg00025.txt.bz2 This patch adds a stub unwinder for ARM, and just like other architectures with a stub unwinder, uses it for PLT entries and unreadable code addresses. Richard tested this on arm-netbsd and it fixed a hundred failures; I tested it on arm-linux some time ago, and it did the same there. OK? -- Daniel Jacobowitz CodeSourcery, LLC 2005-03-02 Daniel Jacobowitz * arm-tdep.c (arm_make_stub_cache, arm_stub_this_id) (arm_stub_unwind, arm_stub_unwind_sniffer): New. (arm_gdbarch_init): Add arm_stub_unwind_sniffer. Index: arm-tdep.c =================================================================== RCS file: /big/fsf/rsync/src-cvs/src/gdb/arm-tdep.c,v retrieving revision 1.193 diff -u -p -r1.193 arm-tdep.c --- arm-tdep.c 21 Feb 2005 07:15:47 -0000 1.193 +++ arm-tdep.c 2 Mar 2005 20:38:55 -0000 @@ -1013,6 +1013,56 @@ arm_prologue_unwind_sniffer (struct fram return &arm_prologue_unwind; } +static struct arm_prologue_cache * +arm_make_stub_cache (struct frame_info *next_frame) +{ + int reg; + struct arm_prologue_cache *cache; + CORE_ADDR unwound_fp; + + cache = frame_obstack_zalloc (sizeof (struct arm_prologue_cache)); + cache->saved_regs = trad_frame_alloc_saved_regs (next_frame); + + cache->prev_sp = frame_unwind_register_unsigned (next_frame, ARM_SP_REGNUM); + + return cache; +} + +/* Our frame ID for a stub frame is the current SP and LR. */ + +static void +arm_stub_this_id (struct frame_info *next_frame, + void **this_cache, + struct frame_id *this_id) +{ + struct arm_prologue_cache *cache; + + if (*this_cache == NULL) + *this_cache = arm_make_stub_cache (next_frame); + cache = *this_cache; + + *this_id = frame_id_build (cache->prev_sp, + frame_pc_unwind (next_frame)); +} + +struct frame_unwind arm_stub_unwind = { + NORMAL_FRAME, + arm_stub_this_id, + arm_prologue_prev_register +}; + +static const struct frame_unwind * +arm_stub_unwind_sniffer (struct frame_info *next_frame) +{ + char dummy[4]; + + if (in_plt_section (frame_unwind_address_in_block (next_frame), NULL) + || target_read_memory (frame_pc_unwind (next_frame), dummy, 4) != 0) + return &arm_stub_unwind; + + return NULL; +} + static CORE_ADDR arm_normal_frame_base (struct frame_info *next_frame, void **this_cache) { @@ -2737,6 +2787,7 @@ arm_gdbarch_init (struct gdbarch_info in gdbarch_init_osabi (info, gdbarch); /* Add some default predicates. */ + frame_unwind_append_sniffer (gdbarch, arm_stub_unwind_sniffer); frame_unwind_append_sniffer (gdbarch, arm_sigtramp_unwind_sniffer); frame_unwind_append_sniffer (gdbarch, arm_prologue_unwind_sniffer);