Hi Prathamesh!

On 2024-09-10T13:22:10+0000, Prathamesh Kulkarni <prathame...@nvidia.com> wrote:
>> -----Original Message-----
>> From: Thomas Schwinge <tschwi...@baylibre.com>
>> Sent: Monday, September 9, 2024 8:50 PM

>> > Could you please test the patch for gcn backend ?

I've successfully tested x86_64 host with GCN as well as nvptx
offloading, and also ppc64le host with nvptx offloading.

I just realized two more minor things:

> [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 its value
> to host_compiler.
>

Please add here "       PR target/96265".

> gcc/ChangeLog:
>       * common.opt (foffload-abi-host-opts): New option.
>       * config/aarch64/aarch64.cc (aarch64_offload_options): Pass
>       -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 (offload_abi_host_opts): Define.
>       (compile_native): Append offload_abi_host_opts to argv_obstack.
>       (main): Handle option -foffload-abi-host-opts.
>       * config/gcn/mkoffload.cc (offload_abi_host_opts): Define.
>       (compile_native): Append offload_abi_host_opts to argv_obstack.
>       (main): Handle option -foffload-abi-host-opts.
>       * lto-wrapper.cc (merge_and_complain): Handle
>       -foffload-abi-host-opts.
>       (append_compiler_options): Likewise.
>       * opts.cc (common_handle_option): Likewise.
>
> Signed-off-by: Prathamesh Kulkarni <prathame...@nvidia.com>

Given that we're adding a new option to 'gcc/common.opt', do we need to
update (regenerate?) 'gcc/common.opt.urls'?  (I've not yet had the need
myself, and therefore not yet looked up how to do that.)  Or maybe not,
given that '-foffload-abi-host-opts=[...]' isn't documented?

Otherwise looks good to me; OK to push (with these minor items addressed,
as necessary), thanks!


Grüße
 Thomas


> diff --git a/gcc/common.opt b/gcc/common.opt
> index ea39f87ae71..d270e524ff4 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 Joined MissingArgError(option missing after %qs)
> +-foffload-abi-host-opts=<options>    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 6a3f1a23a9f..6ccf08d1cc0 100644
> --- a/gcc/config/aarch64/aarch64.cc
> +++ b/gcc/config/aarch64/aarch64.cc
> @@ -19000,9 +19000,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/gcn/mkoffload.cc b/gcc/config/gcn/mkoffload.cc
> index b8d981878ed..345bbf7709c 100644
> --- a/gcc/config/gcn/mkoffload.cc
> +++ b/gcc/config/gcn/mkoffload.cc
> @@ -133,6 +133,8 @@ static const char *gcn_dumpbase;
>  static struct obstack files_to_cleanup;
>  
>  enum offload_abi offload_abi = OFFLOAD_ABI_UNSET;
> +const char *offload_abi_host_opts = NULL;
> +
>  uint32_t elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX900;  // Default GPU 
> architecture.
>  uint32_t elf_flags = EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4;
>  
> @@ -819,17 +821,10 @@ compile_native (const char *infile, const char 
> *outfile, const char *compiler,
>    obstack_ptr_grow (&argv_obstack, gcn_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 (!offload_abi_host_opts)
> +    fatal_error (input_location,
> +              "%<-foffload-abi-host-opts%> not specified.");
> +  obstack_ptr_grow (&argv_obstack, offload_abi_host_opts);
>    obstack_ptr_grow (&argv_obstack, infile);
>    obstack_ptr_grow (&argv_obstack, "-c");
>    obstack_ptr_grow (&argv_obstack, "-o");
> @@ -998,6 +993,15 @@ main (int argc, char **argv)
>                        "unrecognizable argument of option %<" STR "%>");
>       }
>  #undef STR
> +      else if (startswith (argv[i], "-foffload-abi-host-opts="))
> +     {
> +       if (offload_abi_host_opts)
> +         fatal_error (input_location,
> +                      "%<-foffload-abi-host-opts%> specified "
> +                      "multiple times");
> +       offload_abi_host_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/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
> index f79257cc764..55e0210260f 100644
> --- a/gcc/config/i386/i386-options.cc
> +++ b/gcc/config/i386/i386-options.cc
> @@ -3680,8 +3680,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..df16ee64736 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 *offload_abi_host_opts = NULL;
>  
>  /* Delete tempfiles.  */
>  
> @@ -607,17 +608,10 @@ 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 (!offload_abi_host_opts)
> +    fatal_error (input_location,
> +              "%<-foffload-abi-host-opts%> not specified.");
> +  obstack_ptr_grow (&argv_obstack, offload_abi_host_opts);
>    obstack_ptr_grow (&argv_obstack, infile);
>    obstack_ptr_grow (&argv_obstack, "-c");
>    obstack_ptr_grow (&argv_obstack, "-o");
> @@ -721,6 +715,15 @@ main (int argc, char **argv)
>                        "unrecognizable argument of option " STR);
>       }
>  #undef STR
> +      else if (startswith (argv[i], "-foffload-abi-host-opts="))
> +     {
> +       if (offload_abi_host_opts)
> +         fatal_error (input_location,
> +                      "%<-foffload-abi-host-opts%> specified "
> +                      "multiple times");
> +       offload_abi_host_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 08579bc83e6..0bf8bae27f5 100644
> --- a/gcc/config/rs6000/rs6000.cc
> +++ b/gcc/config/rs6000/rs6000.cc
> @@ -17330,9 +17330,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 c07765b37a2..7de045da9b9 100644
> --- a/gcc/lto-wrapper.cc
> +++ b/gcc/lto-wrapper.cc
> @@ -484,6 +484,7 @@ merge_and_complain (vec<cl_decoded_option> 
> &decoded_options,
>   
>  
>       case OPT_foffload_abi_:
> +     case OPT_foffload_abi_host_opts_:
>         if (existing_opt == -1)
>           decoded_options.safe_push (*foption);
>         else if (foption->value != decoded_options[existing_opt].value)
> @@ -745,6 +746,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 fc6abf6f582..a78f73e57e3 100644
> --- a/gcc/opts.cc
> +++ b/gcc/opts.cc
> @@ -3070,11 +3070,14 @@ 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
> -      error_at (loc, "%<-foffload-abi%> option can be specified only for "
> -             "offload compiler");
> +      error_at (loc,
> +             "%qs option can be specified only for offload compiler",
> +             (code == OPT_foffload_abi_) ? "-foffload-abi"
> +                                         : "-foffload-abi-host-opts");
>  #endif
>        break;
>  

Reply via email to