aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/mapper-client.cc
diff options
context:
space:
mode:
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)