diff options
author | Michael Meissner <meissner@linux.ibm.com> | 2019-07-18 18:16:43 +0000 |
---|---|---|
committer | Michael Meissner <meissner@gcc.gnu.org> | 2019-07-18 18:16:43 +0000 |
commit | 9ae813e89059b101d390e29912bc4348bfc538f2 (patch) | |
tree | df44ee93e23fd4c788c2dcca556bf97c22e2c366 /gcc | |
parent | 07d7662ff7ed987d98a61f333169b65620ec8202 (diff) | |
download | gcc-9ae813e89059b101d390e29912bc4348bfc538f2.zip gcc-9ae813e89059b101d390e29912bc4348bfc538f2.tar.gz gcc-9ae813e89059b101d390e29912bc4348bfc538f2.tar.bz2 |
Update PowerPC compiler for pc-relative support.
2019-07-18 Michael Meissner <meissner@linux.ibm.com>
* config/rs6000/aix.h (TARGET_HAS_TOC): Rename TARGET_TOC to
TARGET_HAS_TOC.
(TARGET_TOC): Likewise.
(TARGET_NO_TOC): Delete here, define TARGET_NO_TOC_OR_PCREL in
rs6000.h.
* config/rs6000/darwin.h (TARGET_HAS_TOC): Rename TARGET_TOC to
TARGET_HAS_TOC.
(TARGET_TOC): Likewise.
(TARGET_NO_TOC): Delete here, define TARGET_NO_TOC_OR_PCREL in
rs6000.h.
* config/rs6000/linux64.h (TARGET_HAS_TOC): Rename TARGET_TOC to
TARGET_HAS_TOC.
(TARGET_TOC): Likewise.
* config/rs6000/rs6000.c (rs6000_option_override_internal): Add
check to require -mcmodel=medium for pc-relative addressing.
(create_TOC_reference): Add assertion for TARGET_TOC.
(rs6000_legitimize_address): Use TARGET_NO_TOC_OR_PCREL instead of
TARGET_NO_TOC.
(rs6000_emit_move): Likewise.
(TOC_alias_set): Rename TOC alias set static variable from 'set'
to 'TOC_alias_set'.
(get_TOC_alias_set): Likewise.
(output_toc): Use TARGET_NO_TOC_OR_PCREL instead of
TARGET_NO_TOC.
(rs6000_can_eliminate): Likewise.
* config/rs6000/rs6000.h (TARGET_TOC): Define in terms of
TARGET_HAS_TOC and not pc-relative.
(TARGET_NO_TOC_OR_PCREL): New macro to replace TARGET_NO_TOC.
* config/rs6000/sysv4.h (TARGET_HAS_TOC): Rename TARGET_TOC to
TARGET_HAS_TOC.
(TARGET_TOC): Likewise.
(TARGET_NO_TOC): Delete here, define TARGET_NO_TOC_OR_PCREL in
rs6000.h.
From-SVN: r273579
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 36 | ||||
-rw-r--r-- | gcc/config/rs6000/aix.h | 3 | ||||
-rw-r--r-- | gcc/config/rs6000/darwin.h | 3 | ||||
-rw-r--r-- | gcc/config/rs6000/linux64.h | 4 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 28 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.h | 7 | ||||
-rw-r--r-- | gcc/config/rs6000/sysv4.h | 3 |
7 files changed, 68 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4a64253..151297a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,39 @@ +2019-07-18 Michael Meissner <meissner@linux.ibm.com> + + * config/rs6000/aix.h (TARGET_HAS_TOC): Rename TARGET_TOC to + TARGET_HAS_TOC. + (TARGET_TOC): Likewise. + (TARGET_NO_TOC): Delete here, define TARGET_NO_TOC_OR_PCREL in + rs6000.h. + * config/rs6000/darwin.h (TARGET_HAS_TOC): Rename TARGET_TOC to + TARGET_HAS_TOC. + (TARGET_TOC): Likewise. + (TARGET_NO_TOC): Delete here, define TARGET_NO_TOC_OR_PCREL in + rs6000.h. + * config/rs6000/linux64.h (TARGET_HAS_TOC): Rename TARGET_TOC to + TARGET_HAS_TOC. + (TARGET_TOC): Likewise. + * config/rs6000/rs6000.c (rs6000_option_override_internal): Add + check to require -mcmodel=medium for pc-relative addressing. + (create_TOC_reference): Add assertion for TARGET_TOC. + (rs6000_legitimize_address): Use TARGET_NO_TOC_OR_PCREL instead of + TARGET_NO_TOC. + (rs6000_emit_move): Likewise. + (TOC_alias_set): Rename TOC alias set static variable from 'set' + to 'TOC_alias_set'. + (get_TOC_alias_set): Likewise. + (output_toc): Use TARGET_NO_TOC_OR_PCREL instead of + TARGET_NO_TOC. + (rs6000_can_eliminate): Likewise. + * config/rs6000/rs6000.h (TARGET_TOC): Define in terms of + TARGET_HAS_TOC and not pc-relative. + (TARGET_NO_TOC_OR_PCREL): New macro to replace TARGET_NO_TOC. + * config/rs6000/sysv4.h (TARGET_HAS_TOC): Rename TARGET_TOC to + TARGET_HAS_TOC. + (TARGET_TOC): Likewise. + (TARGET_NO_TOC): Delete here, define TARGET_NO_TOC_OR_PCREL in + rs6000.h. + 2019-07-18 Uroš Bizjak <ubizjak@gmail.com> PR target/91188 diff --git a/gcc/config/rs6000/aix.h b/gcc/config/rs6000/aix.h index 01e1e74..75e080e 100644 --- a/gcc/config/rs6000/aix.h +++ b/gcc/config/rs6000/aix.h @@ -32,8 +32,7 @@ #define TARGET_AIX_OS 1 /* AIX always has a TOC. */ -#define TARGET_NO_TOC 0 -#define TARGET_TOC 1 +#define TARGET_HAS_TOC 1 #define FIXED_R2 1 /* AIX allows r13 to be used in 32-bit mode. */ diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h index 272cd45..1bfb577 100644 --- a/gcc/config/rs6000/darwin.h +++ b/gcc/config/rs6000/darwin.h @@ -43,8 +43,7 @@ /* We're not ever going to do TOCs. */ -#define TARGET_TOC 0 -#define TARGET_NO_TOC 1 +#define TARGET_HAS_TOC 0 /* Override the default rs6000 definition. */ #undef PTRDIFF_TYPE diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h index 5380f6a..bd19749 100644 --- a/gcc/config/rs6000/linux64.h +++ b/gcc/config/rs6000/linux64.h @@ -277,8 +277,8 @@ extern int dot_symbols; #ifndef RS6000_BI_ARCH /* 64-bit PowerPC Linux always has a TOC. */ -#undef TARGET_TOC -#define TARGET_TOC 1 +#undef TARGET_HAS_TOC +#define TARGET_HAS_TOC 1 /* Some things from sysv4.h we don't do when 64 bit. */ #undef OPTION_RELOCATABLE diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 63f3075..3f64104 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -4333,6 +4333,16 @@ rs6000_option_override_internal (bool global_init_p) SUB3TARGET_OVERRIDE_OPTIONS; #endif + /* -mpcrel requires -mcmodel=medium, but we can't check TARGET_CMODEL until + after the subtarget override options are done. */ + if (TARGET_PCREL && TARGET_CMODEL != CMODEL_MEDIUM) + { + if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0) + error ("%qs requires %qs", "-mpcrel", "-mcmodel=medium"); + + rs6000_isa_flags &= ~OPTION_MASK_PCREL; + } + if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET) rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags); @@ -7742,6 +7752,8 @@ create_TOC_reference (rtx symbol, rtx largetoc_reg) { rtx tocrel, tocreg, hi; + gcc_assert (TARGET_TOC); + if (TARGET_DEBUG_ADDR) { if (SYMBOL_REF_P (symbol)) @@ -8121,7 +8133,7 @@ rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, #endif ) && TARGET_32BIT - && TARGET_NO_TOC + && TARGET_NO_TOC_OR_PCREL && !flag_pic && !CONST_INT_P (x) && !CONST_WIDE_INT_P (x) @@ -9811,7 +9823,7 @@ rs6000_emit_move (rtx dest, rtx source, machine_mode mode) } if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN) - && TARGET_NO_TOC + && TARGET_NO_TOC_OR_PCREL && ! flag_pic && mode == Pmode && CONSTANT_P (operands[1]) @@ -23725,14 +23737,14 @@ rs6000_split_multireg_move (rtx dst, rtx src) } } -static GTY(()) alias_set_type set = -1; +static GTY(()) alias_set_type TOC_alias_set = -1; alias_set_type get_TOC_alias_set (void) { - if (set == -1) - set = new_alias_set (); - return set; + if (TOC_alias_set == -1) + TOC_alias_set = new_alias_set (); + return TOC_alias_set; } /* Return the internal arg pointer used for function incoming @@ -24103,7 +24115,7 @@ output_toc (FILE *file, rtx x, int labelno, machine_mode mode) rtx base = x; HOST_WIDE_INT offset = 0; - gcc_assert (!TARGET_NO_TOC); + gcc_assert (!TARGET_NO_TOC_OR_PCREL); /* When the linker won't eliminate them, don't output duplicate TOC entries (this happens on AIX if there is any kind of TOC, @@ -30469,7 +30481,7 @@ rs6000_can_eliminate (const int from, const int to) return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM ? ! frame_pointer_needed : from == RS6000_PIC_OFFSET_TABLE_REGNUM - ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC + ? ! TARGET_MINIMAL_TOC || TARGET_NO_TOC_OR_PCREL || constant_pool_empty_p () : true); } diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 5f3b9ed..70e0616 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -54,6 +54,13 @@ #define TARGET_AIX_OS 0 #endif +/* Turn off TOC support if pc-relative addressing is used. */ +#define TARGET_TOC (TARGET_HAS_TOC && !TARGET_PCREL) + +/* On 32-bit systems without a TOC or pc-relative addressing, we need to use + ADDIS/ADDI to load up the address of a symbol. */ +#define TARGET_NO_TOC_OR_PCREL (!TARGET_HAS_TOC && !TARGET_PCREL) + /* Control whether function entry points use a "dot" symbol when ABI_AIX. */ #define DOT_SYMBOLS 1 diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index 3861efd..17fea80 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -41,7 +41,7 @@ #undef ASM_DEFAULT_SPEC #define ASM_DEFAULT_SPEC "-mppc" -#define TARGET_TOC (TARGET_64BIT \ +#define TARGET_HAS_TOC (TARGET_64BIT \ || (TARGET_MINIMAL_TOC \ && flag_pic > 1) \ || DEFAULT_ABI != ABI_V4) @@ -50,7 +50,6 @@ #define TARGET_BIG_ENDIAN (! TARGET_LITTLE_ENDIAN) #define TARGET_PROTOTYPE target_prototype #define TARGET_NO_PROTOTYPE (! TARGET_PROTOTYPE) -#define TARGET_NO_TOC (! TARGET_TOC) #define TARGET_NO_EABI (! TARGET_EABI) #define TARGET_REGNAMES rs6000_regnames |