Sync libiberty sources with gcc mainline.

2016-09-19  Andrew Stubbs  <ams@codesourcery.com>

	* pex-win32.c (argv_to_cmdline): Quote zero-length parameters.
	* testsuite/test-pexecute.c (main): Insert check for zero-length parameters.

2016-09-10  Mark Wielaard  <mjw@redhat.com>

	* cp-demangle.c (d_substitution): Change struct demangle_component
	variable name from c to dc.

2016-08-12  Marek Polacek  <polacek@redhat.com>

	PR c/7652
	* cp-demangle.c (d_print_mod): Add FALLTHRU.

2016-08-04  Marcel B?hme  <boehme.marcel@gmail.com>

	PR c++/71696
	* cplus-dem.c: Prevent infinite recursion when there is a cycle
	in the referencing of remembered mangled types.
	(work_stuff): New stack to keep track of the remembered mangled
	types that are currently being processed.
	(push_processed_type): New method to push currently processed
	remembered type onto the stack.
	(pop_processed_type): New method to pop currently processed
	remembered type from the stack.
	(work_stuff_copy_to_from): Copy values of new variables.
	(delete_non_B_K_work_stuff): Free stack memory.
	(demangle_args): Push/Pop currently processed remembered type.
	(do_type): Do not demangle a cyclic reference and push/pop
	referenced remembered type.
This commit is contained in:
Nick Clifton 2016-10-17 10:26:56 +01:00
parent b89bd142d2
commit 41f225defe
5 changed files with 152 additions and 31 deletions

View file

@ -1,3 +1,39 @@
2016-10-17 Nick Clifton <nickc@redhat.com>
* Sync with gcc.
2016-09-19 Andrew Stubbs <ams@codesourcery.com>
* pex-win32.c (argv_to_cmdline): Quote zero-length parameters.
* testsuite/test-pexecute.c (main): Insert check for zero-length parameters.
2016-09-10 Mark Wielaard <mjw@redhat.com>
* cp-demangle.c (d_substitution): Change struct demangle_component
variable name from c to dc.
2016-08-12 Marek Polacek <polacek@redhat.com>
PR c/7652
* cp-demangle.c (d_print_mod): Add FALLTHRU.
2016-08-04 Marcel Böhme <boehme.marcel@gmail.com>
PR c++/71696
* cplus-dem.c: Prevent infinite recursion when there is a cycle
in the referencing of remembered mangled types.
(work_stuff): New stack to keep track of the remembered mangled
types that are currently being processed.
(push_processed_type): New method to push currently processed
remembered type onto the stack.
(pop_processed_type): New method to pop currently processed
remembered type from the stack.
(work_stuff_copy_to_from): Copy values of new variables.
(delete_non_B_K_work_stuff): Free stack memory.
(demangle_args): Push/Pop currently processed remembered type.
(do_type): Do not demangle a cyclic reference and push/pop
referenced remembered type.
2016-07-29 Aldy Hernandez <aldyh@redhat.com> 2016-07-29 Aldy Hernandez <aldyh@redhat.com>
* make-relative-prefix.c (make_relative_prefix_1): Fall back to * make-relative-prefix.c (make_relative_prefix_1): Fall back to
@ -16,7 +52,7 @@
(d_template_args_1): Split out from d_template_args. (d_template_args_1): Split out from d_template_args.
(d_args_length): New. (d_args_length): New.
2016-07-13 Marcel BÃhme <boehme.marcel@gmail.com> 2016-07-13 Marcel Böhme <boehme.marcel@gmail.com>
PR c++/70926 PR c++/70926
* cplus-dem.c: Handle large values and overflow when demangling * cplus-dem.c: Handle large values and overflow when demangling
@ -143,8 +179,6 @@
PR other/61321 PR other/61321
PR other/61233 PR other/61233
* demangle.h (enum demangle_component_type)
<DEMANGLE_COMPONENT_CONVERSION>: New value.
* cp-demangle.c (d_demangle_callback, d_make_comp): Handle * cp-demangle.c (d_demangle_callback, d_make_comp): Handle
DEMANGLE_COMPONENT_CONVERSION. DEMANGLE_COMPONENT_CONVERSION.
(is_ctor_dtor_or_conversion): Handle DEMANGLE_COMPONENT_CONVERSION (is_ctor_dtor_or_conversion): Handle DEMANGLE_COMPONENT_CONVERSION
@ -739,11 +773,11 @@
2013-05-31 Matt Burgess <matthew@linuxfromscratch.org> 2013-05-31 Matt Burgess <matthew@linuxfromscratch.org>
PR other/56780 PR other/56780
* libiberty/configure.ac: Move test for --enable-install-libiberty * configure.ac: Move test for --enable-install-libiberty
outside of the 'with_target_subdir' test so that it actually gets outside of the 'with_target_subdir' test so that it actually gets
run. Add output messages to show the test result. run. Add output messages to show the test result.
* libiberty/configure: Regenerate. * configure: Regenerate.
* libiberty/Makefile.in (install_to_libdir): Place the * Makefile.in (install_to_libdir): Place the
installation of the libiberty library in the same guard as that installation of the libiberty library in the same guard as that
used for the headers to prevent it being installed unless used for the headers to prevent it being installed unless
requested via --enable-install-libiberty. requested via --enable-install-libiberty.
@ -1543,7 +1577,6 @@
Daniel Jacobowitz <dan@codesourcery.com> Daniel Jacobowitz <dan@codesourcery.com>
Pedro Alves <pedro@codesourcery.com> Pedro Alves <pedro@codesourcery.com>
libiberty/
* argv.c (consume_whitespace): New function. * argv.c (consume_whitespace): New function.
(only_whitespace): New function. (only_whitespace): New function.
(buildargv): Always use ISSPACE by calling consume_whitespace. (buildargv): Always use ISSPACE by calling consume_whitespace.
@ -1744,8 +1777,8 @@
2009-04-07 Arnaud Patard <apatard@mandriva.com> 2009-04-07 Arnaud Patard <apatard@mandriva.com>
* libiberty/configure.ac: Fix Linux/MIPS matching rule. * configure.ac: Fix Linux/MIPS matching rule.
* libiberty/configure: Regenerate. * configure: Regenerate.
2009-03-27 Ian Lance Taylor <iant@google.com> 2009-03-27 Ian Lance Taylor <iant@google.com>
@ -1908,8 +1941,8 @@
2008-04-21 Aurelien Jarno <aurelien@aurel32.net> 2008-04-21 Aurelien Jarno <aurelien@aurel32.net>
* libiberty/configure.ac: use -fPIC on Linux/MIPS hosts. * configure.ac: use -fPIC on Linux/MIPS hosts.
* libiberty/configure: Regenerate. * configure: Regenerate.
2008-04-18 Kris Van Hees <kris.van.hees@oracle.com> 2008-04-18 Kris Van Hees <kris.van.hees@oracle.com>
@ -2115,7 +2148,7 @@
that are locale-independent. that are locale-independent.
* Makefile.in (filename_cmp.o): Add dependency on safe-ctype.h. * Makefile.in (filename_cmp.o): Add dependency on safe-ctype.h.
2007-04-11 Thomas Neumann tneumann@users.sourceforge.net 2007-04-11 Thomas Neumann <tneumann@users.sourceforge.net>
* argv.c: Use ANSI C declarations. * argv.c: Use ANSI C declarations.
* make-relative-prefix.c: Likewise. * make-relative-prefix.c: Likewise.
@ -3687,7 +3720,7 @@
2003-12-15 Brendan Kehoe <brendan@zen.org> 2003-12-15 Brendan Kehoe <brendan@zen.org>
* libiberty/Makefile.in (floatformat.o): Add dependency on * Makefile.in (floatformat.o): Add dependency on
config.h to accompany change of 2003-12-03. config.h to accompany change of 2003-12-03.
2003-12-15 Ian Lance Taylor <ian@wasabisystems.com> 2003-12-15 Ian Lance Taylor <ian@wasabisystems.com>
@ -4383,7 +4416,7 @@
2002-10-06 Andreas Jaeger <aj@suse.de> 2002-10-06 Andreas Jaeger <aj@suse.de>
* libiberty/cplus-dem.c (ada_demangle): Get rid of unneeded * cplus-dem.c (ada_demangle): Get rid of unneeded
variable and of strict-aliasing warning. variable and of strict-aliasing warning.
(grow_vect): Use char as first parameter. (grow_vect): Use char as first parameter.
@ -4651,7 +4684,7 @@
2002-01-31 Adam Megacz <adam@xwt.org> 2002-01-31 Adam Megacz <adam@xwt.org>
* gcc/libiberty/configure.in: Treat mingw the same as cywin * configure.in: Treat mingw the same as cywin
wrt HAVE_SYS_ERRLIST. wrt HAVE_SYS_ERRLIST.
2002-01-30 Phil Edwards <pme@gcc.gnu.org> 2002-01-30 Phil Edwards <pme@gcc.gnu.org>
@ -5159,8 +5192,8 @@ Tue Aug 21 12:35:04 2001 Christopher Faylor <cgf@cygnus.com>
2001-03-10 Neil Booth <neil@daikokuya.demon.co.uk> 2001-03-10 Neil Booth <neil@daikokuya.demon.co.uk>
John David Anglin <dave@hiauly1.hia.nrc.ca> John David Anglin <dave@hiauly1.hia.nrc.ca>
* libiberty/lbasename.c: New file. * lbasename.c: New file.
* libiberty/Makefile.in: Update for lbasename. * Makefile.in: Update for lbasename.
2001-03-06 Zack Weinberg <zackw@stanford.edu> 2001-03-06 Zack Weinberg <zackw@stanford.edu>
@ -5533,13 +5566,13 @@ Tue Aug 21 12:35:04 2001 Christopher Faylor <cgf@cygnus.com>
2000-08-24 Greg McGary <greg@mcgary.org> 2000-08-24 Greg McGary <greg@mcgary.org>
* libiberty/random.c (end_ptr): Revert previous change. * random.c (end_ptr): Revert previous change.
2000-08-24 Greg McGary <greg@mcgary.org> 2000-08-24 Greg McGary <greg@mcgary.org>
* libiberty/cplus-dem.c (cplus_demangle_opname, cplus_mangle_opname, * cplus-dem.c (cplus_demangle_opname, cplus_mangle_opname,
demangle_expression, demangle_function_name): Use ARRAY_SIZE. demangle_expression, demangle_function_name): Use ARRAY_SIZE.
* libiberty/random.c (end_ptr): Likewise. * random.c (end_ptr): Likewise.
2000-08-23 Alex Samuel <samuel@codesourcery.com> 2000-08-23 Alex Samuel <samuel@codesourcery.com>

View file

@ -3769,7 +3769,7 @@ d_substitution (struct d_info *di, int prefix)
{ {
const char *s; const char *s;
int len; int len;
struct demangle_component *c; struct demangle_component *dc;
if (p->set_last_name != NULL) if (p->set_last_name != NULL)
di->last_name = d_make_sub (di, p->set_last_name, di->last_name = d_make_sub (di, p->set_last_name,
@ -3785,15 +3785,15 @@ d_substitution (struct d_info *di, int prefix)
len = p->simple_len; len = p->simple_len;
} }
di->expansion += len; di->expansion += len;
c = d_make_sub (di, s, len); dc = d_make_sub (di, s, len);
if (d_peek_char (di) == 'B') if (d_peek_char (di) == 'B')
{ {
/* If there are ABI tags on the abbreviation, it becomes /* If there are ABI tags on the abbreviation, it becomes
a substitution candidate. */ a substitution candidate. */
c = d_abi_tags (di, c); dc = d_abi_tags (di, dc);
d_add_substitution (di, c); d_add_substitution (di, dc);
} }
return c; return dc;
} }
} }
@ -5777,11 +5777,13 @@ d_print_mod (struct d_print_info *dpi, int options,
case DEMANGLE_COMPONENT_REFERENCE_THIS: case DEMANGLE_COMPONENT_REFERENCE_THIS:
/* For the ref-qualifier, put a space before the &. */ /* For the ref-qualifier, put a space before the &. */
d_append_char (dpi, ' '); d_append_char (dpi, ' ');
/* FALLTHRU */
case DEMANGLE_COMPONENT_REFERENCE: case DEMANGLE_COMPONENT_REFERENCE:
d_append_char (dpi, '&'); d_append_char (dpi, '&');
return; return;
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS:
d_append_char (dpi, ' '); d_append_char (dpi, ' ');
/* FALLTHRU */
case DEMANGLE_COMPONENT_RVALUE_REFERENCE: case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
d_append_string (dpi, "&&"); d_append_string (dpi, "&&");
return; return;

View file

@ -144,6 +144,9 @@ struct work_stuff
string* previous_argument; /* The last function argument demangled. */ string* previous_argument; /* The last function argument demangled. */
int nrepeats; /* The number of times to repeat the previous int nrepeats; /* The number of times to repeat the previous
argument. */ argument. */
int *proctypevec; /* Indices of currently processed remembered typevecs. */
int proctypevec_size;
int nproctypes;
}; };
#define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI) #define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI)
@ -436,6 +439,10 @@ iterate_demangle_function (struct work_stuff *,
static void remember_type (struct work_stuff *, const char *, int); static void remember_type (struct work_stuff *, const char *, int);
static void push_processed_type (struct work_stuff *, int);
static void pop_processed_type (struct work_stuff *);
static void remember_Btype (struct work_stuff *, const char *, int, int); static void remember_Btype (struct work_stuff *, const char *, int, int);
static int register_Btype (struct work_stuff *); static int register_Btype (struct work_stuff *);
@ -1302,6 +1309,10 @@ work_stuff_copy_to_from (struct work_stuff *to, struct work_stuff *from)
memcpy (to->btypevec[i], from->btypevec[i], len); memcpy (to->btypevec[i], from->btypevec[i], len);
} }
if (from->proctypevec)
to->proctypevec =
XDUPVEC (int, from->proctypevec, from->proctypevec_size);
if (from->ntmpl_args) if (from->ntmpl_args)
to->tmpl_argvec = XNEWVEC (char *, from->ntmpl_args); to->tmpl_argvec = XNEWVEC (char *, from->ntmpl_args);
@ -1330,11 +1341,17 @@ delete_non_B_K_work_stuff (struct work_stuff *work)
/* Discard the remembered types, if any. */ /* Discard the remembered types, if any. */
forget_types (work); forget_types (work);
if (work -> typevec != NULL) if (work->typevec != NULL)
{ {
free ((char *) work -> typevec); free ((char *) work->typevec);
work -> typevec = NULL; work->typevec = NULL;
work -> typevec_size = 0; work->typevec_size = 0;
}
if (work->proctypevec != NULL)
{
free (work->proctypevec);
work->proctypevec = NULL;
work->proctypevec_size = 0;
} }
if (work->tmpl_argvec) if (work->tmpl_argvec)
{ {
@ -3555,6 +3572,8 @@ static int
do_type (struct work_stuff *work, const char **mangled, string *result) do_type (struct work_stuff *work, const char **mangled, string *result)
{ {
int n; int n;
int i;
int is_proctypevec;
int done; int done;
int success; int success;
string decl; string decl;
@ -3567,6 +3586,7 @@ do_type (struct work_stuff *work, const char **mangled, string *result)
done = 0; done = 0;
success = 1; success = 1;
is_proctypevec = 0;
while (success && !done) while (success && !done)
{ {
int member; int member;
@ -3627,8 +3647,15 @@ do_type (struct work_stuff *work, const char **mangled, string *result)
success = 0; success = 0;
} }
else else
{ for (i = 0; i < work->nproctypes; i++)
remembered_type = work -> typevec[n]; if (work -> proctypevec [i] == n)
success = 0;
if (success)
{
is_proctypevec = 1;
push_processed_type (work, n);
remembered_type = work->typevec[n];
mangled = &remembered_type; mangled = &remembered_type;
} }
break; break;
@ -3850,6 +3877,9 @@ do_type (struct work_stuff *work, const char **mangled, string *result)
string_delete (result); string_delete (result);
string_delete (&decl); string_delete (&decl);
if (is_proctypevec)
pop_processed_type (work);
if (success) if (success)
/* Assume an integral type, if we're not sure. */ /* Assume an integral type, if we're not sure. */
return (int) ((tk == tk_none) ? tk_integral : tk); return (int) ((tk == tk_none) ? tk_integral : tk);
@ -4262,6 +4292,41 @@ do_arg (struct work_stuff *work, const char **mangled, string *result)
return 1; return 1;
} }
static void
push_processed_type (struct work_stuff *work, int typevec_index)
{
if (work->nproctypes >= work->proctypevec_size)
{
if (!work->proctypevec_size)
{
work->proctypevec_size = 4;
work->proctypevec = XNEWVEC (int, work->proctypevec_size);
}
else
{
if (work->proctypevec_size < 16)
/* Double when small. */
work->proctypevec_size *= 2;
else
{
/* Grow slower when large. */
if (work->proctypevec_size > (INT_MAX / 3) * 2)
xmalloc_failed (INT_MAX);
work->proctypevec_size = (work->proctypevec_size * 3 / 2);
}
work->proctypevec
= XRESIZEVEC (int, work->proctypevec, work->proctypevec_size);
}
}
work->proctypevec [work->nproctypes++] = typevec_index;
}
static void
pop_processed_type (struct work_stuff *work)
{
work->nproctypes--;
}
static void static void
remember_type (struct work_stuff *work, const char *start, int len) remember_type (struct work_stuff *work, const char *start, int len)
{ {
@ -4526,10 +4591,13 @@ demangle_args (struct work_stuff *work, const char **mangled,
{ {
string_append (declp, ", "); string_append (declp, ", ");
} }
push_processed_type (work, t);
if (!do_arg (work, &tem, &arg)) if (!do_arg (work, &tem, &arg))
{ {
pop_processed_type (work);
return (0); return (0);
} }
pop_processed_type (work);
if (PRINT_ARG_TYPES) if (PRINT_ARG_TYPES)
{ {
string_appends (declp, &arg); string_appends (declp, &arg);

View file

@ -370,6 +370,8 @@ argv_to_cmdline (char *const *argv)
cmdline_len++; cmdline_len++;
} }
} }
if (j == 0)
needs_quotes = 1;
/* Trailing backslashes also need to be escaped because they will be /* Trailing backslashes also need to be escaped because they will be
followed by the terminating quote. */ followed by the terminating quote. */
if (needs_quotes) if (needs_quotes)
@ -394,6 +396,8 @@ argv_to_cmdline (char *const *argv)
break; break;
} }
} }
if (j == 0)
needs_quotes = 1;
if (needs_quotes) if (needs_quotes)
{ {

View file

@ -285,6 +285,20 @@ main (int argc, char **argv)
ERROR ("echo exit status failed"); ERROR ("echo exit status failed");
pex_free (pex1); pex_free (pex1);
/* Check empty parameters don't get lost. */
pex1 = TEST_PEX_INIT (PEX_USE_PIPES, "temp");
subargv[1] = "echo";
subargv[2] = "foo";
subargv[3] = "";
subargv[4] = "bar";
subargv[5] = NULL;
TEST_PEX_RUN (pex1, 0, "./test-pexecute", subargv, NULL, NULL);
e = TEST_PEX_READ_OUTPUT (pex1);
CHECK_LINE (e, "foo bar"); /* Two spaces! */
if (TEST_PEX_GET_STATUS_1 (pex1) != 0)
ERROR ("echo exit status failed");
pex_free (pex1);
pex1 = TEST_PEX_INIT (PEX_USE_PIPES, "temp"); pex1 = TEST_PEX_INIT (PEX_USE_PIPES, "temp");
subargv[1] = "echo"; subargv[1] = "echo";
subargv[2] = "bar"; subargv[2] = "bar";