Import latest fixes to libiberty from GCC.
PR lto/81968 * simple-object-elf.c (simple_object_elf_copy_lto_debug_section): Keep names of removed global symbols. * simple-object-xcoff.c (simple_object_xcoff_find_sections): Improve .go_export csect handling. Don't make assumptions on containing section or number of auxiliary entries. PR lto/81968 * simple-object-elf.c (simple_object_elf_copy_lto_debug_section): Adjust field with for sh_type write, set SHF_EXCLUDE only for removed sections. PR lto/81925 * simple-object-elf.c (simple_object_elf_write_shdr): Adjust type of sh_addralign and sh_entsize and properly write sh_entsize as Elf_Addr. (simple_object_elf_write_to_file): Read sh_entsize as Elf_Addr. * simple-object-common.h (struct simple_object_functions): Add copy_lto_debug_sections hook. * simple-object.c: Include fcntl.h. (handle_lto_debug_sections): New helper function. (simple_object_copy_lto_debug_sections): New function copying early LTO debug sections to regular debug sections in a new file. (simple_object_start_write): Handle NULL segment_name. * simple-object-coff.c (simple_object_coff_functions): Adjust for not implemented copy_lto_debug_sections hook. * simple-object-mach-o.c (simple_object_mach_o_functions): Likewise. * simple-object-xcoff.c (simple_object_xcoff_functions): Likewise. * simple-object-elf.c (SHT_NULL, SHT_SYMTAB, SHT_RELA, SHT_REL, SHT_GROUP): Add various sectopn header types. (SHF_EXCLUDE): Add flag. (Elf32_External_Sym, Elf64_External_Sym): Add symbol struct. (ELF_ST_BIND, ELF_ST_TYPE, ELF_ST_INFO): Add accessors. (STT_OBJECT, STT_FUNC, STT_TLS, STT_GNU_IFUNC): Add Symbol types. (STV_DEFAULT): Add symbol visibility. (SHN_COMMON): Add special section index name. (struct simple_object_elf_write): New. (simple_object_elf_start_write): Adjust for new private data. (simple_object_elf_write_shdr): Pass in values for all fields we write. (simple_object_elf_write_to_file): Adjust. Copy from recorded section headers if requested. (simple_object_elf_release_write): Release private data. (simple_object_elf_copy_lto_debug_sections): Copy and rename sections as denoted by PFN and all their dependences, symbols and relocations to the empty destination file. (simple_object_elf_functions): Adjust for copy_lto_debug_sections hook. * simple-object-xcoff.c (simple_object_xcoff_find_sections): Search symbol table for .go_export symbol and apply pfn if found.
This commit is contained in:
parent
2a143b99fc
commit
f8ad251375
7 changed files with 802 additions and 36 deletions
|
@ -22,6 +22,7 @@ Boston, MA 02110-1301, USA. */
|
|||
#include "simple-object.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
|
@ -249,6 +250,86 @@ simple_object_find_section (simple_object_read *sobj, const char *name,
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* Callback to identify and rename LTO debug sections by name.
|
||||
Returns 1 if NAME is a LTO debug section, 0 if not. */
|
||||
|
||||
static int
|
||||
handle_lto_debug_sections (const char **name)
|
||||
{
|
||||
/* ??? So we can't use .gnu.lto_ prefixed sections as the assembler
|
||||
complains about bogus section flags. Which means we need to arrange
|
||||
for that to be fixed or .gnu.debuglto_ marked as SHF_EXCLUDE (to make
|
||||
fat lto object tooling work for the fat part). */
|
||||
/* ??? 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)
|
||||
{
|
||||
*name = *name + sizeof (".gnu.debuglto_") - 1;
|
||||
return 1;
|
||||
}
|
||||
else if (strncmp (*name, ".gnu.lto_.debug_", sizeof (".gnu.lto_.debug_") -1) == 0)
|
||||
{
|
||||
*name = *name + sizeof (".gnu.lto_") - 1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Copy LTO debug sections. */
|
||||
|
||||
const char *
|
||||
simple_object_copy_lto_debug_sections (simple_object_read *sobj,
|
||||
const char *dest, int *err)
|
||||
{
|
||||
const char *errmsg;
|
||||
simple_object_write *dest_sobj;
|
||||
simple_object_attributes *attrs;
|
||||
int outfd;
|
||||
|
||||
if (! sobj->functions->copy_lto_debug_sections)
|
||||
{
|
||||
*err = EINVAL;
|
||||
return "simple_object_copy_lto_debug_sections not implemented";
|
||||
}
|
||||
|
||||
attrs = simple_object_fetch_attributes (sobj, &errmsg, err);
|
||||
if (! attrs)
|
||||
return errmsg;
|
||||
dest_sobj = simple_object_start_write (attrs, NULL, &errmsg, err);
|
||||
simple_object_release_attributes (attrs);
|
||||
if (! dest_sobj)
|
||||
return errmsg;
|
||||
|
||||
errmsg = sobj->functions->copy_lto_debug_sections (sobj, dest_sobj,
|
||||
handle_lto_debug_sections,
|
||||
err);
|
||||
if (errmsg)
|
||||
{
|
||||
simple_object_release_write (dest_sobj);
|
||||
return errmsg;
|
||||
}
|
||||
|
||||
outfd = creat (dest, 00777);
|
||||
if (outfd == -1)
|
||||
{
|
||||
*err = errno;
|
||||
simple_object_release_write (dest_sobj);
|
||||
return "open failed";
|
||||
}
|
||||
|
||||
errmsg = simple_object_write_to_file (dest_sobj, outfd, err);
|
||||
close (outfd);
|
||||
if (errmsg)
|
||||
{
|
||||
simple_object_release_write (dest_sobj);
|
||||
return errmsg;
|
||||
}
|
||||
|
||||
simple_object_release_write (dest_sobj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Fetch attributes. */
|
||||
|
||||
simple_object_attributes *
|
||||
|
@ -315,7 +396,7 @@ simple_object_start_write (simple_object_attributes *attrs,
|
|||
return NULL;
|
||||
ret = XNEW (simple_object_write);
|
||||
ret->functions = attrs->functions;
|
||||
ret->segment_name = xstrdup (segment_name);
|
||||
ret->segment_name = segment_name ? xstrdup (segment_name) : NULL;
|
||||
ret->sections = NULL;
|
||||
ret->last_section = NULL;
|
||||
ret->data = data;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue