9 Star 0 Fork 34

src-anolis-os/gcc

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Improve-specs-processing-to-allow-in-function-argume.patch 7.43 KB
一键复制 编辑 原始数据 按行查看 历史
ticat_fp 提交于 2024-01-16 14:18 . Re-enable support for LoongArch
From 6e6de5b31ac9b5a523fbf60099d00124d99aa0d0 Mon Sep 17 00:00:00 2001
From: Lixing <lixing@loongosn.cn>
Date: Mon, 31 Jul 2023 10:08:23 +0800
Subject: [PATCH 2/2] Improve specs processing to allow %* in function
arguments
2018-07-31 Olivier Hainque <hainque@adacore.com>
* gcc.c (handle_spec_function): Accept a soft_matched_part
argument, as do_spec_1. Pass it down to ...
(eval_spec_function): Accept a soft_matched_part argument,
and pass it down to ...
(do_spec_2): Accept a soft_matched_part argument, and pass
it down to do_spec_1.
(do_spec_1): Pass soft_matched_part to handle_spec_function.
(handle_braces): Update call to handle_spec_function.
(driver::set_up_specs): Update calls to do_spec_2.
(compare_debug_dump_opt_spec_function): Likewise.
(compare_debug_self_opt_spec_function): Likewise.
[Upstream] 1102fd64dbb767 (Deleted ChangeLog)
Link: https://gcc.gnu.org/git/?p=gcc.git;a=patch;f=gcc/gcc.cc;h=1102fd64dbb76784ed46ff81bf905f6c52d296fc
---
gcc/gcc.c | 51 +++++++++++++++++++++++++++++----------------------
1 file changed, 29 insertions(+), 22 deletions(-)
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 3b87e91b6..3c46e0769 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -354,12 +354,12 @@ static inline void mark_matching_switches (const char *, const char *, int);
static inline void process_marked_switches (void);
static const char *process_brace_body (const char *, const char *, const char *, int, int);
static const struct spec_function *lookup_spec_function (const char *);
-static const char *eval_spec_function (const char *, const char *);
-static const char *handle_spec_function (const char *, bool *);
+static const char *eval_spec_function (const char *, const char *, const char *);
+static const char *handle_spec_function (const char *, bool *, const char *);
static char *save_string (const char *, int);
static void set_collect_gcc_options (void);
static int do_spec_1 (const char *, int, const char *);
-static int do_spec_2 (const char *);
+static int do_spec_2 (const char *, const char *);
static void do_option_spec (const char *, const char *);
static void do_self_spec (const char *);
static const char *find_file (const char *);
@@ -4865,7 +4865,7 @@ do_spec (const char *spec)
{
int value;
- value = do_spec_2 (spec);
+ value = do_spec_2 (spec, NULL);
/* Force out any unfinished command.
If -pipe, this forces out the last command if it ended in `|'. */
@@ -4884,8 +4884,11 @@ do_spec (const char *spec)
return value;
}
+/* Process the spec SPEC, with SOFT_MATCHED_PART designating the current value
+ of a matched * pattern which may be re-injected by way of %*. */
+
static int
-do_spec_2 (const char *spec)
+do_spec_2 (const char *spec, const char *soft_matched_part)
{
int result;
@@ -4898,14 +4901,13 @@ do_spec_2 (const char *spec)
input_from_pipe = 0;
suffix_subst = NULL;
- result = do_spec_1 (spec, 0, NULL);
+ result = do_spec_1 (spec, 0, soft_matched_part);
end_going_arg ();
return result;
}
-
/* Process the given spec string and add any new options to the end
of the switches/n_switches array. */
@@ -4963,7 +4965,7 @@ do_self_spec (const char *spec)
{
int i;
- do_spec_2 (spec);
+ do_spec_2 (spec, NULL);
do_spec_1 (" ", 0, NULL);
/* Mark %<S switches processed by do_self_spec to be ignored permanently.
@@ -5866,7 +5868,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
break;
case ':':
- p = handle_spec_function (p, NULL);
+ p = handle_spec_function (p, NULL, soft_matched_part);
if (p == 0)
return -1;
break;
@@ -6028,7 +6030,8 @@ lookup_spec_function (const char *name)
/* Evaluate a spec function. */
static const char *
-eval_spec_function (const char *func, const char *args)
+eval_spec_function (const char *func, const char *args,
+ const char *soft_matched_part)
{
const struct spec_function *sf;
const char *funcval;
@@ -6078,7 +6081,7 @@ eval_spec_function (const char *func, const char *args)
arguments. */
alloc_args ();
- if (do_spec_2 (args) < 0)
+ if (do_spec_2 (args, soft_matched_part) < 0)
fatal_error (input_location, "error in args to spec function %qs", func);
/* argbuf_index is an index for the next argument to be inserted, and
@@ -6115,10 +6118,14 @@ eval_spec_function (const char *func, const char *args)
NULL if no processing is required.
If RETVAL_NONNULL is not NULL, then store a bool whether function
- returned non-NULL. */
+ returned non-NULL.
+
+ SOFT_MATCHED_PART holds the current value of a matched * pattern, which
+ may be re-expanded with a %* as part of the function arguments. */
static const char *
-handle_spec_function (const char *p, bool *retval_nonnull)
+handle_spec_function (const char *p, bool *retval_nonnull,
+ const char *soft_matched_part)
{
char *func, *args;
const char *endp, *funcval;
@@ -6161,7 +6168,7 @@ handle_spec_function (const char *p, bool *retval_nonnull)
/* p now points to just past the end of the spec function expression. */
- funcval = eval_spec_function (func, args);
+ funcval = eval_spec_function (func, args, soft_matched_part);
if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
p = NULL;
if (retval_nonnull)
@@ -6315,7 +6322,7 @@ handle_braces (const char *p)
{
atom = NULL;
end_atom = NULL;
- p = handle_spec_function (p + 2, &a_matched);
+ p = handle_spec_function (p + 2, &a_matched, NULL);
}
else
{
@@ -7553,7 +7560,7 @@ driver::set_up_specs () const
/* Process sysroot_suffix_spec. */
if (*sysroot_suffix_spec != 0
&& !no_sysroot_suffix
- && do_spec_2 (sysroot_suffix_spec) == 0)
+ && do_spec_2 (sysroot_suffix_spec, NULL) == 0)
{
if (argbuf.length () > 1)
error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
@@ -7577,7 +7584,7 @@ driver::set_up_specs () const
/* Process sysroot_hdrs_suffix_spec. */
if (*sysroot_hdrs_suffix_spec != 0
&& !no_sysroot_suffix
- && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
+ && do_spec_2 (sysroot_hdrs_suffix_spec, NULL) == 0)
{
if (argbuf.length () > 1)
error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
@@ -7587,7 +7594,7 @@ driver::set_up_specs () const
/* Look for startfiles in the standard places. */
if (*startfile_prefix_spec != 0
- && do_spec_2 (startfile_prefix_spec) == 0
+ && do_spec_2 (startfile_prefix_spec, NULL) == 0
&& do_spec_1 (" ", 0, NULL) == 0)
{
const char *arg;
@@ -9717,7 +9724,7 @@ compare_debug_dump_opt_spec_function (int arg,
fatal_error (input_location,
"too many arguments to %%:compare-debug-dump-opt");
- do_spec_2 ("%{fdump-final-insns=*:%*}");
+ do_spec_2 ("%{fdump-final-insns=*:%*}", NULL);
do_spec_1 (" ", 0, NULL);
if (argbuf.length () > 0
@@ -9735,13 +9742,13 @@ compare_debug_dump_opt_spec_function (int arg,
if (argbuf.length () > 0)
{
- do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
+ do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}", NULL);
ext = ".gkd";
}
else if (!compare_debug)
return NULL;
else
- do_spec_2 ("%g.gkd");
+ do_spec_2 ("%g.gkd", NULL);
do_spec_1 (" ", 0, NULL);
@@ -9793,7 +9800,7 @@ compare_debug_self_opt_spec_function (int arg,
if (compare_debug >= 0)
return NULL;
- do_spec_2 ("%{c|S:%{o*:%*}}");
+ do_spec_2 ("%{c|S:%{o*:%*}}", NULL);
do_spec_1 (" ", 0, NULL);
if (argbuf.length () > 0)
--
2.39.3
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/src-anolis-os/gcc.git
git@gitee.com:src-anolis-os/gcc.git
src-anolis-os
gcc
gcc
a8

搜索帮助