aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaius Mulley <gaiusmod2@gmail.com>2025-08-29 22:10:29 +0100
committerGaius Mulley <gaiusmod2@gmail.com>2025-08-29 22:10:29 +0100
commit8ab3bbadefb7f61086dec3da982059779f7cff51 (patch)
treed911827af43a86aedcd840adcf3b3422378c635f
parent78d19ea3fea308a08d2844de88d43154465daa78 (diff)
downloadgcc-8ab3bbadefb7f61086dec3da982059779f7cff51.zip
gcc-8ab3bbadefb7f61086dec3da982059779f7cff51.tar.gz
gcc-8ab3bbadefb7f61086dec3da982059779f7cff51.tar.bz2
PR modula2/121709: Failed bootstrap in m2
This patch is a followup to PR modula2/121629 which uses the cpp_include_defaults array to configure the default search path entries. In particular it creates default search paths based on LOCAL_INCLUDE_DIR, PREFIX_INCLUDE_DIR, gcc version path and NATIVE_SYSTEM_HEADER_DIR. gcc/m2/ChangeLog: PR modula2/121709 * gm2-lang.cc (concat_component): New function. (find_cpp_entry): Ditto. (lookup_cpp_default): Ditto. (add_default_include_paths): Rewrite. (m2_pathname_root): Remove. gcc/ChangeLog: PR modula2/121709 * doc/gm2.texi (Module Search Path): Reflect the new search order. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
-rw-r--r--gcc/doc/gm2.texi8
-rw-r--r--gcc/m2/gm2-lang.cc101
2 files changed, 82 insertions, 27 deletions
diff --git a/gcc/doc/gm2.texi b/gcc/doc/gm2.texi
index 4147a287..d908aea 100644
--- a/gcc/doc/gm2.texi
+++ b/gcc/doc/gm2.texi
@@ -1455,13 +1455,17 @@ PIM4 dialect. This is a temporary implementation situation.
This section describes the default module search path and how this
might be changed. By default the compiler will search the current
-directory, site wide modules and lastly gcc version specific modules.
+directory, local include dir, prefix include dir, gcc version specific
+modules and lastly native system header dir. The exact location and
+whether all these directories are used depends upon the configuration
+options used when building GCC.
The @samp{-I} option option can be used to introduce new directories
in the module search path and for convenience the options @samp{-flibs=}
and @samp{-fm2-pathname-root=} are also provided.
-The site wide modules are located at @var{prefix}@file{/include/m2}
+The site wide modules are typically located at
+@var{prefix}@file{/include/m2}
whereas the version specific modules are located in
@var{libsubdir}@file{/m2}. Both of these @file{/m2} directories
are organized such that the non dialect specific modules are at the
diff --git a/gcc/m2/gm2-lang.cc b/gcc/m2/gm2-lang.cc
index d378d1b..cc074d5 100644
--- a/gcc/m2/gm2-lang.cc
+++ b/gcc/m2/gm2-lang.cc
@@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see
#include "m2-tree.h"
#include "convert.h"
#include "rtegraph.h"
+#include "cppdefault.h"
static void write_globals (void);
@@ -60,6 +61,7 @@ static bool allow_libraries = true;
static const char *flibs = nullptr;
static const char *iprefix = nullptr;
static const char *imultilib = nullptr;
+static const char *target_system_root = nullptr;
static std::vector<named_path>Ipaths;
static std::vector<const char*>isystem;
static std::vector<const char*>iquote;
@@ -537,17 +539,86 @@ get_module_source_dir (void)
return lib;
}
+/* concat_component returns a string containing the path left/right.
+ Pre-requisite, left and right are null terminated strings. The contents of
+ left and right are held on the heap. Post-requisite, left and right are
+ freed and a new combined string is malloced. */
+
+static char *
+concat_component (char *left, char *right)
+{
+ size_t len = strlen (left)
+ + strlen (right)
+ + get_dir_sep_size ()
+ + 1;
+ char *new_str = (char *) xmalloc (len);
+ strcpy (new_str, left);
+ add_path_component (new_str, right);
+ free (left);
+ free (right);
+ return new_str;
+}
+
+/* find_cpp_entry return the element of the cpp_include_defaults array
+ whose fname matches name. */
+
+static const struct default_include *
+find_cpp_entry (const char *name)
+{
+ const struct default_include *p;
+
+ for (p = cpp_include_defaults; p->fname; p++)
+ if (strcmp (p->fname, name) == 0)
+ return p;
+ return NULL;
+}
+
+/* lookup_cpp_default lookup the entry in cppdefault then add the directory to
+ the m2 search path. It also honours sysroot, imultilib and imultiarch. */
+
+static void
+lookup_cpp_default (const char *sysroot, const char *flibs, const char *name)
+{
+ const struct default_include *p = find_cpp_entry (name);
+
+ if (p != NULL)
+ {
+ char *full_str = xstrdup (p->fname);
+
+ /* Should this directory start with the sysroot? */
+ if (sysroot && p->add_sysroot)
+ full_str = concat_component (xstrdup (sysroot), full_str);
+ /* Should we append the imultilib component? */
+ if (p->multilib == 1 && imultilib)
+ full_str = concat_component (full_str, xstrdup (imultilib));
+ /* Or append the imultiarch component? */
+ else if (p->multilib == 2 && imultiarch)
+ full_str = concat_component (full_str, xstrdup (imultiarch));
+ else
+ full_str = xstrdup (p->fname);
+ foreach_lib_gen_import_path (flibs, full_str);
+ free (full_str);
+ }
+}
+
/* add_default_include_paths add include paths for site wide definition modules
and also gcc version specific definition modules. */
static void
add_default_include_paths (const char *flibs)
{
- /* Add the site wide include path. */
- foreach_lib_gen_import_path (flibs, PREFIX_INCLUDE_DIR);
+ /* Follow the order found in cppdefaults.cc. */
+#ifdef LOCAL_INCLUDE_DIR
+ lookup_cpp_default (target_system_root, flibs, LOCAL_INCLUDE_DIR);
+#endif
+#ifdef PREFIX_INCLUDE_DIR
+ lookup_cpp_default (target_system_root, flibs, PREFIX_INCLUDE_DIR);
+#endif
/* Add the gcc version specific include path. */
- foreach_lib_gen_import_path (flibs,
- get_module_source_dir ());
+ foreach_lib_gen_import_path (flibs, get_module_source_dir ());
+#ifdef NATIVE_SYSTEM_HEADER_DIR
+ lookup_cpp_default (target_system_root, flibs, NATIVE_SYSTEM_HEADER_DIR);
+#endif
}
/* assign_flibs assign flibs to a default providing that allow_libraries
@@ -565,26 +636,6 @@ assign_flibs (void)
}
}
-/* m2_pathname_root creates a new set of include paths for the
- subdirectory m2 inside libroot. The ordering of the paths
- follows the dialect library order. */
-
-static void
-m2_pathname_root (const char *libroot)
-{
- const char *copy_flibs = flibs;
-
- if (copy_flibs == NULL)
- {
- if (iso)
- copy_flibs = "m2iso,m2cor,m2pim,m2log";
- else
- copy_flibs = "m2pim,m2iso,m2cor,m2log";
- }
- foreach_lib_gen_import_path (copy_flibs, libroot);
-}
-
-
/* Handle gm2 specific options. Return 0 if we didn't do anything. */
bool
@@ -858,7 +909,7 @@ gm2_langhook_handle_option (
return 1;
break;
case OPT_isysroot:
- /* Otherwise, ignored, at least for now. */
+ target_system_root = arg;
return 1;
break;
case OPT_fm2_whole_program: