public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH v2] LoongArch: add -mdirect-extern-access option
@ 2022-09-04 13:18 Xi Ruoyao
  2022-09-05  2:20 ` Lulu Cheng
  0 siblings, 1 reply; 2+ messages in thread
From: Xi Ruoyao @ 2022-09-04 13:18 UTC (permalink / raw)
  To: gcc-patches; +Cc: Lulu Cheng, Wang Xuerui, Chenghua Xu, Huacai Chen, Xi Ruoyao

v1 -> v2:

Move TARGET_DIRECT_EXTERN_ACCESS check from loongarch_classify_symbol to
loongarch_symbol_binds_local_p, so "%plt" is not output if
-mdirect-extern-access used.

-- >8 --

As a new target, LoongArch does not use copy relocation as it's
problematic in some circumstances.  One bad consequence is we are
emitting GOT for all accesses to all extern objects with default
visibility.  The use of GOT is not needed in statically linked
executables, OS kernels etc.  The GOT entry just wastes space, and the
GOT access just slow down the execution in those environments.

Before -mexplicit-relocs, we used "-Wa,-mla-global-with-pcrel" to tell
the assembler not to use GOT for extern access.  But with
-mexplicit-relocs, we have to opt the logic in GCC.

The name "-mdirect-extern-access" is learnt from x86 port.

gcc/ChangeLog:

	* config/loongarch/genopts/loongarch.opt.in: Add
	-mdirect-extern-access option.
	* config/loongarch/loongarch.opt: Regenerate.
	* config/loongarch/loongarch.cc
	(loongarch_symbol_binds_local_p): Return true if
	TARGET_DIRECT_EXTERN_ACCESS.
	(loongarch_option_override_internal): Complain if
	-mdirect-extern-access is used with -fPIC or -fpic.
	* doc/invoke.texi: Document -mdirect-extern-access for
	LoongArch.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/direct-extern-1.c: New test.
	* gcc.target/loongarch/direct-extern-2.c: New test.
---
 gcc/config/loongarch/genopts/loongarch.opt.in     |  4 ++++
 gcc/config/loongarch/loongarch.cc                 |  6 ++++++
 gcc/config/loongarch/loongarch.opt                |  4 ++++
 gcc/doc/invoke.texi                               | 15 +++++++++++++++
 .../gcc.target/loongarch/direct-extern-1.c        |  6 ++++++
 .../gcc.target/loongarch/direct-extern-2.c        |  6 ++++++
 6 files changed, 41 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/loongarch/direct-extern-1.c
 create mode 100644 gcc/testsuite/gcc.target/loongarch/direct-extern-2.c

diff --git a/gcc/config/loongarch/genopts/loongarch.opt.in b/gcc/config/loongarch/genopts/loongarch.opt.in
index ebdd9538d48..e10618777b2 100644
--- a/gcc/config/loongarch/genopts/loongarch.opt.in
+++ b/gcc/config/loongarch/genopts/loongarch.opt.in
@@ -184,3 +184,7 @@ Enum(cmodel) String(@@STR_CMODEL_EXTREME@@) Value(CMODEL_EXTREME)
 mcmodel=
 Target RejectNegative Joined Enum(cmodel) Var(la_opt_cmodel) Init(CMODEL_NORMAL)
 Specify the code model.
+
+mdirect-extern-access
+Target Var(TARGET_DIRECT_EXTERN_ACCESS) Init(0)
+Avoid using the GOT to access external symbols.
diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc
index 77e3a105390..c9187bf81a7 100644
--- a/gcc/config/loongarch/loongarch.cc
+++ b/gcc/config/loongarch/loongarch.cc
@@ -1610,6 +1610,9 @@ loongarch_weak_symbol_p (const_rtx x)
 bool
 loongarch_symbol_binds_local_p (const_rtx x)
 {
+  if (TARGET_DIRECT_EXTERN_ACCESS)
+    return true;
+
   if (SYMBOL_REF_P (x))
     return (SYMBOL_REF_DECL (x)
 	    ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
@@ -6093,6 +6096,9 @@ loongarch_option_override_internal (struct gcc_options *opts)
   if (loongarch_branch_cost == 0)
     loongarch_branch_cost = loongarch_cost->branch_cost;
 
+  if (TARGET_DIRECT_EXTERN_ACCESS && flag_shlib)
+    error ("%qs cannot be used for compiling a shared library",
+	   "-mdirect-extern-access");
 
   switch (la_target.cmodel)
     {
diff --git a/gcc/config/loongarch/loongarch.opt b/gcc/config/loongarch/loongarch.opt
index 6395234218b..96c811c850b 100644
--- a/gcc/config/loongarch/loongarch.opt
+++ b/gcc/config/loongarch/loongarch.opt
@@ -191,3 +191,7 @@ Enum(cmodel) String(extreme) Value(CMODEL_EXTREME)
 mcmodel=
 Target RejectNegative Joined Enum(cmodel) Var(la_opt_cmodel) Init(CMODEL_NORMAL)
 Specify the code model.
+
+mdirect-extern-access
+Target Var(TARGET_DIRECT_EXTERN_ACCESS) Init(0)
+Avoid using the GOT to access external symbols.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index dd3302fcd15..9d662e35316 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1017,6 +1017,7 @@ Objective-C and Objective-C++ Dialects}.
 -memcpy  -mno-memcpy -mstrict-align -mno-strict-align @gol
 -mmax-inline-memcpy-size=@var{n} @gol
 -mexplicit-relocs -mno-explicit-relocs @gol
+-mdirect-extern-access -mno-direct-extern-access @gol
 -mcmodel=@var{code-model}}
 
 @emph{M32R/D Options}
@@ -25090,6 +25091,20 @@ GCC build-time by detecting corresponding assembler support:
 @code{-mno-explicit-relocs} otherwise.  This option is mostly useful for
 debugging, or interoperation with assemblers different from the build-time
 one.
+
+@item -mdirect-extern-access
+@itemx -mno-direct-extern-access
+@opindex mdirect-extern-access
+Do not use or use GOT to access external symbols.  The default is
+@option{-mno-direct-extern-access}: GOT is used for external symbols with
+default visibility, but not used for other external symbols.
+
+With @option{-mdirect-extern-access}, GOT is not used and all external
+symbols are PC-relatively addressed.  It is @strong{only} suitable for
+environments where no dynamic link is performed, like firmwares, OS
+kernels, executables linked with @option{-static} or @option{-static-pie}.
+@option{-mdirect-extern-access} is not compatible with @option{-fPIC} or
+@option{-fpic}.
 @end table
 
 @node M32C Options
diff --git a/gcc/testsuite/gcc.target/loongarch/direct-extern-1.c b/gcc/testsuite/gcc.target/loongarch/direct-extern-1.c
new file mode 100644
index 00000000000..85c6c1e8a88
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/direct-extern-1.c
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options "-mexplicit-relocs -mdirect-extern-access" } */
+/* { dg-final { scan-assembler-not "got" } } */
+
+extern int x;
+int f() { return x; }
diff --git a/gcc/testsuite/gcc.target/loongarch/direct-extern-2.c b/gcc/testsuite/gcc.target/loongarch/direct-extern-2.c
new file mode 100644
index 00000000000..58d8bd68a06
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/direct-extern-2.c
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options "-mno-explicit-relocs -mdirect-extern-access" } */
+/* { dg-final { scan-assembler-not "la.global" } } */
+
+extern int x;
+int f() { return x; }
-- 
2.37.3


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] LoongArch: add -mdirect-extern-access option
  2022-09-04 13:18 [PATCH v2] LoongArch: add -mdirect-extern-access option Xi Ruoyao
@ 2022-09-05  2:20 ` Lulu Cheng
  0 siblings, 0 replies; 2+ messages in thread
From: Lulu Cheng @ 2022-09-05  2:20 UTC (permalink / raw)
  To: Xi Ruoyao, gcc-patches; +Cc: Wang Xuerui, Chenghua Xu, Huacai Chen

LGTM!

Thanks!


在 2022/9/4 下午9:18, Xi Ruoyao 写道:
> v1 -> v2:
>
> Move TARGET_DIRECT_EXTERN_ACCESS check from loongarch_classify_symbol to
> loongarch_symbol_binds_local_p, so "%plt" is not output if
> -mdirect-extern-access used.
>
> -- >8 --
>
> As a new target, LoongArch does not use copy relocation as it's
> problematic in some circumstances.  One bad consequence is we are
> emitting GOT for all accesses to all extern objects with default
> visibility.  The use of GOT is not needed in statically linked
> executables, OS kernels etc.  The GOT entry just wastes space, and the
> GOT access just slow down the execution in those environments.
>
> Before -mexplicit-relocs, we used "-Wa,-mla-global-with-pcrel" to tell
> the assembler not to use GOT for extern access.  But with
> -mexplicit-relocs, we have to opt the logic in GCC.
>
> The name "-mdirect-extern-access" is learnt from x86 port.
>
> gcc/ChangeLog:
>
> 	* config/loongarch/genopts/loongarch.opt.in: Add
> 	-mdirect-extern-access option.
> 	* config/loongarch/loongarch.opt: Regenerate.
> 	* config/loongarch/loongarch.cc
> 	(loongarch_symbol_binds_local_p): Return true if
> 	TARGET_DIRECT_EXTERN_ACCESS.
> 	(loongarch_option_override_internal): Complain if
> 	-mdirect-extern-access is used with -fPIC or -fpic.
> 	* doc/invoke.texi: Document -mdirect-extern-access for
> 	LoongArch.
>
> gcc/testsuite/ChangeLog:
>
> 	* gcc.target/loongarch/direct-extern-1.c: New test.
> 	* gcc.target/loongarch/direct-extern-2.c: New test.
> ---
>   gcc/config/loongarch/genopts/loongarch.opt.in     |  4 ++++
>   gcc/config/loongarch/loongarch.cc                 |  6 ++++++
>   gcc/config/loongarch/loongarch.opt                |  4 ++++
>   gcc/doc/invoke.texi                               | 15 +++++++++++++++
>   .../gcc.target/loongarch/direct-extern-1.c        |  6 ++++++
>   .../gcc.target/loongarch/direct-extern-2.c        |  6 ++++++
>   6 files changed, 41 insertions(+)
>   create mode 100644 gcc/testsuite/gcc.target/loongarch/direct-extern-1.c
>   create mode 100644 gcc/testsuite/gcc.target/loongarch/direct-extern-2.c
>
> diff --git a/gcc/config/loongarch/genopts/loongarch.opt.in b/gcc/config/loongarch/genopts/loongarch.opt.in
> index ebdd9538d48..e10618777b2 100644
> --- a/gcc/config/loongarch/genopts/loongarch.opt.in
> +++ b/gcc/config/loongarch/genopts/loongarch.opt.in
> @@ -184,3 +184,7 @@ Enum(cmodel) String(@@STR_CMODEL_EXTREME@@) Value(CMODEL_EXTREME)
>   mcmodel=
>   Target RejectNegative Joined Enum(cmodel) Var(la_opt_cmodel) Init(CMODEL_NORMAL)
>   Specify the code model.
> +
> +mdirect-extern-access
> +Target Var(TARGET_DIRECT_EXTERN_ACCESS) Init(0)
> +Avoid using the GOT to access external symbols.
> diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc
> index 77e3a105390..c9187bf81a7 100644
> --- a/gcc/config/loongarch/loongarch.cc
> +++ b/gcc/config/loongarch/loongarch.cc
> @@ -1610,6 +1610,9 @@ loongarch_weak_symbol_p (const_rtx x)
>   bool
>   loongarch_symbol_binds_local_p (const_rtx x)
>   {
> +  if (TARGET_DIRECT_EXTERN_ACCESS)
> +    return true;
> +
>     if (SYMBOL_REF_P (x))
>       return (SYMBOL_REF_DECL (x)
>   	    ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
> @@ -6093,6 +6096,9 @@ loongarch_option_override_internal (struct gcc_options *opts)
>     if (loongarch_branch_cost == 0)
>       loongarch_branch_cost = loongarch_cost->branch_cost;
>   
> +  if (TARGET_DIRECT_EXTERN_ACCESS && flag_shlib)
> +    error ("%qs cannot be used for compiling a shared library",
> +	   "-mdirect-extern-access");
>   
>     switch (la_target.cmodel)
>       {
> diff --git a/gcc/config/loongarch/loongarch.opt b/gcc/config/loongarch/loongarch.opt
> index 6395234218b..96c811c850b 100644
> --- a/gcc/config/loongarch/loongarch.opt
> +++ b/gcc/config/loongarch/loongarch.opt
> @@ -191,3 +191,7 @@ Enum(cmodel) String(extreme) Value(CMODEL_EXTREME)
>   mcmodel=
>   Target RejectNegative Joined Enum(cmodel) Var(la_opt_cmodel) Init(CMODEL_NORMAL)
>   Specify the code model.
> +
> +mdirect-extern-access
> +Target Var(TARGET_DIRECT_EXTERN_ACCESS) Init(0)
> +Avoid using the GOT to access external symbols.
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index dd3302fcd15..9d662e35316 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -1017,6 +1017,7 @@ Objective-C and Objective-C++ Dialects}.
>   -memcpy  -mno-memcpy -mstrict-align -mno-strict-align @gol
>   -mmax-inline-memcpy-size=@var{n} @gol
>   -mexplicit-relocs -mno-explicit-relocs @gol
> +-mdirect-extern-access -mno-direct-extern-access @gol
>   -mcmodel=@var{code-model}}
>   
>   @emph{M32R/D Options}
> @@ -25090,6 +25091,20 @@ GCC build-time by detecting corresponding assembler support:
>   @code{-mno-explicit-relocs} otherwise.  This option is mostly useful for
>   debugging, or interoperation with assemblers different from the build-time
>   one.
> +
> +@item -mdirect-extern-access
> +@itemx -mno-direct-extern-access
> +@opindex mdirect-extern-access
> +Do not use or use GOT to access external symbols.  The default is
> +@option{-mno-direct-extern-access}: GOT is used for external symbols with
> +default visibility, but not used for other external symbols.
> +
> +With @option{-mdirect-extern-access}, GOT is not used and all external
> +symbols are PC-relatively addressed.  It is @strong{only} suitable for
> +environments where no dynamic link is performed, like firmwares, OS
> +kernels, executables linked with @option{-static} or @option{-static-pie}.
> +@option{-mdirect-extern-access} is not compatible with @option{-fPIC} or
> +@option{-fpic}.
>   @end table
>   
>   @node M32C Options
> diff --git a/gcc/testsuite/gcc.target/loongarch/direct-extern-1.c b/gcc/testsuite/gcc.target/loongarch/direct-extern-1.c
> new file mode 100644
> index 00000000000..85c6c1e8a88
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/loongarch/direct-extern-1.c
> @@ -0,0 +1,6 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mexplicit-relocs -mdirect-extern-access" } */
> +/* { dg-final { scan-assembler-not "got" } } */
> +
> +extern int x;
> +int f() { return x; }
> diff --git a/gcc/testsuite/gcc.target/loongarch/direct-extern-2.c b/gcc/testsuite/gcc.target/loongarch/direct-extern-2.c
> new file mode 100644
> index 00000000000..58d8bd68a06
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/loongarch/direct-extern-2.c
> @@ -0,0 +1,6 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mno-explicit-relocs -mdirect-extern-access" } */
> +/* { dg-final { scan-assembler-not "la.global" } } */
> +
> +extern int x;
> +int f() { return x; }


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-09-05  2:20 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-04 13:18 [PATCH v2] LoongArch: add -mdirect-extern-access option Xi Ruoyao
2022-09-05  2:20 ` Lulu Cheng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).