* [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c @ 2017-11-27 19:57 Michael Meissner 2017-11-27 22:55 ` Martin Sebor 0 siblings, 1 reply; 12+ messages in thread From: Michael Meissner @ 2017-11-27 19:57 UTC (permalink / raw) To: GCC Patches, Segher Boessenkool, David Edelsohn, Bill Schmidt [-- Attachment #1: Type: text/plain, Size: 1868 bytes --] The new -Wattribute-alias option now issues warnings for old-style ifunc declarations that coerce the pointer to the function to void *. The float128-ifunc.c module in libgcc/config/rs6000 now gets a lot of warnings of the form: ../float128-ifunc.c:109:1: warning: âifuncâ resolver for â__negkf2â should return âTFtype (*)(TFtype) {aka _Float128 (*)(_Float128)}â [-Wattribute-alias] This patch fixes these warnings. I have done a full bootstrap build and test suite run. I have verified that the ifunc handler works correctly, using software emulation on a power8 and the hardware instructions on power9. Can I check this into the trunk? 2017-11-27 Michael Meissner <meissner@linux.vnet.ibm.com> PR libgcc/83112 * config/rs6000/float128-ifunc.c (__addkf3_resolve): Use the correct type for all ifunc resolvers to silence -Wattribute-alias warnings. (__subkf3_resolve): Likewise. (__mulkf3_resolve): Likewise. (__divkf3_resolve): Likewise. (__negkf2_resolve): Likewise. (__eqkf2_resolve): Likewise. (__nekf2_resolve): Likewise. (__gekf2_resolve): Likewise. (__gtkf2_resolve): Likewise. (__lekf2_resolve): Likewise. (__ltkf2_resolve): Likewise. (__unordkf2_resolve): Likewise. (__extendsfkf2_resolve): Likewise. (__extenddfkf2_resolve): Likewise. (__trunckfsf2_resolve): Likewise. (__trunckfdf2_resolve): Likewise. (__fixkfsi_resolve): Likewise. (__fixkfdi_resolve): Likewise. (__fixunskfsi_resolve): Likewise. (__fixunskfdi_resolve): Likewise. (__floatsikf_resolve): Likewise. (__floatdikf_resolve): Likewise. (__floatunsikf_resolve): Likewise. (__floatundikf_resolve): Likewise. (__extendkftf2_resolve): Likewise. (__trunctfkf2_resolve): Likewise. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797 [-- Attachment #2: pr83112.patch01b --] [-- Type: text/plain, Size: 8616 bytes --] Index: libgcc/config/rs6000/float128-ifunc.c =================================================================== --- libgcc/config/rs6000/float128-ifunc.c (revision 255033) +++ libgcc/config/rs6000/float128-ifunc.c (working copy) @@ -54,190 +54,208 @@ 128-bit integer types and 128-bit IEEE floating point, or vice versa. So use the emulator functions for these conversions. */ -static void *__addkf3_resolve (void); -static void *__subkf3_resolve (void); -static void *__mulkf3_resolve (void); -static void *__divkf3_resolve (void); -static void *__negkf2_resolve (void); -static void *__eqkf2_resolve (void); -static void *__nekf2_resolve (void); -static void *__gekf2_resolve (void); -static void *__gtkf2_resolve (void); -static void *__lekf2_resolve (void); -static void *__ltkf2_resolve (void); -static void *__unordkf2_resolve (void); -static void *__extendsfkf2_resolve (void); -static void *__extenddfkf2_resolve (void); -static void *__trunckfsf2_resolve (void); -static void *__trunckfdf2_resolve (void); -static void *__fixkfsi_resolve (void); -static void *__fixkfdi_resolve (void); -static void *__fixunskfsi_resolve (void); -static void *__fixunskfdi_resolve (void); -static void *__floatsikf_resolve (void); -static void *__floatdikf_resolve (void); -static void *__floatunsikf_resolve (void); -static void *__floatundikf_resolve (void); -static void *__extendkftf2_resolve (void); -static void *__trunctfkf2_resolve (void); +typedef TFtype (f128_func_f128_t)(TFtype); +typedef TFtype (f128_func_f128_f128_t)(TFtype, TFtype); +typedef CMPtype (cmp_func_f128_f128_t)(TFtype, TFtype); +typedef TFtype (f128_func_float_t)(float); +typedef TFtype (f128_func_double_t)(double); +typedef float (float_func_f128_t)(TFtype); +typedef double (double_func_f128_t)(TFtype); +typedef SItype_ppc (si_func_f128_t)(TFtype); +typedef DItype_ppc (di_func_f128_t)(TFtype); +typedef USItype_ppc (usi_func_f128_t)(TFtype); +typedef UDItype_ppc (udi_func_f128_t)(TFtype); +typedef TFtype (f128_func_si_t)(SItype_ppc); +typedef TFtype (f128_func_di_t)(DItype_ppc); +typedef TFtype (f128_func_usi_t)(USItype_ppc); +typedef TFtype (f128_func_udi_t)(UDItype_ppc); +typedef IBM128_TYPE (ibm_func_f128_t)(TFtype); +typedef TFtype (f128_func_ibm_t)(IBM128_TYPE); + +static f128_func_f128_f128_t *__addkf3_resolve (void); +static f128_func_f128_f128_t *__subkf3_resolve (void); +static f128_func_f128_f128_t *__mulkf3_resolve (void); +static f128_func_f128_f128_t *__divkf3_resolve (void); +static f128_func_f128_t *__negkf2_resolve (void); +static cmp_func_f128_f128_t *__eqkf2_resolve (void); +static cmp_func_f128_f128_t *__nekf2_resolve (void); +static cmp_func_f128_f128_t *__gekf2_resolve (void); +static cmp_func_f128_f128_t *__gtkf2_resolve (void); +static cmp_func_f128_f128_t *__lekf2_resolve (void); +static cmp_func_f128_f128_t *__ltkf2_resolve (void); +static cmp_func_f128_f128_t *__unordkf2_resolve (void); +static f128_func_float_t *__extendsfkf2_resolve (void); +static f128_func_double_t *__extenddfkf2_resolve (void); +static float_func_f128_t *__trunckfsf2_resolve (void); +static double_func_f128_t *__trunckfdf2_resolve (void); +static si_func_f128_t *__fixkfsi_resolve (void); +static di_func_f128_t *__fixkfdi_resolve (void); +static usi_func_f128_t *__fixunskfsi_resolve (void); +static udi_func_f128_t *__fixunskfdi_resolve (void); +static f128_func_si_t *__floatsikf_resolve (void); +static f128_func_di_t *__floatdikf_resolve (void); +static f128_func_usi_t *__floatunsikf_resolve (void); +static f128_func_udi_t *__floatundikf_resolve (void); +static ibm_func_f128_t *__extendkftf2_resolve (void); +static f128_func_ibm_t *__trunctfkf2_resolve (void); -static void * +static f128_func_f128_f128_t * __addkf3_resolve (void) { - return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw); + return SW_OR_HW (__addkf3_sw, __addkf3_hw); } -static void * +static f128_func_f128_f128_t * __subkf3_resolve (void) { - return (void *) SW_OR_HW (__subkf3_sw, __subkf3_hw); + return SW_OR_HW (__subkf3_sw, __subkf3_hw); } -static void * +static f128_func_f128_f128_t * __mulkf3_resolve (void) { - return (void *) SW_OR_HW (__mulkf3_sw, __mulkf3_hw); + return SW_OR_HW (__mulkf3_sw, __mulkf3_hw); } -static void * +static f128_func_f128_f128_t * __divkf3_resolve (void) { - return (void *) SW_OR_HW (__divkf3_sw, __divkf3_hw); + return SW_OR_HW (__divkf3_sw, __divkf3_hw); } -static void * +static f128_func_f128_t * __negkf2_resolve (void) { - return (void *) SW_OR_HW (__negkf2_sw, __negkf2_hw); + return SW_OR_HW (__negkf2_sw, __negkf2_hw); } -static void * +static f128_func_si_t * __floatsikf_resolve (void) { - return (void *) SW_OR_HW (__floatsikf_sw, __floatsikf_hw); + return SW_OR_HW (__floatsikf_sw, __floatsikf_hw); } -static void * +static f128_func_di_t * __floatdikf_resolve (void) { - return (void *) SW_OR_HW (__floatdikf_sw, __floatdikf_hw); + return SW_OR_HW (__floatdikf_sw, __floatdikf_hw); } -static void * +static f128_func_usi_t * __floatunsikf_resolve (void) { - return (void *) SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw); + return SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw); } -static void * +static f128_func_udi_t * __floatundikf_resolve (void) { - return (void *) SW_OR_HW (__floatundikf_sw, __floatundikf_hw); + return SW_OR_HW (__floatundikf_sw, __floatundikf_hw); } -static void * +static si_func_f128_t * __fixkfsi_resolve (void) { - return (void *) SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw); + return SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw); } -static void * +static di_func_f128_t * __fixkfdi_resolve (void) { - return (void *) SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw); + return SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw); } -static void * +static usi_func_f128_t * __fixunskfsi_resolve (void) { - return (void *) SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw); + return SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw); } -static void * +static udi_func_f128_t * __fixunskfdi_resolve (void) { - return (void *) SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw); + return SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw); } -static void * +static f128_func_float_t * __extendsfkf2_resolve (void) { - return (void *) SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw); + return SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw); } -static void * +static f128_func_double_t * __extenddfkf2_resolve (void) { - return (void *) SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw); + return SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw); } -static void * +static float_func_f128_t * __trunckfsf2_resolve (void) { - return (void *) SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw); + return SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw); } -static void * +static double_func_f128_t * __trunckfdf2_resolve (void) { return (void *) SW_OR_HW (__trunckfdf2_sw, __trunckfdf2_hw); } -static void * +static ibm_func_f128_t * __extendkftf2_resolve (void) { - return (void *) SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw); + return SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw); } -static void * +static f128_func_ibm_t * __trunctfkf2_resolve (void) { return (void *) SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw); } -static void * +static cmp_func_f128_f128_t * __eqkf2_resolve (void) { - return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw); + return SW_OR_HW (__eqkf2_sw, __eqkf2_hw); } -static void * +static cmp_func_f128_f128_t * __gekf2_resolve (void) { - return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw); + return SW_OR_HW (__gekf2_sw, __gekf2_hw); } -static void * +static cmp_func_f128_f128_t * __lekf2_resolve (void) { - return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw); + return SW_OR_HW (__lekf2_sw, __lekf2_hw); } -static void * +static cmp_func_f128_f128_t * __unordkf2_resolve (void) { - return (void *) SW_OR_HW (__unordkf2_sw, __unordkf2_hw); + return SW_OR_HW (__unordkf2_sw, __unordkf2_hw); } /* Resolve __nekf2, __gtkf2, __ltkf2 like __eqkf2, __gekf2, and __lekf2, since the functions return the same values. */ -static void * +static cmp_func_f128_f128_t * __nekf2_resolve (void) { - return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw); + return SW_OR_HW (__eqkf2_sw, __eqkf2_hw); } -static void * +static cmp_func_f128_f128_t * __gtkf2_resolve (void) { - return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw); + return SW_OR_HW (__gekf2_sw, __gekf2_hw); } -static void * +static cmp_func_f128_f128_t * __ltkf2_resolve (void) { - return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw); + return SW_OR_HW (__lekf2_sw, __lekf2_hw); } ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-11-27 19:57 [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c Michael Meissner @ 2017-11-27 22:55 ` Martin Sebor 2017-11-28 0:55 ` Michael Meissner 0 siblings, 1 reply; 12+ messages in thread From: Martin Sebor @ 2017-11-27 22:55 UTC (permalink / raw) To: Michael Meissner, GCC Patches, Segher Boessenkool, David Edelsohn, Bill Schmidt On 11/27/2017 12:21 PM, Michael Meissner wrote: > The new -Wattribute-alias option now issues warnings for old-style ifunc > declarations that coerce the pointer to the function to void *. The > float128-ifunc.c module in libgcc/config/rs6000 now gets a lot of warnings of > the form: > > ../float128-ifunc.c:109:1: warning: ‘ifunc’ resolver for ‘__negkf2’ should > return ‘TFtype (*)(TFtype) {aka _Float128 (*)(_Float128)}’ [-Wattribute-alias] > > This patch fixes these warnings. I have done a full bootstrap build and test > suite run. I have verified that the ifunc handler works correctly, using > software emulation on a power8 and the hardware instructions on power9. Can I > check this into the trunk? Just as a side note, a convenient way to deal with this is to use typeof to deduce the return type of the resolver from the type of the function it returns. I would expect something like the following untested change to do it and make the typedefs unnecessary: -static void * +static __typeof__ (__addkf3_sw) * __addkf3_resolve (void) { - return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw); + return SW_OR_HW (__addkf3_sw, __addkf3_hw); } Martin ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-11-27 22:55 ` Martin Sebor @ 2017-11-28 0:55 ` Michael Meissner 2017-11-30 5:08 ` Segher Boessenkool 0 siblings, 1 reply; 12+ messages in thread From: Michael Meissner @ 2017-11-28 0:55 UTC (permalink / raw) To: Martin Sebor, Segher Boessenkool Cc: Michael Meissner, GCC Patches, David Edelsohn, Bill Schmidt [-- Attachment #1: Type: text/plain, Size: 4090 bytes --] On Mon, Nov 27, 2017 at 03:40:58PM -0700, Martin Sebor wrote: > On 11/27/2017 12:21 PM, Michael Meissner wrote: > >The new -Wattribute-alias option now issues warnings for old-style ifunc > >declarations that coerce the pointer to the function to void *. The > >float128-ifunc.c module in libgcc/config/rs6000 now gets a lot of warnings of > >the form: > > > >../float128-ifunc.c:109:1: warning: âifuncâ resolver for â__negkf2â should > >return âTFtype (*)(TFtype) {aka _Float128 (*)(_Float128)}â [-Wattribute-alias] > > > >This patch fixes these warnings. I have done a full bootstrap build and test > >suite run. I have verified that the ifunc handler works correctly, using > >software emulation on a power8 and the hardware instructions on power9. Can I > >check this into the trunk? > > Just as a side note, a convenient way to deal with this is to use > typeof to deduce the return type of the resolver from the type of > the function it returns. I would expect something like > the following untested change to do it and make the typedefs > unnecessary: > > -static void * > +static __typeof__ (__addkf3_sw) * > __addkf3_resolve (void) > { > - return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw); > + return SW_OR_HW (__addkf3_sw, __addkf3_hw); > } > > Martin Thanks, that does simplify things. I redid the patch for both PR libgcc/83112 (avoid the warnings in float128-ifunc) and PR libgcc/83103 (optimize complex float128 multiply/divide when running on ISA 3.0 hardware). This patch combines both PRs. I have bootstrapped it and done a regression test with no regressions. Can I install this patch in the trunk? 2017-11-27 Michael Meissner <meissner@linux.vnet.ibm.com> PR libgcc/83112 * config/rs6000/float128-ifunc.c (__addkf3_resolve): Use the correct type for all ifunc resolvers to silence -Wattribute-alias warnings. Eliminate the forward declaration of the resolver functions which is no longer needed. (__subkf3_resolve): Likewise. (__mulkf3_resolve): Likewise. (__divkf3_resolve): Likewise. (__negkf2_resolve): Likewise. (__eqkf2_resolve): Likewise. (__nekf2_resolve): Likewise. (__gekf2_resolve): Likewise. (__gtkf2_resolve): Likewise. (__lekf2_resolve): Likewise. (__ltkf2_resolve): Likewise. (__unordkf2_resolve): Likewise. (__extendsfkf2_resolve): Likewise. (__extenddfkf2_resolve): Likewise. (__trunckfsf2_resolve): Likewise. (__trunckfdf2_resolve): Likewise. (__fixkfsi_resolve): Likewise. (__fixkfdi_resolve): Likewise. (__fixunskfsi_resolve): Likewise. (__fixunskfdi_resolve): Likewise. (__floatsikf_resolve): Likewise. (__floatdikf_resolve): Likewise. (__floatunsikf_resolve): Likewise. (__floatundikf_resolve): Likewise. (__extendkftf2_resolve): Likewise. (__trunctfkf2_resolve): Likewise. PR libgcc/83103 * config/rs6000/quad-float128.h (TF): Don't define if long double is IEEE 128-bit floating point. (TCtype): Define as either TCmode or KCmode, depending on whether long double is IEEE 128-bit floating point. (__mulkc3_sw): Add declarations for software/hardware versions of complex multiply/divide. (__divkc3_sw): Likewise. (__mulkc3_hw): Likewise. (__divkc3_hw): Likewise. * config/rs6000/_mulkc3.c (_mulkc3): If we are building ifunc handlers to switch between using software emulation and hardware float128 instructions, build the complex multiply/divide functions for both software and hardware support. * config/rs6000/_divkc3.c (_divkc3): Likewise. * config/rs6000/float128-ifunc.c (__mulkc3_resolve): Likewise. (__divkc3_resolve): Likewise. (__mulkc3): Likewise. (__divkc3): Likewise. * config/rs6000/t-float128-hw (fp128_hardfp_src): Likewise. (fp128_hw_src): Likewise. (fp128_hw_static_obj): Likewise. (fp128_hw_shared_obj): Likewise. (_mulkc3-hw.c): Likewise. (_divkc3-hw.c): Likewise. * config/rs6000/t-float128 (clean-float128): Delete _mulkc3-hw.c and _divkc3-hw.c. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797 [-- Attachment #2: pr83112.patch02b --] [-- Type: text/plain, Size: 12117 bytes --] Index: libgcc/config/rs6000/quad-float128.h =================================================================== --- libgcc/config/rs6000/quad-float128.h (revision 255177) +++ libgcc/config/rs6000/quad-float128.h (working copy) @@ -30,13 +30,20 @@ /* quad.h defines the TFtype type by: typedef float TFtype __attribute__ ((mode (TF))); - This define forces it to use KFmode (aka, ieee 128-bit floating point). */ + This define forces it to use KFmode (aka, ieee 128-bit floating point). + However, when the compiler's default is changed so that long double is IEEE + 128-bit floating point, we need to go back to using TFmode and TCmode. */ +#ifndef __LONG_DOUBLE_IEEE128__ #define TF KF /* We also need TCtype to represent complex ieee 128-bit float for __mulkc3 and __divkc3. */ typedef __complex float TCtype __attribute__ ((mode (KC))); +#else +typedef __complex float TCtype __attribute__ ((mode (TC))); +#endif + /* Force the use of the VSX instruction set. */ #if defined(_ARCH_PPC) && (!defined(__VSX__) || !defined(__FLOAT128__)) #pragma GCC target ("vsx,float128") @@ -88,6 +95,8 @@ extern TFtype __floatunsikf_sw (USItype_ extern TFtype __floatundikf_sw (UDItype_ppc); extern IBM128_TYPE __extendkftf2_sw (TFtype); extern TFtype __trunctfkf2_sw (IBM128_TYPE); +extern TCtype __mulkc3_sw (TFtype, TFtype, TFtype, TFtype); +extern TCtype __divkc3_sw (TFtype, TFtype, TFtype, TFtype); #ifdef _ARCH_PPC64 /* We do not provide ifunc resolvers for __fixkfti, __fixunskfti, __floattikf, @@ -128,6 +137,8 @@ extern TFtype __floatunsikf_hw (USItype_ extern TFtype __floatundikf_hw (UDItype_ppc); extern IBM128_TYPE __extendkftf2_hw (TFtype); extern TFtype __trunctfkf2_hw (IBM128_TYPE); +extern TCtype __mulkc3_hw (TFtype, TFtype, TFtype, TFtype); +extern TCtype __divkc3_hw (TFtype, TFtype, TFtype, TFtype); /* Ifunc function declarations, to automatically switch between software emulation and hardware support. */ Index: libgcc/config/rs6000/_mulkc3.c =================================================================== --- libgcc/config/rs6000/_mulkc3.c (revision 255177) +++ libgcc/config/rs6000/_mulkc3.c (working copy) @@ -31,6 +31,10 @@ typedef __complex float KCtype __attribu #define isnan __builtin_isnan #define isinf __builtin_isinf +#if defined(FLOAT128_HW_INSNS) && !defined(__mulkc3) +#define __mulkc3 __mulkc3_sw +#endif + KCtype __mulkc3 (KFtype a, KFtype b, KFtype c, KFtype d) { Index: libgcc/config/rs6000/_divkc3.c =================================================================== --- libgcc/config/rs6000/_divkc3.c (revision 255177) +++ libgcc/config/rs6000/_divkc3.c (working copy) @@ -33,6 +33,10 @@ typedef __complex float KCtype __attribu #define isinf __builtin_isinf #define isfinite __builtin_isfinite +#if defined(FLOAT128_HW_INSNS) && !defined(__divkc3) +#define __divkc3 __divkc3_sw +#endif + KCtype __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d) { Index: libgcc/config/rs6000/float128-ifunc.c =================================================================== --- libgcc/config/rs6000/float128-ifunc.c (revision 255177) +++ libgcc/config/rs6000/float128-ifunc.c (working copy) @@ -54,190 +54,175 @@ 128-bit integer types and 128-bit IEEE floating point, or vice versa. So use the emulator functions for these conversions. */ -static void *__addkf3_resolve (void); -static void *__subkf3_resolve (void); -static void *__mulkf3_resolve (void); -static void *__divkf3_resolve (void); -static void *__negkf2_resolve (void); -static void *__eqkf2_resolve (void); -static void *__nekf2_resolve (void); -static void *__gekf2_resolve (void); -static void *__gtkf2_resolve (void); -static void *__lekf2_resolve (void); -static void *__ltkf2_resolve (void); -static void *__unordkf2_resolve (void); -static void *__extendsfkf2_resolve (void); -static void *__extenddfkf2_resolve (void); -static void *__trunckfsf2_resolve (void); -static void *__trunckfdf2_resolve (void); -static void *__fixkfsi_resolve (void); -static void *__fixkfdi_resolve (void); -static void *__fixunskfsi_resolve (void); -static void *__fixunskfdi_resolve (void); -static void *__floatsikf_resolve (void); -static void *__floatdikf_resolve (void); -static void *__floatunsikf_resolve (void); -static void *__floatundikf_resolve (void); -static void *__extendkftf2_resolve (void); -static void *__trunctfkf2_resolve (void); - -static void * +static __typeof__ (__addkf3_sw) * __addkf3_resolve (void) { - return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw); + return SW_OR_HW (__addkf3_sw, __addkf3_hw); } -static void * +static __typeof__ (__subkf3_sw) * __subkf3_resolve (void) { - return (void *) SW_OR_HW (__subkf3_sw, __subkf3_hw); + return SW_OR_HW (__subkf3_sw, __subkf3_hw); } -static void * +static __typeof__ (__mulkf3_sw) * __mulkf3_resolve (void) { - return (void *) SW_OR_HW (__mulkf3_sw, __mulkf3_hw); + return SW_OR_HW (__mulkf3_sw, __mulkf3_hw); } -static void * +static __typeof__ (__divkf3_sw) * __divkf3_resolve (void) { - return (void *) SW_OR_HW (__divkf3_sw, __divkf3_hw); + return SW_OR_HW (__divkf3_sw, __divkf3_hw); } -static void * +static __typeof__ (__negkf2_sw) * __negkf2_resolve (void) { - return (void *) SW_OR_HW (__negkf2_sw, __negkf2_hw); + return SW_OR_HW (__negkf2_sw, __negkf2_hw); } -static void * +static __typeof__ (__floatsikf_sw) * __floatsikf_resolve (void) { - return (void *) SW_OR_HW (__floatsikf_sw, __floatsikf_hw); + return SW_OR_HW (__floatsikf_sw, __floatsikf_hw); } -static void * +static __typeof__ (__floatdikf_sw) * __floatdikf_resolve (void) { - return (void *) SW_OR_HW (__floatdikf_sw, __floatdikf_hw); + return SW_OR_HW (__floatdikf_sw, __floatdikf_hw); } -static void * +static __typeof__ (__floatunsikf_sw) * __floatunsikf_resolve (void) { - return (void *) SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw); + return SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw); } -static void * +static __typeof__ (__floatundikf_sw) * __floatundikf_resolve (void) { - return (void *) SW_OR_HW (__floatundikf_sw, __floatundikf_hw); + return SW_OR_HW (__floatundikf_sw, __floatundikf_hw); } -static void * +static __typeof__ (__fixkfsi_sw) * __fixkfsi_resolve (void) { - return (void *) SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw); + return SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw); } -static void * +static __typeof__ (__fixkfdi_sw) * __fixkfdi_resolve (void) { - return (void *) SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw); + return SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw); } -static void * +static __typeof__ (__fixunskfsi_sw) * __fixunskfsi_resolve (void) { - return (void *) SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw); + return SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw); } -static void * +static __typeof__ (__fixunskfdi_sw) * __fixunskfdi_resolve (void) { - return (void *) SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw); + return SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw); } -static void * +static __typeof__ (__extendsfkf2_sw) * __extendsfkf2_resolve (void) { - return (void *) SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw); + return SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw); } -static void * +static __typeof__ (__extenddfkf2_sw) * __extenddfkf2_resolve (void) { - return (void *) SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw); + return SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw); } -static void * +static __typeof__ (__trunckfsf2_sw) * __trunckfsf2_resolve (void) { - return (void *) SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw); + return SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw); } -static void * +static __typeof__ (__trunckfdf2_sw) * __trunckfdf2_resolve (void) { return (void *) SW_OR_HW (__trunckfdf2_sw, __trunckfdf2_hw); } -static void * +static __typeof__ (__extendkftf2_sw) * __extendkftf2_resolve (void) { - return (void *) SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw); + return SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw); } -static void * +static __typeof__ (__trunctfkf2_sw) * __trunctfkf2_resolve (void) { - return (void *) SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw); + return SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw); } -static void * +static __typeof__ (__mulkc3_sw) * +__mulkc3_resolve (void) +{ + return SW_OR_HW (__mulkc3_sw, __mulkc3_hw); +} + +static __typeof__ (__divkc3_sw) * +__divkc3_resolve (void) +{ + return SW_OR_HW (__divkc3_sw, __divkc3_hw); +} + +static __typeof__ (__eqkf2_sw) * __eqkf2_resolve (void) { - return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw); + return SW_OR_HW (__eqkf2_sw, __eqkf2_hw); } -static void * +static __typeof__ (__gekf2_sw) * __gekf2_resolve (void) { - return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw); + return SW_OR_HW (__gekf2_sw, __gekf2_hw); } -static void * +static __typeof__ (__lekf2_sw) * __lekf2_resolve (void) { - return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw); + return SW_OR_HW (__lekf2_sw, __lekf2_hw); } -static void * +static __typeof__ (__unordkf2_sw) * __unordkf2_resolve (void) { - return (void *) SW_OR_HW (__unordkf2_sw, __unordkf2_hw); + return SW_OR_HW (__unordkf2_sw, __unordkf2_hw); } /* Resolve __nekf2, __gtkf2, __ltkf2 like __eqkf2, __gekf2, and __lekf2, since the functions return the same values. */ -static void * +static __typeof__ (__eqkf2_sw) * __nekf2_resolve (void) { - return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw); + return SW_OR_HW (__eqkf2_sw, __eqkf2_hw); } -static void * +static __typeof__ (__eqkf2_sw) * __gtkf2_resolve (void) { - return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw); + return SW_OR_HW (__gekf2_sw, __gekf2_hw); } -static void * +static __typeof__ (__eqkf2_sw) * __ltkf2_resolve (void) { - return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw); + return SW_OR_HW (__lekf2_sw, __lekf2_hw); } @@ -320,3 +305,9 @@ IBM128_TYPE __extendkftf2 (TFtype) TFtype __trunctfkf2 (IBM128_TYPE) __attribute__ ((__ifunc__ ("__trunctfkf2_resolve"))); + +TCtype __mulkc3 (TFtype, TFtype, TFtype, TFtype) + __attribute__ ((__ifunc__ ("__mulkc3_resolve"))); + +TCtype __divkc3 (TFtype, TFtype, TFtype, TFtype) + __attribute__ ((__ifunc__ ("__divkc3_resolve"))); Index: libgcc/config/rs6000/t-float128-hw =================================================================== --- libgcc/config/rs6000/t-float128-hw (revision 255177) +++ libgcc/config/rs6000/t-float128-hw (working copy) @@ -5,10 +5,12 @@ FLOAT128_HW_INSNS = -DFLOAT128_HW_INSNS # New functions for hardware support -fp128_hw_funcs = float128-hw -fp128_hw_src = $(srcdir)/config/rs6000/float128-hw.c -fp128_hw_static_obj = float128-hw$(objext) -fp128_hw_shared_obj = float128-hw_s$(objext) +fp128_hardfp_src = _mulkc3-hw.c _divkc3-hw.c +fp128_hw_funcs = float128-hw _mulkc3-hw _divkc3-hw +fp128_hw_src = $(srcdir)/config/rs6000/float128-hw.c _mulkc3-hw.c \ + _divkc3-hw.c +fp128_hw_static_obj = $(addsuffix $(objext),$(fp128_hw_funcs)) +fp128_hw_shared_obj = $(addsuffix _s$(objext),$(fp128_hw_funcs)) fp128_hw_obj = $(fp128_hw_static_obj) $(fp128_hw_shared_obj) fp128_ifunc_funcs = float128-ifunc @@ -33,3 +35,13 @@ $(fp128_hw_obj) : $(srcdir)/config/rs6 $(fp128_ifunc_obj) : INTERNAL_CFLAGS += $(FP128_CFLAGS_SW) $(fp128_ifunc_obj) : $(srcdir)/config/rs6000/t-float128-hw + +_mulkc3-hw.c: $(srcdir)/config/rs6000/_mulkc3.c + rm -rf _mulkc3.c + (echo "#define __mulkc3 __mulkc3_hw"; \ + cat $(srcdir)/config/rs6000/_mulkc3.c) > _mulkc3-hw.c + +_divkc3-hw.c: $(srcdir)/config/rs6000/_divkc3.c + rm -rf _divkc3.c + (echo "#define __divkc3 __divkc3_hw"; \ + cat $(srcdir)/config/rs6000/_divkc3.c) > _divkc3-hw.c Index: libgcc/config/rs6000/t-float128 =================================================================== --- libgcc/config/rs6000/t-float128 (revision 255177) +++ libgcc/config/rs6000/t-float128 (working copy) @@ -86,7 +86,7 @@ test: for x in $(fp128_obj); do echo " $$x"; done; clean-float128: - rm -rf $(fp128_softfp_src) + rm -rf $(fp128_softfp_src) $(fp128_hardfp_src) @$(MULTICLEAN) multi-clean DO=clean-float128 # For now, only put it in the static library ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-11-28 0:55 ` Michael Meissner @ 2017-11-30 5:08 ` Segher Boessenkool 2017-11-30 21:52 ` Michael Meissner 0 siblings, 1 reply; 12+ messages in thread From: Segher Boessenkool @ 2017-11-30 5:08 UTC (permalink / raw) To: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn, Bill Schmidt Hi, On Mon, Nov 27, 2017 at 06:40:09PM -0500, Michael Meissner wrote: > @@ -33,3 +35,13 @@ $(fp128_hw_obj) : $(srcdir)/config/rs6 > > $(fp128_ifunc_obj) : INTERNAL_CFLAGS += $(FP128_CFLAGS_SW) > $(fp128_ifunc_obj) : $(srcdir)/config/rs6000/t-float128-hw > + > +_mulkc3-hw.c: $(srcdir)/config/rs6000/_mulkc3.c > + rm -rf _mulkc3.c > + (echo "#define __mulkc3 __mulkc3_hw"; \ > + cat $(srcdir)/config/rs6000/_mulkc3.c) > _mulkc3-hw.c Please don't -rf. -rf is a dangerous habit. This also won't work if anything tries to build _mulkc3-hw.c a second time; you have deleted its prerequisite. Maybe some other scheme is better? > --- libgcc/config/rs6000/t-float128 (revision 255177) > +++ libgcc/config/rs6000/t-float128 (working copy) > @@ -86,7 +86,7 @@ test: > for x in $(fp128_obj); do echo " $$x"; done; > > clean-float128: > - rm -rf $(fp128_softfp_src) > + rm -rf $(fp128_softfp_src) $(fp128_hardfp_src) > @$(MULTICLEAN) multi-clean DO=clean-float128 -rm to avoid warnings from rm if you clean without the files being there. Otherwise looks good. Thanks! Segher ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-11-30 5:08 ` Segher Boessenkool @ 2017-11-30 21:52 ` Michael Meissner 2017-12-01 5:40 ` Michael Meissner 0 siblings, 1 reply; 12+ messages in thread From: Michael Meissner @ 2017-11-30 21:52 UTC (permalink / raw) To: Segher Boessenkool Cc: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn, Bill Schmidt [-- Attachment #1: Type: text/plain, Size: 3833 bytes --] On Wed, Nov 29, 2017 at 08:42:51PM -0600, Segher Boessenkool wrote: > Hi, > > On Mon, Nov 27, 2017 at 06:40:09PM -0500, Michael Meissner wrote: > > @@ -33,3 +35,13 @@ $(fp128_hw_obj) : $(srcdir)/config/rs6 > > > > $(fp128_ifunc_obj) : INTERNAL_CFLAGS += $(FP128_CFLAGS_SW) > > $(fp128_ifunc_obj) : $(srcdir)/config/rs6000/t-float128-hw > > + > > +_mulkc3-hw.c: $(srcdir)/config/rs6000/_mulkc3.c > > + rm -rf _mulkc3.c > > + (echo "#define __mulkc3 __mulkc3_hw"; \ > > + cat $(srcdir)/config/rs6000/_mulkc3.c) > _mulkc3-hw.c > > Please don't -rf. -rf is a dangerous habit. > > This also won't work if anything tries to build _mulkc3-hw.c a second > time; you have deleted its prerequisite. > > Maybe some other scheme is better? > > > --- libgcc/config/rs6000/t-float128 (revision 255177) > > +++ libgcc/config/rs6000/t-float128 (working copy) > > @@ -86,7 +86,7 @@ test: > > for x in $(fp128_obj); do echo " $$x"; done; > > > > clean-float128: > > - rm -rf $(fp128_softfp_src) > > + rm -rf $(fp128_softfp_src) $(fp128_hardfp_src) > > @$(MULTICLEAN) multi-clean DO=clean-float128 > > -rm to avoid warnings from rm if you clean without the files being there. > > Otherwise looks good. Thanks! As we discussed on private IRC, I mistakenly deleted the _{mul,div}kc3.c file when I meant to delete the _{mul,div}kc3-hw.c file before recreating it. This is the patch I checked in (subversion id 255282): 2017-11-30 Michael Meissner <meissner@linux.vnet.ibm.com> PR libgcc/83112 * config/rs6000/float128-ifunc.c (__addkf3_resolve): Use the correct type for all ifunc resolvers to silence -Wattribute-alias warnings. Eliminate the forward declaration of the resolver functions which is no longer needed. (__subkf3_resolve): Likewise. (__mulkf3_resolve): Likewise. (__divkf3_resolve): Likewise. (__negkf2_resolve): Likewise. (__eqkf2_resolve): Likewise. (__nekf2_resolve): Likewise. (__gekf2_resolve): Likewise. (__gtkf2_resolve): Likewise. (__lekf2_resolve): Likewise. (__ltkf2_resolve): Likewise. (__unordkf2_resolve): Likewise. (__extendsfkf2_resolve): Likewise. (__extenddfkf2_resolve): Likewise. (__trunckfsf2_resolve): Likewise. (__trunckfdf2_resolve): Likewise. (__fixkfsi_resolve): Likewise. (__fixkfdi_resolve): Likewise. (__fixunskfsi_resolve): Likewise. (__fixunskfdi_resolve): Likewise. (__floatsikf_resolve): Likewise. (__floatdikf_resolve): Likewise. (__floatunsikf_resolve): Likewise. (__floatundikf_resolve): Likewise. (__extendkftf2_resolve): Likewise. (__trunctfkf2_resolve): Likewise. PR libgcc/83103 * config/rs6000/quad-float128.h (TF): Don't define if long double is IEEE 128-bit floating point. (TCtype): Define as either TCmode or KCmode, depending on whether long double is IEEE 128-bit floating point. (__mulkc3_sw): Add declarations for software/hardware versions of complex multiply/divide. (__divkc3_sw): Likewise. (__mulkc3_hw): Likewise. (__divkc3_hw): Likewise. * config/rs6000/_mulkc3.c (_mulkc3): If we are building ifunc handlers to switch between using software emulation and hardware float128 instructions, build the complex multiply/divide functions for both software and hardware support. * config/rs6000/_divkc3.c (_divkc3): Likewise. * config/rs6000/float128-ifunc.c (__mulkc3_resolve): Likewise. (__divkc3_resolve): Likewise. (__mulkc3): Likewise. (__divkc3): Likewise. * config/rs6000/t-float128-hw (fp128_hardfp_src): Likewise. (fp128_hw_src): Likewise. (fp128_hw_static_obj): Likewise. (fp128_hw_shared_obj): Likewise. (_mulkc3-hw.c): Likewise. (_divkc3-hw.c): Likewise. * config/rs6000/t-float128 (clean-float128): Delete _mulkc3-hw.c and _divkc3-hw.c. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797 [-- Attachment #2: pr83112.patch03b --] [-- Type: text/plain, Size: 12079 bytes --] Index: libgcc/config/rs6000/quad-float128.h =================================================================== --- libgcc/config/rs6000/quad-float128.h (revision 255281) +++ libgcc/config/rs6000/quad-float128.h (working copy) @@ -30,13 +30,20 @@ /* quad.h defines the TFtype type by: typedef float TFtype __attribute__ ((mode (TF))); - This define forces it to use KFmode (aka, ieee 128-bit floating point). */ + This define forces it to use KFmode (aka, ieee 128-bit floating point). + However, when the compiler's default is changed so that long double is IEEE + 128-bit floating point, we need to go back to using TFmode and TCmode. */ +#ifndef __LONG_DOUBLE_IEEE128__ #define TF KF /* We also need TCtype to represent complex ieee 128-bit float for __mulkc3 and __divkc3. */ typedef __complex float TCtype __attribute__ ((mode (KC))); +#else +typedef __complex float TCtype __attribute__ ((mode (TC))); +#endif + /* Force the use of the VSX instruction set. */ #if defined(_ARCH_PPC) && (!defined(__VSX__) || !defined(__FLOAT128__)) #pragma GCC target ("vsx,float128") @@ -88,6 +95,8 @@ extern TFtype __floatunsikf_sw (USItype_ extern TFtype __floatundikf_sw (UDItype_ppc); extern IBM128_TYPE __extendkftf2_sw (TFtype); extern TFtype __trunctfkf2_sw (IBM128_TYPE); +extern TCtype __mulkc3_sw (TFtype, TFtype, TFtype, TFtype); +extern TCtype __divkc3_sw (TFtype, TFtype, TFtype, TFtype); #ifdef _ARCH_PPC64 /* We do not provide ifunc resolvers for __fixkfti, __fixunskfti, __floattikf, @@ -128,6 +137,8 @@ extern TFtype __floatunsikf_hw (USItype_ extern TFtype __floatundikf_hw (UDItype_ppc); extern IBM128_TYPE __extendkftf2_hw (TFtype); extern TFtype __trunctfkf2_hw (IBM128_TYPE); +extern TCtype __mulkc3_hw (TFtype, TFtype, TFtype, TFtype); +extern TCtype __divkc3_hw (TFtype, TFtype, TFtype, TFtype); /* Ifunc function declarations, to automatically switch between software emulation and hardware support. */ Index: libgcc/config/rs6000/_mulkc3.c =================================================================== --- libgcc/config/rs6000/_mulkc3.c (revision 255281) +++ libgcc/config/rs6000/_mulkc3.c (working copy) @@ -31,6 +31,10 @@ typedef __complex float KCtype __attribu #define isnan __builtin_isnan #define isinf __builtin_isinf +#if defined(FLOAT128_HW_INSNS) && !defined(__mulkc3) +#define __mulkc3 __mulkc3_sw +#endif + KCtype __mulkc3 (KFtype a, KFtype b, KFtype c, KFtype d) { Index: libgcc/config/rs6000/_divkc3.c =================================================================== --- libgcc/config/rs6000/_divkc3.c (revision 255281) +++ libgcc/config/rs6000/_divkc3.c (working copy) @@ -33,6 +33,10 @@ typedef __complex float KCtype __attribu #define isinf __builtin_isinf #define isfinite __builtin_isfinite +#if defined(FLOAT128_HW_INSNS) && !defined(__divkc3) +#define __divkc3 __divkc3_sw +#endif + KCtype __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d) { Index: libgcc/config/rs6000/float128-ifunc.c =================================================================== --- libgcc/config/rs6000/float128-ifunc.c (revision 255281) +++ libgcc/config/rs6000/float128-ifunc.c (working copy) @@ -54,190 +54,175 @@ 128-bit integer types and 128-bit IEEE floating point, or vice versa. So use the emulator functions for these conversions. */ -static void *__addkf3_resolve (void); -static void *__subkf3_resolve (void); -static void *__mulkf3_resolve (void); -static void *__divkf3_resolve (void); -static void *__negkf2_resolve (void); -static void *__eqkf2_resolve (void); -static void *__nekf2_resolve (void); -static void *__gekf2_resolve (void); -static void *__gtkf2_resolve (void); -static void *__lekf2_resolve (void); -static void *__ltkf2_resolve (void); -static void *__unordkf2_resolve (void); -static void *__extendsfkf2_resolve (void); -static void *__extenddfkf2_resolve (void); -static void *__trunckfsf2_resolve (void); -static void *__trunckfdf2_resolve (void); -static void *__fixkfsi_resolve (void); -static void *__fixkfdi_resolve (void); -static void *__fixunskfsi_resolve (void); -static void *__fixunskfdi_resolve (void); -static void *__floatsikf_resolve (void); -static void *__floatdikf_resolve (void); -static void *__floatunsikf_resolve (void); -static void *__floatundikf_resolve (void); -static void *__extendkftf2_resolve (void); -static void *__trunctfkf2_resolve (void); - -static void * +static __typeof__ (__addkf3_sw) * __addkf3_resolve (void) { - return (void *) SW_OR_HW (__addkf3_sw, __addkf3_hw); + return SW_OR_HW (__addkf3_sw, __addkf3_hw); } -static void * +static __typeof__ (__subkf3_sw) * __subkf3_resolve (void) { - return (void *) SW_OR_HW (__subkf3_sw, __subkf3_hw); + return SW_OR_HW (__subkf3_sw, __subkf3_hw); } -static void * +static __typeof__ (__mulkf3_sw) * __mulkf3_resolve (void) { - return (void *) SW_OR_HW (__mulkf3_sw, __mulkf3_hw); + return SW_OR_HW (__mulkf3_sw, __mulkf3_hw); } -static void * +static __typeof__ (__divkf3_sw) * __divkf3_resolve (void) { - return (void *) SW_OR_HW (__divkf3_sw, __divkf3_hw); + return SW_OR_HW (__divkf3_sw, __divkf3_hw); } -static void * +static __typeof__ (__negkf2_sw) * __negkf2_resolve (void) { - return (void *) SW_OR_HW (__negkf2_sw, __negkf2_hw); + return SW_OR_HW (__negkf2_sw, __negkf2_hw); } -static void * +static __typeof__ (__floatsikf_sw) * __floatsikf_resolve (void) { - return (void *) SW_OR_HW (__floatsikf_sw, __floatsikf_hw); + return SW_OR_HW (__floatsikf_sw, __floatsikf_hw); } -static void * +static __typeof__ (__floatdikf_sw) * __floatdikf_resolve (void) { - return (void *) SW_OR_HW (__floatdikf_sw, __floatdikf_hw); + return SW_OR_HW (__floatdikf_sw, __floatdikf_hw); } -static void * +static __typeof__ (__floatunsikf_sw) * __floatunsikf_resolve (void) { - return (void *) SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw); + return SW_OR_HW (__floatunsikf_sw, __floatunsikf_hw); } -static void * +static __typeof__ (__floatundikf_sw) * __floatundikf_resolve (void) { - return (void *) SW_OR_HW (__floatundikf_sw, __floatundikf_hw); + return SW_OR_HW (__floatundikf_sw, __floatundikf_hw); } -static void * +static __typeof__ (__fixkfsi_sw) * __fixkfsi_resolve (void) { - return (void *) SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw); + return SW_OR_HW (__fixkfsi_sw, __fixkfsi_hw); } -static void * +static __typeof__ (__fixkfdi_sw) * __fixkfdi_resolve (void) { - return (void *) SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw); + return SW_OR_HW (__fixkfdi_sw, __fixkfdi_hw); } -static void * +static __typeof__ (__fixunskfsi_sw) * __fixunskfsi_resolve (void) { - return (void *) SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw); + return SW_OR_HW (__fixunskfsi_sw, __fixunskfsi_hw); } -static void * +static __typeof__ (__fixunskfdi_sw) * __fixunskfdi_resolve (void) { - return (void *) SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw); + return SW_OR_HW (__fixunskfdi_sw, __fixunskfdi_hw); } -static void * +static __typeof__ (__extendsfkf2_sw) * __extendsfkf2_resolve (void) { - return (void *) SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw); + return SW_OR_HW (__extendsfkf2_sw, __extendsfkf2_hw); } -static void * +static __typeof__ (__extenddfkf2_sw) * __extenddfkf2_resolve (void) { - return (void *) SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw); + return SW_OR_HW (__extenddfkf2_sw, __extenddfkf2_hw); } -static void * +static __typeof__ (__trunckfsf2_sw) * __trunckfsf2_resolve (void) { - return (void *) SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw); + return SW_OR_HW (__trunckfsf2_sw, __trunckfsf2_hw); } -static void * +static __typeof__ (__trunckfdf2_sw) * __trunckfdf2_resolve (void) { return (void *) SW_OR_HW (__trunckfdf2_sw, __trunckfdf2_hw); } -static void * +static __typeof__ (__extendkftf2_sw) * __extendkftf2_resolve (void) { - return (void *) SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw); + return SW_OR_HW (__extendkftf2_sw, __extendkftf2_hw); } -static void * +static __typeof__ (__trunctfkf2_sw) * __trunctfkf2_resolve (void) { - return (void *) SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw); + return SW_OR_HW (__trunctfkf2_sw, __trunctfkf2_hw); } -static void * +static __typeof__ (__mulkc3_sw) * +__mulkc3_resolve (void) +{ + return SW_OR_HW (__mulkc3_sw, __mulkc3_hw); +} + +static __typeof__ (__divkc3_sw) * +__divkc3_resolve (void) +{ + return SW_OR_HW (__divkc3_sw, __divkc3_hw); +} + +static __typeof__ (__eqkf2_sw) * __eqkf2_resolve (void) { - return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw); + return SW_OR_HW (__eqkf2_sw, __eqkf2_hw); } -static void * +static __typeof__ (__gekf2_sw) * __gekf2_resolve (void) { - return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw); + return SW_OR_HW (__gekf2_sw, __gekf2_hw); } -static void * +static __typeof__ (__lekf2_sw) * __lekf2_resolve (void) { - return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw); + return SW_OR_HW (__lekf2_sw, __lekf2_hw); } -static void * +static __typeof__ (__unordkf2_sw) * __unordkf2_resolve (void) { - return (void *) SW_OR_HW (__unordkf2_sw, __unordkf2_hw); + return SW_OR_HW (__unordkf2_sw, __unordkf2_hw); } /* Resolve __nekf2, __gtkf2, __ltkf2 like __eqkf2, __gekf2, and __lekf2, since the functions return the same values. */ -static void * +static __typeof__ (__eqkf2_sw) * __nekf2_resolve (void) { - return (void *) SW_OR_HW (__eqkf2_sw, __eqkf2_hw); + return SW_OR_HW (__eqkf2_sw, __eqkf2_hw); } -static void * +static __typeof__ (__eqkf2_sw) * __gtkf2_resolve (void) { - return (void *) SW_OR_HW (__gekf2_sw, __gekf2_hw); + return SW_OR_HW (__gekf2_sw, __gekf2_hw); } -static void * +static __typeof__ (__eqkf2_sw) * __ltkf2_resolve (void) { - return (void *) SW_OR_HW (__lekf2_sw, __lekf2_hw); + return SW_OR_HW (__lekf2_sw, __lekf2_hw); } @@ -320,3 +305,9 @@ IBM128_TYPE __extendkftf2 (TFtype) TFtype __trunctfkf2 (IBM128_TYPE) __attribute__ ((__ifunc__ ("__trunctfkf2_resolve"))); + +TCtype __mulkc3 (TFtype, TFtype, TFtype, TFtype) + __attribute__ ((__ifunc__ ("__mulkc3_resolve"))); + +TCtype __divkc3 (TFtype, TFtype, TFtype, TFtype) + __attribute__ ((__ifunc__ ("__divkc3_resolve"))); Index: libgcc/config/rs6000/t-float128-hw =================================================================== --- libgcc/config/rs6000/t-float128-hw (revision 255281) +++ libgcc/config/rs6000/t-float128-hw (working copy) @@ -5,10 +5,12 @@ FLOAT128_HW_INSNS = -DFLOAT128_HW_INSNS # New functions for hardware support -fp128_hw_funcs = float128-hw -fp128_hw_src = $(srcdir)/config/rs6000/float128-hw.c -fp128_hw_static_obj = float128-hw$(objext) -fp128_hw_shared_obj = float128-hw_s$(objext) +fp128_hardfp_src = _mulkc3-hw.c _divkc3-hw.c +fp128_hw_funcs = float128-hw _mulkc3-hw _divkc3-hw +fp128_hw_src = $(srcdir)/config/rs6000/float128-hw.c _mulkc3-hw.c \ + _divkc3-hw.c +fp128_hw_static_obj = $(addsuffix $(objext),$(fp128_hw_funcs)) +fp128_hw_shared_obj = $(addsuffix _s$(objext),$(fp128_hw_funcs)) fp128_hw_obj = $(fp128_hw_static_obj) $(fp128_hw_shared_obj) fp128_ifunc_funcs = float128-ifunc @@ -33,3 +35,11 @@ $(fp128_hw_obj) : $(srcdir)/config/rs6 $(fp128_ifunc_obj) : INTERNAL_CFLAGS += $(FP128_CFLAGS_SW) $(fp128_ifunc_obj) : $(srcdir)/config/rs6000/t-float128-hw + +_mulkc3-hw.c: $(srcdir)/config/rs6000/_mulkc3.c + (echo "#define __mulkc3 __mulkc3_hw"; \ + cat $(srcdir)/config/rs6000/_mulkc3.c) > _mulkc3-hw.c + +_divkc3-hw.c: $(srcdir)/config/rs6000/_divkc3.c + (echo "#define __divkc3 __divkc3_hw"; \ + cat $(srcdir)/config/rs6000/_divkc3.c) > _divkc3-hw.c Index: libgcc/config/rs6000/t-float128 =================================================================== --- libgcc/config/rs6000/t-float128 (revision 255281) +++ libgcc/config/rs6000/t-float128 (working copy) @@ -86,7 +86,7 @@ test: for x in $(fp128_obj); do echo " $$x"; done; clean-float128: - rm -rf $(fp128_softfp_src) + -rm -f $(fp128_softfp_src) $(fp128_hardfp_src) @$(MULTICLEAN) multi-clean DO=clean-float128 # For now, only put it in the static library ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-11-30 21:52 ` Michael Meissner @ 2017-12-01 5:40 ` Michael Meissner 2017-12-01 23:54 ` Segher Boessenkool 0 siblings, 1 reply; 12+ messages in thread From: Michael Meissner @ 2017-12-01 5:40 UTC (permalink / raw) To: Michael Meissner, Segher Boessenkool, Martin Sebor, GCC Patches, David Edelsohn, Bill Schmidt After committing the previous patch, I noticed that it was now generating warnings for __{mul,div}kc3_{sw,hw} not having a prototype that I hadn't noticed during development of the patch. This is due to the fact that before I added the ifunc support, it was only compiling __{mul,div}kc3, and those have built-in declarations. I installed this patch as being obvious: 2017-11-30 Michael Meissner <meissner@linux.vnet.ibm.com> * config/rs6000/_mulkc3.c (__mulkc3): Add forward declaration. * config/rs6000/_divkc3.c (__divkc3): Likewise. Index: libgcc/config/rs6000/_divkc3.c =================================================================== --- libgcc/config/rs6000/_divkc3.c (revision 255288) +++ libgcc/config/rs6000/_divkc3.c (working copy) @@ -37,6 +37,8 @@ typedef __complex float KCtype __attribu #define __divkc3 __divkc3_sw #endif +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype); + KCtype __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d) { Index: libgcc/config/rs6000/_mulkc3.c =================================================================== --- libgcc/config/rs6000/_mulkc3.c (revision 255288) +++ libgcc/config/rs6000/_mulkc3.c (working copy) @@ -35,6 +35,8 @@ typedef __complex float KCtype __attribu #define __mulkc3 __mulkc3_sw #endif +extern KCtype __mulkc3 (KFtype, KFtype, KFtype, KFtype); + KCtype __mulkc3 (KFtype a, KFtype b, KFtype c, KFtype d) { -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-12-01 5:40 ` Michael Meissner @ 2017-12-01 23:54 ` Segher Boessenkool 2017-12-11 20:58 ` Michael Meissner 0 siblings, 1 reply; 12+ messages in thread From: Segher Boessenkool @ 2017-12-01 23:54 UTC (permalink / raw) To: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn, Bill Schmidt On Fri, Dec 01, 2017 at 12:40:22AM -0500, Michael Meissner wrote: > After committing the previous patch, I noticed that it was now generating > warnings for __{mul,div}kc3_{sw,hw} not having a prototype that I hadn't > noticed during development of the patch. This is due to the fact that before I > added the ifunc support, it was only compiling __{mul,div}kc3, and those have > built-in declarations. I installed this patch as being obvious: > > 2017-11-30 Michael Meissner <meissner@linux.vnet.ibm.com> > > * config/rs6000/_mulkc3.c (__mulkc3): Add forward declaration. > * config/rs6000/_divkc3.c (__divkc3): Likewise. > > Index: libgcc/config/rs6000/_divkc3.c > =================================================================== > --- libgcc/config/rs6000/_divkc3.c (revision 255288) > +++ libgcc/config/rs6000/_divkc3.c (working copy) > @@ -37,6 +37,8 @@ typedef __complex float KCtype __attribu > #define __divkc3 __divkc3_sw > #endif > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype); > + > KCtype > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d) > { How does this warn? -Wmissing-declarations? Should this declaration be in a header then? A code comment explaining why you do a declaration for exactly the same thing as there is two lines later would help; otherwise people will try to delete it again :-) Segher ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-12-01 23:54 ` Segher Boessenkool @ 2017-12-11 20:58 ` Michael Meissner 2017-12-12 17:05 ` Segher Boessenkool 0 siblings, 1 reply; 12+ messages in thread From: Michael Meissner @ 2017-12-11 20:58 UTC (permalink / raw) To: Segher Boessenkool Cc: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn, Bill Schmidt On Fri, Dec 01, 2017 at 05:53:55PM -0600, Segher Boessenkool wrote: > On Fri, Dec 01, 2017 at 12:40:22AM -0500, Michael Meissner wrote: > > After committing the previous patch, I noticed that it was now generating > > warnings for __{mul,div}kc3_{sw,hw} not having a prototype that I hadn't > > noticed during development of the patch. This is due to the fact that before I > > added the ifunc support, it was only compiling __{mul,div}kc3, and those have > > built-in declarations. I installed this patch as being obvious: > > > > 2017-11-30 Michael Meissner <meissner@linux.vnet.ibm.com> > > > > * config/rs6000/_mulkc3.c (__mulkc3): Add forward declaration. > > * config/rs6000/_divkc3.c (__divkc3): Likewise. > > > > Index: libgcc/config/rs6000/_divkc3.c > > =================================================================== > > --- libgcc/config/rs6000/_divkc3.c (revision 255288) > > +++ libgcc/config/rs6000/_divkc3.c (working copy) > > @@ -37,6 +37,8 @@ typedef __complex float KCtype __attribu > > #define __divkc3 __divkc3_sw > > #endif > > > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype); > > + > > KCtype > > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d) > > { > > How does this warn? -Wmissing-declarations? Should this declaration be > in a header then? The compiler creates the call to __mulkc3 and __divkc3, and internally it has the appropriate prototype like it does for all built-in functions (in this case, returning an _Float128 _Complex type, and taking 4 _Float128 arguments). So before adding ifunc support, we never noticed it didn't have a prototype, because the compiler already has a prototype. With ifunc support, we now need to create two separate functions, __mulkc3_sw and __mulkc3_hw, and make __multkc3 the ifunc resolver. So there really isn't an include file that is appropriate to put the definitions in. I could change it to use the soft-fp includes (including quadmath-float128.h) if desired. Did you want me to do that? > A code comment explaining why you do a declaration for exactly the same > thing as there is two lines later would help; otherwise people will try > to delete it again :-) -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-12-11 20:58 ` Michael Meissner @ 2017-12-12 17:05 ` Segher Boessenkool 2017-12-12 17:18 ` Andreas Schwab 2017-12-12 21:56 ` Michael Meissner 0 siblings, 2 replies; 12+ messages in thread From: Segher Boessenkool @ 2017-12-12 17:05 UTC (permalink / raw) To: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn, Bill Schmidt On Mon, Dec 11, 2017 at 03:57:51PM -0500, Michael Meissner wrote: > > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype); > > > + > > > KCtype > > > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d) > > > { > > > > How does this warn? -Wmissing-declarations? Should this declaration be > > in a header then? > > The compiler creates the call to __mulkc3 and __divkc3, and internally it has > the appropriate prototype like it does for all built-in functions (in this > case, returning an _Float128 _Complex type, and taking 4 _Float128 arguments). > > So before adding ifunc support, we never noticed it didn't have a prototype, > because the compiler already has a prototype. I still don't get it. A function definition is also a declaration. Something very non-intuitive is happening? What does the patch change here? > With ifunc support, we now need to create two separate functions, __mulkc3_sw > and __mulkc3_hw, and make __multkc3 the ifunc resolver. > > So there really isn't an include file that is appropriate to put the > definitions in. I could change it to use the soft-fp includes (including > quadmath-float128.h) if desired. > > Did you want me to do that? I don't see the point in adding a second declaration right before the existing declaration (the function definition). I'm fine with what file it is in. > > A code comment explaining why you do a declaration for exactly the same > > thing as there is two lines later would help; otherwise people will try > > to delete it again :-) Segher ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-12-12 17:05 ` Segher Boessenkool @ 2017-12-12 17:18 ` Andreas Schwab 2017-12-12 21:56 ` Michael Meissner 1 sibling, 0 replies; 12+ messages in thread From: Andreas Schwab @ 2017-12-12 17:18 UTC (permalink / raw) To: Segher Boessenkool Cc: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn, Bill Schmidt On Dez 12 2017, Segher Boessenkool <segher@kernel.crashing.org> wrote: > On Mon, Dec 11, 2017 at 03:57:51PM -0500, Michael Meissner wrote: >> > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype); >> > > + >> > > KCtype >> > > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d) >> > > { >> > >> > How does this warn? -Wmissing-declarations? Should this declaration be >> > in a header then? >> >> The compiler creates the call to __mulkc3 and __divkc3, and internally it has >> the appropriate prototype like it does for all built-in functions (in this >> case, returning an _Float128 _Complex type, and taking 4 _Float128 arguments). >> >> So before adding ifunc support, we never noticed it didn't have a prototype, >> because the compiler already has a prototype. > > I still don't get it. A function definition is also a declaration. > > Something very non-intuitive is happening? `-Wmissing-prototypes (C and Objective-C only)' Warn if a global function is defined without a previous prototype declaration. This warning is issued even if the definition itself provides a prototype. Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different." ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-12-12 17:05 ` Segher Boessenkool 2017-12-12 17:18 ` Andreas Schwab @ 2017-12-12 21:56 ` Michael Meissner 2017-12-13 20:57 ` Segher Boessenkool 1 sibling, 1 reply; 12+ messages in thread From: Michael Meissner @ 2017-12-12 21:56 UTC (permalink / raw) To: Segher Boessenkool Cc: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn, Bill Schmidt On Tue, Dec 12, 2017 at 11:04:55AM -0600, Segher Boessenkool wrote: > On Mon, Dec 11, 2017 at 03:57:51PM -0500, Michael Meissner wrote: > > > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype); > > > > + > > > > KCtype > > > > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d) > > > > { > > > > > > How does this warn? -Wmissing-declarations? Should this declaration be > > > in a header then? > > > > The compiler creates the call to __mulkc3 and __divkc3, and internally it has > > the appropriate prototype like it does for all built-in functions (in this > > case, returning an _Float128 _Complex type, and taking 4 _Float128 arguments). > > > > So before adding ifunc support, we never noticed it didn't have a prototype, > > because the compiler already has a prototype. > > I still don't get it. A function definition is also a declaration. > > Something very non-intuitive is happening? GCC has the following function declarations built-in: extern _Float128 _Complex __mulkc3 (_Float128, _Float128, _Float128, _Float128); extern _Float128 _Complex __divkc3 (_Float128, _Float128, _Float128, _Float128); Before the patch, _mulkc3.c looked like: _Float128 _Complex __mulkc3 (_Float128 a, _Float128 b, _Float128 c, _Float128 d) { // ... } Now, with ifunc handling it gets compiled in three separate files: First in a file compiled with -mno-float128-hardware: _Float128 _Complex __mulkc3_sw (_Float128 a, _Float128 b, _Float128 c, _Float128 d) { // ... } Second in a file compiled with -mfloat128-hardware: _Float128 _Complex __mulkc3_hw (_Float128 a, _Float128 b, _Float128 c, _Float128 d) { // ... } And third as the ifunc handler: #define SW_OR_HW(SW, HW) (__builtin_cpu_supports ("ieee128") ? HW : SW) static __typeof__ (__mulkc3_sw) * __mulkc3_resolve (void) { return SW_OR_HW (__mulkc3_sw, __mulkc3_hw); } _Float128 _Complex __mulkc3 (Float128, _Float128, _Float128, _Float128) __attribute__ ((__ifunc__ ("__mulkc3_resolve"))); As Andreas points out, the option -Wmissing-prototypes complains if a global function is compliled without prototypes for C/Objective C. Before the patch, the internal definition within the compiler meant that that __mulkc3 would not get the warning. Now with separate ifunc handlers, both __mulkc3_sw and __mulkc3_hw got warnings. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c 2017-12-12 21:56 ` Michael Meissner @ 2017-12-13 20:57 ` Segher Boessenkool 0 siblings, 0 replies; 12+ messages in thread From: Segher Boessenkool @ 2017-12-13 20:57 UTC (permalink / raw) To: Michael Meissner, Martin Sebor, GCC Patches, David Edelsohn, Bill Schmidt On Tue, Dec 12, 2017 at 04:56:36PM -0500, Michael Meissner wrote: > On Tue, Dec 12, 2017 at 11:04:55AM -0600, Segher Boessenkool wrote: > > On Mon, Dec 11, 2017 at 03:57:51PM -0500, Michael Meissner wrote: > > > > > +extern KCtype __divkc3 (KFtype, KFtype, KFtype, KFtype); > > > > > + > > > > > KCtype > > > > > __divkc3 (KFtype a, KFtype b, KFtype c, KFtype d) > > > > > { > > > > > > > > How does this warn? -Wmissing-declarations? Should this declaration be > > > > in a header then? > As Andreas points out, the option -Wmissing-prototypes complains if a global > function is compliled without prototypes for C/Objective C. > > Before the patch, the internal definition within the compiler meant that that > __mulkc3 would not get the warning. Now with separate ifunc handlers, both > __mulkc3_sw and __mulkc3_hw got warnings. Gotcha. There isn't a nice header file for it, so sure that is fine the way you have it. Thanks for the explanation! Segher ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2017-12-13 20:57 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-11-27 19:57 [PATCH] PR libgcc/83112, Fix warnings on libgcc float128-ifunc.c Michael Meissner 2017-11-27 22:55 ` Martin Sebor 2017-11-28 0:55 ` Michael Meissner 2017-11-30 5:08 ` Segher Boessenkool 2017-11-30 21:52 ` Michael Meissner 2017-12-01 5:40 ` Michael Meissner 2017-12-01 23:54 ` Segher Boessenkool 2017-12-11 20:58 ` Michael Meissner 2017-12-12 17:05 ` Segher Boessenkool 2017-12-12 17:18 ` Andreas Schwab 2017-12-12 21:56 ` Michael Meissner 2017-12-13 20:57 ` Segher Boessenkool
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).