From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7856) id 969B63858C60; Mon, 23 Oct 2023 07:31:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 969B63858C60 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1698046280; bh=Cv2EXk/YFytzmgiqF8W6h0L9lHD+L5U0kXE4Xr4LnT8=; h=From:To:Subject:Date:From; b=x93S3cB90RhZLN6tf9bNNFD7QJm80HtHDTdNX/j8wZ8qqHMZRxSaITXxpHjtIhU77 tltleFCZxVqbnrxtf9z2PYomzpG94uZ8M4mSOdgiV6R8p4Qs+gT1WlyFzkYmEzSjUk +rFK3Bf18+yVWiliclOW+U6WETdziI6VEJ2+XwwE= 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 r14-4848] LoongArch: Add enum-style -mexplicit-relocs= option X-Act-Checkin: gcc X-Git-Author: Xi Ruoyao X-Git-Refname: refs/heads/master X-Git-Oldrev: 4cd4c34acda411e4b3bd03a43d68921f38ce9822 X-Git-Newrev: 93a46d18f52ec7bab27b38c2bb41a412856e8ceb Message-Id: <20231023073120.969B63858C60@sourceware.org> Date: Mon, 23 Oct 2023 07:31:20 +0000 (GMT) List-Id: https://gcc.gnu.org/g:93a46d18f52ec7bab27b38c2bb41a412856e8ceb commit r14-4848-g93a46d18f52ec7bab27b38c2bb41a412856e8ceb Author: Xi Ruoyao 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)