public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <richard.guenther@gmail.com>
To: iain@sandoe.co.uk
Cc: gcc-patches@gcc.gnu.org, Iain Sandoe <iains.gcc@gmail.com>,
	gaiusmod2@gmail.com
Subject: Re: [PATCH] modula-2, driver, Front end: Revise handling of I and L paths [PR108182].
Date: Mon, 23 Jan 2023 08:12:30 +0100	[thread overview]
Message-ID: <CAFiYyc2VP9RjS6kYQkSw0AfvJea=VTcsB-gjoi9v-VD+=K5F9A@mail.gmail.com> (raw)
In-Reply-To: <20230117170431.52986-1-iain@sandoe.co.uk>

On Tue, Jan 17, 2023 at 6:05 PM Iain Sandoe via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Tested on x86_64-linux-gnu (with a 32b multilib), powerpc, i686 and
> x86_64-darwin.  OK for trunk?

Reading through the patch I fear there's more issues lurking
(-sysroot?) but this seems to be
a step in the right direction, so OK for trunk unless Gaius has more
comments or objections.

Can you mention PR108480 in the commit log?

Thanks,
Richard.

> thanks,
> Iain
>
> --- 8< ---
>
> The adds the includes in the FE as done in other GCC languages.
> It also revises the library handling to avoid additional -L options
> from hiding LIBDIR.
>
> For the include/import paths as presented to the front end initialisation,
> we capture them and then arrange to emit the 'standard library' paths in
> the same order as specified for C.
>
> The specs are tidied up.
>
> Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
>
>         PR modula2/108182
>
> gcc/m2/ChangeLog:
>
>         * Make-lang.in: Pass libsubdir to the language init
>         build.
>         * gm2-lang.cc (INCLUDE_VECTOR): Define.
>         (add_one_import_path): New.
>         (add_m2_import_paths): New.
>         (gm2_langhook_post_options): Arrange to add the include
>         paths (and add the system ones) in the same order as C
>         uses.
>         * gm2spec.cc (build_archive_path): Remove.
>         (add_default_combination): Remove.
>         (add_default_archives): Remove.
>         (add_default_libs): We no longer need a '-L' option, just
>         emit the -l and each library in use.
>         (build_include_path): Remove.
>         (add_include): Remove.
>         (add_default_includes): Remove.
>         (library_installed): Remove.
>         (check_valid_library): Remove.
>         (check_valid_list): Remove.
>         (convert_abbreviation): Diagnose unhandled cases.
>         (lang_specific_driver): Skip options where we will add back
>         a validated version.
>         * lang-specs.h (M2CPP): Reformat, append %I when -fcpp is not
>         in use.  Revise the cc1gm2 spec to omit mentioning options that
>         are handled in the c pre-processor line.
>         * lang.opt: Allow preprocessing and path options as input to the
>         cc1gm2 invocation, so that they can be passed to the preprocessor
>         invocation.
> ---
>  gcc/m2/Make-lang.in |   1 +
>  gcc/m2/gm2-lang.cc  | 168 ++++++++++++++++++++--
>  gcc/m2/gm2spec.cc   | 344 ++++++++++++--------------------------------
>  gcc/m2/lang-specs.h |  13 +-
>  gcc/m2/lang.opt     |  48 +++++++
>  5 files changed, 304 insertions(+), 270 deletions(-)
>
> diff --git a/gcc/m2/Make-lang.in b/gcc/m2/Make-lang.in
> index 367be8e8af7..00cca7de617 100644
> --- a/gcc/m2/Make-lang.in
> +++ b/gcc/m2/Make-lang.in
> @@ -543,6 +543,7 @@ m2/gm2-gcc/m2configure.o: $(srcdir)/m2/gm2-gcc/m2configure.cc \
>
>  m2/gm2-lang.o: $(srcdir)/m2/gm2-lang.cc gt-m2-gm2-lang.h $(GCC_HEADER_DEPENDENCIES_FOR_M2)
>         $(COMPILER) -c -g $(GM2GCC) $(ALL_COMPILERFLAGS) \
> +           -DLIBSUBDIR=\"$(libsubdir)\" \
>              $(ALL_CPPFLAGS) $(INCLUDES) $< $(OUTPUT_OPTION)
>
>  m2/stor-layout.o: $(srcdir)/stor-layout.cc $(GCC_HEADER_DEPENDENCIES_FOR_M2)
> diff --git a/gcc/m2/gm2-lang.cc b/gcc/m2/gm2-lang.cc
> index b8123273368..98707430ef5 100644
> --- a/gcc/m2/gm2-lang.cc
> +++ b/gcc/m2/gm2-lang.cc
> @@ -20,6 +20,7 @@ along with GNU Modula-2; see the file COPYING.  If not, write to the
>  Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
>  02110-1301, USA.  */
>
> +#define INCLUDE_VECTOR
>  #include "gm2-gcc/gcc-consolidation.h"
>
>  #include "langhooks-def.h" /* FIXME: for lhd_set_decl_assembler_name.  */
> @@ -45,6 +46,18 @@ static void write_globals (void);
>
>  static int insideCppArgs = FALSE;
>
> +/* We default to pim in the absence of fiso.  */
> +static bool iso = false;
> +
> +/* The language include paths are based on the libraries in use.  */
> +static bool allow_libraries = true;
> +static const char *flibs = nullptr;
> +static const char *iprefix = nullptr;
> +static const char *imultilib = nullptr;
> +static std::vector<const char*>Ipaths;
> +static std::vector<const char*>isystem;
> +static std::vector<const char*>iquote;
> +
>  #define EXPR_STMT_EXPR(NODE) TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0)
>
>  /* start of new stuff.  */
> @@ -198,34 +211,41 @@ gm2_langhook_handle_option (
>        return 1;
>      case OPT_I:
>        if (insideCppArgs)
> -        {
> -          const struct cl_option *option = &cl_options[scode];
> -          const char *opt = (const char *)option->opt_text;
> -          M2Options_CppArg (opt, arg, TRUE);
> -        }
> +       {
> +         const struct cl_option *option = &cl_options[scode];
> +         const char *opt = (const char *)option->opt_text;
> +         M2Options_CppArg (opt, arg, (option->flags & CL_JOINED)
> +                                      && !(option->flags & CL_SEPARATE));
> +       }
>        else
> -        M2Options_SetSearchPath (arg);
> +       Ipaths.push_back (arg);
>        return 1;
>      case OPT_fiso:
>        M2Options_SetISO (value);
> +      iso = value;
>        return 1;
>      case OPT_fpim:
>        M2Options_SetPIM (value);
> +      iso = value ? false : iso;
>        return 1;
>      case OPT_fpim2:
>        M2Options_SetPIM2 (value);
> +      iso = value ? false : iso;
>        return 1;
>      case OPT_fpim3:
>        M2Options_SetPIM3 (value);
> +      iso = value ? false : iso;
>        return 1;
>      case OPT_fpim4:
>        M2Options_SetPIM4 (value);
> +      iso = value ? false : iso;
>        return 1;
>      case OPT_fpositive_mod_floor_div:
>        M2Options_SetPositiveModFloor (value);
>        return 1;
>      case OPT_flibs_:
> -      /* handled in the gm2 driver.  */
> +      allow_libraries = value;
> +      flibs = arg;
>        return 1;
>      case OPT_fgen_module_list_:
>        M2Options_SetGenModuleList (value, arg);
> @@ -374,6 +394,30 @@ gm2_langhook_handle_option (
>      case OPT_fm2_g:
>        M2Options_SetM2g (value);
>        return 1;
> +      break;
> +    case OPT_iprefix:
> +    case OPT_imultilib:
> +    case OPT_isystem:
> +    case OPT_iquote:
> +    case OPT_isysroot:
> +      if (insideCppArgs)
> +       {
> +         const struct cl_option *option = &cl_options[scode];
> +         const char *opt = (const char *)option->opt_text;
> +         M2Options_CppArg (opt, arg, (option->flags & CL_JOINED)
> +                                      && !(option->flags & CL_SEPARATE));
> +       }
> +      if (code == OPT_iprefix)
> +       iprefix = arg;
> +      else if (code == OPT_imultilib)
> +       imultilib = arg;
> +      else if (code == OPT_iquote)
> +       iquote.push_back (arg);
> +      else if (code == OPT_isystem)
> +       isystem.push_back (arg);
> +      /* Otherwise, ignored, at least for now. */
> +      return 1;
> +      break;
>      case OPT_O:
>        M2Options_SetOptimizing (value);
>        return 1;
> @@ -412,18 +456,77 @@ gm2_langhook_handle_option (
>        return 1;
>      default:
>        if (insideCppArgs)
> -        {
> -          const struct cl_option *option = &cl_options[scode];
> -          const char *opt = (const char *)option->opt_text;
> -
> -          M2Options_CppArg (opt, arg, TRUE);
> -          return 1;
> -        }
> +       {
> +         const struct cl_option *option = &cl_options[scode];
> +         const char *opt = (const char *)option->opt_text;
> +         M2Options_CppArg (opt, arg, (option->flags & CL_JOINED)
> +                                      && !(option->flags & CL_SEPARATE));
> +         return 1;
> +       }
>        return 0;
>      }
>    return 0;
>  }
>
> +/* This prefixes LIBNAME with the current compiler prefix (if it has been
> +   relocated) or the LIBSUBDIR, if not.  */
> +static void
> +add_one_import_path (const char *libname)
> +{
> +  const char *libpath = iprefix ? iprefix : LIBSUBDIR;
> +  const char dir_sep[] = {DIR_SEPARATOR, (char)0};
> +  size_t dir_sep_size = strlen (dir_sep);
> +  unsigned int mlib_len = 0;
> +
> +  if (imultilib)
> +    {
> +      mlib_len = strlen (imultilib);
> +      mlib_len += strlen (dir_sep);
> +    }
> +
> +  char *lib = (char *)alloca (strlen (libpath) + dir_sep_size
> +                             + strlen ("m2") + dir_sep_size
> +                             + strlen (libname) + 1
> +                             + mlib_len + 1);
> +  strcpy (lib, libpath);
> +  /* iprefix has a trailing dir separator, LIBSUBDIR does not.  */
> +  if (!iprefix)
> +    strcat (lib, dir_sep);
> +
> +  if (imultilib)
> +    {
> +      strcat (lib, imultilib);
> +      strcat (lib, dir_sep);
> +    }
> +  strcat (lib, "m2");
> +  strcat (lib, dir_sep);
> +  strcat (lib, libname);
> +  M2Options_SetSearchPath (lib);
> +}
> +
> +/* For each comma-separated standard library name in LIBLIST, add the
> +   corresponding include path.  */
> +static void
> +add_m2_import_paths (const char *liblist)
> +{
> +  while (*liblist != 0 && *liblist != '-')
> +    {
> +      const char *comma = strstr (liblist, ",");
> +      size_t len;
> +      if (comma)
> +       len = comma - liblist;
> +      else
> +       len = strlen (liblist);
> +      char *libname = (char *) alloca (len+1);
> +      strncpy (libname, liblist, len);
> +      libname[len] = 0;
> +      add_one_import_path (libname);
> +      liblist += len;
> +      if (*liblist == ',')
> +       liblist++;
> +    }
> +}
> +
>  /* Run after parsing options.  */
>
>  static bool
> @@ -435,7 +538,42 @@ gm2_langhook_post_options (const char **pfilename)
>    M2Options_FinaliseOptions ();
>    main_input_filename = filename;
>
> -  /* Returning false means that the backend should be used.  */
> +  /* Add the include paths as per the libraries specified.
> +     NOTE: This assumes that the driver has validated the input and makes
> +     no attempt to be defensive of nonsense input in flibs=.  */
> +  if (allow_libraries)
> +    {
> +      if (!flibs)
> +       {
> +         if (iso)
> +           flibs = "m2iso,m2cor,m2pim,m2log";
> +         else
> +           flibs = "m2pim,m2iso,m2cor,m2log";
> +       }
> +    }
> +
> +  /* Add search paths.
> +     We are not handling all of the cases yet (e.g idirafter).
> +     This (barring the missing cases) is intended to follow the directory
> +     search rules used for c-family.  It would be less confusing if the
> +     presence of absence of these search paths was not dependent on the
> +     flibs= option. */
> +
> +  for (auto *s : iquote)
> +    M2Options_SetSearchPath (s);
> +  iquote.clear();
> +  for (auto *s : Ipaths)
> +    M2Options_SetSearchPath (s);
> +  Ipaths.clear();
> +  for (auto *s : isystem)
> +    M2Options_SetSearchPath (s);
> +  isystem.clear();
> +  /* FIXME: this is not a good way to suppress the addition of the import
> +     paths.  */
> +  if (allow_libraries)
> +    add_m2_import_paths (flibs);
> +
> + /* Returning false means that the backend should be used.  */
>    return false;
>  }
>
> diff --git a/gcc/m2/gm2spec.cc b/gcc/m2/gm2spec.cc
> index f964eccbf7a..c248d1bfcb2 100644
> --- a/gcc/m2/gm2spec.cc
> +++ b/gcc/m2/gm2spec.cc
> @@ -103,6 +103,7 @@ enum stdcxxlib_kind
>  };
>
>  #define DEFAULT_DIALECT "pim"
> +
>  #undef DEBUG_ARG
>
>  typedef enum { iso, pim, min, logitech, pimcoroutine, maxlib } libs;
> @@ -132,14 +133,13 @@ static const char *add_include (const char *libpath, const char *library);
>
>  static bool seen_scaffold_static = false;
>  static bool seen_scaffold_dynamic = false;
> +static bool scaffold_dynamic = true; // Default uses -fscaffold-dynamic.
>  static bool scaffold_static = false;
> -static bool scaffold_dynamic = true;  // Default uses -fscaffold-dynamic.
>  static bool seen_gen_module_list = false;
>  static bool seen_uselist = false;
>  static bool uselist = false;
>  static bool gen_module_list = true;  // Default uses -fgen-module-list=-.
>  static const char *gen_module_filename = "-";
> -static const char *multilib_dir = NULL;
>  /* The original argument list and related info is copied here.  */
>  static unsigned int gm2_xargc;
>  static const struct cl_decoded_option *gm2_x_decoded_options;
> @@ -148,6 +148,8 @@ static void append_arg (const struct cl_decoded_option *);
>  /* The new argument list will be built here.  */
>  static unsigned int gm2_newargc;
>  static struct cl_decoded_option *gm2_new_decoded_options;
> +static const char *full_libraries = NULL;
> +static const char *libraries = NULL;  /* Abbreviated libraries.  */
>
>
>  /* Return whether strings S1 and S2 are both NULL or both the same
> @@ -227,50 +229,6 @@ append_option (size_t opt_index, const char *arg, int value)
>    append_arg (&decoded);
>  }
>
> -/* build_archive_path returns a string containing the path to the
> -   archive defined by libpath and dialectLib.  */
> -
> -static const char *
> -build_archive_path (const char *libpath, const char *library)
> -{
> -  if (library != NULL)
> -    {
> -      const char *libdir = (const char *)library;
> -
> -      if (libdir != NULL)
> -        {
> -         int machine_length = 0;
> -          char dir_sep[2];
> -
> -          dir_sep[0] = DIR_SEPARATOR;
> -          dir_sep[1] = (char)0;
> -
> -         if (multilib_dir != NULL)
> -           {
> -             machine_length = strlen (multilib_dir);
> -             machine_length += strlen (dir_sep);
> -           }
> -
> -         int l = strlen (libpath) + 1 + strlen ("m2") + 1
> -           + strlen (libdir) + 1 + machine_length + 1;
> -          char *s = (char *)xmalloc (l);
> -
> -          strcpy (s, libpath);
> -          strcat (s, dir_sep);
> -         if (machine_length > 0)
> -           {
> -             strcat (s, multilib_dir);
> -             strcat (s, dir_sep);
> -           }
> -          strcat (s, "m2");
> -          strcat (s, dir_sep);
> -          strcat (s, libdir);
> -          return s;
> -        }
> -    }
> -  return NULL;
> -}
> -
>  /* safe_strdup safely duplicates a string.  */
>
>  static char *
> @@ -281,205 +239,65 @@ safe_strdup (const char *s)
>    return NULL;
>  }
>
> -/* add_default_combination adds the correct link path and then the
> -   library name.  */
> -
> -static bool
> -add_default_combination (const char *libpath, const char *library)
> +static char *
> +concat_option (char *dest, const char *pre, const char *path, const char *post)
>  {
> -  if (library != NULL)
> +  if (dest == NULL)
>      {
> -      append_option (OPT_L, build_archive_path (libpath, library), 1);
> -      append_option (OPT_l, safe_strdup (library), 1);
> -      return true;
> +      dest = (char *) xmalloc (strlen (pre) + strlen (path) + strlen (post) + 1);
> +      strcpy (dest, pre);
> +      strcat (dest, path);
> +      strcat (dest, post);
> +      return dest;
> +    }
> +  else
> +    {
> +      char *result = (char *) xmalloc (strlen (dest) + strlen (pre)
> +                                      + strlen (path) + strlen (post) + 1 + 1);
> +      strcpy (result, dest);
> +      strcat (result, " ");
> +      strcat (result, pre);
> +      strcat (result, path);
> +      strcat (result, post);
> +      free (dest);
> +      return result;
>      }
> -  return false;
>  }
>
> -/* add_default_archives adds the default archives to the end of the
> -   current command line.  */
> +/* add_default_libs adds the -l option which is derived from the
> +   libraries.  */
>
>  static int
> -add_default_archives (const char *libpath, const char *libraries)
> +add_default_libs (const char *libraries)
>  {
>    const char *l = libraries;
>    const char *e;
>    char *libname;
>    unsigned int libcount = 0;
>
> -  do
> +  while ((l != NULL) && (l[0] != (char)0))
>      {
>        e = index (l, ',');
>        if (e == NULL)
>          {
>            libname = xstrdup (l);
>            l = NULL;
> -         if (add_default_combination (libpath, libname))
> -           libcount++;
> +         append_option (OPT_l, safe_strdup (libname), 1);
> +         libcount++;
>           free (libname);
>          }
>        else
>          {
>            libname = xstrndup (l, e - l);
>            l = e + 1;
> -         if (add_default_combination (libpath, libname))
> -           libcount++;
> +         append_option (OPT_l, safe_strdup (libname), 1);
> +         libcount++;
>           free (libname);
>          }
>      }
> -  while ((l != NULL) && (l[0] != (char)0));
>    return libcount;
>  }
>
> -/* build_include_path builds the component of the include path
> -   referenced by the library.  */
> -
> -static const char *
> -build_include_path (const char *libpath, const char *library)
> -{
> -  char dir_sep[2];
> -  char *gm2libs;
> -  unsigned int machine_length = 0;
> -
> -  dir_sep[0] = DIR_SEPARATOR;
> -  dir_sep[1] = (char)0;
> -
> -  if (multilib_dir != NULL)
> -    {
> -      machine_length = strlen (multilib_dir);
> -      machine_length += strlen (dir_sep);
> -    }
> -
> -  gm2libs = (char *)alloca (strlen (libpath) + strlen (dir_sep) + strlen ("m2")
> -                            + strlen (dir_sep) + strlen (library) + 1
> -                           + machine_length + 1);
> -  strcpy (gm2libs, libpath);
> -  strcat (gm2libs, dir_sep);
> -  if (machine_length > 0)
> -    {
> -      strcat (gm2libs, multilib_dir);
> -      strcat (gm2libs, dir_sep);
> -    }
> -  strcat (gm2libs, "m2");
> -  strcat (gm2libs, dir_sep);
> -  strcat (gm2libs, library);
> -
> -  return xstrdup (gm2libs);
> -}
> -
> -/* add_include add the correct include path given the libpath and
> -   library.  The new path is returned.  */
> -
> -static const char *
> -add_include (const char *libpath, const char *library)
> -{
> -  if (library == NULL)
> -    return NULL;
> -  else
> -    return build_include_path (libpath, library);
> -}
> -
> -/* add_default_includes add the appropriate default include paths
> -   depending upon the style of libraries chosen.  */
> -
> -static void
> -add_default_includes (const char *libpath, const char *libraries)
> -{
> -  const char *l = libraries;
> -  const char *e;
> -  const char *c;
> -  const char *path;
> -
> -  do
> -    {
> -      e = index (l, ',');
> -      if (e == NULL)
> -        {
> -          c = xstrdup (l);
> -          l = NULL;
> -        }
> -      else
> -        {
> -          c = xstrndup (l, e - l);
> -          l = e + 1;
> -        }
> -      path = add_include (libpath, c);
> -      append_option (OPT_I, path, 1);
> -    }
> -  while ((l != NULL) && (l[0] != (char)0));
> -}
> -
> -/* library_installed returns true if directory library is found under
> -   libpath.  */
> -
> -static bool
> -library_installed (const char *libpath, const char *library)
> -{
> -#if defined(HAVE_OPENDIR) && defined(HAVE_DIRENT_H)
> -  const char *complete = build_archive_path (libpath, library);
> -  DIR *directory = opendir (complete);
> -
> -  if (directory == NULL || (errno == ENOENT))
> -    return false;
> -  /* Directory exists and therefore the library also exists.  */
> -  closedir (directory);
> -  return true;
> -#else
> -  return false;
> -#endif
> -}
> -
> -/* check_valid check to see that the library is valid.
> -   It check the library against the default library set in gm2 and
> -   also against any additional libraries installed in the prefix tree.  */
> -
> -static bool
> -check_valid_library (const char *libpath, const char *library)
> -{
> -  /* Firstly check against the default libraries (which might not be
> -     installed yet).  */
> -  for (int i = 0; i < maxlib; i++)
> -    if (strcmp (library, library_name[i]) == 0)
> -      return true;
> -  /* Secondly check whether it is installed (a third party library).  */
> -  return library_installed (libpath, library);
> -}
> -
> -/* check_valid_list check to see that the libraries specified are valid.
> -   It checks against the default library set in gm2 and also against
> -   any additional libraries installed in the libpath tree.  */
> -
> -static bool
> -check_valid_list (const char *libpath, const char *libraries)
> -{
> -  const char *start = libraries;
> -  const char *end;
> -  const char *copy;
> -
> -  do
> -    {
> -      end = index (start, ',');
> -      if (end == NULL)
> -        {
> -          copy = xstrdup (start);
> -          start = NULL;
> -        }
> -      else
> -        {
> -          copy = xstrndup (start, end - start);
> -          start = end + 1;
> -        }
> -      if (! check_valid_library (libpath, copy))
> -       {
> -         error ("library specified %sq is either not installed or does not exist",
> -                copy);
> -         return false;
> -       }
> -    }
> -  while ((start != NULL) && (start[0] != (char)0));
> -  return true;
> -}
> -
>  /* add_word returns a new string which has the contents of lib
>     appended to list.  If list is NULL then lib is duplicated and
>     returned otherwise the list is appended by "," and the contents of
> @@ -509,8 +327,14 @@ convert_abbreviation (const char *full_libraries, const char *abbreviation)
>    for (int i = 0; i < maxlib; i++)
>      if (strcmp (abbreviation, library_abbrev[i]) == 0)
>        return add_word (full_libraries, library_name[i]);
> -  /* No abbreviation found therefore assume user specified full library name.  */
> -  return add_word (full_libraries, abbreviation);
> +  /* Perhaps the user typed in the whole lib name rather than an abbrev.  */
> +  for (int i = 0; i < maxlib; i++)
> +    if (strcmp (abbreviation, library_name[i]) == 0)
> +      return add_word (full_libraries, abbreviation);
> +  /* Not found, probably a user typo.  */
> +  error ("%qs is not a valid Modula-2 system library name or abbreviation",
> +        abbreviation);
> +  return full_libraries;
>  }
>
>  /* convert_abbreviations checks each element in the library list to
> @@ -535,7 +359,8 @@ convert_abbreviations (const char *libraries)
>          }
>        else
>          {
> -          full_libraries = convert_abbreviation (full_libraries, xstrndup (start, end - start));
> +         full_libraries = convert_abbreviation (full_libraries,
> +                                                xstrndup (start, end - start));
>            start = end + 1;
>          }
>      }
> @@ -572,9 +397,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
>    /* Which c++ runtime library to link.  */
>    stdcxxlib_kind which_library = USE_LIBSTDCXX;
>
> -  const char *libraries = NULL;
>    const char *dialect = DEFAULT_DIALECT;
> -  const char *libpath = LIBSUBDIR;
>
>    /* An array used to flag each argument that needs a bit set for
>       LANGSPEC, MATHLIB, or WITHLIBC.  */
> @@ -673,12 +496,15 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
>         case OPT_flibs_:
>           libraries = xstrdup (arg);
>           allow_libraries = decoded_options[i].value;
> +         args[i] |= SKIPOPT; /* We will add the option if it is needed.  */
>           break;
>         case OPT_fmod_:
>           seen_module_extension = true;
> +         args[i] |= SKIPOPT; /* We will add the option if it is needed.  */
>           break;
>          case OPT_fpthread:
>            need_pthread = decoded_options[i].value;
> +         args[i] |= SKIPOPT; /* We will add the option if it is needed.  */
>            break;
>          case OPT_fm2_plugin:
>            need_plugin = decoded_options[i].value;
> @@ -687,24 +513,29 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
>             error ("plugin support is disabled; configure with "
>                    "%<--enable-plugin%>");
>  #endif
> +         args[i] |= SKIPOPT; /* We will add the option if it is needed.  */
>            break;
>         case OPT_fscaffold_dynamic:
>           seen_scaffold_dynamic = true;
>           scaffold_dynamic = decoded_options[i].value;
> +         args[i] |= SKIPOPT; /* We will add the option if it is needed.  */
>           break;
>         case OPT_fscaffold_static:
>           seen_scaffold_static = true;
>           scaffold_static = decoded_options[i].value;
> +         args[i] |= SKIPOPT; /* We will add the option if it is needed.  */
>           break;
>         case OPT_fgen_module_list_:
>           seen_gen_module_list = true;
>           gen_module_list = decoded_options[i].value;
>           if (gen_module_list)
>             gen_module_filename = decoded_options[i].arg;
> +         args[i] |= SKIPOPT; /* We will add the option if it is needed.  */
>           break;
>         case OPT_fuse_list_:
>           seen_uselist = true;
>           uselist = decoded_options[i].value;
> +         args[i] |= SKIPOPT; /* We will add the option if it is needed.  */
>           break;
>
>         case OPT_nostdlib:
> @@ -794,24 +625,23 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
>           break;
>
>         default:
> -         if ((decoded_options[i].orig_option_with_args_text != NULL)
> -             && (strncmp (decoded_options[i].orig_option_with_args_text,
> -                          "-m", 2) == 0))
> -           multilib_dir = xstrdup (decoded_options[i].orig_option_with_args_text
> -                                   + 2);
> +         break;
>         }
>      }
>    if (language != NULL && (strcmp (language, "modula-2") != 0))
>      return;
>
> -  if (scaffold_static && scaffold_dynamic)
> -    {
> -      if (! seen_scaffold_dynamic)
> -       scaffold_dynamic = false;
> -      if (scaffold_dynamic && scaffold_static)
> -       error ("%qs and %qs cannot both be enabled",
> -              "-fscaffold-dynamic", "-fscaffold-static");
> -    }
> +  /* Override the default when the user specifies it.  */
> +  if (seen_scaffold_static && scaffold_static && !seen_scaffold_dynamic)
> +    scaffold_dynamic = false;
> +
> +  /* If both options have been seen and both are true, that means the user
> +     tried to set both.  */
> +  if (seen_scaffold_dynamic && scaffold_dynamic
> +     && seen_scaffold_static && scaffold_static)
> +    error ("%qs and %qs cannot both be enabled",
> +          "-fscaffold-dynamic", "-fscaffold-static");
> +
>    if (uselist && gen_module_list)
>      {
>        if (! seen_gen_module_list)
> @@ -855,32 +685,44 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
>  #endif
>      }
>
> -  /* We now add in extra arguments to facilitate a successful
> -     compile or link.  For example include paths for dialect of Modula-2,
> -     library paths and default scaffold linking options.  */
> +  /* We now add in extra arguments to facilitate a successful link.
> +     Note that the libraries are added to the end of the link here
> +     and also placed earlier into the link by lang-specs.h.  Possibly
> +     this is needed because the m2pim,m2iso libraries are cross linked
> +     (--fixme-- combine all the m2 libraries into a single archive).
> +
> +     We also add default scaffold linking options.  */
>
>    /* If we have not seen either uselist or gen_module_list and we need
>       to link then we turn on -fgen_module_list=- as the default.  */
>    if ((! (seen_uselist || seen_gen_module_list)) && linking)
>      append_option (OPT_fgen_module_list_, "-", 1);
>
> +  /* We checked that they were not both enabled above, if there was a set
> +     value (even iff that is 'off'), pass that to the FE.  */
> +  if (seen_scaffold_dynamic || scaffold_dynamic)
> +    append_option (OPT_fscaffold_dynamic, NULL, scaffold_dynamic);
> +  if (seen_scaffold_static)
> +    append_option (OPT_fscaffold_static, NULL, scaffold_static);
> +
>    if (allow_libraries)
>      {
> -      /* If the libraries have not been specified by the user but the
> -        dialect has been specified then select the appropriate libraries.  */
> +      /* If the libraries have not been specified by the user, select the
> +        appropriate libraries for the active dialect.  */
>        if (libraries == NULL)
>         {
>           if (strcmp (dialect, "iso") == 0)
> -           libraries = xstrdup ("m2iso,m2pim");
> +           libraries = xstrdup ("m2iso,m2cor,m2pim,m2log");
>           else
> -           /* Default to pim libraries if none specified.  */
> -           libraries = xstrdup ("m2pim,m2log,m2iso");
> +           /* Default to pim libraries otherwise.  */
> +           libraries = xstrdup ("m2pim,m2iso,m2cor,m2log");
>         }
>        libraries = convert_abbreviations (libraries);
> -      if (! check_valid_list (libpath, libraries))
> -       return;
> -      add_default_includes (libpath, libraries);
> +      append_option (OPT_flibs_, xstrdup (libraries), 1);
>      }
> +  else
> +    append_option (OPT_flibs_, xstrdup ("-"), 0); /* no system libs.  */
> +
>    if ((! seen_x_flag) && seen_module_extension)
>      append_option (OPT_x, "modula-2", 1);
>
> @@ -889,16 +731,19 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
>
>    if (linking)
>      {
> +      if (allow_libraries)
> +       {
>  #ifdef HAVE_LD_STATIC_DYNAMIC
> -      if (allow_libraries && !shared_libgm2)
> -       append_option (OPT_Wl_, LD_STATIC_OPTION, 1);
> +         if (!shared_libgm2)
> +           append_option (OPT_Wl_, LD_STATIC_OPTION, 1);
>  #endif
> -      if (allow_libraries)
> -       add_default_archives (libpath, libraries);
> +         added_libraries += add_default_libs (libraries);
>  #ifdef HAVE_LD_STATIC_DYNAMIC
> -      if (allow_libraries && !shared_libgm2)
> -       append_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1);
> +         if (!shared_libgm2)
> +           append_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1);
>  #endif
> +       }
> +
>        /* Add `-lstdc++' if we haven't already done so.  */
>  #ifdef HAVE_LD_STATIC_DYNAMIC
>        if (library > 1 && !static_link)
> @@ -962,6 +807,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
>    *in_added_libraries = added_libraries;
>  }
>
> +
>  /* Called before linking.  Returns 0 on success and -1 on failure.  */
>  int
>  lang_specific_pre_link (void)  /* Not used for M2.  */
> diff --git a/gcc/m2/lang-specs.h b/gcc/m2/lang-specs.h
> index 92dc20fba5e..bf882649b21 100644
> --- a/gcc/m2/lang-specs.h
> +++ b/gcc/m2/lang-specs.h
> @@ -24,15 +24,16 @@ along with GCC; see the file COPYING3.  If not see
>  /* Pass the preprocessor options on the command line together with
>     the exec prefix.  */
>
> -#define M2CPP "%{fcpp:-fcpp-begin " \
> -              "      -E -lang-asm -traditional-cpp " \
> -              "      %(cpp_unique_options) -fcpp-end}"
> +#define M2CPP \
> +  "%{fcpp:-fcpp-begin " \
> +  "      -E -lang-asm -traditional-cpp " \
> +  "      %(cpp_unique_options) -fcpp-end; \
> +     : %I } "
>
>    {".mod", "@modula-2", 0, 0, 0},
>    {"@modula-2",
>        "cc1gm2 " M2CPP
> -      "      %(cc1_options) %{B*} %{c*} %{f*} %{+e*} %{I*} "
> -      "      %{MD} %{MMD} %{M} %{MM} %{MA} %{MT*} %{MF*} %V"
> -      "      %{save-temps*} %{v} "
> +      "      %(cc1_options) %{B*} %{c*} %{+e*} %{I*} "
> +      "      %{i*} %{save-temps*} %{v} "
>        "      %i %{!fsyntax-only:%(invoke_as)}",
>        0, 0, 0},
> diff --git a/gcc/m2/lang.opt b/gcc/m2/lang.opt
> index 6586fd6fa2c..7a19adc0790 100644
> --- a/gcc/m2/lang.opt
> +++ b/gcc/m2/lang.opt
> @@ -50,6 +50,50 @@ M
>  Modula-2
>  ; Documented in c.opt
>
> +MD
> +Modula-2
> +; Documented in c.opt
> +
> +MF
> +Modula-2
> +; Documented in c.opt
> +
> +MG
> +Modula-2
> +; Documented in c.opt
> +
> +MM
> +Modula-2
> +; Documented in c.opt
> +
> +MMD
> +Modula-2
> +; Documented in c.opt
> +
> +Mmodules
> +Modula-2
> +; Documented in c.opt
> +
> +Mno-modules
> +Modula-2
> +; Documented in c.opt
> +
> +MP
> +Modula-2
> +; Documented in c.opt
> +
> +MQ
> +Modula-2
> +; Documented in c.opt
> +
> +MT
> +Modula-2
> +; Documented in c.opt
> +
> +P
> +Modula-2
> +; Documented in c.opt
> +
>  O
>  Modula-2
>  ; Documented in c.opt
> @@ -310,6 +354,10 @@ iprefix
>  Modula-2
>  ; Documented in c.opt
>
> +iquote
> +Modula-2
> +; Documented in c.opt
> +
>  isystem
>  Modula-2
>  ; Documented in c.opt
> --
> 2.37.1 (Apple Git-137.1)
>

  reply	other threads:[~2023-01-23  7:12 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-17 17:04 Iain Sandoe
2023-01-23  7:12 ` Richard Biener [this message]
2023-01-23 15:20 ` Gaius Mulley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAFiYyc2VP9RjS6kYQkSw0AfvJea=VTcsB-gjoi9v-VD+=K5F9A@mail.gmail.com' \
    --to=richard.guenther@gmail.com \
    --cc=gaiusmod2@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=iain@sandoe.co.uk \
    --cc=iains.gcc@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).