From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7856) id 360763858D3C; Mon, 5 Sep 2022 10:11:51 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 360763858D3C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1662372711; bh=yvsD55xQAtfpyWQ53HADbjFBBYfnvGiKw/ZorskifAo=; h=From:To:Subject:Date:From; b=pBtoowCXp6tNcX8X3X9v977C5ZG3SYXjaVjzm0P/Cc0EILhSQXSo7T86+3ahOYw0G jsZ5yzjojfOXq2nqYEE/PjtB255048EfxCmHn7k8qPfZyCkocNQuDQGuSEZ1h4KGsh G+zn/d9noOOqI03RFFVDJKHXYfP8rto8JX7SORM0= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Xi Ruoyao To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-2433] LoongArch: add -mdirect-extern-access option X-Act-Checkin: gcc X-Git-Author: Xi Ruoyao X-Git-Refname: refs/heads/master X-Git-Oldrev: 9c805ddf66a1cfc93e6cc65f768897da2bc303ed X-Git-Newrev: 7742b797b3fd7acea28a0a0bff9bbb06e7c2d0ea Message-Id: <20220905101151.360763858D3C@sourceware.org> Date: Mon, 5 Sep 2022 10:11:51 +0000 (GMT) List-Id: https://gcc.gnu.org/g:7742b797b3fd7acea28a0a0bff9bbb06e7c2d0ea commit r13-2433-g7742b797b3fd7acea28a0a0bff9bbb06e7c2d0ea Author: Xi Ruoyao Date: Thu Sep 1 18:38:14 2022 +0800 LoongArch: add -mdirect-extern-access option 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. Diff: --- 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/testsuite/gcc.target/loongarch/direct-extern-1.c | 6 ++++++ gcc/testsuite/gcc.target/loongarch/direct-extern-2.c | 6 ++++++ 6 files changed, 41 insertions(+) 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; }