libiberty: Sync with GCC

Also sync include/simple-object.h, which goes together with the change
in libiberty.
This commit is contained in:
Simon Marchi 2018-06-15 23:07:42 -04:00
parent 37f980dc03
commit 978588dc58
3 changed files with 45 additions and 12 deletions

View file

@ -251,12 +251,15 @@ simple_object_find_section (simple_object_read *sobj, const char *name,
}
/* Callback to identify and rename LTO debug sections by name.
Returns 1 if NAME is a LTO debug section, 0 if not. */
Returns non-NULL if NAME is a LTO debug section, NULL if not.
If RENAME is true it will rename LTO debug sections to non-LTO
ones. */
static char *
handle_lto_debug_sections (const char *name)
handle_lto_debug_sections (const char *name, int rename)
{
char *newname = XCNEWVEC (char, strlen (name) + 1);
char *newname = rename ? XCNEWVEC (char, strlen (name) + 1)
: xstrdup (name);
/* ??? So we can't use .gnu.lto_ prefixed sections as the assembler
complains about bogus section flags. Which means we need to arrange
@ -265,22 +268,24 @@ handle_lto_debug_sections (const char *name)
/* Also include corresponding reloc sections. */
if (strncmp (name, ".rela", sizeof (".rela") - 1) == 0)
{
strncpy (newname, name, sizeof (".rela") - 1);
if (rename)
strncpy (newname, name, sizeof (".rela") - 1);
name += sizeof (".rela") - 1;
}
else if (strncmp (name, ".rel", sizeof (".rel") - 1) == 0)
{
strncpy (newname, name, sizeof (".rel") - 1);
if (rename)
strncpy (newname, name, sizeof (".rel") - 1);
name += sizeof (".rel") - 1;
}
/* ??? For now this handles both .gnu.lto_ and .gnu.debuglto_ prefixed
sections. */
/* Copy LTO debug sections and rename them to their non-LTO name. */
if (strncmp (name, ".gnu.debuglto_", sizeof (".gnu.debuglto_") - 1) == 0)
return strcat (newname, name + sizeof (".gnu.debuglto_") - 1);
return rename ? strcat (newname, name + sizeof (".gnu.debuglto_") - 1) : newname;
else if (strncmp (name, ".gnu.lto_.debug_",
sizeof (".gnu.lto_.debug_") -1) == 0)
return strcat (newname, name + sizeof (".gnu.lto_") - 1);
return rename ? strcat (newname, name + sizeof (".gnu.lto_") - 1) : newname;
/* Copy over .note.GNU-stack section under the same name if present. */
else if (strcmp (name, ".note.GNU-stack") == 0)
return strcpy (newname, name);
@ -289,14 +294,31 @@ handle_lto_debug_sections (const char *name)
COMDAT sections in objects produced by GCC. */
else if (strcmp (name, ".comment") == 0)
return strcpy (newname, name);
free (newname);
return NULL;
}
/* Wrapper for handle_lto_debug_sections. */
static char *
handle_lto_debug_sections_rename (const char *name)
{
return handle_lto_debug_sections (name, 1);
}
/* Wrapper for handle_lto_debug_sections. */
static char *
handle_lto_debug_sections_norename (const char *name)
{
return handle_lto_debug_sections (name, 0);
}
/* Copy LTO debug sections. */
const char *
simple_object_copy_lto_debug_sections (simple_object_read *sobj,
const char *dest, int *err)
const char *dest, int *err, int rename)
{
const char *errmsg;
simple_object_write *dest_sobj;
@ -317,9 +339,10 @@ simple_object_copy_lto_debug_sections (simple_object_read *sobj,
if (! dest_sobj)
return errmsg;
errmsg = sobj->functions->copy_lto_debug_sections (sobj, dest_sobj,
handle_lto_debug_sections,
err);
errmsg = sobj->functions->copy_lto_debug_sections
(sobj, dest_sobj,
rename ? handle_lto_debug_sections_rename
: handle_lto_debug_sections_norename, err);
if (errmsg)
{
simple_object_release_write (dest_sobj);