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

@ -198,12 +198,15 @@ extern void
simple_object_release_write (simple_object_write *);
/* Copy LTO debug sections from SRC_OBJECT to DEST.
If RENAME is true, rename LTO debug section into debug section (i.e.
when producing final binary) and if it is false, keep the sections with
original names (when incrementally linking).
If an error occurs, return the errno value in ERR and an error string. */
extern const char *
simple_object_copy_lto_debug_sections (simple_object_read *src_object,
const char *dest,
int *err);
int *err, int rename);
#ifdef __cplusplus
}

View File

@ -1,3 +1,10 @@
2018-05-30 Jan Hubicka <hubicka@ucw.cz>
* simple-object.c (handle_lto_debug_sections): Add rename parameter.
(handle_lto_debug_sections_rename): New function.
(handle_lto_debug_sections_norename): New function.
(simple_object_copy_lto_debug_sections): Add rename parameter.
2018-05-28 Bernd Edlinger <bernd.edlinger@hotmail.de>
* splay-tree.c (splay_tree_compare_strings,

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);