From patchwork Mon Jul 10 13:55:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 21503 Received: (qmail 32500 invoked by alias); 10 Jul 2017 13:56:07 -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 32046 invoked by uid 89); 10 Jul 2017 13:56:07 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=SYSTEM, vip, VIP, UD:dtd X-HELO: mail-it0-f41.google.com Received: from mail-it0-f41.google.com (HELO mail-it0-f41.google.com) (209.85.214.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 10 Jul 2017 13:55:53 +0000 Received: by mail-it0-f41.google.com with SMTP id m68so33754114ith.1 for ; Mon, 10 Jul 2017 06:55:53 -0700 (PDT) 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:in-reply-to :references; bh=RrxcYRyaB4lEI16da9BAl2LINMCZfTV10SoOh64sVYA=; b=NQoiZM0DT04A24JMVozgbA5Y5mOJlFjqUDzFi0ldO+XWO0Fcgbr62irNYOZxe51k8K 2vaqVqIas4LSLsVhXqxmGcYa33toOEBAZu4zLu0f/F4WfBB8qEFiGmdI3fODG6nnnXST /vGC2O1QSMUvpaf1itCne9g89kbkRAa+W5Dpx3DJnRi08xAHmr2mvWg3E8qBuHaH+z77 +FyKA8ZCb8cjug+qM7Dih5JpSLk1/GGY7xuD2Mcg4Y+2Q1WIGqJGt9S1EBULEr1GA6FD Otv4F+E/gJRM1FdcK0lXOzMSP8mFnRbO3Caku7r8fbhIuOzf5BiCLmyTg4/ipLuGICs6 ZsDQ== X-Gm-Message-State: AIVw112p0C7l9vrKWK19S3KwY4BL5kzn60ixOey1U3lxgNT6txQL2IuP duuWn9zHFsUNv1Bk X-Received: by 10.36.185.26 with SMTP id w26mr11201554ite.122.1499694951326; Mon, 10 Jul 2017 06:55:51 -0700 (PDT) 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 v96sm5973996ioi.50.2017.07.10.06.55.50 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 10 Jul 2017 06:55:50 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 06/26] Generate c for feature instead of tdesc Date: Mon, 10 Jul 2017 14:55:20 +0100 Message-Id: <1499694940-23564-7-git-send-email-yao.qi@linaro.org> In-Reply-To: <1499694940-23564-1-git-send-email-yao.qi@linaro.org> References: <1499694940-23564-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes This patch changes Makefile and command "maint print c-files" so that GDB can print c files for features instead target description. Previously, we feed GDB a target description xml file, which generate c files including multiple features. With this patch, in Makefile, we wrap each feature xml file, and create a temp target description which include only one feature. Then, adjust the target description printer for them, and print a c function for each given feature, so that we can use these c functions later to create target description in a flexible way. v3: - Add comments, - Use startswith, - Rename CFILES with TDESC_CFILES, - Split the code adding an optional argument in "maint print c-files", gdb: 2017-07-10 Yao Qi * features/Makefile (CFILES): Rename with TDESC_CFILES. (FEATURE_XMLFILES): New. (FEATURE_CFILES): New. New rules. (clean-cfiles): Remove generated c files. * features/i386/32bit-avx.c: Generated. * features/i386/32bit-avx512.c: Generated. * features/i386/32bit-core.c: Generated. * features/i386/32bit-linux.c: Generated. * features/i386/32bit-mpx.c: Generated. * features/i386/32bit-pkeys.c: Generated. * features/i386/32bit-sse.c: Generated. * target-descriptions.c: Include algorithm. (tdesc_element_visitor): Add method visit_end. (print_c_tdesc): Implement visit_end. (print_c_tdesc:: m_filename_after_features): Move it to protected. (print_c_feature): New class. (maint_print_c_tdesc_cmd): Use print_c_feature if XML file name starts with "i386/32bit-". --- gdb/features/Makefile | 37 ++++++++++++-- gdb/features/i386/32bit-avx.c | 21 ++++++++ gdb/features/i386/32bit-avx512.c | 33 +++++++++++++ gdb/features/i386/32bit-core.c | 66 +++++++++++++++++++++++++ gdb/features/i386/32bit-linux.c | 14 ++++++ gdb/features/i386/32bit-mpx.c | 51 +++++++++++++++++++ gdb/features/i386/32bit-pkeys.c | 14 ++++++ gdb/features/i386/32bit-sse.c | 74 ++++++++++++++++++++++++++++ gdb/target-descriptions.c | 104 ++++++++++++++++++++++++++++++++++++--- 9 files changed, 402 insertions(+), 12 deletions(-) create mode 100644 gdb/features/i386/32bit-avx.c create mode 100644 gdb/features/i386/32bit-avx512.c create mode 100644 gdb/features/i386/32bit-core.c create mode 100644 gdb/features/i386/32bit-linux.c create mode 100644 gdb/features/i386/32bit-mpx.c create mode 100644 gdb/features/i386/32bit-pkeys.c create mode 100644 gdb/features/i386/32bit-sse.c diff --git a/gdb/features/Makefile b/gdb/features/Makefile index dd0f28a..db9a58e 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -235,7 +235,7 @@ XMLTOC = \ tic6x-c64xp-linux.xml \ tic6x-c64xp.xml -CFILES = $(patsubst %.xml,%.c,$(XMLTOC)) +TDESC_CFILES = $(patsubst %.xml,%.c,$(XMLTOC)) GDB = false all: $(OUTPUTS) @@ -252,11 +252,40 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl $(XSLTPROC) gdbserver-regs.xsl - >> $(outdir)/$*.tmp sh ../../move-if-change $(outdir)/$*.tmp $(outdir)/$*.dat -cfiles: $(CFILES) -%.c: %.xml +FEATURE_XMLFILES = i386/32bit-core.xml \ + i386/32bit-sse.xml \ + i386/32bit-linux.xml \ + i386/32bit-avx.xml \ + i386/32bit-mpx.xml \ + i386/32bit-avx512.xml \ + i386/32bit-pkeys.xml + +FEATURE_CFILES = $(patsubst %.xml,%.c,$(FEATURE_XMLFILES)) + +cfiles: $(TDESC_CFILES) $(FEATURE_CFILES) + +$(TDESC_CFILES): %.c: %.xml $(GDB) -nx -q -batch -ex 'maint print c-tdesc $<' > $@.tmp sh ../../move-if-change $@.tmp $@ +$(FEATURE_CFILES): %.c: %.xml.tmp + $(GDB) -nx -q -batch \ + -ex 'maint print c-tdesc $<' > $@.tmp + sh ../../move-if-change $@.tmp $@ + rm $< + +# %.xml is the XML file for each target description feature, and +# %.xml.tmp is the XML file target description which only includes +# one target description feature. + +%.xml.tmp: %.xml + echo "" > $@.tmp + echo "" >> $@.tmp + echo "" >> $@.tmp + echo " " >> $@.tmp + echo "" >> $@.tmp + sh ../../move-if-change $@.tmp $@ + # Other dependencies. $(outdir)/arm/arm-with-iwmmxt.dat: arm/arm-core.xml arm/xscale-iwmmxt.xml $(outdir)/i386/i386.dat: i386/32bit-core.xml i386/32bit-sse.xml @@ -325,7 +354,7 @@ $(outdir)/i386/x32-avx-avx512-linux.dat: i386/x32-core.xml i386/64bit-avx.xml \ # 'all' doesn't build the C files, so don't delete them in 'clean' # either. clean-cfiles: - rm -f $(CFILES) + rm -f $(TDESC_CFILES) $(FEATURE_CFILES) clean: rm -f $(OUTPUTS) diff --git a/gdb/features/i386/32bit-avx.c b/gdb/features/i386/32bit-avx.c new file mode 100644 index 0000000..0e71515 --- /dev/null +++ b/gdb/features/i386/32bit-avx.c @@ -0,0 +1,21 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: 32bit-avx.xml */ + +#include "target-descriptions.h" + +static int +create_feature_i386_32bit_avx (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx"); + tdesc_create_reg (feature, "ymm0h", regnum++, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm1h", regnum++, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm2h", regnum++, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm3h", regnum++, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm4h", regnum++, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm5h", regnum++, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm6h", regnum++, 1, NULL, 128, "uint128"); + tdesc_create_reg (feature, "ymm7h", regnum++, 1, NULL, 128, "uint128"); + return regnum; +} diff --git a/gdb/features/i386/32bit-avx512.c b/gdb/features/i386/32bit-avx512.c new file mode 100644 index 0000000..034f557 --- /dev/null +++ b/gdb/features/i386/32bit-avx512.c @@ -0,0 +1,33 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: 32bit-avx512.xml */ + +#include "target-descriptions.h" + +static int +create_feature_i386_32bit_avx512 (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512"); + struct tdesc_type *field_type; + field_type = tdesc_named_type (feature, "uint128"); + tdesc_create_vector (feature, "v2ui128", field_type, 2); + + tdesc_create_reg (feature, "k0", regnum++, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k1", regnum++, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k2", regnum++, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k3", regnum++, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k4", regnum++, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k5", regnum++, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k6", regnum++, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "k7", regnum++, 1, NULL, 64, "uint64"); + tdesc_create_reg (feature, "zmm0h", regnum++, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm1h", regnum++, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm2h", regnum++, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm3h", regnum++, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm4h", regnum++, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm5h", regnum++, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm6h", regnum++, 1, NULL, 256, "v2ui128"); + tdesc_create_reg (feature, "zmm7h", regnum++, 1, NULL, 256, "v2ui128"); + return regnum; +} diff --git a/gdb/features/i386/32bit-core.c b/gdb/features/i386/32bit-core.c new file mode 100644 index 0000000..b43de4d --- /dev/null +++ b/gdb/features/i386/32bit-core.c @@ -0,0 +1,66 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: 32bit-core.xml */ + +#include "target-descriptions.h" + +static int +create_feature_i386_32bit_core (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core"); + struct tdesc_type *field_type; + struct tdesc_type *type; + type = tdesc_create_flags (feature, "i386_eflags", 4); + tdesc_add_flag (type, 0, "CF"); + tdesc_add_flag (type, 1, ""); + tdesc_add_flag (type, 2, "PF"); + tdesc_add_flag (type, 4, "AF"); + tdesc_add_flag (type, 6, "ZF"); + tdesc_add_flag (type, 7, "SF"); + tdesc_add_flag (type, 8, "TF"); + tdesc_add_flag (type, 9, "IF"); + tdesc_add_flag (type, 10, "DF"); + tdesc_add_flag (type, 11, "OF"); + tdesc_add_flag (type, 14, "NT"); + tdesc_add_flag (type, 16, "RF"); + tdesc_add_flag (type, 17, "VM"); + tdesc_add_flag (type, 18, "AC"); + tdesc_add_flag (type, 19, "VIF"); + tdesc_add_flag (type, 20, "VIP"); + tdesc_add_flag (type, 21, "ID"); + + tdesc_create_reg (feature, "eax", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "ecx", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "edx", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "ebx", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "esp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "ebp", regnum++, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "esi", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "edi", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "eip", regnum++, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "eflags", regnum++, 1, NULL, 32, "i386_eflags"); + tdesc_create_reg (feature, "cs", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "ss", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "ds", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "es", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "fs", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "gs", regnum++, 1, NULL, 32, "int32"); + tdesc_create_reg (feature, "st0", regnum++, 1, NULL, 80, "i387_ext"); + tdesc_create_reg (feature, "st1", regnum++, 1, NULL, 80, "i387_ext"); + tdesc_create_reg (feature, "st2", regnum++, 1, NULL, 80, "i387_ext"); + tdesc_create_reg (feature, "st3", regnum++, 1, NULL, 80, "i387_ext"); + tdesc_create_reg (feature, "st4", regnum++, 1, NULL, 80, "i387_ext"); + tdesc_create_reg (feature, "st5", regnum++, 1, NULL, 80, "i387_ext"); + tdesc_create_reg (feature, "st6", regnum++, 1, NULL, 80, "i387_ext"); + tdesc_create_reg (feature, "st7", regnum++, 1, NULL, 80, "i387_ext"); + tdesc_create_reg (feature, "fctrl", regnum++, 1, "float", 32, "int"); + tdesc_create_reg (feature, "fstat", regnum++, 1, "float", 32, "int"); + tdesc_create_reg (feature, "ftag", regnum++, 1, "float", 32, "int"); + tdesc_create_reg (feature, "fiseg", regnum++, 1, "float", 32, "int"); + tdesc_create_reg (feature, "fioff", regnum++, 1, "float", 32, "int"); + tdesc_create_reg (feature, "foseg", regnum++, 1, "float", 32, "int"); + tdesc_create_reg (feature, "fooff", regnum++, 1, "float", 32, "int"); + tdesc_create_reg (feature, "fop", regnum++, 1, "float", 32, "int"); + return regnum; +} diff --git a/gdb/features/i386/32bit-linux.c b/gdb/features/i386/32bit-linux.c new file mode 100644 index 0000000..686a2f1 --- /dev/null +++ b/gdb/features/i386/32bit-linux.c @@ -0,0 +1,14 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: 32bit-linux.xml */ + +#include "target-descriptions.h" + +static int +create_feature_i386_32bit_linux (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux"); + tdesc_create_reg (feature, "orig_eax", regnum++, 1, NULL, 32, "int"); + return regnum; +} diff --git a/gdb/features/i386/32bit-mpx.c b/gdb/features/i386/32bit-mpx.c new file mode 100644 index 0000000..6ed3b2e --- /dev/null +++ b/gdb/features/i386/32bit-mpx.c @@ -0,0 +1,51 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: 32bit-mpx.xml */ + +#include "target-descriptions.h" + +static int +create_feature_i386_32bit_mpx (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx"); + struct tdesc_type *field_type; + struct tdesc_type *type; + type = tdesc_create_struct (feature, "br128"); + field_type = tdesc_named_type (feature, "uint64"); + tdesc_add_field (type, "lbound", field_type); + field_type = tdesc_named_type (feature, "uint64"); + tdesc_add_field (type, "ubound_raw", field_type); + + type = tdesc_create_struct (feature, "_bndstatus"); + tdesc_set_struct_size (type, 8); + tdesc_add_bitfield (type, "bde", 2, 31); + tdesc_add_bitfield (type, "error", 0, 1); + + type = tdesc_create_union (feature, "status"); + field_type = tdesc_named_type (feature, "data_ptr"); + tdesc_add_field (type, "raw", field_type); + field_type = tdesc_named_type (feature, "_bndstatus"); + tdesc_add_field (type, "status", field_type); + + type = tdesc_create_struct (feature, "_bndcfgu"); + tdesc_set_struct_size (type, 8); + tdesc_add_bitfield (type, "base", 12, 31); + tdesc_add_bitfield (type, "reserved", 2, 11); + tdesc_add_bitfield (type, "preserved", 1, 1); + tdesc_add_bitfield (type, "enabled", 0, 0); + + type = tdesc_create_union (feature, "cfgu"); + field_type = tdesc_named_type (feature, "data_ptr"); + tdesc_add_field (type, "raw", field_type); + field_type = tdesc_named_type (feature, "_bndcfgu"); + tdesc_add_field (type, "config", field_type); + + tdesc_create_reg (feature, "bnd0raw", regnum++, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd1raw", regnum++, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd2raw", regnum++, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bnd3raw", regnum++, 1, NULL, 128, "br128"); + tdesc_create_reg (feature, "bndcfgu", regnum++, 1, NULL, 64, "cfgu"); + tdesc_create_reg (feature, "bndstatus", regnum++, 1, NULL, 64, "status"); + return regnum; +} diff --git a/gdb/features/i386/32bit-pkeys.c b/gdb/features/i386/32bit-pkeys.c new file mode 100644 index 0000000..24a40aa --- /dev/null +++ b/gdb/features/i386/32bit-pkeys.c @@ -0,0 +1,14 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: 32bit-pkeys.xml */ + +#include "target-descriptions.h" + +static int +create_feature_i386_32bit_pkeys (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys"); + tdesc_create_reg (feature, "pkru", regnum++, 1, NULL, 32, "uint32"); + return regnum; +} diff --git a/gdb/features/i386/32bit-sse.c b/gdb/features/i386/32bit-sse.c new file mode 100644 index 0000000..032623e --- /dev/null +++ b/gdb/features/i386/32bit-sse.c @@ -0,0 +1,74 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: 32bit-sse.xml */ + +#include "target-descriptions.h" + +static int +create_feature_i386_32bit_sse (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse"); + struct tdesc_type *field_type; + field_type = tdesc_named_type (feature, "ieee_single"); + tdesc_create_vector (feature, "v4f", field_type, 4); + + field_type = tdesc_named_type (feature, "ieee_double"); + tdesc_create_vector (feature, "v2d", field_type, 2); + + field_type = tdesc_named_type (feature, "int8"); + tdesc_create_vector (feature, "v16i8", field_type, 16); + + field_type = tdesc_named_type (feature, "int16"); + tdesc_create_vector (feature, "v8i16", field_type, 8); + + field_type = tdesc_named_type (feature, "int32"); + tdesc_create_vector (feature, "v4i32", field_type, 4); + + field_type = tdesc_named_type (feature, "int64"); + tdesc_create_vector (feature, "v2i64", field_type, 2); + + struct tdesc_type *type; + type = tdesc_create_union (feature, "vec128"); + field_type = tdesc_named_type (feature, "v4f"); + tdesc_add_field (type, "v4_float", field_type); + field_type = tdesc_named_type (feature, "v2d"); + tdesc_add_field (type, "v2_double", field_type); + field_type = tdesc_named_type (feature, "v16i8"); + tdesc_add_field (type, "v16_int8", field_type); + field_type = tdesc_named_type (feature, "v8i16"); + tdesc_add_field (type, "v8_int16", field_type); + field_type = tdesc_named_type (feature, "v4i32"); + tdesc_add_field (type, "v4_int32", field_type); + field_type = tdesc_named_type (feature, "v2i64"); + tdesc_add_field (type, "v2_int64", field_type); + field_type = tdesc_named_type (feature, "uint128"); + tdesc_add_field (type, "uint128", field_type); + + type = tdesc_create_flags (feature, "i386_mxcsr", 4); + tdesc_add_flag (type, 0, "IE"); + tdesc_add_flag (type, 1, "DE"); + tdesc_add_flag (type, 2, "ZE"); + tdesc_add_flag (type, 3, "OE"); + tdesc_add_flag (type, 4, "UE"); + tdesc_add_flag (type, 5, "PE"); + tdesc_add_flag (type, 6, "DAZ"); + tdesc_add_flag (type, 7, "IM"); + tdesc_add_flag (type, 8, "DM"); + tdesc_add_flag (type, 9, "ZM"); + tdesc_add_flag (type, 10, "OM"); + tdesc_add_flag (type, 11, "UM"); + tdesc_add_flag (type, 12, "PM"); + tdesc_add_flag (type, 15, "FZ"); + + tdesc_create_reg (feature, "xmm0", regnum++, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm1", regnum++, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm2", regnum++, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm3", regnum++, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm4", regnum++, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm5", regnum++, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm6", regnum++, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "xmm7", regnum++, 1, NULL, 128, "vec128"); + tdesc_create_reg (feature, "mxcsr", regnum++, 1, "vector", 32, "i386_mxcsr"); + return regnum; +} diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index f2194f4..518f2dc 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -34,6 +34,7 @@ #include "gdb_obstack.h" #include "hashtab.h" #include "inferior.h" +#include /* The interface to visit different elements of target description. */ @@ -43,7 +44,9 @@ public: virtual void visit_pre (const target_desc *e) = 0; virtual void visit_post (const target_desc *e) = 0; - virtual void visit (const tdesc_feature *e) = 0; + virtual void visit_pre (const tdesc_feature *e) = 0; + virtual void visit_post (const tdesc_feature *e) = 0; + virtual void visit (const tdesc_type *e) = 0; virtual void visit (const tdesc_reg *e) = 0; }; @@ -290,7 +293,7 @@ typedef struct tdesc_feature : tdesc_element void accept (tdesc_element_visitor &v) const override { - v.visit (this); + v.visit_pre (this); struct tdesc_type *type; @@ -306,8 +309,9 @@ typedef struct tdesc_feature : tdesc_element ix++) reg->accept (v); - } + v.visit_post (this); + } } *tdesc_feature_p; DEF_VEC_P(tdesc_feature_p); @@ -1803,7 +1807,6 @@ public: printf_unfiltered ("/* THIS FILE IS GENERATED. " "-*- buffer-read-only: t -*- vi" ":set ro:\n"); - printf_unfiltered (" Original: %s */\n\n", filename); } ~print_c_tdesc () @@ -1813,6 +1816,9 @@ public: void visit_pre (const target_desc *e) override { + printf_unfiltered (" Original: %s */\n\n", + lbasename (m_filename_after_features.c_str ())); + printf_unfiltered ("#include \"defs.h\"\n"); printf_unfiltered ("#include \"osabi.h\"\n"); printf_unfiltered ("#include \"target-descriptions.h\"\n"); @@ -1865,12 +1871,15 @@ public: printf_unfiltered (" struct tdesc_feature *feature;\n"); } - void visit (const tdesc_feature *e) override + void visit_pre (const tdesc_feature *e) override { printf_unfiltered ("\n feature = tdesc_create_feature (result, \"%s\");\n", e->name); } + void visit_post (const tdesc_feature *e) override + {} + void visit_post (const target_desc *e) override { printf_unfiltered ("\n tdesc_%s = result;\n", m_function); @@ -2029,13 +2038,80 @@ public: printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type); } +protected: + std::string m_filename_after_features; + private: char *m_function; - std::string m_filename_after_features; bool m_printed_field_type = false; bool m_printed_type = false; }; +/* Print target description feature in C. */ + +class print_c_feature : public print_c_tdesc +{ +public: + print_c_feature (std::string &file) + : print_c_tdesc (file) + { + /* Trim ".tmp". */ + auto const pos = m_filename_after_features.find_last_of ('.'); + + m_filename_after_features = m_filename_after_features.substr (0, pos); + } + + void visit_pre (const target_desc *e) override + { + printf_unfiltered (" Original: %s */\n\n", + lbasename (m_filename_after_features.c_str ())); + + printf_unfiltered ("#include \"target-descriptions.h\"\n"); + printf_unfiltered ("\n"); + } + + void visit_post (const target_desc *e) override + {} + + void visit_pre (const tdesc_feature *e) override + { + std::string name (m_filename_after_features); + + auto pos = name.find_first_of ('.'); + + name = name.substr (0, pos); + std::replace (name.begin (), name.end (), '/', '_'); + std::replace (name.begin (), name.end (), '-', '_'); + + printf_unfiltered ("static int\n"); + printf_unfiltered ("create_feature_%s ", name.c_str ()); + printf_unfiltered ("(struct target_desc *result, long regnum)\n"); + + printf_unfiltered ("{\n"); + printf_unfiltered (" struct tdesc_feature *feature;\n"); + printf_unfiltered ("\n feature = tdesc_create_feature (result, \"%s\");\n", + e->name); + } + + void visit_post (const tdesc_feature *e) override + { + printf_unfiltered (" return regnum;\n"); + printf_unfiltered ("}\n"); + } + + void visit (const tdesc_reg *reg) override + { + printf_unfiltered (" tdesc_create_reg (feature, \"%s\", regnum++, %d, ", + reg->name, reg->save_restore); + if (reg->group) + printf_unfiltered ("\"%s\", ", reg->group); + else + printf_unfiltered ("NULL, "); + printf_unfiltered ("%d, \"%s\");\n", reg->bitsize, reg->type); + } + +}; + static void maint_print_c_tdesc_cmd (char *args, int from_tty) { @@ -2070,9 +2146,21 @@ maint_print_c_tdesc_cmd (char *args, int from_tty) if (loc != std::string::npos) filename_after_features = filename_after_features.substr (loc + 10); - print_c_tdesc v (filename_after_features); + /* Print c files for target features instead of target descriptions, + because c files got from target features are more flexible than the + counterparts. */ + if (startswith (filename_after_features.c_str (), "i386/32bit-")) + { + print_c_feature v (filename_after_features); - tdesc->accept (v); + tdesc->accept (v); + } + else + { + print_c_tdesc v (filename_after_features); + + tdesc->accept (v); + } } /* Provide a prototype to silence -Wmissing-prototypes. */