sync libiberty from gcc

config/
	Sync from gcc
	2020-07-15  H.J. Lu  <hjl.tools@gmail.com>
	PR bootstrap/96202
	* cet.m4 (GCC_CET_HOST_FLAGS): Don't enable CET without CET
	support in stage1 nor for build support.
libiberty/
	* configure: Regenerate.

	Sync from gcc
	2020-09-08  Alan Modra  <amodra@gmail.com>
	* d-demangle.c: Include limits.h.
	(ULONG_MAX, UINT_MAX): Provide fall-back definition.
	(dlang_number): Simplify and correct overflow test.  Only
	write *ret on returning non-NULL.  Make "ret" an unsigned long*.
	Only succeed for result of [0,UINT_MAX].
	(dlang_decode_backref): Simplify and correct overflow test.
	Only write *ret on returning non-NULL.  Only succeed for
	result [1,MAX_LONG].
	(dlang_backref): Remove now unnecessary range check.
	(dlang_symbol_name_p): Likewise.
	(string_need): Take a size_t n arg, and use size_t tem.
	(string_append): Use size_t n.
	(string_appendn, string_prependn): Take a size_t n arg.
	(TEMPLATE_LENGTH_UNKNOWN): Define as -1UL.
	(dlang_lname, dlang_parse_template): Take an unsigned long len
	arg.
	(dlang_symbol_backref, dlang_identifier, dlang_parse_integer),
	(dlang_parse_integer, dlang_parse_string),
	(dlang_parse_arrayliteral, dlang_parse_assocarray),
	(dlang_parse_structlit, dlang_parse_tuple),
	(dlang_template_symbol_param, dlang_template_args): Use
	unsigned long variables.
	* testsuite/d-demangle-expected: Add new tests.

	2020-08-04  Iain Buclaw  <ibuclaw@gdcproject.org>
	* d-demangle.c (dlang_function_args): Handle 'in' and 'in ref'
	parameter storage classes.
	(dlang_type): Remove identifier type.
	* testsuite/d-demangle-expected: Update tests.

	2020-08-03  Richard Biener  <rguenther@suse.de>
	PR lto/96385
	* simple-object-elf.c
	(simple_object_elf_copy_lto_debug_sections): Localize global
	UNDEFs and reuse the prevailing name.

	2020-07-10  Ian Lance Taylor  <iant@golang.org>
	PR demangler/96143
	* cp-demangle.c (d_lambda): Don't add substitution candidate.
	* testsuite/demangle-expected: Update a few existing test cases
	accordingly, and add a new test case.

	2020-07-04  Jason Merrill  <jason@redhat.com>
	* cp-demangle.c (cplus_demangle_operators): Add di, dx, dX.
	(d_expression_1): Handle di and dX.
	(is_designated_init, d_maybe_print_designated_init): New.
	(d_print_comp_inner): Use d_maybe_print_designated_init.
	* testsuite/demangle-expected: Add designator tests.

	2020-06-25  Nick Clifton  <nickc@redhat.com>
	* bsearch.c (bsearch): Remove use of register keyword.
	* bsearch_r.c (bsearch_r): Likewise.
This commit is contained in:
Alan Modra 2020-09-08 18:57:15 +09:30
parent cac1e71dbd
commit 7ade7fba75
11 changed files with 299 additions and 84 deletions

View File

@ -1,3 +1,11 @@
2020-09-08 Alan Modra <amodra@gmail.com>
Sync from gcc
2020-07-15 H.J. Lu <hjl.tools@gmail.com>
PR bootstrap/96202
* cet.m4 (GCC_CET_HOST_FLAGS): Don't enable CET without CET
support in stage1 nor for build support.
2020-07-30 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* largefile.m4 (ACX_LARGEFILE) <sparc-*-solaris*|i?86-*-solaris*>:

View File

@ -13,7 +13,7 @@ case "$host" in
case "$enable_cet" in
auto)
# Check if target supports multi-byte NOPs
# and if assembler supports CET insn.
# and if compiler and assembler support CET insn.
cet_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fcf-protection"
AC_COMPILE_IFELSE(
@ -70,7 +70,7 @@ case "$host" in
case "$enable_cet" in
auto)
# Check if target supports multi-byte NOPs
# and if assembler supports CET insn.
# and if compiler and assembler support CET.
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[],
@ -85,13 +85,26 @@ asm ("setssbsy");
[enable_cet=no])
;;
yes)
# Check if assembler supports CET.
# Check if compiler and assembler support CET.
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[],
[asm ("setssbsy");])],
[],
[AC_MSG_ERROR([assembler with CET support is required for --enable-cet])])
[support_cet=yes],
[support_cet=no])
if test $support_cet = "no"; then
if test x$enable_bootstrap != xno \
&& test -z "${with_build_subdir}" \
&& (test ! -f ../stage_current \
|| test `cat ../stage_current` != "stage1"); then
# Require CET support only for the final GCC build.
AC_MSG_ERROR([compiler and assembler with CET support are required for --enable-cet])
else
# Don't enable CET without CET support for non-bootstrap
# build, in stage1 nor for build support.
enable_cet=no
fi
fi
;;
esac
CFLAGS="$cet_save_CFLAGS"

View File

@ -1,3 +1,62 @@
2020-09-08 Alan Modra <amodra@gmail.com>
* configure: Regenerate.
Sync from gcc
2020-09-08 Alan Modra <amodra@gmail.com>
* d-demangle.c: Include limits.h.
(ULONG_MAX, UINT_MAX): Provide fall-back definition.
(dlang_number): Simplify and correct overflow test. Only
write *ret on returning non-NULL. Make "ret" an unsigned long*.
Only succeed for result of [0,UINT_MAX].
(dlang_decode_backref): Simplify and correct overflow test.
Only write *ret on returning non-NULL. Only succeed for
result [1,MAX_LONG].
(dlang_backref): Remove now unnecessary range check.
(dlang_symbol_name_p): Likewise.
(string_need): Take a size_t n arg, and use size_t tem.
(string_append): Use size_t n.
(string_appendn, string_prependn): Take a size_t n arg.
(TEMPLATE_LENGTH_UNKNOWN): Define as -1UL.
(dlang_lname, dlang_parse_template): Take an unsigned long len
arg.
(dlang_symbol_backref, dlang_identifier, dlang_parse_integer),
(dlang_parse_integer, dlang_parse_string),
(dlang_parse_arrayliteral, dlang_parse_assocarray),
(dlang_parse_structlit, dlang_parse_tuple),
(dlang_template_symbol_param, dlang_template_args): Use
unsigned long variables.
* testsuite/d-demangle-expected: Add new tests.
2020-08-04 Iain Buclaw <ibuclaw@gdcproject.org>
* d-demangle.c (dlang_function_args): Handle 'in' and 'in ref'
parameter storage classes.
(dlang_type): Remove identifier type.
* testsuite/d-demangle-expected: Update tests.
2020-08-03 Richard Biener <rguenther@suse.de>
PR lto/96385
* simple-object-elf.c
(simple_object_elf_copy_lto_debug_sections): Localize global
UNDEFs and reuse the prevailing name.
2020-07-10 Ian Lance Taylor <iant@golang.org>
PR demangler/96143
* cp-demangle.c (d_lambda): Don't add substitution candidate.
* testsuite/demangle-expected: Update a few existing test cases
accordingly, and add a new test case.
2020-07-04 Jason Merrill <jason@redhat.com>
* cp-demangle.c (cplus_demangle_operators): Add di, dx, dX.
(d_expression_1): Handle di and dX.
(is_designated_init, d_maybe_print_designated_init): New.
(d_print_comp_inner): Use d_maybe_print_designated_init.
* testsuite/demangle-expected: Add designator tests.
2020-06-25 Nick Clifton <nickc@redhat.com>
* bsearch.c (bsearch): Remove use of register keyword.
* bsearch_r.c (bsearch_r): Likewise.
2020-06-23 Nick Alcock <nick.alcock@oracle.com>
* bsearch_r.c: New file.

View File

@ -69,13 +69,13 @@ is respectively less than, matching, or greater than the array member.
* look at item 3.
*/
void *
bsearch (register const void *key, const void *base0,
size_t nmemb, register size_t size,
register int (*compar)(const void *, const void *))
bsearch (const void *key, const void *base0,
size_t nmemb, size_t size,
int (*compar)(const void *, const void *))
{
register const char *base = (const char *) base0;
register int lim, cmp;
register const void *p;
const char *base = (const char *) base0;
int lim, cmp;
const void *p;
for (lim = nmemb; lim != 0; lim >>= 1) {
p = base + (lim >> 1) * size;

View File

@ -70,14 +70,14 @@ is respectively less than, matching, or greater than the array member.
* look at item 3.
*/
void *
bsearch_r (register const void *key, const void *base0,
size_t nmemb, register size_t size,
register int (*compar)(const void *, const void *, void *),
bsearch_r (const void *key, const void *base0,
size_t nmemb, size_t size,
int (*compar)(const void *, const void *, void *),
void *arg)
{
register const char *base = (const char *) base0;
register int lim, cmp;
register const void *p;
const char *base = (const char *) base0;
int lim, cmp;
const void *p;
for (lim = nmemb; lim != 0; lim >>= 1) {
p = base + (lim >> 1) * size;

21
libiberty/configure vendored
View File

@ -5291,7 +5291,7 @@ case "$host" in
case "$enable_cet" in
auto)
# Check if target supports multi-byte NOPs
# and if assembler supports CET insn.
# and if compiler and assembler support CET.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@ -5317,7 +5317,7 @@ fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;;
yes)
# Check if assembler supports CET.
# Check if compiler and assembler support CET.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@ -5330,11 +5330,24 @@ asm ("setssbsy");
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
support_cet=yes
else
as_fn_error $? "assembler with CET support is required for --enable-cet" "$LINENO" 5
support_cet=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
if test $support_cet = "no"; then
if test x$enable_bootstrap != xno \
&& test -z "${with_build_subdir}" \
&& (test ! -f ../stage_current \
|| test `cat ../stage_current` != "stage1"); then
# Require CET support only for the final GCC build.
as_fn_error $? "compiler and assembler with CET support are required for --enable-cet" "$LINENO" 5
else
# Don't enable CET without CET support for non-bootstrap
# build, in stage1 nor for build support.
enable_cet=no
fi
fi
;;
esac
CFLAGS="$cet_save_CFLAGS"

View File

@ -1809,13 +1809,16 @@ const struct demangle_operator_info cplus_demangle_operators[] =
{ "cm", NL (","), 2 },
{ "co", NL ("~"), 1 },
{ "dV", NL ("/="), 2 },
{ "dX", NL ("[...]="), 3 }, /* [expr...expr] = expr */
{ "da", NL ("delete[] "), 1 },
{ "dc", NL ("dynamic_cast"), 2 },
{ "de", NL ("*"), 1 },
{ "di", NL ("="), 2 }, /* .name = expr */
{ "dl", NL ("delete "), 1 },
{ "ds", NL (".*"), 2 },
{ "dt", NL ("."), 2 },
{ "dv", NL ("/"), 2 },
{ "dx", NL ("]="), 2 }, /* [expr] = expr */
{ "eO", NL ("^="), 2 },
{ "eo", NL ("^"), 2 },
{ "eq", NL ("=="), 2 },
@ -3291,6 +3294,12 @@ op_is_new_cast (struct demangle_component *op)
::= sr <type> <unqualified-name>
::= sr <type> <unqualified-name> <template-args>
::= <expr-primary>
<braced-expression> ::= <expression>
::= di <field source-name> <braced-expression> # .name = expr
::= dx <index expression> <braced-expression> # [expr] = expr
::= dX <range begin expression> <range end expression> <braced-expression>
# [expr ... expr] = expr
*/
static inline struct demangle_component *
@ -3453,6 +3462,8 @@ d_expression_1 (struct d_info *di)
else if (code[0] == 'f')
/* fold-expression. */
left = d_operator_name (di);
else if (!strcmp (code, "di"))
left = d_unqualified_name (di);
else
left = d_expression_1 (di);
if (!strcmp (code, "cl"))
@ -3480,7 +3491,8 @@ d_expression_1 (struct d_info *di)
if (code == NULL)
return NULL;
else if (!strcmp (code, "qu"))
else if (!strcmp (code, "qu")
|| !strcmp (code, "dX"))
{
/* ?: expression. */
first = d_expression_1 (di);
@ -3764,9 +3776,6 @@ d_lambda (struct d_info *di)
ret->u.s_unary_num.num = num;
}
if (! d_add_substitution (di, ret))
return NULL;
return ret;
}
@ -4675,6 +4684,64 @@ d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
return 1;
}
/* True iff DC represents a C99-style designated initializer. */
static int
is_designated_init (struct demangle_component *dc)
{
if (dc->type != DEMANGLE_COMPONENT_BINARY
&& dc->type != DEMANGLE_COMPONENT_TRINARY)
return 0;
struct demangle_component *op = d_left (dc);
const char *code = op->u.s_operator.op->code;
return (code[0] == 'd'
&& (code[1] == 'i' || code[1] == 'x' || code[1] == 'X'));
}
/* If DC represents a C99-style designated initializer, print it and return
true; otherwise, return false. */
static int
d_maybe_print_designated_init (struct d_print_info *dpi, int options,
struct demangle_component *dc)
{
if (!is_designated_init (dc))
return 0;
const char *code = d_left (dc)->u.s_operator.op->code;
struct demangle_component *operands = d_right (dc);
struct demangle_component *op1 = d_left (operands);
struct demangle_component *op2 = d_right (operands);
if (code[1] == 'i')
d_append_char (dpi, '.');
else
d_append_char (dpi, '[');
d_print_comp (dpi, options, op1);
if (code[1] == 'X')
{
d_append_string (dpi, " ... ");
d_print_comp (dpi, options, d_left (op2));
op2 = d_right (op2);
}
if (code[1] != 'i')
d_append_char (dpi, ']');
if (is_designated_init (op2))
{
/* Don't put '=' or '(' between chained designators. */
d_print_comp (dpi, options, op2);
}
else
{
d_append_char (dpi, '=');
d_print_subexpr (dpi, options, op2);
}
return 1;
}
/* Subroutine to handle components. */
static void
@ -5491,6 +5558,9 @@ d_print_comp_inner (struct d_print_info *dpi, int options,
if (d_maybe_print_fold_expression (dpi, options, dc))
return;
if (d_maybe_print_designated_init (dpi, options, dc))
return;
/* We wrap an expression which uses the greater-than operator in
an extra layer of parens so that it does not get confused
with the '>' which ends the template parameters. */
@ -5548,6 +5618,8 @@ d_print_comp_inner (struct d_print_info *dpi, int options,
}
if (d_maybe_print_fold_expression (dpi, options, dc))
return;
if (d_maybe_print_designated_init (dpi, options, dc))
return;
{
struct demangle_component *op = d_left (dc);
struct demangle_component *first = d_left (d_right (dc));

View File

@ -31,6 +31,9 @@ If not, see <http://www.gnu.org/licenses/>. */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#include "safe-ctype.h"
@ -45,6 +48,13 @@ If not, see <http://www.gnu.org/licenses/>. */
#include <demangle.h>
#include "libiberty.h"
#ifndef ULONG_MAX
#define ULONG_MAX (~0UL)
#endif
#ifndef UINT_MAX
#define UINT_MAX (~0U)
#endif
/* A mini string-handling package */
typedef struct string /* Beware: these aren't required to be */
@ -55,9 +65,9 @@ typedef struct string /* Beware: these aren't required to be */
} string;
static void
string_need (string *s, int n)
string_need (string *s, size_t n)
{
int tem;
size_t tem;
if (s->b == NULL)
{
@ -68,7 +78,7 @@ string_need (string *s, int n)
s->p = s->b = XNEWVEC (char, n);
s->e = s->b + n;
}
else if (s->e - s->p < n)
else if ((size_t) (s->e - s->p) < n)
{
tem = s->p - s->b;
n += tem;
@ -117,14 +127,14 @@ string_setlength (string *s, int n)
static void
string_append (string *p, const char *s)
{
int n = strlen (s);
size_t n = strlen (s);
string_need (p, n);
memcpy (p->p, s, n);
p->p += n;
}
static void
string_appendn (string *p, const char *s, int n)
string_appendn (string *p, const char *s, size_t n)
{
if (n != 0)
{
@ -135,7 +145,7 @@ string_appendn (string *p, const char *s, int n)
}
static void
string_prependn (string *p, const char *s, int n)
string_prependn (string *p, const char *s, size_t n)
{
char *q;
@ -170,7 +180,7 @@ struct dlang_info
};
/* Pass as the LEN to dlang_parse_template if symbol length is not known. */
enum { TEMPLATE_LENGTH_UNKNOWN = -1 };
#define TEMPLATE_LENGTH_UNKNOWN (-1UL)
/* Prototypes for forward referenced functions */
static const char *dlang_function_type (string *, const char *,
@ -193,38 +203,39 @@ static const char *dlang_parse_tuple (string *, const char *,
struct dlang_info *);
static const char *dlang_parse_template (string *, const char *,
struct dlang_info *, long);
struct dlang_info *, unsigned long);
static const char *dlang_lname (string *, const char *, long);
static const char *dlang_lname (string *, const char *, unsigned long);
/* Extract the number from MANGLED, and assign the result to RET.
Return the remaining string on success or NULL on failure. */
Return the remaining string on success or NULL on failure.
A result larger than UINT_MAX is considered a failure. */
static const char *
dlang_number (const char *mangled, long *ret)
dlang_number (const char *mangled, unsigned long *ret)
{
/* Return NULL if trying to extract something that isn't a digit. */
if (mangled == NULL || !ISDIGIT (*mangled))
return NULL;
(*ret) = 0;
unsigned long val = 0;
while (ISDIGIT (*mangled))
{
(*ret) *= 10;
unsigned long digit = mangled[0] - '0';
/* If an overflow occured when multiplying by ten, the result
will not be a multiple of ten. */
if ((*ret % 10) != 0)
/* Check for overflow. */
if (val > (UINT_MAX - digit) / 10)
return NULL;
(*ret) += mangled[0] - '0';
val = val * 10 + digit;
mangled++;
}
if (*mangled == '\0' || *ret < 0)
if (*mangled == '\0')
return NULL;
*ret = val;
return mangled;
}
@ -273,7 +284,8 @@ dlang_call_convention_p (const char *mangled)
}
/* Extract the back reference position from MANGLED, and assign the result
to RET. Return the remaining string on success or NULL on failure. */
to RET. Return the remaining string on success or NULL on failure.
A result <= 0 is a failure. */
static const char *
dlang_decode_backref (const char *mangled, long *ret)
{
@ -294,24 +306,26 @@ dlang_decode_backref (const char *mangled, long *ret)
[A-Z] NumberBackRef
^
*/
(*ret) = 0;
unsigned long val = 0;
while (ISALPHA (*mangled))
{
(*ret) *= 26;
/* Check for overflow. */
if (val > (ULONG_MAX - 25) / 26)
break;
/* If an overflow occured when multiplying by 26, the result
will not be a multiple of 26. */
if ((*ret % 26) != 0)
return NULL;
val *= 26;
if (mangled[0] >= 'a' && mangled[0] <= 'z')
{
(*ret) += mangled[0] - 'a';
val += mangled[0] - 'a';
if ((long) val <= 0)
break;
*ret = val;
return mangled + 1;
}
(*ret) += mangled[0] - 'A';
val += mangled[0] - 'A';
mangled++;
}
@ -337,7 +351,7 @@ dlang_backref (const char *mangled, const char **ret, struct dlang_info *info)
if (mangled == NULL)
return NULL;
if (refpos <= 0 || refpos > qpos - info->s)
if (refpos > qpos - info->s)
return NULL;
/* Set the position of the back reference. */
@ -359,7 +373,7 @@ dlang_symbol_backref (string *decl, const char *mangled,
^
*/
const char *backref;
long len;
unsigned long len;
/* Get position of the back reference. */
mangled = dlang_backref (mangled, &backref, info);
@ -435,7 +449,7 @@ dlang_symbol_name_p (const char *mangled, struct dlang_info *info)
return 0;
mangled = dlang_decode_backref (mangled + 1, &ret);
if (mangled == NULL || ret <= 0 || ret > qref - info->s)
if (mangled == NULL || ret > qref - info->s)
return 0;
return ISDIGIT (qref[-ret]);
@ -699,6 +713,15 @@ dlang_function_args (string *decl, const char *mangled, struct dlang_info *info)
switch (*mangled)
{
case 'I': /* in(T) */
mangled++;
string_append (decl, "in ");
if (*mangled == 'K') /* in ref(T) */
{
mangled++;
string_append (decl, "ref ");
}
break;
case 'J': /* out(T) */
mangled++;
string_append (decl, "out ");
@ -826,7 +849,6 @@ dlang_type (string *decl, const char *mangled, struct dlang_info *info)
mangled = dlang_function_type (decl, mangled, info);
string_append (decl, "function");
return mangled;
case 'I': /* ident T */
case 'C': /* class T */
case 'S': /* struct T */
case 'E': /* enum T */
@ -985,7 +1007,7 @@ dlang_type (string *decl, const char *mangled, struct dlang_info *info)
static const char *
dlang_identifier (string *decl, const char *mangled, struct dlang_info *info)
{
long len;
unsigned long len;
if (mangled == NULL || *mangled == '\0')
return NULL;
@ -1003,7 +1025,7 @@ dlang_identifier (string *decl, const char *mangled, struct dlang_info *info)
if (endptr == NULL || len == 0)
return NULL;
if (strlen (endptr) < (size_t) len)
if (strlen (endptr) < len)
return NULL;
mangled = endptr;
@ -1020,7 +1042,7 @@ dlang_identifier (string *decl, const char *mangled, struct dlang_info *info)
with special treatment for some magic compiler generted symbols.
Return the remaining string on success or NULL on failure. */
static const char *
dlang_lname (string *decl, const char *mangled, long len)
dlang_lname (string *decl, const char *mangled, unsigned long len)
{
switch (len)
{
@ -1119,7 +1141,7 @@ dlang_parse_integer (string *decl, const char *mangled, char type)
char value[20];
int pos = sizeof(value);
int width = 0;
long val;
unsigned long val;
mangled = dlang_number (mangled, &val);
if (mangled == NULL)
@ -1175,7 +1197,7 @@ dlang_parse_integer (string *decl, const char *mangled, char type)
else if (type == 'b')
{
/* Parse boolean value. */
long val;
unsigned long val;
mangled = dlang_number (mangled, &val);
if (mangled == NULL)
@ -1294,7 +1316,7 @@ static const char *
dlang_parse_string (string *decl, const char *mangled)
{
char type = *mangled;
long len;
unsigned long len;
mangled++;
mangled = dlang_number (mangled, &len);
@ -1358,7 +1380,7 @@ dlang_parse_string (string *decl, const char *mangled)
static const char *
dlang_parse_arrayliteral (string *decl, const char *mangled)
{
long elements;
unsigned long elements;
mangled = dlang_number (mangled, &elements);
if (mangled == NULL)
@ -1384,7 +1406,7 @@ dlang_parse_arrayliteral (string *decl, const char *mangled)
static const char *
dlang_parse_assocarray (string *decl, const char *mangled)
{
long elements;
unsigned long elements;
mangled = dlang_number (mangled, &elements);
if (mangled == NULL)
@ -1415,7 +1437,7 @@ dlang_parse_assocarray (string *decl, const char *mangled)
static const char *
dlang_parse_structlit (string *decl, const char *mangled, const char *name)
{
long args;
unsigned long args;
mangled = dlang_number (mangled, &args);
if (mangled == NULL)
@ -1642,7 +1664,7 @@ dlang_parse_qualified (string *decl, const char *mangled,
static const char *
dlang_parse_tuple (string *decl, const char *mangled, struct dlang_info *info)
{
long elements;
unsigned long elements;
mangled = dlang_number (mangled, &elements);
if (mangled == NULL)
@ -1677,7 +1699,7 @@ dlang_template_symbol_param (string *decl, const char *mangled,
if (*mangled == 'Q')
return dlang_parse_qualified (decl, mangled, info, 0);
long len;
unsigned long len;
const char *endptr = dlang_number (mangled, &len);
if (endptr == NULL || len == 0)
@ -1790,12 +1812,12 @@ dlang_template_args (string *decl, const char *mangled, struct dlang_info *info)
}
case 'X': /* Externally mangled parameter. */
{
long len;
unsigned long len;
const char *endptr;
mangled++;
endptr = dlang_number (mangled, &len);
if (endptr == NULL || strlen (endptr) < (size_t) len)
if (endptr == NULL || strlen (endptr) < len)
return NULL;
string_appendn (decl, endptr, len);
@ -1815,7 +1837,7 @@ dlang_template_args (string *decl, const char *mangled, struct dlang_info *info)
Returns the remaining signature on success or NULL on failure. */
static const char *
dlang_parse_template (string *decl, const char *mangled,
struct dlang_info *info, long len)
struct dlang_info *info, unsigned long len)
{
const char *start = mangled;
string args;
@ -1851,7 +1873,9 @@ dlang_parse_template (string *decl, const char *mangled,
string_delete (&args);
/* Check for template name length mismatch. */
if (len != TEMPLATE_LENGTH_UNKNOWN && mangled && (mangled - start) != len)
if (len != TEMPLATE_LENGTH_UNKNOWN
&& mangled
&& (unsigned long) (mangled - start) != len)
return NULL;
return mangled;

View File

@ -1467,6 +1467,11 @@ simple_object_elf_copy_lto_debug_sections (simple_object_read *sobj,
&& st_shndx < shnum
&& pfnret[st_shndx - 1] == -1)
discard = 1;
/* We also need to remove global UNDEFs which can
cause link fails later. */
else if (st_shndx == SHN_UNDEF
&& ELF_ST_BIND (*st_info) == STB_GLOBAL)
discard = 1;
if (discard)
{

View File

@ -274,14 +274,6 @@ _D8demangle4testFNhG4dZv
demangle.test(__vector(double[4]))
#
--format=dlang
_D8demangle4testFI5identZv
demangle.test(ident)
#
--format=dlang
_D8demangle4testFI5ident4testZv
demangle.test(ident.test)
#
--format=dlang
_D8demangle4testFC5classZv
demangle.test(class)
#
@ -314,6 +306,14 @@ _D8demangle4testFT7typedef4testZv
demangle.test(typedef.test)
#
--format=dlang
_D8demangle4testFIaZv
demangle.test(in char)
#
--format=dlang
_D8demangle4testFIKaZv
demangle.test(in ref char)
#
--format=dlang
_D8demangle4testFJaZv
demangle.test(out char)
#
@ -1140,6 +1140,14 @@ _D4test34__T3barVG3uw3_616263VG3wd3_646566Z1xi
test.bar!("abc"w, "def"d).x
#
--format=dlang
_D4test21__T3funVwi4294967295Z3funFNaNbNiNfZv
test.fun!('\Uffffffff').fun()
#
--format=dlang
_D4test21__T3funVwi4294967296Z3funFNaNbNiNfZv
_D4test21__T3funVwi4294967296Z3funFNaNbNiNfZv
#
--format=dlang
_D6plugin8generateFiiZAya
plugin.generate(int, int)
#

File diff suppressed because one or more lines are too long