From patchwork Fri Mar 9 16:58:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 26256 Received: (qmail 118541 invoked by alias); 9 Mar 2018 16:58:53 -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 116824 invoked by uid 89); 9 Mar 2018 16:58:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=H*r:sk:static. X-HELO: mail-wr0-f196.google.com Received: from mail-wr0-f196.google.com (HELO mail-wr0-f196.google.com) (209.85.128.196) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 09 Mar 2018 16:58:50 +0000 Received: by mail-wr0-f196.google.com with SMTP id o8so9675072wra.1 for ; Fri, 09 Mar 2018 08:58:50 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=mGWh0u/nDjHW1Q1Pea1UdiXPXFFqfqRGeU7Q4DlkiP4=; b=GbLHsq6O6Ti+cw5LF+Bn2i4GeBCW5i8IbIAUbA8IEWyZaUs2V1V2WTDlD8t1WuUZ2z CzvGXptYRU6uz5+yQ564iF7LdPqwZf6iA/CJyXYC/tbxpUIWRyqVQfM0KxAjrdWcRC7P uBbAC0FLrf2HoLwQr+4u/3Yrn69csCXxRXy0Y+psnqmaX6oMrO4mXMJvOHt+pRL12+p8 58paF4Sh5bCR6YMxkyz4S8iG0GSKaykVxf0W+iV2tW2OnURL6yJCfC46JG/nwLrUaqu3 HDcG2jdpsXi0NbysROqpy8X0s01K267ADvOwUX9yBAKyrxNE2FwySAAQZETdGhmcF1wh p4wA== X-Gm-Message-State: APf1xPCvVawXgfNOOucxltuIFkzqI8RZsY13hzvQz1bwV1DzmtmIgiFk yCfbewnMPZjzpsuOTbff3rMRlLak X-Google-Smtp-Source: AG47ELuaUCov49ivWFLMqCLBVOteJ7sJpzVzs0LM/pKPhG/o4RLNrFRL5yz/RP2Y/hLTRWyJCarUXg== X-Received: by 10.223.188.18 with SMTP id s18mr27935823wrg.211.1520614728479; Fri, 09 Mar 2018 08:58:48 -0800 (PST) Received: from E107787-LIN.cambridge.arm.com (static.42.136.251.148.clients.your-server.de. [148.251.136.42]) by smtp.gmail.com with ESMTPSA id z72sm1521238wmc.2.2018.03.09.08.58.47 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 09 Mar 2018 08:58:48 -0800 (PST) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH] Fix printing flags field Date: Fri, 9 Mar 2018 16:58:44 +0000 Message-Id: <1520614724-21448-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes As reported in PR gdb/22938, the field value in flags is not correct. It is wrong in bit shift in val_print_type_code_flags, but the field value is still correct if field_len is 1. This patch also adds a self test to default_print_one_register_info, to check that eflags on x86 and cpsr on aarch64 are correctly printed. Regression tested on x86_64-linux and aarch64-linux. gdb: 2018-03-09 Yao Qi PR gdb/22938 * infcmd.c (test_default_print_one_register_info): New function. (_initialize_infcmd): Register the unit test. * valprint.c (val_print_type_code_flags): Fix field value. --- gdb/infcmd.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/valprint.c | 3 +-- 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/gdb/infcmd.c b/gdb/infcmd.c index c10a498..a156253 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -2371,6 +2371,81 @@ default_print_one_register_info (struct ui_file *file, fprintf_filtered (file, "\n"); } +#if GDB_SELF_TEST +#include "selftest.h" +#include "selftest-arch.h" + +namespace selftests { + +static void +test_default_print_one_register_info (struct gdbarch *gdbarch) +{ + auto bfd_arch = gdbarch_bfd_arch_info (gdbarch)->arch; + const int num_regs = (gdbarch_num_regs (gdbarch) + + gdbarch_num_pseudo_regs (gdbarch)); + + for (auto regnum = 0; regnum < num_regs; regnum++) + { + if (register_size (gdbarch, regnum) == 0) + continue; + + auto t = register_type (gdbarch, regnum); + auto name = gdbarch_register_name (gdbarch, regnum); + struct value *mark = value_mark (); + struct value *v = allocate_value (t); + + VALUE_LVAL (v) = lval_register; + VALUE_REGNUM (v) = regnum; + + if (TYPE_CODE (t) == TYPE_CODE_FLAGS) + { + if (bfd_arch == bfd_arch_i386) + { + /* Both eflags and mxcsr are 4-byte. */ + SELF_CHECK (TYPE_LENGTH (t) == 4); + + ULONGEST val = 0x246; + store_integer (value_contents_all_raw (v), TYPE_LENGTH (t), + gdbarch_byte_order (gdbarch), val); + + string_file file; + default_print_one_register_info (&file, name, v); + + if (strcmp (name, "elfags") == 0) + { + SELF_CHECK (file.string ().find (name) != std::string::npos); + SELF_CHECK (file.string ().find ("0x246") + != std::string::npos); + SELF_CHECK (file.string ().find ("[ PF ZF IF ]") + != std::string::npos); + } + } + else if (bfd_arch == bfd_arch_aarch64) + { + /* cpsr is 4-byte. */ + SELF_CHECK (TYPE_LENGTH (t) == 4); + + ULONGEST val = 0x800003c9; + store_integer (value_contents_all_raw (v), TYPE_LENGTH (t), + gdbarch_byte_order (gdbarch), val); + + string_file file; + default_print_one_register_info (&file, name, v); + + SELF_CHECK (file.string ().find (name) != std::string::npos); + SELF_CHECK (file.string ().find ("0x800003c9") + != std::string::npos); + SELF_CHECK (file.string ().find ("[ SP EL=2 F I A D N ]") + != std::string::npos); + } + } + value_free_to_mark (mark); + } +} + +} // namespace selftests +#endif /* GDB_SELF_TEST */ + /* Print out the machine register regnum. If regnum is -1, print all registers (print_all == 1) or all non-float and non-vector registers (print_all == 0). @@ -3537,4 +3612,9 @@ List absolute filename for executable of the process."), add_cmd ("all", class_info, info_proc_cmd_all, _("\ List all available /proc info."), &info_proc_cmdlist); + +#if GDB_SELF_TEST + selftests::register_test_foreach_arch ("test_default_print_one_register_info", + selftests::test_default_print_one_register_info); +#endif } diff --git a/gdb/valprint.c b/gdb/valprint.c index 3104e0b..8201f7e 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -1209,8 +1209,7 @@ val_print_type_code_flags (struct type *type, const gdb_byte *valaddr, else { unsigned field_len = TYPE_FIELD_BITSIZE (type, field); - ULONGEST field_val - = val >> (TYPE_FIELD_BITPOS (type, field) - field_len + 1); + ULONGEST field_val = val >> TYPE_FIELD_BITPOS (type, field); if (field_len < sizeof (ULONGEST) * TARGET_CHAR_BIT) field_val &= ((ULONGEST) 1 << field_len) - 1;