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]

[patch] LTO support for Mach-O (apple-darwin)


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]