diff options
author | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-07 21:37:43 +0000 |
---|---|---|
committer | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-07 21:37:43 +0000 |
commit | 23433d7293fea64ed743db3193d07473f2ac789f (patch) | |
tree | b036b0c810fc469ae0e5ec3f6d1436e32e0ef493 /gcc/collect2.c | |
parent | dd821e087f62d2d60874f931b166b4f14bf2b99e (diff) | |
download | gcc-23433d7293fea64ed743db3193d07473f2ac789f.tar.gz |
ChangeLog:
* 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
Diffstat (limited to 'gcc/collect2.c')
-rw-r--r-- | gcc/collect2.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c index 99d9be46dee..6582185cf09 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -1817,7 +1817,7 @@ main (int argc, char **argv) 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); @@ -2563,16 +2563,23 @@ write_aix_file (FILE *stream, struct id *list) #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) @@ -2580,8 +2587,15 @@ is_elf_or_coff (const char *prog_name) 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 @@ -2611,7 +2625,7 @@ scan_prog_file (const char *prog_name, scanpass which_pass, /* 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. */ |