Message ID | 20200110004008.GE30103@ibm-toto.the-meissners.org |
---|---|
State | New |
Headers | show |
Series | V12 patch #5 of 14, Make -mpcrel default for -mcpu=future on little endian Linux 64-bit systems | expand |
Hi! On Thu, Jan 09, 2020 at 07:40:08PM -0500, Michael Meissner wrote: > * config/rs6000/linux64.h (PREFIXED_ADDR_SUPPORTED_BY_OS): Set to > 1 to enable prefixed addressing if -mcpu=future. > (PCREL_SUPPORTED_BY_OS): Set to 1 to enable PC-relative addressing > if -mcpu=future. > * config/rs6000/rs6000-cpus.h (ISA_FUTURE_MASKS_SERVER): Do not > enable -mprefixed-addr or -mpcrel by default. I understand why this is needed for pcrel (or useful at least), but why for prefixed addressing in general as well? What OS support is needed for that? Put another way, is this just carefulness, or do you run into actual problems without it? > +/* Enable support for pc-relative and numeric prefixed addressing on the > + 'future' system. */ > +#undef PREFIXED_ADDR_SUPPORTED_BY_OS > +#define PREFIXED_ADDR_SUPPORTED_BY_OS 1 > + > +#undef PCREL_SUPPORTED_BY_OS > +#define PCREL_SUPPORTED_BY_OS 1 "Numeric prefixed addressing"? What's that? Just "and other prefixed addressing", maybe? (Is it useful to have those two separate at all, btw? Now, that is while we are still developing the code, but also in the future?) > +/* Addressing related flags on a future processor. These are options that need > + to be cleared if the target OS is not capable of supporting prefixed > + addressing at all (such as 32-bit mode or if the object file format is not > + ELF v2). */ Ah. If we are missing the needed relocations (or other as/ld support). So it is not about OS really, missing toolchain support instead? > + /* Only ELFv2 currently supports prefixed/pcrel addressing. */ > + else if (rs6000_current_abi != ABI_ELFv2) > + { > + if (TARGET_PCREL && explicit_pcrel) > + error ("%qs requires %qs", "-mpcrel", "-mabi=elfv2"); > + > + else if (TARGET_PREFIXED_ADDR && explicit_prefixed) > + error ("%qs requires %qs", "-mprefixed-addr", "-mabi=elfv2"); It would be good if the error messages also said "currently" somehow (it is not an actual limitation, it's just a matter of code). "Is only supported with -mabi=elfv2", perhaps? Segher
On Fri, Jan 31, 2020 at 07:12:53PM -0600, Segher Boessenkool wrote: > Hi! > > On Thu, Jan 09, 2020 at 07:40:08PM -0500, Michael Meissner wrote: > > * config/rs6000/linux64.h (PREFIXED_ADDR_SUPPORTED_BY_OS): Set to > > 1 to enable prefixed addressing if -mcpu=future. > > (PCREL_SUPPORTED_BY_OS): Set to 1 to enable PC-relative addressing > > if -mcpu=future. > > * config/rs6000/rs6000-cpus.h (ISA_FUTURE_MASKS_SERVER): Do not > > enable -mprefixed-addr or -mpcrel by default. > > I understand why this is needed for pcrel (or useful at least), but why > for prefixed addressing in general as well? What OS support is needed > for that? > > Put another way, is this just carefulness, or do you run into actual > problems without it? Just caution. I can just do the PCREL. > > +/* Enable support for pc-relative and numeric prefixed addressing on the > > + 'future' system. */ > > +#undef PREFIXED_ADDR_SUPPORTED_BY_OS > > +#define PREFIXED_ADDR_SUPPORTED_BY_OS 1 > > + > > +#undef PCREL_SUPPORTED_BY_OS > > +#define PCREL_SUPPORTED_BY_OS 1 > > "Numeric prefixed addressing"? What's that? Just "and other prefixed > addressing", maybe? Using a prefixed address with a large offset, or using a small offset because the traditional instruction is a DS/DQ instruction and the bottom 2/4 bits are non-zero. > (Is it useful to have those two separate at all, btw? Now, that is while > we are still developing the code, but also in the future?) > > > +/* Addressing related flags on a future processor. These are options that need > > + to be cleared if the target OS is not capable of supporting prefixed > > + addressing at all (such as 32-bit mode or if the object file format is not > > + ELF v2). */ > > Ah. If we are missing the needed relocations (or other as/ld support). > So it is not about OS really, missing toolchain support instead? It also plays into the dynamic loader of the system. If the dynamic loader doesn't support the new relocations, you can't do PCREL. > > > + /* Only ELFv2 currently supports prefixed/pcrel addressing. */ > > + else if (rs6000_current_abi != ABI_ELFv2) > > + { > > + if (TARGET_PCREL && explicit_pcrel) > > + error ("%qs requires %qs", "-mpcrel", "-mabi=elfv2"); > > + > > + else if (TARGET_PREFIXED_ADDR && explicit_prefixed) > > + error ("%qs requires %qs", "-mprefixed-addr", "-mabi=elfv2"); > > It would be good if the error messages also said "currently" somehow (it > is not an actual limitation, it's just a matter of code). "Is only > supported with -mabi=elfv2", perhaps?
On Mon, Feb 03, 2020 at 04:52:42PM -0500, Michael Meissner wrote: > > I understand why this is needed for pcrel (or useful at least), but why > > for prefixed addressing in general as well? What OS support is needed > > for that? > > > > Put another way, is this just carefulness, or do you run into actual > > problems without it? > > Just caution. I can just do the PCREL. See below... It really isn't "OS support", so maybe a better name will help. > > > +/* Enable support for pc-relative and numeric prefixed addressing on the > > > + 'future' system. */ > > > +#undef PREFIXED_ADDR_SUPPORTED_BY_OS > > > +#define PREFIXED_ADDR_SUPPORTED_BY_OS 1 > > > + > > > +#undef PCREL_SUPPORTED_BY_OS > > > +#define PCREL_SUPPORTED_BY_OS 1 > > > > "Numeric prefixed addressing"? What's that? Just "and other prefixed > > addressing", maybe? > > Using a prefixed address with a large offset, or using a small offset because > the traditional instruction is a DS/DQ instruction and the bottom 2/4 bits are > non-zero. Okay. So pretty much any prefixed load/store instruction. "Support for pc-relative and other prefixed addressing". It's fine to point out pcrel specifically, but just don't try to detail the rest here :-) > > > +/* Addressing related flags on a future processor. These are options that need > > > + to be cleared if the target OS is not capable of supporting prefixed > > > + addressing at all (such as 32-bit mode or if the object file format is not > > > + ELF v2). */ > > > > Ah. If we are missing the needed relocations (or other as/ld support). > > So it is not about OS really, missing toolchain support instead? > > It also plays into the dynamic loader of the system. If the dynamic loader > doesn't support the new relocations, you can't do PCREL. If you are building shared stuff at all. Right. So toolchain support and dl support (i.e. binutils and glibc)? Anything else? We'll be best off if you separate those out now, because those restrictions are independent. Also handled by different people on different projects ;-) Thanks, Segher
Index: gcc/config/rs6000/linux64.h =================================================================== --- gcc/config/rs6000/linux64.h (revision 280069) +++ gcc/config/rs6000/linux64.h (working copy) @@ -640,3 +640,11 @@ extern int dot_symbols; enabling the __float128 keyword. */ #undef TARGET_FLOAT128_ENABLE_TYPE #define TARGET_FLOAT128_ENABLE_TYPE 1 + +/* Enable support for pc-relative and numeric prefixed addressing on the + 'future' system. */ +#undef PREFIXED_ADDR_SUPPORTED_BY_OS +#define PREFIXED_ADDR_SUPPORTED_BY_OS 1 + +#undef PCREL_SUPPORTED_BY_OS +#define PCREL_SUPPORTED_BY_OS 1 Index: gcc/config/rs6000/rs6000-cpus.def =================================================================== --- gcc/config/rs6000/rs6000-cpus.def (revision 280069) +++ gcc/config/rs6000/rs6000-cpus.def (working copy) @@ -75,15 +75,22 @@ | OPTION_MASK_P8_VECTOR \ | OPTION_MASK_P9_VECTOR) -/* Support for a future processor's features. Do not enable -mpcrel until it - is fully functional. */ +/* Support for a future processor's features. The prefixed and pc-relative + addressing bits are not added here. Instead, they are added if the target + OS tm.h says that it supports the addressing modes by default when + -mcpu=future is used. */ #define ISA_FUTURE_MASKS_SERVER (ISA_3_0_MASKS_SERVER \ - | OPTION_MASK_FUTURE \ + | OPTION_MASK_FUTURE) + +/* Addressing related flags on a future processor. These are options that need + to be cleared if the target OS is not capable of supporting prefixed + addressing at all (such as 32-bit mode or if the object file format is not + ELF v2). */ +#define ADDRESSING_FUTURE_MASKS (OPTION_MASK_PCREL \ | OPTION_MASK_PREFIXED_ADDR) /* Flags that need to be turned off if -mno-future. */ -#define OTHER_FUTURE_MASKS (OPTION_MASK_PCREL \ - | OPTION_MASK_PREFIXED_ADDR) +#define OTHER_FUTURE_MASKS ADDRESSING_FUTURE_MASKS /* Flags that need to be turned off if -mno-power9-vector. */ #define OTHER_P9_VECTOR_MASKS (OPTION_MASK_FLOAT128_HW \ Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 280074) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -98,6 +98,16 @@ #endif #endif +/* Set up the defaults for whether prefixed addressing is used, and if it is + used, whether we want to turn on pc-relative support by default. */ +#ifndef PREFIXED_ADDR_SUPPORTED_BY_OS +#define PREFIXED_ADDR_SUPPORTED_BY_OS 0 +#endif + +#ifndef PCREL_SUPPORTED_BY_OS +#define PCREL_SUPPORTED_BY_OS 0 +#endif + /* Support targetm.vectorize.builtin_mask_for_load. */ GTY(()) tree altivec_builtin_mask_for_load; @@ -2536,6 +2546,14 @@ rs6000_debug_reg_global (void) if (TARGET_DIRECT_MOVE_128) fprintf (stderr, DEBUG_FMT_D, "VSX easy 64-bit mfvsrld element", (int)VECTOR_ELEMENT_MFVSRLD_64BIT); + + if (TARGET_FUTURE) + { + fprintf (stderr, DEBUG_FMT_D, "PREFIXED_ADDR_SUPPORTED_BY_OS", + PREFIXED_ADDR_SUPPORTED_BY_OS); + fprintf (stderr, DEBUG_FMT_D, "PCREL_SUPPORTED_BY_OS", + PCREL_SUPPORTED_BY_OS); + } } @@ -4016,26 +4034,6 @@ rs6000_option_override_internal (bool gl rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW; } - /* -mprefixed-addr (and hence -mpcrel) requires -mcpu=future. */ - if (TARGET_PREFIXED_ADDR && !TARGET_FUTURE) - { - if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0) - error ("%qs requires %qs", "-mpcrel", "-mcpu=future"); - else if ((rs6000_isa_flags_explicit & OPTION_MASK_PREFIXED_ADDR) != 0) - error ("%qs requires %qs", "-mprefixed-addr", "-mcpu=future"); - - rs6000_isa_flags &= ~(OPTION_MASK_PCREL | OPTION_MASK_PREFIXED_ADDR); - } - - /* -mpcrel requires prefixed load/store addressing. */ - if (TARGET_PCREL && !TARGET_PREFIXED_ADDR) - { - if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0) - error ("%qs requires %qs", "-mpcrel", "-mprefixed-addr"); - - rs6000_isa_flags &= ~OPTION_MASK_PCREL; - } - /* Print the options after updating the defaults. */ if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET) rs6000_print_isa_options (stderr, 0, "after defaults", rs6000_isa_flags); @@ -4167,12 +4165,91 @@ rs6000_option_override_internal (bool gl 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) + /* Enable prefixed addressing and PC-relative addressing if the target OS + tm.h file says that it is supported and the user did not explicitly use + -mprefixed-addr or -mpcrel. At the present time, only 64-bit Linux + enables this. + + PC-relative support also requires the medium code model. + + We can't check for ELFv2 or -mcmodel=medium until after the subtarget + macros are run. + + If prefixed addressing is disabled by default, and the user does -mpcrel, + don't force them to also specify -mprefixed-addr. */ + if (TARGET_FUTURE) + { + bool explicit_prefixed = ((rs6000_isa_flags_explicit + & OPTION_MASK_PREFIXED_ADDR) != 0); + bool explicit_pcrel = ((rs6000_isa_flags_explicit + & OPTION_MASK_PCREL) != 0); + + /* Prefixed addressing requires 64-bit registers. */ + if (!TARGET_POWERPC64) + { + if (TARGET_PCREL && explicit_pcrel) + error ("%qs requires %qs", "-mpcrel", "-m64"); + + else if (TARGET_PREFIXED_ADDR && explicit_prefixed) + error ("%qs requires %qs", "-mprefixed-addr", "-m64"); + + rs6000_isa_flags &= ~ADDRESSING_FUTURE_MASKS; + } + + /* Only ELFv2 currently supports prefixed/pcrel addressing. */ + else if (rs6000_current_abi != ABI_ELFv2) + { + if (TARGET_PCREL && explicit_pcrel) + error ("%qs requires %qs", "-mpcrel", "-mabi=elfv2"); + + else if (TARGET_PREFIXED_ADDR && explicit_prefixed) + error ("%qs requires %qs", "-mprefixed-addr", "-mabi=elfv2"); + + rs6000_isa_flags &= ~ADDRESSING_FUTURE_MASKS; + } + + /* Enable defaults if desired. */ + else + { + if (!explicit_prefixed + && (PREFIXED_ADDR_SUPPORTED_BY_OS + || TARGET_PCREL + || PCREL_SUPPORTED_BY_OS)) + rs6000_isa_flags |= OPTION_MASK_PREFIXED_ADDR; + + if (!explicit_pcrel && PCREL_SUPPORTED_BY_OS + && TARGET_PREFIXED_ADDR + && TARGET_CMODEL == CMODEL_MEDIUM) + rs6000_isa_flags |= OPTION_MASK_PCREL; + } + + /* PC-relative requires the medium code model. */ + 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; + } + + } + + /* -mprefixed-addr (and hence -mpcrel) requires -mcpu=future. */ + if (TARGET_PREFIXED_ADDR && !TARGET_FUTURE) { if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0) - error ("%qs requires %qs", "-mpcrel", "-mcmodel=medium"); + error ("%qs requires %qs", "-mpcrel", "-mcpu=future"); + else if ((rs6000_isa_flags_explicit & OPTION_MASK_PREFIXED_ADDR) != 0) + error ("%qs requires %qs", "-mprefixed-addr", "-mcpu=future"); + + rs6000_isa_flags &= ~(OPTION_MASK_PCREL | OPTION_MASK_PREFIXED_ADDR); + } + + /* -mpcrel requires prefixed load/store addressing. */ + if (TARGET_PCREL && !TARGET_PREFIXED_ADDR) + { + if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0) + error ("%qs requires %qs", "-mpcrel", "-mprefixed-addr"); rs6000_isa_flags &= ~OPTION_MASK_PCREL; }