Driver cleanup and purge of unnecessary code.

This patch cleans up the driver gm2 by removing the old scaffold
support routines.  The driver is now much closer to other language
drivers with the exception of adding default libraries and include
paths if different dialects are chosen.

2022-06-22  Gaius Mulley  <gaius.mulley@southwales.ac.uk>

gcc/m2/ChangeLog:

	* m2/gm2-lang.cc (gm2_langhook_init_options_struct): Remove
	blank line.  (gm2_langhook_handle_option) purged options.
	(ftarget_ar) Removed.  (ftarget_ranlib) Removed.  (fmakeinit)
	Removed.  (fobject-path) Removed.  (fonlylink) Removed.
	* m2/gm2spec.cc (GM2_PREFIX_ENV): Removed.
	(add_exec_prefix) Removed.  (add_B_prefix) Removed.
	(get_objects) Removed.  (*get_link_args) Removed.  (*add_exec_dir)
	Removed.  (*add_exec_name) Removed.  (is_object) Removed.
	(remember_object) Removed.  (remember_link_arg) Removed.
	(scan_for_link_args) Removed.  (add_link_from_include) Removed.
	(check_gm2_root) Removed.  (*gen_gm2_prefix) Removed.
	(*gen_gm2_libexec) Removed.  (*get_libexec) Removed.
	(object_list) Removed.  (head_objects) Removed.
	(head_link_args) Removed.  (inclPos) Removed.
	(linkPos) Removed.  (seen_fonlylink) Removed.
	(seen_fmakeall0) Removed.  (seen_fmakeall) Removed.
	* m2/lang.opt: (fmakeinit) Removed.  (fobject-path) Removed.

libgm2/Changelog:

	* libm2pim/Makefile.am (M2MODS): Add M2Dependent.mod
	(M2DEFS) Add M2Dependent.def.

Signed-off-by: Gaius Mulley <gaius.mulley@southwales.ac.uk>
This commit is contained in:
Gaius Mulley 2022-06-22 14:21:45 +01:00
parent 5ceb82c64e
commit dbd4f352da
4 changed files with 27 additions and 778 deletions

View File

@ -133,7 +133,6 @@ gm2_langhook_option_lang_mask (void)
static void
gm2_langhook_init_options_struct (struct gcc_options *opts)
{
/* Default to avoiding range issues for complex multiply and divide. */
opts->x_flag_complex_method = 2;
@ -338,14 +337,6 @@ gm2_langhook_handle_option (
case OPT_fno_m2_plugin:
/* handled in the driver. */
return 1;
#if 0
case OPT_ftarget_ar_:
/* handled in the driver. */
return 1;
case OPT_ftarget_ranlib_:
/* handled in the driver. */
return 1;
#endif
case OPT_fscaffold_dynamic:
M2Options_SetScaffoldDynamic (value);
return 1;
@ -391,23 +382,12 @@ gm2_langhook_handle_option (
case OPT_fshared:
/* handled by the linker. */
return 1;
case OPT_fmakeinit:
/* handled by the linker. */
return 1;
case OPT_fm2_statistics:
M2Options_SetStatistics (value);
return 1;
case OPT_fm2_g:
M2Options_SetM2g (value);
return 1;
case OPT_fobject_path_:
/* handled by the linker. */
return 1;
#if 0
case OPT_fonlylink:
/* handled by the driver. */
return 1;
#endif
case OPT_version:
M2Options_DisplayVersion (FALSE);
return 1;
@ -648,8 +628,8 @@ write_globals (void)
m2block_finishGlobals ();
/* Process all file scopes in this compilation, and the
external_scope, through wrapup_global_declarations and
check_global_declarations. */
external_scope, through wrapup_global_declarations and
check_global_declarations. */
FOR_EACH_VEC_ELT (*all_translation_units, i, t)
m2_write_global_declarations (BLOCK_VARS (DECL_INITIAL (t)));
}

View File

@ -66,22 +66,10 @@ along with GNU Modula-2; see the file COPYING3. If not see
#define LIBRARY_PATH_ENV "LIBRARY_PATH"
#endif
#ifndef GM2_PREFIX_ENV
#define GM2_PREFIX_ENV "GM2_PREFIX"
#endif
#ifndef GM2_LIBEXEC_ENV
#define GM2_LIBEXEC_ENV "GM2_LIBEXEC"
#endif
#ifndef GM2IPATH_ENV
#define GM2IPATH_ENV "GM2IPATH"
#endif
#ifndef GM2OPATH_ENV
#define GM2OPATH_ENV "GM2OPATH"
#endif
int lang_specific_extra_outfiles = 0;
/* DEBUGGING will print all the options at various stages with their
@ -123,51 +111,18 @@ static const char *library_abbrev[maxlib]
the dialect of Modula-2 and the library set. */
int lang_specific_pre_link (void);
static void add_exec_prefix (void);
#if defined(LOCAL_DEBUGGING)
static void add_B_prefix (unsigned int *in_decoded_options_count,
struct cl_decoded_option **in_decoded_options);
#endif
static const char *get_objects (int argc, const char *argv[]);
static const char *get_link_args (int argc, const char *argv[]);
static const char *add_exec_dir (int argc, const char *argv[]);
static const char *add_exec_name (int argc, const char *argv[]);
static int is_object (const char *s);
static void remember_object (const char *s);
static void remember_link_arg (const char *opt, const char *s);
static void scan_for_link_args (unsigned int *in_decoded_options_count,
struct cl_decoded_option **in_decoded_options);
static void add_link_from_include (struct cl_decoded_option **in_options,
int include);
static void add_lib (size_t opt_index, const char *lib, int joined);
static void check_gm2_root (void);
static const char *add_include (const char *libpath, const char *library);
static const char *gen_gm2_prefix (const char *gm2_root);
static const char *gen_gm2_libexec (const char *path);
static const char *get_libexec (void);
static void insert_option (unsigned int *in_decoded_options_count,
struct cl_decoded_option **in_decoded_options,
unsigned int position);
static const char *gen_link_path (const char *libpath, const char *dialect);
typedef struct object_list
{
char *name;
struct object_list *next;
} object_list;
static object_list *head_objects = NULL;
static object_list *head_link_args = NULL;
static int inclPos = -1;
static int linkPos = -1;
static bool seen_fonlylink = false;
static bool seen_fmakeall0 = false;
static bool seen_fmakeall = false;
static bool seen_B = false;
static const char *B_path = NULL;
static const char *multilib_dir = NULL;
/* By default, the suffix for target object files is ".o". */
/* By default the suffix for target object files is ".o". */
#ifdef TARGET_OBJECT_SUFFIX
#define HAVE_TARGET_OBJECT_SUFFIX
#else
@ -175,7 +130,7 @@ static const char *multilib_dir = NULL;
#endif
/* fe_generate_option, wrap up arg and pass it to fe_save_switch. */
/* fe_generate_option wrap up arg and pass it to fe_save_switch. */
static void
fe_generate_option (size_t opt_index, const char *arg, bool joined)
@ -207,138 +162,7 @@ fe_generate_option (size_t opt_index, const char *arg, bool joined)
}
}
#if defined(LOCAL_DEBUGGING)
/* Find_executable_path, if argv0 references an executable filename
then use this path. */
static const char *
find_executable_path (const char *argv0)
{
if (access (argv0, X_OK) == 0)
{
const char *n = strrchr (argv0, DIR_SEPARATOR);
/* Strip off the program name from argv0, but leave the DIR_SEPARATOR. */
if (n != NULL)
{
char *copy = xstrdup (argv0);
char *n = strrchr (copy, DIR_SEPARATOR);
n[1] = (char)0;
return copy;
}
}
return NULL;
}
/* add_B_prefix, adds the -Bprefix option so that we can tell
subcomponents of gm2 where to pick up its executables. But we can
only do this if the user explicitly gives the path to argv[0]. */
static void
add_B_prefix (unsigned int *in_decoded_options_count ATTRIBUTE_UNUSED,
struct cl_decoded_option **in_decoded_options)
{
if ((*in_decoded_options)[0].arg != NULL)
{
const char *arg = (*in_decoded_options)[0].arg;
const char *path = find_executable_path (arg);
if (path == NULL || (strcmp (path, "") == 0))
path = gen_gm2_libexec (get_libexec ());
if (path != NULL && (strcmp (path, "") != 0))
{
#if defined(DEBUGGING)
unsigned int i;
printf ("going to add -B%s\n", path);
for (i = 0; i < *in_decoded_options_count; i++)
print_option ("before add -B", i, *in_decoded_options);
#endif
fe_handle_opt_b (xstrdup (path));
fe_generate_option (OPT_B, xstrdup (path), 1);
#if defined(DEBUGGING)
for (i = 0; i < *in_decoded_options_count; i++)
print_option ("after add -B", i, *in_decoded_options);
#endif
}
}
}
#endif
#if 0
/* add_exec_prefix, adds the -ftarget-ar= option so that we can tell
gm2lcc where to pick up the `ar' utility. */
static void
add_exec_prefix (void)
{
const char *ar = AR_PATH;
const char *ranlib = RANLIB_PATH;
fe_generate_option (OPT_ftarget_ar_, ar, true);
fe_generate_option (OPT_ftarget_ranlib_, ranlib, true);
}
#endif
static const char *
get_libexec (void)
{
const char *libexec = getenv (GM2_LIBEXEC_ENV);
if (libexec == NULL || (strcmp (libexec, "") == 0))
return STANDARD_LIBEXEC_PREFIX;
else
return libexec;
}
static int
is_object (const char *s)
{
return (strlen (s) > strlen (TARGET_OBJECT_SUFFIX)
&& (strcmp (s + strlen (s) - strlen (TARGET_OBJECT_SUFFIX),
TARGET_OBJECT_SUFFIX)
== 0));
}
static void
remember_object (const char *s)
{
object_list *n = (object_list *)xmalloc (sizeof (object_list));
n->name = xstrdup (s);
n->next = head_objects;
head_objects = n;
#if defined(DEBUGGING)
fprintf (stderr, "remembering object: %s\n", s);
#endif
}
static void
remember_link_arg (const char *opt, const char *s)
{
object_list *n = (object_list *)xmalloc (sizeof (object_list));
n->name = (char *)xmalloc (strlen (opt) + strlen (s) + 1);
strcpy (n->name, opt);
strcat (n->name, s);
n->next = head_link_args;
head_link_args = n;
}
/* add_link_from_include, adds option to (**in_argv)[pos] using the
include path. */
static void
add_link_from_include (struct cl_decoded_option **in_options, int include)
{
struct cl_decoded_option *options = *in_options;
const char *arg = options[include].arg;
fe_generate_option (OPT_fobject_path_, arg, true);
}
/* add_lib, add lib to the end of the command line. */
/* add_lib add lib to the end of the command line. */
static void
add_lib (size_t opt_index, const char *lib, int joined)
@ -349,7 +173,7 @@ add_lib (size_t opt_index, const char *lib, int joined)
fe_generate_option (opt_index, lib, joined);
}
/* insert_option, inserts an option at position on the command line. */
/* insert_option inserts an option at position on the command line. */
static void
insert_option (unsigned int *in_decoded_options_count,
@ -375,7 +199,7 @@ insert_option (unsigned int *in_decoded_options_count,
*in_decoded_options = new_decoded_options;
}
/* add_library, adds a library to the command line at arg position.
/* add_library adds a library to the command line at arg position.
It returns the number of arguments added. If libraryname is NULL or
empty then zero is returned. */
@ -398,7 +222,8 @@ add_library (const char *libraryname, unsigned int *in_decoded_options_count,
generate_option (OPT_l, libraryname, 1, CL_DRIVER,
&(*in_decoded_options)[position]);
#if defined(DEBUGGING)
#if 0
// defined(DEBUGGING)
print_options ("after add_library", *in_decoded_options_count, *in_decoded_options);
#endif
return 1;
@ -448,7 +273,7 @@ build_archive_path (const char *libpath, const char *library)
return NULL;
}
/* safe_strdup, safely duplicates a string. */
/* safe_strdup safely duplicates a string. */
static char *
safe_strdup (const char *s)
@ -458,7 +283,7 @@ safe_strdup (const char *s)
return NULL;
}
/* add_default_combination, adds the correct link path and then the
/* add_default_combination adds the correct link path and then the
library name. */
static void
@ -475,7 +300,7 @@ add_default_combination (const char *libpath, const char *library,
}
}
/* gen_link_path, generates a link path for the chosen dialect. */
/* gen_link_path generates a link path for the chosen dialect. */
static const char *
gen_link_path (const char *libpath, const char *dialect)
@ -483,7 +308,7 @@ gen_link_path (const char *libpath, const char *dialect)
return add_include (libpath, dialect);
}
/* add_default_archives, adds the default archives to the end of the
/* add_default_archives adds the default archives to the end of the
current command line. */
static int
@ -528,8 +353,8 @@ add_default_archives (const char *libpath, const char *libraries,
return libcount;
}
/* build_include_path, builds the component of the include path
referenced by the, which, libs. */
/* 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)
@ -576,7 +401,7 @@ add_include (const char *libpath, const char *library)
return build_include_path (libpath, library);
}
/* add_default_includes, add the appropriate default include paths
/* add_default_includes add the appropriate default include paths
depending upon the style of libraries chosen. */
static void
@ -606,121 +431,7 @@ add_default_includes (const char *libpath, const char *libraries)
while ((l != NULL) && (l[0] != (char)0));
}
/* build_fobject_path, returns a string containing the a path to the
objects defined by libpath and dialectLib. */
static char *
build_fobject_path (const char *prev, const char *libpath, const char *library)
{
char sepstr[2];
char *gm2objs;
const char *libName = library;
unsigned int machine_length = 0;
sepstr[0] = DIR_SEPARATOR;
sepstr[1] = (char)0;
if (multilib_dir != NULL)
{
machine_length = strlen (multilib_dir);
if (machine_length > 0)
machine_length += strlen (sepstr);
}
if (prev == NULL)
{
gm2objs = (char *)alloca (
strlen (libpath) + strlen (sepstr)
+ machine_length
+ strlen ("m2") + strlen (sepstr)
+ strlen (libName) + 1 + strlen (libpath) + strlen (sepstr)
+ strlen ("m2") + strlen (sepstr) + strlen (libName) + 1);
strcpy (gm2objs, "");
}
else
{
gm2objs = (char *)alloca (
strlen (prev) + strlen (":") + strlen (libpath) + strlen (sepstr)
+ machine_length
+ strlen ("m2") + strlen (sepstr) + strlen (libName) + 1
+ strlen (libpath) + strlen (sepstr) + strlen ("m2")
+ strlen (sepstr) + strlen (libName) + 1);
strcpy (gm2objs, prev);
strcat (gm2objs, ":");
}
strcat (gm2objs, libpath);
strcat (gm2objs, sepstr);
if (machine_length > 0)
{
strcat (gm2objs, multilib_dir);
strcat (gm2objs, sepstr);
}
strcat (gm2objs, "m2");
strcat (gm2objs, sepstr);
strcat (gm2objs, libName);
return xstrdup (gm2objs);
}
/* add_fobject_path, add all required path to satisfy the link for library. */
static void
add_fobject_path (const char *prev, const char *libpath, const char *library)
{
if (library != NULL)
fe_generate_option (OPT_fobject_path_,
build_fobject_path (prev, libpath, library), true);
}
/* add_default_fobjects, add the appropriate default include paths
depending upon the libraries chosen. */
static void
add_default_fobjects (const char *prev, const char *libpath,
const char *libraries)
{
const char *l = libraries;
const char *e;
const char *c;
do
{
e = index (l, ',');
if (e == NULL)
{
c = xstrdup (l);
l = NULL;
}
else
{
c = xstrndup (l, e - l);
l = e + 1;
}
add_fobject_path (prev, libpath, c);
}
while ((l != NULL) && (l[0] != (char)0));
}
static void
scan_for_link_args (unsigned int *in_decoded_options_count,
struct cl_decoded_option **in_decoded_options)
{
struct cl_decoded_option *decoded_options = *in_decoded_options;
unsigned int i;
for (i = 0; i < *in_decoded_options_count; i++)
{
const char *arg = decoded_options[i].arg;
size_t opt = decoded_options[i].opt_index;
if (opt == OPT_l)
remember_link_arg ("-l", arg);
else if (opt == OPT_L)
remember_link_arg ("-L", arg);
}
}
/* purge_include_options, remove any -I option found from
/* purge_include_options remove any -I option found from
in_decoded_options. */
static void
@ -743,185 +454,6 @@ purge_include_options (unsigned int *in_decoded_options_count,
}
}
/* convert_include_into_link, convert the include path options into
link path options. */
static void
convert_include_into_link (struct cl_decoded_option **in_decoded_options,
unsigned int *in_decoded_options_count)
{
unsigned int i;
for (i = 1; i < *in_decoded_options_count; i++)
{
size_t opt = (*in_decoded_options)[i].opt_index;
if (opt == OPT_I)
add_link_from_include (in_decoded_options, i);
}
}
/* build_path, implements export PATH=$(prefix)/bin:$PATH. */
static void
build_path (const char *prefix)
{
int l = strlen ("PATH=") + strlen (prefix) + 1 + strlen ("bin") + 1;
char *s;
char dir_sep[2];
const char *path;
path = getenv ("PATH");
if (path != NULL && (strcmp (path, "") != 0))
l += strlen (":") + strlen (path);
s = (char *)xmalloc (l);
dir_sep[0] = DIR_SEPARATOR;
dir_sep[1] = (char)0;
strcpy (s, "PATH=");
strcat (s, prefix);
strcat (s, dir_sep);
strcat (s, "bin");
if (path != NULL && (strcmp (path, "") != 0))
{
strcat (s, ":");
strcat (s, path);
}
fe_putenv (s);
}
/* gen_gm2_prefix, return the prefix string. */
static const char *
gen_gm2_prefix (const char *prefix)
{
int l = strlen (prefix) + 1 + strlen ("lib") + 1 + strlen ("gcc") + 1
+ strlen (DEFAULT_TARGET_MACHINE) + 1
+ strlen (DEFAULT_TARGET_VERSION) + 1;
char *s = (char *)xmalloc (l);
char dir_sep[2];
dir_sep[0] = DIR_SEPARATOR;
dir_sep[1] = (char)0;
strcpy (s, prefix);
strcat (s, dir_sep);
strcat (s, "lib");
strcat (s, dir_sep);
strcat (s, "gcc");
strcat (s, dir_sep);
strcat (s, DEFAULT_TARGET_MACHINE);
strcat (s, dir_sep);
strcat (s, DEFAULT_TARGET_VERSION);
return s;
}
/* gen_gm2_libexec, return a libexec string. */
static const char *
gen_gm2_libexec (const char *libexec)
{
int l = strlen (libexec) + 1 + strlen (DEFAULT_TARGET_MACHINE) + 1
+ strlen (DEFAULT_TARGET_VERSION) + 1;
char *s = (char *)xmalloc (l);
char dir_sep[2];
dir_sep[0] = DIR_SEPARATOR;
dir_sep[1] = (char)0;
strcpy (s, libexec);
strcat (s, dir_sep);
strcat (s, DEFAULT_TARGET_MACHINE);
strcat (s, dir_sep);
strcat (s, DEFAULT_TARGET_VERSION);
return s;
}
/* build_library_path, implements export
LIBRARY_PATH=$(gm2_root)/lib/gcc/\ $(default_target_machine)/\
$(default_target_version)
where gm2_root, default_target_machine and default_target_version
are C strings. */
static void
build_library_path (const char *prefix)
{
const char *path = gen_gm2_prefix (prefix);
int l = strlen ("LIBRARY_PATH=") + strlen (prefix) + 1;
char *s = (char *)xmalloc (l);
strcpy (s, "LIBRARY_PATH=");
strcat (s, path);
fe_putenv (s);
}
/* build_compiler_path, implements export
COMPILER_PATH=$(GM2_LIBEXEC)/libexec/gcc/\
$(default_target_machine)/\ $(default_target_version). */
static void
build_compiler_path (const char *path)
{
const char *libexec = gen_gm2_libexec (path);
int l = strlen ("COMPILER_PATH=") + strlen (libexec) + 1;
char *s = (char *)xmalloc (l);
strcpy (s, "COMPILER_PATH=");
strcat (s, libexec);
fe_putenv (s);
}
/* check_gm2_root, checks to see whether GM2_PREFIX or GM2_LIBEXEC
has been defined, if it has and also COMPILER_PATH and LIBRARY_PATH
are both unset then it sets COMPILER_PATH and LIBRARY_PATH using
GM2_PREFIX and GM2_LIBEXEC as its prefix. */
static void
check_gm2_root (void)
{
const char *library_path;
const char *compiler_path;
const char *gm2_prefix;
const char *gm2_libexec;
library_path = fe_getenv (LIBRARY_PATH_ENV);
compiler_path = fe_getenv ("COMPILER_PATH");
gm2_prefix = fe_getenv (GM2_PREFIX_ENV);
gm2_libexec = fe_getenv (GM2_LIBEXEC_ENV);
if ((library_path == NULL || (strcmp (library_path, "") == 0))
&& (compiler_path == NULL || (strcmp (compiler_path, "") == 0)))
{
#if defined(DEBUGGING)
fprintf (stderr, "STANDARD_LIBEXEC_PREFIX = %s\n",
STANDARD_LIBEXEC_PREFIX);
fprintf (stderr, "STANDARD_BINDIR_PREFIX = %s\n",
STANDARD_BINDIR_PREFIX);
fprintf (stderr, "TOOLDIR_BASE_PREFIX = %s\n", TOOLDIR_BASE_PREFIX);
fprintf (stderr, "DEFAULT_TARGET_VERSION = %s\n",
DEFAULT_TARGET_VERSION);
fprintf (stderr, "DEFAULT_TARGET_MACHINE = %s\n",
DEFAULT_TARGET_MACHINE);
#endif
if (gm2_prefix != NULL && (strcmp (gm2_prefix, "") != 0))
{
build_path (gm2_prefix);
build_library_path (gm2_prefix);
}
if (gm2_libexec != NULL && (strcmp (gm2_libexec, "") != 0))
build_compiler_path (gm2_libexec);
}
else if (gm2_prefix != NULL && !seen_fmakeall0)
/* No need to issue a warning if seen_fmakeall0 as the parent will
have set COMPILER_PATH and LIBRARY_PATH because of GM2_ROOT.
Also users should not be using -fmakeall0 as it is an internal
option. */
error ("it is not advisible to set %qs as well as either %qs or %qs",
GM2_PREFIX_ENV, LIBRARY_PATH_ENV, "COMPILER_PATH");
}
/* library_installed returns true if directory library is found under
libpath. */
@ -949,12 +481,12 @@ library_installed (const char *libpath, const char *library)
static bool
check_valid_library (const char *libpath, const char *library)
{
/* firstly check against the default libraries (which might not be
/* 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). */
/* Secondly check whether it is installed (a third party library). */
return library_installed (libpath, library);
}
@ -994,50 +526,6 @@ check_valid_list (const char *libpath, const char *libraries)
}
/* add_env_option append multiple options, one for each element in
the path. */
static void
add_env_option (const char *path, size_t option)
{
if (path != NULL)
{
const char *p = path;
const char *s = path;
char *arg;
int i, l, n;
l = strlen (path);
i = 0;
n = 0;
while (i < l)
{
if (path[i] == ':')
{
arg = (char *)xmalloc (n + 1);
strncpy (arg, s, n);
arg[n] = (char)0;
fe_generate_option (option, arg, true);
n++;
s = &p[i];
n = 0;
}
else
{
n++;
i++;
}
}
if (n > 0)
{
arg = (char *)xmalloc (n + 1);
strncpy (arg, s, n);
arg[n] = (char)0;
fe_generate_option (option, arg, 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
@ -1123,11 +611,8 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
bool seen_module_extension = -1;
bool linking = true;
bool seen_source = false;
bool seen_fexceptions = true;
const char *libpath;
const char *gm2ipath;
const char *gm2opath;
/* By default, we add the math library if we have one. */
bool need_math = (strcmp (MATH_LIBRARY, "") == 0);
@ -1158,17 +643,6 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
case OPT_fexceptions:
seen_fexceptions = ((*in_decoded_options)[i].value);
break;
#if 0
case OPT_fonlylink:
seen_fonlylink = true;
break;
case OPT_fmakeall:
seen_fmakeall = true;
break;
case OPT_fmakeall0:
seen_fmakeall0 = true;
break;
#endif
case OPT_B:
seen_B = true;
B_path = (*in_decoded_options)[i].arg;
@ -1188,22 +662,10 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
}
}
#if 0
/* -fmakeall implies that the first invoked driver only does the link
and should leave all compiles to the makefile otherwise we will try
and link two main applications. */
if (seen_fmakeall && (!seen_fonlylink))
fe_generate_option (OPT_fonlylink, NULL, false);
check_gm2_root ();
#endif
libpath = fe_getenv (LIBRARY_PATH_ENV);
if (libpath == NULL || (strcmp (libpath, "") == 0))
libpath = LIBSUBDIR;
gm2ipath = fe_getenv (GM2IPATH_ENV);
gm2opath = fe_getenv (GM2OPATH_ENV);
#if defined(DEBUGGING)
print_options ("at beginning", *in_decoded_options_count, *in_decoded_options);
#endif
@ -1220,12 +682,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
if ((opt == OPT_c) || (opt == OPT_S))
linking = false;
if (opt == OPT_I)
{
fe_generate_option (OPT_I, arg, true);
inclPos = i;
}
if (opt == OPT_fobject_path_)
linkPos = i;
fe_generate_option (OPT_I, arg, true);
if (opt == OPT_fiso)
dialect = "iso";
if (opt == OPT_fpim2)
@ -1249,17 +706,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
seen_x_flag = true;
language = arg;
}
if (opt == OPT_SPECIAL_input_file)
{
if (is_object (arg))
remember_object (arg);
else
seen_source = true;
}
}
if (linking && (!seen_source))
linking = false;
if (language != NULL && (strcmp (language, "modula-2") != 0))
return;
#if defined(DEBUGGING)
@ -1271,53 +718,17 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
if (libraries == NULL)
{
if (strncmp (dialect, "pim", 3) == 0)
libraries = xstrdup ("m2pim");
else if (strcmp (dialect, "iso") == 0)
if (strcmp (dialect, "iso") == 0)
libraries = xstrdup ("m2iso,m2pim");
else
libraries = xstrdup ("m2pim"); /* Always require m2pim for dynamic scaffold. */
}
libraries = convert_abbreviations (libraries);
if (! check_valid_list (libpath, libraries))
return;
if (inclPos != -1 && linkPos == -1)
{
#if defined(DEBUGGING)
printf ("inclPos = %d, linkPos = %d\n", inclPos, linkPos);
#endif
linkPos = 1;
convert_include_into_link (in_decoded_options, in_decoded_options_count);
}
add_env_option (gm2ipath, OPT_I);
add_default_includes (libpath, libraries);
#if 0
add_exec_prefix ();
#endif
#if defined(LOCAL_DEBUGGING)
if (!seen_B)
add_B_prefix (in_decoded_options_count, in_decoded_options);
#endif
#if defined(DEBUGGING)
print_options ("after B prefix", *in_decoded_options_count, *in_decoded_options);
#endif
if (linkPos == -1)
{
linkPos = 1;
if (inclPos == -1)
add_default_fobjects (NULL, libpath, libraries);
else
{
struct cl_decoded_option *options = *in_decoded_options;
const char *prev = options[inclPos].arg;
add_default_fobjects (prev, libpath, libraries);
}
}
if ((!seen_x_flag) && seen_module_extension)
fe_generate_option (OPT_x, "modula-2", false);
@ -1326,10 +737,9 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
if (linking)
{
add_env_option (gm2opath, OPT_fobject_path_);
(*in_added_libraries) += add_default_archives (
libpath, libraries, in_decoded_options_count, in_decoded_options,
*in_decoded_options_count);
libpath, libraries, in_decoded_options_count, in_decoded_options,
*in_decoded_options_count);
if (need_math)
(*in_added_libraries)
@ -1359,8 +769,6 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
in_decoded_options, *in_decoded_options_count);
}
}
scan_for_link_args (in_decoded_options_count, in_decoded_options);
#if defined(DEBUGGING)
print_options ("before include purge", *in_decoded_options_count, *in_decoded_options);
#endif
@ -1378,143 +786,10 @@ lang_specific_pre_link (void)
return 0;
}
/* get_objects returns a string containing all objects specified on
the command line. */
static const char *
get_objects (int argc ATTRIBUTE_UNUSED, const char *argv[] ATTRIBUTE_UNUSED)
{
char *result = (char *)xmalloc (1);
int len = 0;
int flen;
object_list *o;
*result = (char)0;
for (o = head_objects; o != NULL; o = o->next)
{
len = strlen (result);
flen = strlen (o->name);
result = (char *)xrealloc (result, len + flen + 1 + 1);
strcat (result, o->name);
strcat (result, " ");
}
return result;
}
/* remove_objects return an empty string, but also remove all objects
from the command line. */
extern void fe_mark_compiled (const char *);
static const char *
remove_objects (int argc ATTRIBUTE_UNUSED, const char *argv[] ATTRIBUTE_UNUSED)
{
object_list *o;
for (o = head_objects; o != NULL; o = o->next)
fe_mark_compiled (o->name);
return NULL;
}
/* get_link_args returns a string containing all arguments related to
the link stage. */
static const char *
get_link_args (int argc ATTRIBUTE_UNUSED, const char *argv[] ATTRIBUTE_UNUSED)
{
char *result = (char *)xmalloc (1);
int len = 0;
int alen;
object_list *o;
*result = (char)0;
for (o = head_link_args; o != NULL; o = o->next)
{
len = strlen (result);
alen = strlen (o->name);
result = (char *)xrealloc (result, len + alen + 1 + 1);
strcat (result, o->name);
strcat (result, " ");
}
return result;
}
/* add_exec_dir prepends the exec path to the given executable filename. */
static const char *
add_exec_dir (int argc, const char *argv[])
{
if (argc == 1 && argv[0] != NULL)
{
const char *path;
if (seen_B)
path = xstrdup (B_path);
else
path = gen_gm2_libexec (get_libexec ());
if (path != NULL)
{
char *opt = (char *)xmalloc (strlen ("-fcppprog=") + strlen (path)
+ 1 + strlen (argv[0]) + 1);
char *sep = (char *)alloca (2);
sep[0] = DIR_SEPARATOR;
sep[1] = (char)0;
strcpy (opt, "-fcppprog=");
strcat (opt, path);
strcat (opt, sep);
strcat (opt, argv[0]);
return opt;
}
}
return "-fcppprog=none";
}
/* add_exec_name generate binary name. */
static const char *
add_exec_name (int argc, const char *argv[])
{
if (argc == 1 && argv[0] != NULL)
return argv[0];
return xstrdup ("");
}
/* no_link tell gcc.c not to invoke its linker. */
static const char *
no_link (int argc ATTRIBUTE_UNUSED, const char *argv[] ATTRIBUTE_UNUSED)
{
allow_linker = false;
return xstrdup ("");
}
/* exit_callback invoke exit. */
static const char *
exit_callback (int argc ATTRIBUTE_UNUSED, const char *argv[] ATTRIBUTE_UNUSED)
{
exit (0);
}
/* lang_register_spec_functions register the Modula-2 associated spec
functions. */
void
lang_register_spec_functions (void)
{
#if 0
fe_add_spec_function ("objects", get_objects);
fe_add_spec_function ("nolink", no_link);
fe_add_spec_function ("noobjects", remove_objects);
fe_add_spec_function ("linkargs", get_link_args);
fe_add_spec_function ("exec_prefix", add_exec_dir);
fe_add_spec_function ("exec_name", add_exec_name);
fe_add_spec_function ("exit", exit_callback);
#endif
}

View File

@ -254,14 +254,6 @@ fshared
Modula-2
generate a shared library from the module
fmakeinit
Modula-2
generate the start up C code for the module, a file _m2_modulename.c is created
fobject-path=
Modula-2 Joined
set the object path
fm2-whole-program
Modula-2
compile all implementation modules and program module at once

View File

@ -101,6 +101,7 @@ toolexeclib_LTLIBRARIES = libm2pim.la
M2MODS = ASCII.mod IO.mod \
Args.mod M2RTS.mod \
M2Dependent.mod \
Assertion.mod NumberIO.mod \
Break.mod SYSTEM.mod \
CmdArgs.mod Scan.mod \
@ -135,6 +136,7 @@ M2DEFS = Args.def ASCII.def \
IO.def ldtoa.def \
LegacyReal.def libc.def \
libm.def LMathLib0.def \
M2Dependent.def \
M2EXCEPTION.def M2LINK.def \
M2RTS.def \
MathLib0.def MemUtils.def \