From patchwork Wed Oct 12 08:03:51 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 16429 Received: (qmail 60649 invoked by alias); 12 Oct 2016 08:04:09 -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 60634 invoked by uid 89); 12 Oct 2016 08:04:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=no version=3.3.2 spammy=Extend, Track X-HELO: mail-pa0-f66.google.com Received: from mail-pa0-f66.google.com (HELO mail-pa0-f66.google.com) (209.85.220.66) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 12 Oct 2016 08:03:58 +0000 Received: by mail-pa0-f66.google.com with SMTP id fn2so2033657pad.1 for ; Wed, 12 Oct 2016 01:03:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=+DfNnemphzSHR+0xaHkHqIOIJsoDsWFfMeWQwGAISeo=; b=B+ljiKYdvtVF1fD4ZH3mFgajZkeguZU1bywdtgrvtkuSmy0AaF0ey0v8jxTzdgWuCb qMMk2bJW4mQCGxj75E9gcdeghY2kjxz9SmigX9mYpJcDAK7gdLRJS0QYmeN884e6gZpT sOu29yjPvv4UI/6T/nCge7oHpArnElpL4E83CP80JtRMlLI3jqSWGogCiZrKoVR/7cjy P7vmhn8Z76AtvdSryeND1E/Og2/Xz8PGQF/5c9Lfr8pz7J2Hkor91ZLGZE23evy9BHAI /knPj4FltxKrJLBHl1VTpGSjkYa3AAqU/j130B2JTUVdLOKYV//W2j85R6q95HFt3hTg 38GA== X-Gm-Message-State: AA6/9RmQye3nKnk/eZXwXIQsr7aRwSe+qYXf3mnqshXdpo+mwycx47K8moMxBjJFzX2naw== X-Received: by 10.66.132.15 with SMTP id oq15mr13138824pab.105.1476259437210; Wed, 12 Oct 2016 01:03:57 -0700 (PDT) Received: from E107787-LIN (gcc1-power7.osuosl.org. [140.211.15.137]) by smtp.gmail.com with ESMTPSA id q7sm9479476pfq.80.2016.10.12.01.03.53 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 12 Oct 2016 01:03:56 -0700 (PDT) From: Yao Qi To: Jan Kratochvil Cc: Yao Qi , "gdb-patches\@sourceware.org" Subject: Re: aarch64 regression: gdb.cp/nextoverthrow.exp [Re: [PATCH master+7.12] [AArch64] Match instruction "STP with base register" in prologue] References: <1471613676-4975-1-git-send-email-yao.qi@linaro.org> <20161010204111.GA25562@host1.jankratochvil.net> <20161011124017.GA31369@host1.jankratochvil.net> Date: Wed, 12 Oct 2016 09:03:51 +0100 In-Reply-To: <20161011124017.GA31369@host1.jankratochvil.net> (Jan Kratochvil's message of "Tue, 11 Oct 2016 14:40:17 +0200") Message-ID: <86wphe8048.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 X-IsSubscribed: yes Jan Kratochvil writes: >> Could you open a ticket in bugzilla for this error? I am testing a patch. > > https://sourceware.org/bugzilla/show_bug.cgi?id=20682 Thanks, here is the patch... diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 16dd365..be72785 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -68,7 +68,7 @@ /* Pseudo register base numbers. */ #define AARCH64_Q0_REGNUM 0 -#define AARCH64_D0_REGNUM (AARCH64_Q0_REGNUM + 32) +#define AARCH64_D0_REGNUM (AARCH64_Q0_REGNUM + AARCH64_D_REGISTER_COUNT) #define AARCH64_S0_REGNUM (AARCH64_D0_REGNUM + 32) #define AARCH64_H0_REGNUM (AARCH64_S0_REGNUM + 32) #define AARCH64_B0_REGNUM (AARCH64_H0_REGNUM + 32) @@ -206,11 +206,12 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch, { enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch); int i; - pv_t regs[AARCH64_X_REGISTER_COUNT]; + /* Track X registers and D registers in prologue. */ + pv_t regs[AARCH64_X_REGISTER_COUNT + AARCH64_D_REGISTER_COUNT]; struct pv_area *stack; struct cleanup *back_to; - for (i = 0; i < AARCH64_X_REGISTER_COUNT; i++) + for (i = 0; i < AARCH64_X_REGISTER_COUNT + AARCH64_D_REGISTER_COUNT; i++) regs[i] = pv_register (i, 0); stack = make_pv_area (AARCH64_SP_REGNUM, gdbarch_addr_bit (gdbarch)); back_to = make_cleanup_free_pv_area (stack); @@ -328,13 +329,15 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch, && strcmp ("stp", inst.opcode->name) == 0) { /* STP with addressing mode Pre-indexed and Base register. */ - unsigned rt1 = inst.operands[0].reg.regno; - unsigned rt2 = inst.operands[1].reg.regno; + unsigned rt1; + unsigned rt2; unsigned rn = inst.operands[2].addr.base_regno; int32_t imm = inst.operands[2].addr.offset.imm; - gdb_assert (inst.operands[0].type == AARCH64_OPND_Rt); - gdb_assert (inst.operands[1].type == AARCH64_OPND_Rt2); + gdb_assert (inst.operands[0].type == AARCH64_OPND_Rt + || inst.operands[0].type == AARCH64_OPND_Ft); + gdb_assert (inst.operands[1].type == AARCH64_OPND_Rt2 + || inst.operands[1].type == AARCH64_OPND_Ft2); gdb_assert (inst.operands[2].type == AARCH64_OPND_ADDR_SIMM7); gdb_assert (!inst.operands[2].addr.offset.is_reg); @@ -349,6 +352,17 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch, pv_add_constant (regs[rn], imm + 8))) break; + rt1 = inst.operands[0].reg.regno; + rt2 = inst.operands[1].reg.regno; + if (inst.operands[0].type == AARCH64_OPND_Ft) + { + /* Only bottom 64-bit of each V register (D register) need + to be preserved. */ + gdb_assert (inst.operands[0].qualifier == AARCH64_OPND_QLF_S_D); + rt1 += AARCH64_X_REGISTER_COUNT; + rt2 += AARCH64_X_REGISTER_COUNT; + } + pv_area_store (stack, pv_add_constant (regs[rn], imm), 8, regs[rt1]); pv_area_store (stack, pv_add_constant (regs[rn], imm + 8), 8, @@ -408,6 +422,16 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch, cache->saved_regs[i].addr = offset; } + for (i = 0; i < AARCH64_D_REGISTER_COUNT; i++) + { + int regnum = gdbarch_num_regs (gdbarch); + CORE_ADDR offset; + + if (pv_area_find_reg (stack, gdbarch, i + AARCH64_X_REGISTER_COUNT, + &offset)) + cache->saved_regs[i + regnum + AARCH64_D0_REGNUM].addr = offset; + } + do_cleanups (back_to); return start; } diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h index a95b613..6252820 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -68,6 +68,8 @@ enum aarch64_regnum /* Total number of general (X) registers. */ #define AARCH64_X_REGISTER_COUNT 32 +/* Total number of D registers. */ +#define AARCH64_D_REGISTER_COUNT 32 /* The maximum number of modified instructions generated for one single-stepped instruction. */