486 lines
10 KiB
C
486 lines
10 KiB
C
#ifndef lint
|
|
static char sccsid[] = "@(#)setup_m2c.c 1.1 94/10/31 SMI";
|
|
#endif
|
|
|
|
/*
|
|
* Copyright (c) 1987 by Sun Microsystems, Inc.
|
|
*/
|
|
|
|
#include "driver.h"
|
|
|
|
/*
|
|
* compile_def
|
|
*/
|
|
int
|
|
compile_def(source)
|
|
char *source;
|
|
|
|
{
|
|
int status;
|
|
|
|
clear_program_options();
|
|
if (target_sw_release[R_PASSES].value->value >= SW_REL_40)
|
|
{
|
|
status = run_steps(source, def_steps_non_3x, FALSE, "");
|
|
}
|
|
else
|
|
{
|
|
status = run_steps(source, def_steps_3x, FALSE, "");
|
|
}
|
|
return status;
|
|
|
|
} /* compile_def */
|
|
|
|
/*
|
|
* compile_mod
|
|
*/
|
|
int
|
|
compile_mod(source)
|
|
char *source;
|
|
{
|
|
int status;
|
|
|
|
clear_program_options();
|
|
if (target_sw_release[R_PASSES].value->value >= SW_REL_40)
|
|
{
|
|
if (optimizer_level > OPTIM_C2 || is_on(statement_count))
|
|
{
|
|
status = run_steps(source, mod_iropt_steps, FALSE, "ir");
|
|
}
|
|
else
|
|
{
|
|
status = run_steps(source, mod_no_iropt_steps, FALSE, "ir");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
status = run_steps(source, mod_rel3x_steps, FALSE, "");
|
|
}
|
|
return status;
|
|
|
|
} /* compile_mod */
|
|
|
|
/*
|
|
* setup_m2cfe
|
|
*/
|
|
char *
|
|
setup_m2cfe()
|
|
{
|
|
char buffer[MAXPATHLEN];
|
|
register ListP cp;
|
|
|
|
if (!program.m2cfe.has_been_initialized)
|
|
{
|
|
program.m2cfe.has_been_initialized = TRUE;
|
|
if (optimizer_level > OPTIM_NONE)
|
|
{
|
|
append_list(&program.m2cfe.permanent_options, "-O");
|
|
}
|
|
/* else if no optimization append -noregs option */
|
|
else
|
|
{
|
|
append_list(&program.m2cfe.permanent_options, "-noregs");
|
|
}
|
|
|
|
if (debugger.touched)
|
|
append_list(&program.m2cfe.permanent_options, "-g");
|
|
if (is_on(trace))
|
|
append_list(&program.m2cfe.permanent_options, "-v");
|
|
if (is_on(statement_count))
|
|
append_list(&program.m2cfe.permanent_options, "-a");
|
|
/* The driver converts the list of -M options to one -M, with
|
|
* all the dirs.
|
|
*/
|
|
(void)strcpy(buffer, "-M");
|
|
for (cp= module_list; cp != NULL; cp= cp->next)
|
|
{
|
|
(void)strcat(buffer, cp->value+2);
|
|
(void)strcat(buffer, " ");
|
|
}
|
|
if (is_off(no_default_module_list))
|
|
{
|
|
(void)strcat(buffer, ". /usr/lib/modula2");
|
|
if (profile.touched)
|
|
(void)strcat(buffer, "_p");
|
|
}
|
|
else
|
|
if (module_list)
|
|
/* Remove extra trailing space */
|
|
buffer[strlen(buffer)-1]= '\0';
|
|
if (buffer[2] != '\0')
|
|
append_list(&program.m2cfe.permanent_options,
|
|
make_string(buffer));
|
|
}
|
|
return NULL;
|
|
} /* setup_m2cfe */
|
|
|
|
|
|
|
|
/*
|
|
* setup_m2cfe_for_3x_def
|
|
* Start m2cfe with -def option and basename of source filename
|
|
*/
|
|
char *
|
|
setup_m2cfe_for_3x_def(source)
|
|
char *source;
|
|
{
|
|
register char *p;
|
|
register char *q;
|
|
register int i;
|
|
|
|
static Template mod_def_template[PGM_TEMPLATE_LENGTH] =
|
|
{ OPTION_TEMPLATE, IN_TEMPLATE, STDOUT_TEMPLATE};
|
|
|
|
for (i = 0; i < PGM_TEMPLATE_LENGTH; i++)
|
|
{
|
|
program.m2cfe.template[i] = mod_def_template[i];
|
|
}
|
|
|
|
p= get_memory(strlen(source)+1);
|
|
if ((q= rindex(source, '/')) == NULL)
|
|
q= source;
|
|
else
|
|
q++; /* point PAST the '/' */
|
|
(void)strcpy(p, q);
|
|
if ((q= rindex(p, '.')) != NULL)
|
|
*q= '\0';
|
|
append_list(&program.m2cfe.options, "-def");
|
|
append_list(&program.m2cfe.options, p);
|
|
return NULL;
|
|
|
|
} /* setup_m2cfe_for_3x_def */
|
|
|
|
|
|
/*
|
|
* setup_m2cfe_for_non_3x_def
|
|
* Start m2cfe with -def option and basename of source filename
|
|
*/
|
|
char *
|
|
setup_m2cfe_for_non_3x_def(source)
|
|
char *source;
|
|
{
|
|
register char *p;
|
|
register char *q;
|
|
register int i;
|
|
|
|
static Template mod_def_template[PGM_TEMPLATE_LENGTH] =
|
|
{ OPTION_TEMPLATE, IN_TEMPLATE, OUT_TEMPLATE};
|
|
|
|
for (i = 0; i < PGM_TEMPLATE_LENGTH; i++)
|
|
{
|
|
program.m2cfe.template[i] = mod_def_template[i];
|
|
}
|
|
|
|
p= get_memory(strlen(source)+1);
|
|
if ((q= rindex(source, '/')) == NULL)
|
|
q= source;
|
|
else
|
|
q++; /* point PAST the '/' */
|
|
(void)strcpy(p, q);
|
|
if ((q= rindex(p, '.')) != NULL)
|
|
*q= '\0';
|
|
append_list(&program.m2cfe.options, "-def");
|
|
append_list(&program.m2cfe.options, p);
|
|
return NULL;
|
|
|
|
} /* setup_m2cfe_for_non_3x_def */
|
|
|
|
|
|
/*
|
|
* setup_m2cfe_for_non_3x_mod
|
|
* one iropt file
|
|
* and one assembly file
|
|
*/
|
|
char *setup_m2cfe_for_non_3x_mod(source)
|
|
char *source;
|
|
{
|
|
register char *p;
|
|
register char *q;
|
|
|
|
p= get_memory(strlen(source)+1);
|
|
if ((q= rindex(source, '/')) == NULL)
|
|
q= source;
|
|
else
|
|
q++; /* point PAST the '/' */
|
|
(void)strcpy(p, q);
|
|
if ((q= rindex(p, '.')) != NULL)
|
|
*q= '\0';
|
|
append_list(&program.m2cfe.options, "-mod");
|
|
append_list(&program.m2cfe.options, p);
|
|
|
|
program.m2cfe.outfile2= temp_file_name(&program.m2cfe, &suffix.s, 0);
|
|
|
|
return NULL;
|
|
} /* setup_m2cfe_for_non_3x_mod */
|
|
|
|
|
|
|
|
/*
|
|
* setup_m2cfe_for_3x_mod
|
|
* Start m2cfe with "-mod" and basename of source filename
|
|
*/
|
|
char *setup_m2cfe_for_3x_mod(source)
|
|
char *source;
|
|
{
|
|
register char *p;
|
|
register char *q;
|
|
|
|
p= get_memory(strlen(source)+1);
|
|
if ((q= rindex(source, '/')) == NULL)
|
|
q= source;
|
|
else
|
|
q++; /* point PAST the '/' */
|
|
(void)strcpy(p, q);
|
|
if ((q= rindex(p, '.')) != NULL)
|
|
*q= '\0';
|
|
append_list(&program.m2cfe.options, "-mod");
|
|
append_list(&program.m2cfe.options, p);
|
|
return NULL;
|
|
} /* setup_m2cfe_for_3x_mod */
|
|
|
|
|
|
/*
|
|
* setup_mf1
|
|
*/
|
|
char *
|
|
setup_mf1()
|
|
{
|
|
if (!program.mf1.has_been_initialized)
|
|
{
|
|
program.mf1.has_been_initialized = TRUE;
|
|
f1_to_mf1_copy();
|
|
switch (target_arch.value->value)
|
|
{
|
|
case ARCH_SUN2:
|
|
case ARCH_SUN3X:
|
|
case ARCH_SUN3:
|
|
if (is_on(long_offset))
|
|
append_list(&program.mf1.permanent_options,
|
|
"-J");
|
|
if (profile.touched)
|
|
append_list(&program.mf1.permanent_options,
|
|
"-p");
|
|
append_list(&program.mf1.permanent_options,
|
|
float_mode.value->name);
|
|
append_list(&program.mf1.permanent_options,
|
|
get_processor_flag(target_arch.value));
|
|
break;
|
|
case ARCH_SUN4C:
|
|
case ARCH_SUN4:
|
|
if (profile.touched)
|
|
append_list(&program.mf1.permanent_options,
|
|
"-p");
|
|
break;
|
|
case ARCH_FOREIGN:
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return NULL;
|
|
} /* setup_mf1 */
|
|
|
|
/*
|
|
* setup_as_for_m2c
|
|
*/
|
|
char *
|
|
setup_as_for_m2c(source, file)
|
|
char *source;
|
|
char *file;
|
|
{
|
|
setup_as();
|
|
append_list(&program.as.infile, file);
|
|
program.as.outfile= outfile_name(source, &suffix.o, (ProgramP)NULL);
|
|
return program.as.outfile;
|
|
|
|
} /* setup_as_for_m2c */
|
|
|
|
|
|
/*
|
|
* setup_asS_for_m2c
|
|
*/
|
|
char *
|
|
setup_asS_for_m2c(source, file)
|
|
char *source;
|
|
char *file;
|
|
{
|
|
setup_asS();
|
|
append_list(&program.asS.infile, file);
|
|
program.asS.outfile= outfile_name(source, &suffix.s, (ProgramP)NULL);
|
|
return program.asS.outfile;
|
|
} /* setup_asS_for_m2c */
|
|
|
|
/*
|
|
* setup_m2l_for_m2c
|
|
*/
|
|
char *
|
|
setup_m2l_for_m2c()
|
|
{
|
|
register ListP p;
|
|
char buffer[LOCAL_STRING_LENGTH];
|
|
|
|
if (!program.m2l.has_been_initialized)
|
|
{
|
|
program.m2l.has_been_initialized = TRUE;
|
|
#ifdef sun386
|
|
append_list(&program.ld.permanent_options, "-Bstatic");
|
|
#endif sun386
|
|
for (p= module_list; p != NULL; p= p->next)
|
|
append_list(&program.m2l.permanent_options, p->value);
|
|
if (is_off(no_default_module_list))
|
|
{
|
|
append_list(&program.m2l.permanent_options, "-M.");
|
|
if (profile.touched)
|
|
append_list(&program.m2l.permanent_options,
|
|
"-M/usr/lib/modula2_p");
|
|
else
|
|
append_list(&program.m2l.permanent_options,
|
|
"-M/usr/lib/modula2");
|
|
}
|
|
if (is_on(verbose))
|
|
append_list(&program.m2l.permanent_options, "-v");
|
|
if (is_on(trace))
|
|
append_list(&program.m2l.permanent_options, "-trace");
|
|
buffer[0] = '-';
|
|
strcpy(&buffer[1], target_arch.value->extra);
|
|
append_list(&program.m2l.permanent_options,
|
|
make_string(buffer));
|
|
append_list(&program.m2l.permanent_options, "-X");
|
|
}
|
|
for (p= program.ld.permanent_options; p != NULL; p= p->next)
|
|
append_list(&program.m2l.permanent_options, p->value);
|
|
for (p= program.ld.trailing_options; p != NULL; p= p->next)
|
|
append_list(&program.m2l.trailing_options, p->value);
|
|
program.m2l.outfile= (outfile == NULL) ? "a.out" : outfile;
|
|
for (p= infile; p != NULL; p= p->next)
|
|
{
|
|
if (STR_EQUAL("-e", p->value))
|
|
{
|
|
p= p->next;
|
|
continue;
|
|
}
|
|
if (STR_EQUAL(program.m2l.outfile, p->value))
|
|
fatal("Outfile %s would overwrite infile", p->value);
|
|
}
|
|
|
|
/* Add crt0.o routine */
|
|
append_list(&program.m2l.infile,
|
|
scan_Qpath_and_vroot(profile.value->extra, TRUE));
|
|
|
|
/* Add crt1.o routine */
|
|
if ( (target_arch.value->value != ARCH_SUN4) &&
|
|
(target_arch.value->value != ARCH_SUN4C) &&
|
|
(target_arch.value->value != ARCH_SUN386) &&
|
|
float_mode.value->extra
|
|
)
|
|
{
|
|
append_list(&program.m2l.infile,
|
|
scan_Qpath_and_vroot(float_mode.value->extra, TRUE));
|
|
}
|
|
|
|
/* Add bb_link.o routine, if -a is enabled */
|
|
if (is_on(statement_count))
|
|
{
|
|
append_list(&program.m2l.infile,
|
|
scan_Qpath_and_vroot("/usr/lib/bb_link.o", TRUE));
|
|
}
|
|
|
|
/* Do not append /usr/lib/f... search path if the release is 3x,
|
|
* or the arch is sun386, sun4, or sun4c
|
|
*/
|
|
if ( (target_sw_release[R_PATHS].value->value != SW_REL_3X)
|
|
&&
|
|
(target_arch.value->value != ARCH_SUN386)
|
|
&&
|
|
(target_arch.value->value != ARCH_SUN4C)
|
|
&&
|
|
(target_arch.value->value != ARCH_SUN4) )
|
|
{
|
|
/* Add /usr/lib/f... search path for libraries. */
|
|
(void)sprintf(buffer, "-L/usr/lib/%s",
|
|
float_mode.value->name+1);
|
|
append_list(&program.m2l.infile, make_string(buffer));
|
|
}
|
|
for (p= infile_o; p != NULL; p= p->next)
|
|
{
|
|
append_list(&program.m2l.infile, p->value);
|
|
}
|
|
if (debugger.touched)
|
|
{
|
|
append_list(&program.m2l.infile, "-lg");
|
|
}
|
|
append_list(&program.m2l.infile, profile.touched ? "-lc_p":"-lc");
|
|
return "";
|
|
} /* setup_m2l_for_m2c */
|
|
|
|
|
|
static char *to_as_file;
|
|
|
|
/*
|
|
* setup_cat_for_mod
|
|
* The assembly source from must be combined with the one
|
|
* from c2.
|
|
*/
|
|
char *
|
|
setup_cat_for_mod(source, file)
|
|
char *source;
|
|
char *file;
|
|
{
|
|
append_list(&program.cat.infile, program.m2cfe.outfile2);
|
|
append_list(&program.cat.infile, file);
|
|
|
|
if (requested_suffix != &suffix.s)
|
|
{
|
|
program.cat.outfile = to_as_file =
|
|
temp_file_name(&program.as, &suffix.s, 0);
|
|
}
|
|
|
|
/* this case is for sun4's with -S and -O */
|
|
else if ( ( (target_arch.value->value == ARCH_SUN4) ||
|
|
(target_arch.value->value == ARCH_SUN4C)
|
|
)
|
|
&&
|
|
(optimizer_level > OPTIM_NONE ) )
|
|
{
|
|
program.cat.outfile = to_as_file =
|
|
temp_file_name(&program.as, &suffix.s, 0);
|
|
|
|
}
|
|
else
|
|
{
|
|
program.cat.outfile = outfile_name(source, &suffix.s, (ProgramP)NULL);
|
|
}
|
|
return program.cat.outfile;
|
|
|
|
} /* setup_cat_for_mod */
|
|
|
|
|
|
|
|
/*
|
|
* m2c_doit
|
|
*/
|
|
void
|
|
m2c_doit()
|
|
{
|
|
/* The default is to not run the linker for m2c */
|
|
if (product.value == &executable)
|
|
product.value= &object;
|
|
if (is_on(do_m2l))
|
|
product.value= &executable;
|
|
set_requested_suffix(&suffix.none);
|
|
do_infiles();
|
|
if (!exit_status && (product.value == &executable))
|
|
{
|
|
requested_suffix= &suffix.none;
|
|
if (source_infile_count > 1)
|
|
{
|
|
(void)printf("Linking:\n");
|
|
}
|
|
clear_program_options();
|
|
exit_status|= run_steps("", link_m2c_steps, FALSE, "");
|
|
if (exit_status != 0)
|
|
{
|
|
do_not_unlink_ld_infiles();
|
|
}
|
|
}
|
|
} /* m2c_doit */
|