This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Hi, This patch adds support for LTO on Mach-O targets, i.e. darwin. The approach I've taken in implementing this is similar to what Dave Korn did for LTO on COFF targets: There is a minimal Mach-O binary reader/writer in lto-macho.? and section names are stored in a separate string table. There are a couple of funny things this patch does to make LTO work on Mach-O. The most noticeable is that I had to capture assembler output in the LTO generate phase and redirect it to a temporary file. The reason is that you can only define relocations in a relocatable Mach-O object for the first 255 sections, although there doesn't seem to be a limit to the number of sections you can add. So I want all non-LTO sections output before the LTO sections. The patch only enables LTO for x86_64-darwin. The patch implements an 64-bits and 32-bits Mach-O reader/writer, and both have been tested and appear to work, but I run into some issues with Mach-O PIC on 32-bits darwin that I don't know (yet?) how to fix. So 32-bits Mach-O LTO support is left as an exercise for the interested reader ;-) The middle-end bits have already been reviewed by Richi, and Mike has already looked at the darwin bits. Bootstrapped and tested on x86_64-apple-darwin10.3.0 (thanks to Jack Howarth). OK for trunk? Ciao! Steven 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.
Attachment:
lto_macho.diff.txt
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |