aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/mapper-client.cc
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2025-09-02 15:58:26 -0700
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2025-09-02 15:58:26 -0700
commit071b4126c613881f4cb25b4e5c39032964827f88 (patch)
tree7ed805786566918630d1d617b1ed8f7310f5fd8e /gcc/cp/mapper-client.cc
parent845d23f3ea08ba873197c275a8857eee7edad996 (diff)
parentcaa1c2f42691d68af4d894a5c3e700ecd2dba080 (diff)
downloadgcc-devel/gfortran-test.zip
gcc-devel/gfortran-test.tar.gz
gcc-devel/gfortran-test.tar.bz2
Merge branch 'master' into gfortran-testdevel/gfortran-test
Diffstat (limited to 'gcc/cp/mapper-client.cc')
-rw-r--r--gcc/cp/mapper-client.cc46
1 files changed, 14 insertions, 32 deletions
diff --git a/gcc/cp/mapper-client.cc b/gcc/cp/mapper-client.cc
index 9477fee..ac414f0 100644
--- a/gcc/cp/mapper-client.cc
+++ b/gcc/cp/mapper-client.cc
@@ -28,6 +28,7 @@ along with GCC; see the file COPYING3. If not see
#define INCLUDE_VECTOR
#define INCLUDE_MAP
#include "system.h"
+#include "libiberty.h"
#include "line-map.h"
#include "rich-location.h"
@@ -51,37 +52,18 @@ static module_client *
spawn_mapper_program (char const **errmsg, std::string &name,
char const *full_program_name)
{
- /* Split writable at white-space. No space-containing args for
- you! */
- // At most every other char could be an argument
- char **argv = new char *[name.size () / 2 + 2];
- unsigned arg_no = 0;
- char *str = new char[name.size ()];
- memcpy (str, name.c_str () + 1, name.size ());
-
- for (auto ptr = str; ; ++ptr)
- {
- while (*ptr == ' ')
- ptr++;
- if (!*ptr)
- break;
-
- if (!arg_no)
- {
- /* @name means look in the compiler's install dir. */
- if (ptr[0] == '@')
- ptr++;
- else
- full_program_name = nullptr;
- }
-
- argv[arg_no++] = ptr;
- while (*ptr && *ptr != ' ')
- ptr++;
- if (!*ptr)
- break;
- *ptr = 0;
- }
+ // Split mapper argument into parameters.
+ char** original_argv = buildargv (name.c_str () + 1);
+ int arg_no = countargv (original_argv);
+ char **argv = new char *[arg_no + 1];
+ for (int i = 0; i < arg_no; i++)
+ argv[i] = original_argv[i];
+
+ /* @name means look in the compiler's install dir. */
+ if (arg_no && argv[0][0] == '@')
+ argv[0] = argv[0] + 1;
+ else
+ full_program_name = nullptr;
argv[arg_no] = nullptr;
auto *pex = pex_init (PEX_USE_PIPES, progname, NULL);
@@ -108,8 +90,8 @@ spawn_mapper_program (char const **errmsg, std::string &name,
int err;
*errmsg = pex_run (pex, flags, argv[0], argv, NULL, NULL, &err);
}
- delete[] str;
delete[] argv;
+ freeargv (original_argv);
int fd_from = -1, fd_to = -1;
if (!*errmsg)