This commit is contained in:
seta75D
2021-10-11 18:37:13 -03:00
commit ff309bfe1c
14130 changed files with 3180272 additions and 0 deletions

432
lang/compile/setup_pc.c Normal file
View File

@@ -0,0 +1,432 @@
#ifndef lint
static char sccsid[] = "@(#)setup_pc.c 1.1 94/10/31 SMI";
#endif
/*
* Copyright (c) 1987 by Sun Microsystems, Inc.
*/
#include "driver.h"
/*
* compile_pi
*/
int
compile_pi(source)
char *source;
{
int status;
#ifdef BROWSER
global_flag.code_browser = global_flag.code_browser_seen;
#endif
clear_program_options();
if (target_sw_release[R_PASSES].value->value == SW_REL_3X)
{
return run_steps(source, p_rel3x_steps, TRUE, "p");
}
else
{
if ( (requested_suffix == &suffix.s) ||
(target_arch.value->value == ARCH_SUN386) )
{
set_flag(do_cat);
}
if (optimizer_level > OPTIM_C2 || is_on(statement_count))
{
status= run_steps(source, p_iropt_steps, TRUE, "p");
}
else status= run_steps(source, p_no_iropt_steps, TRUE, "p");
reset_flag(do_cat);
#ifdef BROWSER
reset_flag(code_browser);
#endif
return status;
}
} /* compile_pi */
#ifdef PASCAL_105
Bool special_pascal_105_case = FALSE;
#endif /*PASCAL_105*/
/*
* compile_p
*/
int
compile_p(source)
char *source;
{
int status;
#ifdef PASCAL_105
extern Const_intP original_sw_rel_passes;
static Const_intP saved_sw_rel_passes;
static char *saved_iropt_path;
/* Special-case for Pascal 1.05 for Sun-4 target:
* treat it as if the compiler passes were 4.0 passes,
* except must use regular 3.x linker pass & flags.
* (All of which is overridden if -release or -relpasses was used)
*/
if ( ( (target_arch.value->value == ARCH_SUN4) ||
(target_arch.value->value == ARCH_SUN4C)
)
&&
(original_sw_rel_passes->value == SW_REL_DFLT) )
{
special_pascal_105_case = TRUE;
saved_sw_rel_passes = target_sw_release[R_PASSES].value;
target_sw_release[R_PASSES].value = &sw_release_40_explicit;
saved_iropt_path = program.iropt_pc.path;
program.iropt_pc.path = "/usr/lib/iropt-pc";
}
#endif /*PASCAL_105*/
set_flag(do_cpp);
status= compile_pi(source);
reset_flag(do_cpp);
#ifdef PASCAL_105
if ( special_pascal_105_case )
{
program.iropt_pc.path = saved_iropt_path;
target_sw_release[R_PASSES].value = saved_sw_rel_passes;
special_pascal_105_case = FALSE;
}
#endif /*PASCAL_105*/
return status;
} /* compile_p */
/*
* setup_pc0_for_3x
* 3.x pc0 has different arguments from 4.0 pc0, therefore the
* argument template has to be changed.
*/
char *
setup_pc0_for_3x(source, file)
char *source;
char *file;
{
register int i;
static Template pc0_3x_template[PGM_TEMPLATE_LENGTH] =
{ MINUS_O_TEMPLATE, OUT_TEMPLATE, OPTION_TEMPLATE, IN_TEMPLATE};
(void)setup_pc0();
for (i = 0; i < PGM_TEMPLATE_LENGTH; i++)
{
program.pc0.template[i] = pc0_3x_template[i];
}
return NULL;
} /* setup_pc0_for_3x */
/*
* setup_pc0_for_non_3x
* The post-3.x pc0 produces two outfiles;
* one iropt file (containing IR for the Text segment)
* and one assembly file (containing the Data segment).
*/
char *
setup_pc0_for_non_3x(source, file)
char *source;
char *file;
{
(void)setup_pc0();
append_list(&program.pc0.infile, file);
/* program.pc0.outfile is referenced in setup_as_for_pc(), to get the
* name of the extra infile.
*/
program.pc0.outfile= temp_file_name(&program.pc0, &suffix.s, 0);
append_list(&program.pc0.options,
source= temp_file_name(&program.pc0, &suffix.ir, 0));
return source;
} /* setup_pc0_for_iropt */
/*
* setup_pc0
*/
char *
setup_pc0()
{
char buffer[LOCAL_STRING_LENGTH];
if (!program.pc0.has_been_initialized)
{
program.pc0.has_been_initialized = TRUE;
if (optimizer_level > OPTIM_NONE)
{
if (target_sw_release[R_PASSES].value->value
== SW_REL_3X)
{
append_list(&program.pc0.permanent_options,
"-O");
}
else
{
/* a 4.x target release */
(void)sprintf(buffer, "-O%c", optimizer_level);
append_list(&program.pc0.permanent_options,
make_string(buffer));
}
}
if (is_on(warning))
append_list(&program.pc0.permanent_options, "-w");
if (is_on(checkC))
append_list(&program.pc0.permanent_options, "-C");
if (is_on(checkH))
append_list(&program.pc0.permanent_options, "-H");
if (is_on(checkV))
append_list(&program.pc0.permanent_options, "-V");
if (debugger.value)
append_list(&program.pc0.permanent_options, "-g");
if ( is_on(handle_misalignment) &&
(optimizer_level < OPTIM_IROPT_P) )
{
append_list(&program.pc0.permanent_options, "-m");
}
}
#ifdef BROWSER
if (is_on(code_browser)) {
append_list(&program.pc0.infile, "-cb");
}
#endif
return NULL;
} /* setup_pc0 */
/*
*
* setup_cppas
*
*/
char *
setup_cppas(original_source, source)
char *original_source;
char *source;
{
/* we are reaching new heights in hacking
* we need to copy cpp options to cppas
* because we can't have a -I option for bot
* cpp and cppas
*/
program.cppas.permanent_options = program.cpp.permanent_options;
program.cppas.trailing_options = program.cpp.trailing_options;
return NULL;
} /* setup_cppas */
/*
* setup_inline_for_pc
* Make sure inline runs with the proper .il file for Pascal.
*/
char *
setup_inline_for_pc()
{
setup_inline();
append_list(&program.inline.options, "-i");
append_list(&program.inline.options,
scan_Qpath_and_vroot("/usr/lib/pc2.il",TRUE));
return NULL;
} /* setup_inline_for_pc */
static char *to_as_file;
/*
* setup_cat_for_pc
* This is used when "pc -O3 -S" has been given.
* The assembly source from pc0 must be combined with the one
* from c2.
*/
char *
setup_cat_for_pc(source, file)
char *source;
char *file;
{
append_list(&program.cat.infile, program.pc0.outfile);
append_list(&program.cat.infile, file);
if (target_arch.value->value == ARCH_SUN386)
{
if ( (requested_suffix == &suffix.s)
&&
(optimizer_level == OPTIM_NONE))
{
program.cat.outfile = to_as_file =
outfile_name(source, &suffix.s, (ProgramP)NULL);
}
else
{
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_pc */
/*
* setup_as_for_pc
* This is used to feed "as" the infiles from both pc0 and c2,
* when iropt is used.
*
* Also used for sun386 .. whose "as" does not take more than
* one input file.
*/
char *
setup_as_for_pc(source, file)
char *source;
char *file;
{
(void)setup_as();
if (target_arch.value->value == ARCH_SUN386)
{
append_list(&program.as.infile, to_as_file);
}
else
{
if (target_sw_release[R_PASSES].value->value == SW_REL_3X)
{
if ( (optimizer_level > OPTIM_C2) ||
is_on(statement_count))
{
append_list(&program.as.infile,
program.pc0.outfile);
}
}
else
{
/* a 4.x target release */
append_list(&program.as.infile, program.pc0.outfile);
}
append_list(&program.as.infile, file);
}
program.as.outfile= outfile_name(source, &suffix.o, (ProgramP)NULL);
if ((source_infile_count == 1) && (product.value == &executable))
append_list(&files_to_unlink, make_string(program.as.outfile));
return program.as.outfile;
} /* setup_as_for_pc */
/*
* setup_asS_for_pc
*/
char *
setup_asS_for_pc(source, file)
char *source;
char *file;
{
setup_asS();
if (target_sw_release[R_PASSES].value->value == SW_REL_3X)
{
if ( (optimizer_level > OPTIM_C2) || is_on(statement_count))
append_list(&program.asS.infile, program.pc0.outfile);
}
else
{
/* a 4.x target release */
append_list(&program.asS.infile, program.pc0.outfile);
}
append_list(&program.asS.infile, file);
program.asS.outfile= outfile_name(source, &suffix.s, (ProgramP)NULL);
return program.asS.outfile;
} /* setup_asS_for_pc */
/*
* setup_pc3
*/
char *
setup_pc3()
{
register ListP p;
if (!program.pc3.has_been_initialized)
{
program.pc3.has_been_initialized = TRUE;
if (is_on(warning))
append_list(&program.pc3.permanent_options, "-w");
append_list(&program.pc3.permanent_options,
scan_Qpath_and_vroot("/usr/lib/pcexterns.o", TRUE));
}
for (p= infile_o; p != NULL; p= p->next)
{
/* lets not append any -X options
* there are certain cases where the infiles
* do begin with -X (i.e. -Bxxxx )
* pc3 should only have only true input files
*/
if (*p->value != '-')
{
append_list(&program.pc3.infile, p->value);
}
}
return "";
} /* setup_pc3 */
/*
* setup_ld_for_pc
*/
char *
setup_ld_for_pc()
{
static char *libraries[] =
{ "-lpc", "-lm", "-lc", NULL };
static char *profiled_libraries[] =
{ "-lpc_p", "-lm_p", "-lc_p", NULL };
#ifdef i386
append_list(&program.ld.permanent_options, "-Bstatic");
#endif i386
setup_ld( (char **)NULL, libraries, profiled_libraries );
return "";
}
/*
* pc_doit
*/
void
pc_doit()
{
set_requested_suffix(&suffix.pi);
do_infiles();
if ((exit_status == 0) && (product.value == &executable) &&
(infile_o != NULL))
{
requested_suffix= &suffix.none;
if (source_infile_count > 1)
{
(void)printf("Linking:\n");
}
clear_program_options();
exit_status|= run_steps("", pc_steps, FALSE, "");
if (exit_status != 0)
{
do_not_unlink_ld_infiles();
}
}
} /* pc_doit */