https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68662

--- Comment #15 from Alan Modra <amodra at gcc dot gnu.org> ---
Author: amodra
Date: Thu May  5 00:07:27 2016
New Revision: 235914

URL: https://gcc.gnu.org/viewcvs?rev=235914&root=gcc&view=rev
Log:
[RS6000] TARGET_RELOCATABLE

For ABI_V4, -mrelocatable and -fPIC both generate position independent
code, with some extra "fixup" output for -mrelocatable.  The
similarity of these two options has led to the situation where the
sysv4.h SUBTARGET_OVERRIDE_OPTIONS sets flag_pic on seeing
-mrelocatable, and sets TARGET_RELOCATABLE on seeing -fPIC.  That
prevents LTO from properly optimizing position dependent executables,
because the mutual dependence of the flags and the fact that LTO
streaming records the state of rs6000_isa_flags, result in flag_pic
being set when it shouldn't be.

So, don't set TARGET_RELOCATABLE when -fPIC.  Places that currently
test TARGET_RELOCATABLE can instead test
TARGET_RELOCATABLE || (DEFAULT_ABI == ABI_V4 && flag_pic > 1)
or since TARGET_RELOCATABLE can only be enabled when ABI_V4,
DEFAULT_ABI == ABI_V4 && (TARGET_RELOCATABLE || flag_pic > 1).

Also, since flag_pic is set by -mrelocatable, a number of places that
currently test TARGET_RELOCATABLE can be simplified.  I also made
-mrelocatable set TARGET_NO_FP_IN_TOC, allowing TARGET_RELOCATABLE to
be removed from ASM_OUTPUT_SPECIAL_POOL_ENTRY_P.  Reducing occurrences
of TARGET_RELOCATABLE is a good thing.

        PR target/68662
        * config/rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Don't
        set OPTION_MASK_RELOCATABLE when flag_pic == 2.  Set
        TARGET_NO_FP_IN_TOC for -mrelocatable.
        (MINIMAL_TOC_SECTION_ASM_OP): Remove redundant
        TARGET_RELOCATABLE test.
        (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Likewise.
        (ASM_PREFERRED_EH_DATA_FORMAT): Likewise.
        * config/rs6000/linux64.h (MINIMAL_TOC_SECTION_ASM_OP): Likewise.
        (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Likewise.
        (ASM_PREFERRED_EH_DATA_FORMAT): Likewise.
        * config/rs6000/freebsd64.h (MINIMAL_TOC_SECTION_ASM_OP): Likewise.
        (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Likewise.
        (ASM_PREFERRED_EH_DATA_FORMAT): Likewise.
        * config/rs6000/predicates.md (easy_fp_constant): Likewise.
        * config/rs6000/rs6000.c (rs6000_elf_output_toc_section_asm_op):
        Likewise.
        (rs6000_assemble_integer): Update TARGET_RELOCATABLE test.
        (rs6000_stack_info): Likewise.
        (rs6000_elf_asm_out_constructor): Likewise.
        (rs6000_elf_asm_out_destructor): Likewise.
        (rs6000_elf_declare_function_name): Likewise.
        * config/rs6000/rs6000.md (load_toc_aix_di): Likewise.
        * config/rs6000/rs6000.h (MASK_RELOCATABLE, MASK_MINIMAL_TOC):
        Don't define.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/rs6000/freebsd64.h
    trunk/gcc/config/rs6000/linux64.h
    trunk/gcc/config/rs6000/predicates.md
    trunk/gcc/config/rs6000/rs6000.c
    trunk/gcc/config/rs6000/rs6000.h
    trunk/gcc/config/rs6000/rs6000.md
    trunk/gcc/config/rs6000/sysv4.h

Reply via email to