From patchwork Tue Jul 5 13:40:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antoine Tremblay X-Patchwork-Id: 13642 Received: (qmail 63479 invoked by alias); 5 Jul 2016 13:41:20 -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 63312 invoked by uid 89); 5 Jul 2016 13:41:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.9 required=5.0 tests=BAYES_00, KAM_LAZY_DOMAIN_SECURITY autolearn=no version=3.3.2 spammy=reloc_data, U*simon.marchi, sk:simonm, sk:simon.m X-HELO: usplmg21.ericsson.net Received: from usplmg21.ericsson.net (HELO usplmg21.ericsson.net) (198.24.6.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Tue, 05 Jul 2016 13:41:07 +0000 Received: from EUSAAHC008.ericsson.se (Unknown_Domain [147.117.188.96]) by usplmg21.ericsson.net (Symantec Mail Security) with SMTP id E8.66.03614.DA8BB775; Tue, 5 Jul 2016 15:39:58 +0200 (CEST) Received: from elxa4wqvvz1.dyn.mo.ca.am.ericsson.se (147.117.188.8) by smtps-am.internal.ericsson.com (147.117.188.96) with Microsoft SMTP Server (TLS) id 14.3.294.0; Tue, 5 Jul 2016 09:40:50 -0400 From: Antoine Tremblay To: CC: Simon Marchi Subject: [PATCH v3 02/18] arm-tdep.c: Refactor displaced stepping relocation functions Date: Tue, 5 Jul 2016 09:40:14 -0400 Message-ID: <1467726030-13020-3-git-send-email-antoine.tremblay@ericsson.com> In-Reply-To: <1467726030-13020-1-git-send-email-antoine.tremblay@ericsson.com> References: <1467726030-13020-1-git-send-email-antoine.tremblay@ericsson.com> MIME-Version: 1.0 X-IsSubscribed: yes From: Simon Marchi Refactor so that arm_process_displaced_insn is the only function that is specific to GDB. All functions called from this function will eventually be moved to common/, so they need to be free of anything GDB-specific. gdb/ChangeLog: arm-tdep.c (thumb_process_displaced_16bit_insn): Rename to... (thumb_16bit_relocate_insn): ... this, and return error code instead of throwing an error. (thumb_process_displaced_32bit_insn): Rename to... (thumb_32bit_relocate_insn): ... this, and return error code instead of throwing an error. (arm_relocate_insn): New function. (thumb_process_displaced_insn): Remove. (arm_process_displaced_insn): Refactor, extract some content to arm_relocate_insn, integrate content from thumb_process_displaced_insn. --- gdb/arm-tdep.c | 123 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 64 insertions(+), 59 deletions(-) diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index d6e8858..5a0e247 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -7259,9 +7259,8 @@ thumb_copy_pop_pc_16bit (uint16_t insn1, struct arm_insn_reloc_data *data) return 0; } -static void -thumb_process_displaced_16bit_insn (uint16_t insn1, - struct arm_insn_reloc_data *data) +static int +thumb_16bit_relocate_insn (uint16_t insn1, struct arm_insn_reloc_data *data) { unsigned short op_bit_12_15 = bits (insn1, 12, 15); unsigned short op_bit_10_11 = bits (insn1, 10, 11); @@ -7350,9 +7349,7 @@ thumb_process_displaced_16bit_insn (uint16_t insn1, err = 1; } - if (err) - internal_error (__FILE__, __LINE__, - _("thumb_process_displaced_16bit_insn: Instruction decode error")); + return err; } static int @@ -7427,9 +7424,9 @@ decode_thumb_32bit_ld_mem_hints (uint16_t insn1, uint16_t insn2, return 0; } -static void -thumb_process_displaced_32bit_insn (uint16_t insn1, uint16_t insn2, - struct arm_insn_reloc_data *data) +static int +thumb_32bit_relocate_insn (uint16_t insn1, uint16_t insn2, + struct arm_insn_reloc_data *data) { int err = 0; unsigned short op = bit (insn2, 15); @@ -7541,34 +7538,41 @@ thumb_process_displaced_32bit_insn (uint16_t insn1, uint16_t insn2, err = 1; } - if (err) - internal_error (__FILE__, __LINE__, - _("thumb_process_displaced_32bit_insn: Instruction decode error")); + return err; } -static void -thumb_process_displaced_insn (CORE_ADDR from, struct arm_insn_reloc_data *data) +static int +arm_relocate_insn (uint32_t insn, struct arm_insn_reloc_data *data) { - enum bfd_endian byte_order_for_code - = gdbarch_byte_order_for_code (data->gdbarch); - uint16_t insn1 - = read_memory_unsigned_integer (from, 2, byte_order_for_code); + int err = 1; - if (debug_displaced) - fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x " - "at %.8lx\n", insn1, (unsigned long) from); - - data->dsc->is_thumb = 1; - data->dsc->insn_size = thumb_insn_size (insn1); - if (thumb_insn_size (insn1) == 4) + if ((insn & 0xf0000000) == 0xf0000000) + err = arm_decode_unconditional (insn, data); + else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24)) { - uint16_t insn2 - = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code); - thumb_process_displaced_32bit_insn (insn1, insn2, data); + case 0x0: case 0x1: case 0x2: case 0x3: + err = arm_decode_dp_misc (insn, data); + break; + + case 0x4: case 0x5: case 0x6: + err = arm_decode_ld_st_word_ubyte (insn, data); + break; + + case 0x7: + err = arm_decode_media (insn, data); + break; + + case 0x8: case 0x9: case 0xa: case 0xb: + err = arm_decode_b_bl_ldmstm (insn, data); + break; + + case 0xc: case 0xd: case 0xe: case 0xf: + err = arm_decode_svc_copro (insn, data); + break; } - else - thumb_process_displaced_16bit_insn (insn1, data); + + return err; } void @@ -7578,7 +7582,6 @@ arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from, { int err = 0; enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch); - uint32_t insn; struct arm_insn_reloc_data reloc_data; reloc_data.dsc = dsc; @@ -7593,40 +7596,42 @@ arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from, dsc->cleanup = NULL; dsc->wrote_to_pc = 0; - if (!displaced_in_arm_mode (regs)) - return thumb_process_displaced_insn (from, &reloc_data); + if (displaced_in_arm_mode (regs)) + { + uint32_t insn + = read_memory_unsigned_integer (from, 4, byte_order_for_code); - dsc->is_thumb = 0; - dsc->insn_size = 4; - insn = read_memory_unsigned_integer (from, 4, byte_order_for_code); - if (debug_displaced) - fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx " - "at %.8lx\n", (unsigned long) insn, - (unsigned long) from); + if (debug_displaced) + fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx " + "at %.8lx\n", (unsigned long) insn, + (unsigned long) from); - if ((insn & 0xf0000000) == 0xf0000000) - err = arm_decode_unconditional (insn, &reloc_data); - else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24)) - { - case 0x0: case 0x1: case 0x2: case 0x3: - err = arm_decode_dp_misc (insn, &reloc_data); - break; + dsc->is_thumb = 0; + dsc->insn_size = 4; - case 0x4: case 0x5: case 0x6: - err = arm_decode_ld_st_word_ubyte (insn, &reloc_data); - break; + err = arm_relocate_insn (insn, &reloc_data); + } + else + { + uint16_t insn1 + = read_memory_unsigned_integer (from, 2, byte_order_for_code); + unsigned int insn_size = thumb_insn_size (insn1); - case 0x7: - err = arm_decode_media (insn, &reloc_data); - break; + if (debug_displaced) + fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x " + "at %.8lx\n", insn1, (unsigned long) from); - case 0x8: case 0x9: case 0xa: case 0xb: - err = arm_decode_b_bl_ldmstm (insn, &reloc_data); - break; + dsc->is_thumb = 1; + dsc->insn_size = insn_size; - case 0xc: case 0xd: case 0xe: case 0xf: - err = arm_decode_svc_copro (insn, &reloc_data); - break; + if (insn_size == 4) + { + uint16_t insn2 + = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code); + err = thumb_32bit_relocate_insn (insn1, insn2, &reloc_data); + } + else + err = thumb_16bit_relocate_insn (insn1, &reloc_data); } if (err)