modula-2, driver: Implement handling for -static-libgm2.
authorIain Sandoe <iain@sandoe.co.uk>
Sun, 1 Jan 2023 20:47:42 +0000 (20:47 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Thu, 5 Jan 2023 12:48:25 +0000 (12:48 +0000)
This was unimplemented so far.

gcc/ChangeLog:

* common.opt: Add -static-libgm2.
* config/darwin.h (LINK_SPEC): Handle static-libgm2.
* doc/gm2.texi: Document static-libgm2.
* gcc.cc (driver_handle_option): Allow static-libgm2.

gcc/m2/ChangeLog:

* gm2spec.cc (lang_specific_driver): Handle static-libgm2.
* lang.opt: Add static-libgm2.

gcc/common.opt
gcc/config/darwin.h
gcc/doc/gm2.texi
gcc/gcc.cc
gcc/m2/gm2spec.cc
gcc/m2/lang.opt

index 97a7803..d0371ae 100644 (file)
@@ -3622,6 +3622,10 @@ static-libgfortran
 Driver
 ; Documented for Fortran, but always accepted by driver.
 
+static-libgm2
+Driver
+; Documented for Modula-2, but always accepted by driver.
+
 static-libphobos
 Driver
 ; Documented for D, but always accepted by driver.
index efe3187..e6f76e5 100644 (file)
@@ -447,7 +447,12 @@ extern GTY(()) int darwin_ms_struct;
    %{static|static-libgcc|static-libphobos:%:replace-outfile(-lgphobos libgphobos.a%s)}\
    %{static|static-libgcc|static-libstdc++|static-libgfortran:%:replace-outfile(-lgomp libgomp.a%s)}\
    %{static|static-libgcc|static-libstdc++:%:replace-outfile(-lstdc++ libstdc++.a%s)}\
-   %{force_cpusubtype_ALL:-arch %(darwin_arch)} \
+   %{static|static-libgm2:%:replace-outfile(-lm2pim libm2pim.a%s)}\
+   %{static|static-libgm2:%:replace-outfile(-lm2iso libm2iso.a%s)}\
+   %{static|static-libgm2:%:replace-outfile(-lm2min libm2min.a%s)}\
+   %{static|static-libgm2:%:replace-outfile(-lm2log libm2log.a%s)}\
+   %{static|static-libgm2:%:replace-outfile(-lm2cor libm2cor.a%s)}\
+  %{force_cpusubtype_ALL:-arch %(darwin_arch)} \
    %{!force_cpusubtype_ALL:-arch %(darwin_subarch)} "\
    LINK_SYSROOT_SPEC \
   "%{mmacosx-version-min=*:-macosx_version_min %*} \
index 513fdd3..18cb798 100644 (file)
@@ -573,6 +573,10 @@ the they provide the base modules which all other dialects utilize.
 The option @samp{-fno-libs=-} disables the @samp{gm2} driver from
 modifying the search and library paths.
 
+@item -static-libgm2
+On systems that provide the m2 runtimes as both shared and static libraries,
+this option forces the use of the static version.
+
 @c flocation=
 @c Modula-2 Joined
 @c set all location values to a specific value (internal switch)
index 91313a8..d629ca5 100644 (file)
@@ -4540,12 +4540,14 @@ driver_handle_option (struct gcc_options *opts,
     case OPT_static_libgfortran:
     case OPT_static_libquadmath:
     case OPT_static_libphobos:
+    case OPT_static_libgm2:
     case OPT_static_libstdc__:
-      /* These are always valid, since gcc.cc itself understands the
-        first two, gfortranspec.cc understands -static-libgfortran,
-        d-spec.cc understands -static-libphobos, g++spec.cc
-        understands -static-libstdc++ and libgfortran.spec handles
-        -static-libquadmath.  */
+      /* These are always valid; gcc.cc itself understands the first two
+        gfortranspec.cc understands -static-libgfortran,
+        libgfortran.spec handles -static-libquadmath,
+        d-spec.cc understands -static-libphobos,
+        gm2spec.cc understands -static-libgm2,
+        and g++spec.cc understands -static-libstdc++.  */
       validated = true;
       break;
 
index b9a5c4e..583723d 100644 (file)
@@ -586,6 +586,9 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
   /* Should the driver perform a link?  */
   bool linking = true;
 
+  /* Should the driver link the shared gm2 libs?  */
+  bool shared_libgm2 = true;
+
   /* "-lm" or "-lmath" if it appears on the command line.  */
   const struct cl_decoded_option *saw_math = NULL;
 
@@ -595,7 +598,8 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
   /* By default, we throw on the math library if we have one.  */
   int need_math = (MATH_LIBRARY[0] != '\0');
 
-  /* 1 if we should add -lpthread to the command-line.  */
+  /* 1 if we should add -lpthread to the command-line.
+    FIXME: the default should be a configuration choice.  */
   int need_pthread = 1;
 
   /* True if we saw -static.  */
@@ -775,6 +779,16 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
 #endif
          break;
 
+       case OPT_static_libgm2:
+         shared_libgm2 = false;
+#ifdef HAVE_LD_STATIC_DYNAMIC
+         /* Remove -static-libgm2 from the command only if target supports
+            LD_STATIC_DYNAMIC.  When not supported, it is left in so that a
+            back-end target can use outfile substitution.  */
+         args[i] |= SKIPOPT;
+#endif
+         break;
+
        case OPT_stdlib_:
          which_library = (stdcxxlib_kind) decoded_options[i].value;
          break;
@@ -875,8 +889,16 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
 
   if (linking)
     {
+#ifdef HAVE_LD_STATIC_DYNAMIC
+      if (allow_libraries && !shared_libgm2)
+       append_option (OPT_Wl_, LD_STATIC_OPTION, 1);
+#endif
       if (allow_libraries)
        add_default_archives (libpath, libraries);
+#ifdef HAVE_LD_STATIC_DYNAMIC
+      if (allow_libraries && !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)
index 83a5ce7..43b1bbc 100644 (file)
@@ -349,4 +349,8 @@ x
 Modula-2 Joined
 specify the language from the compiler driver
 
+static-libgm2
+Driver
+Link the standard Modula-2 libraries statically in the compilation.
+
 ; This comment is to ensure we retain the blank line above.