From patchwork Tue Jun 30 02:00:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kito Cheng X-Patchwork-Id: 1319473 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=sifive.com header.i=@sifive.com header.a=rsa-sha256 header.s=google header.b=gbHSOBcO; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49wndW5ZM2z9sSF for ; Tue, 30 Jun 2020 12:01:02 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7FE3B3858D38; Tue, 30 Jun 2020 02:00:59 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pf1-x42a.google.com (mail-pf1-x42a.google.com [IPv6:2607:f8b0:4864:20::42a]) by sourceware.org (Postfix) with ESMTPS id 0CE233858D37 for ; Tue, 30 Jun 2020 02:00:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 0CE233858D37 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=kito.cheng@sifive.com Received: by mail-pf1-x42a.google.com with SMTP id b184so2300104pfa.6 for ; Mon, 29 Jun 2020 19:00:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=+mPVX8RCkfEBkR7vWKPknv84C8/HavbgSTeYH7FI7Hk=; b=gbHSOBcORNvSAJpQDM7aPkuGQWRKobPJVAOrnPXDIOaG4iDGvc1/40HypKzcZjAmlq JzFpWMvF07bmQpHOFzJNr8OKI5pkq51now+bU5F4IsfxM2r6yeq3k07zainq8Cev5w3c ZBPYzKsXbwgmdrnoU4ddCR1K5GReaB+sDaPTN8CGAFA1BCG5mAFq+DNgn+zUY3C6EYYl J9/nxJtlGMLPyVg97+Fqx2UsFDwnsILrl9IG78zDye3AU/QuBvsOOmVgR26I9+Ai3bvi WNGiS2WQkQnmiuQIb2RdYJQUguX1WWJo8AmtEy2keXE5p/6qm+E32VC9nFWWZVgycVTw 0Qcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=+mPVX8RCkfEBkR7vWKPknv84C8/HavbgSTeYH7FI7Hk=; b=OOUpxi+WRpgN76sRchXJhFaf+efV2CYls8CJezvRiwzDQ2QRdtbkB9Hsj6i/BPtA92 zd/wG3ii4rnJPdUPBNkpKPo8ElaQUJ8JpkeQgzMrw8t/S5CMkzbGptNTyZP2L/XtT4Kk L3/077qcP1p/jGZqsyVzZiE+bW85SOoTT04IGmlQ404PdWl3n3VY3wSubiplovXkQIgS lr+enA2CFjRhSmGu32QcIiKEJfO6DVfuiii9C8pJjz9koVu6gS49IZQmDhcmjFbbS+DR cV5tBxaptSMDMXbmBmNWi+wVOXjinkKNEa7qrCylUbYEUyiMtXlMl2D648ebpe3YQ+Vn BYFQ== X-Gm-Message-State: AOAM531XDGAXCrIfV6FA9+GlS0JoYmT7IySMeX90c4tr9rzuxA7/b3nQ napMh1vOrwdpfBonpErUV8bQeXAkfNOn3Q== X-Google-Smtp-Source: ABdhPJyVt9wHRRlp15Scdcz0OohWwN0KBzPxSR+fkr1vGKu2I6bKwPkNr94NgVau5UfRWPUmjkObPw== X-Received: by 2002:aa7:8147:: with SMTP id d7mr16963362pfn.29.1593482453326; Mon, 29 Jun 2020 19:00:53 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (114-34-229-221.HINET-IP.hinet.net. [114.34.229.221]) by smtp.gmail.com with ESMTPSA id u2sm800589pfl.21.2020.06.29.19.00.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jun 2020 19:00:52 -0700 (PDT) From: Kito Cheng To: gcc-patches@gcc.gnu.org, kito.cheng@gmail.com, jimw@sifive.com Subject: [PATCH] RISC-V: Preserve arch version info during normalizing arch string Date: Tue, 30 Jun 2020 10:00:49 +0800 Message-Id: <20200630020049.107362-1-kito.cheng@sifive.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Spam-Status: No, score=-15.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kito Cheng Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" - Arch version should preserved if user explicitly specified the version. e.g. After normalize, -march=rv32if3d should be -march=rv32i_f3p0d instead of-march=rv32ifd. gcc/ChangeLog: * common/config/riscv/riscv-common.c(riscv_subset_t): New field added. (riscv_subset_list::parsing_subset_version): Add parameter for indicate explicitly version, and handle explicitly version. (riscv_subset_list::handle_implied_ext): Ditto. (riscv_subset_list::add): Ditto. (riscv_subset_t::riscv_subset_t): Init new field. (riscv_subset_list::to_string): Always output version info if version explicitly specified. (riscv_subset_list::parsing_subset_version): Handle explicitly arch version. (riscv_subset_list::parse_std_ext): Ditto. (riscv_subset_list::parse_multiletter_ext): Ditto. gcc/testsuite/ChangeLog: * gcc.target/riscv/attribute-13.c: New. --- gcc/common/config/riscv/riscv-common.c | 70 ++++++++++++------- gcc/testsuite/gcc.target/riscv/attribute-13.c | 6 ++ 2 files changed, 52 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/attribute-13.c diff --git a/gcc/common/config/riscv/riscv-common.c b/gcc/common/config/riscv/riscv-common.c index 2df93460165b..96a128acdeac 100644 --- a/gcc/common/config/riscv/riscv-common.c +++ b/gcc/common/config/riscv/riscv-common.c @@ -42,6 +42,8 @@ struct riscv_subset_t int major_version; int minor_version; struct riscv_subset_t *next; + + bool explicit_version_p; }; /* Type for implied ISA info. */ @@ -80,19 +82,19 @@ private: riscv_subset_list (const char *, location_t); const char *parsing_subset_version (const char *, unsigned *, unsigned *, - unsigned, unsigned, bool); + unsigned, unsigned, bool, bool *); const char *parse_std_ext (const char *); const char *parse_multiletter_ext (const char *, const char *, const char *); - void handle_implied_ext (const char *, int, int); + void handle_implied_ext (const char *, int, int, bool); public: ~riscv_subset_list (); - void add (const char *, int, int); + void add (const char *, int, int, bool); riscv_subset_t *lookup (const char *, int major_version = RISCV_DONT_CARE_VERSION, @@ -111,7 +113,8 @@ static const char *riscv_supported_std_ext (void); static riscv_subset_list *current_subset_list = NULL; riscv_subset_t::riscv_subset_t () - : name (), major_version (0), minor_version (0), next (NULL) + : name (), major_version (0), minor_version (0), next (NULL), + explicit_version_p(false) { } @@ -138,7 +141,7 @@ riscv_subset_list::~riscv_subset_list () void riscv_subset_list::add (const char *subset, int major_version, - int minor_version) + int minor_version, bool explicit_version_p) { riscv_subset_t *s = new riscv_subset_t (); @@ -148,6 +151,7 @@ riscv_subset_list::add (const char *subset, int major_version, s->name = subset; s->major_version = major_version; s->minor_version = minor_version; + s->explicit_version_p = explicit_version_p; s->next = NULL; if (m_tail != NULL) @@ -173,13 +177,15 @@ riscv_subset_list::to_string (bool version_p) const /* For !version_p, we only separate extension with underline for multi-letter extension. */ if (!first && - (version_p || subset->name.length() > 1)) + (version_p + || subset->explicit_version_p + || subset->name.length() > 1)) oss << '_'; first = false; oss << subset->name; - if (version_p) + if (version_p || subset->explicit_version_p) oss << subset->major_version << 'p' << subset->minor_version; @@ -240,7 +246,8 @@ riscv_supported_std_ext (void) `major_version` using default_major_version. `default_major_version`: Default major version. `default_minor_version`: Default minor version. - `std_ext_p`: True if parsing std extension. */ + `std_ext_p`: True if parsing std extension. + `explicit_version_p`: True if this subset is not using default version. */ const char * riscv_subset_list::parsing_subset_version (const char *p, @@ -248,13 +255,15 @@ riscv_subset_list::parsing_subset_version (const char *p, unsigned *minor_version, unsigned default_major_version, unsigned default_minor_version, - bool std_ext_p) + bool std_ext_p, + bool *explicit_version_p) { bool major_p = true; unsigned version = 0; unsigned major = 0; unsigned minor = 0; char np; + *explicit_version_p = false; for (; *p; ++p) { @@ -269,6 +278,7 @@ riscv_subset_list::parsing_subset_version (const char *p, { *major_version = version; *minor_version = 0; + *explicit_version_p = true; return p; } else @@ -302,6 +312,7 @@ riscv_subset_list::parsing_subset_version (const char *p, } else { + *explicit_version_p = true; *major_version = major; *minor_version = minor; } @@ -325,6 +336,7 @@ riscv_subset_list::parse_std_ext (const char *p) unsigned major_version = 0; unsigned minor_version = 0; char std_ext = '\0'; + bool explicit_version_p = false; /* First letter must start with i, e or g. */ switch (*p) @@ -334,8 +346,9 @@ riscv_subset_list::parse_std_ext (const char *p) p = parsing_subset_version (p, &major_version, &minor_version, /* default_major_version= */ 2, /* default_minor_version= */ 0, - /* std_ext_p= */ true); - add ("i", major_version, minor_version); + /* std_ext_p= */ true, + &explicit_version_p); + add ("i", major_version, minor_version, explicit_version_p); break; case 'e': @@ -343,9 +356,10 @@ riscv_subset_list::parse_std_ext (const char *p) p = parsing_subset_version (p, &major_version, &minor_version, /* default_major_version= */ 1, /* default_minor_version= */ 9, - /* std_ext_p= */ true); + /* std_ext_p= */ true, + &explicit_version_p); - add ("e", major_version, minor_version); + add ("e", major_version, minor_version, explicit_version_p); if (m_xlen > 32) { @@ -360,13 +374,14 @@ riscv_subset_list::parse_std_ext (const char *p) p = parsing_subset_version (p, &major_version, &minor_version, /* default_major_version= */ 2, /* default_minor_version= */ 0, - /* std_ext_p= */ true); - add ("i", major_version, minor_version); + /* std_ext_p= */ true, + &explicit_version_p); + add ("i", major_version, minor_version, explicit_version_p); for (; *std_exts != 'q'; std_exts++) { const char subset[] = {*std_exts, '\0'}; - add (subset, major_version, minor_version); + add (subset, major_version, minor_version, explicit_version_p); } break; @@ -413,24 +428,28 @@ riscv_subset_list::parse_std_ext (const char *p) p = parsing_subset_version (p, &major_version, &minor_version, /* default_major_version= */ 2, /* default_minor_version= */ 0, - /* std_ext_p= */ true); + /* std_ext_p= */ true, + &explicit_version_p); subset[0] = std_ext; - handle_implied_ext (subset, major_version, minor_version); + handle_implied_ext (subset, major_version, + minor_version, explicit_version_p); - add (subset, major_version, minor_version); + add (subset, major_version, minor_version, explicit_version_p); } return p; } /* Check any implied extensions for EXT with version - MAJOR_VERSION.MINOR_VERSION. */ + MAJOR_VERSION.MINOR_VERSION, EXPLICIT_VERSION_P indicate the version is + explicitly given by user or not. */ void riscv_subset_list::handle_implied_ext (const char *ext, int major_version, - int minor_version) + int minor_version, + bool explicit_version_p) { riscv_implied_info_t *implied_info; for (implied_info = &riscv_implied_info[0]; @@ -445,7 +464,8 @@ riscv_subset_list::handle_implied_ext (const char *ext, continue; /* TODO: Implied extension might use different version. */ - add (implied_info->implied_ext, major_version, minor_version); + add (implied_info->implied_ext, major_version, minor_version, + explicit_version_p); } } @@ -482,6 +502,7 @@ riscv_subset_list::parse_multiletter_ext (const char *p, char *subset = xstrdup (p); char *q = subset; const char *end_of_version; + bool explicit_version_p = false; while (*++q != '\0' && *q != '_' && !ISDIGIT (*q)) ; @@ -490,11 +511,12 @@ riscv_subset_list::parse_multiletter_ext (const char *p, = parsing_subset_version (q, &major_version, &minor_version, /* default_major_version= */ 2, /* default_minor_version= */ 0, - /* std_ext_p= */ FALSE); + /* std_ext_p= */ FALSE, + &explicit_version_p); *q = '\0'; - add (subset, major_version, minor_version); + add (subset, major_version, minor_version, explicit_version_p); free (subset); p += end_of_version - subset; diff --git a/gcc/testsuite/gcc.target/riscv/attribute-13.c b/gcc/testsuite/gcc.target/riscv/attribute-13.c new file mode 100644 index 000000000000..1e8600132935 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/attribute-13.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-O -mriscv-attribute -march=rv32if3d -mabi=ilp32" } */ +int foo() +{ +} +/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_f3p0_d2p0\"" } } */