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> 2020-07-30 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* largefile.m4 (ACX_LARGEFILE) <sparc-*-solaris*|i?86-*-solaris*>: * largefile.m4 (ACX_LARGEFILE) <sparc-*-solaris*|i?86-*-solaris*>:

View File

@ -13,7 +13,7 @@ case "$host" in
case "$enable_cet" in case "$enable_cet" in
auto) auto)
# Check if target supports multi-byte NOPs # 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" cet_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fcf-protection" CFLAGS="$CFLAGS -fcf-protection"
AC_COMPILE_IFELSE( AC_COMPILE_IFELSE(
@ -70,7 +70,7 @@ case "$host" in
case "$enable_cet" in case "$enable_cet" in
auto) auto)
# Check if target supports multi-byte NOPs # Check if target supports multi-byte NOPs
# and if assembler supports CET insn. # and if compiler and assembler support CET.
AC_COMPILE_IFELSE( AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM( [AC_LANG_PROGRAM(
[], [],
@ -85,13 +85,26 @@ asm ("setssbsy");
[enable_cet=no]) [enable_cet=no])
;; ;;
yes) yes)
# Check if assembler supports CET. # Check if compiler and assembler support CET.
AC_COMPILE_IFELSE( AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM( [AC_LANG_PROGRAM(
[], [],
[asm ("setssbsy");])], [asm ("setssbsy");])],
[], [support_cet=yes],
[AC_MSG_ERROR([assembler with CET support is required for --enable-cet])]) [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 esac
CFLAGS="$cet_save_CFLAGS" 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> 2020-06-23 Nick Alcock <nick.alcock@oracle.com>
* bsearch_r.c: New file. * 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. * look at item 3.
*/ */
void * void *
bsearch (register const void *key, const void *base0, bsearch (const void *key, const void *base0,
size_t nmemb, register size_t size, size_t nmemb, size_t size,
register int (*compar)(const void *, const void *)) int (*compar)(const void *, const void *))
{ {
register const char *base = (const char *) base0; const char *base = (const char *) base0;
register int lim, cmp; int lim, cmp;
register const void *p; const void *p;
for (lim = nmemb; lim != 0; lim >>= 1) { for (lim = nmemb; lim != 0; lim >>= 1) {
p = base + (lim >> 1) * size; 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. * look at item 3.
*/ */
void * void *
bsearch_r (register const void *key, const void *base0, bsearch_r (const void *key, const void *base0,
size_t nmemb, register size_t size, size_t nmemb, size_t size,
register int (*compar)(const void *, const void *, void *), int (*compar)(const void *, const void *, void *),
void *arg) void *arg)
{ {
register const char *base = (const char *) base0; const char *base = (const char *) base0;
register int lim, cmp; int lim, cmp;
register const void *p; const void *p;
for (lim = nmemb; lim != 0; lim >>= 1) { for (lim = nmemb; lim != 0; lim >>= 1) {
p = base + (lim >> 1) * size; p = base + (lim >> 1) * size;

21
libiberty/configure vendored
View File

@ -5291,7 +5291,7 @@ case "$host" in
case "$enable_cet" in case "$enable_cet" in
auto) auto)
# Check if target supports multi-byte NOPs # 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
@ -5317,7 +5317,7 @@ fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;; ;;
yes) yes)
# Check if assembler supports CET. # Check if compiler and assembler support CET.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
@ -5330,11 +5330,24 @@ asm ("setssbsy");
} }
_ACEOF _ACEOF
if ac_fn_c_try_compile "$LINENO"; then : if ac_fn_c_try_compile "$LINENO"; then :
support_cet=yes
else else
as_fn_error $? "assembler with CET support is required for --enable-cet" "$LINENO" 5 support_cet=no
fi fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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 esac
CFLAGS="$cet_save_CFLAGS" CFLAGS="$cet_save_CFLAGS"

View File

@ -1809,13 +1809,16 @@ const struct demangle_operator_info cplus_demangle_operators[] =
{ "cm", NL (","), 2 }, { "cm", NL (","), 2 },
{ "co", NL ("~"), 1 }, { "co", NL ("~"), 1 },
{ "dV", NL ("/="), 2 }, { "dV", NL ("/="), 2 },
{ "dX", NL ("[...]="), 3 }, /* [expr...expr] = expr */
{ "da", NL ("delete[] "), 1 }, { "da", NL ("delete[] "), 1 },
{ "dc", NL ("dynamic_cast"), 2 }, { "dc", NL ("dynamic_cast"), 2 },
{ "de", NL ("*"), 1 }, { "de", NL ("*"), 1 },
{ "di", NL ("="), 2 }, /* .name = expr */
{ "dl", NL ("delete "), 1 }, { "dl", NL ("delete "), 1 },
{ "ds", NL (".*"), 2 }, { "ds", NL (".*"), 2 },
{ "dt", NL ("."), 2 }, { "dt", NL ("."), 2 },
{ "dv", NL ("/"), 2 }, { "dv", NL ("/"), 2 },
{ "dx", NL ("]="), 2 }, /* [expr] = expr */
{ "eO", NL ("^="), 2 }, { "eO", NL ("^="), 2 },
{ "eo", NL ("^"), 2 }, { "eo", NL ("^"), 2 },
{ "eq", 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>
::= sr <type> <unqualified-name> <template-args> ::= sr <type> <unqualified-name> <template-args>
::= <expr-primary> ::= <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 * static inline struct demangle_component *
@ -3453,6 +3462,8 @@ d_expression_1 (struct d_info *di)
else if (code[0] == 'f') else if (code[0] == 'f')
/* fold-expression. */ /* fold-expression. */
left = d_operator_name (di); left = d_operator_name (di);
else if (!strcmp (code, "di"))
left = d_unqualified_name (di);
else else
left = d_expression_1 (di); left = d_expression_1 (di);
if (!strcmp (code, "cl")) if (!strcmp (code, "cl"))
@ -3480,7 +3491,8 @@ d_expression_1 (struct d_info *di)
if (code == NULL) if (code == NULL)
return NULL; return NULL;
else if (!strcmp (code, "qu")) else if (!strcmp (code, "qu")
|| !strcmp (code, "dX"))
{ {
/* ?: expression. */ /* ?: expression. */
first = d_expression_1 (di); first = d_expression_1 (di);
@ -3764,9 +3776,6 @@ d_lambda (struct d_info *di)
ret->u.s_unary_num.num = num; ret->u.s_unary_num.num = num;
} }
if (! d_add_substitution (di, ret))
return NULL;
return ret; return ret;
} }
@ -4675,6 +4684,64 @@ d_maybe_print_fold_expression (struct d_print_info *dpi, int options,
return 1; 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. */ /* Subroutine to handle components. */
static void 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)) if (d_maybe_print_fold_expression (dpi, options, dc))
return; return;
if (d_maybe_print_designated_init (dpi, options, dc))
return;
/* We wrap an expression which uses the greater-than operator in /* We wrap an expression which uses the greater-than operator in
an extra layer of parens so that it does not get confused an extra layer of parens so that it does not get confused
with the '>' which ends the template parameters. */ 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)) if (d_maybe_print_fold_expression (dpi, options, dc))
return; return;
if (d_maybe_print_designated_init (dpi, options, dc))
return;
{ {
struct demangle_component *op = d_left (dc); struct demangle_component *op = d_left (dc);
struct demangle_component *first = d_left (d_right (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 #ifdef HAVE_CONFIG_H
#include "config.h" #include "config.h"
#endif #endif
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#include "safe-ctype.h" #include "safe-ctype.h"
@ -45,6 +48,13 @@ If not, see <http://www.gnu.org/licenses/>. */
#include <demangle.h> #include <demangle.h>
#include "libiberty.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 */ /* A mini string-handling package */
typedef struct string /* Beware: these aren't required to be */ 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; } string;
static void static void
string_need (string *s, int n) string_need (string *s, size_t n)
{ {
int tem; size_t tem;
if (s->b == NULL) if (s->b == NULL)
{ {
@ -68,7 +78,7 @@ string_need (string *s, int n)
s->p = s->b = XNEWVEC (char, n); s->p = s->b = XNEWVEC (char, n);
s->e = s->b + 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; tem = s->p - s->b;
n += tem; n += tem;
@ -117,14 +127,14 @@ string_setlength (string *s, int n)
static void static void
string_append (string *p, const char *s) string_append (string *p, const char *s)
{ {
int n = strlen (s); size_t n = strlen (s);
string_need (p, n); string_need (p, n);
memcpy (p->p, s, n); memcpy (p->p, s, n);
p->p += n; p->p += n;
} }
static void static void
string_appendn (string *p, const char *s, int n) string_appendn (string *p, const char *s, size_t n)
{ {
if (n != 0) if (n != 0)
{ {
@ -135,7 +145,7 @@ string_appendn (string *p, const char *s, int n)
} }
static void static void
string_prependn (string *p, const char *s, int n) string_prependn (string *p, const char *s, size_t n)
{ {
char *q; char *q;
@ -170,7 +180,7 @@ struct dlang_info
}; };
/* Pass as the LEN to dlang_parse_template if symbol length is not known. */ /* 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 */ /* Prototypes for forward referenced functions */
static const char *dlang_function_type (string *, const char *, 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 *); struct dlang_info *);
static const char *dlang_parse_template (string *, const char *, 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. /* 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 * 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. */ /* Return NULL if trying to extract something that isn't a digit. */
if (mangled == NULL || !ISDIGIT (*mangled)) if (mangled == NULL || !ISDIGIT (*mangled))
return NULL; return NULL;
(*ret) = 0; unsigned long val = 0;
while (ISDIGIT (*mangled)) while (ISDIGIT (*mangled))
{ {
(*ret) *= 10; unsigned long digit = mangled[0] - '0';
/* If an overflow occured when multiplying by ten, the result /* Check for overflow. */
will not be a multiple of ten. */ if (val > (UINT_MAX - digit) / 10)
if ((*ret % 10) != 0)
return NULL; return NULL;
(*ret) += mangled[0] - '0'; val = val * 10 + digit;
mangled++; mangled++;
} }
if (*mangled == '\0' || *ret < 0) if (*mangled == '\0')
return NULL; return NULL;
*ret = val;
return mangled; return mangled;
} }
@ -273,7 +284,8 @@ dlang_call_convention_p (const char *mangled)
} }
/* Extract the back reference position from MANGLED, and assign the result /* 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 * static const char *
dlang_decode_backref (const char *mangled, long *ret) dlang_decode_backref (const char *mangled, long *ret)
{ {
@ -294,24 +306,26 @@ dlang_decode_backref (const char *mangled, long *ret)
[A-Z] NumberBackRef [A-Z] NumberBackRef
^ ^
*/ */
(*ret) = 0; unsigned long val = 0;
while (ISALPHA (*mangled)) 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 val *= 26;
will not be a multiple of 26. */
if ((*ret % 26) != 0)
return NULL;
if (mangled[0] >= 'a' && mangled[0] <= 'z') 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; return mangled + 1;
} }
(*ret) += mangled[0] - 'A'; val += mangled[0] - 'A';
mangled++; mangled++;
} }
@ -337,7 +351,7 @@ dlang_backref (const char *mangled, const char **ret, struct dlang_info *info)
if (mangled == NULL) if (mangled == NULL)
return NULL; return NULL;
if (refpos <= 0 || refpos > qpos - info->s) if (refpos > qpos - info->s)
return NULL; return NULL;
/* Set the position of the back reference. */ /* Set the position of the back reference. */
@ -359,7 +373,7 @@ dlang_symbol_backref (string *decl, const char *mangled,
^ ^
*/ */
const char *backref; const char *backref;
long len; unsigned long len;
/* Get position of the back reference. */ /* Get position of the back reference. */
mangled = dlang_backref (mangled, &backref, info); mangled = dlang_backref (mangled, &backref, info);
@ -435,7 +449,7 @@ dlang_symbol_name_p (const char *mangled, struct dlang_info *info)
return 0; return 0;
mangled = dlang_decode_backref (mangled + 1, &ret); 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 0;
return ISDIGIT (qref[-ret]); return ISDIGIT (qref[-ret]);
@ -699,6 +713,15 @@ dlang_function_args (string *decl, const char *mangled, struct dlang_info *info)
switch (*mangled) 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) */ case 'J': /* out(T) */
mangled++; mangled++;
string_append (decl, "out "); 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); mangled = dlang_function_type (decl, mangled, info);
string_append (decl, "function"); string_append (decl, "function");
return mangled; return mangled;
case 'I': /* ident T */
case 'C': /* class T */ case 'C': /* class T */
case 'S': /* struct T */ case 'S': /* struct T */
case 'E': /* enum T */ case 'E': /* enum T */
@ -985,7 +1007,7 @@ dlang_type (string *decl, const char *mangled, struct dlang_info *info)
static const char * static const char *
dlang_identifier (string *decl, const char *mangled, struct dlang_info *info) dlang_identifier (string *decl, const char *mangled, struct dlang_info *info)
{ {
long len; unsigned long len;
if (mangled == NULL || *mangled == '\0') if (mangled == NULL || *mangled == '\0')
return NULL; return NULL;
@ -1003,7 +1025,7 @@ dlang_identifier (string *decl, const char *mangled, struct dlang_info *info)
if (endptr == NULL || len == 0) if (endptr == NULL || len == 0)
return NULL; return NULL;
if (strlen (endptr) < (size_t) len) if (strlen (endptr) < len)
return NULL; return NULL;
mangled = endptr; 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. with special treatment for some magic compiler generted symbols.
Return the remaining string on success or NULL on failure. */ Return the remaining string on success or NULL on failure. */
static const char * static const char *
dlang_lname (string *decl, const char *mangled, long len) dlang_lname (string *decl, const char *mangled, unsigned long len)
{ {
switch (len) switch (len)
{ {
@ -1119,7 +1141,7 @@ dlang_parse_integer (string *decl, const char *mangled, char type)
char value[20]; char value[20];
int pos = sizeof(value); int pos = sizeof(value);
int width = 0; int width = 0;
long val; unsigned long val;
mangled = dlang_number (mangled, &val); mangled = dlang_number (mangled, &val);
if (mangled == NULL) if (mangled == NULL)
@ -1175,7 +1197,7 @@ dlang_parse_integer (string *decl, const char *mangled, char type)
else if (type == 'b') else if (type == 'b')
{ {
/* Parse boolean value. */ /* Parse boolean value. */
long val; unsigned long val;
mangled = dlang_number (mangled, &val); mangled = dlang_number (mangled, &val);
if (mangled == NULL) if (mangled == NULL)
@ -1294,7 +1316,7 @@ static const char *
dlang_parse_string (string *decl, const char *mangled) dlang_parse_string (string *decl, const char *mangled)
{ {
char type = *mangled; char type = *mangled;
long len; unsigned long len;
mangled++; mangled++;
mangled = dlang_number (mangled, &len); mangled = dlang_number (mangled, &len);
@ -1358,7 +1380,7 @@ dlang_parse_string (string *decl, const char *mangled)
static const char * static const char *
dlang_parse_arrayliteral (string *decl, const char *mangled) dlang_parse_arrayliteral (string *decl, const char *mangled)
{ {
long elements; unsigned long elements;
mangled = dlang_number (mangled, &elements); mangled = dlang_number (mangled, &elements);
if (mangled == NULL) if (mangled == NULL)
@ -1384,7 +1406,7 @@ dlang_parse_arrayliteral (string *decl, const char *mangled)
static const char * static const char *
dlang_parse_assocarray (string *decl, const char *mangled) dlang_parse_assocarray (string *decl, const char *mangled)
{ {
long elements; unsigned long elements;
mangled = dlang_number (mangled, &elements); mangled = dlang_number (mangled, &elements);
if (mangled == NULL) if (mangled == NULL)
@ -1415,7 +1437,7 @@ dlang_parse_assocarray (string *decl, const char *mangled)
static const char * static const char *
dlang_parse_structlit (string *decl, const char *mangled, const char *name) dlang_parse_structlit (string *decl, const char *mangled, const char *name)
{ {
long args; unsigned long args;
mangled = dlang_number (mangled, &args); mangled = dlang_number (mangled, &args);
if (mangled == NULL) if (mangled == NULL)
@ -1642,7 +1664,7 @@ dlang_parse_qualified (string *decl, const char *mangled,
static const char * static const char *
dlang_parse_tuple (string *decl, const char *mangled, struct dlang_info *info) dlang_parse_tuple (string *decl, const char *mangled, struct dlang_info *info)
{ {
long elements; unsigned long elements;
mangled = dlang_number (mangled, &elements); mangled = dlang_number (mangled, &elements);
if (mangled == NULL) if (mangled == NULL)
@ -1677,7 +1699,7 @@ dlang_template_symbol_param (string *decl, const char *mangled,
if (*mangled == 'Q') if (*mangled == 'Q')
return dlang_parse_qualified (decl, mangled, info, 0); return dlang_parse_qualified (decl, mangled, info, 0);
long len; unsigned long len;
const char *endptr = dlang_number (mangled, &len); const char *endptr = dlang_number (mangled, &len);
if (endptr == NULL || len == 0) 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. */ case 'X': /* Externally mangled parameter. */
{ {
long len; unsigned long len;
const char *endptr; const char *endptr;
mangled++; mangled++;
endptr = dlang_number (mangled, &len); endptr = dlang_number (mangled, &len);
if (endptr == NULL || strlen (endptr) < (size_t) len) if (endptr == NULL || strlen (endptr) < len)
return NULL; return NULL;
string_appendn (decl, endptr, len); 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. */ Returns the remaining signature on success or NULL on failure. */
static const char * static const char *
dlang_parse_template (string *decl, const char *mangled, 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; const char *start = mangled;
string args; string args;
@ -1851,7 +1873,9 @@ dlang_parse_template (string *decl, const char *mangled,
string_delete (&args); string_delete (&args);
/* Check for template name length mismatch. */ /* 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 NULL;
return mangled; return mangled;

View File

@ -1467,6 +1467,11 @@ simple_object_elf_copy_lto_debug_sections (simple_object_read *sobj,
&& st_shndx < shnum && st_shndx < shnum
&& pfnret[st_shndx - 1] == -1) && pfnret[st_shndx - 1] == -1)
discard = 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) if (discard)
{ {

View File

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

File diff suppressed because one or more lines are too long