summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2021-06-30 13:17:54 +0200
committerTobias Burnus <tobias@codesourcery.com>2021-06-30 13:17:54 +0200
commita3ce7d75dd9c0308b8565669f31127436cb2ba9f (patch)
tree72e34e5db6d6b8afe4d8199acc46eabf9a3ea649
parent0a9d038ec10aa0d109ca965cc435934bfea92d14 (diff)
downloadgcc-a3ce7d75dd9c0308b8565669f31127436cb2ba9f.tar.gz
gcc.c's check_offload_target_name: Fixes to inform hints
gcc/ChangeLog: * gcc.c (close_at_file, execute): Replace alloca by XALLOCAVEC. (check_offload_target_name): Fix splitting OFFLOAD_TARGETS into a candidate list; better inform no offload target is configured and fix hint extraction when passed target is not '\0' at [len]. * common.opt (foffload): Add tailing '.'. (foffload-options): Likewise; fix flag name in the help string.
-rw-r--r--gcc/common.opt4
-rw-r--r--gcc/gcc.c42
2 files changed, 22 insertions, 24 deletions
diff --git a/gcc/common.opt b/gcc/common.opt
index eaee74c580a..2f5ff9f02e9 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -2104,11 +2104,11 @@ Support synchronous non-call exceptions.
; -foffload=<targets>=<options> is supported for backward compatibility
foffload=
Driver Joined MissingArgError(targets missing after %qs)
--foffload=<targets> Specify offloading targets
+-foffload=<targets> Specify offloading targets.
foffload-options=
Common Driver Joined MissingArgError(options or targets=options missing after %qs)
--foffload=<targets>=<options> Specify options for the offloading targets
+-foffload-options=<targets>=<options> Specify options for the offloading targets.
foffload-abi=
Common Joined RejectNegative Enum(offload_abi) Var(flag_offload_abi) Init(OFFLOAD_ABI_UNSET)
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 9baa7d67c76..f802148e567 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -2242,7 +2242,7 @@ close_at_file (void)
if (n_args == 0)
return;
- char **argv = (char **) alloca (sizeof (char *) * (n_args + 1));
+ char **argv = XALLOCAVEC (char *, n_args + 1);
char *temp_file = make_at_file ();
char *at_argument = concat ("@", temp_file, NULL);
FILE *f = fopen (temp_file, "w");
@@ -3251,7 +3251,7 @@ execute (void)
n_commands++;
/* Get storage for each command. */
- commands = (struct command *) alloca (n_commands * sizeof (struct command));
+ commands = XALLOCAVEC (struct command, n_commands);
/* Split argbuf into its separate piped processes,
and record info about each one.
@@ -3430,13 +3430,13 @@ execute (void)
struct pex_time *times = NULL;
int ret_code = 0;
- statuses = (int *) alloca (n_commands * sizeof (int));
+ statuses = XALLOCAVEC (int, n_commands);
if (!pex_get_status (pex, n_commands, statuses))
fatal_error (input_location, "failed to get exit status: %m");
if (report_times || report_times_to_file)
{
- times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
+ times = XALLOCAVEC (struct pex_time, n_commands);
if (!pex_get_times (pex, n_commands, times))
fatal_error (input_location, "failed to get process times: %m");
}
@@ -3997,24 +3997,22 @@ check_offload_target_name (const char *target, ptrdiff_t len)
{
char *s;
auto_vec<const char*> candidates;
- char *cand = (char *) alloca (strlen (OFFLOAD_TARGETS) + 1);
- c = OFFLOAD_TARGETS;
- while (c)
- {
- n = strchr (c, ',');
- if (n == NULL)
- n = strchr (c, '\0');
- if (n - c == 0)
- break;
- strncpy (cand, c, n - c);
- cand[n - c] = '\0';
- candidates.safe_push (cand);
- c = *n ? n + 1 : NULL;
- }
- error ("GCC is not configured to support %q.*s as offload target",
- (int) len, target);
- const char *hint = candidates_list_and_hint (target, s, candidates);
- if (hint)
+ size_t olen = strlen (OFFLOAD_TARGETS) + 1;
+ char *cand = XALLOCAVEC (char, olen);
+ memcpy (cand, OFFLOAD_TARGETS, olen);
+ for (c = strtok (cand, ","); c; c = strtok (NULL, ","))
+ candidates.safe_push (c);
+
+ char *target2 = XALLOCAVEC (char, len + 1);
+ memcpy (target2, target, len);
+ target2[len] = '\0';
+
+ error ("GCC is not configured to support %qs as offload target", target2);
+
+ const char *hint = candidates_list_and_hint (target2, s, candidates);
+ if (candidates.is_empty ())
+ inform (UNKNOWN_LOCATION, "no offloading targets configured");
+ else if (hint)
inform (UNKNOWN_LOCATION,
"valid offload targets are: %s; did you mean %qs?", s, hint);
else