gcc/lto-plugin/lto-plugin.c

1036 lines
26 KiB
C
Raw Normal View History

configure.ac (build_lto_plugin): New shell variable. ChangeLog: 2010-10-07 Dave Korn <dave.korn.cygwin@gmail.com> * configure.ac (build_lto_plugin): New shell variable. (--enable-lto): Turn on by default for all non-ELF platforms that have had LTO support added so far. Set build_lto_plugin appropriately for both ELF and non-ELF. (configdirs): Add lto-plugin or not based on build_lto_plugin. * configure: Regenerate. gcc/ChangeLog: 2010-10-07 Dave Korn <dave.korn.cygwin@gmail.com> * config.host (host_lto_plugin_soname): New shell variable. * configure.ac (LTOPLUGINSONAME): Add an AC_DEFINE for the above. * config.in: Regenerate. * configure: Regenerate. * gcc.c (main): Use LTOPLUGINSONAME instead of hard-coding name of LTO plugin shared library. lto-plugin/ChangeLog: 2010-10-07 Dave Korn <dave.korn.cygwin@gmail.com> * configure.ac: Source config.gcc to determine lto_binary_reader. (LTO_FORMAT): New AC_SUBST variable inferred from lto_binary_reader. * Makefile.am (LTO_FORMAT): Import. (liblto_plugin_la_SOURCES): Add object format dependent module defined by LTO_FORMAT. (liblto_plugin_la_LIBADD): Allow for both PIC and non-PIC libiberty, and work around libtool warning. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (struct sym_aux): Move to new lto-plugin.h. (struct sym_aux): Likewise. (struct plugin_symtab): Likewise. (struct plugin_file_info): Likewise. (LTO_SECTION_PREFIX): Likewise. (add_symbols): Make non-static. (claimed_files): Likewise. (num_claimed_files): Likewise. (check): Likewise. (parse_table_entry): Likewise. (translate): Likewise. (resolve_conflicts): Likewise. (process_symtab): Move to new lto-plugin-elf.c object format dependent source file. (claim_file_handler): Likewise, and make non-static. (onload): Call new onload_format_checks function. * lto-plugin.h: New file. (LTO_SECTION_PREFIX): Move here. (struct sym_aux): Likewise. (struct plugin_symtab): Likewise. (struct plugin_file_info): Likewise. (claim_file_handler): Add new function prototype. (onload_format_checks): Likewise. (check): Declare extern. (translate): Likewise. (parse_table_entry): Likewise. (resolve_conflicts): Likewise. (add_symbols): Likewise. (claimed_files): Likewise. (num_claimed_files): Likewise. * lto-plugin-elf.c (process_symtab): Move here. (claim_file_handler): Likewise, and make non-static. (onload_format_checks): New function factored out from onload. * lto-plugin-coff.c (claim_file_handler): New function stub. (onload_format_checks): Likewise. From-SVN: r165133
2010-10-07 22:28:59 +02:00
/* LTO plugin for gold and/or GNU ld.
Copyright (C) 2009, 2010 Free Software Foundation, Inc.
Contributed by Rafael Avila de Espindola (espindola@google.com).
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
/* The plugin has only one external function: onload. Gold passes it an array of
function that the plugin uses to communicate back to gold.
With the functions provided by gold, the plugin can be notified when
gold first analyzes a file and pass a symbol table back to gold. The plugin
is also notified when all symbols have been read and it is time to generate
machine code for the necessary symbols.
More information at http://gcc.gnu.org/wiki/whopr/driver.
This plugin should be passed the lto-wrapper options and will forward them.
It also has 2 options of its own:
-debug: Print the command line used to run lto-wrapper.
-nop: Instead of running lto-wrapper, pass the original to the plugin. This
only works if the input files are hybrid. */
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#if HAVE_STDINT_H
#include <stdint.h>
#endif
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h>
#endif
#ifndef WIFEXITED
#define WIFEXITED(S) (((S) & 0xff) == 0)
#endif
#ifndef WEXITSTATUS
#define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
#endif
#include <libiberty.h>
#include <hashtab.h>
#include "../gcc/lto/common.h"
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
#include "simple-object.h"
#include "plugin-api.h"
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
/* Handle opening elf files on hosts, such as Windows, that may use
text file handling that will break binary access. */
#ifndef O_BINARY
# define O_BINARY 0
#endif
/* Segment name for LTO sections. This is only used for Mach-O.
FIXME: This needs to be kept in sync with darwin.c. */
#define LTO_SEGMENT_NAME "__GNU_LTO"
/* LTO magic section name. */
#define LTO_SECTION_PREFIX ".gnu.lto_.symtab"
#define LTO_SECTION_PREFIX_LEN (sizeof (LTO_SECTION_PREFIX) - 1)
/* The part of the symbol table the plugin has to keep track of. Note that we
must keep SYMS until all_symbols_read is called to give the linker time to
copy the symbol information. */
struct sym_aux
{
uint32_t slot;
unsigned id;
unsigned next_conflict;
};
struct plugin_symtab
{
int nsyms;
struct sym_aux *aux;
struct ld_plugin_symbol *syms;
unsigned id;
};
/* Encapsulates object file data during symbol scan. */
struct plugin_objfile
{
int found;
simple_object_read *objfile;
struct plugin_symtab *out;
const struct ld_plugin_input_file *file;
};
/* All that we have to remember about a file. */
struct plugin_file_info
{
char *name;
void *handle;
struct plugin_symtab symtab;
struct plugin_symtab conflicts;
};
/* Until ASM_OUTPUT_LABELREF can be hookized and decoupled from
stdio file streams, we do simple label translation here. */
enum symbol_style
{
ss_none, /* No underscore prefix. */
ss_win32, /* Underscore prefix any symbol not beginning with '@'. */
ss_uscore, /* Underscore prefix all symbols. */
};
static char *arguments_file_name;
static ld_plugin_register_claim_file register_claim_file;
static ld_plugin_register_all_symbols_read register_all_symbols_read;
static ld_plugin_get_symbols get_symbols;
static ld_plugin_register_cleanup register_cleanup;
static ld_plugin_add_input_file add_input_file;
static ld_plugin_add_input_library add_input_library;
static ld_plugin_message message;
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
static ld_plugin_add_symbols add_symbols;
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
static struct plugin_file_info *claimed_files = NULL;
static unsigned int num_claimed_files = 0;
static char **output_files = NULL;
static unsigned int num_output_files = 0;
static char **lto_wrapper_argv;
static int lto_wrapper_num_args;
static char **pass_through_items = NULL;
static unsigned int num_pass_through_items;
static char debug;
static char nop;
static char *resolution_file = NULL;
/* The version of gold being used, or -1 if not gold. The number is
MAJOR * 100 + MINOR. */
static int gold_version = -1;
/* Not used by default, but can be overridden at runtime
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
by using -plugin-opt=-sym-style={none,win32,underscore|uscore}
(in fact, only first letter of style arg is checked.) */
static enum symbol_style sym_style = ss_none;
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
static void
check_1 (int gate, enum ld_plugin_level level, const char *text)
{
if (gate)
return;
if (message)
message (level, text);
else
{
/* If there is no nicer way to inform the user, fallback to stderr. */
fprintf (stderr, "%s\n", text);
if (level == LDPL_FATAL)
abort ();
}
}
/* This little wrapper allows check to be called with a non-integer
first argument, such as a pointer that must be non-NULL. We can't
use c99 bool type to coerce it into range, so we explicitly test. */
#define check(GATE, LEVEL, TEXT) check_1 (((GATE) != 0), (LEVEL), (TEXT))
/* Parse an entry of the IL symbol table. The data to be parsed is pointed
by P and the result is written in ENTRY. The slot number is stored in SLOT.
Returns the address of the next entry. */
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
static char *
re PR lto/44992 (ld -r breaks LTO) gcc: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto-opts.c (lto_write_options): Add NULL file_data argument to lto_get_section_name. * lto-section-out.c (lto_destroy_simple_output_block): Likewise. * lto-streamer-out.c (produce_asm): Likewise. (copy_function): Likewise. (produce_symtab): Likewise. (produce_asm_for_decls): Likewise. * lto-streamer.c (lto_get_section_name): Add file_data argument. Rewrite to add random postfix to LTO sections. * lto-streamer.h (lto_file_decl_data): Add next, id, resolutions. (lto_get_section_name): Add file_data argument to prototype. lto: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto.c: Include splay-tree.h (lto_resolution_read): Change to walk file_ids tree and parse extra file_id in resolution file. (lto_section_with_id): Add. (create_subid_section_table): Add. (lwstate): Add. (lto_create_files_from_ids): Add. (lto_file_read): Change to handle sub file ids and create list of file_datas. Add output argument for count. (get_section_data): Pass file_data to lto_get_section_name. (lto_flatten_file): Add. (read_cgraph_and_symbols): Handle linked lists of file_datas. lto-plugin: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto-plugin.c (sym_aux): Add. (plugin_symtab): Remove slots. Add aux and id. (parse_table_entry): Change to use aux instead of slots. (LTO_SECTION_PREFIX): Add. (translate): Improve buffer allocation. Change to append symbols to existing out buffer. (get_section): Remove. (process_symtab): Add. (free_2): Free symtab->aux. (write_resolution): Handle aux instead of slots. Print sub id to resolution file. (claim_file_handler): Clear lto_file. Replace get_symtab/translate calls with call to process_symtab. From-SVN: r162443
2010-07-23 07:33:51 +02:00
parse_table_entry (char *p, struct ld_plugin_symbol *entry,
struct sym_aux *aux)
{
unsigned char t;
enum ld_plugin_symbol_kind translate_kind[] =
{
LDPK_DEF,
LDPK_WEAKDEF,
LDPK_UNDEF,
LDPK_WEAKUNDEF,
LDPK_COMMON
};
enum ld_plugin_symbol_visibility translate_visibility[] =
{
LDPV_DEFAULT,
LDPV_PROTECTED,
LDPV_INTERNAL,
LDPV_HIDDEN
};
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
switch (sym_style)
{
case ss_win32:
if (p[0] == '@')
{
/* cf. Duff's device. */
case ss_none:
entry->name = xstrdup (p);
break;
}
/* FALL-THROUGH. */
case ss_uscore:
entry->name = concat ("_", p, NULL);
break;
default:
check (0, LDPL_FATAL, "invalid symbol style requested");
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
break;
}
while (*p)
p++;
p++;
entry->version = NULL;
entry->comdat_key = p;
while (*p)
p++;
p++;
if (strlen (entry->comdat_key) == 0)
entry->comdat_key = NULL;
else
entry->comdat_key = xstrdup (entry->comdat_key);
t = *p;
check (t <= 4, LDPL_FATAL, "invalid symbol kind found");
entry->def = translate_kind[t];
p++;
t = *p;
check (t <= 3, LDPL_FATAL, "invalid symbol visibility found");
entry->visibility = translate_visibility[t];
p++;
memcpy (&entry->size, p, sizeof (uint64_t));
p += 8;
memcpy (&aux->slot, p, sizeof (uint32_t));
p += 4;
entry->resolution = LDPR_UNKNOWN;
aux->next_conflict = -1;
return p;
}
configure.ac (build_lto_plugin): New shell variable. ChangeLog: 2010-10-07 Dave Korn <dave.korn.cygwin@gmail.com> * configure.ac (build_lto_plugin): New shell variable. (--enable-lto): Turn on by default for all non-ELF platforms that have had LTO support added so far. Set build_lto_plugin appropriately for both ELF and non-ELF. (configdirs): Add lto-plugin or not based on build_lto_plugin. * configure: Regenerate. gcc/ChangeLog: 2010-10-07 Dave Korn <dave.korn.cygwin@gmail.com> * config.host (host_lto_plugin_soname): New shell variable. * configure.ac (LTOPLUGINSONAME): Add an AC_DEFINE for the above. * config.in: Regenerate. * configure: Regenerate. * gcc.c (main): Use LTOPLUGINSONAME instead of hard-coding name of LTO plugin shared library. lto-plugin/ChangeLog: 2010-10-07 Dave Korn <dave.korn.cygwin@gmail.com> * configure.ac: Source config.gcc to determine lto_binary_reader. (LTO_FORMAT): New AC_SUBST variable inferred from lto_binary_reader. * Makefile.am (LTO_FORMAT): Import. (liblto_plugin_la_SOURCES): Add object format dependent module defined by LTO_FORMAT. (liblto_plugin_la_LIBADD): Allow for both PIC and non-PIC libiberty, and work around libtool warning. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (struct sym_aux): Move to new lto-plugin.h. (struct sym_aux): Likewise. (struct plugin_symtab): Likewise. (struct plugin_file_info): Likewise. (LTO_SECTION_PREFIX): Likewise. (add_symbols): Make non-static. (claimed_files): Likewise. (num_claimed_files): Likewise. (check): Likewise. (parse_table_entry): Likewise. (translate): Likewise. (resolve_conflicts): Likewise. (process_symtab): Move to new lto-plugin-elf.c object format dependent source file. (claim_file_handler): Likewise, and make non-static. (onload): Call new onload_format_checks function. * lto-plugin.h: New file. (LTO_SECTION_PREFIX): Move here. (struct sym_aux): Likewise. (struct plugin_symtab): Likewise. (struct plugin_file_info): Likewise. (claim_file_handler): Add new function prototype. (onload_format_checks): Likewise. (check): Declare extern. (translate): Likewise. (parse_table_entry): Likewise. (resolve_conflicts): Likewise. (add_symbols): Likewise. (claimed_files): Likewise. (num_claimed_files): Likewise. * lto-plugin-elf.c (process_symtab): Move here. (claim_file_handler): Likewise, and make non-static. (onload_format_checks): New function factored out from onload. * lto-plugin-coff.c (claim_file_handler): New function stub. (onload_format_checks): Likewise. From-SVN: r165133
2010-10-07 22:28:59 +02:00
/* Translate the IL symbol table located between DATA and END. Append the
slots and symbols to OUT. */
re PR lto/44992 (ld -r breaks LTO) gcc: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto-opts.c (lto_write_options): Add NULL file_data argument to lto_get_section_name. * lto-section-out.c (lto_destroy_simple_output_block): Likewise. * lto-streamer-out.c (produce_asm): Likewise. (copy_function): Likewise. (produce_symtab): Likewise. (produce_asm_for_decls): Likewise. * lto-streamer.c (lto_get_section_name): Add file_data argument. Rewrite to add random postfix to LTO sections. * lto-streamer.h (lto_file_decl_data): Add next, id, resolutions. (lto_get_section_name): Add file_data argument to prototype. lto: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto.c: Include splay-tree.h (lto_resolution_read): Change to walk file_ids tree and parse extra file_id in resolution file. (lto_section_with_id): Add. (create_subid_section_table): Add. (lwstate): Add. (lto_create_files_from_ids): Add. (lto_file_read): Change to handle sub file ids and create list of file_datas. Add output argument for count. (get_section_data): Pass file_data to lto_get_section_name. (lto_flatten_file): Add. (read_cgraph_and_symbols): Handle linked lists of file_datas. lto-plugin: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto-plugin.c (sym_aux): Add. (plugin_symtab): Remove slots. Add aux and id. (parse_table_entry): Change to use aux instead of slots. (LTO_SECTION_PREFIX): Add. (translate): Improve buffer allocation. Change to append symbols to existing out buffer. (get_section): Remove. (process_symtab): Add. (free_2): Free symtab->aux. (write_resolution): Handle aux instead of slots. Print sub id to resolution file. (claim_file_handler): Clear lto_file. Replace get_symtab/translate calls with call to process_symtab. From-SVN: r162443
2010-07-23 07:33:51 +02:00
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
static void
configure.ac (build_lto_plugin): New shell variable. ChangeLog: 2010-10-07 Dave Korn <dave.korn.cygwin@gmail.com> * configure.ac (build_lto_plugin): New shell variable. (--enable-lto): Turn on by default for all non-ELF platforms that have had LTO support added so far. Set build_lto_plugin appropriately for both ELF and non-ELF. (configdirs): Add lto-plugin or not based on build_lto_plugin. * configure: Regenerate. gcc/ChangeLog: 2010-10-07 Dave Korn <dave.korn.cygwin@gmail.com> * config.host (host_lto_plugin_soname): New shell variable. * configure.ac (LTOPLUGINSONAME): Add an AC_DEFINE for the above. * config.in: Regenerate. * configure: Regenerate. * gcc.c (main): Use LTOPLUGINSONAME instead of hard-coding name of LTO plugin shared library. lto-plugin/ChangeLog: 2010-10-07 Dave Korn <dave.korn.cygwin@gmail.com> * configure.ac: Source config.gcc to determine lto_binary_reader. (LTO_FORMAT): New AC_SUBST variable inferred from lto_binary_reader. * Makefile.am (LTO_FORMAT): Import. (liblto_plugin_la_SOURCES): Add object format dependent module defined by LTO_FORMAT. (liblto_plugin_la_LIBADD): Allow for both PIC and non-PIC libiberty, and work around libtool warning. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (struct sym_aux): Move to new lto-plugin.h. (struct sym_aux): Likewise. (struct plugin_symtab): Likewise. (struct plugin_file_info): Likewise. (LTO_SECTION_PREFIX): Likewise. (add_symbols): Make non-static. (claimed_files): Likewise. (num_claimed_files): Likewise. (check): Likewise. (parse_table_entry): Likewise. (translate): Likewise. (resolve_conflicts): Likewise. (process_symtab): Move to new lto-plugin-elf.c object format dependent source file. (claim_file_handler): Likewise, and make non-static. (onload): Call new onload_format_checks function. * lto-plugin.h: New file. (LTO_SECTION_PREFIX): Move here. (struct sym_aux): Likewise. (struct plugin_symtab): Likewise. (struct plugin_file_info): Likewise. (claim_file_handler): Add new function prototype. (onload_format_checks): Likewise. (check): Declare extern. (translate): Likewise. (parse_table_entry): Likewise. (resolve_conflicts): Likewise. (add_symbols): Likewise. (claimed_files): Likewise. (num_claimed_files): Likewise. * lto-plugin-elf.c (process_symtab): Move here. (claim_file_handler): Likewise, and make non-static. (onload_format_checks): New function factored out from onload. * lto-plugin-coff.c (claim_file_handler): New function stub. (onload_format_checks): Likewise. From-SVN: r165133
2010-10-07 22:28:59 +02:00
translate (char *data, char *end, struct plugin_symtab *out)
re PR lto/44992 (ld -r breaks LTO) gcc: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto-opts.c (lto_write_options): Add NULL file_data argument to lto_get_section_name. * lto-section-out.c (lto_destroy_simple_output_block): Likewise. * lto-streamer-out.c (produce_asm): Likewise. (copy_function): Likewise. (produce_symtab): Likewise. (produce_asm_for_decls): Likewise. * lto-streamer.c (lto_get_section_name): Add file_data argument. Rewrite to add random postfix to LTO sections. * lto-streamer.h (lto_file_decl_data): Add next, id, resolutions. (lto_get_section_name): Add file_data argument to prototype. lto: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto.c: Include splay-tree.h (lto_resolution_read): Change to walk file_ids tree and parse extra file_id in resolution file. (lto_section_with_id): Add. (create_subid_section_table): Add. (lwstate): Add. (lto_create_files_from_ids): Add. (lto_file_read): Change to handle sub file ids and create list of file_datas. Add output argument for count. (get_section_data): Pass file_data to lto_get_section_name. (lto_flatten_file): Add. (read_cgraph_and_symbols): Handle linked lists of file_datas. lto-plugin: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto-plugin.c (sym_aux): Add. (plugin_symtab): Remove slots. Add aux and id. (parse_table_entry): Change to use aux instead of slots. (LTO_SECTION_PREFIX): Add. (translate): Improve buffer allocation. Change to append symbols to existing out buffer. (get_section): Remove. (process_symtab): Add. (free_2): Free symtab->aux. (write_resolution): Handle aux instead of slots. Print sub id to resolution file. (claim_file_handler): Clear lto_file. Replace get_symtab/translate calls with call to process_symtab. From-SVN: r162443
2010-07-23 07:33:51 +02:00
{
struct sym_aux *aux;
struct ld_plugin_symbol *syms = NULL;
int n, len;
/* This overestimates the output buffer sizes, but at least
the algorithm is O(1) now. */
len = (end - data)/8 + out->nsyms + 1;
syms = xrealloc (out->syms, len * sizeof (struct ld_plugin_symbol));
aux = xrealloc (out->aux, len * sizeof (struct sym_aux));
for (n = out->nsyms; data < end; n++)
{
aux[n].id = out->id;
data = parse_table_entry (data, &syms[n], &aux[n]);
}
assert(n < len);
out->nsyms = n;
out->syms = syms;
out->aux = aux;
}
/* Free all memory that is no longer needed after writing the symbol
resolution. */
static void
free_1 (void)
{
unsigned int i;
for (i = 0; i < num_claimed_files; i++)
{
struct plugin_file_info *info = &claimed_files[i];
struct plugin_symtab *symtab = &info->symtab;
unsigned int j;
for (j = 0; j < symtab->nsyms; j++)
{
struct ld_plugin_symbol *s = &symtab->syms[j];
free (s->name);
free (s->comdat_key);
}
free (symtab->syms);
symtab->syms = NULL;
}
}
/* Free all remaining memory. */
static void
free_2 (void)
{
unsigned int i;
for (i = 0; i < num_claimed_files; i++)
{
struct plugin_file_info *info = &claimed_files[i];
struct plugin_symtab *symtab = &info->symtab;
re PR lto/44992 (ld -r breaks LTO) gcc: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto-opts.c (lto_write_options): Add NULL file_data argument to lto_get_section_name. * lto-section-out.c (lto_destroy_simple_output_block): Likewise. * lto-streamer-out.c (produce_asm): Likewise. (copy_function): Likewise. (produce_symtab): Likewise. (produce_asm_for_decls): Likewise. * lto-streamer.c (lto_get_section_name): Add file_data argument. Rewrite to add random postfix to LTO sections. * lto-streamer.h (lto_file_decl_data): Add next, id, resolutions. (lto_get_section_name): Add file_data argument to prototype. lto: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto.c: Include splay-tree.h (lto_resolution_read): Change to walk file_ids tree and parse extra file_id in resolution file. (lto_section_with_id): Add. (create_subid_section_table): Add. (lwstate): Add. (lto_create_files_from_ids): Add. (lto_file_read): Change to handle sub file ids and create list of file_datas. Add output argument for count. (get_section_data): Pass file_data to lto_get_section_name. (lto_flatten_file): Add. (read_cgraph_and_symbols): Handle linked lists of file_datas. lto-plugin: 2010-07-10 Andi Kleen <ak@linux.intel.com> PR lto/44992 * lto-plugin.c (sym_aux): Add. (plugin_symtab): Remove slots. Add aux and id. (parse_table_entry): Change to use aux instead of slots. (LTO_SECTION_PREFIX): Add. (translate): Improve buffer allocation. Change to append symbols to existing out buffer. (get_section): Remove. (process_symtab): Add. (free_2): Free symtab->aux. (write_resolution): Handle aux instead of slots. Print sub id to resolution file. (claim_file_handler): Clear lto_file. Replace get_symtab/translate calls with call to process_symtab. From-SVN: r162443
2010-07-23 07:33:51 +02:00
free (symtab->aux);
free (info->name);
}
for (i = 0; i < num_output_files; i++)
free (output_files[i]);
free (output_files);
free (claimed_files);
claimed_files = NULL;
num_claimed_files = 0;
free (arguments_file_name);
arguments_file_name = NULL;
}
/* Dump SYMTAB to resolution file F. */
static void
dump_symtab (FILE *f, struct plugin_symtab *symtab)
{
unsigned j;
for (j = 0; j < symtab->nsyms; j++)
{
uint32_t slot = symtab->aux[j].slot;
unsigned int resolution = symtab->syms[j].resolution;
assert (resolution != LDPR_UNKNOWN);
fprintf (f, "%u %x %s %s\n", (unsigned int) slot, symtab->aux[j].id,
lto_resolution_str[resolution],
symtab->syms[j].name);
}
}
/* Finish the conflicts' resolution information after the linker resolved
the original symbols */
static void
finish_conflict_resolution (struct plugin_symtab *symtab,
struct plugin_symtab *conflicts)
{
int i, j;
if (conflicts->nsyms == 0)
return;
for (i = 0; i < symtab->nsyms; i++)
{
int resolution = LDPR_UNKNOWN;
if (symtab->aux[i].next_conflict == -1)
continue;
switch (symtab->syms[i].def)
{
case LDPK_DEF:
case LDPK_COMMON: /* ??? */
resolution = LDPR_RESOLVED_IR;
break;
case LDPK_WEAKDEF:
resolution = LDPR_PREEMPTED_IR;
break;
case LDPK_UNDEF:
case LDPK_WEAKUNDEF:
resolution = symtab->syms[i].resolution;
break;
default:
assert (0);
}
assert (resolution != LDPR_UNKNOWN);
for (j = symtab->aux[i].next_conflict;
j != -1;
j = conflicts->aux[j].next_conflict)
conflicts->syms[j].resolution = resolution;
}
}
/* Free symbol table SYMTAB. */
static void
free_symtab (struct plugin_symtab *symtab)
{
free (symtab->syms);
symtab->syms = NULL;
free (symtab->aux);
symtab->aux = NULL;
}
/* Writes the relocations to disk. */
static void
write_resolution (void)
{
unsigned int i;
FILE *f;
check (resolution_file, LDPL_FATAL, "resolution file not specified");
f = fopen (resolution_file, "w");
check (f, LDPL_FATAL, "could not open file");
fprintf (f, "%d\n", num_claimed_files);
for (i = 0; i < num_claimed_files; i++)
{
struct plugin_file_info *info = &claimed_files[i];
struct plugin_symtab *symtab = &info->symtab;
struct ld_plugin_symbol *syms = symtab->syms;
get_symbols (info->handle, symtab->nsyms, syms);
finish_conflict_resolution (symtab, &info->conflicts);
fprintf (f, "%s %d\n", info->name, symtab->nsyms + info->conflicts.nsyms);
dump_symtab (f, symtab);
if (info->conflicts.nsyms)
{
dump_symtab (f, &info->conflicts);
free_symtab (&info->conflicts);
}
}
fclose (f);
}
/* Pass files generated by the lto-wrapper to the linker. FD is lto-wrapper's
stdout. */
static void
add_output_files (FILE *f)
{
for (;;)
{
const unsigned piece = 32;
char *buf, *s = xmalloc (piece);
size_t len;
buf = s;
cont:
if (!fgets (buf, piece, f))
{
free (s);
break;
}
len = strlen (s);
if (s[len - 1] != '\n')
{
s = xrealloc (s, len + piece);
buf = s + len;
goto cont;
}
s[len - 1] = '\0';
num_output_files++;
output_files
= xrealloc (output_files, num_output_files * sizeof (char *));
output_files[num_output_files - 1] = s;
add_input_file (output_files[num_output_files - 1]);
}
}
/* Execute the lto-wrapper. ARGV[0] is the binary. The rest of ARGV is the
argument list. */
static void
exec_lto_wrapper (char *argv[])
{
int t, i;
int status;
char *at_args;
FILE *args;
FILE *wrapper_output;
char *new_argv[3];
struct pex_obj *pex;
const char *errmsg;
/* Write argv to a file to avoid a command line that is too long. */
arguments_file_name = make_temp_file ("");
check (arguments_file_name, LDPL_FATAL,
"Failed to generate a temorary file name");
args = fopen (arguments_file_name, "w");
check (args, LDPL_FATAL, "could not open arguments file");
t = writeargv (&argv[1], args);
check (t == 0, LDPL_FATAL, "could not write arguments");
t = fclose (args);
check (t == 0, LDPL_FATAL, "could not close arguments file");
at_args = concat ("@", arguments_file_name, NULL);
check (at_args, LDPL_FATAL, "could not allocate");
for (i = 1; argv[i]; i++)
{
char *a = argv[i];
if (a[0] == '-' && a[1] == 'v' && a[2] == '\0')
{
for (i = 0; argv[i]; i++)
fprintf (stderr, "%s ", argv[i]);
fprintf (stderr, "\n");
break;
}
}
new_argv[0] = argv[0];
new_argv[1] = at_args;
new_argv[2] = NULL;
if (debug)
{
for (i = 0; new_argv[i]; i++)
fprintf (stderr, "%s ", new_argv[i]);
fprintf (stderr, "\n");
}
pex = pex_init (PEX_USE_PIPES, "lto-wrapper", NULL);
check (pex != NULL, LDPL_FATAL, "could not pex_init lto-wrapper");
errmsg = pex_run (pex, 0, new_argv[0], new_argv, NULL, NULL, &t);
check (errmsg == NULL, LDPL_FATAL, "could not run lto-wrapper");
check (t == 0, LDPL_FATAL, "could not run lto-wrapper");
wrapper_output = pex_read_output (pex, 0);
check (wrapper_output, LDPL_FATAL, "could not read lto-wrapper output");
add_output_files (wrapper_output);
t = pex_get_status (pex, 1, &status);
check (t == 1, LDPL_FATAL, "could not get lto-wrapper exit status");
check (WIFEXITED (status) && WEXITSTATUS (status) == 0, LDPL_FATAL,
"lto-wrapper failed");
pex_free (pex);
free (at_args);
}
/* Pass the original files back to the linker. */
static void
use_original_files (void)
{
unsigned i;
for (i = 0; i < num_claimed_files; i++)
{
struct plugin_file_info *info = &claimed_files[i];
add_input_file (info->name);
}
}
/* Called by the linker once all symbols have been read. */
static enum ld_plugin_status
all_symbols_read_handler (void)
{
unsigned i;
unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 1;
char **lto_argv;
const char **lto_arg_ptr;
if (num_claimed_files == 0)
return LDPS_OK;
if (nop)
{
use_original_files ();
return LDPS_OK;
}
lto_argv = (char **) xcalloc (sizeof (char *), num_lto_args);
lto_arg_ptr = (const char **) lto_argv;
assert (lto_wrapper_argv);
write_resolution ();
free_1 ();
for (i = 0; i < lto_wrapper_num_args; i++)
*lto_arg_ptr++ = lto_wrapper_argv[i];
for (i = 0; i < num_claimed_files; i++)
{
struct plugin_file_info *info = &claimed_files[i];
*lto_arg_ptr++ = info->name;
}
*lto_arg_ptr++ = NULL;
exec_lto_wrapper (lto_argv);
free (lto_argv);
/* --pass-through is not needed when using gold 1.11 or later. */
if (pass_through_items && gold_version < 111)
{
unsigned int i;
for (i = 0; i < num_pass_through_items; i++)
{
if (strncmp (pass_through_items[i], "-l", 2) == 0)
add_input_library (pass_through_items[i] + 2);
else
add_input_file (pass_through_items[i]);
free (pass_through_items[i]);
pass_through_items[i] = NULL;
}
free (pass_through_items);
pass_through_items = NULL;
}
return LDPS_OK;
}
/* Remove temporary files at the end of the link. */
static enum ld_plugin_status
cleanup_handler (void)
{
unsigned int i;
int t;
if (debug)
return LDPS_OK;
if (arguments_file_name)
{
t = unlink (arguments_file_name);
check (t == 0, LDPL_FATAL, "could not unlink arguments file");
}
for (i = 0; i < num_output_files; i++)
{
t = unlink (output_files[i]);
check (t == 0, LDPL_FATAL, "could not unlink output file");
}
free_2 ();
return LDPS_OK;
}
#define SWAP(type, a, b) \
do { type tmp_; tmp_ = (a); (a) = (b); (b) = tmp_; } while(0)
/* Compare two hash table entries */
static int eq_sym (const void *a, const void *b)
{
const struct ld_plugin_symbol *as = (const struct ld_plugin_symbol *)a;
const struct ld_plugin_symbol *bs = (const struct ld_plugin_symbol *)b;
return !strcmp (as->name, bs->name);
}
/* Hash a symbol */
static hashval_t hash_sym (const void *a)
{
const struct ld_plugin_symbol *as = (const struct ld_plugin_symbol *)a;
return htab_hash_string (as->name);
}
/* Determine how strong a symbol is */
static int symbol_strength (struct ld_plugin_symbol *s)
{
switch (s->def)
{
case LDPK_UNDEF:
case LDPK_WEAKUNDEF:
return 0;
case LDPK_WEAKDEF:
return 1;
default:
return 2;
}
}
/* In the ld -r case we can get dups in the LTO symbol tables, where
the same symbol can have different resolutions (e.g. undefined and defined).
We have to keep that in the LTO symbol tables, but the dups confuse
gold and then finally gcc by supplying incorrect resolutions.
Problem is that the main gold symbol table doesn't know about subids
and does not distingush the same symbols in different states.
So we drop duplicates from the linker visible symbol table
and keep them in a private table. Then later do own symbol
resolution for the duplicated based on the results for the
originals.
Then when writing out the resolution file readd the dropped symbols.
XXX how to handle common? */
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
static void
resolve_conflicts (struct plugin_symtab *t, struct plugin_symtab *conflicts)
{
htab_t symtab = htab_create (t->nsyms, hash_sym, eq_sym, NULL);
int i;
int out;
int outlen;
outlen = t->nsyms;
conflicts->syms = xmalloc (sizeof (struct ld_plugin_symbol) * outlen);
conflicts->aux = xmalloc (sizeof (struct sym_aux) * outlen);
/* Move all duplicate symbols into the auxillary conflicts table. */
out = 0;
for (i = 0; i < t->nsyms; i++)
{
struct ld_plugin_symbol *s = &t->syms[i];
struct sym_aux *aux = &t->aux[i];
void **slot;
slot = htab_find_slot (symtab, s, INSERT);
if (*slot != NULL)
{
int cnf;
struct ld_plugin_symbol *orig = (struct ld_plugin_symbol *)*slot;
struct sym_aux *orig_aux = &t->aux[orig - t->syms];
/* Always let the linker resolve the strongest symbol */
if (symbol_strength (orig) < symbol_strength (s))
{
SWAP (struct ld_plugin_symbol, *orig, *s);
SWAP (uint32_t, orig_aux->slot, aux->slot);
SWAP (unsigned, orig_aux->id, aux->id);
/* Don't swap conflict chain pointer */
}
/* Move current symbol into the conflicts table */
cnf = conflicts->nsyms++;
conflicts->syms[cnf] = *s;
conflicts->aux[cnf] = *aux;
aux = &conflicts->aux[cnf];
/* Update conflicts chain of the original symbol */
aux->next_conflict = orig_aux->next_conflict;
orig_aux->next_conflict = cnf;
continue;
}
/* Remove previous duplicates in the main table */
if (out < i)
{
t->syms[out] = *s;
t->aux[out] = *aux;
}
/* Put original into the hash table */
*slot = &t->syms[out];
out++;
}
assert (conflicts->nsyms <= outlen);
assert (conflicts->nsyms + out == t->nsyms);
t->nsyms = out;
htab_delete (symtab);
}
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
/* Process one section of an object file. */
static int
process_symtab (void *data, const char *name, off_t offset, off_t length)
{
struct plugin_objfile *obj = (struct plugin_objfile *)data;
char *s;
char *secdata;
if (strncmp (name, LTO_SECTION_PREFIX, LTO_SECTION_PREFIX_LEN) != 0)
return 1;
s = strrchr (name, '.');
if (s)
sscanf (s, ".%x", &obj->out->id);
secdata = xmalloc (length);
offset += obj->file->offset;
if (offset != lseek (obj->file->fd, offset, SEEK_SET)
|| length != read (obj->file->fd, secdata, length))
{
if (message)
message (LDPL_FATAL, "%s: corrupt object file", obj->file->name);
/* Force claim_file_handler to abandon this file. */
obj->found = 0;
free (secdata);
return 0;
}
translate (secdata, secdata + length, obj->out);
obj->found++;
free (secdata);
return 1;
}
/* Callback used by gold to check if the plugin will claim FILE. Writes
the result in CLAIMED. */
static enum ld_plugin_status
claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
{
enum ld_plugin_status status;
struct plugin_objfile obj;
struct plugin_file_info lto_file;
int err;
const char *errmsg;
memset (&lto_file, 0, sizeof (struct plugin_file_info));
if (file->offset != 0)
{
char *objname;
/* We pass the offset of the actual file, not the archive header.
Can't use PRIx64, because that's C99, so we have to print the
64-bit hex int as two 32-bit ones. */
int lo, hi, t;
lo = file->offset & 0xffffffff;
hi = ((int64_t)file->offset >> 32) & 0xffffffff;
t = hi ? asprintf (&objname, "%s@0x%x%08x", file->name, lo, hi)
: asprintf (&objname, "%s@0x%x", file->name, lo);
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
check (t >= 0, LDPL_FATAL, "asprintf failed");
lto_file.name = objname;
}
else
{
lto_file.name = xstrdup (file->name);
}
lto_file.handle = file->handle;
*claimed = 0;
obj.file = file;
obj.found = 0;
obj.out = &lto_file.symtab;
errmsg = NULL;
obj.objfile = simple_object_start_read (file->fd, file->offset, LTO_SEGMENT_NAME,
&errmsg, &err);
/* No file, but also no error code means unrecognized format; just skip it. */
if (!obj.objfile && !err)
goto err;
if (obj.objfile)
errmsg = simple_object_find_sections (obj.objfile, process_symtab, &obj, &err);
if (!obj.objfile || errmsg)
{
if (err && message)
message (LDPL_FATAL, "%s: %s: %s", file->name, errmsg,
xstrerror (err));
else if (message)
message (LDPL_FATAL, "%s: %s", file->name, errmsg);
goto err;
}
if (obj.found == 0)
goto err;
if (obj.found > 1)
resolve_conflicts (&lto_file.symtab, &lto_file.conflicts);
status = add_symbols (file->handle, lto_file.symtab.nsyms,
lto_file.symtab.syms);
check (status == LDPS_OK, LDPL_FATAL, "could not add symbols");
*claimed = 1;
num_claimed_files++;
claimed_files =
xrealloc (claimed_files,
num_claimed_files * sizeof (struct plugin_file_info));
claimed_files[num_claimed_files - 1] = lto_file;
goto cleanup;
err:
free (lto_file.name);
cleanup:
if (obj.objfile)
simple_object_release_read (obj.objfile);
return LDPS_OK;
}
/* Parse the plugin options. */
static void
process_option (const char *option)
{
if (strcmp (option, "-debug") == 0)
debug = 1;
else if (strcmp (option, "-nop") == 0)
nop = 1;
else if (!strncmp (option, "-pass-through=", strlen("-pass-through=")))
{
num_pass_through_items++;
pass_through_items = xrealloc (pass_through_items,
num_pass_through_items * sizeof (char *));
pass_through_items[num_pass_through_items - 1] =
xstrdup (option + strlen ("-pass-through="));
}
re PR lto/46273 (Failed to bootstrap) ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * configure.ac: Remove libelf tests. Build lto-plugin on ELF always and on other supported platforms whenever LTO is enabled. * configure: Rebuild. gcc/ChangeLog: 2010-11-03 Ian Lance Taylor <iant@google.com> PR lto/46273 * gcc/config.gcc: Don't set lto_binary_reader. * doc/install.texi (Prerequisites): Remove libelf paragraphs. (Configuration): Mention --disable-lto. Remove --with-libelf paragraph. lto-plugin/ChangeLog: 2010-11-03 Dave Korn <dave.korn.cygwin@gmail.com> PR lto/46273 * lto-plugin.h: Delete. * lto-plugin-elf.c: Likewise. * lto-plugin-coff.c: Likewise. * configure.ac: Don't use libelf, don't source config.gcc. (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (SYM_STYLE): Add AC_DEFINE var, set based on $target. (config.h): Add AC_CONFIG_HEADERS directive. * Makefile.am (LIBELFLIBS): Delete. (LIBELFINC): Delete. (LTO_FORMAT): Delete. (DEFS): Import. (AM_CPPFLAGS): Use it. Don't use LIBELFINC. (liblto_plugin_la_SOURCES): Don't use LTO_FORMAT, don't include any object-format-specific source file in the link. (liblto_plugin_la_LIBADD): Don't use LIBELFLIBS. * config.h.in: Generate. * configure: Regenerate. * Makefile.in: Likewise. * lto-plugin.c (O_BINARY): Definition moved here from lto-plugin.h. (LTO_SEGMENT_NAME): New definition. (LTO_SECTION_PREFIX): Definition moved here from lto-plugin.h. (LTO_SECTION_PREFIX_LEN): New definition. (struct sym_aux): Struct definition moved here from lto-plugin.h. (struct plugin_symtab): Likewise. (struct plugin_objfile): Likewise. (struct plugin_objfile): New struct def. (enum symbol_style): New enum type. (add_symbols): Make static. (claimed_files): Likewise. (num_claimed_files): Likewise. (sym_style): New global. (check): Make static. (parse_table_entry): Likewise. Respect sym_style when extracting symbol from symtab entry. (translate): Make static. (resolve_conflicts): Likewise. (process_symtab): New function, per-section callback version of old object-format-specific handling from deleted lto-plugin-elf.c. (claim_file_handler): Convert ELF-specific version from deleted lto-plugin-elf.c to simple_object interface and move here. (process_options): Allow new '-sym-style=' option. (onload): Don't call deleted onload_format_checks hook. From-SVN: r166233
2010-11-03 10:14:32 +01:00
else if (!strncmp (option, "-sym-style=", sizeof ("-sym-style=") - 1))
{
switch (option[sizeof ("-sym-style=") - 1])
{
case 'w':
sym_style = ss_win32;
break;
case 'u':
sym_style = ss_uscore;
break;
default:
sym_style = ss_none;
break;
}
}
else
{
int size;
char *opt = xstrdup (option);
lto_wrapper_num_args += 1;
size = lto_wrapper_num_args * sizeof (char *);
lto_wrapper_argv = (char **) xrealloc (lto_wrapper_argv, size);
lto_wrapper_argv[lto_wrapper_num_args - 1] = opt;
if (strncmp (option, "-fresolution=", sizeof ("-fresolution=") - 1) == 0)
resolution_file = opt + sizeof ("-fresolution=") - 1;
}
}
/* Called by gold after loading the plugin. TV is the transfer vector. */
enum ld_plugin_status
onload (struct ld_plugin_tv *tv)
{
struct ld_plugin_tv *p;
enum ld_plugin_status status;
p = tv;
while (p->tv_tag)
{
switch (p->tv_tag)
{
case LDPT_MESSAGE:
message = p->tv_u.tv_message;
break;
case LDPT_REGISTER_CLAIM_FILE_HOOK:
register_claim_file = p->tv_u.tv_register_claim_file;
break;
case LDPT_ADD_SYMBOLS:
add_symbols = p->tv_u.tv_add_symbols;
break;
case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK:
register_all_symbols_read = p->tv_u.tv_register_all_symbols_read;
break;
case LDPT_GET_SYMBOLS:
get_symbols = p->tv_u.tv_get_symbols;
break;
case LDPT_REGISTER_CLEANUP_HOOK:
register_cleanup = p->tv_u.tv_register_cleanup;
break;
case LDPT_ADD_INPUT_FILE:
add_input_file = p->tv_u.tv_add_input_file;
break;
case LDPT_ADD_INPUT_LIBRARY:
add_input_library = p->tv_u.tv_add_input_library;
break;
case LDPT_OPTION:
process_option (p->tv_u.tv_string);
break;
case LDPT_GOLD_VERSION:
gold_version = p->tv_u.tv_val;
break;
default:
break;
}
p++;
}
check (register_claim_file, LDPL_FATAL, "register_claim_file not found");
check (add_symbols, LDPL_FATAL, "add_symbols not found");
status = register_claim_file (claim_file_handler);
check (status == LDPS_OK, LDPL_FATAL,
"could not register the claim_file callback");
if (register_cleanup)
{
status = register_cleanup (cleanup_handler);
check (status == LDPS_OK, LDPL_FATAL,
"could not register the cleanup callback");
}
if (register_all_symbols_read)
{
check (get_symbols, LDPL_FATAL, "get_symbols not found");
status = register_all_symbols_read (all_symbols_read_handler);
check (status == LDPS_OK, LDPL_FATAL,
"could not register the all_symbols_read callback");
}
return LDPS_OK;
}