diff options
author | davek <davek@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-03 09:14:32 +0000 |
---|---|---|
committer | davek <davek@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-03 09:14:32 +0000 |
commit | 25630dc79a217ae6e7ccac9ef62c93b88490d036 (patch) | |
tree | 727195368f3f7531be4fdf5a82d599ea20456d83 /lto-plugin | |
parent | bf07bf98a8277a332920f508ae5d22f29c0dd450 (diff) | |
download | gcc-25630dc79a217ae6e7ccac9ef62c93b88490d036.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166233 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'lto-plugin')
-rw-r--r-- | lto-plugin/ChangeLog | 48 | ||||
-rw-r--r-- | lto-plugin/Makefile.am | 13 | ||||
-rw-r--r-- | lto-plugin/Makefile.in | 63 | ||||
-rw-r--r-- | lto-plugin/config.h.in | 80 | ||||
-rwxr-xr-x | lto-plugin/configure | 268 | ||||
-rw-r--r-- | lto-plugin/configure.ac | 21 | ||||
-rw-r--r-- | lto-plugin/lto-plugin-coff.c | 38 | ||||
-rw-r--r-- | lto-plugin/lto-plugin-elf.c | 157 | ||||
-rw-r--r-- | lto-plugin/lto-plugin.c | 248 | ||||
-rw-r--r-- | lto-plugin/lto-plugin.h | 84 |
10 files changed, 624 insertions, 396 deletions
diff --git a/lto-plugin/ChangeLog b/lto-plugin/ChangeLog index 014082f99a1..690970f8524 100644 --- a/lto-plugin/ChangeLog +++ b/lto-plugin/ChangeLog @@ -1,3 +1,51 @@ +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. + 2010-10-11 Kai Tietz <kai.tietz@onevision.com> * lto-plugin.c (dump_symtab): Correct printf argument type. diff --git a/lto-plugin/Makefile.am b/lto-plugin/Makefile.am index 52bf6719daa..fb1d6c20f18 100644 --- a/lto-plugin/Makefile.am +++ b/lto-plugin/Makefile.am @@ -7,20 +7,13 @@ gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) target_noncanonical := @target_noncanonical@ libexecsubdir := $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version) -# How to find libelf -LIBELFLIBS = @LIBELFLIBS@ -LIBELFINC = @LIBELFINC@ - -# Which object format to parse. -LTO_FORMAT = @LTO_FORMAT@ - -AM_CPPFLAGS = -I$(top_srcdir)/../include $(LIBELFINC) +AM_CPPFLAGS = -I$(top_srcdir)/../include $(DEFS) AM_CFLAGS = -Wall -Werror libexecsub_LTLIBRARIES = liblto_plugin.la -liblto_plugin_la_SOURCES = lto-plugin.c lto-plugin-$(LTO_FORMAT).c -liblto_plugin_la_LIBADD = $(LIBELFLIBS) \ +liblto_plugin_la_SOURCES = lto-plugin.c +liblto_plugin_la_LIBADD = \ $(if $(wildcard ../libiberty/pic/libiberty.a),../libiberty/pic/libiberty.a,) liblto_plugin_la_LDFLAGS = -no-undefined -bindir $(libexecsubdir) \ $(if $(wildcard ../libiberty/pic/libiberty.a),,-Wc,../libiberty/libiberty.a) diff --git a/lto-plugin/Makefile.in b/lto-plugin/Makefile.in index c3f5260ed7d..a3519132833 100644 --- a/lto-plugin/Makefile.in +++ b/lto-plugin/Makefile.in @@ -36,10 +36,11 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ +target_triplet = @target@ subdir = . DIST_COMMON = ChangeLog $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ - $(srcdir)/../mkinstalldirs + $(srcdir)/config.h.in $(srcdir)/../mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \ $(top_srcdir)/../config/depstand.m4 \ @@ -53,6 +54,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs +CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; @@ -78,11 +80,9 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libexecsubdir)" LTLIBRARIES = $(libexecsub_LTLIBRARIES) -am__DEPENDENCIES_1 = -liblto_plugin_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(if $(wildcard \ +liblto_plugin_la_DEPENDENCIES = $(if $(wildcard \ ../libiberty/pic/libiberty.a),../libiberty/pic/libiberty.a,) -am_liblto_plugin_la_OBJECTS = lto-plugin.lo \ - lto-plugin-$(LTO_FORMAT).lo +am_liblto_plugin_la_OBJECTS = lto-plugin.lo liblto_plugin_la_OBJECTS = $(am_liblto_plugin_la_OBJECTS) liblto_plugin_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ @@ -133,19 +133,12 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ -LIBELFINC = @LIBELFINC@ - -# How to find libelf -LIBELFLIBS = @LIBELFLIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ - -# Which object format to parse. -LTO_FORMAT = @LTO_FORMAT@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ @@ -219,9 +212,13 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +target = @target@ target_alias = @target_alias@ +target_cpu = @target_cpu@ target_noncanonical := @target_noncanonical@ +target_os = @target_os@ target_subdir = @target_subdir@ +target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @@ -229,17 +226,18 @@ ACLOCAL_AMFLAGS = -I .. -I ../config AUTOMAKE_OPTIONS = no-dependencies gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) libexecsubdir := $(libexecdir)/gcc/$(target_noncanonical)/$(gcc_version) -AM_CPPFLAGS = -I$(top_srcdir)/../include $(LIBELFINC) +AM_CPPFLAGS = -I$(top_srcdir)/../include $(DEFS) AM_CFLAGS = -Wall -Werror libexecsub_LTLIBRARIES = liblto_plugin.la -liblto_plugin_la_SOURCES = lto-plugin.c lto-plugin-$(LTO_FORMAT).c -liblto_plugin_la_LIBADD = $(LIBELFLIBS) \ +liblto_plugin_la_SOURCES = lto-plugin.c +liblto_plugin_la_LIBADD = \ $(if $(wildcard ../libiberty/pic/libiberty.a),../libiberty/pic/libiberty.a,) liblto_plugin_la_LDFLAGS = -no-undefined -bindir $(libexecsubdir) \ $(if $(wildcard ../libiberty/pic/libiberty.a),,-Wc,../libiberty/libiberty.a) -all: all-am +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj @@ -277,6 +275,23 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 install-libexecsubLTLIBRARIES: $(libexecsub_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libexecsubdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecsubdir)" @@ -345,11 +360,11 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) mkid -fID $$unique tags: TAGS -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ @@ -367,9 +382,9 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ fi; \ fi ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ @@ -388,7 +403,7 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-am: all-am check: check-am -all-am: Makefile $(LTLIBRARIES) +all-am: Makefile $(LTLIBRARIES) config.h installdirs: for dir in "$(DESTDIR)$(libexecsubdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ @@ -427,7 +442,7 @@ distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-hdr distclean-libtool distclean-tags dvi: dvi-am @@ -490,11 +505,11 @@ ps-am: uninstall-am: uninstall-libexecsubLTLIBRARIES -.MAKE: install-am install-strip +.MAKE: all install-am install-strip .PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ clean-generic clean-libexecsubLTLIBRARIES clean-libtool ctags \ - distclean distclean-compile distclean-generic \ + distclean distclean-compile distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ diff --git a/lto-plugin/config.h.in b/lto-plugin/config.h.in new file mode 100644 index 00000000000..d7750f1e9e8 --- /dev/null +++ b/lto-plugin/config.h.in @@ -0,0 +1,80 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Default symbol style */ +#undef SYM_STYLE + +/* Version number of package */ +#undef VERSION + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT64_T + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef uint64_t diff --git a/lto-plugin/configure b/lto-plugin/configure index 9a53cea2c78..78948f90db4 100755 --- a/lto-plugin/configure +++ b/lto-plugin/configure @@ -601,7 +601,6 @@ ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS -LTO_FORMAT target_noncanonical CPP OTOOL64 @@ -622,8 +621,6 @@ EGREP GREP SED LIBTOOL -LIBELFINC -LIBELFLIBS am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE @@ -742,8 +739,6 @@ CFLAGS LDFLAGS LIBS CPPFLAGS -LIBELFLIBS -LIBELFINC CPP' @@ -1392,8 +1387,6 @@ Some influential environment variables: LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> - LIBELFLIBS How to link libelf - LIBELFINC How to find libelf include files CPP C preprocessor Use these variables to override the choices made by `configure' or to help @@ -3975,8 +3968,6 @@ rm -rf conftest* fi fi - - case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 @@ -10443,7 +10434,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10446 "configure" +#line 10437 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10549,7 +10540,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10552 "configure" +#line 10543 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10787,14 +10778,24 @@ CC="$lt_save_CC" -. ${srcdir}/../gcc/config.gcc -case ${lto_binary_reader} in - *coff*) LTO_FORMAT=coff ;; - *elf*) LTO_FORMAT=elf ;; - *) as_fn_error "LTO plugin is not supported on this target." "$LINENO" 5 ;; -esac +# Trying to get this information from gcc's config is tricky. +case $target in + x86_64*-mingw*) + +$as_echo "#define SYM_STYLE ss_none" >>confdefs.h + + ;; + *-cygwin* | i?86*-mingw* ) +$as_echo "#define SYM_STYLE ss_win32" >>confdefs.h + ;; + *) + +$as_echo "#define SYM_STYLE ss_none" >>confdefs.h + + ;; +esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( @@ -10811,6 +10812,8 @@ _ACEOF ac_config_files="$ac_config_files Makefile" +ac_config_headers="$ac_config_headers config.h" + cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -10890,43 +10893,7 @@ test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -:mline -/\\$/{ - N - s,\\\n,, - b mline -} -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - +DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= @@ -11390,11 +11357,15 @@ case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" +config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF @@ -11415,10 +11386,15 @@ Usage: $0 [OPTION]... [TAG]... --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE Configuration files: $config_files +Configuration headers: +$config_headers + Configuration commands: $config_commands @@ -11476,7 +11452,18 @@ do esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) @@ -11800,6 +11787,7 @@ do "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac @@ -11812,6 +11800,7 @@ done # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi @@ -11990,8 +11979,116 @@ fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. -eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' <confdefs.h | sed ' +s/'"$ac_delim"'/"\\\ +"/g' >>$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do @@ -12209,7 +12306,64 @@ which seems to be undefined. Please make sure it is defined." >&2;} esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; - + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} diff --git a/lto-plugin/configure.ac b/lto-plugin/configure.ac index 4d9380ecab8..282115fddfc 100644 --- a/lto-plugin/configure.ac +++ b/lto-plugin/configure.ac @@ -6,18 +6,21 @@ AM_INIT_AUTOMAKE([foreign no-dist]) AM_MAINTAINER_MODE AC_PROG_CC AC_SYS_LARGEFILE -AC_ARG_VAR(LIBELFLIBS,[How to link libelf]) -AC_ARG_VAR(LIBELFINC,[How to find libelf include files]) AM_PROG_LIBTOOL AC_SUBST(target_noncanonical) -. ${srcdir}/../gcc/config.gcc -case ${lto_binary_reader} in - *coff*) LTO_FORMAT=coff ;; - *elf*) LTO_FORMAT=elf ;; - *) AC_MSG_ERROR([LTO plugin is not supported on this target.]) ;; +# Trying to get this information from gcc's config is tricky. +case $target in + x86_64*-mingw*) + AC_DEFINE([SYM_STYLE], [ss_none], [Default symbol style]) + ;; + *-cygwin* | i?86*-mingw* ) + AC_DEFINE([SYM_STYLE], [ss_win32], [Default symbol style]) + ;; + *) + AC_DEFINE([SYM_STYLE], [ss_none], [Default symbol style]) + ;; esac - -AC_SUBST(LTO_FORMAT) AC_TYPE_UINT64_T AC_CONFIG_FILES(Makefile) +AC_CONFIG_HEADERS(config.h) AC_OUTPUT diff --git a/lto-plugin/lto-plugin-coff.c b/lto-plugin/lto-plugin-coff.c deleted file mode 100644 index acaff5979f2..00000000000 --- a/lto-plugin/lto-plugin-coff.c +++ /dev/null @@ -1,38 +0,0 @@ -/* LTO plugin for gold. - Copyright (C) 2010 Free Software Foundation, Inc. - -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/>. */ - -/* Common definitions that the object format dependent code needs. */ -#include "lto-plugin.h" - -/* Callback used by gold to check if the plugin will claim FILE. Writes - the result in CLAIMED. */ - -enum ld_plugin_status -claim_file_handler (const struct ld_plugin_input_file *file, int *claimed) -{ - /* To be implemented; for now, simply do nothing. */ - return LDPS_OK; -} - -/* Method called first thing at onload time to perform sanity checks. */ - -enum ld_plugin_status -onload_format_checks (struct ld_plugin_tv *tv) -{ - return LDPS_OK; -} - diff --git a/lto-plugin/lto-plugin-elf.c b/lto-plugin/lto-plugin-elf.c deleted file mode 100644 index afd79dac056..00000000000 --- a/lto-plugin/lto-plugin-elf.c +++ /dev/null @@ -1,157 +0,0 @@ -/* LTO plugin for gold. - 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/>. */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <libiberty.h> -#include <stdlib.h> -#include <inttypes.h> - -/* The presence of gelf.h is checked by the toplevel configure script. */ -#include <gelf.h> - -/* Common definitions that the object format dependent code needs. */ -#include "lto-plugin.h" - -/* Process all lto symtabs of file ELF. */ - -static int -process_symtab (Elf *elf, struct plugin_symtab *out) -{ - int found = 0; - Elf_Scn *section = 0; - GElf_Ehdr header; - GElf_Ehdr *t = gelf_getehdr (elf, &header); - if (t == NULL) - return 0; - assert (t == &header); - - while ((section = elf_nextscn(elf, section)) != 0) - { - GElf_Shdr shdr; - GElf_Shdr *tshdr = gelf_getshdr (section, &shdr); - Elf_Data *symtab; - const char *t; - assert (tshdr == &shdr); - t = elf_strptr (elf, header.e_shstrndx, shdr.sh_name); - assert (t != NULL); - if (strncmp (t, LTO_SECTION_PREFIX, strlen (LTO_SECTION_PREFIX)) == 0) - { - char *s = strrchr (t, '.'); - if (s) - sscanf (s, ".%x", &out->id); - symtab = elf_getdata (section, NULL); - translate (symtab->d_buf, symtab->d_buf + symtab->d_size, out); - found++; - } - } - return found; -} - -/* Callback used by gold to check if the plugin will claim FILE. Writes - the result in CLAIMED. */ - -enum ld_plugin_status -claim_file_handler (const struct ld_plugin_input_file *file, int *claimed) -{ - enum ld_plugin_status status; - Elf *elf; - struct plugin_file_info lto_file; - int n; - - memset (<o_file, 0, sizeof (struct plugin_file_info)); - - if (file->offset != 0) - { - char *objname; - Elf *archive; - off_t offset; - /* We pass the offset of the actual file, not the archive header. */ - int t = asprintf (&objname, "%s@0x%" PRIx64, file->name, - (int64_t) file->offset); - check (t >= 0, LDPL_FATAL, "asprintf failed"); - lto_file.name = objname; - - archive = elf_begin (file->fd, ELF_C_READ, NULL); - check (elf_kind (archive) == ELF_K_AR, LDPL_FATAL, - "Not an archive and offset not 0"); - - /* elf_rand expects the offset to point to the ar header, not the - object itself. Subtract the size of the ar header (60 bytes). - We don't uses sizeof (struct ar_hd) to avoid including ar.h */ - - offset = file->offset - 60; - check (offset == elf_rand (archive, offset), LDPL_FATAL, - "could not seek in archive"); - elf = elf_begin (file->fd, ELF_C_READ, archive); - check (elf != NULL, LDPL_FATAL, "could not find archive member"); - elf_end (archive); - } - else - { - lto_file.name = xstrdup (file->name); - elf = elf_begin (file->fd, ELF_C_READ, NULL); - } - lto_file.handle = file->handle; - - *claimed = 0; - - if (!elf) - goto err; - - n = process_symtab (elf, <o_file.symtab); - if (n == 0) - goto err; - - if (n > 1) - resolve_conflicts (<o_file.symtab, <o_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 (elf) - elf_end (elf); - - return LDPS_OK; -} - -/* Method called first thing at onload time to perform sanity checks. */ - -enum ld_plugin_status -onload_format_checks (struct ld_plugin_tv *tv) -{ - unsigned version = elf_version (EV_CURRENT); - check (version != EV_NONE, LDPL_FATAL, "invalid ELF version"); - return LDPS_OK; -} - diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c index 433f545391f..7df0d6f3c01 100644 --- a/lto-plugin/lto-plugin.c +++ b/lto-plugin/lto-plugin.c @@ -32,6 +32,9 @@ along with this program; see the file COPYING3. If not see -nop: Instead of running lto-wrapper, pass the original to the plugin. This only works if the input files are hybrid. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include <assert.h> #include <string.h> #include <stdlib.h> @@ -46,9 +49,72 @@ along with this program; see the file COPYING3. If not see #include <libiberty.h> #include <hashtab.h> #include "../gcc/lto/common.h" +#include "simple-object.h" +#include "plugin-api.h" -/* Common definitions for/from the object format dependent code. */ -#include "lto-plugin.h" +/* 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; @@ -58,13 +124,10 @@ 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; +static ld_plugin_add_symbols add_symbols; -/* These are not static because the object format dependent - claim_file hooks in lto-plugin-{coff,elf}.c need them. */ -ld_plugin_add_symbols add_symbols; - -struct plugin_file_info *claimed_files = NULL; -unsigned int num_claimed_files = 0; +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; @@ -79,7 +142,12 @@ static bool debug; static bool nop; static char *resolution_file = NULL; -void +/* Set by default from configure.ac, but can be overridden at runtime + 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 = SYM_STYLE; + +static void check (bool gate, enum ld_plugin_level level, const char *text) { if (gate) @@ -100,7 +168,7 @@ check (bool gate, enum ld_plugin_level level, const char *text) by P and the result is written in ENTRY. The slot number is stored in SLOT. Returns the address of the next entry. */ -char * +static char * parse_table_entry (char *p, struct ld_plugin_symbol *entry, struct sym_aux *aux) { @@ -122,7 +190,24 @@ parse_table_entry (char *p, struct ld_plugin_symbol *entry, LDPV_HIDDEN }; - entry->name = xstrdup (p); + 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 (false, LDPL_FATAL, "invalid symbol style requested"); + break; + } while (*p) p++; p++; @@ -165,7 +250,7 @@ parse_table_entry (char *p, struct ld_plugin_symbol *entry, /* Translate the IL symbol table located between DATA and END. Append the slots and symbols to OUT. */ -void +static void translate (char *data, char *end, struct plugin_symtab *out) { struct sym_aux *aux; @@ -621,7 +706,7 @@ static int symbol_strength (struct ld_plugin_symbol *s) XXX how to handle common? */ -void +static void resolve_conflicts (struct plugin_symtab *t, struct plugin_symtab *conflicts) { htab_t symtab = htab_create (t->nsyms, hash_sym, eq_sym, NULL); @@ -689,6 +774,124 @@ resolve_conflicts (struct plugin_symtab *t, struct plugin_symtab *conflicts) htab_delete (symtab); } +/* 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 (<o_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. */ + int t = asprintf (&objname, "%s@0x%" PRIx64, file->name, + (int64_t) file->offset); + 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 = <o_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 (<o_file.symtab, <o_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); + if (file->fd >= 0) + close (file->fd); + + return LDPS_OK; +} + /* Parse the plugin options. */ static void @@ -706,6 +909,21 @@ process_option (const char *option) pass_through_items[num_pass_through_items - 1] = xstrdup (option + strlen ("-pass-through=")); } + 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; @@ -727,10 +945,6 @@ onload (struct ld_plugin_tv *tv) struct ld_plugin_tv *p; enum ld_plugin_status status; - status = onload_format_checks (tv); - if (status != LDPS_OK) - return status; - p = tv; while (p->tv_tag) { diff --git a/lto-plugin/lto-plugin.h b/lto-plugin/lto-plugin.h deleted file mode 100644 index 09eb85003a7..00000000000 --- a/lto-plugin/lto-plugin.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Common declarations for 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/>. */ - -#include <stdbool.h> -#include "plugin-api.h" - -/* LTO magic section name. */ - -#define LTO_SECTION_PREFIX ".gnu.lto_.symtab" - -/* 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; -}; - -/* 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; -}; - -/* These are the methods supplied by one of the object format - dependent files lto-plugin-elf.c or lto-plugin-coff.c */ - -extern enum ld_plugin_status claim_file_handler - (const struct ld_plugin_input_file *file, int *claimed); - -extern enum ld_plugin_status onload_format_checks (struct ld_plugin_tv *tv); - -/* These methods are made available to the object format - dependent files. */ - -extern void check (bool gate, enum ld_plugin_level level, const char *text); - -extern void translate (char *data, char *end, struct plugin_symtab *out); - -extern char *parse_table_entry (char *p, struct ld_plugin_symbol *entry, - struct sym_aux *aux); - -extern void resolve_conflicts (struct plugin_symtab *t, - struct plugin_symtab *conflicts); - -/* And this callback function is exposed. */ - -extern ld_plugin_add_symbols add_symbols; - -/* Along with these two variables. */ - -extern struct plugin_file_info *claimed_files; -extern unsigned int num_claimed_files; - |