From patchwork Thu Jul 9 10:36:47 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre Langlois X-Patchwork-Id: 7606 Received: (qmail 8192 invoked by alias); 9 Jul 2015 10:36:58 -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 8174 invoked by uid 89); 9 Jul 2015 10:36:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.2 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (207.82.80.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 09 Jul 2015 10:36:56 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.140]) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-36-1c1kNILbTBGbeigBJB5syQ-1; Thu, 09 Jul 2015 11:36:51 +0100 Received: from e105615-lin.cambridge.arm.com ([10.1.2.79]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 9 Jul 2015 11:36:50 +0100 From: Pierre Langlois To: qiyaoltc@gmail.com Cc: Pierre Langlois , gdb-patches@sourceware.org Subject: [PATCH] [AArch64] Refactor aarch64_make_prologue_cache Date: Thu, 9 Jul 2015 11:36:47 +0100 Message-Id: <1436438207-33028-1-git-send-email-pierre.langlois@arm.com> In-Reply-To: <86380yocmc.fsf@gmail.com> References: <86380yocmc.fsf@gmail.com> X-MC-Unique: 1c1kNILbTBGbeigBJB5syQ-1 X-IsSubscribed: yes Hi Yao, I'll push this patch if you're happy with the comment. Thanks for the reviews, Pierre --- We would previously have to make sure the frame cache was not already created before calling aarch64_make_prologue_cache. This patch makes this function check it so that the caller does not need to do so. gdb/ChangeLog: * aarch64-tdep.c (aarch64_prologue_cache): Update comment. New argument this_cache. Return early if this_cache is already set. Set this_cache. (aarch64_prologue_this_id): Update call to aarch64_prologue_cache. (aarch64_prologue_prev_register): Likewise. (aarch64_normal_frame_base): Likewise. --- gdb/aarch64-tdep.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 9650a7a..0496536 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -930,18 +930,24 @@ aarch64_scan_prologue (struct frame_info *this_frame, } } -/* Allocate an aarch64_prologue_cache and fill it with information - about the prologue of *THIS_FRAME. */ +/* Allocate and fill in *THIS_CACHE with information about the prologue of + *THIS_FRAME. Do not do this is if *THIS_CACHE was already allocated. + Return a pointer to the current aarch64_prologue_cache in *THIS_CACHE. + */ static struct aarch64_prologue_cache * -aarch64_make_prologue_cache (struct frame_info *this_frame) +aarch64_make_prologue_cache (struct frame_info *this_frame, void **this_cache) { struct aarch64_prologue_cache *cache; CORE_ADDR unwound_fp; int reg; + if (*this_cache != NULL) + return *this_cache; + cache = FRAME_OBSTACK_ZALLOC (struct aarch64_prologue_cache); cache->saved_regs = trad_frame_alloc_saved_regs (this_frame); + *this_cache = cache; aarch64_scan_prologue (this_frame, cache); @@ -970,14 +976,11 @@ static void aarch64_prologue_this_id (struct frame_info *this_frame, void **this_cache, struct frame_id *this_id) { - struct aarch64_prologue_cache *cache; + struct aarch64_prologue_cache *cache + = aarch64_make_prologue_cache (this_frame, this_cache); struct frame_id id; CORE_ADDR pc, func; - if (*this_cache == NULL) - *this_cache = aarch64_make_prologue_cache (this_frame); - cache = *this_cache; - /* This is meant to halt the backtrace at "_start". */ pc = get_frame_pc (this_frame); if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc) @@ -999,11 +1002,8 @@ aarch64_prologue_prev_register (struct frame_info *this_frame, void **this_cache, int prev_regnum) { struct gdbarch *gdbarch = get_frame_arch (this_frame); - struct aarch64_prologue_cache *cache; - - if (*this_cache == NULL) - *this_cache = aarch64_make_prologue_cache (this_frame); - cache = *this_cache; + struct aarch64_prologue_cache *cache + = aarch64_make_prologue_cache (this_frame, this_cache); /* If we are asked to unwind the PC, then we need to return the LR instead. The prologue may save PC, but it will point into this @@ -1120,11 +1120,8 @@ struct frame_unwind aarch64_stub_unwind = static CORE_ADDR aarch64_normal_frame_base (struct frame_info *this_frame, void **this_cache) { - struct aarch64_prologue_cache *cache; - - if (*this_cache == NULL) - *this_cache = aarch64_make_prologue_cache (this_frame); - cache = *this_cache; + struct aarch64_prologue_cache *cache + = aarch64_make_prologue_cache (this_frame, this_cache); return cache->prev_sp - cache->framesize; }