> -----Original Message-----
> From: Richard Biener <rguent...@suse.de>
> Sent: Tuesday, August 13, 2024 10:06 PM
> To: Thomas Schwinge <tschwi...@baylibre.com>
> Cc: Prathamesh Kulkarni <prathame...@nvidia.com>; Andrew Pinski
> <pins...@gmail.com>; gcc-patches@gcc.gnu.org; Jakub Jelinek
> <ja...@redhat.com>
> Subject: Re: [nvptx] Pass -m32/-m64 to host_compiler if it has
> multilib support
> 
> External email: Use caution opening links or attachments
> 
> 
> > Am 13.08.2024 um 17:48 schrieb Thomas Schwinge
> <tschwi...@baylibre.com>:
> >
> > Hi Prathamesh!
> >
> > On 2024-08-12T07:50:07+0000, Prathamesh Kulkarni
> <prathame...@nvidia.com> wrote:
> >>> From: Thomas Schwinge <tschwi...@baylibre.com>
> >>> Sent: Friday, August 9, 2024 12:55 AM
> >
> >>> On 2024-08-08T06:46:25-0700, Andrew Pinski <pins...@gmail.com>
> wrote:
> >>>> On Thu, Aug 8, 2024 at 6:11 AM Prathamesh Kulkarni
> >>>> <prathame...@nvidia.com> wrote:
> >>>>> After differing NUM_POLY_INT_COEFFS fix for AArch64/nvptx
> >>> offloading, the following minimal test:
> >>>
> >>> First, thanks for your work on enabling this!  I will say that I
> had
> >>> the plan to re-engage with Nvidia to hire us (as initial
> >>> implementors of GCC/nvptx offloading) to make AArch64/nvptx
> >>> offloading work, but now that Nvidia has its own GCC team, that's
> >>> great that you're able to work on this yourself!  :-)
> >>>
> >>> Please CC me for GCC/nvptx issues for (at least potentially...)
> >>> faster response times.
> >> Thanks, will do 😊
> >
> > Heh, so much for "potentially": I'm not able to spend a lot of time
> on
> > this right now, as I shall soon be out of office.  Quickly:
> >
> >>>>> compiled with -fopenmp -foffload=nvptx-none now fails with:
> >>>>> gcc: error: unrecognized command-line option '-m64'
> >>>>> nvptx mkoffload: fatal error: ../install/bin/gcc returned 1 exit
> >>> status compilation terminated.
> >>>
> >>> Heh.  Yeah...
> >>>
> >>>>> As mentioned in RFC email, this happens because
> >>>>> nvptx/mkoffload.cc:compile_native passes -m64/-m32 to host
> >>>>> compiler
> >>> depending on whether offload_abi is OFFLOAD_ABI_LP64 or
> >>> OFFLOAD_ABI_ILP32, and aarch64 backend doesn't recognize these
> >>> options.
> >
> >>> So, my idea is: instead of the current strategy that the host
> >>> 'TARGET_OFFLOAD_OPTIONS' synthesizes '-foffload-abi=lp64' etc.,
> >>> which the 'mkoffload's then interpret and re-synthesize '-m64'
> etc.
> >>> -- how about we instead directly tell the 'mkoffload's the
> relevant
> >>> ABI options?  That is, 'TARGET_OFFLOAD_OPTIONS' instead
> synthesizes
> >>> '- foffload-abi=-m64'
> >>> etc., which the 'mkoffload's can then readily use.  Could you
> please
> >>> give that a try, and/or does anyone see any issues with that
> approach?
> >>>
> >>> And use something like '-foffload-abi=disable' to replace the
> current:
> >>>
> >>>    /* PR libgomp/65099: Currently, we only support offloading in
> 64-
> >>> bit
> >>>       configurations.  */
> >>>    if (offload_abi == OFFLOAD_ABI_LP64)
> >>>      {
> >>>
> >>> (As discussed before, this should be done differently altogether,
> >>> but that's for another day.)
> >> Sorry, I don't quite follow. Currently we enable offloading if
> >> offload_abi == OFFLOAD_ABI_LP64, which is synthesized from
> >> -foffload-abi=lp64. If we change -foffload-abi to instead specify
> >> host-specific ABI opts, I guess mkoffload will still need to
> somehow
> >> figure out which ABI is used, so it can disable offloading for 32-
> bit
> >> ? I suppose we could adjust TARGET_OFFLOAD_OPTIONS for each host to
> pass -foffload-abi=disable if TARGET_ILP32 is set and offload target
> is nvptx, but not sure if that'd be correct ?
> >
> > Basically, yes.  My idea was that all 'TARGET_OFFLOAD_OPTIONS'
> > implementations return either the correct host flags to be used by
> the
> > 'mkoffload's (the case that offloading is supported for the current
> > host flags/ABI configuration), or otherwise return '-foffload-
> abi=disable'.
> > For example (untested):
> >
> >> char *
> >> ix86_offload_options (void)
> >> {
> >>   if (TARGET_LP64)
> >> -    return xstrdup ("-foffload-abi=lp64");
> >> +    return xstrdup ("-foffload-abi=-m64");
> >> -  return xstrdup ("-foffload-abi=ilp32");
> >> +  return xstrdup ("-foffload-abi=disable");
> >> }
> >
> > That is, only for 'TARGET_LP64' offloading is supported, and via
> > '-foffload-abi=-m64' the 'mkoffload's know that they need to specify
> > '-m64'.  For other host flags/ABI configuration, the 'mkoffload's
> see
> > '-foffload-abi=disable' and thus disable offload code generation
> > (replacing the current 'if (offload_abi == OFFLOAD_ABI_LP64)' in
> > 'mkoffload').
> >
> >> In the attached patch
> >
> > Yes, that's going in the right direction, thanks!
> >
> >> I added another option -foffload-abi-host-opts to specify host abi
> >> opts, and leave -foffload-abi to specify if ABI is 32/64 bit which
> >> mkoffload can use to enable/disable offloading (as before).
> >
> > I'm not sure however, if this additional option is really necessary?
Well, my concern was if that'd change the behavior for TARGET_ILP32 ?
IIUC, currently for -foffload-abi=ilp32, mkoffload will create empty C file
for ptx_cfile_name (instead of munged ptx assembly since offloading will be 
disabled),
and pass that to host compiler with -m32 option (in compile_native).

If we change -foffload-abi to specify ABI host opts, and pass 
-foffload-abi=disable 
for TARGET_ILP32 in TARGET_OFFLOAD_OPTIONS, mkoffload will no longer be able to
pass 32-bit ABI opts to host compiler, which may result in linker error (arch 
mismatch?)
if the host object files are 32-bit ABI and xnvptx-none.o is 64-bit (assuming 
the host
compiler is configured to generate 64-bit code-gen by default) ?

So, I thought to add another option -foffload-abi-host-opts to pass 
host-specific ABI opts,
and keep -foffload-abi as-is to infer ABI type for enabling/disabling 
offloading.
> >
> > In case we're not happy to re-purpose the flag name
> > '-foffload-abi=[...]', we could also rename that one to
> > '-foffload-abi-host-opts=[...]'; the former is not user-exposed, so
> we
> > may change it as necessary.  (Or, in other words, go with your
> > proposed '-foffload-abi-host-opts=[...]', but also remove
> > '-foffload-abi=[...]' at the same time.)
> >
> >
> > I'll be able to spend more time on this in two weeks.
> 
> Since we do not support 32 -> 64 bit offload wouldn’t the most
> pragmatic fix be to recognize -m64 in the nvptx backend (and ignore
> it)?
I think nvptx already supports m64 and ignores it.
From nvptx.opt:

m64
Target RejectNegative Mask(ABI64)
Ignored, but preserved for backward compatibility.  Only 64-bit ABI is
supported.

Thanks,
Prathamesh
> 
> Richard
> 
> 
> >
> > Grüße
> > Thomas
> >
> >
> >> [nvptx] Pass host specific ABI opts from mkoffload.
> >>
> >> The patch adds an option -foffload-abi-host-opts, which is set by
> >> host in TARGET_OFFLOAD_OPTIONS, and mkoffload then passes it's
> value
> >> to host_compiler.
> >>
> >> gcc/ChangeLog:
> >>    * common.opt (foffload-abi-host-opts): New option.
> >>    * config/aarch64/aarch64.cc (aarch64_offload_options): Set
> >>    -foffload-abi-host-opts.
> >>    * config/i386/i386-opts.cc (ix86_offload_options): Likewise.
> >>    * config/rs6000/rs6000.cc (rs6000_offload_options): Likewise.
> >>    * config/nvptx/mkoffload.cc (host_abi_opts): Define.
> >>    (compile_native): Append host_abi_opts to argv_obstack.
> >>    (main): Handle option -foffload-abi-host-opts.
> >>    * lto-wrapper.cc (append_compiler_options): Handle
> >>    -foffload-abi-host-opts.
> >>    * opts.cc (common_handle_option): Likewise.
> >>
> >> Signed-off-by: Prathamesh Kulkarni <prathame...@nvidia.com>
> >>
> >> diff --git a/gcc/common.opt b/gcc/common.opt index
> >> ea39f87ae71..d1a9efb9513 100644
> >> --- a/gcc/common.opt
> >> +++ b/gcc/common.opt
> >> @@ -2361,6 +2361,10 @@ Enum(offload_abi) String(ilp32)
> >> Value(OFFLOAD_ABI_ILP32) EnumValue
> >> Enum(offload_abi) String(lp64) Value(OFFLOAD_ABI_LP64)
> >>
> >> +foffload-abi-host-opts=
> >> +Common Driver Joined MissingArgError(option or option=abi missing
> >> +after %qs) -foffload-abi-host-opts=<options>=<abi> Specify host
> abi options.
> >> +
> >> fomit-frame-pointer
> >> Common Var(flag_omit_frame_pointer) Optimization When possible do
> not
> >> generate stack frames.
> >> diff --git a/gcc/config/aarch64/aarch64.cc
> >> b/gcc/config/aarch64/aarch64.cc index 2ac5a22c848..7418cb1fb69
> 100644
> >> --- a/gcc/config/aarch64/aarch64.cc
> >> +++ b/gcc/config/aarch64/aarch64.cc
> >> @@ -18999,9 +18999,9 @@ static char * aarch64_offload_options
> (void)
> >> {
> >>   if (TARGET_ILP32)
> >> -    return xstrdup ("-foffload-abi=ilp32");
> >> +    return xstrdup ("-foffload-abi=ilp32
> >> + -foffload-abi-host-opts=-mabi=ilp32");
> >>   else
> >> -    return xstrdup ("-foffload-abi=lp64");
> >> +    return xstrdup ("-foffload-abi=lp64
> >> + -foffload-abi-host-opts=-mabi=lp64");
> >> }
> >>
> >> static struct machine_function *
> >> diff --git a/gcc/config/i386/i386-options.cc
> >> b/gcc/config/i386/i386-options.cc index 1c8f7835af2..bd960674e5d
> >> 100644
> >> --- a/gcc/config/i386/i386-options.cc
> >> +++ b/gcc/config/i386/i386-options.cc
> >> @@ -3669,8 +3669,8 @@ char *
> >> ix86_offload_options (void)
> >> {
> >>   if (TARGET_LP64)
> >> -    return xstrdup ("-foffload-abi=lp64");
> >> -  return xstrdup ("-foffload-abi=ilp32");
> >> +    return xstrdup ("-foffload-abi=lp64
> >> + -foffload-abi-host-opts=-m64");  return xstrdup
> >> + ("-foffload-abi=ilp32 -foffload-abi-host-opts=-m32");
> >> }
> >>
> >> /* Handle "cdecl", "stdcall", "fastcall", "regparm", "thiscall",
> diff
> >> --git a/gcc/config/nvptx/mkoffload.cc
> b/gcc/config/nvptx/mkoffload.cc
> >> index 503b1abcefd..d5ca2386641 100644
> >> --- a/gcc/config/nvptx/mkoffload.cc
> >> +++ b/gcc/config/nvptx/mkoffload.cc
> >> @@ -61,6 +61,7 @@ static const char *omp_requires_file; static
> const
> >> char *ptx_dumpbase;
> >>
> >> enum offload_abi offload_abi = OFFLOAD_ABI_UNSET;
> >> +const char *host_abi_opts = NULL;
> >>
> >> /* Delete tempfiles.  */
> >>
> >> @@ -607,17 +608,9 @@ compile_native (const char *infile, const char
> *outfile, const char *compiler,
> >>   obstack_ptr_grow (&argv_obstack, ptx_dumpbase);
> >>   obstack_ptr_grow (&argv_obstack, "-dumpbase-ext");
> >>   obstack_ptr_grow (&argv_obstack, ".c");
> >> -  switch (offload_abi)
> >> -    {
> >> -    case OFFLOAD_ABI_LP64:
> >> -      obstack_ptr_grow (&argv_obstack, "-m64");
> >> -      break;
> >> -    case OFFLOAD_ABI_ILP32:
> >> -      obstack_ptr_grow (&argv_obstack, "-m32");
> >> -      break;
> >> -    default:
> >> -      gcc_unreachable ();
> >> -    }
> >> +  if (!host_abi_opts)
> >> +    fatal_error (input_location, "-foffload-abi-host-opts not
> >> + specified.");  obstack_ptr_grow (&argv_obstack, host_abi_opts);
> >>   obstack_ptr_grow (&argv_obstack, infile);
> >>   obstack_ptr_grow (&argv_obstack, "-c");
> >>   obstack_ptr_grow (&argv_obstack, "-o"); @@ -721,6 +714,8 @@ main
> >> (int argc, char **argv)
> >>             "unrecognizable argument of option " STR);
> >>    }
> >> #undef STR
> >> +      else if (startswith (argv[i], "-foffload-abi-host-opts="))
> >> +    host_abi_opts = argv[i] + strlen ("-foffload-abi-host-opts=");
> >>       else if (strcmp (argv[i], "-fopenmp") == 0)
> >>    fopenmp = true;
> >>       else if (strcmp (argv[i], "-fopenacc") == 0) diff --git
> >> a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index
> >> 0bcc6a2d0ab..decdf49a1f5 100644
> >> --- a/gcc/config/rs6000/rs6000.cc
> >> +++ b/gcc/config/rs6000/rs6000.cc
> >> @@ -17333,9 +17333,9 @@ static char * rs6000_offload_options (void)
> {
> >>   if (TARGET_64BIT)
> >> -    return xstrdup ("-foffload-abi=lp64");
> >> +    return xstrdup ("-foffload-abi=lp64
> >> + -foffload-abi-host-opts=-m64");
> >>   else
> >> -    return xstrdup ("-foffload-abi=ilp32");
> >> +    return xstrdup ("-foffload-abi=ilp32
> >> + -foffload-abi-host-opts=-m32");
> >> }
> >>
> >>
> >> diff --git a/gcc/lto-wrapper.cc b/gcc/lto-wrapper.cc index
> >> 6bfc96590a5..1ecc4997e5a 100644
> >> --- a/gcc/lto-wrapper.cc
> >> +++ b/gcc/lto-wrapper.cc
> >> @@ -745,6 +745,7 @@ append_compiler_options (obstack *argv_obstack,
> vec<cl_decoded_option> opts)
> >>    case OPT_fopenacc:
> >>    case OPT_fopenacc_dim_:
> >>    case OPT_foffload_abi_:
> >> +    case OPT_foffload_abi_host_opts_:
> >>    case OPT_fcf_protection_:
> >>    case OPT_fasynchronous_unwind_tables:
> >>    case OPT_funwind_tables:
> >> diff --git a/gcc/opts.cc b/gcc/opts.cc index
> 0b7b137c376..79118237ce4
> >> 100644
> >> --- a/gcc/opts.cc
> >> +++ b/gcc/opts.cc
> >> @@ -3069,6 +3069,7 @@ common_handle_option (struct gcc_options
> *opts,
> >>       break;
> >>
> >>     case OPT_foffload_abi_:
> >> +    case OPT_foffload_abi_host_opts_:
> >> #ifdef ACCEL_COMPILER
> >>       /* Handled in the 'mkoffload's.  */ #else

Reply via email to