public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] LoongArch: add -mdirect-extern-access option
@ 2022-09-01 10:54 Xi Ruoyao
  2022-09-02  3:12 ` Huacai Chen
  2022-09-02 11:30 ` Xi Ruoyao
  0 siblings, 2 replies; 12+ messages in thread
From: Xi Ruoyao @ 2022-09-01 10:54 UTC (permalink / raw)
  To: gcc-patches; +Cc: Lulu Cheng, Wang Xuerui, Chenghua Xu, Huacai Chen, Xi Ruoyao

We'd like to introduce a new codegen option to align with the old
"-Wa,-mla-global-with-pcrel" and avoid a performance & size regression
building the Linux kernel with new-reloc toolchain.  And it should be
also useful for building statically linked executables, firmwares (EDK2
for example), and other OS kernels.

OK for trunk?

-- >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_classify_symbol):
	Don't use SYMBOL_GOT_DISP 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                 |  5 ++++-
 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, 39 insertions(+), 1 deletion(-)
 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..2875fa5b0f3 100644
--- a/gcc/config/loongarch/loongarch.cc
+++ b/gcc/config/loongarch/loongarch.cc
@@ -1642,7 +1642,7 @@ loongarch_classify_symbol (const_rtx x)
   if (SYMBOL_REF_TLS_MODEL (x))
     return SYMBOL_TLS;
 
-  if (!loongarch_symbol_binds_local_p (x))
+  if (!TARGET_DIRECT_EXTERN_ACCESS && !loongarch_symbol_binds_local_p (x))
     return SYMBOL_GOT_DISP;
 
   tree t = SYMBOL_REF_DECL (x);
@@ -6093,6 +6093,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 e5eb525a2c1..d4e86682827 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1016,6 +1016,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}
@@ -25100,6 +25101,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] 12+ messages in thread

* Re: [PATCH] LoongArch: add -mdirect-extern-access option
  2022-09-01 10:54 [PATCH] LoongArch: add -mdirect-extern-access option Xi Ruoyao
@ 2022-09-02  3:12 ` Huacai Chen
  2022-09-02  3:31   ` Xi Ruoyao
  2022-09-02 11:30 ` Xi Ruoyao
  1 sibling, 1 reply; 12+ messages in thread
From: Huacai Chen @ 2022-09-02  3:12 UTC (permalink / raw)
  To: Xi Ruoyao; +Cc: gcc-patches, Lulu Cheng, Wang Xuerui, Chenghua Xu

Hi, Ruoyao,

On Thu, Sep 1, 2022 at 6:56 PM Xi Ruoyao <xry111@xry111.site> wrote:
>
> We'd like to introduce a new codegen option to align with the old
> "-Wa,-mla-global-with-pcrel" and avoid a performance & size regression
> building the Linux kernel with new-reloc toolchain.  And it should be
> also useful for building statically linked executables, firmwares (EDK2
> for example), and other OS kernels.
>
> OK for trunk?
This seems drop your (1)(2)(3) approach and do a similar thing as "a
new code model" discussed in another thread?

Huacai
>
> -- >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_classify_symbol):
>         Don't use SYMBOL_GOT_DISP 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                 |  5 ++++-
>  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, 39 insertions(+), 1 deletion(-)
>  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..2875fa5b0f3 100644
> --- a/gcc/config/loongarch/loongarch.cc
> +++ b/gcc/config/loongarch/loongarch.cc
> @@ -1642,7 +1642,7 @@ loongarch_classify_symbol (const_rtx x)
>    if (SYMBOL_REF_TLS_MODEL (x))
>      return SYMBOL_TLS;
>
> -  if (!loongarch_symbol_binds_local_p (x))
> +  if (!TARGET_DIRECT_EXTERN_ACCESS && !loongarch_symbol_binds_local_p (x))
>      return SYMBOL_GOT_DISP;
>
>    tree t = SYMBOL_REF_DECL (x);
> @@ -6093,6 +6093,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 e5eb525a2c1..d4e86682827 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -1016,6 +1016,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}
> @@ -25100,6 +25101,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] 12+ messages in thread

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

On Fri, 2022-09-02 at 11:12 +0800, Huacai Chen wrote:
> On Thu, Sep 1, 2022 at 6:56 PM Xi Ruoyao <xry111@xry111.site> wrote:
> > 
> > We'd like to introduce a new codegen option to align with the old
> > "-Wa,-mla-global-with-pcrel" and avoid a performance & size
> > regression
> > building the Linux kernel with new-reloc toolchain.  And it should
> > be
> > also useful for building statically linked executables, firmwares
> > (EDK2
> > for example), and other OS kernels.
> > 
> > OK for trunk?
> This seems drop your (1)(2)(3) approach and do a similar thing as "a
> new code model" discussed in another thread?

Step (1) is rejected because they've found some issue with copy
relocation impossible to be solved (there is a plan to drop copy
relocation from other architectures as well).  This is a modification of
(2): we add -mdirect-extern-access, but without copy relocation it can
only be used by kernel, static executable, etc. so it's not the default.

In kernel we just use KBUILD_CFLAGS_KERNEL += -mdirect-extern-access. 
For modules we use GOT until we can get rid of XKPRANGE.

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

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

* Re: [PATCH] LoongArch: add -mdirect-extern-access option
  2022-09-01 10:54 [PATCH] LoongArch: add -mdirect-extern-access option Xi Ruoyao
  2022-09-02  3:12 ` Huacai Chen
@ 2022-09-02 11:30 ` Xi Ruoyao
  2022-09-04  0:52   ` Fangrui Song
  2022-09-04  2:26   ` Lulu Cheng
  1 sibling, 2 replies; 12+ messages in thread
From: Xi Ruoyao @ 2022-09-02 11:30 UTC (permalink / raw)
  To: gcc-patches; +Cc: Lulu Cheng, Wang Xuerui, Chenghua Xu, Huacai Chen

On Thu, 2022-09-01 at 18:54 +0800, Xi Ruoyao wrote:
> We'd like to introduce a new codegen option to align with the old
> "-Wa,-mla-global-with-pcrel" and avoid a performance & size regression
> building the Linux kernel with new-reloc toolchain.  And it should be
> also useful for building statically linked executables, firmwares (EDK2
> for example), and other OS kernels.

Some news: get rid of the GOT will also make the implementation of
relocatable kernel easier, so I hope this can be reviewed quickly.

> OK for trunk?
> 
> -- >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_classify_symbol):
>         Don't use SYMBOL_GOT_DISP 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                 |  5 ++++-
>  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, 39 insertions(+), 1 deletion(-)
>  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..2875fa5b0f3 100644
> --- a/gcc/config/loongarch/loongarch.cc
> +++ b/gcc/config/loongarch/loongarch.cc
> @@ -1642,7 +1642,7 @@ loongarch_classify_symbol (const_rtx x)
>    if (SYMBOL_REF_TLS_MODEL (x))
>      return SYMBOL_TLS;
>  
> -  if (!loongarch_symbol_binds_local_p (x))
> +  if (!TARGET_DIRECT_EXTERN_ACCESS && !loongarch_symbol_binds_local_p
> (x))
>      return SYMBOL_GOT_DISP;
>  
>    tree t = SYMBOL_REF_DECL (x);
> @@ -6093,6 +6093,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 e5eb525a2c1..d4e86682827 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -1016,6 +1016,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}
> @@ -25100,6 +25101,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; }

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

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

* Re: [PATCH] LoongArch: add -mdirect-extern-access option
  2022-09-02 11:30 ` Xi Ruoyao
@ 2022-09-04  0:52   ` Fangrui Song
  2022-09-04  2:26   ` Lulu Cheng
  1 sibling, 0 replies; 12+ messages in thread
From: Fangrui Song @ 2022-09-04  0:52 UTC (permalink / raw)
  To: Xi Ruoyao; +Cc: gcc-patches, Chenghua Xu, Huacai Chen, Lulu Cheng, Wang Xuerui

On Fri, Sep 2, 2022 at 4:31 AM Xi Ruoyao via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> On Thu, 2022-09-01 at 18:54 +0800, Xi Ruoyao wrote:
> > We'd like to introduce a new codegen option to align with the old
> > "-Wa,-mla-global-with-pcrel" and avoid a performance & size regression
> > building the Linux kernel with new-reloc toolchain.  And it should be
> > also useful for building statically linked executables, firmwares (EDK2
> > for example), and other OS kernels.
>
> Some news: get rid of the GOT will also make the implementation of
> relocatable kernel easier, so I hope this can be reviewed quickly.
>
> > OK for trunk?
> >
> > -- >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.

I think a discussion about the exact option name is useful.

The GCC x86 port generates
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS for
-mno-direct-extern-access.

The Clang -fdirect-access-external-data (which is added before
-mdirect-extern-access) does not use
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.

If a new port avoids copy relocations in the first place,
GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS isn't really useful.

> > gcc/ChangeLog:
> >
> >         * config/loongarch/genopts/loongarch.opt.in: Add
> >         -mdirect-extern-access option.
> >         * config/loongarch/loongarch.opt: Regenerate.
> >         * config/loongarch/loongarch.cc (loongarch_classify_symbol):
> >         Don't use SYMBOL_GOT_DISP 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                 |  5 ++++-
> >  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, 39 insertions(+), 1 deletion(-)
> >  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..2875fa5b0f3 100644
> > --- a/gcc/config/loongarch/loongarch.cc
> > +++ b/gcc/config/loongarch/loongarch.cc
> > @@ -1642,7 +1642,7 @@ loongarch_classify_symbol (const_rtx x)
> >    if (SYMBOL_REF_TLS_MODEL (x))
> >      return SYMBOL_TLS;
> >
> > -  if (!loongarch_symbol_binds_local_p (x))
> > +  if (!TARGET_DIRECT_EXTERN_ACCESS && !loongarch_symbol_binds_local_p
> > (x))
> >      return SYMBOL_GOT_DISP;
> >
> >    tree t = SYMBOL_REF_DECL (x);
> > @@ -6093,6 +6093,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 e5eb525a2c1..d4e86682827 100644
> > --- a/gcc/doc/invoke.texi
> > +++ b/gcc/doc/invoke.texi
> > @@ -1016,6 +1016,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}
> > @@ -25100,6 +25101,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; }
>
> --
> Xi Ruoyao <xry111@xry111.site>
> School of Aerospace Science and Technology, Xidian University



-- 
宋方睿

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

* Re: [PATCH] LoongArch: add -mdirect-extern-access option
  2022-09-02 11:30 ` Xi Ruoyao
  2022-09-04  0:52   ` Fangrui Song
@ 2022-09-04  2:26   ` Lulu Cheng
  2022-09-04  2:51     ` Xi Ruoyao
  1 sibling, 1 reply; 12+ messages in thread
From: Lulu Cheng @ 2022-09-04  2:26 UTC (permalink / raw)
  To: Xi Ruoyao, gcc-patches; +Cc: Wang Xuerui, Chenghua Xu, Huacai Chen

[-- Attachment #1: Type: text/plain, Size: 8989 bytes --]

I think the following modification should be added:

git diff loongarch/predicates.md

+;; Do not use GOT to access external symbols, when define
+;; TARGET_DIRECT_EXTERN_ACCESS.
+
  (define_predicate "is_const_call_local_symbol"
    (and (match_operand 0 "const_call_insn_operand")
         (ior (match_test "loongarch_global_symbol_p (op) == 0")
-           (match_test "loongarch_symbol_binds_local_p (op) != 0"))
+           (match_test "loongarch_symbol_binds_local_p (op) != 0")
+           (match_test "loongarch_symbol_binds_local_p (op) == 0
+                        && TARGET_DIRECT_EXTERN_ACCESS"))
         (match_test "CONSTANT_P (op)")))

  (define_predicate "is_const_call_no_local_symbol"
    (and (match_operand 0 "const_call_insn_operand")
         (ior (match_test "loongarch_global_symbol_p (op) != 0")
             (match_test "loongarch_symbol_binds_local_p (op) == 0")
-       (match_test "loongarch_weak_symbol_p (op) != 0"))
+           (match_test "loongarch_weak_symbol_p (op) != 0")
+           (match_test "!TARGET_DIRECT_EXTERN_ACCESS"))
         (match_test "CONSTANT_P (op)")))


testsuites:

extern void test1(void);

void

test(void)
{
   test1();
}

$ gcc test.c -o - -O2 -mdirect-extern-access

If the above modifications are not added, the function call is:  bl 
%plt(test1) now is : bl test1 在 2022/9/2 下午7:30, Xi Ruoyao 写道:

> On Thu, 2022-09-01 at 18:54 +0800, Xi Ruoyao wrote:
>> We'd like to introduce a new codegen option to align with the old
>> "-Wa,-mla-global-with-pcrel" and avoid a performance & size regression
>> building the Linux kernel with new-reloc toolchain.  And it should be
>> also useful for building statically linked executables, firmwares (EDK2
>> for example), and other OS kernels.
> Some news: get rid of the GOT will also make the implementation of
> relocatable kernel easier, so I hope this can be reviewed quickly.
>
>> OK for trunk?
>>
>> -- >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_classify_symbol):
>>          Don't use SYMBOL_GOT_DISP 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                 |  5 ++++-
>>   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, 39 insertions(+), 1 deletion(-)
>>   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..2875fa5b0f3 100644
>> --- a/gcc/config/loongarch/loongarch.cc
>> +++ b/gcc/config/loongarch/loongarch.cc
>> @@ -1642,7 +1642,7 @@ loongarch_classify_symbol (const_rtx x)
>>     if (SYMBOL_REF_TLS_MODEL (x))
>>       return SYMBOL_TLS;
>>   
>> -  if (!loongarch_symbol_binds_local_p (x))
>> +  if (!TARGET_DIRECT_EXTERN_ACCESS && !loongarch_symbol_binds_local_p
>> (x))
>>       return SYMBOL_GOT_DISP;
>>   
>>     tree t = SYMBOL_REF_DECL (x);
>> @@ -6093,6 +6093,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 e5eb525a2c1..d4e86682827 100644
>> --- a/gcc/doc/invoke.texi
>> +++ b/gcc/doc/invoke.texi
>> @@ -1016,6 +1016,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}
>> @@ -25100,6 +25101,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] 12+ messages in thread

* Re: [PATCH] LoongArch: add -mdirect-extern-access option
  2022-09-04  2:26   ` Lulu Cheng
@ 2022-09-04  2:51     ` Xi Ruoyao
  2022-09-04  3:22       ` Lulu Cheng
  0 siblings, 1 reply; 12+ messages in thread
From: Xi Ruoyao @ 2022-09-04  2:51 UTC (permalink / raw)
  To: Lulu Cheng, gcc-patches, liuzhensong
  Cc: Wang Xuerui, Chenghua Xu, Huacai Chen

On Sun, 2022-09-04 at 10:26 +0800, Lulu Cheng wrote:
> If the above modifications are not added, the function call is:
> 
>  bl %plt(test1)
> 
> now is :
> 
>  bl test1

Regarding "%plt(...)", in the binutils code:

   /* For compatible old asm code.  */
   if (0 == strcmp (op_c_str, "plt"))
     btype = BFD_RELOC_LARCH_B26;

Link: https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gas/config/loongarch-parse.y;h=8704687706df50aa15aff05f97e4560d7ec6fa23;hb=refs/heads/master#l131

Zhensong: does "old asm code" here mean we should remove %plt from "new"
assembly code, i. e. stop to print %plt(...) in GCC completely?

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

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

* Re: [PATCH] LoongArch: add -mdirect-extern-access option
  2022-09-04  2:51     ` Xi Ruoyao
@ 2022-09-04  3:22       ` Lulu Cheng
  2022-09-04  6:35         ` Xi Ruoyao
  0 siblings, 1 reply; 12+ messages in thread
From: Lulu Cheng @ 2022-09-04  3:22 UTC (permalink / raw)
  To: Xi Ruoyao, gcc-patches, liuzhensong; +Cc: Wang Xuerui, Chenghua Xu, Huacai Chen

[-- Attachment #1: Type: text/plain, Size: 791 bytes --]


在 2022/9/4 上午10:51, Xi Ruoyao 写道:
> On Sun, 2022-09-04 at 10:26 +0800, Lulu Cheng wrote:
>> If the above modifications are not added, the function call is:
>>
>>   bl %plt(test1)
>>
>> now is :
>>
>>   bl test1
> Regarding "%plt(...)", in the binutils code:
>
>     /* For compatible old asm code.  */
>     if (0 == strcmp (op_c_str, "plt"))
>       btype = BFD_RELOC_LARCH_B26;
>
> Link: https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gas/config/loongarch-parse.y;h=8704687706df50aa15aff05f97e4560d7ec6fa23;hb=refs/heads/master#l131
>
> Zhensong: does "old asm code" here mean we should remove %plt from "new"
> assembly code, i. e. stop to print %plt(...) in GCC completely?
>

I think '%plt' also needs to be removed from the readability of the 
assembly code.:-\


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

* Re: [PATCH] LoongArch: add -mdirect-extern-access option
  2022-09-04  3:22       ` Lulu Cheng
@ 2022-09-04  6:35         ` Xi Ruoyao
  2022-09-04  7:00           ` Lulu Cheng
  0 siblings, 1 reply; 12+ messages in thread
From: Xi Ruoyao @ 2022-09-04  6:35 UTC (permalink / raw)
  To: Lulu Cheng, gcc-patches, liuzhensong
  Cc: Wang Xuerui, Chenghua Xu, Huacai Chen

On Sun, 2022-09-04 at 11:22 +0800, Lulu Cheng wrote:
> 
> 在 2022/9/4 上午10:51, Xi Ruoyao 写道:
>  
> > On Sun, 2022-09-04 at 10:26 +0800, Lulu Cheng wrote:
> >  
> > > If the above modifications are not added, the function call is:
> > > 
> > >  bl %plt(test1)
> > > 
> > > now is :
> > > 
> > >  bl test1
> > Regarding "%plt(...)", in the binutils code:
> > 
> >    /* For compatible old asm code.  */
> >    if (0 == strcmp (op_c_str, "plt"))
> >      btype = BFD_RELOC_LARCH_B26;
> > 
> > Link:
> > https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gas/config/loongarch-parse.y;h=8704687706df50aa15aff05f97e4560d7ec6fa23;hb=refs/heads/master#l131
> > 
> > Zhensong: does "old asm code" here mean we should remove %plt from
> > "new"
> > assembly code, i. e. stop to print %plt(...) in GCC completely?
> > 
>  
> I think '%plt' also needs to be removed from the readability of the
> assembly code.:-\

I understand, but maybe we should remove %plt unconditionally, with or
without -mdirect-extern-access.  Note that for -mcmodel=medium we don't
say something like "%pc_hi20(%plt(x))" either.
-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

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

* Re: [PATCH] LoongArch: add -mdirect-extern-access option
  2022-09-04  6:35         ` Xi Ruoyao
@ 2022-09-04  7:00           ` Lulu Cheng
  2022-09-04  7:38             ` Fangrui Song
  0 siblings, 1 reply; 12+ messages in thread
From: Lulu Cheng @ 2022-09-04  7:00 UTC (permalink / raw)
  To: Xi Ruoyao, gcc-patches, liuzhensong; +Cc: Wang Xuerui, Chenghua Xu, Huacai Chen

[-- Attachment #1: Type: text/plain, Size: 1356 bytes --]


在 2022/9/4 下午2:35, Xi Ruoyao 写道:
> On Sun, 2022-09-04 at 11:22 +0800, Lulu Cheng wrote:
>> 在 2022/9/4 上午10:51, Xi Ruoyao 写道:
>>   
>>> On Sun, 2022-09-04 at 10:26 +0800, Lulu Cheng wrote:
>>>   
>>>> If the above modifications are not added, the function call is:
>>>>
>>>>   bl %plt(test1)
>>>>
>>>> now is :
>>>>
>>>>   bl test1
>>> Regarding "%plt(...)", in the binutils code:
>>>
>>>     /* For compatible old asm code.  */
>>>     if (0 == strcmp (op_c_str, "plt"))
>>>       btype = BFD_RELOC_LARCH_B26;
>>>
>>> Link:
>>> https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gas/config/loongarch-parse.y;h=8704687706df50aa15aff05f97e4560d7ec6fa23;hb=refs/heads/master#l131
>>>
>>> Zhensong: does "old asm code" here mean we should remove %plt from
>>> "new"
>>> assembly code, i. e. stop to print %plt(...) in GCC completely?
>>>
>>   
>> I think '%plt' also needs to be removed from the readability of the
>> assembly code.:-\
> I understand, but maybe we should remove %plt unconditionally, with or
> without -mdirect-extern-access.  Note that for -mcmodel=medium we don't
> say something like "%pc_hi20(%plt(x))" either.


I have thought about this problem. For example, there is no '%plt' in 
aarch64, but I think it can be added and easily distinguished at the 
assembly code level,

so this is not removed.

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

* Re: [PATCH] LoongArch: add -mdirect-extern-access option
  2022-09-04  7:00           ` Lulu Cheng
@ 2022-09-04  7:38             ` Fangrui Song
  2022-09-04 13:29               ` Xi Ruoyao
  0 siblings, 1 reply; 12+ messages in thread
From: Fangrui Song @ 2022-09-04  7:38 UTC (permalink / raw)
  To: Lulu Cheng
  Cc: Xi Ruoyao, gcc-patches, liuzhensong, Chenghua Xu, Huacai Chen,
	Wang Xuerui

On Sun, Sep 4, 2022 at 12:00 AM Lulu Cheng <chenglulu@loongson.cn> wrote:
>
>
> 在 2022/9/4 下午2:35, Xi Ruoyao 写道:
> > On Sun, 2022-09-04 at 11:22 +0800, Lulu Cheng wrote:
> >> 在 2022/9/4 上午10:51, Xi Ruoyao 写道:
> >>
> >>> On Sun, 2022-09-04 at 10:26 +0800, Lulu Cheng wrote:
> >>>
> >>>> If the above modifications are not added, the function call is:
> >>>>
> >>>>   bl %plt(test1)
> >>>>
> >>>> now is :
> >>>>
> >>>>   bl test1
> >>> Regarding "%plt(...)", in the binutils code:
> >>>
> >>>     /* For compatible old asm code.  */
> >>>     if (0 == strcmp (op_c_str, "plt"))
> >>>       btype = BFD_RELOC_LARCH_B26;
> >>>
> >>> Link:
> >>> https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gas/config/loongarch-parse.y;h=8704687706df50aa15aff05f97e4560d7ec6fa23;hb=refs/heads/master#l131
> >>>
> >>> Zhensong: does "old asm code" here mean we should remove %plt from
> >>> "new"
> >>> assembly code, i. e. stop to print %plt(...) in GCC completely?
> >>>
> >>
> >> I think '%plt' also needs to be removed from the readability of the
> >> assembly code.:-\
> > I understand, but maybe we should remove %plt unconditionally, with or
> > without -mdirect-extern-access.  Note that for -mcmodel=medium we don't
> > say something like "%pc_hi20(%plt(x))" either.
>
>
> I have thought about this problem. For example, there is no '%plt' in
> aarch64, but I think it can be added and easily distinguished at the
> assembly code level,
>
> so this is not removed.

I think @plt should be removed unconditionally. It was a mistake in
some ABI (e.g. i386, riscv).

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

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

On Sun, 2022-09-04 at 00:38 -0700, Fangrui Song wrote:
> On Sun, Sep 4, 2022 at 12:00 AM Lulu Cheng <chenglulu@loongson.cn>
> wrote:

> > I have thought about this problem. For example, there is no '%plt'
> > in
> > aarch64, but I think it can be added and easily distinguished at the
> > assembly code level,
> > 
> > so this is not removed.
> 
> I think @plt should be removed unconditionally. It was a mistake in
> some ABI (e.g. i386, riscv).

I've sent v2
(https://gcc.gnu.org/pipermail/gcc-patches/2022-September/600955.html),
with TARGET_DIRECT_EXTERN_ACCESS check in loongarch_symbol_binds_local_p
so we don't need to duplicate the check 3 times.

Regarding "%plt", I still suggest to remove it globally.  It's not so
easy to be distinguished in the compile time, as only the linker will
know if the PLT should be used (unless, if -fPIC -fplt and calling a
default-visible function then we know PLT must be used).  An explicit
"%plt" sometimes misleads newbies to think %plt would force the linker
to emit a PLT entry but it's not true.  You can discuss this with
Zhensong internally in the following week, I think.

But let's defer the "controversial" thing and eliminate the GOT in
upcoming Linux-6.1 first...

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

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

end of thread, other threads:[~2022-09-04 13:29 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-01 10:54 [PATCH] LoongArch: add -mdirect-extern-access option Xi Ruoyao
2022-09-02  3:12 ` Huacai Chen
2022-09-02  3:31   ` Xi Ruoyao
2022-09-02 11:30 ` Xi Ruoyao
2022-09-04  0:52   ` Fangrui Song
2022-09-04  2:26   ` Lulu Cheng
2022-09-04  2:51     ` Xi Ruoyao
2022-09-04  3:22       ` Lulu Cheng
2022-09-04  6:35         ` Xi Ruoyao
2022-09-04  7:00           ` Lulu Cheng
2022-09-04  7:38             ` Fangrui Song
2022-09-04 13:29               ` Xi Ruoyao

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).