* configure.ac (--enable-lto): Add x86_64-apple-darwin* as
a platform that supports LTO.
* configure: Regenerate.
gcc/ChangeLog:
* config.gcc (i[34567]86-*-darwin*, x86_64-*-darwin*): Add
lto-macho as lto_binary_reader.
* target.h (struct gcc_target): New hooks lto_start and lto_end.
* target-def.h (TARGET_ASM_LTO_START, TARGET_ASM_LTO_END): Define.
* cgraphunit.c (ipa_passes): Wrap LTO assembler output generation
in lto_start and lto_end calls.
(is_elf_or_coff): Rename to maybe_lto_object_file. Add Mach-O
magic numbers.
(scan_prog_file): Update is_elf_or_coff call.
* doc/tm.text (TARGET_ASM_LTO_START, TARGET_ASM_LTO_END): Document.
* collect2.c (main): Fix enum comparison.
* config/darwin-protos.h (darwin_asm_lto_start, darwin_asm_lto_end):
Add prototypes.
* darwin9.h (LINK_COMMAND_SPEC): Pass -flto and -fwhopr to the linker.
* darwin.h (LINK_COMMAND_SPEC): Likewise. Define TARGET_ASM_LTO_START
and TARGET_ASM_LTO_END.
* darwin.c: Include obstack.h and lto-streamer.h.
(lto_section_names_offset, lto_section_names_obstack,
lto_asm_out_file, lto_asm_out_name, saved_asm_out_file): New static
global variables.
(LTO_SEGMENT_NAME, LTO_NAMES_SECTION): New defines.
(darwin_asm_lto_start): New function. Redirect output to asm_out_file
to a temporary file.
(darwin_asm_lto_end): New function. Restore asm_out_file.
(darwin_asm_named_section): For LTO sections, replace the name with
the offset of the section name in a string table, and build this
table.
(darwin_file_start): Initialize global vars for LTO support.
(darwin_file_end): If output to asm_out_file was redirected, append it
to the proper asm_out_file here. Add the section names section.
lto/ChangeLog:
* lto.h (struct lto_file_struct): Document offset member.
* lto-endian.h: New file.
* lto-macho.h: New file.
* lto-macho.c: New file.
* Make-lang.in: Add rule for lto-macho.o.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159173
138bc75d-0d04-0410-961f-
82ee72b054a4
+2010-05-07 Steven Bosscher <steven@gcc.gnu.org>
+
+ * configure.ac (--enable-lto): Add x86_64-apple-darwin* as
+ a platform that supports LTO.
+ * configure: Regenerate.
+
2010-05-05 Sebastian Pop <sebastian.pop@amd.com>
* configure.ac: Allow all the versions greater than 0.10 of PPL.
# -flto it won't be needed until after installation anyway.
case $target in
*-cygwin*|*-mingw*) ;;
+ x86_64-apple-darwin*) ;;
*) if test x"$enable_lto" = x"yes"; then
as_fn_error "LTO support is not enabled for this target." "$LINENO" 5
fi
# -flto it won't be needed until after installation anyway.
case $target in
*-cygwin*|*-mingw*) ;;
+ x86_64-apple-darwin*) ;;
*) if test x"$enable_lto" = x"yes"; then
AC_MSG_ERROR([LTO support is not enabled for this target.])
fi
2010-05-07 Steven Bosscher <steven@gcc.gnu.org>
+ * config.gcc (i[34567]86-*-darwin*, x86_64-*-darwin*): Add
+ lto-macho as lto_binary_reader.
+ * target.h (struct gcc_target): New hooks lto_start and lto_end.
+ * target-def.h (TARGET_ASM_LTO_START, TARGET_ASM_LTO_END): Define.
+ * cgraphunit.c (ipa_passes): Wrap LTO assembler output generation
+ in lto_start and lto_end calls.
+ (is_elf_or_coff): Rename to maybe_lto_object_file. Add Mach-O
+ magic numbers.
+ (scan_prog_file): Update is_elf_or_coff call.
+ * doc/tm.text (TARGET_ASM_LTO_START, TARGET_ASM_LTO_END): Document.
+
+ * collect2.c (main): Fix enum comparison.
+
+ * config/darwin-protos.h (darwin_asm_lto_start, darwin_asm_lto_end):
+ Add prototypes.
+ * darwin9.h (LINK_COMMAND_SPEC): Pass -flto and -fwhopr to the linker.
+ * darwin.h (LINK_COMMAND_SPEC): Likewise. Define TARGET_ASM_LTO_START
+ and TARGET_ASM_LTO_END.
+ * darwin.c: Include obstack.h and lto-streamer.h.
+ (lto_section_names_offset, lto_section_names_obstack,
+ lto_asm_out_file, lto_asm_out_name, saved_asm_out_file): New static
+ global variables.
+ (LTO_SEGMENT_NAME, LTO_NAMES_SECTION): New defines.
+ (darwin_asm_lto_start): New function. Redirect output to asm_out_file
+ to a temporary file.
+ (darwin_asm_lto_end): New function. Restore asm_out_file.
+ (darwin_asm_named_section): For LTO sections, replace the name with
+ the offset of the section name in a string table, and build this
+ table.
+ (darwin_file_start): Initialize global vars for LTO support.
+ (darwin_file_end): If output to asm_out_file was redirected, append it
+ to the proper asm_out_file here. Add the section names section.
+
+2010-05-07 Steven Bosscher <steven@gcc.gnu.org>
+
* c-pragma.c (pending_weak_d, pending_weak): New.
(pending_weaks): Change the type to VEC((pending_weak,gc) *.
(maybe_apply_pragma_weak, maybe_apply_pending_pragma_weaks,
execute_ipa_summary_passes
((struct ipa_opt_pass_d *) all_regular_ipa_passes);
}
+
+ /* Some targets need to handle LTO assembler output specially. */
+ if (flag_generate_lto)
+ targetm.asm_out.lto_start ();
+
execute_ipa_summary_passes ((struct ipa_opt_pass_d *) all_lto_gen_passes);
if (!in_lto_p)
ipa_write_summaries ();
+ if (flag_generate_lto)
+ targetm.asm_out.lto_end ();
+
if (!flag_ltrans)
execute_ipa_pass_list (all_regular_ipa_passes);
invoke_plugin_callbacks (PLUGIN_ALL_IPA_PASSES_END, NULL);
if (export_file != 0 && export_file[0])
maybe_unlink (export_file);
#endif
- if (lto_mode)
+ if (lto_mode != LTO_MODE_NONE)
maybe_run_lto_and_relink (ld1_argv, object_lst, object, false);
maybe_unlink (c_file);
\f
#ifdef OBJECT_FORMAT_NONE
-/* Check to make sure the file is an ELF file. LTO objects must
- be in ELF format. */
+/* Check to make sure the file is an LTO object file. */
static bool
-is_elf_or_coff (const char *prog_name)
+maybe_lto_object_file (const char *prog_name)
{
FILE *f;
- char buf[4];
- static char magic[4] = { 0x7f, 'E', 'L', 'F' };
- static char coffmag[2] = { 0x4c, 0x01 };
+ unsigned char buf[4];
+ int i;
+
+ static unsigned char elfmagic[4] = { 0x7f, 'E', 'L', 'F' };
+ static unsigned char coffmagic[2] = { 0x4c, 0x01 };
+ static unsigned char machomagic[4][4] = {
+ { 0xcf, 0xfa, 0xed, 0xfe },
+ { 0xce, 0xfa, 0xed, 0xfe },
+ { 0xfe, 0xed, 0xfa, 0xcf },
+ { 0xfe, 0xed, 0xfa, 0xce }
+ };
f = fopen (prog_name, "rb");
if (f == NULL)
if (fread (buf, sizeof (buf), 1, f) != 1)
buf[0] = 0;
fclose (f);
- return memcmp (buf, magic, sizeof (magic)) == 0
- || memcmp (buf, coffmag, sizeof (coffmag)) == 0;
+
+ if (memcmp (buf, elfmagic, sizeof (elfmagic)) == 0
+ || memcmp (buf, coffmagic, sizeof (coffmagic)) == 0)
+ return true;
+ for (i = 0; i < 4; i++)
+ if (memcmp (buf, machomagic[i], sizeof (machomagic[i])) == 0)
+ return true;
+
+ return false;
}
/* Generic version to scan the name list of the loaded program for
/* LTO objects must be in a known format. This check prevents
us from accepting an archive containing LTO objects, which
gcc cannnot currently handle. */
- if (which_pass == PASS_LTOINFO && !is_elf_or_coff (prog_name))
+ if (which_pass == PASS_LTOINFO && !maybe_lto_object_file (prog_name))
return;
/* If we do not have an `nm', complain. */
# support.
with_cpu=${with_cpu:-generic}
tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm"
+ lto_binary_reader=lto-macho
;;
x86_64-*-darwin*)
with_cpu=${with_cpu:-generic}
tmake_file="${tmake_file} t-darwin ${cpu_type}/t-darwin64 t-slibgcc-darwin i386/t-crtpc i386/t-crtfm"
tm_file="${tm_file} ${cpu_type}/darwin64.h"
+ lto_binary_reader=lto-macho
;;
i[34567]86-*-elf*)
tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h newlib-stdint.h i386/i386elf.h"
#include "rtl.h"
#include "regs.h"
#include "hard-reg-set.h"
+#include "real.h"
#include "insn-config.h"
#include "conditions.h"
#include "insn-flags.h"
obstack_grow (<o_section_names_obstack, "\\0\"\n", 4);
/* Output the dummy section name. */
- fprintf (asm_out_file, "\t# %s\n", name);
- fprintf (asm_out_file, "\t.section %s,__%08X,regular,debug\n",
- LTO_SEGMENT_NAME, lto_section_names_offset);
+ fprintf (asm_out_file, "\t.section %s,__%08X,regular,debug\t# %s\n",
+ LTO_SEGMENT_NAME, lto_section_names_offset, name);
/* Update the offset for the next section name. Make sure we stay
within reasonable length. */
this function.
@end deftypefun
+@deftypefn {Target Hook} void TARGET_ASM_LTO_START (void)
+Output to @code{asm_out_file} any text which the assembler expects
+to find at the start of an LTO section. The default is to output
+nothing.
+@end deftypefn
+
+@deftypefn {Target Hook} void TARGET_ASM_LTO_END (void)
+Output to @code{asm_out_file} any text which the assembler expects
+to find at the end of an LTO section. The default is to output
+nothing.
+@end deftypefn
+
@deftypefn {Target Hook} void TARGET_ASM_CODE_END (void)
Output to @code{asm_out_file} any text which is needed before emitting
unwind info and debug info at the end of a file. Some targets emit
+2010-05-07 Steven Bosscher <steven@gcc.gnu.org>
+
+ * lto.h (struct lto_file_struct): Document offset member.
+ * lto-endian.h: New file.
+ * lto-macho.h: New file.
+ * lto-macho.c: New file.
+ * Make-lang.in: Add rule for lto-macho.o.
+
2010-05-07 Richard Guenther <rguenther@suse.de>
PR lto/43857
lto/lto-coff.o: lto/lto-coff.c $(CONFIG_H) coretypes.h $(SYSTEM_H) \
toplev.h $(LTO_H) $(TM_H) $(LIBIBERTY_H) $(GGC_H) $(LTO_STREAMER_H) \
lto/lto-coff.h
+lto/lto-macho.o: lto/lto-macho.c $(CONFIG_H) coretypes.h $(SYSTEM_H) \
+ toplev.h $(LTO_H) $(TM_H) $(LIBIBERTY_H) $(GGC_H) $(LTO_STREAMER_H) \
+ lto/lto-macho.h lto/lto-endian.h
#define TARGET_ASM_FILE_END hook_void_void
#endif
+#ifndef TARGET_ASM_LTO_START
+#define TARGET_ASM_LTO_START hook_void_void
+#endif
+
+#ifndef TARGET_ASM_LTO_END
+#define TARGET_ASM_LTO_END hook_void_void
+#endif
+
#ifndef TARGET_ASM_CODE_END
#define TARGET_ASM_CODE_END hook_void_void
#endif
TARGET_ASM_CAN_OUTPUT_MI_THUNK, \
TARGET_ASM_FILE_START, \
TARGET_ASM_FILE_END, \
+ TARGET_ASM_LTO_START, \
+ TARGET_ASM_LTO_END, \
TARGET_ASM_CODE_END, \
TARGET_ASM_EXTERNAL_LIBCALL, \
TARGET_ASM_MARK_DECL_PRESERVED, \
translation unit. */
void (*file_end) (void);
+ /* Output any boilerplate text needed at the beginning of an
+ LTO output stream. */
+ void (*lto_start) (void);
+
+ /* Output any boilerplate text needed at the end of an
+ LTO output stream. */
+ void (*lto_end) (void);
+
/* Output any boilerplace text needed at the end of a
translation unit before debug and unwind info is emitted. */
void (*code_end) (void);