From patchwork Mon Aug 1 10:07:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xi Ruoyao X-Patchwork-Id: 331 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:6a10:b5d6:b0:2b9:3548:2db5 with SMTP id v22csp2234513pxt; Mon, 1 Aug 2022 03:08:44 -0700 (PDT) X-Google-Smtp-Source: AGRyM1v+/f/xFtCibkvQLQeLYg0p8qB22H2nmmsdqcYrNal6LCNuxS+CimJfNow97XKS7eSfKPwM X-Received: by 2002:a17:906:2bc7:b0:72f:dc70:a3c6 with SMTP id n7-20020a1709062bc700b0072fdc70a3c6mr12068102ejg.645.1659348523918; Mon, 01 Aug 2022 03:08:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659348523; cv=none; d=google.com; s=arc-20160816; b=hJrx//pau2RhAMxTwDrCy9QGXmf7f4/QovLfxJISaMhQ5686vBE8KRd6BbpoqMS9UF 7qijwnE2/FScJpYv0Q60VDYlivAeRZqSEa7kpRae0TsbPE4hQOt7KkGYVDuwVORhVUez qO+aymrazBW2A0z0TNXNLvvdpmIfeLjYB25jOr/lB9U5Qcaw98Ud4gcYlLKgUfNLAbbG RTmyt4I8qQm9gkXOwZNXLIJXRM4CsZYCQYO4zxbxWRT1vp6gR3uarU/jZiDwo5SmX0K5 dcW6zmUnQOGCZKW+VIhjO8TYhzgk2lPWt0aPdbJ46DWKo0YUOJIWaByAT/XcyaxYi4V2 qbEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:reply-to:from:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence :mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:to:subject:message-id:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=wyMuPQyEk9xq3vtdUmLIPS/XJa1LPCL7iciW1aTtkAg=; b=urq17mQhIrRAoK+FTC5oe2IZZkt9hfkMomG8w8Rl9ORgLKDTLc1V5z0YXSyIPksCCE uXk333aa1rMQ93O9tOiBNL+vGtdrZnXZVV5ox+3GQIvrusG8EImHPX5ofzIHxJyk2UyW Tn/PDUFqfpjPwejLMUUjt1VHV7+t+9jfCe80JmnUyhRXrCCJilan8XxJX1D6qvvDlgZ2 8meeZ8TpUSoOWO4I7QVphZllyPXIJ3H+WqeE6nLlaEb3vzr1ZyTdhh+9AV6zdoQTGF3D /1yRHs5yF951Ga7/J8P/z11YGv7h8fqe+iNizIk1yIjZwUTAns9jsMIdJFDmj3OG8PpH r39A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=a5RmjiOP; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id dn7-20020a17090794c700b0072b54b9b990si10049533ejc.31.2022.08.01.03.08.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Aug 2022 03:08:43 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=a5RmjiOP; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8018E3858C55 for ; Mon, 1 Aug 2022 10:08:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8018E3858C55 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1659348522; bh=wyMuPQyEk9xq3vtdUmLIPS/XJa1LPCL7iciW1aTtkAg=; h=Subject:To:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=a5RmjiOPnqFWpddG3REkXHe0pyW3TXmA4qGt6Lranp4fFNAaXQ6Hey8rRir/9vuvi EXPRta5N936fOkloZdWoHAn8TegtI1U1IZ4iYqk0+60ZhgqnO3TPGuRNGZo4dQlwrQ 7Onnk9VHei06UJN+1mH24+eTWnf3CtrVmA/6rqDE= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from xry111.site (xry111.site [IPv6:2001:470:683e::1]) by sourceware.org (Postfix) with ESMTPS id 381563858D39 for ; Mon, 1 Aug 2022 10:07:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 381563858D39 Received: from localhost.localdomain (xry111.site [IPv6:2001:470:683e::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature ECDSA (P-384)) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id 2F1906678A; Mon, 1 Aug 2022 06:07:53 -0400 (EDT) Message-ID: Subject: [PATCH v5] LoongArch: add movable attribute To: Chenghua Xu , gcc-patches@gcc.gnu.org, Lulu Cheng Date: Mon, 01 Aug 2022 18:07:52 +0800 In-Reply-To: References: <9b6b0e68cfb7e87ae961ef8a7bb7987f534da19c.camel@xry111.site> User-Agent: Evolution 3.44.3 MIME-Version: 1.0 X-Spam-Status: No, score=-6.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FROM_SUSPICIOUS_NTLD, GIT_PATCH_0, KAM_SHORT, KAM_STOCKGEN, LIKELY_SPAM_FROM, PDS_OTHER_BAD_TLD, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: , X-Patchwork-Original-From: Xi Ruoyao via Gcc-patches From: Xi Ruoyao Reply-To: Xi Ruoyao Cc: Youling Tang , Huacai Chen , Jinyang He , Wang Xuerui Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1739952851568647760?= X-GMAIL-MSGID: =?utf-8?q?1739953037466312420?= Changes v4 -> v5: Fix changelog. No code change. Changes v3 -> v4: * Use "movable" as the attribute name as Huacai says it's already used in downstream GCC fork. * Remove an inaccurate line from the doc. (Initially I tried to implement a "model(...)" like IA64 or M32R. Then I changed my mind but forgot to remove the line copied from M32R doc.) -- >8 -- A linker script and/or a section attribute may locate a local object in some way unexpected by the code model, leading to a link failure. This happens when the Linux kernel loads a module with "local" per-CPU variables. Add an attribute to explicitly mark an variable with the address unlimited by the code model so we would be able to work around such problems. gcc/ChangeLog: * config/loongarch/loongarch.cc (loongarch_attribute_table): New attribute table. (TARGET_ATTRIBUTE_TABLE): Define the target hook. (loongarch_handle_addr_global_attribute): New static function. (loongarch_classify_symbol): Return SYMBOL_GOT_DISP for SYMBOL_REF_DECL with addr_global attribute. (loongarch_use_anchors_for_symbol_p): New static function. (TARGET_USE_ANCHORS_FOR_SYMBOL_P): Define the target hook. * doc/extend.texi (Variable Attributes): Document new LoongArch specific attribute. gcc/testsuite/ChangeLog: * gcc.target/loongarch/addr-global.c: New test. --- gcc/config/loongarch/loongarch.cc | 63 +++++++++++++++++++ gcc/doc/extend.texi | 16 +++++ .../gcc.target/loongarch/attr-movable.c | 29 +++++++++ 3 files changed, 108 insertions(+) create mode 100644 gcc/testsuite/gcc.target/loongarch/attr-movable.c diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 79687340dfd..6b6026700a6 100644 --- a/gcc/config/loongarch/loongarch.cc +++ b/gcc/config/loongarch/loongarch.cc @@ -1643,6 +1643,15 @@ loongarch_classify_symbol (const_rtx x) && !loongarch_symbol_binds_local_p (x)) return SYMBOL_GOT_DISP; + if (SYMBOL_REF_P (x)) + { + tree decl = SYMBOL_REF_DECL (x); + /* A movable symbol may be moved away from the +/- 2GiB range around + the PC, so we have to use GOT. */ + if (decl && lookup_attribute ("movable", DECL_ATTRIBUTES (decl))) + return SYMBOL_GOT_DISP; + } + return SYMBOL_PCREL; } @@ -6068,6 +6077,54 @@ loongarch_starting_frame_offset (void) return crtl->outgoing_args_size; } +static tree +loongarch_handle_movable_attribute (tree *node, tree name, tree, int, + bool *no_add_attrs) +{ + tree decl = *node; + if (TREE_CODE (decl) == VAR_DECL) + { + if (DECL_CONTEXT (decl) + && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL + && !TREE_STATIC (decl)) + { + error_at (DECL_SOURCE_LOCATION (decl), + "%qE attribute cannot be specified for local " + "variables", name); + *no_add_attrs = true; + } + } + else + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + return NULL_TREE; +} + +static const struct attribute_spec loongarch_attribute_table[] = +{ + /* { name, min_len, max_len, decl_req, type_req, fn_type_req, + affects_type_identity, handler, exclude } */ + { "movable", 0, 0, true, false, false, false, + loongarch_handle_movable_attribute, NULL }, + /* The last attribute spec is set to be NULL. */ + {} +}; + +bool +loongarch_use_anchors_for_symbol_p (const_rtx symbol) +{ + tree decl = SYMBOL_REF_DECL (symbol); + + /* A movable attribute indicates the linker may move the symbol away, + so the use of anchor may cause relocation overflow. */ + if (decl && lookup_attribute ("movable", DECL_ATTRIBUTES (decl))) + return false; + + return default_use_anchors_for_symbol_p (symbol); +} + /* Initialize the GCC target structure. */ #undef TARGET_ASM_ALIGNED_HI_OP #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" @@ -6256,6 +6313,12 @@ loongarch_starting_frame_offset (void) #undef TARGET_HAVE_SPECULATION_SAFE_VALUE #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed +#undef TARGET_ATTRIBUTE_TABLE +#define TARGET_ATTRIBUTE_TABLE loongarch_attribute_table + +#undef TARGET_USE_ANCHORS_FOR_SYMBOL_P +#define TARGET_USE_ANCHORS_FOR_SYMBOL_P loongarch_use_anchors_for_symbol_p + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-loongarch.h" diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 7fe7f8817cd..322d8c05a04 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -7314,6 +7314,7 @@ attributes. * Blackfin Variable Attributes:: * H8/300 Variable Attributes:: * IA-64 Variable Attributes:: +* LoongArch Variable Attributes:: * M32R/D Variable Attributes:: * MeP Variable Attributes:: * Microsoft Windows Variable Attributes:: @@ -8098,6 +8099,21 @@ defined by shared libraries. @end table +@node LoongArch Variable Attributes +@subsection LoongArch Variable Attributes + +One attribute is currently defined for the LoongArch. + +@table @code +@item movable +@cindex @code{movable} variable attribute, LoongArch +Use this attribute on the LoongArch to mark an object possible to be moved +by the linker, so its address is unlimited by the local data section range +specified by the code model even if the object is defined locally. This +attribute is mostly useful if a @code{section} attribute and/or a linker +script will move the object somewhere unexpected by the code model. +@end table + @node M32R/D Variable Attributes @subsection M32R/D Variable Attributes diff --git a/gcc/testsuite/gcc.target/loongarch/attr-movable.c b/gcc/testsuite/gcc.target/loongarch/attr-movable.c new file mode 100644 index 00000000000..85b1dd4c59a --- /dev/null +++ b/gcc/testsuite/gcc.target/loongarch/attr-movable.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-mexplicit-relocs -mcmodel=normal -O2" } */ +/* { dg-final { scan-assembler-not "%pc" } } */ +/* { dg-final { scan-assembler-times "%got_pc_hi20" 3 } } */ + +/* movable attribute should mark x and y possibly outside of the local + data range defined by the code model, so GOT should be used instead of + PC-relative. */ + +int x __attribute__((movable)); +int y __attribute__((movable)); + +int +test(void) +{ + return x + y; +} + +/* The following will be used for kernel per-cpu storage implemention. */ + +register char *per_cpu_base __asm__("r21"); +static int counter __attribute__((section(".data..percpu"), movable)); + +void +inc_counter(void) +{ + int *ptr = (int *)(per_cpu_base + (long)&counter); + (*ptr)++; +}