From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from out29-218.mail.aliyun.com (out29-218.mail.aliyun.com [115.124.29.218]) by sourceware.org (Postfix) with ESMTPS id 70B61385842E for ; Tue, 22 Mar 2022 11:52:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 70B61385842E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=c-sky.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=c-sky.com X-Alimail-AntiSpam: AC=CONTINUE; BC=0.160668|-1; BR=01201311R971S98rulernew998_84748_2000303; CH=blue; DM=|CONTINUE|false|; DS=CONTINUE|ham_system_inform|0.0745015-0.000792424-0.924706; FP=0|0|0|0|0|-1|-1|-1; HT=ay29a033018047211; MF=jiangshuai_li@c-sky.com; NM=1; PH=DS; RN=2; RT=2; SR=0; TI=SMTPD_---.NA2sk7G_1647949922; Received: from lijsh-VirtualBox.hz.ali.com(mailfrom:jiangshuai_li@c-sky.com fp:SMTPD_---.NA2sk7G_1647949922) by smtp.aliyun-inc.com(33.40.38.164); Tue, 22 Mar 2022 19:52:02 +0800 From: Jiangshuai Li To: gdb-patches@sourceware.org Cc: Jiangshuai Li Subject: [PATCH] gdb:csky using csky_gdbarch_tdep in csky_gdbarch_init Date: Tue, 22 Mar 2022 19:52:03 +0800 Message-Id: <20220322115203.2201-1-jiangshuai_li@c-sky.com> X-Mailer: git-send-email 2.17.1 X-Spam-Status: No, score=-10.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Mar 2022 11:52:11 -0000 add three points: 1. add vars to csky_gdbarch_tdep 2. save mach, fpu_abi, vdsp_verion and fpu_hardfp from info.abfd 3. find a pre-declared gdbarch via point 2 fpu_abi and vdsp_verion will be used by gdbarch_return_value and gdbarch_push_dummy_call later. gdb/ *csky-tdep.h: add vars to csky_gdbarch_tdep *csky-tdep.c: save msgs from info.abfd and use them to find a pre-declared gdbarch --- gdb/csky-tdep.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++-- gdb/csky-tdep.h | 17 +++++++++- 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/gdb/csky-tdep.c b/gdb/csky-tdep.c index cba0065fa53..44c2b56fba4 100644 --- a/gdb/csky-tdep.c +++ b/gdb/csky-tdep.c @@ -2157,16 +2157,97 @@ static struct gdbarch * csky_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { struct gdbarch *gdbarch; + /* Analysis info.abfd. */ + unsigned int mach; + int mach_find = 0; + unsigned long abfd_e_flags; + unsigned int fpu_abi = 0; + unsigned int vdsp_version = 0; + unsigned int fpu_hardfp = 0; + static bfd_arch_info_type bfd_csky_arch_t; + + /* When the type of bfd file is srec(or any files are not elf), + the E_FLAGS will be not credible. */ + if (info.abfd && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour) + { + /* Get e_flags form abfd. */ + abfd_e_flags = elf_elfheader (info.abfd)->e_flags; + if (IS_CSKY_V2 (abfd_e_flags)) + { + switch (abfd_e_flags & CSKY_ARCH_MASK) + { + case CSKY_ARCH_801: + case CSKY_ARCH_802: + case CSKY_ARCH_803: + case CSKY_ARCH_807: + case CSKY_ARCH_810: + case CSKY_ARCH_860: + mach = abfd_e_flags & CSKY_ARCH_MASK; + mach_find = 1; + break; + default: + mach = CSKY_ARCH_810; + break; + } + } + else + { + mach = CSKY_ARCH_810; + } + + /* Get FPU, VDSP build options. */ + fpu_abi = bfd_elf_get_obj_attr_int (info.abfd, + OBJ_ATTR_PROC, + Tag_CSKY_FPU_ABI); + vdsp_version = bfd_elf_get_obj_attr_int (info.abfd, + OBJ_ATTR_PROC, + Tag_CSKY_VDSP_VERSION); + fpu_hardfp = bfd_elf_get_obj_attr_int (info.abfd, + OBJ_ATTR_PROC, + Tag_CSKY_FPU_HARDFP); + } + else + { + mach = CSKY_ARCH_810; + } + + /* Set info.bfd_arch_info. */ + memcpy (&bfd_csky_arch_t, info.bfd_arch_info, sizeof (bfd_csky_arch_t)); + if (mach_find) + bfd_csky_arch_t.mach = abfd_e_flags; + else + bfd_csky_arch_t.mach = mach | CSKY_ABI_V2; + info.bfd_arch_info = &bfd_csky_arch_t; /* Find a candidate among the list of pre-declared architectures. */ - arches = gdbarch_list_lookup_by_info (arches, &info); - if (arches != NULL) - return arches->gdbarch; + for (arches = gdbarch_list_lookup_by_info (arches, &info); + arches != NULL; + arches = gdbarch_list_lookup_by_info (arches->next, &info)) + { + csky_gdbarch_tdep *tdep + = (csky_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch); + if (mach != tdep->mach) + continue; + if (fpu_abi != tdep->fpu_abi) + continue; + if (vdsp_version != tdep->vdsp_version) + continue; + if (fpu_hardfp != tdep->fpu_hardfp) + continue; + + /* Found a match. */ + return arches->gdbarch; + } /* None found, create a new architecture from the information provided. */ csky_gdbarch_tdep *tdep = new csky_gdbarch_tdep; gdbarch = gdbarch_alloc (&info, tdep); + tdep->mach = mach; + tdep->return_reg = CSKY_RET_REGNUM; + tdep->fpu_abi = fpu_abi; + tdep->vdsp_version = vdsp_version; + tdep->fpu_hardfp = fpu_hardfp; /* Target data types. */ set_gdbarch_ptr_bit (gdbarch, 32); diff --git a/gdb/csky-tdep.h b/gdb/csky-tdep.h index 7898e0d325b..3dbbb13bfbb 100644 --- a/gdb/csky-tdep.h +++ b/gdb/csky-tdep.h @@ -33,7 +33,22 @@ enum lr_type_t /* Target-dependent structure in gdbarch. */ struct csky_gdbarch_tdep : gdbarch_tdep { - /* This is Unused. */ + /* Save abfd_e_flags. */ + unsigned int mach; + + /* The selected register will form a list, which will be update, when + conducting -data-list-register-changed command. */ + char * selected_registers; + unsigned int return_reg; + + /* Save fv_pseudo_registers_count. */ + unsigned int has_vr0; + unsigned int fv_pseudo_registers_count; + + /* Save FPU ABI. */ + unsigned int fpu_abi; + unsigned int vdsp_version; + unsigned int fpu_hardfp; }; /* Instruction sizes. */ -- 2.17.1