From patchwork Thu Mar 15 21:51:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 26328 Received: (qmail 64964 invoked by alias); 15 Mar 2018 21:51:38 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 64815 invoked by uid 89); 15 Mar 2018 21:51:37 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS, UNSUBSCRIBE_BODY autolearn=ham version=3.3.2 spammy=cutting X-HELO: mail-wm0-f67.google.com Received: from mail-wm0-f67.google.com (HELO mail-wm0-f67.google.com) (74.125.82.67) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 15 Mar 2018 21:51:34 +0000 Received: by mail-wm0-f67.google.com with SMTP id w128so13215616wmw.0 for ; Thu, 15 Mar 2018 14:51:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=dqo9nXP+TzvDdRW0YEV+REysax50rj5eXkARlHCMIdI=; b=eHKPi3EKeRqppjtfPijN/9VYxr7El82YdLOoiM5h3x8+IhDyNhG+SXfypCuhU+mhEA 0e6BYT84oWvP7DkmU3vidO+BzYGeWJVdILgdP+KHyB+4/ETjhs2+Ay6gTpoNU49Cv40W gtXzMQszJz3Yk9gf0njwrEbWuxSLMFZ6IZljN1dd2zklJ4m+16Q4T/mRC/G18uIQArIy /v8TbRQznzR7k6sUFnTN0OtKFyDQ8ywJegrnJHkT3/pP1riipsgFrgXOW6bxz3zCMk8v klPzrCvV2QxjgHGrRIqAzruWH6WLdRIM0CeA23n9DVs+v5KUouoxUXiYZqTFOMH2EI0a rKtg== X-Gm-Message-State: AElRT7FDiDx76Ew+En2fORIYgSV0mymyEMHXhe6D+4HS/jaZbsaQY1NQ J/4YJN7CLy0lkqfbLD2n/JLbELor X-Google-Smtp-Source: AG47ELtYB4VYFt9LVy8v+jZmODPdZhGlCUef0mYJ9f5PBSjcTFJkwKj7j2G5tX/Xs1P9cPHSxNHV7w== X-Received: by 10.28.192.24 with SMTP id q24mr5986034wmf.91.1521150691747; Thu, 15 Mar 2018 14:51:31 -0700 (PDT) Received: from localhost (host86-177-103-167.range86-177.btcentralplus.com. [86.177.103.167]) by smtp.gmail.com with ESMTPSA id n8sm6194921wrf.12.2018.03.15.14.51.30 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 15 Mar 2018 14:51:31 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Yao Qi , Simon Marchi , Andrew Burgess Subject: [PATCHv2 2/4] gdb: Remove more targets unwind_pc methods Date: Thu, 15 Mar 2018 21:51:22 +0000 Message-Id: <96189d2e0e19704db4d56f7d033c2174ccef57ad.1521149611.git.andrew.burgess@embecosm.com> In-Reply-To: References: In-Reply-To: References: <20180307220420.23307-1-andrew.burgess@embecosm.com> X-IsSubscribed: yes This commit rewrites default_unwind_pc to avoid short cutting the steps of uninding the pc. The new version of default_unwind_pc contains calls to extract_typed_address (which wraps gdbarch_pointer_to_address) and gdbarch_addr_bits_remove. Targets that don't override these methods will get the same behaviour as they did before, but targets that do use these methods (and so need to call them while unwinding the pc) can now use the default_unwind_pc method. gdb/ChangeLog: * arm-tdep.c (arm_unwind_pc): Delete. (arm_gdbarch_init): Delete use of set_gdbarch_unwind_pc. * frame-unwind.c (default_unwind_pc): Rewrite to call extract_typed_address and gdbarch_addr_bits_remove. * i386-tdep.c (i386_unwind_pc): Delete. (i386_gdbarch_init): Delete use of set_gdbarch_unwind_pc. * m68k-tdep.c (m68k_unwind_pc): Delete. (m68k_gdbarch_init): Delete use of set_gdbarch_unwind_pc. * m88k-tdep.c (m88k_unwind_pc): Delete. (m88k_gdbarch_init): Delete use of set_gdbarch_unwind_pc. * nios2-tdep.c (nios2_unwind_pc): Delete. (nios2_get_next_pc): Update to call gdbarch_unwind_pc. (nios2_gdbarch_init): Delete use of set_gdbarch_unwind_pc. * rl78-tdep.c (rl78_unwind_pc): Delete. (rl78_gdbarch_init): Delete use of set_gdbarch_unwind_pc. * s390-tdep.c (s390_unwind_pc): Delete. (s390_gdbarch_init): Delete use of set_gdbarch_unwind_pc. * tic6x-tdep.c (tic6x_unwind_pc): Delete. (tic6x_gdbarch_init): Delete use of set_gdbarch_unwind_pc. --- gdb/ChangeLog | 22 ++++++++++++++++++++++ gdb/arm-tdep.c | 13 ------------- gdb/frame-unwind.c | 16 ++++++++++++++-- gdb/i386-tdep.c | 13 ------------- gdb/m68k-tdep.c | 10 ---------- gdb/m88k-tdep.c | 11 ----------- gdb/nios2-tdep.c | 14 +------------- gdb/rl78-tdep.c | 11 ----------- gdb/s390-tdep.c | 12 ------------ gdb/tic6x-tdep.c | 12 ------------ 10 files changed, 37 insertions(+), 97 deletions(-) diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 539ee756e1b..98efc454044 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -3069,18 +3069,6 @@ arm_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame) get_frame_pc (this_frame)); } -/* Given THIS_FRAME, find the previous frame's resume PC (which will - be used to construct the previous frame's ID, after looking up the - containing function). */ - -static CORE_ADDR -arm_unwind_pc (struct gdbarch *gdbarch, struct frame_info *this_frame) -{ - CORE_ADDR pc; - pc = frame_unwind_register_unsigned (this_frame, ARM_PC_REGNUM); - return arm_addr_bits_remove (gdbarch, pc); -} - static CORE_ADDR arm_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame) { @@ -9364,7 +9352,6 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Frame handling. */ set_gdbarch_dummy_id (gdbarch, arm_dummy_id); - set_gdbarch_unwind_pc (gdbarch, arm_unwind_pc); set_gdbarch_unwind_sp (gdbarch, arm_unwind_sp); frame_base_set_default (gdbarch, &arm_normal_base); diff --git a/gdb/frame-unwind.c b/gdb/frame-unwind.c index 0eed572ebbb..052998a1c4d 100644 --- a/gdb/frame-unwind.c +++ b/gdb/frame-unwind.c @@ -198,8 +198,20 @@ default_frame_unwind_stop_reason (struct frame_info *this_frame, CORE_ADDR default_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) { - int pc_regnum = gdbarch_pc_regnum (gdbarch); - return frame_unwind_register_unsigned (next_frame, pc_regnum); + struct type *type; + int pc_regnum; + CORE_ADDR addr; + struct value *value; + + pc_regnum = gdbarch_pc_regnum (gdbarch); + value = frame_unwind_register_value (next_frame, pc_regnum); + type = builtin_type (gdbarch)->builtin_func_ptr; + addr = extract_typed_address (value_contents_all (value), type); + addr = gdbarch_addr_bits_remove (gdbarch, addr); + + release_value (value); + value_free (value); + return addr; } /* Helper functions for value-based register unwinding. These return diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 60dc8013a23..5b1276d678f 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -1954,17 +1954,6 @@ i386_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) return pc; } - -/* This function is 64-bit safe. */ - -static CORE_ADDR -i386_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) -{ - gdb_byte buf[8]; - - frame_unwind_register (next_frame, gdbarch_pc_regnum (gdbarch), buf); - return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr); -} /* Normal frames. */ @@ -8486,8 +8475,6 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_dummy_id (gdbarch, i386_dummy_id); - set_gdbarch_unwind_pc (gdbarch, i386_unwind_pc); - /* Add the i386 register groups. */ i386_add_reggroups (gdbarch); tdep->register_reggroup_p = i386_register_reggroup_p; diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c index b9fa5e6d4cf..16bc16773ab 100644 --- a/gdb/m68k-tdep.c +++ b/gdb/m68k-tdep.c @@ -851,15 +851,6 @@ m68k_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) return start_pc; return pc; } - -static CORE_ADDR -m68k_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) -{ - gdb_byte buf[8]; - - frame_unwind_register (next_frame, gdbarch_pc_regnum (gdbarch), buf); - return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr); -} /* Normal frames. */ @@ -1247,7 +1238,6 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Frame unwinder. */ set_gdbarch_dummy_id (gdbarch, m68k_dummy_id); - set_gdbarch_unwind_pc (gdbarch, m68k_unwind_pc); /* Hook in the DWARF CFI frame unwinder. */ dwarf2_append_unwinders (gdbarch); diff --git a/gdb/m88k-tdep.c b/gdb/m88k-tdep.c index 6a50126548d..de5e1ffc325 100644 --- a/gdb/m88k-tdep.c +++ b/gdb/m88k-tdep.c @@ -103,15 +103,6 @@ constexpr gdb_byte m88k_break_insn[] = { 0xf0, 0x00, 0xd1, 0xff }; typedef BP_MANIPULATION (m88k_break_insn) m88k_breakpoint; -static CORE_ADDR -m88k_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) -{ - CORE_ADDR pc; - - pc = frame_unwind_register_unsigned (next_frame, M88K_SXIP_REGNUM); - return m88k_addr_bits_remove (gdbarch, pc); -} - static void m88k_write_pc (struct regcache *regcache, CORE_ADDR pc) { @@ -832,7 +823,6 @@ m88k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Register numbers of various important registers. */ set_gdbarch_sp_regnum (gdbarch, M88K_R31_REGNUM); - set_gdbarch_pc_regnum (gdbarch, M88K_SXIP_REGNUM); /* Core file support. */ set_gdbarch_iterate_over_regset_sections @@ -853,7 +843,6 @@ m88k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_addr_bits_remove (gdbarch, m88k_addr_bits_remove); set_gdbarch_breakpoint_kind_from_pc (gdbarch, m88k_breakpoint::kind_from_pc); set_gdbarch_sw_breakpoint_from_kind (gdbarch, m88k_breakpoint::bp_from_kind); - set_gdbarch_unwind_pc (gdbarch, m88k_unwind_pc); set_gdbarch_write_pc (gdbarch, m88k_write_pc); frame_base_set_default (gdbarch, &m88k_frame_base); diff --git a/gdb/nios2-tdep.c b/gdb/nios2-tdep.c index f6088f38ef5..3972dd9437d 100644 --- a/gdb/nios2-tdep.c +++ b/gdb/nios2-tdep.c @@ -1888,17 +1888,6 @@ nios2_push_dummy_call (struct gdbarch *gdbarch, struct value *function, return sp; } -/* Implement the unwind_pc gdbarch method. */ - -static CORE_ADDR -nios2_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) -{ - gdb_byte buf[4]; - - frame_unwind_register (next_frame, NIOS2_PC_REGNUM, buf); - return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr); -} - /* Implement the unwind_sp gdbarch method. */ static CORE_ADDR @@ -2186,7 +2175,7 @@ nios2_get_next_pc (struct regcache *regcache, CORE_ADDR pc) /* If ra is in the reglist, we have to use the value saved in the stack frame rather than the current value. */ if (uimm & (1 << NIOS2_RA_REGNUM)) - pc = nios2_unwind_pc (gdbarch, get_current_frame ()); + pc = gdbarch_unwind_pc (gdbarch, get_current_frame ()); else pc = regcache_raw_get_unsigned (regcache, NIOS2_RA_REGNUM); } @@ -2322,7 +2311,6 @@ nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_sw_breakpoint_from_kind (gdbarch, nios2_sw_breakpoint_from_kind); set_gdbarch_dummy_id (gdbarch, nios2_dummy_id); - set_gdbarch_unwind_pc (gdbarch, nios2_unwind_pc); set_gdbarch_unwind_sp (gdbarch, nios2_unwind_sp); /* The dwarf2 unwinder will normally produce the best results if diff --git a/gdb/rl78-tdep.c b/gdb/rl78-tdep.c index af6a0896082..46dd4f75f7b 100644 --- a/gdb/rl78-tdep.c +++ b/gdb/rl78-tdep.c @@ -1074,16 +1074,6 @@ rl78_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) return p.prologue_end; } -/* Implement the "unwind_pc" gdbarch method. */ - -static CORE_ADDR -rl78_unwind_pc (struct gdbarch *arch, struct frame_info *next_frame) -{ - return rl78_addr_bits_remove - (arch, frame_unwind_register_unsigned (next_frame, - RL78_PC_REGNUM)); -} - /* Implement the "unwind_sp" gdbarch method. */ static CORE_ADDR @@ -1468,7 +1458,6 @@ rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Frames, prologues, etc. */ set_gdbarch_inner_than (gdbarch, core_addr_lessthan); set_gdbarch_skip_prologue (gdbarch, rl78_skip_prologue); - set_gdbarch_unwind_pc (gdbarch, rl78_unwind_pc); set_gdbarch_unwind_sp (gdbarch, rl78_unwind_sp); set_gdbarch_frame_align (gdbarch, rl78_frame_align); diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c index 408bb875d20..c1e17694a89 100644 --- a/gdb/s390-tdep.c +++ b/gdb/s390-tdep.c @@ -2129,17 +2129,6 @@ s390_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc) return 0; } -/* Implement unwind_pc gdbarch method. */ - -static CORE_ADDR -s390_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) -{ - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - ULONGEST pc; - pc = frame_unwind_register_unsigned (next_frame, tdep->pc_regnum); - return gdbarch_addr_bits_remove (gdbarch, pc); -} - /* Implement unwind_sp gdbarch method. */ static CORE_ADDR @@ -7005,7 +6994,6 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) dwarf2_frame_set_init_reg (gdbarch, s390_dwarf2_frame_init_reg); dwarf2_frame_set_adjust_regnum (gdbarch, s390_adjust_frame_regnum); dwarf2_append_unwinders (gdbarch); - set_gdbarch_unwind_pc (gdbarch, s390_unwind_pc); set_gdbarch_unwind_sp (gdbarch, s390_unwind_sp); switch (info.bfd_arch_info->mach) diff --git a/gdb/tic6x-tdep.c b/gdb/tic6x-tdep.c index f11763d9925..f1aaaa3c36a 100644 --- a/gdb/tic6x-tdep.c +++ b/gdb/tic6x-tdep.c @@ -366,17 +366,6 @@ tic6x_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum, reg->how = DWARF2_FRAME_REG_UNDEFINED; } -/* This is the implementation of gdbarch method unwind_pc. */ - -static CORE_ADDR -tic6x_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) -{ - gdb_byte buf[8]; - - frame_unwind_register (next_frame, TIC6X_PC_REGNUM, buf); - return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr); -} - /* This is the implementation of gdbarch method unwind_sp. */ static CORE_ADDR @@ -1290,7 +1279,6 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_sw_breakpoint_from_kind (gdbarch, tic6x_sw_breakpoint_from_kind); - set_gdbarch_unwind_pc (gdbarch, tic6x_unwind_pc); set_gdbarch_unwind_sp (gdbarch, tic6x_unwind_sp); /* Unwinding. */