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 <xry...@xry111.site> > School of Aerospace Science and Technology, Xidian University -- 宋方睿