+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
#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. */
/* 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
#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
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);
{
rtx tocrel, tocreg, hi;
+ gcc_assert (TARGET_TOC);
+
if (TARGET_DEBUG_ADDR)
{
if (SYMBOL_REF_P (symbol))
#endif
)
&& TARGET_32BIT
- && TARGET_NO_TOC
+ && TARGET_NO_TOC_OR_PCREL
&& !flag_pic
&& !CONST_INT_P (x)
&& !CONST_WIDE_INT_P (x)
}
if ((TARGET_ELF || DEFAULT_ABI == ABI_DARWIN)
- && TARGET_NO_TOC
+ && TARGET_NO_TOC_OR_PCREL
&& ! flag_pic
&& mode == Pmode
&& CONSTANT_P (operands[1])
}
}
-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
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,
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);
}
#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
#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)
#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