From patchwork Tue Dec 5 12:28:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philipp Rudo X-Patchwork-Id: 24726 Received: (qmail 36064 invoked by alias); 5 Dec 2017 12:29:18 -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 35920 invoked by uid 89); 5 Dec 2017 12:29:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy= X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0a-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.156.1) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 05 Dec 2017 12:29:15 +0000 Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vB5CSpm9112954 for ; Tue, 5 Dec 2017 07:29:14 -0500 Received: from e06smtp10.uk.ibm.com (e06smtp10.uk.ibm.com [195.75.94.106]) by mx0a-001b2d01.pphosted.com with ESMTP id 2ensh4eq7a-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Tue, 05 Dec 2017 07:29:13 -0500 Received: from localhost by e06smtp10.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 5 Dec 2017 12:29:11 -0000 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp10.uk.ibm.com (192.168.101.140) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 5 Dec 2017 12:29:08 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id vB5CT8fv721352; Tue, 5 Dec 2017 12:29:08 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4A7784C05A; Tue, 5 Dec 2017 12:24:00 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 16ADA4C052; Tue, 5 Dec 2017 12:24:00 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTPS; Tue, 5 Dec 2017 12:24:00 +0000 (GMT) From: Philipp Rudo To: gdb-patches@sourceware.org Cc: Andreas Arnez , Ulrich Weigand Subject: [PATCH v2 07/11] s390: Hook s390 into OSABI mechanism Date: Tue, 5 Dec 2017 13:28:55 +0100 In-Reply-To: <20171205122859.2919-1-prudo@linux.vnet.ibm.com> References: <20171205122859.2919-1-prudo@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 17120512-0040-0000-0000-000003F689F9 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17120512-0041-0000-0000-000025F97E7F Message-Id: <20171205122859.2919-8-prudo@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-12-05_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=3 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1712050180 X-IsSubscribed: yes Well do what the title says and distinguish between 31- and 64-bit systems. There is one pitfall to take care of. Appending the dwarf2 unwinder must be moved _before_ the OSABI is initialized. Otherwise a default unwinder will take control before the dwarf unwinder even gets a chance. gdb/ChangeLog: * s390-linux-tdep.c (osabi.h): New include (s390_linux_init_osabi_31, s390_linux_init_osabi_64) (s390_linux_init_osabi_any): New functions. (s390_gdbarch_init): Adjust. --- gdb/s390-linux-tdep.c | 155 +++++++++++++++++++++++++++++--------------------- 1 file changed, 91 insertions(+), 64 deletions(-) diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c index f6a39868be..f8559eec49 100644 --- a/gdb/s390-linux-tdep.c +++ b/gdb/s390-linux-tdep.c @@ -30,6 +30,7 @@ #include "gdbcore.h" #include "gdbcmd.h" #include "objfiles.h" +#include "osabi.h" #include "regcache.h" #include "trad-frame.h" #include "frame-base.h" @@ -8024,32 +8025,12 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) struct tdesc_arch_data *tdesc_data = tdesc_data_alloc (); info.tdesc_data = tdesc_data; - /* Default ABI and register size. */ - switch (info.bfd_arch_info->mach) - { - case bfd_mach_s390_31: - tdep->abi = ABI_LINUX_S390; - break; - - case bfd_mach_s390_64: - tdep->abi = ABI_LINUX_ZSERIES; - break; - - default: - xfree (tdep); - gdbarch_free (gdbarch); - return NULL; - } + /* The DWARF unwinders must be appended before the ABI is initialized. + Otherwise it is possible that a ABI default unwinder gets called before + the DWARF unwinder even gets the chance. */ + dwarf2_append_unwinders (gdbarch); - /* Use default target description if none provided by the target. */ - if (!tdesc_has_registers (tdesc)) - { - if (tdep->abi == ABI_LINUX_S390) - tdesc = tdesc_s390_linux32; - else - tdesc = tdesc_s390x_linux64; - } - tdep->tdesc = tdesc; + gdbarch_init_osabi (info, gdbarch); /* Check any target description for validity. */ gdb_assert (tdesc_has_registers (tdep->tdesc)); @@ -8100,12 +8081,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_stab_reg_to_regnum (gdbarch, s390_dwarf_reg_to_regnum); set_gdbarch_dwarf2_reg_to_regnum (gdbarch, s390_dwarf_reg_to_regnum); set_gdbarch_value_from_register (gdbarch, s390_value_from_register); - set_gdbarch_core_read_description (gdbarch, s390_core_read_description); - set_gdbarch_iterate_over_regset_sections (gdbarch, - s390_iterate_over_regset_sections); set_gdbarch_cannot_store_register (gdbarch, s390_cannot_store_register); - set_gdbarch_write_pc (gdbarch, s390_write_pc); - set_gdbarch_guess_tracepoint_registers (gdbarch, s390_guess_tracepoint_registers); set_gdbarch_pseudo_register_read (gdbarch, s390_pseudo_register_read); set_gdbarch_pseudo_register_write (gdbarch, s390_pseudo_register_write); set_tdesc_pseudo_register_name (gdbarch, s390_pseudo_register_name); @@ -8144,18 +8120,10 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_frame_align (gdbarch, s390_frame_align); set_gdbarch_return_value (gdbarch, s390_return_value); - /* Syscall handling. */ - set_gdbarch_get_syscall_number (gdbarch, s390_linux_get_syscall_number); - /* Frame handling. */ 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); frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer); - frame_unwind_append_unwinder (gdbarch, &s390_stub_frame_unwind); - frame_unwind_append_unwinder (gdbarch, &s390_sigtramp_frame_unwind); - frame_unwind_append_unwinder (gdbarch, &s390_frame_unwind); - frame_base_set_default (gdbarch, &s390_frame_base); set_gdbarch_unwind_pc (gdbarch, s390_unwind_pc); set_gdbarch_unwind_sp (gdbarch, s390_unwind_sp); @@ -8166,65 +8134,118 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_displaced_step_location (gdbarch, linux_displaced_step_location); set_gdbarch_max_insn_length (gdbarch, S390_MAX_INSTR_SIZE); - /* Note that GNU/Linux is the only OS supported on this - platform. */ - linux_init_abi (info, gdbarch); - switch (tdep->abi) { case ABI_LINUX_S390: set_gdbarch_addr_bits_remove (gdbarch, s390_addr_bits_remove); - set_solib_svr4_fetch_link_map_offsets - (gdbarch, svr4_ilp32_fetch_link_map_offsets); - - set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390); break; case ABI_LINUX_ZSERIES: set_gdbarch_long_bit (gdbarch, 64); set_gdbarch_long_long_bit (gdbarch, 64); set_gdbarch_ptr_bit (gdbarch, 64); - set_solib_svr4_fetch_link_map_offsets - (gdbarch, svr4_lp64_fetch_link_map_offsets); set_gdbarch_address_class_type_flags (gdbarch, s390_address_class_type_flags); set_gdbarch_address_class_type_flags_to_name (gdbarch, s390_address_class_type_flags_to_name); set_gdbarch_address_class_name_to_type_flags (gdbarch, s390_address_class_name_to_type_flags); - set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390X); break; } - set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); - - /* Enable TLS support. */ - set_gdbarch_fetch_tls_load_module_address (gdbarch, - svr4_fetch_objfile_link_map); - /* SystemTap functions. */ set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes); set_gdbarch_stap_register_indirection_prefixes (gdbarch, stap_register_indirection_prefixes); set_gdbarch_stap_register_indirection_suffixes (gdbarch, stap_register_indirection_suffixes); - set_gdbarch_stap_is_single_operand (gdbarch, s390_stap_is_single_operand); - set_gdbarch_gcc_target_options (gdbarch, s390_gcc_target_options); - set_gdbarch_gnu_triplet_regexp (gdbarch, s390_gnu_triplet_regexp); - /* Support reverse debugging. */ + set_gdbarch_disassembler_options (gdbarch, &s390_disassembler_options); + set_gdbarch_valid_disassembler_options (gdbarch, + disassembler_options_s390 ()); + + return gdbarch; +} + +/* Initialize OSABI common for GNU/Linux on 31- and 64-bit systems. */ + +static void +s390_linux_init_abi_any (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + linux_init_abi (info, gdbarch); + /* Register handling. */ + set_gdbarch_core_read_description (gdbarch, s390_core_read_description); + set_gdbarch_iterate_over_regset_sections (gdbarch, + s390_iterate_over_regset_sections); + set_gdbarch_guess_tracepoint_registers (gdbarch, + s390_guess_tracepoint_registers); + set_gdbarch_write_pc (gdbarch, s390_write_pc); + + /* Syscall handling. */ + set_gdbarch_get_syscall_number (gdbarch, s390_linux_get_syscall_number); + + /* Frame handling. */ + frame_unwind_append_unwinder (gdbarch, &s390_stub_frame_unwind); + frame_unwind_append_unwinder (gdbarch, &s390_sigtramp_frame_unwind); + frame_unwind_append_unwinder (gdbarch, &s390_frame_unwind); + frame_base_set_default (gdbarch, &s390_frame_base); + set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + + /* Enable TLS support. */ + set_gdbarch_fetch_tls_load_module_address (gdbarch, + svr4_fetch_objfile_link_map); + + /* Support reverse debugging. */ set_gdbarch_process_record (gdbarch, s390_process_record); set_gdbarch_process_record_signal (gdbarch, s390_linux_record_signal); - s390_init_linux_record_tdep (&s390_linux_record_tdep, ABI_LINUX_S390); s390_init_linux_record_tdep (&s390x_linux_record_tdep, ABI_LINUX_ZSERIES); - set_gdbarch_disassembler_options (gdbarch, &s390_disassembler_options); - set_gdbarch_valid_disassembler_options (gdbarch, - disassembler_options_s390 ()); + /* Miscellaneous. */ + set_gdbarch_stap_is_single_operand (gdbarch, s390_stap_is_single_operand); + set_gdbarch_gcc_target_options (gdbarch, s390_gcc_target_options); + set_gdbarch_gnu_triplet_regexp (gdbarch, s390_gnu_triplet_regexp); +} - return gdbarch; +/* Initialize OSABI for GNU/Linux on 31-bit systems. */ + +static void +s390_linux_init_abi_31 (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + const struct target_desc *tdesc = info.target_desc; + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + tdep->abi = ABI_LINUX_S390; + if (!tdesc_has_registers (tdesc)) + tdesc = tdesc_s390_linux32; + tdep->tdesc = tdesc; + + s390_linux_init_abi_any (info, gdbarch); + + set_solib_svr4_fetch_link_map_offsets (gdbarch, + svr4_ilp32_fetch_link_map_offsets); + set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390); +} + +/* Initialize OSABI for GNU/Linux on 64-bit systems. */ + +static void +s390_linux_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + const struct target_desc *tdesc = info.target_desc; + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + tdep->abi = ABI_LINUX_ZSERIES; + if (!tdesc_has_registers (tdesc)) + tdesc = tdesc_s390x_linux64; + tdep->tdesc = tdesc; + + s390_linux_init_abi_any (info, gdbarch); + + set_solib_svr4_fetch_link_map_offsets (gdbarch, + svr4_lp64_fetch_link_map_offsets); + set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_S390X); } void @@ -8233,6 +8254,12 @@ _initialize_s390_tdep (void) /* Hook us into the gdbarch mechanism. */ register_gdbarch_init (bfd_arch_s390, s390_gdbarch_init); + /* Hook us into the OSABI mechanism. */ + gdbarch_register_osabi (bfd_arch_s390, bfd_mach_s390_31, GDB_OSABI_LINUX, + s390_linux_init_abi_31); + gdbarch_register_osabi (bfd_arch_s390, bfd_mach_s390_64, GDB_OSABI_LINUX, + s390_linux_init_abi_64); + /* Initialize the GNU/Linux target descriptions. */ initialize_tdesc_s390_linux32 (); initialize_tdesc_s390_linux32v1 ();