public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-4848] LoongArch: Add enum-style -mexplicit-relocs= option
@ 2023-10-23  7:31 Xi Ruoyao
  0 siblings, 0 replies; only message in thread
From: Xi Ruoyao @ 2023-10-23  7:31 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:93a46d18f52ec7bab27b38c2bb41a412856e8ceb

commit r14-4848-g93a46d18f52ec7bab27b38c2bb41a412856e8ceb
Author: Xi Ruoyao <xry111@xry111.site>
Date:   Mon Oct 23 15:23:11 2023 +0800

    LoongArch: Add enum-style -mexplicit-relocs= option
    
    To take a better balance between scheduling and relaxation when -flto is
    enabled, add three-way -mexplicit-relocs={auto,none,always} options.
    The old -mexplicit-relocs and -mno-explicit-relocs options are still
    supported, they are mapped to -mexplicit-relocs=always and
    -mexplicit-relocs=none.
    
    The default choice is determined by probing assembler capabilities at
    build time.  If the assembler does not supports explicit relocs at all,
    the default will be none; if it supports explicit relocs but not
    relaxation, the default will be always; if both explicit relocs and
    relaxation are supported, the default will be auto.
    
    Currently auto is same as none.  We will make auto more clever in
    following changes.
    
    gcc/ChangeLog:
    
            * config/loongarch/genopts/loongarch-strings: Add strings for
            -mexplicit-relocs={auto,none,always}.
            * config/loongarch/genopts/loongarch.opt.in: Add options for
            -mexplicit-relocs={auto,none,always}.
            * config/loongarch/loongarch-str.h: Regenerate.
            * config/loongarch/loongarch.opt: Regenerate.
            * config/loongarch/loongarch-def.h
            (EXPLICIT_RELOCS_AUTO): Define.
            (EXPLICIT_RELOCS_NONE): Define.
            (EXPLICIT_RELOCS_ALWAYS): Define.
            (N_EXPLICIT_RELOCS_TYPES): Define.
            * config/loongarch/loongarch.cc
            (loongarch_option_override_internal): Error out if the old-style
            -m[no-]explicit-relocs option is used with
            -mexplicit-relocs={auto,none,always} together.  Map
            -mno-explicit-relocs to -mexplicit-relocs=none and
            -mexplicit-relocs to -mexplicit-relocs=always for backward
            compatibility.  Set a proper default for -mexplicit-relocs=
            based on configure-time probed linker capability.  Update a
            diagnostic message to mention -mexplicit-relocs=always instead
            of the old-style -mexplicit-relocs.
            (loongarch_handle_model_attribute): Update a diagnostic message
            to mention -mexplicit-relocs=always instead of the old-style
            -mexplicit-relocs.
            * config/loongarch/loongarch.h (TARGET_EXPLICIT_RELOCS): Define.

Diff:
---
 gcc/config/loongarch/genopts/loongarch-strings |  6 ++++++
 gcc/config/loongarch/genopts/loongarch.opt.in  | 21 +++++++++++++++++++--
 gcc/config/loongarch/loongarch-def.h           |  6 ++++++
 gcc/config/loongarch/loongarch-str.h           |  5 +++++
 gcc/config/loongarch/loongarch.cc              | 24 ++++++++++++++++++++++--
 gcc/config/loongarch/loongarch.h               |  3 +++
 gcc/config/loongarch/loongarch.opt             | 21 +++++++++++++++++++--
 7 files changed, 80 insertions(+), 6 deletions(-)

diff --git a/gcc/config/loongarch/genopts/loongarch-strings b/gcc/config/loongarch/genopts/loongarch-strings
index adecaec3eda5..8e412f7536ea 100644
--- a/gcc/config/loongarch/genopts/loongarch-strings
+++ b/gcc/config/loongarch/genopts/loongarch-strings
@@ -63,3 +63,9 @@ STR_CMODEL_TS	      tiny-static
 STR_CMODEL_MEDIUM     medium
 STR_CMODEL_LARGE      large
 STR_CMODEL_EXTREME    extreme
+
+# -mexplicit-relocs
+OPTSTR_EXPLICIT_RELOCS		explicit-relocs
+STR_EXPLICIT_RELOCS_AUTO	auto
+STR_EXPLICIT_RELOCS_NONE	none
+STR_EXPLICIT_RELOCS_ALWAYS	always
diff --git a/gcc/config/loongarch/genopts/loongarch.opt.in b/gcc/config/loongarch/genopts/loongarch.opt.in
index 4a2d7438f1b5..e1fe0c7086ea 100644
--- a/gcc/config/loongarch/genopts/loongarch.opt.in
+++ b/gcc/config/loongarch/genopts/loongarch.opt.in
@@ -170,10 +170,27 @@ mmax-inline-memcpy-size=
 Target Joined RejectNegative UInteger Var(loongarch_max_inline_memcpy_size) Init(1024)
 -mmax-inline-memcpy-size=SIZE	Set the max size of memcpy to inline, default is 1024.
 
-mexplicit-relocs
-Target Var(TARGET_EXPLICIT_RELOCS) Init(HAVE_AS_EXPLICIT_RELOCS & !HAVE_AS_MRELAX_OPTION)
+Enum
+Name(explicit_relocs) Type(int)
+The code model option names for -mexplicit-relocs:
+
+EnumValue
+Enum(explicit_relocs) String(@@STR_EXPLICIT_RELOCS_AUTO@@) Value(EXPLICIT_RELOCS_AUTO)
+
+EnumValue
+Enum(explicit_relocs) String(@@STR_EXPLICIT_RELOCS_NONE@@) Value(EXPLICIT_RELOCS_NONE)
+
+EnumValue
+Enum(explicit_relocs) String(@@STR_EXPLICIT_RELOCS_ALWAYS@@) Value(EXPLICIT_RELOCS_ALWAYS)
+
+mexplicit-relocs=
+Target RejectNegative Joined Enum(explicit_relocs) Var(la_opt_explicit_relocs) Init(M_OPT_UNSET)
 Use %reloc() assembly operators.
 
+mexplicit-relocs
+Target Var(la_opt_explicit_relocs_backward) Init(M_OPT_UNSET)
+Use %reloc() assembly operators (for backward compatibility).
+
 ; The code model option names for -mcmodel.
 Enum
 Name(cmodel) Type(int)
diff --git a/gcc/config/loongarch/loongarch-def.h b/gcc/config/loongarch/loongarch-def.h
index 769efcb70fb8..6e2a6987910d 100644
--- a/gcc/config/loongarch/loongarch-def.h
+++ b/gcc/config/loongarch/loongarch-def.h
@@ -99,6 +99,12 @@ extern const char* loongarch_cmodel_strings[];
 #define CMODEL_EXTREME	      5
 #define N_CMODEL_TYPES	      6
 
+/* enum explicit_relocs */
+#define EXPLICIT_RELOCS_AUTO	0
+#define EXPLICIT_RELOCS_NONE	1
+#define EXPLICIT_RELOCS_ALWAYS	2
+#define N_EXPLICIT_RELOCS_TYPES	3
+
 /* The common default value for variables whose assignments
    are triggered by command-line options.  */
 
diff --git a/gcc/config/loongarch/loongarch-str.h b/gcc/config/loongarch/loongarch-str.h
index a3e0510493bd..072558c28f1a 100644
--- a/gcc/config/loongarch/loongarch-str.h
+++ b/gcc/config/loongarch/loongarch-str.h
@@ -62,4 +62,9 @@ along with GCC; see the file COPYING3.  If not see
 #define STR_CMODEL_LARGE "large"
 #define STR_CMODEL_EXTREME "extreme"
 
+#define OPTSTR_EXPLICIT_RELOCS "explicit-relocs"
+#define STR_EXPLICIT_RELOCS_AUTO "auto"
+#define STR_EXPLICIT_RELOCS_NONE "none"
+#define STR_EXPLICIT_RELOCS_ALWAYS "always"
+
 #endif /* LOONGARCH_STR_H */
diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc
index 73f0c160e5f0..5df8b12ed921 100644
--- a/gcc/config/loongarch/loongarch.cc
+++ b/gcc/config/loongarch/loongarch.cc
@@ -7387,6 +7387,25 @@ loongarch_option_override_internal (struct gcc_options *opts,
   loongarch_update_gcc_opt_status (&la_target, opts, opts_set);
   loongarch_cpu_option_override (&la_target, opts, opts_set);
 
+  if (la_opt_explicit_relocs != M_OPT_UNSET
+      && la_opt_explicit_relocs_backward != M_OPT_UNSET)
+    error ("do not use %qs (with %qs) and %qs (without %qs) together",
+	   "-mexplicit-relocs=", "=",
+	   la_opt_explicit_relocs_backward ? "-mexplicit-relocs"
+					   : "-mno-explicit-relocs", "=");
+
+  if (la_opt_explicit_relocs_backward != M_OPT_UNSET)
+    la_opt_explicit_relocs = (la_opt_explicit_relocs_backward
+			      ? EXPLICIT_RELOCS_ALWAYS
+			      : EXPLICIT_RELOCS_NONE);
+
+  if (la_opt_explicit_relocs == M_OPT_UNSET)
+    la_opt_explicit_relocs = (HAVE_AS_EXPLICIT_RELOCS
+			      ? (HAVE_AS_MRELAX_OPTION
+				 ? EXPLICIT_RELOCS_AUTO
+				 : EXPLICIT_RELOCS_ALWAYS)
+			      : EXPLICIT_RELOCS_NONE);
+
   if (TARGET_ABI_LP64)
     flag_pcc_struct_return = 0;
 
@@ -7417,7 +7436,7 @@ loongarch_option_override_internal (struct gcc_options *opts,
       case CMODEL_EXTREME:
 	if (!TARGET_EXPLICIT_RELOCS)
 	  error ("code model %qs needs %s",
-		 "extreme", "-mexplicit-relocs");
+		 "extreme", "-mexplicit-relocs=always");
 
 	if (opts->x_flag_plt)
 	  {
@@ -7721,7 +7740,8 @@ loongarch_handle_model_attribute (tree *node, tree name, tree arg, int,
       if (!TARGET_EXPLICIT_RELOCS)
 	{
 	  error_at (DECL_SOURCE_LOCATION (decl),
-		    "%qE attribute requires %s", name, "-mexplicit-relocs");
+		    "%qE attribute requires %s", name,
+		    "-mexplicit-relocs=always");
 	  *no_add_attrs = true;
 	  return NULL_TREE;
 	}
diff --git a/gcc/config/loongarch/loongarch.h b/gcc/config/loongarch/loongarch.h
index c72fc515aebb..ddac8e98ea9b 100644
--- a/gcc/config/loongarch/loongarch.h
+++ b/gcc/config/loongarch/loongarch.h
@@ -1236,3 +1236,6 @@ struct GTY (()) machine_function
    we just need "ibar" to avoid instruction hazard here.  */
 #undef  CLEAR_INSN_CACHE
 #define CLEAR_INSN_CACHE(beg, end) __builtin_loongarch_ibar (0)
+
+#define TARGET_EXPLICIT_RELOCS \
+  (la_opt_explicit_relocs == EXPLICIT_RELOCS_ALWAYS)
diff --git a/gcc/config/loongarch/loongarch.opt b/gcc/config/loongarch/loongarch.opt
index 6215abcac043..029466083274 100644
--- a/gcc/config/loongarch/loongarch.opt
+++ b/gcc/config/loongarch/loongarch.opt
@@ -177,10 +177,27 @@ mmax-inline-memcpy-size=
 Target Joined RejectNegative UInteger Var(loongarch_max_inline_memcpy_size) Init(1024)
 -mmax-inline-memcpy-size=SIZE	Set the max size of memcpy to inline, default is 1024.
 
-mexplicit-relocs
-Target Var(TARGET_EXPLICIT_RELOCS) Init(HAVE_AS_EXPLICIT_RELOCS & !HAVE_AS_MRELAX_OPTION)
+Enum
+Name(explicit_relocs) Type(int)
+The code model option names for -mexplicit-relocs:
+
+EnumValue
+Enum(explicit_relocs) String(auto) Value(EXPLICIT_RELOCS_AUTO)
+
+EnumValue
+Enum(explicit_relocs) String(none) Value(EXPLICIT_RELOCS_NONE)
+
+EnumValue
+Enum(explicit_relocs) String(always) Value(EXPLICIT_RELOCS_ALWAYS)
+
+mexplicit-relocs=
+Target RejectNegative Joined Enum(explicit_relocs) Var(la_opt_explicit_relocs) Init(M_OPT_UNSET)
 Use %reloc() assembly operators.
 
+mexplicit-relocs
+Target Var(la_opt_explicit_relocs_backward) Init(M_OPT_UNSET)
+Use %reloc() assembly operators (for backward compatibility).
+
 ; The code model option names for -mcmodel.
 Enum
 Name(cmodel) Type(int)

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-10-23  7:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-23  7:31 [gcc r14-4848] LoongArch: Add enum-style -mexplicit-relocs= option 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).